var uplodes = function() {

};

$.extend(uplodes, {
	Item : function(settings) {
		var defaults = {
			id        : null,
			name      : null,
			folder    : 0,
			color     : null,
			thumbnail : null,
			image     : false,
			ext       : null
		};

		this.settings = $.extend(defaults, settings);
		this.init();
	}
});

$.extend(uplodes.Item.prototype, {
	init : function() {
		// determine type and thumbnail
		if(this.settings.folder == 1)
		{
			this.settings.type      = 'folder';
			this.settings.thumbnail = 'images/uplodes/folders/folder_'+this.settings.color+'.png';
		}
		else
		{
			if(this.settings.ext == 'jpg' || this.settings.ext == 'gif' || this.settings.ext == 'png' || this.settings.ext == 'bmp')
			{
				this.settings.type = 'file';
				this.settings.image = true;
				if(uplodes.vars.demo_mode)
				{
					this.settings.thumbnail = 'scripts/uplodes/get_demo_image.php?q='+uplodes.vars.account_id+'_'+this.settings.id+'_1';
				}
				else
				{
					this.settings.thumbnail = 'scripts/uplodes/get_image.php?q='+uplodes.vars.account_id+'_'+this.settings.id+'_1';
				}
			}
			else
			{
				this.settings.type      = 'file';
				this.settings.thumbnail = 'images/uplodes/icons/icon_'+this.settings.ext+'.png';
			}
		}

		this.create();
	},
	recolor : function(color) {
		if(this.settings.type != 'folder') return;

		this.settings.thumbnail = this.settings.thumbnail.replace('folder_'+this.settings.color, 'folder_'+color);
		$('.thumbnail img', this.element).attr('src', this.settings.thumbnail);
		this.settings.color = color;
	},
	rename : function(name) {
		$('.name', this.element).html(name);
		this.settings.name = name;
	},
	create : function() {
		if(this.settings.image)
		{
			width  = 45;
			height = 45;
		}
		else
		{
			width  = 60;
			height = 60;
		}
		
		this.element = $('<div></div>')
		.addClass('item')
		.addClass(this.settings.type)
		.attr('id', 'item_'+this.settings.id)
		.append(
			$('<div></div>')
			.addClass('thumbnail')
			.html('<img src="'+this.settings.thumbnail+'" width="'+width+'" height="'+height+'" />')
		)
		.append(
			$('<div></div>')
			.addClass('thumbnail_cover') // required for IE and Chrome drag when thumbnail is clicked
			.css({
				opacity: 0.0
			})
		)
		.append(
			$('<div></div>')
			.addClass('name')
			.html(this.settings.name)
		)
		.disable_selection();

		if(this.settings.image)
		{
			this.element.addClass('image');
		}

		var self = this;

		// enable folder droppable
		if(this.settings.type == 'folder')
		{
			$(this.element).droppable({
				accept     : '.item',
				tolerance  : 'pointer',
				hoverClass : 'hovered_folder',
				drop : function(e, ui) {
					uplodes.move_items(uplodes.vars.selected_folders.concat(uplodes.vars.selected_files), self.settings.id);
				}
			});
		}

		// enable draggable on multiple items
		$(this.element).draggable({
			helper  : function() {
				// create helper
				var helper = $('<div></div>')
				.addClass('items')
				.css({
					position   : 'absolute',
					overflow   : 'hidden'
				});

				// determine helper width and height based on item location
				var container_offset = $('#item_container').offset();

				var left_most = 999999;
				var right_most = 0;
				var top_most  = 999999;
				var bottom_most = 0;

				// combine selected folders and files
				var selected_items = uplodes.vars.selected_folders.concat(uplodes.vars.selected_files);

				for(var i=0; i<selected_items.length; i++)
				{
					var el = $('#item_'+selected_items[i]);
					var width = $.get_width(el);
					var height = $.get_height(el);
					var offset = el.offset();
					
					if(offset.left < left_most)
					{
						left_most = offset.left;
					}
					if(offset.left+width > right_most)
					{
						right_most = offset.left+width;
					}
					if(offset.top < top_most)
					{
						top_most = offset.top;
					}
					if(offset.top+height > bottom_most)
					{
						bottom_most = offset.top+height;
					}
				}

				// reposition helper
				var this_offset = $(this).offset();

				var width  = right_most-left_most;
				var height = bottom_most-top_most;

				helper.css({
					width      : width+'px',
					height     : height+'px',
					marginLeft : (-1*(this_offset.left-left_most))+'px',
					marginTop  : (-1*(this_offset.top-top_most))+'px'
				});

				// add and posiition item clones
				for(var i=0; i<selected_items.length; i++)
				{
					var el = $('#item_'+selected_items[i]);
					var offset = el.offset();

					el
					.clone()
					.addClass('clone')
					.css({
						opacity  : .5,
						position : 'absolute',
						left     : (offset.left-left_most)+'px',
						top      : (offset.top-top_most)+'px',
					})
					.appendTo(helper);
				}

				helper.appendTo(document.body);

				return $(helper)[0];
			},
			delay    : 50,
			distance : 10,
			revert   : true,
			opacity  : .85,
			start    : function(e, ui) {
				ui.helper.css('zIndex', 1000);
				// disable upload zone
				$('#zone_container .upload .zone').addClass('disabled');
				// disable download zone if dragging a folder alone
				if(uplodes.vars.selected_files.length == 0)
				{
					$('#zone_container .download .zone').addClass('disabled');
				}
			},
			stop    : function(e, ui) {
				ui.helper.css('zIndex', 2);
				// enable upload zone
				$('#zone_container .upload .zone').removeClass('disabled');
				// enable download zone for folder
				$('#zone_container .download .zone').removeClass('disabled');
			}
		});

		//<div class="folder item" id="folder_<?=$id?>"><div class="item_icon"><img src="/images/uplodes/folders/folder_<?=$color?>.png" /></div><div class="item_name"><?=format_item_name($name)?></div></div>
	}
});

$.extend(uplodes, {
	vars : {
		folder_id        : 0,
		parent_folder_id : 0,
		buttons          : {},
		items            : [],
		selected_files   : [],
		selected_folders : []
	},
	init : function() {
		$(document.body).append(
			'<div id="context_menu">'+
				'<ul>'+
					'<li class="open"><a><u>O</u>pen</a></li>'+
					'<li class="move"><a><u>M</u>ove</a></li>'+
					'<li class="color"><a><u>C</u>hange Color</a></li>'+
					'<li class="divider"></li>'+
					'<li class="download"><a>Download <u>F</u>ile</a></li>'+
					'<li class="email"><a><u>E</u>mail File</a></li>'+
					'<li class="link"><a>Create Image <u>L</u>ink</a></li>'+
					'<li class="tag"><a>Create Image <u>T</u>ag</a></li>'+
					'<li class="divider"></li>'+
					'<li class="rename"><a><u>R</u>ename</a></li>'+
					'<li class="delete"><a><u>D</u>elete</a></li>'+
				'</ul>'+
			'</div>');
		
		// context menu
		uplodes.context_menu = new moxyfy.Menu('context_menu', {
			type : 'context',
			flush : 'mouse'
		});

		var self = this;
		// item click events
		$('#item_container .item')
			.live('dblclick', function(e) {
				self.dblclick_handler(e);
			})
			.live('mousedown', function(e) {
				self.click_handler(e);
			})
			.live('mouseup', function(e) {
				self.click_handler(e);
			})
			.live('contextmenu', function(e) {
				self.contextmenu_handler(e);
				return false;
			});
		// unselecting click
		$(document.body).bind('click', function(e) {
			self.unclick_handler(e);
		});
		// context menu shortcut
		$(document).bind('keydown', function(e) {
			if(uplodes.context_menu.showing)
			{
				uplodes.run_command(uplodes.get_event_command(e));
			}
		});
		$('#context_menu li a').bind('click', function(e) {
			var parts = this.parentNode.className.split(' ');
			uplodes.run_command(parts[0]);
		});
	},
	
	get_event_command : function(e) {
		if($.keycode_equals(e, 'o'))
			return 'open';
		else if($.keycode_equals(e, 'm'))
			return 'move';
		else if($.keycode_equals(e, 'c'))
			return 'color';
		else if($.keycode_equals(e, 'f'))
			return 'download';
		else if($.keycode_equals(e, 'e'))
			return 'email';
		else if($.keycode_equals(e, 'l'))
			return 'link';
		else if($.keycode_equals(e, 't'))
			return 'tag';
		else if($.keycode_equals(e, 'r'))
			return 'rename';
		else if($.keycode_equals(e, 'd'))
			return 'delete';
	},

	run_command : function(cmd) {
		// if the command isn't enabled, return
		if(uplodes.context_menu_options[cmd] != 1) return;

		if(cmd == 'open')
		{
			uplodes.open_folder(uplodes.vars.selected_folders[0]);
		}
		else if(cmd == 'move')
		{
			uplodes.move_items(uplodes.vars.selected_folders.concat(uplodes.vars.selected_files));
		}
		else if(cmd == 'color')
		{
			uplodes.recolor_folder(uplodes.vars.selected_folders[0]);
		}
		else if(cmd == 'download')
		{
			uplodes.download_files();
		}
		else if(cmd == 'email')
		{
			uplodes.email_file(uplodes.vars.selected_files[0]);
		}
		else if(cmd == 'link')
		{
			uplodes.link_image(uplodes.vars.selected_files[0]);
		}
		else if(cmd == 'tag')
		{
			uplodes.tag_image(uplodes.vars.selected_files[0]);
		}
		else if(cmd == 'rename')
		{
			if(uplodes.vars.selected_folders.length > 0)
			{
				uplodes.rename_item(uplodes.vars.selected_folders[0]);
			}
			else
			{
				uplodes.rename_item(uplodes.vars.selected_files[0]);
			}
		}
		else if(cmd == 'delete')
		{
			uplodes.delete_items();
		}
		uplodes.context_menu.hide();
	},
	
	contextmenu_handler : function(e) {
		var target = $.find_event_target(e, { classes : ['item'] });
		if(target == false) return false;

		uplodes.context_menu_options = {
			'open'     : 1,
			'move'     : 1,
			'color'    : 1,
			'download' : 1,
			'email'    : 1,
			'link'     : 1,
			'tag'      : 1,
			'rename'   : 1,
			'delete'   : 1
		};

		// multiple file and/or folders
		if(uplodes.vars.selected_folders.length + uplodes.vars.selected_files.length > 1)
		{
			// disable single item options
			uplodes.context_menu_options['open']   = 0;
			uplodes.context_menu_options['color']  = 0;
			uplodes.context_menu_options['email']  = 0;
			uplodes.context_menu_options['link']   = 0;
			uplodes.context_menu_options['tag']    = 0;
			uplodes.context_menu_options['rename'] = 0;
			
			// if no files, disable download
			if(uplodes.vars.selected_files.length == 0)
			{
				uplodes.context_menu_options['download'] = 0;
			}
		}
		// single file or folder
		else
		{
			// single file
			if(uplodes.vars.selected_files.length == 1)
			{
				// disable folder only options
				uplodes.context_menu_options['open']  = 0;
				uplodes.context_menu_options['color'] = 0;
				
				var id = target.id.replace('item_','');
				var myItem = uplodes.get_item(id);
				// not an image
				if(!myItem.settings.image)
				{
					// disable image only options
					uplodes.context_menu_options['link'] = 0;
					uplodes.context_menu_options['tag']  = 0;
				}
			}
			// single folder
			else
			{
				// disable file only options
				uplodes.context_menu_options['download'] = 0;
				uplodes.context_menu_options['email']    = 0;
				uplodes.context_menu_options['link']     = 0;
				uplodes.context_menu_options['tag']      = 0;
			}
		}
		
		// enable/disable options
		for(var key in uplodes.context_menu_options)
		{
			if(uplodes.context_menu_options[key] == 1)
			{
				$('#context_menu li.'+key).removeClass('disabled');
			}
			else
			{
				$('#context_menu li.'+key).addClass('disabled');
			}
		}

		uplodes.context_menu.show(e);
		return false;
	},
	
	dblclick_handler : function(e) {
		var target = $.find_event_target(e, { classes : ['item'] });
		if(target == false) return false;
		
		var id = target.id.replace('item_','');
		var myItem = uplodes.get_item(id);

		if(myItem.settings.type == 'folder')
		{
			// open folder
			uplodes.open_folder(id);
		}
		else
		{
			// download file
			uplodes.download_files();
		}
	},
	
	unclick_handler : function(e) {
		var target = $.find_event_target(e, { classes : ['item','context_menu'] });
		if(target == false)
		{
			uplodes.unselect_all_items();
		}
	},
	
	click_handler : function(e) {
		var target = $.find_event_target(e, { classes : ['item'] });
		if(target == false) return false;

		var id = target.id.replace('item_','');

		var click_type = $.get_click_type(e);

		// mouse down
		if(e.type == 'mousedown')
		{
			// if target isn't in selected group
			if($.inArray(id, uplodes.vars.selected_files) == -1 && $.inArray(id, uplodes.vars.selected_folders) == -1)
			{
				if(!e.ctrlKey)
				{
					uplodes.unselect_all_items();
				}
				uplodes.select_item(target.id);
			}
			else
			{
				// only unselect with ctrl for left click
				if(e.ctrlKey && click_type == 'left')
				{
					uplodes.unselect_item(target.id);
				}
			}
		}
		// left click mouse up
		else if(click_type == 'left')
		{
			// don't repond if mouse up after dragging
			if($(target).hasClass('ui-selectable-helper') || $(target).hasClass('clone'))
				return;

			if($.inArray(id, uplodes.vars.selected_files) != -1 || $.inArray(id, uplodes.vars.selected_folders) != -1)
			{
				if(!e.ctrlKey)
				{
					uplodes.unselect_all_items();
				}
				uplodes.select_item(target.id);
			}
		}
	},

	add_button : function(name, settings) {
		// add button html
		var element = $('<div></div>')
		.addClass(name)
		.appendTo('#nav_container .buttons .left');

		// add divider
		$('<div></div>')
		.addClass('button_divider')
		.appendTo('#nav_container .buttons .left');

		uplodes.vars.buttons[name] = new moxyfy.Button(element, settings);
	},
	
	enable_button : function(name) {
		uplodes.vars.buttons[name].enable();
	},
	
	disable_button : function(name) {
		uplodes.vars.buttons[name].disable();
	},

	select_item : function(id) {
		if(typeof id != 'string' || id == '') return;

		id = id.replace('item_','');
		if($.inArray(id, uplodes.vars.selected_files) == -1 && $.inArray(id, uplodes.vars.selected_folders) == -1)
		{
			var myItem = uplodes.get_item(id);
			if(myItem.settings.type == 'folder')
			{
				uplodes.vars.selected_folders.push(id);
			}
			else
			{
				uplodes.vars.selected_files.push(id);
			}
			$('#item_'+id).addClass('selected');
		}
	},
	
	unselect_item : function(id) {
		if(typeof id != 'string' || id == '') return;

		id = id.replace('item_','');
		var myItem = uplodes.get_item(id);

		if(myItem.settings.type == 'folder')
		{
			var index = $.inArray(id, uplodes.vars.selected_folders);
			if(index == -1) return;

			uplodes.vars.selected_folders.splice(index, 1);
		}
		else
		{
			var index = $.inArray(id, uplodes.vars.selected_files);
			if(index == -1) return;

			uplodes.vars.selected_files.splice(index, 1);
		}

		$('#item_'+id).removeClass('selected');
	},

	unselect_all_items : function() {
		for(var i=0; i<uplodes.vars.selected_folders.length; i++)
		{
			$('#item_'+uplodes.vars.selected_folders[i]).removeClass('selected');
		}
		for(var i=0; i<uplodes.vars.selected_files.length; i++)
		{
			$('#item_'+uplodes.vars.selected_files[i]).removeClass('selected');
		}
		uplodes.vars.selected_folders = [];
		uplodes.vars.selected_files = [];
	},

	add_item : function(settings) {
		// create item
		var new_item = new uplodes.Item(settings);

		// find index where this item belongs
		var items_length = uplodes.vars.items.length;
		var index = 0;
		var found = false;
		while(index < items_length && !found)
		{
			// if new item is folder and we have reached files OR
			// new item is folder, we are in folders, and its name is less OR
			// new item is file, we are in files, and its name is less
			if(
				new_item.settings.type == 'folder' && uplodes.vars.items[index].settings.type == 'file' ||
				(new_item.settings.type == 'folder' && uplodes.vars.items[index].settings.type == 'folder' && new_item.settings.name.toLowerCase() < uplodes.vars.items[index].settings.name.toLowerCase()) ||
				(new_item.settings.type == 'file' && uplodes.vars.items[index].settings.type == 'file' && new_item.settings.name.toLowerCase() < uplodes.vars.items[index].settings.name.toLowerCase())
			)
			{
				found = true;
			}
			else
			{
				index++;
			}
		}

		if(uplodes.vars.items.length == 0)
		{
			uplodes.clear_items();
		}

		// add to the end of the list
		if(!found)
		{
			$('#item_container').append(new_item.element);
			uplodes.vars.items.push(new_item);
		}
		// add to the front of the list
		else if(index == 0)
		{
			$('#item_container').prepend(new_item.element);
			uplodes.vars.items.unshift(new_item);
		}
		else
		{
			// add to the index position
			uplodes.vars.items[index].element.before(new_item.element);
			uplodes.vars.items.splice(index, 0, new_item);
		}
	},

	remove_items : function(ids) {
		if(typeof ids == 'undefined' || ids == '') return;
		ids = ids.split(',');

		for(var i=0; i<ids.length; i++)
		{
			var myItem = uplodes.get_item(ids[i]);
			$(myItem.element).remove();

			// find index
			var found = false;
			for(var index=0; index<uplodes.vars.items.length && !found; index++)
			{
				if(uplodes.vars.items[index].settings.id == ids[i])
				{
					found = true;
				}
			}
			if(found)
				uplodes.vars.items.splice((index-1), 1);
		}

		if(uplodes.vars.items.length == 0)
		{
			uplodes.no_items();
		}
	},

	get_item : function(id) {
		for(var i=0; i<uplodes.vars.items.length; i++)
		{
			if(uplodes.vars.items[i].settings.id == id)
			{
				return uplodes.vars.items[i];
			}
		}
	},

	loading : function() {
		uplodes.clear_items();
		$('#item_container').append('<div style="margin-top: 50px;">loading...<br /><img src="/skins/'+moxyfy.skin+'/images/loading_bar.gif" /></div>');
	},

	no_items : function() {
		$('#item_container').append('<img style="margin-top: 40px;" src="skins/'+moxyfy.skin+'/images/uplodes/empty-folder.png" /><div class="spacer">&nbsp;</div>');
	},

	clear_items : function() {
		for(var i=0; i<uplodes.vars.items.length; i++)
		{
			$(uplodes.vars.items[i].element).remove();
		}
		uplodes.vars.items = [];
		$('#item_container').html('');
	},

	/* actions */
	open_folder : function(id) {
		uplodes.loading();
		$.ajax_request({data : {app:'uplodes',mod:'file',act:'open_folder',id:id}});
	},
	delete_items : function(ids) {
		if(typeof ids == 'undefined')
		{
			ids = uplodes.vars.selected_folders.concat(uplodes.vars.selected_files);
		}

		moxyfy.prompt_show({
			data : {
				app : 'uplodes',
				mod : 'file',
				act : 'delete_items',
				ids : ids.join(',')
			}
		});
	},
	download_files : function(ids) {
		if(typeof ids == 'undefined')
		{
			ids = uplodes.vars.selected_files;
		}

		if(uplodes.vars.selected_folders.length > 0)
		{
			moxyfy.prompt_show({
				content : 'Folders cannot be downloaded.<br /><br />Any folders you have selected will be ignored.'
			});
		}

		var ids_length = ids.length;
		for(var i=0;i<ids_length;i++)
		{
			$(document.body).append('<iframe src="'+moxyfy.Display.url({app:'uplodes',mod:'file',act:'download',id:ids[i]})+'" style="display: none;"></iframe>');
		}
	},
	move_items : function(ids, folder_id) {
		var data = {
			app : 'uplodes',
			mod : 'file',
			act : 'move_items',
			ids : ids.join(',')
		};
		
		// if the folder is given, we are moving without prompting
		if(typeof folder_id != 'undefined')
		{
			data['is_form_submit'] = 1;
			data['folder_id']      = folder_id;
			$.ajax_request({
				data : data
			});
		}
		else
		{
			moxyfy.prompt_show({
				data : data
			});
		}
	},
	rename_item : function(id) {
		moxyfy.prompt_show({
			data : {
				app  : 'uplodes',
				mod  : 'file',
				act  : 'rename_item',
				id   : id
			}
		});
	},
	recolor_folder : function(id) {
		moxyfy.prompt_show({
			data : {
				app  : 'uplodes',
				mod  : 'file',
				act  : 'recolor_folder',
				id   : id
			}
		});
	},
	link_image : function(id) {
		moxyfy.prompt_show({
			data : {
				app  : 'uplodes',
				mod  : 'file',
				act  : 'link_image',
				id   : id
			}
		});
	},
	tag_image : function(id) {
		moxyfy.prompt_show({
			data : {
				app  : 'uplodes',
				mod  : 'file',
				act  : 'tag_image',
				id   : id
			}
		});
	},
	move_item : function(id) {
		moxyfy.prompt_show({
			data : {
				app  : 'uplodes',
				mod  : 'file',
				act  : 'move_item',
				id   : id
			}
		});
	},
	email_file : function(id) {
		if(!confirm('Are you sure you want to email this file to yourself?'))
		{
			return;
		}

		$.ajax_request({
			data : {
				app : 'uplodes',
				mod : 'file',
				act : 'email_item',
				id  : id
			},
			success : function(response) {
				if(typeof response.error != 'undefined' && response.error == 1)
				{
					moxyfy.prompt_show({
						title   : response.title,
						content : response.content
					});
				}
			}
		});
	}
});

