// $Header: /cvsroot/bitweaver/_bit_util/javascript/libs/multifile.js,v 1.5 2007/07/09 18:29:25 squareing Exp $ // please modify this file and leave plenty of comments. This file will be // compressed automatically. Please make sure you only use comments beginning // with '//' and put comments on separate lines otherwise the packer will choke // Multiple file selector by Stickman -- http://www.the-stickman.com function MultiSelector( list_target, max ){ this.list_target = list_target; this.count = 0; this.id = 0; if( max ){ this.max = max; } else { this.max = -1; }; // BitMod allow us to know what the maximum for each named item is. this.max_elements = Array(); // BitMod allow us to add elements that are disabled and enabled in unison this.disable_array = Array(); // BitMod Added setType to allow us to add something besides a div. this.type = 'file'; this.addDisableElement = function(element) { this.disable_array[element] = element; }; this.setType = function(type) { this.type = type; }; // BitMod Added to allow us to include a title textbox this.includeText = 0; this.setIncludeText = function(include) { this.includeText = include; }; // BitMod Added to allow us to set the new item dragable this.makeDragable = 0; this.setMakeDragable = function(drag) { this.makeDragable = drag; }; // BitMod Added addNamedElement function to allow us to name these. // Thus we can have multiple on the same form this.addNamedElement = function(element, name) { // BitMod We need a way to tell where the end is to avoid an infinite // loop when processing the uploads because ones in the middle may get removed // so we can't reliably tell when we hit the end without some magic if(name in this.max_elements) { this.max_elements[name].value = this.id; } else { var max_element = document.createElement('input'); max_element.type = 'hidden'; max_element.name = name + '_max'; max_element.value = this.count; this.max_elements[name] = max_element; this.list_target.appendChild(max_element); }; if( element.tagName == 'INPUT' && element.type == 'file' ){ element.base_name = name; element.name = name + '_' + this.id++; element.multi_selector = this; element.onchange = function(){ var new_element = document.createElement( 'input' ); new_element.type = 'file'; this.parentNode.insertBefore( new_element, this ); this.multi_selector.addNamedElement( new_element, element.base_name); this.multi_selector.addListRow( this , element.name); this.style.position = 'absolute'; this.style.left = '-1000px'; }; if( this.max != -1 && this.count >= this.max ){ element.disabled = true; for (var item in this.disable_array) { var elem = document.getElementById(item); if (elem) { elem.disabled = true; } } }; this.count++; this.current_element = element; } else { alert( 'Error: not a file input element' ); }; }; this.addElement = function( element ){ this.addNamedElement(element, 'file'); }; this.addListRow = function( element , name){ // BitMod create by type and set id so we can use it // in a drag and drop li. var new_row = document.createElement( this.type ); if (this.makeDragable) { DragDrop.makeItemDragable(new_row); }; new_row.id = name; var new_row_button = document.createElement( 'input' ); new_row_button.type = 'button'; new_row_button.value = 'Remove'; new_row.element = element; new_row_button.onclick= function(){ this.parentNode.element.parentNode.removeChild( this.parentNode.element ); this.parentNode.parentNode.removeChild( this.parentNode ); this.parentNode.element.multi_selector.count--; this.parentNode.element.multi_selector.current_element.disabled = false; for (var item in this.parentNode.element.multi_selector.disable_array) { var elem = document.getElementById(item); if (elem) { elem.disabled = false; }; }; return false; }; new_row.innerHTML = ''+element.value+''; // BitMod to allow us to add a text box if (this.includeText) { new_row.innerHTML += "
"; var new_row_text = document.createElement( 'input' ); new_row_text.type = 'text'; new_row_text.name = name + '_text'; new_row.appendChild(new_row_text); }; new_row.appendChild( new_row_button ); this.list_target.appendChild( new_row ); }; };