]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - js/util.js
use a data attribute instead of 'title' for geo lookup api; fixes failure of cloned...
[quix0rs-gnu-social.git] / js / util.js
index fc03bc75fed6c8109220774c3ad7afb26f1e0977..c690153abb0adc7756d9e5331c99785ab7a5ad60 100644 (file)
@@ -104,7 +104,7 @@ var SN = { // StatusNet
 
                 SN.U.Counter(form);
 
-                NDT = form.find('[name=status_textarea]');
+                NDT = form.find('.notice_data-text:first');
 
                 NDT.bind('keyup', function(e) {
                     SN.U.Counter(form);
@@ -183,7 +183,7 @@ var SN = { // StatusNet
          * @return number of chars
          */
         CharacterCount: function(form) {
-            return form.find('[name=status_textarea]').val().length;
+            return form.find('.notice_data-text:first').val().length;
         },
 
         /**
@@ -228,6 +228,9 @@ var SN = { // StatusNet
          * will be extracted and copied in, replacing the original form.
          * If there's no form, the first paragraph will be used.
          *
+         * This will automatically be applied on the 'submit' event for
+         * any form with the 'ajax' class.
+         *
          * @fixme can sometimes explode confusingly if returnd data is bogus
          * @fixme error handling is pretty vague
          * @fixme can't submit file uploads
@@ -324,7 +327,7 @@ var SN = { // StatusNet
                 dataType: 'xml',
                 timeout: '60000',
                 beforeSend: function(formData) {
-                    if (form.find('[name=status_textarea]').val() == '') {
+                    if (form.find('.notice_data-text:first').val() == '') {
                         form.addClass(SN.C.S.Warning);
                         return false;
                     }
@@ -596,7 +599,7 @@ var SN = { // StatusNet
                 nextStep();
             } else {
                 // Remove placeholder if any
-                $('li.notice-reply-placeholder').remove();
+                list.find('li.notice-reply-placeholder').remove();
 
                 // Create the reply form entry at the end
                 var replyItem = $('li.notice-reply', list);
@@ -609,10 +612,7 @@ var SN = { // StatusNet
                         list.append(replyItem);
 
                         var form = replyForm = $(formEl);
-                        SN.U.NoticeLocationAttach(form);
-                        SN.U.FormNoticeXHR(form);
-                        SN.U.FormNoticeEnhancements(form);
-                        SN.U.NoticeDataAttach(form);
+                        SN.Init.NoticeFormSetup(form);
 
                         nextStep();
                     };
@@ -633,26 +633,17 @@ var SN = { // StatusNet
             }
         },
 
-        /**
-         * Setup function -- DOES NOT apply immediately.
-         *
-         * Sets up event handlers for favor/disfavor forms to submit via XHR.
-         * Uses 'live' rather than 'bind', so applies to future as well as present items.
-         */
-        NoticeFavor: function() {
-            $('.form_favor').live('click', function() { SN.U.FormXHR($(this)); return false; });
-            $('.form_disfavor').live('click', function() { SN.U.FormXHR($(this)); return false; });
-        },
-
         NoticeInlineReplyPlaceholder: function(notice) {
             var list = notice.find('ul.threaded-replies');
             var placeholder = $('<li class="notice-reply-placeholder">' +
                                     '<input class="placeholder">' +
                                 '</li>');
-            placeholder.click(function() {
-                SN.U.NoticeInlineReplyTrigger(notice);
-            });
-            placeholder.find('input').val(SN.msg('reply_placeholder'));
+            placeholder.find('input')
+                .val(SN.msg('reply_placeholder'))
+                .focus(function() {
+                    SN.U.NoticeInlineReplyTrigger(notice);
+                    return false;
+                });
             list.append(placeholder);
         },
 
@@ -1026,8 +1017,7 @@ var SN = { // StatusNet
                 }
 
                 var NGW = form.find('.notice_data-geo_wrap');
-                var geocodeURL = NGW.attr('title');
-                NGW.removeAttr('title');
+                var geocodeURL = NGW.attr('data-api');
 
                 label
                     .attr('title', label.text());
@@ -1127,6 +1117,7 @@ var SN = { // StatusNet
                 wrapper = $('<div class="'+SN.C.S.Success+' geo_status_wrapper"><button class="close" style="float:right">&#215;</button><div class="geo_status"></div></div>');
                 wrapper.find('button.close').click(function() {
                     form.find('[name=notice_data-geo]').removeAttr('checked').change();
+                    return false;
                 });
                 form.append(wrapper);
             }
@@ -1271,7 +1262,7 @@ var SN = { // StatusNet
 
             var profileLink = $('#nav_profile a').attr('href');
             if (profileLink) {
-                var authorUrl = $(notice).find('.entry-title .author a.url').attr('href');
+                var authorUrl = $(notice).find('.vcard.author a.url').attr('href');
                 if (authorUrl == profileLink) {
                     if (action == 'all' || action == 'showstream') {
                         // Posts always show on your own friends and profile streams.
@@ -1288,6 +1279,13 @@ var SN = { // StatusNet
             return false;
         },
 
+        /**
+         * Switch to another active input sub-form.
+         * This will hide the current form (if any), show the new one, and
+         * update the input type tab selection state.
+         *
+         * @param {String} tag
+         */
        switchInputFormTab: function(tag) {
            // The one that's current isn't current anymore
            $('.input_form_nav_tab.current').removeClass('current');
@@ -1309,16 +1307,49 @@ var SN = { // StatusNet
          */
         NoticeForm: function() {
             if ($('body.user_in').length > 0) {
-                $('.'+SN.C.S.FormNotice).each(function() {
+                $('.ajax-notice').each(function() {
                     var form = $(this);
-                    SN.U.NoticeLocationAttach(form);
-                    SN.U.FormNoticeXHR(form);
-                    SN.U.FormNoticeEnhancements(form);
-                    SN.U.NoticeDataAttach(form);
+                    SN.Init.NoticeFormSetup(form);
+                });
+
+                // Make inline reply forms self-close when clicking out.
+                $('body').bind('click', function(e) {
+                    var openReplies = $('li.notice-reply');
+                    if (openReplies.length > 0) {
+                        var target = $(e.target);
+                        openReplies.each(function() {
+                            // Did we click outside this one?
+                            var replyItem = $(this);
+                            if (replyItem.has(e.target).length == 0) {
+                                var textarea = replyItem.find('.notice_data-text:first');
+                                var cur = $.trim(textarea.val());
+                                // Only close if there's been no edit.
+                                if (cur == '' || cur == textarea.data('initialText')) {
+                                    var parentNotice = replyItem.closest('li.notice');
+                                    replyItem.remove();
+                                    SN.U.NoticeInlineReplyPlaceholder(parentNotice);
+                                }
+                            }
+                        });
+                    }
                 });
             }
         },
 
+        /**
+         * Encapsulate notice form setup for a single form.
+         * Plugins can add extra setup by monkeypatching this
+         * function.
+         *
+         * @param {jQuery} form
+         */
+        NoticeFormSetup: function(form) {
+            SN.U.NoticeLocationAttach(form);
+            SN.U.FormNoticeXHR(form);
+            SN.U.FormNoticeEnhancements(form);
+            SN.U.NoticeDataAttach(form);
+        },
+
         /**
          * Run setup code for notice timeline views items:
          *
@@ -1331,7 +1362,6 @@ var SN = { // StatusNet
                 if (masterForm.length > 0) {
                     SN.C.I.NoticeFormMaster = document._importNode(masterForm[0], true);
                 }
-                SN.U.NoticeFavor();
                 SN.U.NoticeRepeat();
                 SN.U.NoticeReply();
                 SN.U.NoticeInlineReplySetup();
@@ -1348,12 +1378,6 @@ var SN = { // StatusNet
          */
         EntityActions: function() {
             if ($('body.user_in').length > 0) {
-                $('.form_user_subscribe').live('click', function() { SN.U.FormXHR($(this)); return false; });
-                $('.form_user_unsubscribe').live('click', function() { SN.U.FormXHR($(this)); return false; });
-                $('.form_group_join').live('click', function() { SN.U.FormXHR($(this)); return false; });
-                $('.form_group_leave').live('click', function() { SN.U.FormXHR($(this)); return false; });
-                $('.form_user_nudge').live('click', function() { SN.U.FormXHR($(this)); return false; });
-
                 SN.U.NewDirectMessage();
             }
         },
@@ -1380,6 +1404,16 @@ var SN = { // StatusNet
             });
         },
 
+        /**
+         * Set up any generic 'ajax' form so it submits via AJAX with auto-replacement.
+         */
+        AjaxForms: function() {
+            $('form.ajax').live('submit', function() {
+                SN.U.FormXHR($(this));
+                return false;
+            });
+        },
+
         /**
          * Add logic to any file upload forms to handle file size limits,
          * on browsers that support basic FileAPI.
@@ -1416,6 +1450,7 @@ var SN = { // StatusNet
  * don't start them loading until after DOM-ready time!
  */
 $(document).ready(function(){
+    SN.Init.AjaxForms();
     SN.Init.UploadForms();
     if ($('.'+SN.C.S.FormNotice).length > 0) {
         SN.Init.NoticeForm();