add documentation for some of the functions.
[sgn.git] / js / CXGN / List.js
blob37ea142f79158441881e5b744b635f54c81bfccd
2 /* 
4 =head1 NAME
6 CXGN.List - a javascript library to implement the lists on the SGN platform
8 =head1 DESCRIPTION
10 There are two important list functions in this library, listed below. All other functions should be considered private and/or deprecated.
13 * addToListMenu(listMenuDiv, dataDiv)
15 this function will generate a select of all available lists and allow the content to be added to a list (from a search, etc). The first parameter is the id of the div tag where the menu should be drawn. The second parameter is the div that contains the data to be added. This can be a textfield, a div or span tag, or a multiple select tag.
17 * pasteListMenu(divName, menuDiv, buttonName)
19 this will generate an html select box of all the lists, and a "paste" button, to paste into a textarea (typically). The divName is the id of the textarea, the menuDiv is the id where the paste menu should be placed.
22 Public List object functions
24 * listSelect(divName, types)
26 will create an html select with id and name 'divName'. Optionally, a list of types can be specified that will limit the menu to the respective types. 
28 Usage:
29 You have to instantiate the list object first:
31 var lo = new CXGN.List(); var s = lo.listSelect('myseldiv', [ 'trials' ]);
34 * validate(list_id, type, non_interactive)
36 * transform(list_id, new_type)
39 =head1 AUTHOR
41 Lukas Mueller <lam87@cornell.edu>
43 =cut
47 //JSAN.use('jqueryui');
49 if (!CXGN) CXGN = function () { };
51 CXGN.List = function () { 
52     this.list = [];
56 CXGN.List.prototype = { 
57     
58     // Return the data as a straight list
59     //
60     getList: function(list_id) {        
61         var list;
62         
63         jQuery.ajax( { 
64             url: '/list/contents/'+list_id,
65             async: false,
66             success: function(response) { 
67                 if (response.error) { 
68                     //document.write(response.error);
69                 }
70                 else { 
71                     list = response;
72                 }
73             },
74             error: function(response) { 
75                 alert("An error occurred.");
76             }
77         });
78         return list;
80     },
83     // this function also returns some metadata about
84     // list, namely its type.
85     //
86     getListData: function(list_id) { 
87         var list;
88         
89         jQuery.ajax( { 
90             url: '/list/data',
91             async: false,
92             data: { 'list_id': list_id },
93             success: function(response) { 
94                 if (response.error) { 
95                     alert(response.error);
96                 }
97                 else { 
98                     list = response;
99                 }
100             }
101         });
102         
103         return list;
104     },
106     getListType: function(list_id) { 
107         var type;
109         jQuery.ajax( { 
110             url: '/list/type/'+list_id,
111             async: false,
112             success: function(response) { 
113                 if (response.error) { 
114                     alert(response.error);
115                 }
116                 else { 
117                     type = response.list_type;
118                     return type;
119                 }
120             },
121             error: alert('An error occurred. Cannot determine type. ')
122         });
123         return type;
124     },
125             
126     setListType: function(list_id, type) { 
127         
128         jQuery.ajax( { 
129             url: '/list/type/'+list_id+'/'+type,
130             async: false,
131             success: function(response) { 
132                 if (response.error) { 
133                     alert(response.error);
134                 }
135                 else { 
136                     alert('Type of list '+list_id+' set to '+type);
137                 }
138             } 
139         });
140     },
143     allListTypes: function() { 
144         var types;
145         jQuery.ajax( { 
146             url: '/list/alltypes',
147             async: false,
148             success: function(response) { 
149                 if (response.error) { 
150                     alert(response.error);
151                 }
152                 else { 
153                     types = response;
154                 }
155             }
156         });
157         return types;
158                      
159     },
160     
161     typesHtmlSelect: function(list_id, html_select_id, selected) { 
162         var types = this.allListTypes();
163         var html = '<select id="'+html_select_id+'" onchange="javascript:changeListType(\''+html_select_id+'\', '+list_id+');" >';
164         html += '<option name="null">(none)</option>';
165         for (var i=0; i<types.length; i++) { 
166             var selected_html = '';
167             if (types[i][1] == selected) { 
168                 selected_html = ' selected="selected" ';
169             }
170             html += '<option name="'+types[i][1]+'"'+selected_html+'>'+types[i][1]+'</option>';
171         }
172         html += '</select>';
173         return html;
174     },
176     newList: function(name) { 
177         var oldListId = this.existsList(name);
178         var newListId = 0;
179         
180         if (name == '') { 
181             alert('Please provide a name for the new list.');
182             return 0;
183         }
185         if (oldListId === null) { 
186             jQuery.ajax( { 
187                 url: '/list/new',
188                 async: false,
189                 data: { 'name': name },
190                 success: function(response) { 
191                     if (response.error) { 
192                         alert(response.error);
193                     }
194                     else { 
195                         newListId=response.list_id;
196                     }
197                 }
198             });
199             return newListId;
200         }
201         else { 
202             alert('A list with name "'+ name + '" already exists. Please choose another list name.');
203             return 0;
204         }
205         alert("An error occurred. Cannot create new list right now.");
206         return 0;
207     },
209     availableLists: function(list_type) { 
210         var lists = [];
211         jQuery.ajax( { 
212             url: '/list/available',
213             data: { 'type': list_type },
214             async: false,
215             success: function(response) { 
216                 if (response.error) { 
217                     //alert(response.error);
218                 }
219                 lists = response;
220                 //alert("LISTS OF TYPE "+list_type+": "+lists.join(","));
221             },
222             error: function(response) { 
223                 alert("An error occurred");
224             }
225         });
226         return lists;
227     },
229     //return the newly created list_item_id or 0 if nothing was added
230     //(due to duplicates)
231     addItem: function(list_id, item) { 
232         var exists_item_id = this.existsItem(list_id,item);
233         if (exists_item_id ===0 ) { 
234             jQuery.ajax( { 
235                 async: false,
236                 url: '/list/item/add',
237                 data:  { 'list_id': list_id, 'element': item },
238                 success: function(response) { 
239                     if (response.error) { 
240                         alert(response.error); 
241                         return 0;
242                     }
243                 }
244             });
245             var new_list_item_id = this.existsItem(list_id,item);
246             return new_list_item_id;
247         }
248         else { return 0; }
249     },
251     addBulk: function(list_id, items) { 
252         
253         var elements = items.join("\t");
255         var count;
256         jQuery.ajax( { 
257             async: false,
258             method: 'POST',
259             url: '/list/add/bulk',
260             data:  { 'list_id': list_id, 'elements': elements },
261             success: function(response) { 
262                 if (response.error) { 
263                     alert(response.error);
264                 }
265                 else { 
266                     if (response.duplicates) { 
267                         alert("The following items are already in the list and were not added: "+response.duplicates.join(", "));
268                     }
269                     count = response.success;
270                 }               
271             }
272         });
273         return count;
274     },
275     
276     removeItem: function(list_id, item_id) {
277         jQuery.ajax( {
278             async: false,
279             url: '/list/item/remove',
280             data: { 'list_id': list_id, 'item_id': item_id }
281         });
282     },
283     
284     deleteList: function(list_id) { 
285         jQuery.ajax( { 
286             url: '/list/delete',
287             async: false,
288             data: { 'list_id': list_id }
289         });
290     },
292     renderLists: function(div) { 
293         var lists = this.availableLists();
294         var html = '';
295         html = html + '<input id="add_list_input" type="text" /><input id="add_list_button" type="button" value="new list" /><br />';
296         
297         if (lists.length===0) { 
298             html = html + "None";
299             jQuery('#'+div).html(html);
300         }
302         html += '<table border="0" cellpadding="2" title="Available lists">';
303         html += '<tr><td><i>list name</i></td><td><i>#</i></td><td><i>type</i></td><td colspan="3"><i>actions</i></td></tr>\n'; 
304         for (var i = 0; i < lists.length; i++) { 
305             html = html + '<tr><td><b>'+lists[i][1]+'</b></td><td>'+lists[i][3]+'</td><td>'+lists[i][5]+'</td><td><a href="javascript:showListItems(\'list_item_dialog\','+lists[i][0]+')">view</a></td><td>|</td><td><a href="javascript:deleteList('+lists[i][0]+')">delete</a></td><td>|</td><td><a href="/list/download?list_id='+lists[i][0]+'">download</a></td></tr>\n';
306         }
307         html = html + '</table>';
308         jQuery('#'+div).html(html);
310         jQuery('#add_list_button').click(function() { 
311             var lo = new CXGN.List();
312             
313             var name = jQuery('#add_list_input').val();
314             
315             lo.newList(name);
316             lo.renderLists(div);
317         });
318     },
319     
320     listNameById: function(list_id) { 
321         lists = this.availableLists();
322         for (var n=0; n<lists.length; n++) { 
323             if (lists[n][0] == list_id) { return lists[n][1]; }
324         }
325     },
327     renderItems: function(div, list_id) { 
328         var list_data = this.getListData(list_id);
329         var items = list_data.elements;
330         var list_type = list_data.type_name;
331         var list_name = this.listNameById(list_id);
332         
333         var html = '';
334         html += '<table><tr width="100"><td>List name ';
335         
336         html += '</td><td><input type="text" id="updateNameField" size="10" value="'+list_name+'" /></td><td><input type="button" id="updateNameButton" value="update"  /><td width="100%" align="right"><font size="1">List ID</td><td><div id="list_id_div" style="font-size:tiny" >'+list_id+'</div></font></td></tr>';
338         html += '<tr><td>Type</td><td>'+this.typesHtmlSelect(list_id, 'type_select', list_type)+'</td><td colspan="2"><input type="button" value="validate" onclick="javascript:validateList('+list_id+',\'type_select\')"  /></td></tr></table>';
340         html += 'Add new elements: <br /><textarea id="dialog_add_list_item" ></textarea><input id="dialog_add_list_item_button" type="submit" value="Add" /><br />';
342         html += '<b>List items</b> ('+items.length+')<br />';
344         for(var n=0; n<items.length; n++) { 
345             html = html + items[n][1] + '   <input id="'+items[n][0]+'" type="button" value="remove" /><br />';   
346         }
347         jQuery('#'+div).html(html);
349         for (var n=0; n<items.length; n++) { 
350             var list_item_id = items[n][0];
352             jQuery('#'+items[n][0]).click(
353                 function() { 
354                     var lo = new CXGN.List();
355                     var i = lo.availableLists();
356                     
357                     lo.removeItem(list_id, this.id );
358                     lo.renderItems(div, list_id);
359                     lo.renderLists('list_dialog');
360                 });
361         }
362     
363         
364         jQuery('#dialog_add_list_item_button').click(
365             function() { 
366                 addMultipleItemsToList('dialog_add_list_item', list_id);
367                 var lo = new CXGN.List();
368                 lo.renderItems(div, list_id);
369             }
370         );
371         
372         jQuery('#updateNameButton').click(
373             function() { 
374                 var lo = new CXGN.List();
375                 var new_name =  jQuery('#updateNameField').val();
376                 var list_id = jQuery('#list_id_div').html();
377                 lo.updateName(list_id, new_name);
378                 alert("Changed name to "+new_name+" for list id "+list_id);
379             }
380         );
381     },
382     
383     existsList: function(name) { 
384         var list_id = 0;
385         jQuery.ajax( { 
386             url: '/list/exists',
387             async: false,
388             data: { 'name': name },
389             success: function(response) { 
390                 list_id = response.list_id;
391             }
392         });
393         return list_id;
394     },
396     existsItem: function(list_id, name) { 
397         var list_item_id =0;
398         jQuery.ajax( { 
399             url: '/list/exists_item',
400             async: false,
401             data: { 'list_id' : list_id, 'name':name },
402             success: function(response) { 
403                 list_item_id = response.list_item_id;
404             }
405         });
406         return list_item_id;
407     },
408     
409     // deprecated
410     addToList: function(list_id, text) { 
411         var list = text.split("\n");
412         var duplicates = [];
413         
414         var info = this.addBulk(list_id, list);
415         
416         return info;
417         
418     },
420     /* listSelect: Creates an html select with lists of requested types.
422        Parameters: 
423          div_name: The div_name where the select should appear
424          types: a list of list types that should be listed in the menu
425     */
426     
427     listSelect: function(div_name, types) {     
428         var lists = new Array();
430         if (types) {
431             for (var n=0; n<types.length; n++) { 
432                 var more = this.availableLists(types[n]);
433                 if (more) { 
434                     for (var i=0; i<more.length; i++) { 
435                         lists.push(more[i]);
436                     }
437                 }
438             }
439         }
440         else { 
441             lists = this.availableLists();
442         }
444         var html = '<select id="'+div_name+'_list_select" name="'+div_name+'_list_select" >';
445         for (var n=0; n<lists.length; n++) {
446             html = html + '<option value='+lists[n][0]+'>'+lists[n][1]+'</option>';
447         }
448         html = html + '</select>';
449         return html;
450     },
452     updateName: function(list_id, new_name) { 
453         jQuery.ajax( { 
454             url: '/list/name/update',
455             async: false,
456             data: { 'name' : new_name, 'list_id' : list_id },
457             success: function(response) { 
458                 if (response.error) { 
459                     alert(response.error);
460                     return;
461                 }
462                 else { 
463                     alert("The name of the list was changed to "+new_name);
464                 }
465             },
466             error: function(response) { alert("An error occurred."); }
467         });
468         this.renderLists('list_dialog');
469     },
471     validate: function(list_id, type, non_interactive) { 
472         var missing = new Array();
473         var error = 0;
474         jQuery.ajax( { 
475             url: '/list/validate/'+list_id+'/'+type,
476             async: false,
477             success: function(response) { 
478                 if (response.error) { 
479                     alert(response.error);
480                 }
481                 else { 
482                     missing = response.missing;
483                 }
484             },
485             error: function(response) { alert("An error occurred while validating the list "+list_id); error=1; }
486         });
488         if (error === 1 ) { return; }
490         if (missing.length==0) { 
491             if (!non_interactive) { alert("This list passed validation."); } 
492             return 1;
493         }
494         else { 
495             alert("List validation failed. Elements not found: "+ missing.join(","));
496             return 0;
497         }
498     },
500     transform: function(list_id, new_type) { 
501         var transformed = new CXGN.List();
502         jQuery.ajax( { 
503             url: '/list/transform/'+list_id+'/'+new_type,
504             async: false,
505             success: function(response) { 
506                 if (response.error) { 
507                     alert(response.error);
508                 }
509                 else { 
510                     transformed = response.transform;
511                 }
512             },
513             error: function(response) { alert("An error occurred while validating the list "+list_id); }
514         });
515     },
517     transform2Ids: function(list_id) { 
518         var list_type = this.getListType(list_id);
519         var new_type;
520         if (list_type == 'traits') { new_type = 'trait_ids'; }
521         if (list_type == 'locations') { new_type = 'location_ids'; }
522         if (list_type == 'trials') { new_type = 'project_ids'; }
523         if (list_type == 'projects') { new_type = 'project_ids'; }
524         if (list_type == 'plots') { new_type = 'plot_ids'; }
525         if (list_type == 'accessions') { new_type = 'accession_ids'; }
526         
527         if (! new_type) { 
528             return { 'error' : "cannot convert the list because of unknown type" };
529         }
531         var transformed = this.transform(list_id, new_type);
532         
533         return { 'transformed' : transformed };
534             
536     }
539 function setUpLists() { 
540     jQuery('#list_dialog').dialog( {
541         height: 300,
542         width: 500,
543         autoOpen: false,
544         title: 'Available lists',
545         buttons: { "Done" :  function() { 
546             jQuery('#list_dialog').dialog("close"); }
547                  },
548         modal: true 
549     });
550        
551     jQuery('#list_item_dialog').dialog( { 
552         height: 400,
553         width: 400,
554         autoOpen: false,
555         buttons: { 
556             "Done": function() { 
557                 jQuery('#list_item_dialog').dialog("close"); }
558         },
559         modal: true,
560       title: 'List contents'
561     });
562     
563     jQuery('#lists_link').click(
564         function() { show_lists(); }
565     );
569 function show_lists() {     
570     jQuery('#list_dialog').dialog("open");
571     
572     var l = new CXGN.List();
573     l.renderLists('list_dialog');
576 /* deprecated */
577 function pasteListMenu (div_name, menu_div, button_name) { 
578     var lo = new CXGN.List();
580     var html='';
582     if (button_name === undefined) { 
583         button_name = 'paste';
584     }
586     html = lo.listSelect(div_name);
587     html = html + '<input type="button" value="'+button_name+'" onclick="javascript:pasteList(\''+div_name+'\')" /><br />';
588     
589     jQuery('#'+menu_div).html(html);
592 function pasteList(div_name) { 
593     var lo = new CXGN.List();
594     var list_name = jQuery('#'+div_name+'_list_select').val();
595     var list_content = lo.getList(list_name);
596     
597     // textify list
598     var list_text = '';
599     for (var n=0; n<list_content.length; n++) { 
600         list_text = list_text + list_content[n][1]+"\r\n";
601     }
602     jQuery('#'+div_name).text(list_text);
606   addToListMenu
608   Parameters: 
609   * listMenuDiv - the name of the div where the menu will be displayed
610   * dataDiv - the div from which the data will be copied (can be a div, textarea, or html select
611   * options - optional hash with the following keys:
612     - selectText: if the dataDiv is an html select and selectText is true, the text and not the value will be copied into the list
613     - listType: the type of lists to display in the menu
614     - typesSourceDiv: obtain the type from this source div
619 function addToListMenu(listMenuDiv, dataDiv, options) { 
620     var lo = new CXGN.List();
622     var html;
623     var selectText;
624     var listType;
625     var typeSourceDiv; 
626     var type; 
628     if (options) { 
629         if (options.selectText) { 
630             selectText = options.selectText;
631         }
632         if (options.typeSourceDiv) { 
633             type = getData(options.typeSourceDiv, selectText);
634             type = type.replace(/(\n|\r)+$/, '');
635         }
636         if (options.types) { 
637             type = options.listType;
638         }
639     }
640     html = '<input type="text" id="'+dataDiv+'_new_list_name" size="8" />';
641     html += '<input type="hidden" id="'+dataDiv+'_list_type" value="'+type+'" />';
642     html += '<input id="'+dataDiv+'_add_to_new_list" type="button" value="add to new list" /><br />';
643     html += lo.listSelect(dataDiv, [ type ]);
645     html += '<input id="'+dataDiv+'_button" type="button" value="add to list" />';
646    
647     if (dataDiv == 'stock_data' && document.referrer.match(/solgs/)) {
648         html += '<input  style="clear: both" id="goto_gs_button" type="button" value="Go to GS" />';
649     }
650   
651     jQuery('#'+listMenuDiv).html(html);
653     var list_id = 0;
655     jQuery('#'+dataDiv+'_add_to_new_list').click(
656         function() { 
657             var lo = new CXGN.List();
658             var new_name = jQuery('#'+dataDiv+'_new_list_name').val();
659             var type = jQuery('#'+dataDiv+'_list_type').val();
660                     
661             var data = getData(dataDiv, selectText);
662             
663             list_id = lo.newList(new_name);
664             if (list_id > 0) { 
665                 var elementsAdded = lo.addToList(list_id, data);
666                 if (type) { lo.setListType(list_id, type); }
667                 alert("Added "+elementsAdded+" list elements to list "+new_name+" and set type to "+type);
668             }
669         }
670     );
671         
672     jQuery('#'+dataDiv+'_button').click( 
673         function() { 
674             var data = getData(dataDiv, selectText);
675             list_id = jQuery('#'+dataDiv+'_list_select').val();
676             var lo = new CXGN.List();
677             var elementsAdded = lo.addToList(list_id, data);
679             alert("Added "+elementsAdded+" list elements");
680             return list_id;
681         }
682     );
683     
684     jQuery(document).on("click", "#goto_gs_button", function() { 
685        
686         if (document.referrer.match(/solgs/)){
687             window.location.href= document.referrer;
688         } else {
689             window.location.href = window.location.protocol + "//" +window.location.host + '/solgs/search'; 
690         }
691     });
692    
696 function getData(id, selectText) { 
697     var divType = jQuery("#"+id).get(0).tagName;
698     var data; 
699     
700     if (divType == 'DIV' || divType =='SPAN' ||  divType === undefined) { 
701         data = jQuery('#'+id).html();
702     }
703     if (divType == 'SELECT' && selectText) {
704         data = jQuery('#'+id+" option:selected").text();
705     }
706     if (divType == 'SELECT' && ! selectText) { 
707         var return_data = jQuery('#'+id).val();
709         if (return_data instanceof Array) { 
710             data = return_data.join("\n");
711         }
712         else { 
713             data = return_data;
714         }
715     }
716     if (divType == 'TEXTAREA') { 
717         data = jQuery('textarea#'+id).val();
718     }
719     return data;
721   
723 /* deprecated */         
724 function addTextToListMenu(div) { 
725     var lo = new CXGN.List();
726     var html = lo.listSelect(div);
727     html = html + '<input id="'+div+'_button" type="button" value="add to list" />';
728     
729     document.write(html);
730     
731     jQuery('#'+div+'_button').click( 
732         function() { 
733             var text = jQuery('textarea#div').val();
734             var list_id = jQuery('#'+div+'_list_select').val();
735             lo.addToList(list_id, text);
736             lo.renderLists('list_dialog');
737         }
738     );
741 /* deprecated */
742 function addSelectToListMenu(div) { 
743     var lo = new CXGN.List();
744     var html = lo.listSelect(div);
745     html = html + '<input id="'+div+'_button" type="button" value="add to list" />';
746     
747     document.write(html);
748     
749     jQuery('#'+div+'_button').click( 
750         function() { 
751             var selected_items = jQuery('#'+div).val();
752             var list_id = jQuery('#'+div+'_list_select').val();
753             addArrayToList(selected_items, list_id);
754             lo.renderLists('list_dialog');
755         }
756     );
760 /* deprecated */
761 // add the text in a div to a list
762 function addDivToList(div_name) { 
763     var list_id = jQuery('#'+div_name+'_list_select').val();
764     var lo = new CXGN.List();
765     var list = jQuery('#'+div_name).val();
766     var items = list.split("\n");
768     for(var n=0; n<items.length; n++) { 
769         var added = lo.addItem(list_id, items[n]);
770         if (added > 0) { }
771     }
774 /* deprecated */
775 function addTextToList(div, list_id) { 
776     var lo = new CXGN.List();
777     var item = jQuery('#'+div).val();
778     var id = lo.addItem(list_id, item);
779     if (id == 0) { 
780         alert('Item "'+item+'" was not added because it already exists');
781     }
782     lo.renderLists('list_dialog');
785 /* deprecated */
786 function addMultipleItemsToList(div, list_id) { 
787     var lo = new CXGN.List();
788     var content = jQuery('#'+div).val();
789     if (content == '') { 
790         alert("No items - Please enter items to add to the list.");
791 return;
792     }
793     var items = content.split("\n");
794     
795     var duplicates = new Array();
796     for (var n=0; n<items.length; n++) { 
797         var id = lo.addItem(list_id, items[n]);
798         if (id == 0) { 
799             duplicates.push(items[n]);
800         }
801     }
802     if (duplicates.length >0) { 
803         alert("The following items were not added because they are already in the list: "+ duplicates.join(", "));
804     }
805 lo.renderLists('list_dialog');
808 /* deprecated */
809 function addArrayToList(items, list_id) { 
810 var lo = new CXGN.List();
811    var duplicates = new Array();
812     for (var n=0; n<items.length; n++) { 
813         var id = lo.addItem(list_id, items[n]);
814         if (id == 0) { 
815             duplicates.push(items[n]);
816         }
817     }
818     if (duplicates.length >0) { 
819         alert("The following items were not added because they are already in the list: "+ duplicates.join(", "));
820     }
823 function deleteList(list_id) { 
824     var lo = new CXGN.List();
825     var list_name = lo.listNameById(list_id);
826     if (confirm('Delete list "'+list_name+'"? (ID='+list_id+'). This cannot be undone.')) { 
827         lo.deleteList(list_id);
828         lo.renderLists('list_dialog');
829         alert('Deleted list '+list_name);
830     }
832         
833 function deleteItemLink(list_item_id) { 
834     var lo = new CXGN.List();
835     lo.deleteItem(list_item_id);
836     lo.renderLists('list_dialog');
838         
839 function showListItems(div, list_id) { 
840     var l = new CXGN.List();
841     jQuery('#'+div).dialog("open");
842     l.renderItems('list_item_dialog', list_id);
845 function addNewList(div_id) { 
846     var lo = new CXGN.List();
847     var name = jQuery('#'+div_id).val();
848     
849     if (name == '') { 
850         alert("Please specify a name for the list.");
851         return;
852     }
853     
854     var list_id = lo.existsList(name);
855     if (list_id > 0) {
856         alert('The list '+name+' already exists. Please choose another name.');
857         return;
858     }
859     lo.newList(name);
860     lo.renderLists('list_item_dialog');
863 function changeListType(html_select_id, list_id) { 
864     var type = jQuery('#'+html_select_id).val();
865     var l = new CXGN.List();
866     l.setListType(list_id, type);
867     l.renderLists('list_dialog');
870 /* 
871    validateList - check if all the elements in a list are of the correct type
873    Parameters: 
874    * list_id: the id of the list
875    * html_select_id: the id of the html select containing the type list
876    
879 function validateList(list_id, html_select_id) { 
880     var lo = new CXGN.List();
881     var type = jQuery('#'+html_select_id).val();
882     lo.validate(list_id, type);