Statistics
| Branch: | Tag: | Revision:

root / cloudcms / static / cloudcms / js / jquery.infieldlabel.js @ b6a584a8

History | View | Annotate | Download (3.9 kB)

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