// JavaScript Document
//console.log("%s: %o", "hello world", this);

if (!window.jQuery) {
	throw("jQuery must be referenced before using formValidation");
} else {
	(function($){
		/**
		 * jQuery delayed event execution.
		 */
		$.fn.delay = function(options) {
			var timer;
			var delayImpl = function(eventObj) {				
				timer = 0;
				if (timer != null) {
					clearTimeout(timer);
				}
				var newFn = function() {
					options.fn(eventObj);
				};
				timer = setTimeout(newFn, options.delay);
			}
			/* THIS IS MY EDIT */
			var undelayImpl = function(){
				clearTimeout(timer);
			}
		   /* END OF MY EDIT */
		   
			return this.each(function() {
				var obj = $(this);
				/* THIS IS MY EDIT */
				obj.bind("mouseout",function(eventObj){
					//console.log("%s: %o",timer + " cancelled", this);
					undelayImpl();							 
				});
				/* END OF MY EDIT */
				obj.bind(options.event, function(eventObj) {
					 delayImpl(eventObj);  
				});
				
			});
		};
	})(jQuery);
}

/* http://ihatecode.blogspot.com/2008/04/jquery-time-delay-event-binding-plugin.html */
/* USAGE FOR DELAY FUNCTION */
/*
 $(document).ready(function() {
  $('#typeinme').delay({
   delay: 500,
   event: 'keyup',
   fn: function(){
    alert(this.value);
   })
  });
 }
*/

if (!window.jQuery) {
	throw("jQuery must be referenced before using formValidation");
} else {
	
	(function() { 
		jQuery.fn.expmenu = function(options) {	
			var menuContainer = this;
			
						
			var settings = {
				start_expanded			: false,
				sublist_class			: "",
				current_element			: "",
				enable_console			: false,
				selected_item_class		: "",
				submenu_rel_value		: "submenu",
				open_delay_time			: 1000,
				expand_mouseover		: false,
				leave_current_page_exp	: false,
				follow_link				: false,
				link_to_follow			: 0,
				auto_minimize			: false,
				auto_minimize_delay		: 3000
			};
			
			var current_page = settings['current_element'];
			
			if(options) {
				jQuery.extend(settings, options);
			}
			
			//find all the li elements whit the appropriate rel
			$(this).find("*").filter("li[rel='"+settings["submenu_rel_value"]+"']").each(function(){	
				var element_name = $(this).attr("id");
				
				if(settings["sublist_class"] !=  ""){
					$(this).find("*").filter("ul").each(function(){
						$(this).addClass(settings["sublist_class"]);	
						if(settings["enable_console"]){
							console.log("%s: %o","added subclass "+settings['sublist_class'], this);
						}
					});					
				}//end if
				
				if(!is_current($(this))){					
					$(this).find("*").filter("ul").each(function(){							
						$(this).hide();											 						
					});		
				} else {
					if(settings["selected_item_class"] != ""){
						$(this).find("*").filter("a[href='#']").each(function(){							
						//	$(this).addClass(settings["selected_item_class"]);
						});
					}	
				}
				$(this).find("*").filter("a[href='#']").each(function(){
					if(settings["expand_mouseover"] == false){
						$(this).click(function(){							
							show_selected(element_name);
							return false;
						});
					} else {
						/*$(this).mouseover(function(){	
							show_selected(element_name);							
						});*/
						if(settings['follow_link'] == true){
							$(this).click(function(){
								var parent = $(this).parents('li').attr('id');
								var newlink = $("#"+parent + " > ul li a").eq(settings['link_to_follow']).attr('href');
								window.location.href = newlink;
							});
						}//end if
						$(this).delay({
							delay: settings['open_delay_time'],
							event: 'mouseover',
							fn: function(){
								show_selected(element_name);
						  	}
						});	
						//check if close the menu after a while
						if(settings['auto_minimize'] == true){
							if(settings['current_element'] != element_name){
								$(this).delay({
									delay: settings['auto_minimize_delay'],
									event: 'mouseout',
									fn: function(){								
										hide_menu(element_name);
									}
								});	
							}
						}//end if
					}
				});				
			});
			
			function show_selected(idName){
				if(settings["enable_console"]){
					console.log("%s: %o",idName, this);
				}
				$(menuContainer).find("*").filter("li[rel='"+settings["submenu_rel_value"]+"']").each(function(){						
					if(idName == $(this).attr("id")){
						if(settings["enable_console"]){
							console.log("%s: %o","found "+$(this).attr("id"), this);
						}
						
						//Add the selection css class
						if(settings["selected_item_class"] != "" && settings['leave_current_page_exp'] == false){
							$(this).find("*").filter("a[href='#']").each(function(){
								$(this).addClass(settings["selected_item_class"]);
							});
						}	
						//open the submenu
						$(this).find("*").filter("ul").each(function(){							
							$(this).slideDown("slow");											 						
						});							
					} else {
						if((settings['leave_current_page_exp'] == true && $(this).attr("id") != settings['current_element']) || settings['leave_current_page_exp'] == false){
							//remove the selection class
							if(settings["selected_item_class"] != ""){
								$(this).find("*").filter("a[href='#']").each(function(){							
									$(this).removeClass(settings["selected_item_class"]);
								});
							}		
							//close the others menu																
							$(this).find("*").filter("ul").each(function(){								
								$(this).slideUp("slow");							
							});	
						}//end if
					}//end if							 
				});
			}
			
			function hide_menu(idName){		
				$(menuContainer).find("*").filter("li[id='"+idName+"']").find("*").filter("ul").each(function(){	
					$(this).slideUp("slow");							
				});	
			};		
		
			function is_current(obj){				
				if(obj.attr("id") == settings["current_element"]){
					return true;
				} else {
					return false;	
				}
			};
	
		}
	})(jQuery); 
}
