/*
Usage:
var new_uploader = new Uploader('formid');
new_uploader.Allowed_Extensions = ['gif', 'jpg'];
new_uploader.Destination_Path = '/relativetorootpath/thisfolder/';
new_uploader.Update_Progress = funcname;
new_uploader.Number_Of_Copies = 2;
new_uploader.Appendices = ['-copy1', -copy2'];
new_uploader.Sizes = [200, 500];
new_uploader.Constraints = ['H', 'H'];
new_uploader.Start();

<form id="formid">
<input type="file" name="filename" />
<input type="file" name="filename2" />
<input type="button" value="start upload" onclick="new_uploader.Start();" />
</form>
*/

function Uploader(Form) {
	var self = this;
	self.Form = v$(Form);
	self.Destination_Path;
	self.Upload_In_Progress = false;
	self.Update_Progress;
	self.Number_Of_Copies = 1;
	self.Appendices = new Array();
	self.Sizes = new Array();
	self.Constraints = new Array();
	self.Allowed_Extensions = new Array();
	self.Original_Form_Attributes = new Array();
	self.File_Upload_List;


	// Create Uploader_Progress_Frame iframe if it doesn't exist
	if (!v$('Uploader_Progress_Frame')) {
		var Uploader_Progress_Frame = document.createElement('IFRAME');
		Uploader_Progress_Frame.setAttribute('id', 'Uploader_Progress_Frame');
		Uploader_Progress_Frame.setAttribute('name', 'Uploader_Progress_Frame');
		Uploader_Progress_Frame.setAttribute('src', '/fileupload/UploadPage.aspx');
		Uploader_Progress_Frame.style['width'] = '0px';
		Uploader_Progress_Frame.style['height'] = '0px';
		Uploader_Progress_Frame.style['border'] = '0px';

		self.Form.appendChild(Uploader_Progress_Frame);
		delete Uploader_Progress_Frame;
	}

	// Create Uploader_Target_Frame iframe if it doesn't exist
	var Element_Found = false;
	var Elements = self.Form.getElementsByTagName('IFRAME');
	for (var i = 0; i < Elements.length; i++) {
		if (Elements[i].name == 'Uploader_Target_Frame') {
			Element_Found = true;
			break;
		}
	}
	if (!Element_Found) {
		if (document.all) {
			var Uploader_Target_Frame = document.createElement('<iframe src="../blank.html" name="Uploader_Target_Frame"></iframe>');
		}
		else {
			var Uploader_Target_Frame = document.createElement('IFRAME');
			Uploader_Target_Frame.setAttribute('name', 'Uploader_Target_Frame');
		}
		Uploader_Target_Frame.style['width'] = '0px';
		Uploader_Target_Frame.style['height'] = '0px';
		Uploader_Target_Frame.style['border'] = '0px';

		self.Form.appendChild(Uploader_Target_Frame);
		delete Uploader_Target_Frame;
		delete Elements;
	}

	// Create Uploader_XML hidden field if it doesn't exist
	var Element_Found = false;
	var Elements = self.Form.getElementsByTagName('INPUT');
	for (var i = 0; i < Elements.length; i++) {
		if (Elements[i].name == 'Uploader_XML') {
			Element_Found = true;
			break;
		}
	}
	if (!Element_Found) {
		if (document.all) {
			var Uploader_XML = document.createElement('<input name="Uploader_XML" />');
		}
		else {
			var Uploader_XML = document.createElement('INPUT');
			Uploader_XML.setAttribute('name', 'Uploader_XML');
		}
		Uploader_XML.setAttribute('type', 'hidden');

		self.Form.appendChild(Uploader_XML);
		delete Uploader_XML;
	}

	self.New_GUID = function() {
		return Date().toString().replace(/[\s:\(\)\-\\]/g, '') + (new Date()).getMilliseconds().toString() + (Math.random().toString().replace(/\./g, ''));
	}

	self.Delete = function() {
		var Delete_XML = '';
		for (var i = 0; i < arguments.length; i++) {
			Delete_XML += '<File><Source_Path>' + arguments[i] + '</Source_Path></File>';
		}
		if (Delete_XML.length > 0) {
			Delete_XML = '<Task Type="delete">' + Delete_XML + '</Task>';
		}
		return Delete_XML;
	}

	self.Rename = function() {
		var Rename_XML = '';
		for (var i = 0; i < arguments.length; i += 2) {
			Rename_XML += '<File><Source_Path>' + arguments[i] + '</Source_Path><New_File_Name>' + arguments[i+1] + '</New_File_Name></File>';
		}
		if (Rename_XML.length > 0) {
			Rename_XML = '<Task Type="rename">' + Rename_XML + '</Task>';
		}
		return Rename_XML;
	}

	self.Resize = function(Source_Path, Destination_Path_List, Size_List, Constraint_List) {
		var Resize_XML = '';
		for (var i = 0; i < Destination_Path_List.length; i++) {
			Resize_XML += '<File><Source_Path>' + Source_Path + '</Source_Path><Destination_Path>' + Destination_Path_List[i] + '</Destination_Path>'
			if (Constraint_List[i] == 'W' || Constraint_List[i] == '') {
				Resize_XML += '<Max_Width>' + Size_List[i] + '</Max_Width>';
			}
			if (Constraint_List[i] == 'H' || Constraint_List[i] == '') {
				Resize_XML += '<Max_Height>' + Size_List[i] + '</Max_Height>';
			}
			Resize_XML += '</File>';
		}
		if (Resize_XML.length > 0) {
			Resize_XML = '<Task Type="resize">' + Resize_XML + '</Task>';
		}
		return Resize_XML;
	}

	self.Run_Commands = function(XML, Success_Function) {
		if (location.toString().indexOf("viewxml=1") > -1) {
			alert(XML);
		}
		sendAjax('POST', '/FileUpload/UploadSave.aspx?guid=' + self.New_GUID(), 'Uploader_XML=<Task_List>' + XML + '</Task_List>', Success_Function);
	}

	self.Receive_Progress = function(Percent_Complete) {
		if (Percent_Complete >= 100) {
			self.Upload_In_Progress = false;
		}
		if (self.Update_Progress) {
			self.Update_Progress(Percent_Complete);
		}
	}

	self.Start = function() {
		if (self.Upload_In_Progress) {
			return false;
		}

		var Upload_XML = '', Resize_XML = '', Delete_XML = '';
		var Temp_File_Name
		var Input_File, File_Name, File_Extension;
		var GUID = self.New_GUID();

		var Destination_Path = new Array();
		var Input_File_Elements = new Array();
		var Number_Of_Copies = new Array();
		var Sizes = new Array();
		var Constraints = new Array();
		var Appendices = new Array();
		var Allowed_Extensions = new Array();

		if (self.Appendices.length == 0) {
			self.Appendices = '';
		}

		var cnt = 0;
		for (var i = 0; i < self.Form.elements.length; i++) {
			Input_File = self.Form.elements[i];
			if (Input_File.type.toUpperCase() == 'FILE') {
				Input_File_Elements.push(Input_File);
				// Normalize Destination_Path
				if (typeof(self.Destination_Path) != 'object') {
					Destination_Path.push(self.Destination_Path);
				}
				else {
					Destination_Path.push(self.Destination_Path[cnt]);
				}
				// Normalize Number_Of_Copies
				if (typeof(self.Number_Of_Copies) != 'object') {
					Number_Of_Copies.push(self.Number_Of_Copies);
				}
				else {
					Number_Of_Copies.push(self.Number_Of_Copies[cnt]);
				}
				// Normalize Allowed_Extensions
				if (typeof(self.Allowed_Extensions) != 'object') {
					Allowed_Extensions.push(self.Allowed_Extensions);
				}
				else {
					Allowed_Extensions.push(self.Allowed_Extensions[cnt]);
				}
				//Allowed_Extensions.push(self.Allowed_Extensions);

				Appendices[cnt] = new Array();
				Sizes[cnt] = new Array();
				Constraints[cnt] = new Array();
				for (var x = 0; x < Number_Of_Copies[cnt]; x++) {
					// Normalize Appendices
					if (typeof(self.Appendices) != 'object') {
						Appendices[cnt].push(self.Appendices);
					}
					else if (typeof(self.Appendices[cnt]) != 'object') {
						Appendices[cnt].push([self.Appendices[x]]);
					}
					else {
						Appendices[cnt].push(self.Appendices[cnt][x]);
					}
					// Normalize Sizes
					if (typeof(self.Sizes) != 'object') {
						Sizes[cnt].push(self.Sizes);
					}
					else if (typeof(self.Sizes[cnt]) != 'object') {
						Sizes[cnt].push([self.Sizes[x]]);
					}
					else {
						Sizes[cnt].push(self.Sizes[cnt][x]);
					}
					// Normalize Constraints
					if (typeof(self.Constraints) != 'object') {
						Constraints[cnt].push(self.Constraints);
					}
					else if (typeof(self.Constraints[cnt]) != 'object') {
						Constraints[cnt].push([self.Constraints[x]]);
					}
					else {
						Constraints[cnt].push(self.Constraints[cnt][x]);
					}
				}
				cnt++;
			}
		}

		if (Allowed_Extensions.toString() != '') {
			for (var i = 0; i < Input_File_Elements.length; i++) {
				Input_File = Input_File_Elements[i];
				if (Input_File.value != '') {
					File_Extension = Input_File.value.substr(Input_File.value.lastIndexOf('.') + 1);
					if ((',' + Allowed_Extensions[i].toString().toLowerCase() + ',').indexOf(',' + File_Extension.toLowerCase() + ',') == -1) {
					    //						window.alert('You are trying to upload an invalid extension. File ' + Input_File.getAttribute('name') + ' must have an extension of any of the following: ' + Allowed_Extensions[i].toString());
					    //BUGS-493 hln 1/25/2010 2) dont display file name in question 
					    window.alert('You are trying to upload an invalid extension. File  must have an extension of any of the following: ' + Allowed_Extensions[i].toString());
					    self.Upload_In_Progress = false;
						return false;
					}
				}
			}
		}

		self.File_Upload_List = new Array();
		for (var i = 0; i < Input_File_Elements.length; i++) {
			Input_File = Input_File_Elements[i];
			if (Input_File.value != '') {
				File_Extension = Input_File.value.substr(Input_File.value.lastIndexOf('.'));
				File_Extension = File_Extension.replace(/jpeg/gi, 'jpg');
				File_Name = Input_File.getAttribute('name');

				if (Sizes[i].toString() != '') {
					Temp_File_Name = Destination_Path[i] + File_Name + GUID + i + File_Extension;
				}
				else {
					Temp_File_Name = Destination_Path[i] + File_Name + File_Extension;
				}

				Upload_XML += '<File><Destination_Path>' + Temp_File_Name + '</Destination_Path></File>';
				
				for (var x = 0; x < Number_Of_Copies[i]; x++) {
					self.File_Upload_List.push(Destination_Path[i] + File_Name + Appendices[i][x] + File_Extension);

					if (Sizes[i].toString() != '') {

						Resize_XML += '<File><Source_Path>' + Temp_File_Name + '</Source_Path><Destination_Path>' + Destination_Path[i] + File_Name + Appendices[i][x] + File_Extension + '</Destination_Path>';
	
						if (Sizes[i][x] < 5) {
							Sizes[i][x] = 5;
						}
	
						if (Constraints[i][x] == 'H' || Constraints[i][x] == 'B') {
							Resize_XML += '<Max_Height>' + Sizes[i][x] + '</Max_Height>';
						}
						if (Constraints[i][x] == 'W' || Constraints[i][x] == 'B') {
							Resize_XML += '<Max_Width>' + Sizes[i][x] + '</Max_Width>';
						}
	
						Resize_XML += '</File>';
					}
				}

				if (Sizes[i].toString() != '') {
					Delete_XML += '<File><Source_Path>' + Temp_File_Name + '</Source_Path></File>';
				}
			}
		}

		if (self.File_Upload_List.length > 0) {
			if (Upload_XML.length > 0) {
				Upload_XML = '<Task Type="upload">' + Upload_XML + '</Task>';
			}
			if (Resize_XML.length > 0) {
				Resize_XML = '<Task Type="resize">' + Resize_XML + '</Task>';
			}
			if (Delete_XML.length > 0) {
				Delete_XML = '<Task Type="delete">' + Delete_XML + '</Task>';
			}

			self.Form.elements['Uploader_XML'].value = '<Task_List>' + Upload_XML + Resize_XML + Delete_XML + '</Task_List>';
			if (location.toString().indexOf("viewxml=1") > -1) {
				alert(self.Form.elements['Uploader_XML'].value);
			}


			self.Original_Form_Attributes['target'] = self.Form.getAttribute('target');
			self.Original_Form_Attributes['encType'] = self.Form.getAttribute('encType');
			self.Original_Form_Attributes['method'] = self.Form.getAttribute('method');
			self.Original_Form_Attributes['action'] = self.Form.getAttribute('action');
			self.Form.setAttribute('target', 'Uploader_Target_Frame');
			self.Form.setAttribute('encType', 'multipart/form-data');
			self.Form.setAttribute('method', 'post');
			self.Form.setAttribute('action', '/FileUpload/UploadSave.aspx?guid=' + GUID);
			self.Form.submit();
			self.Form.setAttribute('target', self.Original_Form_Attributes['target']);
			self.Form.setAttribute('encType', self.Original_Form_Attributes['encType']);
			self.Form.setAttribute('method', self.Original_Form_Attributes['method']);
			self.Form.setAttribute('action', self.Original_Form_Attributes['action']);

			if (document.all) {
				new document.frames['Uploader_Progress_Frame'].StartUploadProgress(self.Receive_Progress, GUID);
			}
			else {
				new window.frames['Uploader_Progress_Frame'].StartUploadProgress(self.Receive_Progress, GUID);
			}
		}
		else {
			self.Upload_In_Progress = false;
			if (self.Update_Progress) {
				self.Update_Progress(100);
			}
			return false;
		}

		self.Upload_In_Progress = true;
		return true;
	}
}
