web/wp-content/themes/selecta/ocmx/scripts x/multifile.js
changeset 1 0d28b7c10758
equal deleted inserted replaced
0:0d9a58d2c515 1:0d28b7c10758
       
     1 /**
       
     2  * Convert a single file-input element into a 'multiple' input list
       
     3  *
       
     4  * Usage:
       
     5  *
       
     6  *   1. Create a file input element (no name)
       
     7  *      eg. <input type="file" id="first_file_element">
       
     8  *
       
     9  *   2. Create a DIV for the output to be written to
       
    10  *      eg. <div id="files_list"></div>
       
    11  *
       
    12  *   3. Instantiate a MultiSelector object, passing in the DIV and an (optional) maximum number of files
       
    13  *      eg. var multi_selector = new MultiSelector( document.getElementById( 'files_list' ), 3 );
       
    14  *
       
    15  *   4. Add the first element
       
    16  *      eg. multi_selector.addElement( document.getElementById( 'first_file_element' ) );
       
    17  *
       
    18  *   5. That's it.
       
    19  *
       
    20  *   You might (will) want to play around with the addListRow() method to make the output prettier.
       
    21  *
       
    22  *   You might also want to change the line 
       
    23  *       element.name = 'file_' + this.count;
       
    24  *   ...to a naming convention that makes more sense to you.
       
    25  * 
       
    26  * Licence:
       
    27  *   Use this however/wherever you like, just don't blame me if it breaks anything.
       
    28  *
       
    29  * Credit:
       
    30  *   If you're nice, you'll leave this bit:
       
    31  *  
       
    32  *   Class by Stickman -- http://www.the-stickman.com
       
    33  *      with thanks to:
       
    34  *      [for Safari fixes]
       
    35  *         Luis Torrefranca -- http://www.law.pitt.edu
       
    36  *         and
       
    37  *         Shawn Parker & John Pennypacker -- http://www.fuzzycoconut.com
       
    38  *      [for duplicate name bug]
       
    39  *         'neal'
       
    40  */
       
    41 function MultiSelector( list_target, max ){
       
    42 	
       
    43 	// Where to write the list
       
    44 	this.list_target = list_target;
       
    45 	// How many elements?
       
    46 	this.count = 0;
       
    47 	// How many elements?
       
    48 	this.id = 0;
       
    49 	// Is there a maximum?
       
    50 	if( max ){this.max = max;}
       
    51 	else {this.max = -1;};
       
    52 	
       
    53 	/**
       
    54 	 * Add a new file input element
       
    55 	 */
       
    56 	this.addElement = function( element ){
       
    57 	
       
    58 		// Make sure it's a file input element
       
    59 		if( element.tagName == 'INPUT' && element.type == 'file' ){	
       
    60 			
       
    61 			// Element name -- what number am I?
       
    62 			element.name = 'file[]'; //_' + this.id++;
       
    63 			element.className = "text";
       
    64 			element.size = "35";
       
    65 			
       
    66 			// Add reference to this object
       
    67 			element.multi_selector = this;
       
    68 
       
    69 			// What to do when a file is selected
       
    70 			element.onchange = function(){
       
    71 
       
    72 				/* Set the Types Allowed */
       
    73 				var types_allowed = ".gif, .jpg, .png";
       
    74 				
       
    75 				/* Get the form valu and strign length*/
       
    76 				var form_value = element.value;
       
    77 				var str_end = form_value.length;
       
    78 				
       
    79 				/* Find out the filetype of the selected file */
       
    80 				var str_start = ((str_end/1) - 4);
       
    81 				var file_type = form_value.substring(str_start, str_end).toLowerCase();;
       
    82 				
       
    83 				/* Replace Spaces for correct splitting */
       
    84 				var arrFiles = types_allowed.replace(/ /g, "");
       
    85 				arrFiles = arrFiles.split(",");
       
    86 				
       
    87 				var file_correct = 0;
       
    88 				var i_max = arrFiles.length;
       
    89 				for(var i = 0; i < i_max; i++)
       
    90 					{
       
    91 						if(file_type == arrFiles[i])
       
    92 							{var file_correct = 1; break;}
       
    93 					}
       
    94 				if(file_correct == 0)
       
    95 					{alert("Only the following files are allowed in this file input: "+types_allowed);}
       
    96 				else
       
    97 					{
       
    98 						// New file input
       
    99 						var new_element = document.createElement( 'input' );
       
   100 						new_element.type = 'file';
       
   101 		
       
   102 						// Add new element
       
   103 						this.parentNode.insertBefore( new_element, this );
       
   104 		
       
   105 						// Apply 'update' to element
       
   106 						this.multi_selector.addElement( new_element );
       
   107 		
       
   108 						// Update list
       
   109 						this.multi_selector.addListRow( this );
       
   110 		
       
   111 						// Hide this: we can't use display:none because Safari doesn't like it
       
   112 						this.style.position = 'absolute';
       
   113 						this.style.left = '-1000px';
       
   114 					}
       
   115 
       
   116 			};
       
   117 			// If we've reached maximum number, disable input element
       
   118 			if( this.max != -1 && this.count >= this.max ){
       
   119 				element.disabled = true;
       
   120 				alert("You have reached the maximum of "+ this.max +" uploads at a time.");
       
   121 			};
       
   122 
       
   123 			// File element counter
       
   124 			this.count++;
       
   125 			// Most recent element
       
   126 			this.current_element = element;
       
   127 			
       
   128 		} else {
       
   129 			// This can only be applied to file input elements!
       
   130 			alert( 'Error: not a file input element' );
       
   131 		};
       
   132 
       
   133 	};
       
   134 
       
   135 	/**************************************/
       
   136 	/* Add a new row to the list of files */
       
   137     /**************************************/
       
   138 	
       
   139 	this.addListRow = function( element ){
       
   140 		var file_List = document.getElementById("files_list").innerHTML;
       
   141 		if(file_List == "You have not selected any images")
       
   142 			{document.getElementById("files_list").innerHTML = "";}
       
   143 		
       
   144 		// Row div
       
   145 		var new_row = document.createElement('div');
       
   146 		new_row.style.padding = "6px;"; 
       
   147 		new_row.className = "add_image";
       
   148 		
       
   149 		var new_row_button = document.createElement( 'a' );
       
   150 		new_row_button.href = "javascript:;";
       
   151 		new_row_button.innerHTML += " Remove"
       
   152 		new_row_button.style.top = "-11px"
       
   153 		
       
   154 		// References
       
   155 		new_row.element = element;
       
   156 
       
   157 		// Delete function
       
   158 		new_row_button.onclick= function(){
       
   159 
       
   160 			// Remove element from form
       
   161 			this.parentNode.element.parentNode.removeChild( this.parentNode.element );
       
   162 			// Remove this row from the list
       
   163 			this.parentNode.parentNode.removeChild( this.parentNode );
       
   164 			// Decrement counter
       
   165 			this.parentNode.element.multi_selector.count--;
       
   166 			// Re-enable input element (if it's disabled)
       
   167 			this.parentNode.element.multi_selector.current_element.disabled = false;
       
   168 			// Appease Safari
       
   169 			//    without it Safari wants to reload the browser window
       
   170 			//    which nixes your already queued uploads
       
   171 			return false;
       
   172 		};
       
   173 
       
   174 		// Set row value 
       
   175 		// Loop through the full file path and remove all the text up to the actual file name.
       
   176 		
       
   177 		element_HTML = element.value.toString();
       
   178 		var i_len = element_HTML.length;
       
   179 		
       
   180 		for(var i = 0; i < i_len; i++)
       
   181 			{
       
   182 				var element_HTML_findslash = element_HTML.toString().indexOf('\\');
       
   183 				
       
   184 				if(element_HTML_findslash == -1)
       
   185 					{break}
       
   186 				else
       
   187 					{element_HTML = element_HTML.substring((element_HTML_findslash+1), i_len);}
       
   188 			}
       
   189 			
       
   190 		new_row.innerHTML = element_HTML+" "; //element.value;
       
   191 
       
   192 		// Add button
       
   193 		new_row.appendChild( new_row_button );
       
   194 				
       
   195 		// Add it to the list
       
   196 		this.list_target.appendChild( new_row );
       
   197 		
       
   198 	};
       
   199 
       
   200 };