/*global SelectBox, interpolate*/ // Handles related-objects functionality: lookup link for raw_id_fields // and Add Another links. (function() { 'use strict'; function html_unescape(text) { // Unescape a string that was escaped using django.utils.html.escape. text = text.replace(/</g, '<'); text = text.replace(/>/g, '>'); text = text.replace(/"/g, '"'); text = text.replace(/'/g, "'"); text = text.replace(/&/g, '&'); return text; } // IE doesn't accept periods or dashes in the window name, but the element IDs // we use to generate popup window names may contain them, therefore we map them // to allowed characters in a reversible way so that we can locate the correct // element when the popup window is dismissed. function id_to_windowname(text) { text = text.replace(/\./g, '__dot__'); text = text.replace(/\-/g, '__dash__'); return text; } function windowname_to_id(text) { text = text.replace(/__dot__/g, '.'); text = text.replace(/__dash__/g, '-'); return text; } function showAdminPopup(triggeringLink, name_regexp, add_popup) { var name = triggeringLink.id.replace(name_regexp, ''); name = id_to_windowname(name); var href = triggeringLink.href; if (add_popup) { if (href.indexOf('?') === -1) { href += '?_popup=1'; } else { href += '&_popup=1'; } } var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); win.focus(); return false; } function showRelatedObjectLookupPopup(triggeringLink) { return showAdminPopup(triggeringLink, /^lookup_/, true); } function dismissRelatedLookupPopup(win, chosenId) { var name = windowname_to_id(win.name); var elem = document.getElementById(name); if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { elem.value += ',' + chosenId; } else { document.getElementById(name).value = chosenId; } win.close(); } function showRelatedObjectPopup(triggeringLink) { return showAdminPopup(triggeringLink, /^(change|add|delete)_/, false); } function updateRelatedObjectLinks(triggeringLink) { var $this = django.jQuery(triggeringLink); var siblings = $this.nextAll('.change-related, .delete-related'); if (!siblings.length) { return; } var value = $this.val(); if (value) { siblings.each(function() { var elm = django.jQuery(this); elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); }); } else { siblings.removeAttr('href'); } } function dismissAddRelatedObjectPopup(win, newId, newRepr) { // newId and newRepr are expected to have previously been escaped by // django.utils.html.escape. newId = html_unescape(newId); newRepr = html_unescape(newRepr); var name = windowname_to_id(win.name); var elem = document.getElementById(name); if (elem) { var elemName = elem.nodeName.toUpperCase(); if (elemName === 'SELECT') { elem.options[elem.options.length] = new Option(newRepr, newId, true, true); } else if (elemName === 'INPUT') { if (elem.className.indexOf('vManyToManyRawIdAdminField') !== -1 && elem.value) { elem.value += ',' + newId; } else { elem.value = newId; } } // Trigger a change event to update related links if required. django.jQuery(elem).trigger('change'); } else { var toId = name + "_to"; var o = new Option(newRepr, newId); SelectBox.add_to_cache(toId, o); SelectBox.redisplay(toId); } win.close(); } function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) { objId = html_unescape(objId); newRepr = html_unescape(newRepr); var id = windowname_to_id(win.name).replace(/^edit_/, ''); var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); var selects = django.jQuery(selectsSelector); selects.find('option').each(function() { if (this.value === objId) { this.innerHTML = newRepr; this.value = newId; } }); win.close(); } function dismissDeleteRelatedObjectPopup(win, objId) { objId = html_unescape(objId); var id = windowname_to_id(win.name).replace(/^delete_/, ''); var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]); var selects = django.jQuery(selectsSelector); selects.find('option').each(function() { if (this.value === objId) { django.jQuery(this).remove(); } }).trigger('change'); win.close(); } // Global for testing purposes window.html_unescape = html_unescape; window.id_to_windowname = id_to_windowname; window.windowname_to_id = windowname_to_id; window.showRelatedObjectLookupPopup = showRelatedObjectLookupPopup; window.dismissRelatedLookupPopup = dismissRelatedLookupPopup; window.showRelatedObjectPopup = showRelatedObjectPopup; window.updateRelatedObjectLinks = updateRelatedObjectLinks; window.dismissAddRelatedObjectPopup = dismissAddRelatedObjectPopup; window.dismissChangeRelatedObjectPopup = dismissChangeRelatedObjectPopup; window.dismissDeleteRelatedObjectPopup = dismissDeleteRelatedObjectPopup; // Kept for backward compatibility window.showAddAnotherPopup = showRelatedObjectPopup; window.dismissAddAnotherPopup = dismissAddRelatedObjectPopup; })();