﻿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);
								}
								);
				        }

				    }
				}
				);

}