
// Initialize code
$(function() {
	$('.multiupload').each(function(i) { 
		new lfjs.multiupload(this);
	});
});



lfjs.multiupload = function(domobj) {
	var flashsrc = $("script[src$='swfupload.js']:first").attr("src").replace(/swfupload\.js$/, "swfupload.swf");
	if(domobj.nodeType == 1 && (/(span|div|a|button|img)/.test(domobj.nodeName.toLowerCase()) || 
	   (domobj.nodeName.toLowerCase() == "input" && domobj.type == "button"))) {
		
	} else {
		if(window.console)
			console.log("MultiUpload element must be SPAN, DIV, A, IMG, BUTTON, or INPUT type=button.");	
		return;
	}
	//console.log(domobj.nodeType + ' ' + domobj.nodeName + ' "' + domobj.id + '" - ' + $(domobj).width() + " x " + $(domobj).height());
	//console.log(domobj.offsetWidth + " x " + domobj.offsetHeight);
	if(typeof SWFUpload == "function") {
		var placeholder = document.createElement("span");
		var ts = new Date().valueOf() + '';
		placeholder.id = "lfjsmu" + domobj.nodeName.toLowerCase() + ts.substring(Math.floor(Math.random()*ts.length));
		
		$(domobj).css({zIndex: "1"});
		var swfwidth = domobj.offsetWidth;		// Broken: $(domobj).width();
		var swfheight = domobj.offsetHeight;	// Broken: $(domobj).height();
		
		var washidden = false;
		if (swfwidth == 0 || swfwidth == 0) {
			washidden = true;
			//tweak any hidden parents so we can figure out where to put the button.
			var hiddenpar = $(domobj).parents(":hidden");
			var currpos = hiddenpar.css("position");
			
			hiddenpar.toggle().css({ visibility: "hidden", position:"absolute"});
			swfwidth = domobj.offsetWidth;		// Broken: $(domobj).width();
			swfheight = domobj.offsetHeight;	// Broken: $(domobj).height();
		}
	
		if(/(input|button|img)/.test(domobj.nodeName.toLowerCase())) {
			var buttontext = domobj.value;
			var par = document.createElement("span");
			$(domobj).wrap(par).before(placeholder);
			//console.log("OW: " + domobj.offsetWidth + " - JQ Width: " + $(domobj).width());
			if(domobj.offsetWidth) {
				//swfwidth = domobj.offsetWidth;
				//swfheight = domobj.offsetHeight;
			}
		} else {
			var buttontext = $(domobj).html();
			$(domobj).prepend(placeholder);
		}
		if (washidden)
			hiddenpar.css({ visibility: "visible", position:currpos}).toggle();
		
		var cursor = $(domobj).css("cursor").toLowerCase();
		var swfcursor = SWFUpload.CURSOR.ARROW;
		if(cursor == "pointer" || cursor == "hand" || domobj.nodeName.toLowerCase() == "a")
			swfcursor = SWFUpload.CURSOR.HAND;
			
		this.settings = { };
		domobj.uploadsettings = this.settings;
		if(domobj.onclick) {
			domobj.initfunc = domobj.onclick;
			domobj.initfunc();
			domobj.onclick = function() { return false; };
			//console.log(this.settings);
		} else 
			domobj.initfunc = function() {};
			
		var args = {
			button_placeholder_id: placeholder.id,
			flash_url: flashsrc,
			file_types: "*.*",
			file_types_description: "All Files",
			requeue_on_error: false,
			//button_text: buttontext,
			button_width: swfwidth,
			button_height: swfheight,
			button_action : SWFUpload.BUTTON_ACTION.SELECT_FILES,		
			button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
			button_cursor: swfcursor,
			
			use_query_string: false,

			debug: false
		}

		var swf = this;
		
		function addSetting(localsetting, swfsetting) {
			if(swf.settings[localsetting] && swf.settings[localsetting].length)
				args[swfsetting] = swf.settings[localsetting];
		}
		addSetting("url", "upload_url");
		addSetting("filetypes", "file_types");
		addSetting("filetypesdesc", "file_types_description");
		addSetting("filepostname", "file_post_name");
		addSetting("postparams", "post_params");
		addSetting("filepostname", "file_post_name");
		addSetting("requeueonerror", "requeue_on_error");
		addSetting("filesizelimit", "file_size_limit");
		
		
		args["swfupload_loaded_handler"] = function() { swf.flashLoaded() };
		args["file_dialog_start_handler"] = function() { swf.fileDialogStart() };
		args["file_queued_handler"] = function(a) { swf.fileQueued(a) };
		args["file_queue_error_handler"] = function(a, b, c) { swf.fileQueueError(a, b, c) };
		args["file_dialog_complete_handler"] = function(a, b, c) { swf.fileDialogComplete(a, b, c) };
		args["upload_start_handler"] = function(a) { return swf.uploadStart(a) };
		args["upload_progress_handler"] = function(a, b, c) { swf.uploadProgress(a, b, c) };
		args["upload_error_handler"] = function(a, b, c) { swf.uploadError(a, b, c) };
		args["upload_success_handler"] = function(a, b) { swf.uploadSuccess(a, b) };
		args["upload_complete_handler"] = function(a) { swf.uploadComplete(a) };
		
		this.swfupload = new SWFUpload(args);
		$(".multiupload .swfupload, SPAN .swfupload").each(function() { $(this).css({position: "absolute", "z-index": "2"}) });
		
		this.files = [];
		this.currupload = "";
		this.queuelength = 0;
		this.currfilecnt = 0;
		this.domobj = domobj;
		domobj.mvc = this;
		
		domobj.startUpload = function (a) { return this.mvc.startUpload(a); };
		domobj.cancelUpload = function (a) { return this.mvc.cancelUpload(a); };
		domobj.stopUpload = function () { return this.mvc.stopUpload(); };
		domobj.getFile = function (a) { return this.mvc.getFile(a); };
		domobj.getFiles = function () { return this.mvc.getFiles(); };
		domobj.setUploadURL = function (a) { return this.mvc.setUploadURL(a); };
		domobj.setPostParams = function (a, b) { return this.mvc.setPostParams(a, b); };
		domobj.setFilePostParams = function (a, b, c) { return this.mvc.setFilePostParams(a, b, c); };
		domobj.isIdle = function () { return this.mvc.isIdle(); };
	} else {
		if(window.console)
			console.log("Cannot find SWFUpload.  Make sure js file is included");	
	}
}

lfjs.multiupload.prototype.flashLoaded = function() {
	$(".multiuploadnoinit").hide();
	if(typeof lfjs.multiupload.onInit == "function")
		lfjs.multiupload.onInit(this.domobj);
		
	if (this.settings["flashLoaded"] && typeof this.settings["flashLoaded"] == "function") {
		this.settings["flashLoaded"](this.domobj);	
	}
}

lfjs.multiupload.prototype.fileDialogStart = function() {
	//add/update swf setting here
	
	this.domobj.initfunc();
	var swf = this;
	var swfu = this.swfupload;
	swfu.movieElement.blur();
	function addSetting(localsetting, setfunc) {
		if(swf.settings[localsetting] && swf.settings[localsetting].length)
			setfunc(swf.settings[localsetting]);
	}
	
	if(swf.settings["url"] && swf.settings["url"].length)
		this.setUploadURL(swf.settings["url"]);
	if(swf.settings["filepostname"] && swf.settings["filepostname"].length)
		this.swfupload.setFilePostName(swf.settings["filepostname"]);
	if(swf.settings["filesizelimit"] && swf.settings["filesizelimit"].length)
		this.swfupload.setFileSizeLimit(swf.settings["filesizelimit"]);
	if(swf.settings["postparams"] && typeof swf.settings["postparams"] == "object")
		this.setPostParams(swf.settings["postparams"], true);
		
	if(swf.settings["filetypes"] && swf.settings["filetypes"].length) {
		var desc = "All Files";
		if(swf.settings["filetypesdesc"] && swf.settings["filetypesdesc"].length) {
			var desc = swf.settings["filetypesdesc"];
		}
		this.swfupload.setFileTypes(swf.settings["filetypes"], desc);
	}
	addSetting("requeueonerror", "requeue_on_error");
	
	if (this.settings["fileSelectStart"] && typeof this.settings["fileSelectStart"] == "function") {
		this.settings["fileSelectStart"](this.domobj);	
	}
}

lfjs.multiupload.prototype.fileQueued = function(file) {
	var ret = true;
	if (this.settings["fileQueued"] && typeof this.settings["fileQueued"] == "function") {
		ret = this.settings["fileQueued"](this.domobj, file);	
	}
	if(ret == false) {
		this.swfupload.cancelUpload(file.id, false);
	} else {
		var idx = this.files.length;
		this.files[idx] = file;
		this.files[idx].serverdata = "";
	}
}

lfjs.multiupload.prototype.fileQueueError = function(file, error, msg) {
	if (this.settings["fileQueueError"] && typeof this.settings["fileQueueError"] == "function") {
		var ret = this.settings["fileQueueError"](this.domobj, file, error, msg);
	}	
	for(var i=0; i < this.files.length; i++) {
		if(this.files[i].id == file.id) {
			this.files.splice(i, 1);
			break;
		}
	}
}

lfjs.multiupload.prototype.fileDialogComplete = function(numselected, numqueued, totalqueue) {
	var ret = true;
	this.queuelength += numqueued;
	//Don't fire on a cancel
	if(numselected == 0)
		return;
	if (this.settings["fileSelectComplete"] && typeof this.settings["fileSelectComplete"] == "function") {
		var ret = this.settings["fileSelectComplete"](this.domobj, this.files, numselected, numqueued);	
	}
	
	if(ret != false) {
		this.swfupload.startUpload();	
	}

}

lfjs.multiupload.prototype.uploadStart = function(file) {
	var ret = true;
	this.currfilecnt++;
	if (this.settings["uploadStart"] && typeof this.settings["uploadStart"] == "function") {
		var ret = this.settings["uploadStart"](this.domobj, file, this.currfilecnt, this.queuelength);	
	}
	this.currupload = file.id;
	if(ret == false)
		return ret;
}

lfjs.multiupload.prototype.uploadProgress = function(file, complete, total) {
	
	if (this.settings["uploadProgress"] && typeof this.settings["uploadProgress"] == "function") {
		var ret = this.settings["uploadProgress"](this.domobj, file, complete, total);	
	}
}

lfjs.multiupload.prototype.uploadError = function(file, error, msg) {
	
	if (this.settings["uploadError"] && typeof this.settings["uploadError"] == "function") {
		var ret = this.settings["uploadError"](this.domobj, file, error, msg);	
	}
}

lfjs.multiupload.prototype.uploadSuccess = function(file, data) {
	for(var i=0; i < this.files.length; i++) {
		if(this.files[i].id == file.id) {
			this.files[i].serverdata = data;
			break;
		}
	}
}

lfjs.multiupload.prototype.uploadComplete = function(file) {
	var ret = true;
	var data = "";
	var delidx = -1;
	for(var i=0; i < this.files.length; i++) {
		if(this.files[i].id == file.id) {
			var data = this.files[i].serverdata;
			delidx = i;
			break;
		}
	}
	if (this.settings["uploadComplete"] && typeof this.settings["uploadComplete"] == "function") {
		var ret = this.settings["uploadComplete"](this.domobj, file, data);
	}
	if(delidx >= 0)
		this.files.splice(i, 1);
	
	this.currupload = "";
	if(ret != false)
		this.swfupload.startUpload();	
	if(this.isIdle())
		this.queueComplete();
	
}

lfjs.multiupload.prototype.queueComplete = function() {
	this.queuelength = 0;
	this.currfilecnt = 0;
	if (this.settings["queueComplete"] && typeof this.settings["queueComplete"] == "function") {
		var ret = this.settings["queueComplete"](this.domobj);
	}

	
}

lfjs.multiupload.prototype.startUpload = function(fileid) {
	this.swfupload.startUpload(fileid);
	
}

lfjs.multiupload.prototype.cancelUpload = function(fileid, throwerror) {
	this.swfupload.cancelUpload(fileid, throwerror);
	
}

lfjs.multiupload.prototype.stopUpload = function() {
	this.swfupload.stopUpload();
	
}

lfjs.multiupload.prototype.getFile = function(fileid) {
	for(var i=0; i < this.files.length; i++) {
		if(this.files[i].id == fileid || this.files[i].name == fileid)
			return this.files[i];
	}
	return null;
	
}

lfjs.multiupload.prototype.getFiles = function() {
	return this.files;
	
}

lfjs.multiupload.prototype.setUploadURL = function(url) {
	this.swfupload.setUploadURL(url);
	
}

lfjs.multiupload.prototype.setPostParams = function(paramobj, addremove) {
	if(typeof addremove == "undefined" || addremove == null) {
		this.swfupload.setPostParams(paramobj);
	} else if (addremove == true) {
		for(var i in paramobj) {
			this.swfupload.addPostParam(i, paramobj[i]);
		}
	} else if (addremove == false) {
		for(var i in paramobj) {
			this.swfupload.removePostParam(i);
		}
	}
	
}

lfjs.multiupload.prototype.setFilePostParams = function(fileid, paramobj, addremove) {
	var file = this.getFile(fileid);
	if(typeof addremove == "undefined" || addremove == null) {
		var addremove = true;
	}
	if (addremove == true) {
		for(var i in paramobj) {
			this.swfupload.addFileParam(file.id, i, paramobj[i]);
		}
	} else if (addremove == false) {
		for(var i in paramobj) {
			this.swfupload.removeFileParam(file.id, i);
		}
	}
	
}

lfjs.multiupload.prototype.isIdle = function() {
	var stats = this.swfupload.getStats();
	if(stats.in_progress == 0 && stats.files_queued == 0 && this.files.length == 0)
		return true;
	return false;
}

