jQuery.fn.highlight = function(selector, className, eventStart, eventEnd){

// variables
	var className		= className || 'highlight';
	if(eventStart == undefined && eventEnd == undefined){
		var eventStart = 'mouseover';
		var eventEnd = 'mouseout';
		}
	else if(eventStart == eventEnd || eventStart != undefined && eventEnd == undefined){
		var toggle = true;
		}

// code
	this.each
		(
		function(){
		
			var tagName	= this.tagName.toLowerCase();
			
			if(tagName == 'form'){
			
				selector		= selector || 'li';
				var elements 	= jQuery("textarea, select, multi-select, :text, :image, :password, :radio, :checkbox, :file", this);

				elements.bind
					(
					'focus', 
					function(){
						var parents	= jQuery(this).parents(selector)
						var parent	= jQuery(parents.get(0))
						parent.addClass(className);
						}
					);
					
				elements.bind
					(
					'blur', 
					function(){
						var parents	= jQuery(this).parents(selector)
						var parent	= jQuery(parents.get(0))
						parent.removeClass(className);
						}
					);

				}
				
			else{


				if(tagName.match(/^(table|tbody)$/) != null){
					selector = selector || 'tr';
					}
				else if(tagName.match(/^(ul|ol)$/) != null){
					selector = selector || 'li';
					}
				else{
					selector = '*';
					}
					
				var elements	= jQuery(selector, this);

				if(toggle){
					elements.bind
						(
						eventStart, 
						function(){
							if(jQuery(this).hasClass(className)){
								jQuery(this).removeClass(className);
								}
							else{
								jQuery(this).addClass(className);
								}
							}
						);
					
					}
					
				else{
					elements.bind
						(
						eventStart, 
						function(){
							jQuery(this).addClass(className);
							}
						);
						
					elements.bind
						(
						eventEnd, 
						function(){
							jQuery(this).removeClass(className);
							}
						);
					}
			
				}
			}
		);

}
