(function($) {	

	$.fn.interactiveMap = function(options) {	

		var	el = this,
			$map = $('#interactive-map-tray'),
			current_level = 0,
			total_levels = 0,
			$levels,
			$map_items,
			$zoom_controls,
			$zoom_in,
			$zoom_out,
			$close,
			first_time = true;

		var defaults = {
			level_class:'level',
			item_class:'map-item',
			icon_class:'map-item-icon',
			zoom_controls_id:'zoom-controls',
			button_zoom_in_id:'button-zoom-in',
			button_zoom_out_id:'button-zoom-out',
			button_close_class:'button-close'			
		};
		
		var settings = $.extend(defaults, options);
		
		log = function (s) {
			if (typeof console != "undefined" && typeof console.debug != "undefined") {
				console.log(s);
			} else {
				//alert(s);
			}
		};
		
		init = function(el){
			
			var icon, pointer;
					
			$levels = $('div.'+settings.level_class);
			$map_items =  $('.'+settings.item_class);
			
			total_levels = $levels.size() - 1;
			current_level = 0;
			
//log('interactiveMap  '+current_level+'/'+total_levels);
			
			createControls();

			//add icons
			$map_items.each( function(){
				
				if ( $(this).hasClass('middle') ){
					icon = $('<div />',{ 'class':settings.icon_class, 'text':'*' });				
					$(this).prepend( icon );
				}
			});
			
			pointer = $('<span />',{ 'class':'pointer' });
			$('.area-label').append( pointer );
			
			attachEvents();
			
			//show active level
			zoom(current_level);
		};

		createControls = function(){
			
			$zoom_controls = $('<div/>',{ 
						id:settings.zoom_controls_id
					})
				.appendTo( $map.parent() );
				//$zoom_controls = $('#'+settings.zoom_controls_id);
			
			$zoom_in = $('<div/>',{ 
					id:settings.button_zoom_in_id, 
					click:function(){ zoom('in'); return false; }
					})
				.appendTo( $zoom_controls );
				
			$zoom_out = $('<div/>',{ 
					id:settings.button_zoom_out_id,
					click:function(){ zoom('out'); return false; }
					})
				 .appendTo( $zoom_controls );

			//$zoom_in = $('#'+ settings.button_zoom_in );
			//$zoom_out = $('#'+ settings.button_zoom_out );
			
			//close buttons
			
			$close = $('div.'+settings.button_close_class);
			$close.bind('click',function(){ closeArea(); return false; });

		};
		
		attachEvents = function(){
						
			$('.middle').bind('click', function(){ zoom(0); return false; });
			
			//$zoom_in.bind('click', function(e){ zoom('in'); return false; });
			//$zoom_out.bind('click', function(e){ zoom('out'); return false; });
		
			$close.bind({
				//'mouseenter': function(){ $close.animate({ opacity:.5 }); },
				//'mouseleave': function(){ $close.animate({ opacity:1 }); },
				'click': function(e){ closeArea(); e.preventDefault(); }
			});
			
			$('.area-label').bind('click', function(e){						
				openArea( e.target );//
				
				return false;
			});
			
			
			$('.item-detail').bind('click',function(e){
				
				closeArea();
				return false;
			});
			
			$('.level:first-child').hover(
			
				function(){
					$('.area-label, .button-close').fadeIn();
				},
				function(){
					$('.area-label, .button-close').fadeOut();
				});
			
			//event for expanding and collapsing individual nav items
			//el.find("li.collapsed > a.node-toggle").live("click",expandItem);
			//el.find("li.expanded > a.node-toggle").live("click",collapseItem);
			
			//event for expanding and collapsing all menu items
			//el.find("li.expand-all a").live("click",expandAll);
			//el.find("li.collapse-all a").live("click",collapseAll);
			
		};
		
		abs = function(n) {

			return ((n<0) ? n*-1 : n*-1);
		};
		
		openArea = function(el){

			var new_left = parseInt( $(el).parent().find('.item-detail').css('left') );
			var new_top = parseInt( $(el).parent().find('.item-detail').css('top') );
//log(new_left+' '+new_top);

			new_left = abs(new_left);
			new_top = abs(new_top);

			$map.animate({
					left:new_left,//left:'-900',
					top:new_top
				},{
					duration:750,
					easing:'easeOutQuart'
				},function(){
					
					//show close
					//$close.fadeIn(500);//.animate({ 'opacity':.5 },500);
					//hide zoom
					//$zoom_controls.fadeOut(500);
				});
				
			$zoom_controls.fadeOut(750);//.hide();
			$close.delay(500).fadeIn(500);//$close.show();
		};
		
		closeArea = function(){
			
			$map.animate({
					left:0,//left:'0'
					top:0
				},{
					duration:1500,
					easing:'easeOutExpo'
				},function(){
					
					//hide close
					//$close.fadeOut(500);//.animate({ 'opacity':.5 },500);
					//show zoom
					//$zoom_controls.fadeIn(500);
				});
			$zoom_controls.show();
			$close.fadeOut(500);//.hide();
			
			//$close.fadeOut(500);//.animate({ 'opacity':0 },500);
			
			//$zoom_controls.fadeIn(500);
		};
		
		zoom = function(level){
						
//log('zoom '+level+' '+current_level);
			
			//in
			if (level == 'in'){
		
				current_level--;
				
				if (current_level < 0){
					//at the end again, don't zoom
					current_level = 0;
					return;	
				}
				level = current_level;
			}
			//out
			if (level == 'out'){
				
				current_level++;
				
				if (current_level > total_levels){
					//at the end again, don't zoom
					current_level = total_levels;
					return;	
				}
				level = current_level;
			}

			//$levels.eq(current_level).css({'z-index':1});
			
			
			//move inactive levels down
			
			$('.'+settings.level_class+':not(:eq('+level+'))').css({'z-index':1});
			
			$levels.css({'z-index':1}).hide();
			
			//move active level up, fade in
			$levels.eq(level)
				.hide()
				.css({'z-index':10})
				.fadeIn(500, function(){
				/*if (first_time){
log('!!!!! ');

					//hide last one
					$levels.eq(current_level).hide();
				}*/
				});
			
			
//log('! '+level+' '+current_level+' '+first_time);
			
			first_time = false;
			
			current_level = level;
			
			adjustZoomControls();
		};
		
		adjustZoomControls = function(){
//log('adjustZoomControls '+current_level+'/'+total_levels);
//log($zoom_in);
			//adjust zoom controls
			if (current_level >= total_levels){
				$zoom_out.css({'opacity':.5,'cursor':'default'});
				
			} else {
				$zoom_out.css({'opacity':1,'cursor':'pointer'});
				
			}
			if (current_level == 0){
				$zoom_in.css({'opacity':.5,'cursor':'default'});
				
			} else {
				$zoom_in.css({'opacity':1,'cursor':'pointer'});
				
			}
		};
		
		init();
	};
})(jQuery);
