(function($){
	
	var baseClass = "sg-admin-tree",
	
		dropPlaceholderClass = "sg-drop-placeholder",
		dropHoverClass = "sg-drop-hover",
		dragClass  = "sg-drag";
		
	$.widget( "sg.sg_admin_tree", $.sg.sg_admin_list, {
		options: { 
			button_sortable: '.sg-button-drag',
			
			buttons: {},
			buttons_setup: {},
			itemSelector: '.sg-item',
			iconSelector: '.sg-icons',
			defaultItemClass: 'ui-state-default',
			hoverItemClass: 'ui-state-hover ui-corner-all',
			selectedItemClass: 'ui-state-active ui-corner-all',
			hide_icons: false
		},
		
		customSetup: function(){
			var $widget = this;
			var $wrapper = this.element;
			var $options = this.options;
			
			$wrapper.addClass(baseClass);
		},
		
		setupIcons: function(){
			var $widget = this;
			var $wrapper = this.element;
			var $options = this.options;
			
			var $btn_sortable = $options.button_sortable;
			var $func_sortable = $options.buttons[$options.button_sortable];
			
			$options.buttons[$options.button_sortable] = function(e){};
			
			$tag_iconwrapper = $wrapper.find( $options.iconSelector );
			if($tag_iconwrapper.length){
				$tag_iconwrapper.sg_admin_icons({
					buttons: $options.buttons,
					buttons_setup: $options.buttons_setup
				});
			}
			// hide icons
			if($options.hide_icons){
				if($tag_iconwrapper.length){
					$tag_iconwrapper.hide();
				}
			}
			
			if($options.button_sortable){
				$widget.setupSortable( $btn_sortable, $func_sortable);
			}
		},
		
		//########################################################################################
		//INHERIT BASE FROM sg_admin_list
		
		//##################################
		//ONLY SORTABLE IS ADDED TO sg_admin_list
		//########################################################################################
		// setup sortable
		
		setupSortable: function( $btn, func_sortupdate ) {
			var $widget = this;
			var $wrapper = this.element;
			var $options = this.options;
			
			$wrapper.css('position', 'relative');
			//$wrapper.width( $wrapper.width() );
			$wrapper.height( $wrapper.height() );
			
			$tag_btn = $wrapper.find($btn);
			
			$tag_btn.mousedown(function(){
				var $tag_li = $(this).parents('li:first');
				var $tag_ul = $tag_li.find('ul:first');
				$tag_ul.hide();
				
				$width_orig = $tag_li.width();
				$height_orig = $tag_li.height();
				$tag_li.css('position', 'absolute');
				$tag_li.width( 100 );
				
				var $tag_drag_placeholder = '<div class="'+dropPlaceholderClass+'"></div>';
				
				var $tag_ul_all = $wrapper.find('ul').not($tag_ul);
				$tag_ul_all.each(function(){
					var $tag_li_all = $(this).children('li').not($tag_li);
					var $tag_li_first = $(this).children('li:first');
					$tag_li_all.after( $tag_drag_placeholder );
					$tag_li_first.before( $tag_drag_placeholder );
				});
				
				var $tag_li_all = $wrapper.find('li');
				$tag_li_all.addClass( dragClass );
			});
			
			//##################################
			//setup drag on sort
			var $tag_li = $wrapper.find('li');
			$tag_li.draggable({
				//refreshPositions: true,
				handle: $btn,
				//stack: $wrapper, //controlls z index
				zIndex: 2700,
				//containment: $wrapper, //dragging constrains
				appendTo: 'body',
				revert: true,
				revertDuration: 0,
				scroll: false,
				cursor: 'move',
				cursorAt: {top:15, right:15},
				helper: 'original',
				distance: 5,
				scope: 'sg_admin_tree'
			});
			
			//#################################
			//drag start
			$tag_li.bind('dragstart', function(event, ui) {
				if( $(this).attr('id') == ui.helper.attr('id') ){
					var $tag_li = ui.helper;
					var $tag_ul = $tag_li.find('ul:first');
					
					$wrapper.find( '.'+dropPlaceholderClass ).droppable({
						scope: 'sg_admin_tree',
						hoverClass: dropHoverClass,
						drop: function(event, ui){
							$(this).after( ui.draggable );
						}
					});
					
					$wrapper.find( $options.itemSelector ).droppable({
						scope: 'sg_admin_tree',
						hoverClass: dropHoverClass,
						drop: function(event, ui){
							//alert($(this).siblings('ul').html());
							$(this).siblings('ul').append( ui.draggable );
						}
					});
				}
			});
			
			//####################################
			//drag stop
			$tag_li.bind('dragstop', function(event, ui) {
				if( $(this).attr('id') == ui.helper.attr('id') ){
					var $tag_ul = ui.helper.find('ul:first');
					//$tag_ul.effect('blind', {mode: "show"});
					$tag_ul.show();
					
					$wrapper.find('.'+dropPlaceholderClass).remove();
					//ui.helper.css('position', 'static');
					$wrapper.find('li').css('position', 'static');
					ui.helper.width('auto');
					ui.helper.height('auto');
					
					var $tag_li_all = $wrapper.find('li');
					$tag_li_all.removeClass( dragClass );
					
					func_sortupdate();
				}
			});
		}
	});
}(jQuery));
