$.fn.replaceAttr = function(tag_attribute_name, search_string, replace_string) {
  return this.attr(tag_attribute_name, function() {
    return $(this).attr(tag_attribute_name).replace(search_string, replace_string);
  });
};

$.fn.exists = function(){
  return $(this).length>0;
}

//Returns true if it is a DOM node
function isNode(o){
  return (
    typeof Node === "object" ? o instanceof Node : //DOM1
    typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
  );
}

//Returns true if it is a DOM element
function isElement(o){
  return (
    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
    typeof o === "object" && o.nodeType === 1 && typeof o.nodeName==="string"
  );
}
// references:
//   * http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object
//   * http://www.javascriptkit.com/domref/nodetype.shtml

$(document).ready(initialize_hover_containers);

function initialize_hover_containers(parent_container) {
	if      (isElement(parent_container))														{}
	else if (typeof parent_container === 'object' && parent_container instanceof jQuery)		{parent_container = (typeof parent_container.context === 'undefined')? parent_container : parent_container.context;}
	else if (typeof parent_container === 'string')												{parent_container = $('#' + parent_container);}
	else																						{parent_container = document;}
	$('.displayDescription_container', parent_container).each(function(){
		var default_class	= 'off';
		var container		= $(this);
		var teaser			= $('.hover_teaser_'  + default_class, container);
//		var hover_block		= $('.hover_content_' + default_class, container);

		teaser.html('<span class="hover_teaser_message">&hellip; more &gt;</span>');
		teaser.mouseenter(enter_teaser);
//		hover_block.mouseleave(leave_hover);
		container.mouseleave(leave_container);
	});
}

function enter_teaser(event) {
	var container			= $(this).closest('.displayDescription_container');
	toggle_hover(container, true);
}
/*
function leave_hover(event) {
	var container			= $(this).closest('.displayDescription_container');
	toggle_hover(container, false);
}
*/
function leave_container(event) {
	var onHover_class		= 'on';
	var container			= $(this);
	var hover_block			= $('.hover_content_' + onHover_class, container);
	if (hover_block.exists()) {
		toggle_hover(container, false);
	}
}

function toggle_hover(container, toggle_on) {
	var old_class			= (toggle_on == true)? 'off' : 'on';
	var new_class			= (toggle_on == true)? 'on'  : 'off';

	var summary_block		= $('.summary_content_'	+ old_class, container);
	var teaser				= $('.hover_teaser_'	+ old_class, container);
	var hover_block			= $('.hover_content_'	+ old_class, container);

	var search_string		= new RegExp('_' + old_class + '$');
	var replace_string		= '_' + new_class;

	summary_block.replaceAttr(	'class', search_string, replace_string);
	teaser.replaceAttr(			'class', search_string, replace_string);
	hover_block.replaceAttr(	'class', search_string, replace_string);
}
