/*

Version history

1.0.2 - row 86 - added "escape" to the querystring to keep all the parameters intact

*/

//LoadSWFUploadInputs();
function SwfuUpload(){
	var retorno = true;
	for (var i=0; i<arSWFU.length; i++){
		if (arSWFU[i].getSetting("arquivo_selecionado") == 1){
			retorno = false;
			arSWFU[i].upload();					
		}
	}	
	return retorno;
}
function LoadSWFUploadInputs(){
	var arInput = document.getElementsByTagName("input");
	
	for (var contInput=0; contInput<arInput.length; contInput++){
		if ((arInput[contInput].type == "file") && (arInput[contInput].className == "swfupload")){
			CreateSWFUpload(arInput[contInput]);
		}
	}

}

var arSWFU = new Array();

function CreateSWFUpload(obj){
	var indice = arSWFU.length;
	var file_name = getRand();
	
	arSWFU[indice] = new SWFUpload({
		upload_script 					: "../_services/swfUpload.php?filename="+file_name+"&fieldname="+obj.name,
		target 							: obj.parentNode,
		flash_path 						: "_swf/SWFUpload.swf",
		allowed_filesize 				: 30720,	// 30 MB
		allowed_filetypes 				: "*.*",
		allowed_filetypes_description 	: "All files...",
		browse_link_innerhtml 			: "Selecionar arquivo",
		upload_link_innerhtml 			: "",
		browse_link_class 				: "swfuploadbtn browsebtn",
		upload_link_class 				: "swfuploadbtn uploadbtn",
		flash_loaded_callback 			: "arSWFU["+indice+"].flashLoaded",
		upload_file_queued_callback 	: "arSWFU["+indice+"].fileQueued",
		upload_file_start_callback 		: "arSWFU["+indice+"].uploadFileStart",
		upload_progress_callback 		: "arSWFU["+indice+"].uploadProgress",
		upload_file_complete_callback 	: "arSWFU["+indice+"].uploadFileComplete",
		upload_file_cancel_callback 	: "arSWFU["+indice+"].uploadFileCancelled",
		upload_queue_complete_callback 	: "arSWFU["+indice+"].uploadQueueComplete",
		upload_error_callback 			: "arSWFU["+indice+"].uploadError",
		upload_cancel_callback 			: "arSWFU["+indice+"].uploadCancel",
		field_name	 					: obj.name,
		file_name	 					: file_name,
		arquivo_selecionado				: 0,
		auto_upload						: false
	});
	
	return arSWFU[arSWFU.length-1];
	
};
								
function SWFUpload(settings) {
	
	// Remove background flicker in IE
	try 
	{
	  document.execCommand('BackgroundImageCache', false, true);
	} catch(e) {}

	// Generate the tags ID
	this.movieName = "SWFUpload_" + SWFUpload.movieCount++;

	// Load the settings.  Load the Flash movie.
	this.init(settings);
	this.loadFlash();
	
	if (this.debug) 
		this.debugSettings();
}

SWFUpload.movieCount = 0;

// Default error handling.
SWFUpload.handleErrors = function(errcode, file, msg) {
	
	switch(errcode) {
		
		case -10:	// HTTP error
			alert("Error Code: HTTP Error, File name: " + file.name + ", Message: " + msg);
			break;
		
		case -20:	// No upload script specified
			alert("Error Code: No upload script, File name: " + file.name + ", Message: " + msg);
			break;
		
		case -30:	// IOError
			alert("Error Code: IO Error, File name: " + file.name + ", Message: " + msg);
			break;
		
		case -40:	// Security error
			alert("Error Code: Security Error, File name: " + file.name + ", Message: " + msg);
			break;

		case -50:	// Filesize too big
			alert("Error Code: Filesize exceeds limit, File name: " + file.name + ", File size: " + file.size + ", Message: " + msg);
			break;
	
	}
	
};

var arSWFULoaded = new Array();

SWFUpload.prototype.fileQueued = function(file, queuelength) {
	this.addSetting("arquivo_selecionado", 1, "");
	var indice = arSWFULoaded.length;
	arSWFULoaded[indice] = this;

	var listingfiles = this.getSetting("target");
	listingfiles.innerHTML = file.name+" | <a href=\"javascript:arSWFULoaded["+indice+"].cancelFile('"+file.id+"');\">alterar</a>";			
}

SWFUpload.prototype.uploadFileCancelled = function(file, queuelength) {
	this.addSetting("arquivo_selecionado", 0, "");
	var indice = arSWFULoaded.length;
	arSWFULoaded[indice] = this;
	
	var listingfiles = this.getSetting("target");	
	listingfiles.innerHTML = "<a href=\"javascript:arSWFULoaded["+indice+"].browse();\">Selecionar arquivo</a>";	
}

SWFUpload.prototype.uploadFileStart = function(file, position, queuelength) {
	var barra = document.getElementById(file.id+"_barra");
	var extension = file.name.toString().split('.'); 
	var file_name = this.getSetting("file_name")+"."+extension[extension.length-1].toLowerCase();
	
	var listingfiles = this.getSetting("target");
	listingfiles.innerHTML  = "<div id=\""+file.id+"_barra\" style=\"color:#FFFFFF; border:1px solid #4a340b; background-color:#ff9f40; width:0px;\"></div>";	
	
	var campo = document.createElement("input");
	campo.type = "hidden";
	campo.id = this.getSetting("field_name");
	campo.name = campo.id;
	campo.value = file_name;
	listingfiles.appendChild(campo);
}

SWFUpload.prototype.uploadProgress = function(file, bytesLoaded) {
	var tamanhoBarra = 136;
	var progress = document.getElementById(file.id + "_barra");
	var percent =  Math.ceil((bytesLoaded*100)/file.size);
	progress.style.width=Math.ceil((percent*tamanhoBarra)/100)+"px";
	progress.innerHTML = "&nbsp;"+(percent)+"%";
}

SWFUpload.prototype.uploadError = function(errno) {
	alert(errcode + ", "+ file.name + ", " + msg);
}

SWFUpload.prototype.uploadFileComplete = function(file) {
}

SWFUpload.prototype.cancelQueue = function() {
}

SWFUpload.prototype.uploadQueueComplete = function(file) {
//	alert('SUBIU');
//	alert(swfu.settings["idCampoRetorno"]);
	document.getElementById(this.settings["field_name"]).form.submit();
}

SWFUpload.prototype.init = function(settings) {

	this.settings = [];

	this.addSetting("debug", settings["debug"],  false);																		// Turn debugging on/off

	// UI settings
	this.addSetting("target", settings["target"], "");																		// Target for auto-generated upload/browse links
	this.addSetting("create_ui", settings["create_ui"], false);																// Auto-generate UI
	this.addSetting("browse_link_class", settings["browse_link_class"], "SWFBrowseLink");										// CSS-class given to auto-generated browse link
	this.addSetting("upload_link_class", settings["upload_link_class"], "SWFUploadLink");										// CSS-class given to auto-generated upload link
	this.addSetting("browse_link_innerhtml", settings["browse_link_innerhtml"], "<span>Browse...</span>");					// innerHTML for generated browse link, default surround with span for easy css-styling
	this.addSetting("upload_link_innerhtml", settings["upload_link_innerhtml"], "<span>Upload</span>");						// innerHTML for generated upload link, default surround with span for easy css-styling
	
	// Callbacks
	this.addSetting("flash_loaded_callback", settings["flash_loaded_callback"], "SWFUpload.flashLoaded");						// Invoked when the flash is loaded
	this.addSetting("upload_file_queued_callback", settings["upload_file_queued_callback"], "");								// Invoked when each file is added to the queue
	this.addSetting("upload_file_start_callback", settings["upload_file_start_callback"], "");								// Invoked when upload starts
	this.addSetting("upload_file_complete_callback", settings["upload_file_complete_callback"],  "");							// Invoked when each file is completed
	this.addSetting("upload_queue_complete_callback", settings["upload_queue_complete_callback"],  "");						// Invoked when upload queue is complete
	this.addSetting("upload_progress_callback", settings["upload_progress_callback"],  "");									// Called with regular updates on progress..
	this.addSetting("upload_dialog_cancel_callback", settings["upload_dialog_cancel_callback"],  "");							// Invoked when cancel btn in dialog is clicked
	this.addSetting("upload_file_error_callback", settings["upload_file_error_callback"], "SWFUpload.handleErrors");			// Invoked on error
	this.addSetting("upload_file_cancel_callback", settings["upload_file_cancel_callback"],  "");								// Invoked when a file upload is cancelled
	this.addSetting("upload_queue_cancel_callback", settings["upload_queue_cancel_callback"], "");							// Invoked when upload queue is cancelled
	this.addSetting("indiceAr", settings["indiceAr"], "");
	this.addSetting("field_name", settings["field_name"], "");													// The file that recieves the uploaded files from flash
	this.addSetting("arquivo_selecionado", settings["arquivo_selecionado"], "");													// The file that recieves the uploaded files from flash
	this.addSetting("file_name", settings["file_name"], "");													// The file that recieves the uploaded files from flash

	// SWF Settings
	this.addSetting("upload_script", escape(settings["upload_script"], ""));													// The file that recieves the uploaded files from flash
	this.addSetting("auto_upload", settings["auto_upload"], false);															// Start upload directly or require upload button.
	this.addSetting("allowed_filetypes", settings["allowed_filetypes"], "*.*");												// List of allowed filetypes
	this.addSetting("allowed_filetypes_description", settings["allowed_filetypes_description"], "All files");					// Description for allowed filetypes
	this.addSetting("allowed_filesize", settings["allowed_filesize"], 1024);													// Max allowed filesize
	this.addSetting("flash_path", settings["flash_path"], "jscripts/SWFUpload/SWFUpload.swf");								// Path to flash-file
	this.addSetting("flash_target", settings["flash_target"], "");															// Where to output the flash (not used)
	this.addSetting("flash_width", settings["flash_width"], "1px");															// Flash width
	this.addSetting("flash_height", settings["flash_height"], "1px");															// Flash height
	this.addSetting("flash_color", settings["flash_color"], "#000000");														// Flash color

	this.debug = this.getSetting("debug");																					// Set debug

};

SWFUpload.prototype.loadFlash = function() {
	
	var html = "";
	var sb = new stringBuilder();
	
	// Create Mozilla Embed HTML
	if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) {
		
		// Build the basic embed html
		sb.append('<embed type="application/x-shockwave-flash" src="' + this.getSetting("flash_path") + '" width="' + this.getSetting("flash_width") + '" height="' + this.getSetting("flash_height") + '"');
		sb.append(' id="' + this.movieName + '" name="' + this.movieName + '" ');
		sb.append('bgcolor="' + this.getSetting["flash_color"] + '" quality="high" wmode="transparent" menu="false" flashvars="');
		sb.append(this._getFlashVars());
		sb.append('" />');
	
	// Create IE Object HTML
	} else {
	
		// Build the basic Object tag
		sb.append('<object id="' + this.movieName + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + this.getSetting("flash_width") + '" height="' + this.getSetting("flash_height") + '">');
		sb.append('<param name="movie" value="' + this.getSetting("flash_path") + '" />');
		sb.append('<param name="bgcolor" value="#000000" />');
		sb.append('<param name="quality" value="high" />');
		sb.append('<param name="wmode" value="transparent" />');
		sb.append('<param name="menu" value="false" />');
		sb.append('<param name="flashvars" value="' + this._getFlashVars() + '" />');
		sb.append('</object>');

	}
	
	// Build the DOM nodes to hold the flash;
	var container = document.createElement("div");
	container.style.width = "0px";
	container.style.height = "0px";
	container.style.position = "absolute";
	container.style.top = "0px";
	container.style.left = "0px";

	var target_element = document.getElementsByTagName("body")[0];
		
	if (typeof(target_element) == "undefined" || target_element == null)
		return false;
	
	var html = sb.toString();

	target_element.appendChild(container);
	container.innerHTML = html;
		
	this.movieElement = document.getElementById(this.movieName);
	
};

SWFUpload.prototype._getFlashVars = function() {
	
	var sb = new stringBuilder();
	sb.append("uploadScript=" + this.getSetting("upload_script"));
	sb.append("&allowedFiletypesDescription=" + this.getSetting("allowed_filetypes_description"))
	sb.append("&flashLoadedCallback=" + this.getSetting("flash_loaded_callback"));
	sb.append("&uploadFileQueuedCallback=" + this.getSetting("upload_file_queued_callback"));
	sb.append("&uploadFileStartCallback=" + this.getSetting("upload_file_start_callback"));
	sb.append("&uploadProgressCallback=" + this.getSetting("upload_progress_callback"));
	sb.append("&uploadFileCompleteCallback=" + this.getSetting("upload_file_complete_callback"));
	sb.append("&uploadQueueCompleteCallback=" + this.getSetting("upload_queue_complete_callback"));
	sb.append("&uploadDialogCancelCallback=" + this.getSetting("upload_dialog_cancel_callback"));
	sb.append("&uploadFileErrorCallback=" + this.getSetting("upload_file_error_callback"));
	sb.append("&uploadFileCancelCallback=" + this.getSetting("upload_file_cancel_callback"));
	sb.append("&uploadQueueCompleteCallback=" + this.getSetting("upload_queue_complete_callback"));
	sb.append("&autoUpload=" + this.getSetting("auto_upload"));
	sb.append("&allowedFiletypes=" + this.getSetting("allowed_filetypes"));
	sb.append("&maximumFilesize=" + this.getSetting("allowed_filesize"));
	sb.append("&field_name=" + this.getSetting("field_name"));
	sb.append("&arquivo_selecionado=" + this.getSetting("arquivo_selecionado"));	
	sb.append("&file_name=" + this.getSetting("file_name"));

	return sb.toString();
}

// The callback method that the Flash movie will call when it has been loaded.
// This should Load the UI parts.
SWFUpload.prototype.flashLoaded = function(bool) {
	this.loadUI();

	if (this.debug) 
		SWFUpload.debug("Flash called home and is ready.");	
};

// Load the UI elements.  Show the UI Target, build the "link" according to the settings, and hide the Degraded Target
SWFUpload.prototype.loadUI = function() {

	if(this.getSetting("target") != "" && this.getSetting("target") != "fileinputs") {
	
		var instance = this;
		var target = (this.getSetting("target"));
		
		// Create the link for uploading
		var browselink = document.createElement("a");
		browselink.className = this.getSetting("browse_link_class");
		browselink.id = this.movieName + "BrowseBtn";
		browselink.href = "javascript:void(0);";
		browselink.onclick = function() { instance.browse(); return false; }
		browselink.innerHTML = this.getSetting("browse_link_innerhtml");
	
		target.innerHTML = "";
		target.appendChild(browselink);
			
		// Add upload btn if auto upload not used
		if(this.getSetting("auto_upload") == false) {

			// Create the link for uploading
			var uploadlink = document.createElement("a");
			uploadlink.className = this.getSetting("upload_link_class");
			uploadlink.id = this.movieName + "UploadBtn";
			uploadlink.href = "#";
			uploadlink.onclick = function() { instance.upload(); return false; }
			uploadlink.innerHTML = this.getSetting("upload_link_innerhtml");
			target.appendChild(uploadlink);
		}
	
	}
	
};

SWFUpload.debug = function(value) {
	if (window.console)
		console.log(value);
	else
		alert(value);
}

SWFUpload.prototype.addSetting = function(name, value, default_value) {
	return this.settings[name] = (typeof(value) == "undefined" || value == null) ? default_value : value;
};

SWFUpload.prototype.getSetting = function(name) {
	return (typeof(this.settings[name]) == "undefined") ? null : this.settings[name];
};

SWFUpload.prototype.browse = function() {
	this.movieElement.browse();
};

SWFUpload.prototype.upload = function() {
	this.movieElement.upload();
}

SWFUpload.prototype.cancelFile = function(file_id) {
	this.movieElement.cancelFile(file_id);
};
SWFUpload.prototype.cancelQueue = function() {
	this.movieElement.cancelQueue();
};

SWFUpload.prototype.debugSettings = function() {
		
	var sb = new stringBuilder();
	
	sb.append("----- DEBUG SETTINGS START ----\n");
	sb.append("ID: " + this.movieElement.id + "\n");
	
	for (var key in this.settings)
		sb.append(key + ": " + this.settings[key] + "\n");

	sb.append("----- DEBUG SETTINGS END ----\n");
	sb.append("\n");
	
	var res = sb.toString();
	
	SWFUpload.debug(res);
};

	
/* UTILS */

function stringBuilder(join) {

this._strings = new Array;
this._join = (typeof join == "undefined") ? "" : join;

	stringBuilder.prototype.append = function(str) {
		this._strings.push(str);
	};
		
	stringBuilder.prototype.toString = function() {
		return this._strings.join(this._join);
	};

};
