X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=js%2Futil.js;h=56aaf1f6f993e7139895b157f7e0d562db38932c;hb=503c05b74941c9274b8374876013d2f6ffa925a3;hp=eb4c8286a88f49b6953f9a9b3dd52c737774ca13;hpb=3b5966430ca1e445507431536cb2f90af350999b;p=quix0rs-gnu-social.git diff --git a/js/util.js b/js/util.js index eb4c8286a8..56aaf1f6f9 100644 --- a/js/util.js +++ b/js/util.js @@ -32,7 +32,6 @@ var SN = { // StatusNet MaxLength: 140, PatternUsername: /^[0-9a-zA-Z\-_.]*$/, HTTP20x30x: [200, 201, 202, 203, 204, 205, 206, 300, 301, 302, 303, 304, 305, 306, 307], - NoticeFormMaster: null // to be cloned from the one at top }, /** @@ -54,7 +53,7 @@ var SN = { // StatusNet NoticeDataGeo: 'notice_data-geo', NoticeDataGeoCookie: 'NoticeDataGeo', NoticeDataGeoSelected: 'notice_data-geo_selected', - StatusNetInstance:'StatusNetInstance' + StatusNetInstance: 'StatusNetInstance' } }, @@ -77,12 +76,11 @@ var SN = { // StatusNet * @param {String} key: string key name to pull from message index * @return matching localized message string */ - msg: function(key) { - if (typeof SN.messages[key] == "undefined") { + msg: function (key) { + if (SN.messages[key] === undefined) { return '[' + key + ']'; - } else { - return SN.messages[key]; } + return SN.messages[key]; }, U: { // Utils @@ -94,37 +92,36 @@ var SN = { // StatusNet * @param {jQuery} form: jQuery object whose first matching element is the form * @access private */ - FormNoticeEnhancements: function(form) { - if (jQuery.data(form[0], 'ElementData') === undefined) { - MaxLength = form.find('.count').text(); - if (typeof(MaxLength) == 'undefined') { - MaxLength = SN.C.I.MaxLength; + FormNoticeEnhancements: function (form) { + if ($.data(form[0], 'ElementData') === undefined) { + var MaxLength = form.find('.count').text(); + if (MaxLength === undefined) { + MaxLength = SN.C.I.MaxLength; } - jQuery.data(form[0], 'ElementData', {MaxLength:MaxLength}); + $.data(form[0], 'ElementData', {MaxLength: MaxLength}); SN.U.Counter(form); - NDT = form.find('.notice_data-text:first'); + var NDT = form.find('.notice_data-text:first'); - NDT.bind('keyup', function(e) { + NDT.on('keyup', function (e) { SN.U.Counter(form); }); - var delayedUpdate= function(e) { + var delayedUpdate = function (e) { // Cut and paste events fire *before* the operation, // so we need to trigger an update in a little bit. // This would be so much easier if the 'change' event // actually fired every time the value changed. :P - window.setTimeout(function() { + window.setTimeout(function () { SN.U.Counter(form); }, 50); }; // Note there's still no event for mouse-triggered 'delete'. - NDT.bind('cut', delayedUpdate) - .bind('paste', delayedUpdate); - } - else { - form.find('.count').text(jQuery.data(form[0], 'ElementData').MaxLength); + NDT.on('cut', delayedUpdate) + .on('paste', delayedUpdate); + } else { + form.find('.count').text($.data(form[0], 'ElementData').MaxLength); } }, @@ -142,10 +139,10 @@ var SN = { // StatusNet * @param {jQuery} form: jQuery object whose first element is the notice posting form * @access private */ - Counter: function(form) { + Counter: function (form) { SN.C.I.FormNoticeCurrent = form; - var MaxLength = jQuery.data(form[0], 'ElementData').MaxLength; + var MaxLength = $.data(form[0], 'ElementData').MaxLength; if (MaxLength <= 0) { return; @@ -182,7 +179,7 @@ var SN = { // StatusNet * @param {jQuery} form: jQuery object whose first element is the notice posting form * @return number of chars */ - CharacterCount: function(form) { + CharacterCount: function (form) { return form.find('.notice_data-text:first').val().length; }, @@ -193,7 +190,7 @@ var SN = { // StatusNet * @param {jQuery} form: jQuery object whose first element is the notice posting form * @access private */ - ClearCounterBlackout: function(form) { + ClearCounterBlackout: function (form) { // Allow keyup events to poke the counter again SN.C.I.CounterBlackout = false; // Check if the string changed since we last looked @@ -211,13 +208,12 @@ var SN = { // StatusNet * @param {String} url * @return string */ - RewriteAjaxAction: function(url) { + RewriteAjaxAction: function (url) { // Quick hack: rewrite AJAX submits to HTTPS if they'd fail otherwise. - if (document.location.protocol == 'https:' && url.substr(0, 5) == 'http:') { + if (document.location.protocol === 'https:' && url.substr(0, 5) === 'http:') { return url.replace(/^http:\/\/[^:\/]+/, 'https://' + document.location.host); - } else { - return url; } + return url; }, /** @@ -240,18 +236,18 @@ var SN = { // StatusNet * * @access public */ - FormXHR: function(form, onSuccess) { + FormXHR: function (form, onSuccess) { $.ajax({ type: 'POST', dataType: 'xml', url: SN.U.RewriteAjaxAction(form.attr('action')), data: form.serialize() + '&ajax=1', - beforeSend: function(xhr) { + beforeSend: function (xhr) { form .addClass(SN.C.S.Processing) .find('.submit') .addClass(SN.C.S.Disabled) - .attr(SN.C.S.Disabled, SN.C.S.Disabled); + .prop(SN.C.S.Disabled, true); }, error: function (xhr, textStatus, errorThrown) { // If the server end reported an error from StatusNet, @@ -261,32 +257,30 @@ var SN = { // StatusNet if (xhr.responseXML) { errorReported = $('#error', xhr.responseXML).text(); } - alert(errorReported || errorThrown || textStatus); - + window.alert(errorReported || errorThrown || textStatus); + // Restore the form to original state. // Hopefully. :D form .removeClass(SN.C.S.Processing) .find('.submit') .removeClass(SN.C.S.Disabled) - .removeAttr(SN.C.S.Disabled); + .prop(SN.C.S.Disabled, false); }, - success: function(data, textStatus) { - if (typeof($('form', data)[0]) != 'undefined') { - form_new = document._importNode($('form', data)[0], true); + success: function (data, textStatus) { + if ($('form', data)[0] !== undefined) { + var form_new = document._importNode($('form', data)[0], true); form.replaceWith(form_new); if (onSuccess) { onSuccess(); } - } - else if (typeof($('p', data)[0]) != 'undefined') { + } else if ($('p', data)[0] !== undefined) { form.replaceWith(document._importNode($('p', data)[0], true)); if (onSuccess) { onSuccess(); } - } - else { - alert('Unknown error.'); + } else { + window.alert('Unknown error.'); } } }); @@ -313,13 +307,12 @@ var SN = { // StatusNet * @fixme cookieValue is a global variable, but probably shouldn't be * @fixme saving the location cache cookies should be split out * @fixme some error messages are hardcoded english: needs i18n - * @fixme special-case for bookmarklet is confusing and uses a global var "self". Is this ok? * * @param {jQuery} form: jQuery object whose first element is a form * * @access public */ - FormNoticeXHR: function(form) { + FormNoticeXHR: function (form) { SN.C.I.NoticeDataGeo = {}; form.append(''); @@ -333,7 +326,7 @@ var SN = { // StatusNet * @param {String} text * @access private */ - var showFeedback = function(cls, text) { + var showFeedback = function (cls, text) { form.append( $('

') .addClass(cls) @@ -344,14 +337,14 @@ var SN = { // StatusNet /** * Hide the previous response feedback, if any. */ - var removeFeedback = function() { + var removeFeedback = function () { form.find('.form_response').remove(); }; form.ajaxForm({ dataType: 'xml', timeout: '60000', - beforeSend: function(formData) { + beforeSend: function (formData) { if (form.find('.notice_data-text:first').val() == '') { form.addClass(SN.C.S.Warning); return false; @@ -360,7 +353,7 @@ var SN = { // StatusNet .addClass(SN.C.S.Processing) .find('.submit') .addClass(SN.C.S.Disabled) - .attr(SN.C.S.Disabled, SN.C.S.Disabled); + .prop(SN.C.S.Disabled, true); SN.U.normalizeGeoData(form); @@ -371,48 +364,38 @@ var SN = { // StatusNet .removeClass(SN.C.S.Processing) .find('.submit') .removeClass(SN.C.S.Disabled) - .removeAttr(SN.C.S.Disabled, SN.C.S.Disabled); + .prop(SN.C.S.Disabled, false); 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.'); - } - else { + } else { var response = SN.U.GetResponseXML(xhr); - if ($('.'+SN.C.S.Error, response).length > 0) { - form.append(document._importNode($('.'+SN.C.S.Error, response)[0], true)); - } - else { - if (parseInt(xhr.status) === 0 || jQuery.inArray(parseInt(xhr.status), SN.C.I.HTTP20x30x) >= 0) { + if ($('.' + SN.C.S.Error, response).length > 0) { + form.append(document._importNode($('.' + SN.C.S.Error, response)[0], true)); + } else { + if (parseInt(xhr.status) === 0 || $.inArray(parseInt(xhr.status), SN.C.I.HTTP20x30x) >= 0) { form .resetForm() .find('.attach-status').remove(); SN.U.FormNoticeEnhancements(form); - } - else { + } 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.'); + 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.'); } } } }, - success: function(data, textStatus) { + success: function (data, textStatus) { removeFeedback(); - var errorResult = $('#'+SN.C.S.Error, data); + var errorResult = $('#' + SN.C.S.Error, data); if (errorResult.length > 0) { showFeedback('error', errorResult.text()); - } - else { - if($('body')[0].id == 'bookmarklet') { - // @fixme self is not referenced anywhere? - self.close(); - } - - var commandResult = $('#'+SN.C.S.CommandResult, data); + } else { + var commandResult = $('#' + SN.C.S.CommandResult, data); if (commandResult.length > 0) { showFeedback('success', commandResult.text()); - } - else { + } 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'); @@ -421,38 +404,33 @@ var SN = { // StatusNet if (replyItem.length > 0) { // If this is an inline reply, remove the form... var list = form.closest('.threaded-replies'); - var placeholder = list.find('.notice-reply-placeholder'); - replyItem.remove(); var id = $(notice).attr('id'); - if ($("#"+id).length == 0) { - $(notice).insertBefore(placeholder); - } else { - // Realtime came through before us... - } + if ($('#' + id).length == 0) { + $(notice).insertBefore(replyItem); + } // else Realtime came through before us... + + replyItem.remove(); - // ...and show the placeholder form. - placeholder.show(); } 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) { + 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) { + 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(''); } - $($(notice_irt+' .notices')[0]).append(notice); - } - else { + $($(notice_irt + ' .notices')[0]).append(notice); + } else { notices.prepend(notice); } - $('#'+notice.id) - .css({display:'none'}) + $('#' + notice.id) + .css({display: 'none'}) .fadeIn(2500); - SN.U.NoticeWithAttachment($('#'+notice.id)); - SN.U.switchInputFormTab("placeholder"); + SN.U.NoticeWithAttachment($('#' + notice.id)); + SN.U.switchInputFormTab(null); } } else { // Not on a timeline that this belongs on? @@ -467,75 +445,74 @@ var SN = { // StatusNet SN.U.FormNoticeEnhancements(form); } }, - complete: function(xhr, textStatus) { + complete: function (xhr, textStatus) { form .removeClass(SN.C.S.Processing) .find('.submit') - .removeAttr(SN.C.S.Disabled) + .prop(SN.C.S.Disabled, false) .removeClass(SN.C.S.Disabled); form.find('[name=lat]').val(SN.C.I.NoticeDataGeo.NLat); form.find('[name=lon]').val(SN.C.I.NoticeDataGeo.NLon); form.find('[name=location_ns]').val(SN.C.I.NoticeDataGeo.NLNS); form.find('[name=location_id]').val(SN.C.I.NoticeDataGeo.NLID); - form.find('[name=notice_data-geo]').attr('checked', SN.C.I.NoticeDataGeo.NDG); + form.find('[name=notice_data-geo]').prop('checked', SN.C.I.NoticeDataGeo.NDG); } }); }, - FormProfileSearchXHR: function(form) { + FormProfileSearchXHR: function (form) { $.ajax({ type: 'POST', dataType: 'xml', url: form.attr('action'), data: form.serialize() + '&ajax=1', - beforeSend: function(xhr) { + beforeSend: function (xhr) { form .addClass(SN.C.S.Processing) .find('.submit') .addClass(SN.C.S.Disabled) - .attr(SN.C.S.Disabled, SN.C.S.Disabled); + .prop(SN.C.S.Disabled, true); }, error: function (xhr, textStatus, errorThrown) { - alert(errorThrown || textStatus); + window.alert(errorThrown || textStatus); }, - success: function(data, textStatus) { + success: function (data, textStatus) { var results_placeholder = $('#profile_search_results'); - if (typeof($('ul', data)[0]) != 'undefined') { + if ($('ul', data)[0] !== undefined) { var list = document._importNode($('ul', data)[0], true); results_placeholder.replaceWith(list); - } - else { - var _error = $('
  • ').append(document._importNode($('p', data)[0], true)); + } else { + var _error = $('
  • ').append(document._importNode($('p', data)[0], true)); results_placeholder.html(_error); } form .removeClass(SN.C.S.Processing) .find('.submit') .removeClass(SN.C.S.Disabled) - .attr(SN.C.S.Disabled, false); + .prop(SN.C.S.Disabled, false); } }); }, - FormPeopletagsXHR: function(form) { + FormPeopletagsXHR: function (form) { $.ajax({ type: 'POST', dataType: 'xml', url: form.attr('action'), data: form.serialize() + '&ajax=1', - beforeSend: function(xhr) { + beforeSend: function (xhr) { form.find('.submit') .addClass(SN.C.S.Processing) .addClass(SN.C.S.Disabled) - .attr(SN.C.S.Disabled, SN.C.S.Disabled); + .prop(SN.C.S.Disabled, true); }, error: function (xhr, textStatus, errorThrown) { - alert(errorThrown || textStatus); + window.alert(errorThrown || textStatus); }, - success: function(data, textStatus) { + success: function (data, textStatus) { var results_placeholder = form.parents('.entity_tags'); - if (typeof($('.entity_tags', data)[0]) != 'undefined') { + if ($('.entity_tags', data)[0] !== undefined) { var tags = document._importNode($('.entity_tags', data)[0], true); $(tags).find('.editable').append($(''); + var attachStatus = $('
    '); attachStatus.find('code').text(filename); - attachStatus.find('button').click(function(){ + attachStatus.find('button').click(function () { attachStatus.remove(); NDA.val(''); @@ -905,9 +847,9 @@ var SN = { // StatusNet }); form.append(attachStatus); - if (typeof this.files == "object") { + if (typeof this.files === "object") { // Some newer browsers will let us fetch the files for preview. - for (var i = 0; i < this.files.length; i++) { + for (i = 0; i < this.files.length; i++) { SN.U.PreviewAttach(form, this.files[i]); } } @@ -921,13 +863,12 @@ var SN = { // StatusNet * @param {jQuery} form * @return int max size in bytes; 0 or negative means no limit */ - maxFileSize: function(form) { + maxFileSize: function (form) { var max = $(form).find('input[name=MAX_FILE_SIZE]').attr('value'); if (max) { return parseInt(max); - } else { - return 0; } + return 0; }, /** @@ -951,12 +892,12 @@ var SN = { // StatusNet * @todo detect pixel size? * @todo should we render a thumbnail to a canvas and then use the smaller image? */ - PreviewAttach: function(form, file) { + PreviewAttach: function (form, file) { var tooltip = file.type + ' ' + Math.round(file.size / 1024) + 'KB'; var preview = true; var blobAsDataURL; - if (typeof window.createObjectURL != "undefined") { + if (window.createObjectURL !== undefined) { /** * createObjectURL lets us reference the file directly from an * This produces a compact URL with an opaque reference to the file, @@ -967,10 +908,10 @@ var SN = { // StatusNet * - Safari 5.0.2: no * - Chrome 8.0.552.210: works! */ - blobAsDataURL = function(blob, callback) { + blobAsDataURL = function (blob, callback) { callback(window.createObjectURL(blob)); - } - } else if (typeof window.FileReader != "undefined") { + }; + } else if (window.FileReader !== undefined) { /** * FileAPI's FileReader can build a data URL from a blob's contents, * but it must read the file and build it asynchronously. This means @@ -981,13 +922,13 @@ var SN = { // StatusNet * - Safari 5.0.2: no * - Chrome 8.0.552.210: works! */ - blobAsDataURL = function(blob, callback) { + blobAsDataURL = function (blob, callback) { var reader = new FileReader(); - reader.onload = function(event) { + reader.onload = function (event) { callback(reader.result); - } + }; reader.readAsDataURL(blob); - } + }; } else { preview = false; } @@ -1005,7 +946,7 @@ var SN = { // StatusNet } if (preview) { - blobAsDataURL(file, function(url) { + blobAsDataURL(file, function (url) { var img = $('') .attr('title', tooltip) .attr('alt', tooltip) @@ -1033,10 +974,10 @@ var SN = { // StatusNet * hard time figuring out if it's working or fixing if it's wrong. * */ - NoticeLocationAttach: function(form) { + NoticeLocationAttach: function (form) { // @fixme this should not be tied to the main notice form, as there may be multiple notice forms... - var NLat = form.find('[name=lat]') - var NLon = form.find('[name=lon]') + var NLat = form.find('[name=lat]'); + var NLon = form.find('[name=lon]'); var NLNS = form.find('[name=location_ns]').val(); var NLID = form.find('[name=location_id]').val(); var NLN = ''; // @fixme @@ -1046,14 +987,14 @@ var SN = { // StatusNet function removeNoticeDataGeo(error) { label - .attr('title', jQuery.trim(label.text())) + .attr('title', $.trim(label.text())) .removeClass('checked'); form.find('[name=lat]').val(''); form.find('[name=lon]').val(''); form.find('[name=location_ns]').val(''); form.find('[name=location_id]').val(''); - form.find('[name=notice_data-geo]').attr('checked', false); + form.find('[name=notice_data-geo]').prop('checked', false); $.cookie(SN.C.S.NoticeDataGeoCookie, 'disabled', { path: '/' }); @@ -1067,23 +1008,22 @@ var SN = { // StatusNet function getJSONgeocodeURL(geocodeURL, data) { SN.U.NoticeGeoStatus(form, 'Looking up place name...'); - $.getJSON(geocodeURL, data, function(location) { - var lns, lid; + $.getJSON(geocodeURL, data, function (location) { + var lns, lid, NLN_text; - if (typeof(location.location_ns) != 'undefined') { + if (location.location_ns !== undefined) { form.find('[name=location_ns]').val(location.location_ns); lns = location.location_ns; } - if (typeof(location.location_id) != 'undefined') { + if (location.location_id !== undefined) { form.find('[name=location_id]').val(location.location_id); lid = location.location_id; } - if (typeof(location.name) == 'undefined') { + if (location.name === undefined) { NLN_text = data.lat + ';' + data.lon; - } - else { + } else { NLN_text = location.name; } @@ -1095,7 +1035,7 @@ var SN = { // StatusNet form.find('[name=lon]').val(data.lon); form.find('[name=location_ns]').val(lns); form.find('[name=location_id]').val(lid); - form.find('[name=notice_data-geo]').attr('checked', true); + form.find('[name=notice_data-geo]').prop('checked', true); var cookieValue = { NLat: data.lat, @@ -1113,20 +1053,18 @@ var SN = { // StatusNet if (check.length > 0) { if ($.cookie(SN.C.S.NoticeDataGeoCookie) == 'disabled') { - check.attr('checked', false); - } - else { - check.attr('checked', true); + check.prop('checked', false); + } else { + check.prop('checked', true); } var NGW = form.find('.notice_data-geo_wrap'); var geocodeURL = NGW.attr('data-api'); - label - .attr('title', label.text()); + label.attr('title', label.text()); - check.change(function() { - if (check.attr('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === null) { + check.change(function () { + if (check.prop('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === null) { label .attr('title', NoticeDataGeo_text.ShareDisable) .addClass('checked'); @@ -1135,7 +1073,7 @@ var SN = { // StatusNet if (navigator.geolocation) { SN.U.NoticeGeoStatus(form, 'Requesting location from browser...'); navigator.geolocation.getCurrentPosition( - function(position) { + function (position) { form.find('[name=lat]').val(position.coords.latitude); form.find('[name=lon]').val(position.coords.longitude); @@ -1148,13 +1086,13 @@ var SN = { // StatusNet getJSONgeocodeURL(geocodeURL, data); }, - function(error) { + function (error) { switch(error.code) { case error.PERMISSION_DENIED: removeNoticeDataGeo('Location permission denied.'); break; case error.TIMEOUT: - //$('#'+SN.C.S.NoticeDataGeo).attr('checked', false); + //$('#' + SN.C.S.NoticeDataGeo).prop('checked', false); removeNoticeDataGeo('Location lookup timeout.'); break; } @@ -1164,8 +1102,7 @@ var SN = { // StatusNet timeout: 10000 } ); - } - else { + } else { if (NLat.length > 0 && NLon.length > 0) { var data = { lat: NLat, @@ -1174,30 +1111,31 @@ var SN = { // StatusNet }; getJSONgeocodeURL(geocodeURL, data); - } - else { + } else { removeNoticeDataGeo(); check.remove(); label.remove(); } } + } else { + try { + var cookieValue = JSON.parse($.cookie(SN.C.S.NoticeDataGeoCookie)); + + form.find('[name=lat]').val(cookieValue.NLat); + form.find('[name=lon]').val(cookieValue.NLon); + form.find('[name=location_ns]').val(cookieValue.NLNS); + form.find('[name=location_id]').val(cookieValue.NLID); + form.find('[name=notice_data-geo]').prop('checked', cookieValue.NDG); + + SN.U.NoticeGeoStatus(form, cookieValue.NLN, cookieValue.NLat, cookieValue.NLon, cookieValue.NLNU); + label + .attr('title', NoticeDataGeo_text.ShareDisable + ' (' + cookieValue.NLN + ')') + .addClass('checked'); + } catch (e) { + console.log('Parsing error:', e); + } } - else { - var cookieValue = JSON.parse($.cookie(SN.C.S.NoticeDataGeoCookie)); - - form.find('[name=lat]').val(cookieValue.NLat); - form.find('[name=lon]').val(cookieValue.NLon); - form.find('[name=location_ns]').val(cookieValue.NLNS); - form.find('[name=location_id]').val(cookieValue.NLID); - form.find('[name=notice_data-geo]').attr('checked', cookieValue.NDG); - - SN.U.NoticeGeoStatus(form, cookieValue.NLN, cookieValue.NLat, cookieValue.NLon, cookieValue.NLNU); - label - .attr('title', NoticeDataGeo_text.ShareDisable + ' (' + cookieValue.NLN + ')') - .addClass('checked'); - } - } - else { + } else { removeNoticeDataGeo(); } }).change(); @@ -1213,13 +1151,13 @@ var SN = { // StatusNet * @param {String} lon (optional) * @param {String} url (optional) */ - NoticeGeoStatus: function(form, status, lat, lon, url) + NoticeGeoStatus: function (form, status, lat, lon, url) { var wrapper = form.find('.geo_status_wrapper'); if (wrapper.length == 0) { - wrapper = $('
    '); - wrapper.find('button.close').click(function() { - form.find('[name=notice_data-geo]').removeAttr('checked').change(); + wrapper = $('
    '); + wrapper.find('button.close').click(function () { + form.find('[name=notice_data-geo]').prop('checked', false).change(); return false; }); form.append(wrapper); @@ -1253,27 +1191,26 @@ var SN = { // StatusNet * * @fixme breaks ability to open link in new window? */ - NewDirectMessage: function() { + NewDirectMessage: function () { NDM = $('.entity_send-a-message a'); - NDM.attr({'href':NDM.attr('href')+'&ajax=1'}); - NDM.bind('click', function() { + NDM.attr({'href': NDM.attr('href') + '&ajax=1'}); + NDM.on('click', function () { var NDMF = $('.entity_send-a-message form'); if (NDMF.length === 0) { $(this).addClass(SN.C.S.Processing); - $.get(NDM.attr('href'), null, function(data) { + $.get(NDM.attr('href'), null, function (data) { $('.entity_send-a-message').append(document._importNode($('form', data)[0], true)); NDMF = $('.entity_send-a-message .form_notice'); SN.U.FormNoticeXHR(NDMF); SN.U.FormNoticeEnhancements(NDMF); NDMF.append(''); - $('.entity_send-a-message button').click(function(){ + $('.entity_send-a-message button').click(function () { NDMF.hide(); return false; }); NDM.removeClass(SN.C.S.Processing); }); - } - else { + } else { NDMF.show(); $('.entity_send-a-message textarea').focus(); } @@ -1290,7 +1227,7 @@ var SN = { // StatusNet * @param {number} day: 1 == 1 * @return {Date} */ - GetFullYear: function(year, month, day) { + GetFullYear: function (year, month, day) { var date = new Date(); date.setFullYear(year, month, day); @@ -1313,7 +1250,7 @@ var SN = { // StatusNet /** * @fixme what is this? */ - Set: function(value) { + Set: function (value) { var SNI = SN.U.StatusNetInstance.Get(); if (SNI !== null) { value = $.extend(SNI, value); @@ -1331,9 +1268,9 @@ var SN = { // StatusNet /** * @fixme what is this? */ - Get: function() { + Get: function () { var cookieValue = $.cookie(SN.C.S.StatusNetInstance); - if (cookieValue !== null) { + if (cookieValue !== undefined) { return JSON.parse(cookieValue); } return null; @@ -1342,7 +1279,7 @@ var SN = { // StatusNet /** * @fixme what is this? */ - Delete: function() { + Delete: function () { $.cookie(SN.C.S.StatusNetInstance, null); } }, @@ -1357,7 +1294,7 @@ var SN = { // StatusNet * @param {DOMElement} notice: HTML chunk with formatted notice * @return boolean */ - belongsOnTimeline: function(notice) { + belongsOnTimeline: function (notice) { var action = $("body").attr('id'); if (action == 'public') { return true; @@ -1365,7 +1302,7 @@ var SN = { // StatusNet var profileLink = $('#nav_profile a').attr('href'); if (profileLink) { - var authorUrl = $(notice).find('.vcard.author a.url').attr('href'); + var authorUrl = $(notice).find('.h-card.p-author').attr('href'); if (authorUrl == profileLink) { if (action == 'all' || action == 'showstream') { // Posts always show on your own friends and profile streams. @@ -1378,7 +1315,7 @@ var SN = { // StatusNet // Mismatch between id-based and name-based user/group links currently complicates // the lookup, since all our inline mentions contain the absolute links but the // UI links currently on the page use malleable names. - + return false; }, @@ -1389,15 +1326,12 @@ var SN = { // StatusNet * * @param {String} tag */ - switchInputFormTab: function(tag) { - // The one that's current isn't current anymore - $('.input_form_nav_tab.current').removeClass('current'); - if (tag == 'placeholder') { - // Hack: when showing the placeholder, mark the tab - // as current for 'Status'. - $('#input_form_nav_status').addClass('current'); - } else { - $('#input_form_nav_'+tag).addClass('current'); + switchInputFormTab: function (tag, setFocus) { + if (typeof setFocus === 'undefined') { setFocus = true; } + // The one that's current isn't current anymore + $('.input_form_nav_tab.current').removeClass('current'); + if (tag != null) { + $('#input_form_nav_' + tag).addClass('current'); } // Don't remove 'current' if we also have the "nonav" class. @@ -1408,15 +1342,32 @@ var SN = { // StatusNet return; } - $('.input_form.current').removeClass('current'); - $('#input_form_'+tag) - .addClass('current') - .find('.ajax-notice').each(function() { - var form = $(this); - SN.Init.NoticeFormSetup(form); - }) - .find('.notice_data-text').focus(); - } + $('.input_form.current').removeClass('current'); + if (tag == null) { + // we're done here, no new inputform to focus on + return false; + } + + var noticeForm = $('#input_form_' + tag) + .addClass('current') + .find('.ajax-notice').each(function () { + var form = $(this); + SN.Init.NoticeFormSetup(form); + }); + if (setFocus) { + noticeForm.find('.notice_data-text').focus(); + } + + return false; + }, + + showMoreMenuItems: function (menuid) { + $('#' + menuid + ' .more_link').remove(); + var selector = '#' + menuid + ' .extended_menu'; + var extended = $(selector); + extended.removeClass('extended_menu'); + return void(0); + } }, Init: { @@ -1428,37 +1379,23 @@ var SN = { // StatusNet * - location events * - file upload events */ - NoticeForm: function() { + NoticeForm: function () { if ($('body.user_in').length > 0) { // SN.Init.NoticeFormSetup() will get run // when forms get displayed for the first time... - // Hack to initialize the placeholder at top - $('#input_form_placeholder input.placeholder').focus(function() { - SN.U.switchInputFormTab("status"); + // Initialize the input form field + $('#input_form_nav .input_form_nav_tab.current').each(function () { + current_tab_id = $(this).attr('id').substring('input_form_nav_'.length); + SN.U.switchInputFormTab(current_tab_id, false); }); // Make inline reply forms self-close when clicking out. - $('body').bind('click', function(e) { - var currentForm = $('#content .input_forms div.current'); - if (currentForm.length > 0) { - if ($('#content .input_forms').has(e.target).length == 0) { - // If all fields are empty, switch back to the placeholder. - var fields = currentForm.find('textarea, input[type=text], input[type=""]'); - var anything = false; - fields.each(function() { - anything = anything || $(this).val(); - }); - if (!anything) { - SN.U.switchInputFormTab("placeholder"); - } - } - } - + $('body').on('click', function (e) { var openReplies = $('li.notice-reply'); if (openReplies.length > 0) { var target = $(e.target); - openReplies.each(function() { + openReplies.each(function () { // Did we click outside this one? var replyItem = $(this); if (replyItem.has(e.target).length == 0) { @@ -1467,7 +1404,7 @@ var SN = { // StatusNet // Only close if there's been no edit. if (cur == '' || cur == textarea.data('initialText')) { var parentNotice = replyItem.closest('li.notice'); - replyItem.remove(); + replyItem.hide(); parentNotice.find('li.notice-reply-placeholder').show(); } } @@ -1476,8 +1413,7 @@ var SN = { // StatusNet }); // Infield labels for notice form inputs. - $('fieldset fieldset label').inFieldLabels({ fadeOpacity:0 }); - + $('.input_forms fieldset fieldset label').inFieldLabels({ fadeOpacity:0 }); } }, @@ -1488,14 +1424,15 @@ var SN = { // StatusNet * * @param {jQuery} form */ - NoticeFormSetup: function(form) { - if (!form.data('NoticeFormSetup')) { - SN.U.NoticeLocationAttach(form); - SN.U.FormNoticeXHR(form); - SN.U.FormNoticeEnhancements(form); - SN.U.NoticeDataAttach(form); - form.data('NoticeFormSetup', true); + NoticeFormSetup: function (form) { + if (form.data('NoticeFormSetup')) { + return false; } + SN.U.NoticeLocationAttach(form); + SN.U.FormNoticeXHR(form); + SN.U.FormNoticeEnhancements(form); + SN.U.NoticeDataAttach(form); + form.data('NoticeFormSetup', true); }, /** @@ -1504,12 +1441,8 @@ var SN = { // StatusNet * - AJAX submission for fave/repeat/reply (if logged in) * - Attachment link extras ('more' links) */ - Notices: function() { + Notices: function () { if ($('body.user_in').length > 0) { - var masterForm = $('.form_notice:first'); - if (masterForm.length > 0) { - SN.C.I.NoticeFormMaster = document._importNode(masterForm[0], true); - } SN.U.NoticeRepeat(); SN.U.NoticeReply(); SN.U.NoticeInlineReplySetup(); @@ -1524,25 +1457,25 @@ var SN = { // StatusNet * - AJAX submission for sub/unsub/join/leave/nudge * - AJAX form popup for direct-message */ - EntityActions: function() { + 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; }); - $('.form_peopletag_subscribe').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_peopletag_unsubscribe').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_user_add_peopletag').live('click', function() { SN.U.FormXHR($(this)); return false; }); - $('.form_user_remove_peopletag').live('click', function() { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_user_subscribe', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_user_unsubscribe', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_group_join', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_group_leave', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_user_nudge', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_peopletag_subscribe', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_peopletag_unsubscribe', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_user_add_peopletag', function () { SN.U.FormXHR($(this)); return false; }); + $(document).on('click', '.form_user_remove_peopletag', function () { SN.U.FormXHR($(this)); return false; }); SN.U.NewDirectMessage(); } }, - ProfileSearch: function() { + ProfileSearch: function () { if ($('body.user_in').length > 0) { - $('.form_peopletag_edit_user_search input.submit').live('click', function() { + $(document).on('click', '.form_peopletag_edit_user_search input.submit', function () { SN.U.FormProfileSearchXHR($(this).parents('form')); return false; }); } @@ -1556,7 +1489,7 @@ var SN = { // StatusNet * * @fixme is this necessary? Browsers do their own form saving these days. */ - Login: function() { + Login: function () { if (SN.U.StatusNetInstance.Get() !== null) { var nickname = SN.U.StatusNetInstance.Get().Nickname; if (nickname !== null) { @@ -1564,66 +1497,12 @@ var SN = { // StatusNet } } - $('#form_login').bind('submit', function() { + $('#form_login').on('submit', function () { SN.U.StatusNetInstance.Set({Nickname: $('#form_login #nickname').val()}); return true; }); }, - /** - * Called when a people tag edit box is shown in the interface - * - * - loads the jQuery UI autocomplete plugin - * - sets event handlers for tag completion - * - */ - PeopletagAutocomplete: function(txtBox) { - var split = function(val) { - return val.split( /\s+/ ); - } - var extractLast = function(term) { - return split(term).pop(); - } - - // don't navigate away from the field on tab when selecting an item - txtBox.live( "keydown", function( event ) { - if ( event.keyCode === $.ui.keyCode.TAB && - $(this).data( "autocomplete" ).menu.active ) { - event.preventDefault(); - } - }).autocomplete({ - minLength: 0, - source: function(request, response) { - // delegate back to autocomplete, but extract the last term - response($.ui.autocomplete.filter( - SN.C.PtagACData, extractLast(request.term))); - }, - focus: function() { - return false; - }, - select: function(event, ui) { - var terms = split(this.value); - terms.pop(); - terms.push(ui.item.value); - terms.push(""); - this.value = terms.join(" "); - return false; - } - }).data('autocomplete')._renderItem = function(ul, item) { - // FIXME: with jQuery UI you cannot have it highlight the match - var _l = '' + item.tag - + ' ' + item.mode + '' - + '' + item.freq + '' - - return $("
  • ") - .addClass('mode-' + item.mode) - .addClass('ptag-ac-line') - .data("item.autocomplete", item) - .append(_l) - .appendTo(ul); - } - }, - /** * Run setup for the ajax people tags editor * @@ -1633,10 +1512,10 @@ var SN = { // StatusNet * or if it is stale. * */ - PeopleTags: function() { + PeopleTags: function () { $('.user_profile_tags .editable').append($('