Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_invitations_view.js @ 375a9cb5

History | View | Annotate | Download (15.5 kB)

1 00469232 Kostas Papadimitriou
// Copyright 2011 GRNET S.A. All rights reserved.
2 00469232 Kostas Papadimitriou
// 
3 00469232 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 00469232 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 00469232 Kostas Papadimitriou
// conditions are met:
6 00469232 Kostas Papadimitriou
// 
7 00469232 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 00469232 Kostas Papadimitriou
//      disclaimer.
10 00469232 Kostas Papadimitriou
// 
11 00469232 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 00469232 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 00469232 Kostas Papadimitriou
//      provided with the distribution.
15 00469232 Kostas Papadimitriou
// 
16 00469232 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 00469232 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 00469232 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 00469232 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 00469232 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 00469232 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 00469232 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 00469232 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 00469232 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 00469232 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 00469232 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 00469232 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 00469232 Kostas Papadimitriou
// 
29 00469232 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 00469232 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 00469232 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 00469232 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 00469232 Kostas Papadimitriou
// 
34 00469232 Kostas Papadimitriou
35 1e827d67 Kostas Papadimitriou
;(function(root){
36 1e827d67 Kostas Papadimitriou
37 1e827d67 Kostas Papadimitriou
    // root
38 1e827d67 Kostas Papadimitriou
    var root = root;
39 1e827d67 Kostas Papadimitriou
    
40 1e827d67 Kostas Papadimitriou
    // setup namepsaces
41 1e827d67 Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 1e827d67 Kostas Papadimitriou
    var api = snf.api = snf.api || {};
43 1e827d67 Kostas Papadimitriou
    var models = snf.models = snf.models || {}
44 1e827d67 Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
45 1e827d67 Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
46 1e827d67 Kostas Papadimitriou
    var util = snf.util = snf.util || {};
47 1e827d67 Kostas Papadimitriou
48 1e827d67 Kostas Papadimitriou
    var views = snf.views = snf.views || {}
49 1e827d67 Kostas Papadimitriou
50 1e827d67 Kostas Papadimitriou
    // shortcuts
51 1e827d67 Kostas Papadimitriou
    var bb = root.Backbone;
52 1e827d67 Kostas Papadimitriou
53 1e827d67 Kostas Papadimitriou
    views.InvitationsView = views.Overlay.extend({
54 1e827d67 Kostas Papadimitriou
        
55 1e827d67 Kostas Papadimitriou
        view_id: "invitations_view",
56 1e827d67 Kostas Papadimitriou
        content_selector: "#invitations-overlay-content",
57 1e827d67 Kostas Papadimitriou
        css_class: 'overlay-invitations overlay-info',
58 1e827d67 Kostas Papadimitriou
        overlay_id: "invitations-overlay",
59 1e827d67 Kostas Papadimitriou
60 1e827d67 Kostas Papadimitriou
        subtitle: "",
61 123fd2f5 Kostas Papadimitriou
        title: "Invite friends",
62 1e827d67 Kostas Papadimitriou
63 1e827d67 Kostas Papadimitriou
        initialize: function(options) {
64 1e827d67 Kostas Papadimitriou
            views.InvitationsView.__super__.initialize.apply(this, arguments);
65 1e827d67 Kostas Papadimitriou
66 1e827d67 Kostas Papadimitriou
            _.bindAll(this);
67 1e827d67 Kostas Papadimitriou
68 1e827d67 Kostas Papadimitriou
            this.entry_tpl = this.$(".form-entry-tpl");
69 1e827d67 Kostas Papadimitriou
            this.form_entries = this.$(".form-entries");
70 1e827d67 Kostas Papadimitriou
            this.add = this.$(".add-new-invitation");
71 1e827d67 Kostas Papadimitriou
            this.remove = this.$(".remove-invitation");
72 1e827d67 Kostas Papadimitriou
            this.send = this.$(".send-invitations");
73 1e827d67 Kostas Papadimitriou
            this.top_info = this.$(".top-info");
74 1e827d67 Kostas Papadimitriou
            this.sent = this.$(".invitations-sent-cont");
75 1e827d67 Kostas Papadimitriou
            this.sent_pages = this.$(".invitations-sent-pages");
76 1e827d67 Kostas Papadimitriou
            this.sent_tpl = this.$(".invitation-sent-tpl");
77 1e827d67 Kostas Papadimitriou
            this.entry_tpl.hide();
78 1e827d67 Kostas Papadimitriou
79 1e827d67 Kostas Papadimitriou
            this.inv_sent_per_page = 9;
80 1e827d67 Kostas Papadimitriou
81 1e827d67 Kostas Papadimitriou
            this.init_handlers();
82 123fd2f5 Kostas Papadimitriou
83 123fd2f5 Kostas Papadimitriou
            this.invitations_retrieved = false;
84 123fd2f5 Kostas Papadimitriou
            this.loading_invitations = this.$(".loading-invitations");
85 1e827d67 Kostas Papadimitriou
        },
86 1e827d67 Kostas Papadimitriou
87 1e827d67 Kostas Papadimitriou
        init_handlers: function() {
88 1e827d67 Kostas Papadimitriou
            var self = this;
89 123fd2f5 Kostas Papadimitriou
            this.add.click(function(){
90 123fd2f5 Kostas Papadimitriou
                self.add_new_entry().find("input.name").focus();
91 123fd2f5 Kostas Papadimitriou
            });
92 1e827d67 Kostas Papadimitriou
            this.send.click(this.send_entries);
93 1e827d67 Kostas Papadimitriou
            this.remove.live('click', function() {
94 1e827d67 Kostas Papadimitriou
                return self.remove_entry($(this).parent().parent());
95 1e827d67 Kostas Papadimitriou
            });
96 123fd2f5 Kostas Papadimitriou
97 1e827d67 Kostas Papadimitriou
        },
98 1e827d67 Kostas Papadimitriou
        
99 1e827d67 Kostas Papadimitriou
        remove_entry: function(entry) {
100 1e827d67 Kostas Papadimitriou
            if (entry.hasClass("sending")) { return };
101 1e827d67 Kostas Papadimitriou
            entry.remove();
102 1e827d67 Kostas Papadimitriou
            this.fix_entries();
103 1e827d67 Kostas Papadimitriou
        },
104 1e827d67 Kostas Papadimitriou
105 1e827d67 Kostas Papadimitriou
        add_new_entry: function() {
106 1e827d67 Kostas Papadimitriou
            var new_entry = this.create_form_entry().show()
107 123fd2f5 Kostas Papadimitriou
108 123fd2f5 Kostas Papadimitriou
            var name = "inv-entry-" + this.get_entries().length;
109 123fd2f5 Kostas Papadimitriou
            new_entry.find("input.name").attr("name", "name-" + name);
110 123fd2f5 Kostas Papadimitriou
            new_entry.find("input.email").attr("name", "email-" + name);
111 123fd2f5 Kostas Papadimitriou
            
112 123fd2f5 Kostas Papadimitriou
            var self = this;
113 123fd2f5 Kostas Papadimitriou
            new_entry.find("input").bind("keydown", function(e){
114 123fd2f5 Kostas Papadimitriou
                e.keyCode = e.keyCode || e.which;
115 123fd2f5 Kostas Papadimitriou
                if (e.keyCode == 13) { self.send_entries() };
116 123fd2f5 Kostas Papadimitriou
            })
117 123fd2f5 Kostas Papadimitriou
118 1e827d67 Kostas Papadimitriou
            this.form_entries.append(new_entry).show();
119 1e827d67 Kostas Papadimitriou
            this.fix_entries();
120 123fd2f5 Kostas Papadimitriou
            return new_entry;
121 1e827d67 Kostas Papadimitriou
        },
122 1e827d67 Kostas Papadimitriou
        
123 1e827d67 Kostas Papadimitriou
        show_entry_error: function(entry, error) {
124 1e827d67 Kostas Papadimitriou
            entry.find(".send-error").text(error)
125 1e827d67 Kostas Papadimitriou
            entry.find(".send-error").show();
126 1e827d67 Kostas Papadimitriou
            entry.addClass("error");
127 1e827d67 Kostas Papadimitriou
            entry.find("input").attr("disabled", false);
128 1e827d67 Kostas Papadimitriou
        },
129 1e827d67 Kostas Papadimitriou
        
130 1e827d67 Kostas Papadimitriou
        get_entry_data: function(entry) {
131 1e827d67 Kostas Papadimitriou
            var data = {name: entry.find("input.name").val(), email:entry.find("input.email").val()};
132 1e827d67 Kostas Papadimitriou
            return data;
133 1e827d67 Kostas Papadimitriou
        },
134 1e827d67 Kostas Papadimitriou
135 1e827d67 Kostas Papadimitriou
        entry_is_valid: function(entry) {
136 1e827d67 Kostas Papadimitriou
            var data = this.get_entry_data(entry);
137 1e827d67 Kostas Papadimitriou
138 123fd2f5 Kostas Papadimitriou
            if (data.name == "" && data.email == "") {
139 123fd2f5 Kostas Papadimitriou
                return false;
140 123fd2f5 Kostas Papadimitriou
            }
141 123fd2f5 Kostas Papadimitriou
142 1e827d67 Kostas Papadimitriou
            entry.find(".send-error").hide();
143 1e827d67 Kostas Papadimitriou
            entry.removeClass("error");
144 1e827d67 Kostas Papadimitriou
            entry.find("input").removeClass("has-errors");
145 1e827d67 Kostas Papadimitriou
146 1e827d67 Kostas Papadimitriou
            error = false;
147 1e827d67 Kostas Papadimitriou
            if (!data.name || data.name.split(" ").length == 1) {
148 1e827d67 Kostas Papadimitriou
                error = "Invalid name";
149 1e827d67 Kostas Papadimitriou
                entry.find("input.name").addClass("has-errors");
150 123fd2f5 Kostas Papadimitriou
                entry.find("input.name").focus();
151 1e827d67 Kostas Papadimitriou
            }
152 1e827d67 Kostas Papadimitriou
153 1e827d67 Kostas Papadimitriou
            var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
154 1e827d67 Kostas Papadimitriou
            if (!data.email || reg.test(data.email) == false) {
155 1e827d67 Kostas Papadimitriou
                error = "Invalid email";
156 1e827d67 Kostas Papadimitriou
                entry.find("input.email").addClass("has-errors");
157 123fd2f5 Kostas Papadimitriou
                entry.find("input.email").focus();
158 1e827d67 Kostas Papadimitriou
            }
159 1e827d67 Kostas Papadimitriou
            
160 1e827d67 Kostas Papadimitriou
            if (error) { this.show_entry_error(entry, error) };
161 1e827d67 Kostas Papadimitriou
            return error
162 1e827d67 Kostas Papadimitriou
        },
163 1e827d67 Kostas Papadimitriou
        
164 1e827d67 Kostas Papadimitriou
        send_entries: function() {
165 1e827d67 Kostas Papadimitriou
            var self = this;
166 1e827d67 Kostas Papadimitriou
            this.form_entries.find(".form-entry").each(function(index, el) { self.entry_is_valid($(el)) });
167 1e827d67 Kostas Papadimitriou
            var entries_to_send = this.form_entries.find(".form-entry:not(.error):not(.sending)");
168 123fd2f5 Kostas Papadimitriou
169 123fd2f5 Kostas Papadimitriou
            entries = _.filter(entries_to_send, function(e){
170 123fd2f5 Kostas Papadimitriou
                var data = self.get_entry_data($(e));
171 123fd2f5 Kostas Papadimitriou
                if (data.name == "" && data.email == "") {
172 123fd2f5 Kostas Papadimitriou
                    return false;
173 123fd2f5 Kostas Papadimitriou
                }
174 123fd2f5 Kostas Papadimitriou
                return true;
175 123fd2f5 Kostas Papadimitriou
            })
176 123fd2f5 Kostas Papadimitriou
            this._send_entries(entries);
177 1e827d67 Kostas Papadimitriou
        },
178 1e827d67 Kostas Papadimitriou
179 1e827d67 Kostas Papadimitriou
        _send_entries: function(entries) {
180 1e827d67 Kostas Papadimitriou
            $(entries).addClass("sending").find("input").attr("disabled", true);
181 1e827d67 Kostas Papadimitriou
            var self = this;
182 1e827d67 Kostas Papadimitriou
            _.each(entries, function(e) {
183 1e827d67 Kostas Papadimitriou
                var e = $(e);
184 1e827d67 Kostas Papadimitriou
                var data = self.get_entry_data(e);
185 1e827d67 Kostas Papadimitriou
                self.send_invitation(data.name, 
186 1e827d67 Kostas Papadimitriou
                                     data.email,
187 1e827d67 Kostas Papadimitriou
                                     _.bind(self.invitation_send, this, e), 
188 1e827d67 Kostas Papadimitriou
                                     _.bind(self.invitation_failed, this, e));
189 1e827d67 Kostas Papadimitriou
            });
190 1e827d67 Kostas Papadimitriou
        },
191 1e827d67 Kostas Papadimitriou
192 1e827d67 Kostas Papadimitriou
        invitation_send: function(entry, data) {
193 1e827d67 Kostas Papadimitriou
            entry.removeClass("sending");
194 123fd2f5 Kostas Papadimitriou
            if (data.errors && data.errors.length > 0) {
195 123fd2f5 Kostas Papadimitriou
                this.show_entry_error($(entry), data.errors[0].msg);
196 1e827d67 Kostas Papadimitriou
                return;
197 1e827d67 Kostas Papadimitriou
            } else {
198 1e827d67 Kostas Papadimitriou
                entry.remove();
199 1e827d67 Kostas Papadimitriou
                this.show_send_success(entry.find("input.name").val(), data);
200 1e827d67 Kostas Papadimitriou
            }
201 1e827d67 Kostas Papadimitriou
        },
202 1e827d67 Kostas Papadimitriou
203 1e827d67 Kostas Papadimitriou
        show_send_success: function(to, data) {
204 123fd2f5 Kostas Papadimitriou
            var msg = 'Invitation to <span class="email">' + to + '</span> was sent.';
205 1e827d67 Kostas Papadimitriou
            var msg_el = $('<div class="msg">{0}</div>'.format(msg));
206 1e827d67 Kostas Papadimitriou
207 1e827d67 Kostas Papadimitriou
            this.top_info.append(msg_el);
208 1e827d67 Kostas Papadimitriou
209 1e827d67 Kostas Papadimitriou
            window.setTimeout(function(){
210 1e827d67 Kostas Papadimitriou
                msg_el.fadeOut(600, function(){$(this).remove()});
211 123fd2f5 Kostas Papadimitriou
            }, 5000);
212 1e827d67 Kostas Papadimitriou
213 1e827d67 Kostas Papadimitriou
            this.fix_entries();
214 1e827d67 Kostas Papadimitriou
            this.reset_invitations_sent();
215 1e827d67 Kostas Papadimitriou
        },
216 1e827d67 Kostas Papadimitriou
217 1e827d67 Kostas Papadimitriou
        invitation_failed: function(entry) {
218 1e827d67 Kostas Papadimitriou
            entry.removeClass("sending");
219 1e827d67 Kostas Papadimitriou
            this.show_entry_error(entry, "Cannot send email, please try again later");
220 1e827d67 Kostas Papadimitriou
        },
221 1e827d67 Kostas Papadimitriou
222 1e827d67 Kostas Papadimitriou
        send_invitation: function(name, email, success, fail) {
223 1e827d67 Kostas Papadimitriou
            var url = snf.config.invitations_url;
224 1e827d67 Kostas Papadimitriou
            var payload = {name_1: name, email_1: email, csrftoken: $.cookie('csrftoken')};
225 1e827d67 Kostas Papadimitriou
            params = {
226 1e827d67 Kostas Papadimitriou
                success: success,
227 1e827d67 Kostas Papadimitriou
                error: fail,
228 1e827d67 Kostas Papadimitriou
                url: url,
229 1e827d67 Kostas Papadimitriou
                data: $.param(payload),
230 1e827d67 Kostas Papadimitriou
                skip_api_error: true
231 1e827d67 Kostas Papadimitriou
            }
232 1e827d67 Kostas Papadimitriou
            snf.api.sync("create", undefined, params);
233 1e827d67 Kostas Papadimitriou
        },
234 1e827d67 Kostas Papadimitriou
235 1e827d67 Kostas Papadimitriou
        get_entries: function() {
236 1e827d67 Kostas Papadimitriou
            return this.form_entries.find(".form-entry");
237 1e827d67 Kostas Papadimitriou
        },
238 1e827d67 Kostas Papadimitriou
239 1e827d67 Kostas Papadimitriou
        fix_entries: function() {
240 1e827d67 Kostas Papadimitriou
            this.$(".remove-invitation").hide();
241 1e827d67 Kostas Papadimitriou
            if (this.get_entries().length == 0) {
242 1e827d67 Kostas Papadimitriou
                this.add_new_entry();
243 123fd2f5 Kostas Papadimitriou
                this.add_new_entry();
244 1e827d67 Kostas Papadimitriou
            }
245 1e827d67 Kostas Papadimitriou
246 1e827d67 Kostas Papadimitriou
            if (this.get_entries().length > 1) {
247 1e827d67 Kostas Papadimitriou
                this.$(".remove-invitation").show();
248 1e827d67 Kostas Papadimitriou
            }
249 1e827d67 Kostas Papadimitriou
            this.$(".form-entry:first-child label").show();
250 1e827d67 Kostas Papadimitriou
            this.$(".form-entry:not(:first-child) label").hide();
251 1e827d67 Kostas Papadimitriou
        },
252 123fd2f5 Kostas Papadimitriou
        
253 1e827d67 Kostas Papadimitriou
        show: function() {
254 1e827d67 Kostas Papadimitriou
            views.InvitationsView.__super__.show.apply(this, arguments);
255 1e827d67 Kostas Papadimitriou
            this.current_page = 0;
256 123fd2f5 Kostas Papadimitriou
            this.reset_sent();
257 1e827d67 Kostas Papadimitriou
            this.reset();
258 1e827d67 Kostas Papadimitriou
259 1e827d67 Kostas Papadimitriou
            this.add_new_entry();
260 1e827d67 Kostas Papadimitriou
            this.add_new_entry();
261 123fd2f5 Kostas Papadimitriou
262 123fd2f5 Kostas Papadimitriou
            if (this.invitations_retrieved) {
263 123fd2f5 Kostas Papadimitriou
                this.loading_invitations.hide();
264 123fd2f5 Kostas Papadimitriou
            }
265 123fd2f5 Kostas Papadimitriou
        },
266 123fd2f5 Kostas Papadimitriou
267 123fd2f5 Kostas Papadimitriou
        reset_sent: function() {
268 123fd2f5 Kostas Papadimitriou
            this.reset_invitations_sent();
269 123fd2f5 Kostas Papadimitriou
            this.add_invitations_sent([]);
270 1e827d67 Kostas Papadimitriou
        },
271 1e827d67 Kostas Papadimitriou
272 1e827d67 Kostas Papadimitriou
        create_form_entry: function() {
273 1e827d67 Kostas Papadimitriou
            return this.entry_tpl.clone().removeClass("form-entry-tpl").addClass("form-entry").removeClass("hidden");
274 1e827d67 Kostas Papadimitriou
        },
275 1e827d67 Kostas Papadimitriou
            
276 1e827d67 Kostas Papadimitriou
        reset: function() {
277 1e827d67 Kostas Papadimitriou
            this.get_entries().remove();
278 1e827d67 Kostas Papadimitriou
            this.add_new_entry();
279 1e827d67 Kostas Papadimitriou
        },
280 1e827d67 Kostas Papadimitriou
        
281 1e827d67 Kostas Papadimitriou
        new_invitation_sent_el: function() {
282 1e827d67 Kostas Papadimitriou
            return this.sent_tpl.clone().removeClass("invitation-sent-tpl").addClass("invitation-sent");
283 1e827d67 Kostas Papadimitriou
        },
284 1e827d67 Kostas Papadimitriou
        
285 1e827d67 Kostas Papadimitriou
        show_invitations_sent_error: function() {
286 1e827d67 Kostas Papadimitriou
            this.sent.hide();
287 1e827d67 Kostas Papadimitriou
            this.$(".invitations-sent-error").show();
288 1e827d67 Kostas Papadimitriou
        },
289 1e827d67 Kostas Papadimitriou
290 1e827d67 Kostas Papadimitriou
        reset_invitations_sent: function() {
291 1e827d67 Kostas Papadimitriou
            var self = this;
292 1e827d67 Kostas Papadimitriou
            var url = snf.config.invitations_url;
293 1e827d67 Kostas Papadimitriou
            params = {
294 1e827d67 Kostas Papadimitriou
                success: function(data) {
295 123fd2f5 Kostas Papadimitriou
                    self.invitations_retrieved = true;
296 123fd2f5 Kostas Papadimitriou
                    self.loading_invitations.hide();
297 123fd2f5 Kostas Papadimitriou
298 1e827d67 Kostas Papadimitriou
                    if (!data || !data.invitations) {
299 1e827d67 Kostas Papadimitriou
                        self.show_invitations_sent_error();
300 1e827d67 Kostas Papadimitriou
                    } else {
301 1e827d67 Kostas Papadimitriou
                        self.sent.empty();
302 1e827d67 Kostas Papadimitriou
                        self.add_invitations_sent(data.invitations);
303 1e827d67 Kostas Papadimitriou
                    }
304 1e827d67 Kostas Papadimitriou
                    
305 1e827d67 Kostas Papadimitriou
                    //data.invitations_left = 0;
306 1e827d67 Kostas Papadimitriou
                    self.$(".description .left").text(data.invitations_left);
307 1e827d67 Kostas Papadimitriou
                    if(data.invitations_left > 0) {
308 1e827d67 Kostas Papadimitriou
                        self.$(".invitations-form").show();
309 1e827d67 Kostas Papadimitriou
                        self.$(".description .left").removeClass("none");
310 1e827d67 Kostas Papadimitriou
                        self.el.removeClass("none-left");
311 1e827d67 Kostas Papadimitriou
                    } else {
312 1e827d67 Kostas Papadimitriou
                        self.$(".invitations-form").hide();
313 1e827d67 Kostas Papadimitriou
                        self.$(".description .left").addClass("none");
314 1e827d67 Kostas Papadimitriou
                        self.el.addClass("none-left");
315 1e827d67 Kostas Papadimitriou
                    }
316 1e827d67 Kostas Papadimitriou
                },
317 1e827d67 Kostas Papadimitriou
                error: _.bind(this.show_invitations_sent_error, this),
318 1e827d67 Kostas Papadimitriou
                url: url,
319 1e827d67 Kostas Papadimitriou
                skip_api_error: true
320 1e827d67 Kostas Papadimitriou
            }
321 1e827d67 Kostas Papadimitriou
322 1e827d67 Kostas Papadimitriou
            snf.api.sync("read", undefined, params);
323 1e827d67 Kostas Papadimitriou
        },
324 123fd2f5 Kostas Papadimitriou
        
325 123fd2f5 Kostas Papadimitriou
        resend_succeed: function(inv, el) {
326 123fd2f5 Kostas Papadimitriou
            el.find(".status.sent").removeClass("hidden").hide();
327 123fd2f5 Kostas Papadimitriou
            el.find(".status.resend").removeClass("hidden").show();
328 123fd2f5 Kostas Papadimitriou
            el.find(".status.sending").removeClass("hidden").hide();
329 123fd2f5 Kostas Papadimitriou
330 123fd2f5 Kostas Papadimitriou
            var msg = $('<div class="msg success">Invitation has been resent to <span class="email">{0}</span>.</div>'.format(inv.target));
331 123fd2f5 Kostas Papadimitriou
            this.$(".resent-info").append(msg);
332 123fd2f5 Kostas Papadimitriou
            setTimeout(function(){ $(msg).fadeOut(600)}, 5000);
333 123fd2f5 Kostas Papadimitriou
        },
334 123fd2f5 Kostas Papadimitriou
335 123fd2f5 Kostas Papadimitriou
        resend_failed: function(inv, el) {
336 123fd2f5 Kostas Papadimitriou
            el.find(".status.sent").removeClass("hidden").hide();
337 123fd2f5 Kostas Papadimitriou
            el.find(".status.resend").removeClass("hidden").show();
338 123fd2f5 Kostas Papadimitriou
            el.find(".status.sending").removeClass("hidden").hide();
339 123fd2f5 Kostas Papadimitriou
            
340 123fd2f5 Kostas Papadimitriou
            var msg = $('<div class="msg err-msg">Resend to <span class="email">{0}</span> failed.</div>'.format(inv.target));
341 123fd2f5 Kostas Papadimitriou
            this.$(".resent-info").append(msg);
342 123fd2f5 Kostas Papadimitriou
            setTimeout(function(){ $(msg).fadeOut(600)}, 5000);
343 123fd2f5 Kostas Papadimitriou
        },
344 123fd2f5 Kostas Papadimitriou
345 123fd2f5 Kostas Papadimitriou
        resend_invitation: function(id, el, inv) {
346 123fd2f5 Kostas Papadimitriou
            var self = this;
347 123fd2f5 Kostas Papadimitriou
            var inv = inv;
348 123fd2f5 Kostas Papadimitriou
            var id = id;
349 123fd2f5 Kostas Papadimitriou
            var el = el;
350 123fd2f5 Kostas Papadimitriou
351 123fd2f5 Kostas Papadimitriou
            el.find(".status.sent").removeClass("hidden").hide();
352 123fd2f5 Kostas Papadimitriou
            el.find(".status.resend").removeClass("hidden").hide();
353 123fd2f5 Kostas Papadimitriou
            el.find(".status.sending").removeClass("hidden").show();
354 123fd2f5 Kostas Papadimitriou
355 123fd2f5 Kostas Papadimitriou
            var url = snf.config.invitations_url + "/resend/";
356 123fd2f5 Kostas Papadimitriou
            var payload = "invid=" + id;
357 123fd2f5 Kostas Papadimitriou
            params = {
358 123fd2f5 Kostas Papadimitriou
                success: function(data) {
359 123fd2f5 Kostas Papadimitriou
                    self.resend_succeed(inv, el);
360 123fd2f5 Kostas Papadimitriou
                },
361 123fd2f5 Kostas Papadimitriou
                error: function() {
362 123fd2f5 Kostas Papadimitriou
                    self.resend_failed(inv, el);
363 123fd2f5 Kostas Papadimitriou
                },
364 123fd2f5 Kostas Papadimitriou
                data: payload,
365 123fd2f5 Kostas Papadimitriou
                url: url,
366 123fd2f5 Kostas Papadimitriou
                skip_api_error: true
367 123fd2f5 Kostas Papadimitriou
            }
368 123fd2f5 Kostas Papadimitriou
369 123fd2f5 Kostas Papadimitriou
            snf.api.sync("create", undefined, params);
370 123fd2f5 Kostas Papadimitriou
        },
371 1e827d67 Kostas Papadimitriou
372 1e827d67 Kostas Papadimitriou
        add_invitations_sent: function(invs) {
373 123fd2f5 Kostas Papadimitriou
            var self = this;
374 1e827d67 Kostas Papadimitriou
            _.each(invs, _.bind(function(inv) {
375 1e827d67 Kostas Papadimitriou
                var el = this.new_invitation_sent_el();
376 123fd2f5 Kostas Papadimitriou
                var invitation = inv;
377 123fd2f5 Kostas Papadimitriou
378 1e827d67 Kostas Papadimitriou
                el.find(".name").text(inv.targetname);
379 1e827d67 Kostas Papadimitriou
                el.find(".email").text(inv.target);
380 123fd2f5 Kostas Papadimitriou
                
381 123fd2f5 Kostas Papadimitriou
                el.find(".status.sent").removeClass("hidden").show();
382 123fd2f5 Kostas Papadimitriou
                el.find(".status.resend").removeClass("hidden").hide();
383 123fd2f5 Kostas Papadimitriou
                el.find(".status.sending").removeClass("hidden").hide();
384 123fd2f5 Kostas Papadimitriou
385 1e827d67 Kostas Papadimitriou
                if (!inv.accepted) {
386 123fd2f5 Kostas Papadimitriou
                    el.find(".status.resend").show();
387 123fd2f5 Kostas Papadimitriou
                    el.find(".status.sent").hide();
388 123fd2f5 Kostas Papadimitriou
                    el.find(".status.sending").hide();
389 1e827d67 Kostas Papadimitriou
                }
390 123fd2f5 Kostas Papadimitriou
391 123fd2f5 Kostas Papadimitriou
                el.find(".status.resend").click(function(){
392 123fd2f5 Kostas Papadimitriou
                    self.resend_invitation(invitation.id, el, invitation);
393 123fd2f5 Kostas Papadimitriou
                })
394 123fd2f5 Kostas Papadimitriou
395 1e827d67 Kostas Papadimitriou
                el.removeClass("hidden");
396 1e827d67 Kostas Papadimitriou
                this.sent.append(el);
397 1e827d67 Kostas Papadimitriou
            }, this));
398 1e827d67 Kostas Papadimitriou
            this.update_pagination();
399 1e827d67 Kostas Papadimitriou
            this.sent_pages.trigger("setPage", this.current_page || 0);
400 1e827d67 Kostas Papadimitriou
        },
401 123fd2f5 Kostas Papadimitriou
402 123fd2f5 Kostas Papadimitriou
        onOpen: function() {
403 123fd2f5 Kostas Papadimitriou
            views.InvitationsView.__super__.onOpen.apply(this, arguments);
404 123fd2f5 Kostas Papadimitriou
            setTimeout(function(){$(this.$("input.name:visible").get(0)).focus()}, 100);
405 123fd2f5 Kostas Papadimitriou
        },
406 1e827d67 Kostas Papadimitriou
        
407 1e827d67 Kostas Papadimitriou
        inv_sent_per_page: 5,
408 1e827d67 Kostas Papadimitriou
        update_pagination: function() {
409 1e827d67 Kostas Papadimitriou
            this.sent.css({minHeight:this.inv_sent_per_page * 35 + "px"})
410 123fd2f5 Kostas Papadimitriou
            this.sent_pages.pagination(this.sent.children().length, 
411 123fd2f5 Kostas Papadimitriou
                                       {items_per_page:this.inv_sent_per_page, callback: this.page_cb});
412 1e827d67 Kostas Papadimitriou
        },
413 1e827d67 Kostas Papadimitriou
414 1e827d67 Kostas Papadimitriou
        page_cb: function(index, pager) {
415 1e827d67 Kostas Papadimitriou
            this.current_page = index;
416 1e827d67 Kostas Papadimitriou
            var start = index * this.inv_sent_per_page;
417 1e827d67 Kostas Papadimitriou
            var end = start + this.inv_sent_per_page -1;
418 1e827d67 Kostas Papadimitriou
            var items = this.sent.children();
419 1e827d67 Kostas Papadimitriou
            items.hide().removeClass("last");
420 1e827d67 Kostas Papadimitriou
            for (var i = start; i<=end; i++) {
421 1e827d67 Kostas Papadimitriou
                $(items.get(i)).show();
422 1e827d67 Kostas Papadimitriou
            }
423 1e827d67 Kostas Papadimitriou
            $(items.get(end)).addClass("last");
424 1e827d67 Kostas Papadimitriou
            return false;
425 1e827d67 Kostas Papadimitriou
        }
426 1e827d67 Kostas Papadimitriou
        
427 1e827d67 Kostas Papadimitriou
    });
428 1e827d67 Kostas Papadimitriou
})(this);