// upload_handler.js
// copyright 2008, NetIntro, All Rights Reserved
// For other great NetIntro software, see BronsonHQ.com

var somethingIsUploaded = 0;
var bronsonUploadedFiles = new Object();
var bronsonuploaders = {};

function upload_handler(params) {
	trace('upload_handler');
	
	this.upload_swf = '/swf/uploader.swf';
	this.uploaderwidth = 300;
	this.uploaderheight = 30;
	this.upload_target = '/templates/util/uploader.php';
	this.button = '/gfx/uploader/pick_a_file.png';
	this.types = '*.jpg;*.gif;*.png;';
	this.filetype = 'image';
	this.fieldname = ''; 
	this.formname = '';
	this.frm = null;
	this.statusTarget = '';
	this.uploaderTarget = '';
	this.messageTarget = '';
	this.filename = '';
	this.uploadHandler = '';
	this.guid = ''; 
	this.previewwidth = 200;
	this.previewheight = null;
	this.udrid = null;
	this.success = 0;
	this.ishidden = false;
	this.currpct = null;
	this.lastpct = null;
	this.lasttime = null;
	this.completedmessage = {
		'image' : '<p><strong>Success!</strong> Your image has finished uploading.  To see it at full size, just click on the thumbnail.  To change the file, use the uploader below this message.  To save changes, click Save at the bottom of this form.</p>'
		, 'video' : '<p><strong>Success!</strong> Your video has finished uploading.  You will be able to view it once it is finished encoding.  You can come back to this page to check if your video is finished encoding.  To change the video, use the uploader below this message.  To save changes, click Save at the bottom of this form.</p>'
		, 'default' : '<p><strong>Success!</strong> Your file has finished uploading.  To download it, click on the link at left.  To change the file, use the uploader below this message.  To save changes, click Save at the bottom of this form.</p>'
	};
	
	this.override = function(overrides, master) {
		trace('BRNSN_RTMEDIA::override');
		if(typeof "master" === undefined || master === undefined) {
			trace('BRNSN_RTMEDIA::override::undefined master. Setting to config');
			master = this.config;
		}
		
		
		
		//first run through all the things extant in the master
		for(mem in master) {
			trace('BRNSN_RTMEDIA::override::mem::' + mem + '::' + master[mem]);
			if(typeof master[mem] == 'object') {
				if(overrides[mem] !== undefined) {
					master[mem] = this.override(overrides[mem], master[mem]);
				}
			} else {
				trace('BRNSN_RTMEDIA::override::mem::master ' + mem + ' is not object');
				if(overrides[mem] !== undefined) {
					trace('BRNSN_RTMEDIA::override::mem::overrides ' + mem + ' is not null');
					master[mem] = overrides[mem];
				}
			}
		}
		
		//now run through the child for any new stuff
		if(overrides.length > 0) {
			for(mem in overrides) {
				trace('BRNSN_RTMEDIA::overrides loop::mem::' + mem + '::' + overrides[mem]);
				if(master[mem] === undefined) {
					master[mem] = overrides[mem];
				}
			}
		}
		
		this.config = master;
		
	};
		
	this.drawUploader = function(width, height, formname, types) {
		
		trace('uploadHander::drawUploader');

		if (formname) {
			this.formname = formname;
		}
		
		if (width) {
			this.uploaderwidth = width;
		}
		
		if(height) {
			this.uploaderheight = height;
		}
		
		if(!this.formname.length > 0) {
			trace('uploadHander::drawUploader::formname empty');
			return false;
		}
		
		this.frm = document.getElementById(formname);
		if(this.frm === undefined) {
			trace('uploadHander::drawUploader::form "' + this.formname + '"doesn\'t exist');
			return false;
		}
		
		this.trgt = document.getElementById(this.uploaderTarget);
		if(this.trgt === undefined) {
			trace('uploadHander::drawUploader::div "' + this.trgt + '"doesn\'t exist');
			return false;
		}
		
		trace("putting uploader in " + this.uploaderTarget);
		
		this.attributes = {
			"style" : "height:" + this.uploaderheight + "px" 
		};
		
		this.flashvars = {};
		this.params = {};
		this.params.menu = 'false';
		this.params.wmode = 'transparent';
		this.params.allowScriptAccess = 'always';
		this.params.allowFullScreen = 'false';
		this.params.quality = 'high';
		this.params.scale = 'noscale';
		this.params.bgcolor = 'none';
		
		this.flashvars.types = this.types;
		this.flashvars.traceging = '';
		this.flashvars.filename = this.filename;
		this.flashvars.uploadHandler = this.upload_target;
		this.flashvars.button = this.button;
		this.flashvars.formname = this.formname;
		this.flashvars.fieldname = this.uploaderTarget;

		this.udrid = 'bronson_uploader_' + this.formname + '_' + this.fieldname + '_' + this.guid;
		swfobject.embedSWF(this.upload_swf, this.uploaderTarget, this.uploaderwidth, this.uploaderheight, "9.0.28", false, this.flashvars, this.params, this.attributes);
	
		if(this.placeholder) {
			document.getElementById(this.formname + '_' + this.fieldname + '_thumbnails').innerHTML = '<img class="uploader_thumbnails" src="' + this.placeholder + '" />';
		}
	
		bronsonuploaders[this.uploaderTarget] = this;
		trace("uploader in " + this.uploaderTarget + "::" + bronsonuploaders[this.uploaderTarget].uploaderTarget);
		
		return;
	};
	
	this.showMessage = function(arg) {
		trace('uploadHander::showMessage::' + arg);
		if (this.messageTarget) {
			var t = document.getElementById(this.messageTarget);
			t.innerHTML = arg;
		} else {
			trace(arg);
		}
	}
	
	this.commenceUpload = function() {
		trace('uploadHander::commenceUpload');
		return;
	}
	
	this.handleProgress = function(arg) {
		//trace("uploadHandler::handleProgress::start::" + arg);
		
		elem = document.getElementById(this.uploaderTarget);
		var stat_div = this.formname + '_' + this.fieldname + '_status_div';
		var pmid = this.formname + '_' + this.fieldname + '_progmovers';
		var pbid = this.formname + '_' + this.fieldname + '_progbars';
		var stid = this.formname + '_' + this.fieldname + '_stattexts';
		
		if(this.lasttime == null) {
			var d = new Date();
	        var s = d.getTime();
			this.lasttime = s;
			tme = "";
		} else if(arg == 100) {
			var pg = document.getElementById(stat_div);
			var stattext = document.getElementById(stid);
			if (pg) { 
				stattext.innerHTML = "PREPARING MEDIA...";
			} else {
				trace("uploadHandler::no status div::" + stat_div);
			}
			return;
			
		} else if(arg % 2 == 0 && arg > 0) {
			this.currpct = arg;
			if(this.lastpct != this.currpct) {
				trace('uploadHandler::handleProgress::NEW PCT::' + arg);
				var d = new Date();
		        var s = d.getTime();
		        var offset = s - this.lasttime;
		
				var rmn = 100 - arg;
				var num = (offset/1000)*20*rmn;
				//var num = num/1000;
				var num = num/60;
				
				if(num > 3600) {
					num = num/3600;
					tme = Math.round(num) + " hours" + (Math.round(num) > 1 ? "s" : "");
				} else if(num > 60) {
					num = num/60;
					tme = Math.round(num) + " minute" + (Math.round(num) > 1 ? "s" : "");
				} else {
					tme = Math.round(num) + " second" + (Math.round(num) > 1 ? "s" : "");
				}
				
				tme += ' REMAINING';
		
		        this.lasttime = s;
				this.lastpct = this.currpct;
			} else {
				var d = new Date();
		        var s = d.getTime();
		        var offset = s - this.lasttime;

				if(offset > 5000) {
					tme = "RE-CALCULATING...";
				}
			}
			
		} else if(arg == 0) {
			var d = new Date();
	        var s = d.getTime();
	        var offset = s - this.lasttime;
	
			if(offset > 5000) {
				tme = "CALCULATING...";
			} else {
				tme = "BEGINNING UPLOAD..."
			}
	
		} else {
			var d = new Date();
			var s = d.getTime();
			var offset = s - this.lasttime;

			if(offset > 5000) {
				tme = "RE-CALCULATING...";
			}
		}
			
		var progmover = document.getElementById(pmid);
		var pg = document.getElementById(stat_div);
		
		if(!progmover) {
			
			pg.innerHTML = '<div id="' + pbid + '" class="uploader_progbar"><div id="' + pmid + '" class="uploader_progmover"></div><div id="' + stid + '" class="uploader_status"></div></div>';
			
		}
		
		//trace("uploadHandler::handleProgress::arg::" + arg);
		
		//var progbar = document.getElementById(pbid);
		var stattext = document.getElementById(stid);
		
		progmover.style.width = arg + "%";
		stattext.innerHTML = arg + "% COMPLETE / " + tme.toUpperCase();
		
		
		if (pg) { 
			//pg.innerHTML = "Sent: " + arg + "%<br/>Estimated time remaining:" + tme;
		} else {
			trace("uploadHandler::no status div::" + pg);
		}
		
		elem = document.getElementById(this.uploaderTarget);
		
		if(this.ishidden == false) {
			trace("uploadHandler::handleProgress::hiding");
			//elem.style.visibility = 'hidden';
			elem.style.height = '0px';
			this.ishidden = true;
			if(pg) {
				pg.style.height = this.uploaderheight + "px";
				pg.style.width = this.uploaderwidth + "px";
				//pg.style.backgroundColor = "#ccc";
				pg.style.display = "block";
			}
			this.disableForm();
		}
		
		return;
	}
	
	this.disableForm = function() {
		trace("uploadHandler::disableForm");
		
		var sb = document.getElementById(this.formname + "_bronson_form_submit_button");
		if (sb) {
			trace("uploadHandler::disableForm::hiding button");
			sb.style.display = 'none';
		}
		
		trace("uploadHandler::disableForm::finished");
		return true;
	}
	
	this.completedUpload = function(filename) {
		trace("uploadHandler:completedUpload::" + filename);
		
		var stat_div = this.formname + '_' + this.fieldname + '_status_div';
		
		elem = document.getElementById(this.uploaderTarget);
		elem.style.visibility = 'visible';
		elem.style.height = this.uploaderheight + 'px';
		
		var dname = this.formname + '_' + this.fieldname + '_thumbnails';
		trace('uploadHandler:completedUpload::filling: ' + dname);
		trace(dname);
		
		if(!this.frm) {
			this.frm = document.getElementById(this.formname);
		}
		
		if (this.frm) {
			var elem = document.getElementById(this.formname + '_file_' + this.fieldname);
			if (elem) { 
				elem.value = '/uploads/__tmp/' + filename.toLowerCase();
				trace('set ' + this.formname + ' ' + this.fieldname + ' to ' + elem.value );	
			} else {
				trace("uploadHandler:completedUpload::could not find " + this.formname + "_file_" + this.fieldname);
			}
		
			var sb = document.getElementById(this.formname + "_bronson_form_submit_button");
			if (sb) {
					sb.style.display = 'block';
			}
		
			var tdiv = document.getElementById(dname);
			if (tdiv) {
				trace("uploadHandler:completedUpload::have " + dname);
				// tdiv.innerHTML = tdiv.innerHTML + "<br/><img src='/uploads/__tmp/" + filename.toLowerCase() + "' width='200' />";
				// now we replace the whole thing just in case there's something already there?
				d = new Date();
				s = d.getTime();
				if(this.filetype == 'image') {
					tdiv.innerHTML = "<a href='/uploads/__tmp/" + filename.toLowerCase() + "?rand=" + s + "' target='new'><img src='/uploads/__tmp/" + filename.toLowerCase() + "?rand=" + s + "' width='"  + this.previewwidth  + "' />";
				} else {
					tdiv.style.float = "none";
					tdiv.innerHTML = "<a style='display:block;padding:5px;border:solid 1px;' href='/uploads/__tmp/" + filename.toLowerCase() + "?rand=" + s + "' target='new'>" + filename + "</a>";
				}
			} else {
				trace("uploadHandler:completedUpload::no " + dname);
			}
			
			var pg = document.getElementById(stat_div);
			if (pg) { 
				trace("uploadHandler:completedUpload::have " + stat_div);
				compmsg = this.completedmessage['default'];
				if(this.completedmessage[this.filetype]) {
					compmsg  = this.completedmessage[this.filetype];
				}
				
				//pg.style.backgroundColor = "none";
				pg.style.height = "auto";
				pg.innerHTML = compmsg;
			}
			if(this.frm.title.value == '') {
				fname = this.targfilename.split('.');
				this.frm.title.value = fname[0];
			}
			
		} else {
			trace("uploadHandler:completedUpload::no form to which to upload " + this.formname);
		}
		
		this.lasttime = null;
		this.currpct = null;
		this.ishidden = false;
		
		bronsonUploadedFiles[this.fieldname] = true;
		trace("uploadHandler:completedUpload::finished completedUpload");
	}
	
	if(params !== undefined && params.length > 0) {
		this.override(params, this); //OVERRIDE THE MASTER CONFIG W/ PARAMS;
	}
}
//End Obj

// document level event handler 
	function handleProgress (arg, fieldname) {
		//trace("JS::handleProgress::" + arg + "::" + fieldname);
		if(arg % 10 == 0) {
			//trace("JS::handleProgress::" + arg + "::" + fieldname);
		}
		if(!bronsonuploaders[fieldname]) {
			trace('handleProgress::uploader not found in bronsonuploaders array "' +  fieldname + '"');
			return false;
		}
		//trace("JS::handleProgress::" + arg + "::" + bronsonuploaders[fieldname]);
		return bronsonuploaders[fieldname].handleProgress(arg);
	}

	function handleCancel(arg) {
		trace("uploadHandler:handleCancel::" + arg);
	}
	
	function handleError(arg) {
		trace("uploadHandler:handleError" + arg);
	}

	function handleComplete(arg, fieldname) {
		this.success = 1;
		somethingIsUploaded = 1;
		return;
		
		trace("uploadHandler:handleComplete::" + arg + "::" + fieldname);
		var stat_div = 'status_div_' + fieldname;
		var pg = document.getElementById("stat_div");
		if (pg) { 
			
			pg.innerHTML = "<b><i>Finished Upload</i> Make Sure to Save Your Changes!</b>";
		}
		this.success = 1;
		somethingIsUploaded = 1;
	}
	
	function handleSelect(fieldname, fname) {
		trace("uploadHandler:handleSelect::" + fieldname + "::" + fname);
		bronsonuploaders[fieldname].targfilename = fname;
	}
	
	function handleOpen(arg) {
	 	trace("uploadHandler:handleOpen::" + arg);
	}
	
	function handleSecurityError(arg) {
		 trace("uploadHandler:handleSecurityError::" + arg);
	}
	
	function completedUpload(fieldname, filename, formname) {
		trace("uploadHandler:completedUpload::" + fieldname + "::" + filename + "::" + formname);
		if(!bronsonuploaders[fieldname]) {
			trace('completedUpload::uploader not found in bronsonuploaders array "' +  fieldname + '"');
			return false;
		}
		//trace("JS::completedUpload::" + arg + "::" + bronsonuploaders[fieldname]);
		return bronsonuploaders[fieldname].completedUpload(filename);
	}