cs.pro.upload = {

	window: null,

	show: function()
	{
		if(cs.pro.upload.window == null)
		{
			cs.pro.upload.window = new cs.pro.UploadWindow();
			cs.pro.upload.window.detailForm.projectCombo.store.load();
		}
		cs.pro.upload.window.show();
		cs.pro.upload.window.getEl().fadeIn();
	},
	
	hide: function()
	{
		cs.pro.upload.window.hide();
	},

	prepareUpload: function()
	{
		var filename = cs.pro.upload.window.uploadForm.fileSelection.getValue();
		if(filename.search(/\.(stl|ply|3ds|obj|lwo|wrl|off)$/i) > -1)
		{
			extension = (filename.match(/(stl|ply|3ds|obj|lwo|wrl|off)$/i))[0].toLowerCase();
			filename = filename.replace(/(stl|ply|3ds|obj|lwo|wrl|off)$/i, '');
			filename = filename + extension;
		}
		else
		{
			Ext.Msg.alert('Invalid Extension', 'Not a valid file extension. Valid extensions are stl, ply, 3ds, obj, lwo, wrl and off.');
			return;
		}
		Ext.Ajax.request({
			url: '/json/pro_upload',
			method: 'POST',
			params:	{
				project: cs.pro.upload.window.detailForm.projectCombo.getEl().getValue(),
				filename: filename
			},
			callback: cs.pro.upload.gotPrepareUpload
		});
	},

	gotPrepareUpload: function(options, success, response)
	{
		if(response = cs.common.lib.errorFilter(success, response, cs.pro.upload.prepareUpload))
		{
			var uploadForm = cs.pro.upload.window.uploadForm;

			uploadForm.accessKey.setValue(response.accessKey);
			uploadForm.acl.setValue(response.acl);
			uploadForm.key.setValue(response.key);
			uploadForm.policy.setValue(response.policy);
			uploadForm.redirect.setValue(response.redirect);
			uploadForm.signature.setValue(response.signature);
			uploadForm.getForm().url = response.url;
			uploadForm.getForm().submit();
		}
	},
	
	complete: function(form, action)
	{
		//cs.pro.project.refresh();
		cs.pro.viewport.refreshGrid();
		cs.pro.upload.window.destroy();
		cs.pro.upload.window = null;
	}
};

cs.pro.UploadWindow = Ext.extend(Ext.Window, {

	initComponent: function()
	{
		this.detailForm = new cs.pro.DetailForm();
		this.uploadForm = new cs.pro.UploadForm();

		Ext.apply(this, {
			title: cs.pro.i18n.uploadFile,
			items: [{
				frame: true,
				margins: '5,5,5,5',
				items: [
					this.detailForm,
					this.uploadForm
				]
			}],
			border: false,
			closable: true,
			closeAction: 'hide',
			height: 125,
			width: 350,
			resizable: false,
			plain: true,
			layout: 'fit',
			modal: true
		});
		
		cs.pro.UploadWindow.superclass.initComponent.call(this, arguments);
	}
});

cs.pro.DetailForm = Ext.extend(Ext.form.FormPanel, {

	initComponent: function()
	{
		
		this.projectCombo = new cs.pro.ProjectCombo();

		Ext.apply(this, {
			labelWidth: 65,
			frame: false,
			boder: false,
			items: [
				this.projectCombo
			]
		});

		cs.pro.DetailForm.superclass.initComponent.call(this, arguments);
	}
});

cs.pro.ProjectCombo = Ext.extend(Ext.form.ComboBox, {
	
	initComponent: function()
	{
		this.store = new Ext.data.JsonStore({
			url: 'json/projects',
			method: 'POST',
			root: 'projects',
			fields: [{
				name: 'project',
				type: 'string',
				mapping: 'project'
			}]
		});

		Ext.apply(this, {
			fieldLabel: cs.pro.i18n.project,
			mode: 'local',
			disableKeyFilter: true,
			store: this.store,
			valueField: 'project',
			triggerAction: 'all',
			name: 'projectNameField',
			displayField: 'project',
			emptyText: 'Select a Project'
		});

		cs.pro.ProjectCombo.superclass.initComponent.call(this, arguments);
	}
});

cs.pro.UploadForm = Ext.extend(Ext.form.FormPanel, {

	initComponent: function()
	{
		this.accessKey			= new Ext.form.Hidden({name: 'AWSAccessKeyId'});
		this.acl				= new Ext.form.Hidden({name: 'acl'});
		this.key				= new Ext.form.Hidden({name: 'key'}),
		this.policy				= new Ext.form.Hidden({name: 'policy'}),
		this.redirect			= new Ext.form.Hidden({name: 'redirect'}),
		this.signature			= new Ext.form.Hidden({name: 'signature'}),
		this.fileSelection		= new cs.pro.FileSelection();

		Ext.apply(this, {
			fileUpload: true,
			labelWidth: 65,
			frame: false,
			border: false,

			items: [
				this.accessKey,
				this.acl,
				this.key,
				this.policy,
				this.redirect,
				this.signature,
				this.fileSelection
			],
			
			buttons: [
				{
					text: cs.pro.i18n.upload,
					handler: cs.pro.upload.prepareUpload,
					scope: this
				},
				{
					text: cs.pro.i18n.cancel,
					handler: cs.pro.upload.hide
				}
			]
			
		});

		cs.pro.UploadForm.superclass.initComponent.call(this, arguments);
		this.getForm().on('actionComplete', cs.pro.upload.complete);
	}
});

cs.pro.FileSelection = Ext.extend(Ext.form.TextField, {

	initComponent: function()
	{
		Ext.apply(this, {
			fieldLabel: cs.pro.i18n.file,
			ctCls: 'uploadfield',
			name: 'file',
			inputType: 'file'
		});
		
		cs.pro.FileSelection.superclass.initComponent.call(this, arguments);
	}
});
