Index: branches/5.2.x/core/admin_templates/js/script.js =================================================================== diff -u -N -r16276 -r16339 --- branches/5.2.x/core/admin_templates/js/script.js (.../script.js) (revision 16276) +++ branches/5.2.x/core/admin_templates/js/script.js (.../script.js) (revision 16339) @@ -365,7 +365,7 @@ set_hidden_field('events[trans]', 'OnLoad'); var $regex = new RegExp('(.*)\?env=(' + document.getElementById('sid').value + ')?-(.*?):(.*)'); - var $t = $regex.exec(url)[3]; + var $t = $regex.exec(rawurldecode(url))[3]; $kf.target = wnd; submit_event(prefix, '', $t, url); @@ -548,7 +548,7 @@ function openSelector($prefix, $url, $dst_field, $window_size, $event) { // get template name from url var $regex = new RegExp('(.*)\?env=(' + document.getElementById('sid').value + ')?-(.*?):(m[^:]+)'); - $regex = $regex.exec($url); + $regex = $regex.exec(rawurldecode($url)); var $t = $regex[3]; @@ -1852,7 +1852,7 @@ // setTimeout allows to call method indirectly. Without it whole idea won't work 2nd time (try adding 2 relations one after another) setTimeout( function () { - openSelector('adm', $ru.replace(/%5C/g, '\\') + '&merge_opener_stack=1'); + openSelector('adm', $ru + '&merge_opener_stack=1'); }, 200 ); @@ -1863,7 +1863,7 @@ window.focus(); if ( !(($force_skip_refresh === true) || (typeof $skip_refresh != 'undefined' && $skip_refresh)) ) { - window.location.href = $redirect_url.replace(/%5C/g, '\\'); + window.location.href = rawurldecode($redirect_url); } } @@ -1874,6 +1874,20 @@ return document.getElementById($prepend + $mask.replace('#FIELD_NAME#', $field) + $append); } +function rawurldecode(str) { + + if ( str.indexOf('?') != -1 ) { + var $parts = str.split('?', 2); + + return $parts[0] + ($parts.length == 2 ? '?' + rawurldecode($parts[1]) : ''); + } + + return decodeURIComponent((str + '').replace(/%(?![\da-f]{2})/gi, function () { + // PHP tolerates poorly formed escape sequences + return '%25'; + })); +} + Array.prototype.each = function ($callback) { var $result = null;