/* 
	Dropdown
	Mike Harding, Cactuslab
	
	Plugin to create dropdown menu based on an unordered list
	
	after : Callback function to run after list is set up. The .cldropdown_wrapper object is passed in.
	
	Usage: $('ul').cldropdown({
				after: function(){
					$(this).append('<li class="cldropdown-footer"></li>');
				}
			});
*/

(function($) {
	
	$.fn.cldropdown = function(options) {
		
		var defaults = {
			after: null,
			onselect: null
		};
		
		var s = $.extend({}, defaults, options);
		
		return this.each(function() {
			
			var $parent = $(this),
				$items = $parent.children('li'),
				$wrapper,
				$selected,
				$label = $( '<div class="cldropdown-label"></div>' ),
				$dummy;
			
			var dropdown = {
				init: function(){
					dropdown.wrap();
					dropdown.setup();
					dropdown.setlabel();
					dropdown.triggers();
					dropdown.after();
				},
				wrap: function(){
					$parent.wrap( '<div class="cldropdown-wrapper"></div>' );
					$wrapper = $parent.parent();
					$wrapper.prepend( $label );
				},
				setup: function(){
					$selected = $wrapper.find( 'li.selected' );
					if ( $selected.length == 0 ) { 
						$selected = $parent.find( 'li:first' );
					}
					$selected.addClass( 'cldropdown-selected' );
					$parent.find('li:last').addClass('last');
				},
				setlabel: function(){
					$label.html( $selected.text() );
					$parent.prepend( '<li class="cldropdown-active">' + $selected.text() + '</li>' );
					$dummy = $parent.find('li.cldropdown-active');
				},
				triggers: function(){
					$label.click(function() {
						var speed = 200;
						if ( $.browser.msie ) {
							speed = 0; // IE still doesn't support fade of transparent PNGs
						}
						$parent.fadeIn( speed ).bind( 'click', function(e) {
							var el = e.target,
								$el = $(el);
							if ( el.nodeName === 'A' ) {
								var $li = $el.parent('li');
								if ( $li.hasClass('cldropdown-active') ) {
									$parent.fadeOut( speed );
								} else {
									$label.text( $li.text() );
									$dummy.text( $li.text() );
									$parent.fadeOut( speed, function() {
										$parent.find( 'li.cldropdown-selected' ).removeClass( 'cldropdown-selected' );
										$li.addClass( 'cldropdown-selected' );
									});
									if ( typeof s.onselect == 'function' ) {
										s.onselect();
										return false;
									}
								}
							}
						});				
						$parent.mouseleave(function() {
							$parent.fadeOut( speed );
						});
					});
				},
				after: function(){
					if ( typeof s.after == 'function' ) {
						s.after.call( $parent );
					}
				}
			};
			dropdown.init();
		});
	};

})(jQuery);

