/*
* Input Floating Hint Box - jQuery plugin 1.1 Beta
*
* Copyright (c) 2008 Nicolae Namolovan (nicolae.namolovan gmail.com)
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Revision: 20
*
*/
/**
* Home page http://nicolae.namolovan.googlepages.com/jquery.inputHintBox.html
* Demo http://nicolae.namolovan.googlepages.com/jquery.inputHintBox.demo.html
**/
/**
* Provide an automatic box hint in the right side of a input when user click it, it disapear when focus change (blur)
*
* Depends on dimensions plugin's offset method for correct positioning of the hint box element
*
* The source(@source) of the text/html can be an attribute (title for example), or a pure html.
* Attribute can contain escaped html, example: title="This will be <b>Bold</b>"
*
* All hints can use one div element(@div option) with your custom design, and only some subelement of
* this @div will change (according to source).
*
* You can provide only the @className, and for each input a separate
element will be created
* with @className as class.
*
* If user click on the box to select some text (for copy/paste for example), box will not disappear.
*
* If you need to make the box appear in more left, use incrementLeft, same for top - incrementTop,
* you can use - sign if you want to decrement.
**/
/**
* Example, you have a shiny div and you want to use it as a Shell for hint messages
*
*
*
*
*
*
* You have a inputs like:
*
*
*
* Here is an example of js to use:
* $('.titleHintBox').inputHintBox({div:$('#shiny_box'),div_sub:'.shiny_box_body',source:'attr',attr:'title',incrementLeft:12,incrementTop:-12});
**/
/**
* Provide a hint box near input as a absolute positioned div.
* @name InputHintBox
* @cat Plugins/Forms
* @type $
* @param Map options Optional settings
* @option jQueryDom @div box to show, if this is set then className do not apply
* @option String @div_sub css selector, use this when you need to write the Dynamic html into a element Inside the @div box,
example: .body, this will search for .body in context of @div
* @option String @className This class will be added to the dynamic created div box. Default: "input_hint_box"
* @option String @source Source of box message text html: attr | html, Default: "attr"
* @option String @attr If @source = "attr" then html will be taken from the attribute named @attr. Default: "title"
* @option String @html If @source = "html" them html will be taken from @html
* @option Integer @incrementLeft This value will be incremented to the left property of the absolute positioned hint box. Default: 10
* @option Integer @incrementTop This value will be incremented to the top property of the absolute positioned hint box. Default: 10
* @option String @attachTo Hint box will be appended to this. Default: "body"
*/
(function($) {
$.fn.inputHintBox = function(options) {
options = $.extend({}, $.inputHintBoxer.defaults, options);
this.each(function(){
new $.inputHintBoxer(this,options);
});
return this;
}
$.inputHintBoxer = function(input, options) {
var $guideObject,$input = $guideObject = $(input), box, boxMouseDown = false;
//$guideObject - in left of this object hint box will be positioned
// If @type=radio then it must be inside a label and we should put the hint box in the right side of the label
if ( ($input.attr('type') == 'radio' || $input.attr('type') == 'checkbox') && $input.parent().is('label') ) {
$guideObject = $( $input.parent() );
}
function init() {
var boxHtml = options.html != ''?options.html:
options.source == 'attr'?$input.attr(options.attr): '';
if (typeof boxHtml === "undefined") boxHtml = '';
box = options.div != '' ? options.div.clone() : $("").addClass(options.className);
box = box.css('display','none').addClass('_hintBox').appendTo(options.attachTo);
if (options.div_sub == '') box.html(boxHtml);
else $(options.div_sub,box).html(boxHtml);
$input.focus(function() {
$('body').mousedown(global_mousedown_listener);
show();
}).blur(function(){
prepare_hide();
});
}
// This is evaluated each time to prevent probs with elements with display none
function align() {
var offsets = $guideObject.position(),
left = offsets.left + $guideObject.width() + options.incrementLeft + 5 + ($.browser.safari?5:($.browser.msie?10:($.browser.mozilla?6:0))),
top = offsets.top + options.incrementTop + ($.browser.msie?14:($.browser.mozilla?8:0));
box.css({position:"absolute",top:top,left:left});
}
function show() {
align();
box.fadeIn('slow');
}
function prepare_hide() {
// We want to allow user to select and copy/paste content from the box
// So delay a bit to see where user click
$('body').click(global_click_listener);
if (boxMouseDown) return;
$.inputHintBoxer.mostRecentHideTimer = setTimeout(function(){hide()},300);
}
var global_click_listener = function(e) {
var $e = $(e.target),c='._hintBox';
clearTimeout($.inputHintBoxer.mostRecentHideTimer);
if ($e.parents(c).length == 0 && $e.is(c) == false) hide();
};
// Prevent hiding when selecting..
// When user Select a text to select, a Mousedown is fired BEFORE blur of input
// This why we need to know when a Mousedown is done to our object
var global_mousedown_listener = function(e) {
var $e = $(e.target),c='._hintBox';
boxMouseDown = ($e.parents(c).length != 0 || $e.is(c) != false);
}
function hide() {
$('body').unbind('click',global_click_listener);
$('body').unbind('mousedown',global_mousedown_listener);
align();
box.fadeOut('slow');
}
init();
return {}
};
$.inputHintBoxer.mostRecentHideTimer = 0;
$.inputHintBoxer.defaults = {
div: '',
className: 'input_hint_box',
source: 'attr', // attr or html
div_sub: '', // Where to write
attr: 'title',
html: '',
incrementLeft: 5,
incrementTop: 0,
attachTo: 'body'
}
})(jQuery);