]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - js/util.js
Allow lookup of User->getByUri (throws NoResultException)
[quix0rs-gnu-social.git] / js / util.js
index 0bda55b602d9cda95dbf832dc3f6b0db491b3812..29650b1a4d4007c50d430c12fe668e9b602ffdb7 100644 (file)
@@ -53,13 +53,19 @@ var SN = { // StatusNet
             NoticeDataGeo: 'notice_data-geo',
             NoticeDataGeoCookie: 'NoticeDataGeo',
             NoticeDataGeoSelected: 'notice_data-geo_selected',
-            StatusNetInstance: 'StatusNetInstance'
         }
     },
 
     V: {    // Variables
     },
 
+    /**
+     * list of callbacks, categorized into _callbacks['event_name'] = [ callback_function_1, callback_function_2 ]
+     *
+     * @access private
+     */
+    _callbacks: {},
+
     /**
      * Map of localized message strings exported to script from the PHP
      * side via Action::getScriptMessages().
@@ -224,7 +230,16 @@ var SN = { // StatusNet
             var newId = 'form_notice_' + Math.floor(Math.random()*999999999);
             var attrs = ['name', 'for', 'id'];
             for (var key in attrs) {
-                form.find("[" + attrs[key] + "~='" + oldId + "']").each(function () {
+                if (form.attr(attrs[key]) === undefined) {
+                    continue;
+                }
+                form.attr(attrs[key], form.attr(attrs[key]).replace(oldId, newId));
+            }
+            for (var key in attrs) {
+                form.find("[" + attrs[key] + "*='" + oldId + "']").each(function () {
+                        if ($(this).attr(attrs[key]) === undefined) {
+                            return; // since we're inside the each(function () { ... });
+                        }
                         var newAttr = $(this).attr(attrs[key]).replace(oldId, newId);
                         $(this).attr(attrs[key], newAttr);
                     });
@@ -334,21 +349,6 @@ var SN = { // StatusNet
             // Make sure we don't have a mixed HTTP/HTTPS submission...
             form.attr('action', SN.U.RewriteAjaxAction(form.attr('action')));
 
-            /**
-             * Show a response feedback bit under the new-notice dialog.
-             *
-             * @param {String} cls: CSS class name to use ('error' or 'success')
-             * @param {String} text
-             * @access private
-             */
-            var showFeedback = function (cls, text) {
-                form.append(
-                    $('<p class="form_response"></p>')
-                        .addClass(cls)
-                        .text(text)
-                );
-            };
-
             /**
              * Hide the previous response feedback, if any.
              */
@@ -383,7 +383,7 @@ var SN = { // StatusNet
                     removeFeedback();
                     if (textStatus == 'timeout') {
                         // @fixme i18n
-                        showFeedback('error', 'Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.');
+                        SN.U.showFeedback(form, 'error', 'Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.');
                     } else {
                         var response = SN.U.GetResponseXML(xhr);
                         if ($('.' + SN.C.S.Error, response).length > 0) {
@@ -396,7 +396,7 @@ var SN = { // StatusNet
                                 SN.U.FormNoticeEnhancements(form);
                             } else {
                                 // @fixme i18n
-                                showFeedback('error', '(Sorry! We had trouble sending your notice (' + xhr.status + ' ' + xhr.statusText + '). Please report the problem to the site administrator if this happens again.');
+                                SN.U.showFeedback(form, 'error', '(Sorry! We had trouble sending your notice (' + xhr.status + ' ' + xhr.statusText + '). Please report the problem to the site administrator if this happens again.');
                             }
                         }
                     }
@@ -405,59 +405,9 @@ var SN = { // StatusNet
                     removeFeedback();
                     var errorResult = $('#' + SN.C.S.Error, data);
                     if (errorResult.length > 0) {
-                        showFeedback('error', errorResult.text());
+                        SN.U.showFeedback(form, 'error', errorResult.text());
                     } else {
-                        var commandResult = $('#' + SN.C.S.CommandResult, data);
-                        if (commandResult.length > 0) {
-                            showFeedback('success', commandResult.text());
-                        } else {
-                            // New notice post was successful. If on our timeline, show it!
-                            var notice = document._importNode($('li', data)[0], true);
-                            var notices = $('#notices_primary .notices:first');
-                            var replyItem = form.closest('li.notice-reply');
-
-                            if (replyItem.length > 0) {
-                                // If this is an inline reply, remove the form...
-                                var list = form.closest('.threaded-replies');
-
-                                var id = $(notice).attr('id');
-                                if ($('#' + id).length == 0) {
-                                    $(notice).insertBefore(replyItem);
-                                } // else Realtime came through before us...
-
-                                replyItem.remove();
-
-                            } else if (notices.length > 0 && SN.U.belongsOnTimeline(notice)) {
-                                // Not a reply. If on our timeline, show it at the top!
-
-                                if ($('#' + notice.id).length === 0) {
-                                    var notice_irt_value = form.find('[name=inreplyto]').val();
-                                    var notice_irt = '#notices_primary #notice-' + notice_irt_value;
-                                    if ($('body')[0].id == 'conversation') {
-                                        if (notice_irt_value.length > 0 && $(notice_irt + ' .notices').length < 1) {
-                                            $(notice_irt).append('<ul class="notices"></ul>');
-                                        }
-                                        $($(notice_irt + ' .notices')[0]).append(notice);
-                                    } else {
-                                        notices.prepend(notice);
-                                    }
-                                    $('#' + notice.id)
-                                        .css({display: 'none'})
-                                        .fadeIn(2500);
-                                    SN.U.NoticeWithAttachment($('#' + notice.id));
-                                    SN.U.switchInputFormTab(null);
-                                }
-                            } else {
-                                // Not on a timeline that this belongs on?
-                                // Just show a success message.
-                                // @fixme inline
-                                showFeedback('success', $('title', data).text());
-                            }
-                        }
-                        form.resetForm();
-                        form.find('[name=inreplyto]').val('');
-                        form.find('.attach-status').remove();
-                        SN.U.FormNoticeEnhancements(form);
+                        SN.E.ajaxNoticePosted(form, data, textStatus);
                     }
                 },
                 complete: function (xhr, textStatus) {
@@ -820,7 +770,7 @@ var SN = { // StatusNet
 
             form
                 .addClass('dialogbox')
-                .append('<button class="close">&#215;</button>')
+                .append('<button class="close" title="' + SN.msg('popup_close_button') + '">&#215;</button>')
                 .closest('.notice-options')
                     .addClass('opaque');
 
@@ -1130,12 +1080,12 @@ var SN = { // StatusNet
                 label.attr('title', label.text());
 
                 check.change(function () {
-                    if (check.prop('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === null) {
+                    if (check.prop('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === undefined) {
                         label
                             .attr('title', NoticeDataGeo_text.ShareDisable)
                             .addClass('checked');
 
-                        if ($.cookie(SN.C.S.NoticeDataGeoCookie) === null || $.cookie(SN.C.S.NoticeDataGeoCookie) == 'disabled') {
+                        if ($.cookie(SN.C.S.NoticeDataGeoCookie) === undefined || $.cookie(SN.C.S.NoticeDataGeoCookie) == 'disabled') {
                             if (navigator.geolocation) {
                                 SN.U.NoticeGeoStatus(form, 'Requesting location from browser...');
                                 navigator.geolocation.getCurrentPosition(
@@ -1300,56 +1250,6 @@ var SN = { // StatusNet
             return date;
         },
 
-        /**
-         * Some sort of object interface for storing some structured
-         * information in a cookie.
-         *
-         * Appears to be used to save the last-used login nickname?
-         * That's something that browsers usually take care of for us
-         * these days, do we really need to do it? Does anything else
-         * use this interface?
-         *
-         * @fixme what is this?
-         * @fixme should this use non-cookie local storage when available?
-         */
-        StatusNetInstance: {
-            /**
-             * @fixme what is this?
-             */
-            Set: function (value) {
-                var SNI = SN.U.StatusNetInstance.Get();
-                if (SNI !== null) {
-                    value = $.extend(SNI, value);
-                }
-
-                $.cookie(
-                    SN.C.S.StatusNetInstance,
-                    JSON.stringify(value),
-                    {
-                        path: '/',
-                        expires: SN.U.GetFullYear(2029, 0, 1)
-                    });
-            },
-
-            /**
-             * @fixme what is this?
-             */
-            Get: function () {
-                var cookieValue = $.cookie(SN.C.S.StatusNetInstance);
-                if (cookieValue !== undefined) {
-                    return JSON.parse(cookieValue);
-                }
-                return null;
-            },
-
-            /**
-             * @fixme what is this?
-             */
-            Delete: function () {
-                $.cookie(SN.C.S.StatusNetInstance, null);
-            }
-        },
-
         /**
          * Check if the current page is a timeline where the current user's
          * posts should be displayed immediately on success.
@@ -1433,9 +1333,106 @@ var SN = { // StatusNet
             var extended = $(selector);
             extended.removeClass('extended_menu');
             return void(0);
+        },
+
+        /**
+         * Show a response feedback bit under a form.
+         *
+         * @param {Element} form: the new-notice form usually
+         * @param {String}  cls: CSS class name to use ('error' or 'success')
+         * @param {String}  text
+         * @access public
+         */
+        showFeedback: function (form, cls, text) {
+            form.append(
+                $('<p class="form_response"></p>')
+                    .addClass(cls)
+                    .text(text)
+            );
+        },
+
+        addCallback: function (ename, callback) {
+            // initialize to array if it's undefined
+            if (typeof SN._callbacks[ename] === 'undefined') {
+                SN._callbacks[ename] = [];
+            }
+            SN._callbacks[ename].push(callback);
+        },
+
+        runCallbacks: function (ename, data) {
+            if (typeof SN._callbacks[ename] === 'undefined') {
+                return;
+            }
+            for (cbname in SN._callbacks[ename]) {
+                SN._callbacks[ename][cbname](data);
+            }
         }
     },
 
+    E: {    /* Events */
+        /* SN.E.ajaxNoticePosted, called when a notice has been posted successfully via an AJAX form
+            @param  form        the originating form element
+            @param  data        data from success() callback
+            @param  textStatus  textStatus from success() callback
+        */
+        ajaxNoticePosted: function (form, data, textStatus) {
+            var commandResult = $('#' + SN.C.S.CommandResult, data);
+            if (commandResult.length > 0) {
+                SN.U.showFeedback(form, 'success', commandResult.text());
+            } else {
+                // New notice post was successful. If on our timeline, show it!
+                var notice = document._importNode($('li', data)[0], true);
+                var notices = $('#notices_primary .notices:first');
+                var replyItem = form.closest('li.notice-reply');
+
+                if (replyItem.length > 0) {
+                    // If this is an inline reply, remove the form...
+                    var list = form.closest('.threaded-replies');
+
+                    var id = $(notice).attr('id');
+                    if ($('#' + id).length == 0) {
+                        $(notice).insertBefore(replyItem);
+                    } // else Realtime came through before us...
+
+                    replyItem.remove();
+
+                } else if (notices.length > 0 && SN.U.belongsOnTimeline(notice)) {
+                    // Not a reply. If on our timeline, show it at the top!
+
+                    if ($('#' + notice.id).length === 0) {
+                        var notice_irt_value = form.find('[name=inreplyto]').val();
+                        var notice_irt = '#notices_primary #notice-' + notice_irt_value;
+                        if ($('body')[0].id == 'conversation') {
+                            if (notice_irt_value.length > 0 && $(notice_irt + ' .notices').length < 1) {
+                                $(notice_irt).append('<ul class="notices"></ul>');
+                            }
+                            $($(notice_irt + ' .notices')[0]).append(notice);
+                        } else {
+                            notices.prepend(notice);
+                        }
+                        $('#' + notice.id)
+                            .css({display: 'none'})
+                            .fadeIn(2500);
+                        SN.U.NoticeWithAttachment($('#' + notice.id));
+                        SN.U.switchInputFormTab(null);
+                    }
+                } else {
+                    // Not on a timeline that this belongs on?
+                    // Just show a success message.
+                    // @fixme inline
+                    SN.U.showFeedback(form, 'success', $('title', data).text());
+                }
+            }
+            form.resetForm();
+            form.find('[name=inreplyto]').val('');
+            form.find('.attach-status').remove();
+            SN.U.FormNoticeEnhancements(form);
+
+            SN.U.runCallbacks('notice_posted', {"notice": notice});
+        }, 
+    },
+
+
     Init: {
         /**
          * If user is logged in, run setup code for the new notice form:
@@ -1546,28 +1543,6 @@ var SN = { // StatusNet
             }
         },
 
-        /**
-         * Run setup code for login form:
-         *
-         * - loads saved last-used-nickname from cookie
-         * - sets event handler to save nickname to cookie on submit
-         *
-         * @fixme is this necessary? Browsers do their own form saving these days.
-         */
-        Login: function () {
-            if (SN.U.StatusNetInstance.Get() !== null) {
-                var nickname = SN.U.StatusNetInstance.Get().Nickname;
-                if (nickname !== null) {
-                    $('#form_login #nickname').val(nickname);
-                }
-            }
-
-            $('#form_login').on('submit', function () {
-                SN.U.StatusNetInstance.Set({Nickname: $('#form_login #nickname').val()});
-                return true;
-            });
-        },
-
         /**
          * Run setup for the ajax people tags editor
          *
@@ -1696,9 +1671,6 @@ $(function () {
     if ($('#content .entity_actions').length > 0) {
         SN.Init.EntityActions();
     }
-    if ($('#form_login').length > 0) {
-        SN.Init.Login();
-    }
     if ($('#profile_search_results').length > 0) {
         SN.Init.ProfileSearch();
     }