/* Copyright (c) 2010-2012, Diaspora Inc. This file is * licensed under the Affero General Public License version 3 or later. See * the COPYRIGHT file. */ //= require ./publisher/services //= require ./publisher/aspects_selector //= require ./publisher/getting_started app.views.Publisher = Backbone.View.extend(_.extend( app.views.PublisherServices, app.views.PublisherAspectsSelector, app.views.PublisherGettingStarted, { el : "#publisher", events : { "focus textarea" : "open", "click #hide_publisher" : "clear", "submit form" : "createStatusMessage", "click .service_icon": "toggleService", "textchange #status_message_fake_text": "handleTextchange", "click .dropdown .dropdown_list li": "toggleAspect" }, initialize : function(){ // init shortcut references to the various elements this.el_input = this.$('#status_message_fake_text'); this.el_hiddenInput = this.$('#status_message_text'); this.el_wrapper = this.$('#publisher_textarea_wrapper'); this.el_submit = this.$('input[type=submit]'); this.el_photozone = this.$('#photodropzone'); // init mentions plugin Mentions.initialize(this.el_input); // init autoresize plugin this.el_input.autoResize({ 'extraSpace' : 10, 'maxHeight' : Infinity }); // sync textarea content if( this.el_hiddenInput.val() == "" ) { this.el_hiddenInput.val( this.el_input.val() ); } // hide close button, in case publisher is standalone // (e.g. bookmarklet, mentions popup) if( this.options.standalone ) { this.$('#hide_publisher').hide(); } // this has to be here, otherwise for some reason the callback for the // textchange event won't be called in Backbone... this.el_input.bind('textchange', $.noop); return this; }, createStatusMessage : function(evt) { if(evt){ evt.preventDefault(); } var serializedForm = $(evt.target).closest("form").serializeObject(); // lulz this code should be killed. var statusMessage = new app.models.Post(); statusMessage.save({ "status_message" : { "text" : serializedForm["status_message[text]"] }, "aspect_ids" : serializedForm["aspect_ids[]"], "photos" : serializedForm["photos[]"], "services" : serializedForm["services[]"] }, { url : "/status_messages", success : function() { if(app.publisher) { $(app.publisher.el).trigger('ajax:success'); } if(app.stream) { app.stream.items.add(statusMessage.toJSON()); } } }); // clear state this.clear(); }, clear : function() { // clear text(s) this.el_input.val(''); this.el_hiddenInput.val(''); // remove mentions this.el_input.mentionsInput('reset'); // remove photos this.el_photozone.find('li').remove(); this.$("input[name='photos[]']").remove(); this.el_wrapper.removeClass("with_attachments"); // empty upload-photo this.$('#fileInfo').empty(); // close publishing area (CSS) this.close(); // disable submitting this.checkSubmitAvailability(); // force textchange plugin to update lastValue this.el_input.data('lastValue', ''); this.el_hiddenInput.data('lastValue', ''); return this; }, open : function() { // visually 'open' the publisher this.$el.removeClass('closed'); this.el_wrapper.addClass('active'); // fetch contacts for mentioning Mentions.fetchContacts(); return this; }, close : function() { $(this.el).addClass("closed"); this.el_wrapper.removeClass("active"); this.el_input.css('height', ''); return this; }, checkSubmitAvailability: function() { if( this._submittable() ) { this.el_submit.removeAttr('disabled'); } else { this.el_submit.attr('disabled','disabled'); } }, // determine submit availability _submittable: function() { var onlyWhitespaces = ($.trim(this.el_input.val()) === ''), isPhotoAttached = (this.el_photozone.children().length > 0); return (!onlyWhitespaces || isPhotoAttached); }, handleTextchange: function() { var self = this; this.checkSubmitAvailability(); this.el_input.mentionsInput("val", function(value){ self.el_hiddenInput.val(value); }); } })); // jQuery helper for serializing a