Statistics
| Branch: | Tag: | Revision:

root / astakos / im / static / im / js / jquery.infieldlabel.js @ 1e685275

History | View | Annotate | Download (3.8 kB)

1 13858d75 Kostas Papadimitriou
/*
2 13858d75 Kostas Papadimitriou
 * In-Field Label jQuery Plugin
3 13858d75 Kostas Papadimitriou
 * http://fuelyourcoding.com/scripts/infield.html
4 13858d75 Kostas Papadimitriou
 *
5 13858d75 Kostas Papadimitriou
 * Copyright (c) 2009 Doug Neiner
6 13858d75 Kostas Papadimitriou
 * Dual licensed under the MIT and GPL licenses.
7 13858d75 Kostas Papadimitriou
 * Uses the same license as jQuery, see:
8 13858d75 Kostas Papadimitriou
 * http://docs.jquery.com/License
9 13858d75 Kostas Papadimitriou
 *
10 13858d75 Kostas Papadimitriou
 * @version 0.1
11 13858d75 Kostas Papadimitriou
 */
12 13858d75 Kostas Papadimitriou
(function($){
13 13858d75 Kostas Papadimitriou
        
14 13858d75 Kostas Papadimitriou
    $.InFieldLabels = function(label,field, options){
15 13858d75 Kostas Papadimitriou
        // To avoid scope issues, use 'base' instead of 'this'
16 13858d75 Kostas Papadimitriou
        // to reference this class from internal events and functions.
17 13858d75 Kostas Papadimitriou
        var base = this;
18 13858d75 Kostas Papadimitriou
        
19 13858d75 Kostas Papadimitriou
        // Access to jQuery and DOM versions of each element
20 13858d75 Kostas Papadimitriou
        base.$label = $(label);
21 13858d75 Kostas Papadimitriou
        base.label = label;
22 13858d75 Kostas Papadimitriou
23 13858d75 Kostas Papadimitriou
                 base.$field = $(field);
24 13858d75 Kostas Papadimitriou
                base.field = field;
25 13858d75 Kostas Papadimitriou
        
26 13858d75 Kostas Papadimitriou
                base.$label.data("InFieldLabels", base);
27 13858d75 Kostas Papadimitriou
                base.showing = true;
28 13858d75 Kostas Papadimitriou
        
29 13858d75 Kostas Papadimitriou
        base.init = function(){
30 13858d75 Kostas Papadimitriou
                        // Merge supplied options with default options
31 13858d75 Kostas Papadimitriou
            base.options = $.extend({},$.InFieldLabels.defaultOptions, options);
32 13858d75 Kostas Papadimitriou
33 13858d75 Kostas Papadimitriou
                        // Check if the field is already filled in
34 13858d75 Kostas Papadimitriou
                        if(base.$field.val() != ""){
35 13858d75 Kostas Papadimitriou
                                base.$label.hide();
36 13858d75 Kostas Papadimitriou
                                base.showing = false;
37 13858d75 Kostas Papadimitriou
                        };
38 13858d75 Kostas Papadimitriou
                        base.$field.focus(function(){
39 13858d75 Kostas Papadimitriou
                                base.fadeOnFocus();
40 13858d75 Kostas Papadimitriou
                        }).blur(function(){
41 13858d75 Kostas Papadimitriou
                                base.checkForEmpty(true);
42 13858d75 Kostas Papadimitriou
                        }).bind('keydown.infieldlabel',function(e){
43 13858d75 Kostas Papadimitriou
                                // Use of a namespace (.infieldlabel) allows us to
44 13858d75 Kostas Papadimitriou
                                // unbind just this method later
45 13858d75 Kostas Papadimitriou
                                base.hideOnChange(e);
46 13858d75 Kostas Papadimitriou
                        }).change(function(e){
47 13858d75 Kostas Papadimitriou
                                base.checkForEmpty();
48 13858d75 Kostas Papadimitriou
                        }).bind('onPropertyChange', function(){
49 13858d75 Kostas Papadimitriou
                                base.checkForEmpty();
50 13858d75 Kostas Papadimitriou
                        });
51 13858d75 Kostas Papadimitriou
        };
52 13858d75 Kostas Papadimitriou
53 13858d75 Kostas Papadimitriou
                // If the label is currently showing
54 13858d75 Kostas Papadimitriou
                // then fade it down to the amount
55 13858d75 Kostas Papadimitriou
                // specified in the settings
56 13858d75 Kostas Papadimitriou
                base.fadeOnFocus = function(){
57 13858d75 Kostas Papadimitriou
                        if(base.showing){
58 13858d75 Kostas Papadimitriou
                                base.setOpacity(base.options.fadeOpacity);
59 13858d75 Kostas Papadimitriou
                        };
60 13858d75 Kostas Papadimitriou
                };
61 13858d75 Kostas Papadimitriou
                
62 13858d75 Kostas Papadimitriou
                base.setOpacity = function(opacity){
63 13858d75 Kostas Papadimitriou
                        base.$label.stop().animate({ opacity: opacity }, base.options.fadeDuration);
64 13858d75 Kostas Papadimitriou
                        base.showing = (opacity > 0.0);
65 13858d75 Kostas Papadimitriou
                };
66 13858d75 Kostas Papadimitriou
                
67 13858d75 Kostas Papadimitriou
                // Checks for empty as a fail safe
68 13858d75 Kostas Papadimitriou
                // set blur to true when passing from
69 13858d75 Kostas Papadimitriou
                // the blur event
70 13858d75 Kostas Papadimitriou
                base.checkForEmpty = function(blur){
71 13858d75 Kostas Papadimitriou
                        if(base.$field.val() == ""){
72 13858d75 Kostas Papadimitriou
                                base.prepForShow();
73 13858d75 Kostas Papadimitriou
                                base.setOpacity( blur ? 1.0 : base.options.fadeOpacity );
74 13858d75 Kostas Papadimitriou
                        } else {
75 13858d75 Kostas Papadimitriou
                                base.setOpacity(0.0);
76 13858d75 Kostas Papadimitriou
                        };
77 13858d75 Kostas Papadimitriou
                };
78 13858d75 Kostas Papadimitriou
                
79 13858d75 Kostas Papadimitriou
                base.prepForShow = function(e){
80 13858d75 Kostas Papadimitriou
                        if(!base.showing) {
81 13858d75 Kostas Papadimitriou
                                // Prepare for a animate in...
82 13858d75 Kostas Papadimitriou
                                base.$label.css({opacity: 0.0}).show();
83 13858d75 Kostas Papadimitriou
                                
84 13858d75 Kostas Papadimitriou
                                // Reattach the keydown event
85 13858d75 Kostas Papadimitriou
                                base.$field.bind('keydown.infieldlabel',function(e){
86 13858d75 Kostas Papadimitriou
                                        base.hideOnChange(e);
87 13858d75 Kostas Papadimitriou
                                });
88 13858d75 Kostas Papadimitriou
                        };
89 13858d75 Kostas Papadimitriou
                };
90 13858d75 Kostas Papadimitriou
91 13858d75 Kostas Papadimitriou
                base.hideOnChange = function(e){
92 13858d75 Kostas Papadimitriou
                        if(
93 13858d75 Kostas Papadimitriou
                                (e.keyCode == 16) || // Skip Shift
94 13858d75 Kostas Papadimitriou
                                (e.keyCode == 9) // Skip Tab
95 13858d75 Kostas Papadimitriou
                          ) return; 
96 13858d75 Kostas Papadimitriou
                        
97 13858d75 Kostas Papadimitriou
                        if(base.showing){
98 13858d75 Kostas Papadimitriou
                                base.$label.hide();
99 13858d75 Kostas Papadimitriou
                                base.showing = false;
100 13858d75 Kostas Papadimitriou
                        };
101 13858d75 Kostas Papadimitriou
                        
102 13858d75 Kostas Papadimitriou
                        // Remove keydown event to save on CPU processing
103 13858d75 Kostas Papadimitriou
                        base.$field.unbind('keydown.infieldlabel');
104 13858d75 Kostas Papadimitriou
                };
105 13858d75 Kostas Papadimitriou
      
106 13858d75 Kostas Papadimitriou
                // Run the initialization method
107 13858d75 Kostas Papadimitriou
        base.init();
108 13858d75 Kostas Papadimitriou
    };
109 13858d75 Kostas Papadimitriou
        
110 13858d75 Kostas Papadimitriou
    $.InFieldLabels.defaultOptions = {
111 13858d75 Kostas Papadimitriou
        fadeOpacity: 0.5, // Once a field has focus, how transparent should the label be
112 13858d75 Kostas Papadimitriou
                fadeDuration: 300 // How long should it take to animate from 1.0 opacity to the fadeOpacity
113 13858d75 Kostas Papadimitriou
    };
114 13858d75 Kostas Papadimitriou
        
115 13858d75 Kostas Papadimitriou
116 13858d75 Kostas Papadimitriou
    $.fn.inFieldLabels = function(options){
117 13858d75 Kostas Papadimitriou
        return this.each(function(){
118 13858d75 Kostas Papadimitriou
                        // Find input or textarea based on for= attribute
119 13858d75 Kostas Papadimitriou
                        // The for attribute on the label must contain the ID
120 13858d75 Kostas Papadimitriou
                        // of the input or textarea element
121 13858d75 Kostas Papadimitriou
                        var for_attr = $(this).attr('for');
122 13858d75 Kostas Papadimitriou
                        if( !for_attr ) return; // Nothing to attach, since the for field wasn't used
123 13858d75 Kostas Papadimitriou
                        
124 13858d75 Kostas Papadimitriou
                        
125 13858d75 Kostas Papadimitriou
                        // Find the referenced input or textarea element
126 13858d75 Kostas Papadimitriou
                        var $field = $(
127 13858d75 Kostas Papadimitriou
                                "input#" + for_attr + "[type='text']," + 
128 13858d75 Kostas Papadimitriou
                                "input#" + for_attr + "[type='password']," + 
129 13858d75 Kostas Papadimitriou
                                "textarea#" + for_attr
130 13858d75 Kostas Papadimitriou
                                );
131 13858d75 Kostas Papadimitriou
                        
132 13858d75 Kostas Papadimitriou
                        if( $field.length == 0) return; // Again, nothing to attach
133 13858d75 Kostas Papadimitriou
134 13858d75 Kostas Papadimitriou
                        // Only create object for input[text], input[password], or textarea
135 13858d75 Kostas Papadimitriou
            (new $.InFieldLabels(this, $field[0], options));
136 13858d75 Kostas Papadimitriou
        });
137 13858d75 Kostas Papadimitriou
    };
138 13858d75 Kostas Papadimitriou
        
139 13858d75 Kostas Papadimitriou
})(jQuery);