Statistics
| Branch: | Tag: | Revision:

root / ui / static / invitations.js @ 5f448ec5

History | View | Annotate | Download (4 kB)

1 19e01943 Kostas Papadimitriou
/*
2 19e01943 Kostas Papadimitriou
*        jQuery dynamicField plugin
3 19e01943 Kostas Papadimitriou
*        Copyright 2009, Matt Quackenbush (http://www.quackfuzed.com/)
4 19e01943 Kostas Papadimitriou
*
5 19e01943 Kostas Papadimitriou
*        Find usage demos at http://www.quackfuzed.com/demos/jQuery/dynamicField/index.cfm)
6 19e01943 Kostas Papadimitriou
*
7 19e01943 Kostas Papadimitriou
*        Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
8 19e01943 Kostas Papadimitriou
*        and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
9 19e01943 Kostas Papadimitriou
*
10 19e01943 Kostas Papadimitriou
*        Version: 1.0
11 19e01943 Kostas Papadimitriou
*        Date:         8/13/2009
12 19e01943 Kostas Papadimitriou
*/
13 19e01943 Kostas Papadimitriou
;(function($) {
14 19e01943 Kostas Papadimitriou
        $.fn.dynamicField = function(options) {
15 19e01943 Kostas Papadimitriou
                if ( $(this).attr("id") == undefined ) {
16 19e01943 Kostas Papadimitriou
                        alert("The dynamicField plugin could not be initialized.\n\nPlease check the selector.");
17 19e01943 Kostas Papadimitriou
                        return $;
18 19e01943 Kostas Papadimitriou
                }
19 19e01943 Kostas Papadimitriou
20 19e01943 Kostas Papadimitriou
                var f = $(this);
21 19e01943 Kostas Papadimitriou
22 19e01943 Kostas Papadimitriou
                var settings = $.extend({
23 19e01943 Kostas Papadimitriou
                        maxFields: 5,
24 19e01943 Kostas Papadimitriou
                        removeImgSrc: "/static/cross.png",
25 19e01943 Kostas Papadimitriou
                        spacerImgSrc: "/static/spacer.gif",
26 19e01943 Kostas Papadimitriou
                        addTriggerClass: "add-field-trigger",
27 19e01943 Kostas Papadimitriou
                        removeImgClass: "remove-field-trigger",
28 19e01943 Kostas Papadimitriou
                        hideClass: "hide",
29 19e01943 Kostas Papadimitriou
                        cloneContainerId: f.attr("id").replace(/^(.+)([_-][0-9]+)$/,"$1"),
30 19e01943 Kostas Papadimitriou
                        rowContainerClass: f.attr("class"),
31 19e01943 Kostas Papadimitriou
                        labelText: f.children("label")
32 19e01943 Kostas Papadimitriou
                                                        .html(),
33 19e01943 Kostas Papadimitriou
                        baseName: f.children("input")
34 19e01943 Kostas Papadimitriou
                                                                .attr("name")
35 19e01943 Kostas Papadimitriou
                                                                .replace(/^(.+[_-])([0-9]+)$/,"$1"),
36 19e01943 Kostas Papadimitriou
            baseNames: baseNames(),
37 19e01943 Kostas Papadimitriou
                        addContainerId: "add-" + f.children("input")
38 19e01943 Kostas Papadimitriou
                                                                .attr("name")
39 19e01943 Kostas Papadimitriou
                                                                .replace(/^(.+)([_-][0-9]+)$/,"$1")
40 19e01943 Kostas Papadimitriou
                                                                .replace(/_/g,"-") + "-container"
41 19e01943 Kostas Papadimitriou
                },options);
42 19e01943 Kostas Papadimitriou
                
43 19e01943 Kostas Papadimitriou
                var getFields = function() {
44 19e01943 Kostas Papadimitriou
                        return $("div." + settings.rowContainerClass);
45 19e01943 Kostas Papadimitriou
                };
46 19e01943 Kostas Papadimitriou
47 19e01943 Kostas Papadimitriou
        function baseNames() {
48 19e01943 Kostas Papadimitriou
            var names = new Array();
49 19e01943 Kostas Papadimitriou
            $.each(f.children("input"), function(index, child){
50 19e01943 Kostas Papadimitriou
                var name = child.name.replace(/^(.+[_-])([0-9]+)$/,"$1")
51 19e01943 Kostas Papadimitriou
                names.push(name);
52 19e01943 Kostas Papadimitriou
            });
53 19e01943 Kostas Papadimitriou
            return names;
54 19e01943 Kostas Papadimitriou
        }
55 19e01943 Kostas Papadimitriou
                
56 19e01943 Kostas Papadimitriou
                // handle hide/show, etc
57 19e01943 Kostas Papadimitriou
                var addRemoveBtnCk = function() {
58 19e01943 Kostas Papadimitriou
                        var fields = getFields();
59 19e01943 Kostas Papadimitriou
                        var len = fields.length;
60 19e01943 Kostas Papadimitriou
                        
61 19e01943 Kostas Papadimitriou
                        fields.each(function(i,elem) {
62 19e01943 Kostas Papadimitriou
                                $(elem)
63 19e01943 Kostas Papadimitriou
                                        .children("img")
64 19e01943 Kostas Papadimitriou
                                        .attr({
65 19e01943 Kostas Papadimitriou
                                                "src":(len == 1) ? settings.spacerImgSrc : settings.removeImgSrc,
66 19e01943 Kostas Papadimitriou
                                                "class":(len == 1) ? "" : settings.removeImgClass
67 19e01943 Kostas Papadimitriou
                                        });
68 19e01943 Kostas Papadimitriou
                        });
69 19e01943 Kostas Papadimitriou
                        
70 19e01943 Kostas Papadimitriou
                        if ( len > (settings.maxFields-1) ) {
71 19e01943 Kostas Papadimitriou
                                $("div#" + settings.addContainerId).addClass(settings.hideClass);
72 19e01943 Kostas Papadimitriou
                        } else {
73 19e01943 Kostas Papadimitriou
                                $("div#" + settings.addContainerId).removeClass(settings.hideClass);
74 19e01943 Kostas Papadimitriou
                        }
75 19e01943 Kostas Papadimitriou
                };
76 19e01943 Kostas Papadimitriou
                
77 19e01943 Kostas Papadimitriou
                // handle field removal
78 19e01943 Kostas Papadimitriou
                $("img." + settings.removeImgClass).live("click",function() {
79 19e01943 Kostas Papadimitriou
                        // remove the selected row
80 19e01943 Kostas Papadimitriou
                        $(this).parent("div." + settings.rowContainerClass).remove();
81 19e01943 Kostas Papadimitriou
                        
82 19e01943 Kostas Papadimitriou
                        // rebrand the remaining fields sequentially
83 19e01943 Kostas Papadimitriou
                        getFields().each(function(i,elem) {
84 19e01943 Kostas Papadimitriou
                                var pos = new Number(i+1);
85 19e01943 Kostas Papadimitriou
                                var d = $(elem)
86 19e01943 Kostas Papadimitriou
                                                        .attr("id",settings.cloneContainerId + "-" + pos);
87 f2141829 Kostas Papadimitriou
88 19e01943 Kostas Papadimitriou
                                d.children("label")
89 19e01943 Kostas Papadimitriou
                                                        .attr("for",settings.baseName + pos)
90 19e01943 Kostas Papadimitriou
                                                        .html((pos > 1) ? "" : settings.labelText);
91 19e01943 Kostas Papadimitriou
                                
92 f2141829 Kostas Papadimitriou
                names = settings.baseNames;
93 f2141829 Kostas Papadimitriou
                                d.children("input").each(function(i){
94 f2141829 Kostas Papadimitriou
                    $(this).attr({
95 f2141829 Kostas Papadimitriou
                        "id": names[i] + pos,
96 f2141829 Kostas Papadimitriou
                        "name": names[i] + pos
97 f2141829 Kostas Papadimitriou
                    });
98 f2141829 Kostas Papadimitriou
                });
99 19e01943 Kostas Papadimitriou
                        });
100 19e01943 Kostas Papadimitriou
                        
101 19e01943 Kostas Papadimitriou
                        addRemoveBtnCk();
102 19e01943 Kostas Papadimitriou
                });
103 19e01943 Kostas Papadimitriou
104 19e01943 Kostas Papadimitriou
                // handle field add
105 19e01943 Kostas Papadimitriou
                $("div#" + settings.addContainerId + " span." + settings.addTriggerClass).click(function() {
106 19e01943 Kostas Papadimitriou
                        var len = getFields().length;
107 19e01943 Kostas Papadimitriou
                        var pos = new Number(len+1);
108 19e01943 Kostas Papadimitriou
                        var newDiv = $("<div/>")
109 19e01943 Kostas Papadimitriou
                                                        .attr("id",settings.cloneContainerId + "-" + pos)
110 19e01943 Kostas Papadimitriou
                                                        .addClass(settings.rowContainerClass);
111 19e01943 Kostas Papadimitriou
            
112 19e01943 Kostas Papadimitriou
            $.each(settings.baseNames, function(index, name) {
113 19e01943 Kostas Papadimitriou
114 19e01943 Kostas Papadimitriou
                var input = $("<input/>").attr({
115 19e01943 Kostas Papadimitriou
                                                                "id":name + pos,
116 19e01943 Kostas Papadimitriou
                                                                "name":name + pos,
117 19e01943 Kostas Papadimitriou
                                                                "value":""
118 19e01943 Kostas Papadimitriou
                                                        });
119 19e01943 Kostas Papadimitriou
                newDiv.append(input);
120 19e01943 Kostas Papadimitriou
            });
121 19e01943 Kostas Papadimitriou
            newDiv.append($("<img>").attr("src",settings.removeImgSrc));
122 19e01943 Kostas Papadimitriou
            
123 19e01943 Kostas Papadimitriou
                        if ( len > 0 ) {
124 19e01943 Kostas Papadimitriou
                                $("div#" + settings.cloneContainerId + "-" + len).after(newDiv);
125 19e01943 Kostas Papadimitriou
                        } else {
126 19e01943 Kostas Papadimitriou
                                $("div#" + settings.addContainerId).before(newDiv);
127 19e01943 Kostas Papadimitriou
                        }
128 19e01943 Kostas Papadimitriou
                        
129 19e01943 Kostas Papadimitriou
                        addRemoveBtnCk();
130 19e01943 Kostas Papadimitriou
                });
131 19e01943 Kostas Papadimitriou
        };
132 19e01943 Kostas Papadimitriou
})(jQuery);