diff --git a/js/util.js b/js/util.js index cee238836a..0bda55b602 100644 --- a/js/util.js +++ b/js/util.js @@ -57,6 +57,9 @@ var SN = { // StatusNet } }, + V: { // Variables + }, + /** * Map of localized message strings exported to script from the PHP * side via Action::getScriptMessages(). @@ -216,6 +219,18 @@ var SN = { // StatusNet return url; }, + FormNoticeUniqueID: function (form) { + var oldId = form.attr('id'); + 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 () { + var newAttr = $(this).attr(attrs[key]).replace(oldId, newId); + $(this).attr(attrs[key], newAttr); + }); + } + }, + /** * Grabs form data and submits it asynchronously, with 'ajax=1' * parameter added to the rest. @@ -699,27 +714,38 @@ var SN = { // StatusNet var replyItem = $('li.notice-reply', list); if (replyItem.length == 0) { replyItem = $('
'); - - // Fetch a fresh copy of the notice form over AJAX. - var url = $('#input_form_status > form').attr('action'); - $.ajax({ - url: url, - data: {ajax: 1, inreplyto: id}, - success: function (data, textStatus, xhr) { - var formEl = document._importNode($('form', data)[0], true); - replyForm = $(formEl); - replyItem.append(replyForm); - list.append(replyItem); - - SN.Init.NoticeFormSetup(replyForm); - nextStep(); - }, - }); - } else { - replyForm = replyItem.children('form'); - SN.Init.NoticeFormSetup(replyForm); - nextStep(); } + replyForm = replyItem.children('form'); + if (replyForm.length == 0) { + // Let's try another trick to avoid fetching by URL + var noticeForm = $('#input_form_status > form'); + if (noticeForm.length == 0) { + // No notice form found on the page, so let's just + // fetch a fresh copy of the notice form over AJAX. + $.ajax({ + url: SN.V.urlNewNotice, + data: {ajax: 1, inreplyto: id}, + success: function (data, textStatus, xhr) { + var formEl = document._importNode($('form', data)[0], true); + replyForm = $(formEl); + replyItem.append(replyForm); + list.append(replyItem); + + SN.Init.NoticeFormSetup(replyForm); + nextStep(); + }, + }); + // We do everything relevant in 'success' above + return; + } + replyForm = noticeForm.clone(); + SN.Init.NoticeFormSetup(replyForm); + replyItem.append(replyForm); + list.append(replyItem); + } + // replyForm is set, we're not fetching by URL... + // Next setp is to configure in-reply-to etc. + nextStep(); }, /** @@ -1466,6 +1492,7 @@ var SN = { // StatusNet return false; } SN.U.NoticeLocationAttach(form); + SN.U.FormNoticeUniqueID(form); SN.U.FormNoticeXHR(form); SN.U.FormNoticeEnhancements(form); SN.U.NoticeDataAttach(form); diff --git a/lib/action.php b/lib/action.php index 14d0fe8057..5627b73b6c 100644 --- a/lib/action.php +++ b/lib/action.php @@ -431,6 +431,7 @@ class Action extends HTMLOutputter // lawsuit $this->inlineScript('var _peopletagAC = "' . common_local_url('peopletagautocomplete') . '";'); $this->showScriptMessages(); + $this->showScriptVariables(); // Anti-framing code to avoid clickjacking attacks in older browsers. // This will show a blank page if the page is being framed, which is // consistent with the behavior of the 'X-Frame-Options: SAMEORIGIN' @@ -473,6 +474,19 @@ class Action extends HTMLOutputter // lawsuit return $messages; } + protected function showScriptVariables() + { + $vars = array(); + + if (Event::handle('StartScriptVariables', array($this, &$vars))) { + $vars['urlNewNotice'] = common_local_url('newnotice'); + } + if (!empty($vars)) { + $this->inlineScript('SN.V = ' . json_encode($vars)); + } + return $vars; + } + /** * If the action will need localizable text strings, export them here like so: *