mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2026-02-07 15:46:20 +01:00
Reformatted code for easy reading.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
var SelectBox = {
|
||||
cache: new Object(),
|
||||
init: function(id) {
|
||||
init: function (id) {
|
||||
var box = document.getElementById(id);
|
||||
var node;
|
||||
SelectBox.cache[id] = new Array();
|
||||
@@ -9,7 +9,7 @@ var SelectBox = {
|
||||
cache.push({value: node.value, text: node.text, displayed: 1});
|
||||
}
|
||||
},
|
||||
redisplay: function(id) {
|
||||
redisplay: function (id) {
|
||||
// Repopulate HTML select box from cache
|
||||
var box = document.getElementById(id);
|
||||
box.options.length = 0; // clear all options
|
||||
@@ -20,7 +20,7 @@ var SelectBox = {
|
||||
}
|
||||
}
|
||||
},
|
||||
filter: function(id, text) {
|
||||
filter: function (id, text) {
|
||||
// Redisplay the HTML select box, displaying only the choices containing ALL
|
||||
// the words in text. (It's an AND search.)
|
||||
var tokens = text.toLowerCase().split(/\s+/);
|
||||
@@ -35,7 +35,7 @@ var SelectBox = {
|
||||
}
|
||||
SelectBox.redisplay(id);
|
||||
},
|
||||
delete_from_cache: function(id, value) {
|
||||
delete_from_cache: function (id, value) {
|
||||
var node, delete_index = null;
|
||||
for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
|
||||
if (node.value == value) {
|
||||
@@ -45,14 +45,14 @@ var SelectBox = {
|
||||
}
|
||||
var j = SelectBox.cache[id].length - 1;
|
||||
for (var i = delete_index; i < j; i++) {
|
||||
SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
|
||||
SelectBox.cache[id][i] = SelectBox.cache[id][i + 1];
|
||||
}
|
||||
SelectBox.cache[id].length--;
|
||||
},
|
||||
add_to_cache: function(id, option) {
|
||||
add_to_cache: function (id, option) {
|
||||
SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
|
||||
},
|
||||
cache_contains: function(id, value) {
|
||||
cache_contains: function (id, value) {
|
||||
// Check if an item is contained in the cache
|
||||
var node;
|
||||
for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
|
||||
@@ -62,7 +62,7 @@ var SelectBox = {
|
||||
}
|
||||
return false;
|
||||
},
|
||||
move: function(from, to) {
|
||||
move: function (from, to) {
|
||||
var from_box = document.getElementById(from);
|
||||
var to_box = document.getElementById(to);
|
||||
var option;
|
||||
@@ -75,7 +75,7 @@ var SelectBox = {
|
||||
SelectBox.redisplay(from);
|
||||
SelectBox.redisplay(to);
|
||||
},
|
||||
move_all: function(from, to) {
|
||||
move_all: function (from, to) {
|
||||
var from_box = document.getElementById(from);
|
||||
var to_box = document.getElementById(to);
|
||||
var option;
|
||||
@@ -88,8 +88,8 @@ var SelectBox = {
|
||||
SelectBox.redisplay(from);
|
||||
SelectBox.redisplay(to);
|
||||
},
|
||||
sort: function(id) {
|
||||
SelectBox.cache[id].sort( function(a, b) {
|
||||
sort: function (id) {
|
||||
SelectBox.cache[id].sort(function (a, b) {
|
||||
a = a.text.toLowerCase();
|
||||
b = b.text.toLowerCase();
|
||||
try {
|
||||
@@ -100,9 +100,9 @@ var SelectBox = {
|
||||
// silently fail on IE 'unknown' exception
|
||||
}
|
||||
return 0;
|
||||
} );
|
||||
});
|
||||
},
|
||||
select_all: function(id) {
|
||||
select_all: function (id) {
|
||||
var box = document.getElementById(id);
|
||||
for (var i = 0; i < box.options.length; i++) {
|
||||
box.options[i].selected = 'selected';
|
||||
|
||||
@@ -1,161 +1,179 @@
|
||||
/*
|
||||
SelectFilter2 - Turns a multiple-select box into a filter interface.
|
||||
SelectFilter2 - Turns a multiple-select box into a filter interface.
|
||||
|
||||
Requires core.js, SelectBox.js and addevent.js.
|
||||
*/
|
||||
(function($) {
|
||||
function findForm(node) {
|
||||
// returns the node of the form containing the given node
|
||||
if (node.tagName.toLowerCase() != 'form') {
|
||||
return findForm(node.parentNode);
|
||||
Requires core.js, SelectBox.js and addevent.js.
|
||||
*/
|
||||
(function ($) {
|
||||
function findForm(node) {
|
||||
// returns the node of the form containing the given node
|
||||
if (node.tagName.toLowerCase() != 'form') {
|
||||
return findForm(node.parentNode);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
window.SelectFilter = {
|
||||
init: function(field_id, field_name, is_stacked, admin_static_prefix) {
|
||||
if (field_id.match(/__prefix__/)){
|
||||
// Don't intialize on empty forms.
|
||||
return;
|
||||
}
|
||||
var from_box = document.getElementById(field_id);
|
||||
from_box.id += '_from'; // change its ID
|
||||
from_box.className = 'filtered';
|
||||
|
||||
var ps = from_box.parentNode.getElementsByTagName('p');
|
||||
for (var i=0; i<ps.length; i++) {
|
||||
if (ps[i].className.indexOf("info") != -1) {
|
||||
// Remove <p class="info">, because it just gets in the way.
|
||||
from_box.parentNode.removeChild(ps[i]);
|
||||
} else if (ps[i].className.indexOf("help") != -1) {
|
||||
// Move help text up to the top so it isn't below the select
|
||||
// boxes or wrapped off on the side to the right of the add
|
||||
// button:
|
||||
from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild);
|
||||
window.SelectFilter = {
|
||||
init: function (field_id, field_name, is_stacked, admin_static_prefix) {
|
||||
if (field_id.match(/__prefix__/)) {
|
||||
// Don't intialize on empty forms.
|
||||
return;
|
||||
}
|
||||
}
|
||||
var from_box = document.getElementById(field_id);
|
||||
from_box.id += '_from'; // change its ID
|
||||
from_box.className = 'filtered';
|
||||
|
||||
// <div class="selector"> or <div class="selector stacked">
|
||||
var selector_div = quickElement('div', from_box.parentNode);
|
||||
selector_div.className = is_stacked ? 'selector stacked' : 'selector';
|
||||
|
||||
// <div class="selector-available">
|
||||
var selector_available = quickElement('div', selector_div, '');
|
||||
selector_available.className = 'selector-available';
|
||||
var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name]));
|
||||
quickElement('img', title_available, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of available %s. You may choose some by selecting them in the box below and then clicking the "Choose" arrow between the two boxes.'), [field_name]));
|
||||
|
||||
var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter');
|
||||
filter_p.className = 'selector-filter';
|
||||
|
||||
var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input");
|
||||
|
||||
var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_static_prefix + 'img/selector-search.gif', 'class', 'help-tooltip', 'alt', '', 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]));
|
||||
|
||||
filter_p.appendChild(document.createTextNode(' '));
|
||||
|
||||
var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
|
||||
filter_input.id = field_id + '_input';
|
||||
|
||||
selector_available.appendChild(from_box);
|
||||
var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', 'javascript: (function(){ SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_all_link');
|
||||
choose_all.className = 'selector-chooseall';
|
||||
|
||||
// <ul class="selector-chooser">
|
||||
var selector_chooser = quickElement('ul', selector_div, '');
|
||||
selector_chooser.className = 'selector-chooser';
|
||||
var add_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Choose'), 'title', gettext('Choose'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_from","' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_link');
|
||||
add_link.className = 'selector-add';
|
||||
var remove_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Remove'), 'title', gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_to","' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_link');
|
||||
remove_link.className = 'selector-remove';
|
||||
|
||||
// <div class="selector-chosen">
|
||||
var selector_chosen = quickElement('div', selector_div, '');
|
||||
selector_chosen.className = 'selector-chosen';
|
||||
var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
|
||||
quickElement('img', title_chosen, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of chosen %s. You may remove some by selecting them in the box below and then clicking the "Remove" arrow between the two boxes.'), [field_name]));
|
||||
|
||||
var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
|
||||
to_box.className = 'filtered';
|
||||
var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_all_link');
|
||||
clear_all.className = 'selector-clearall';
|
||||
|
||||
from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
|
||||
|
||||
// Set up the JavaScript event handlers for the select box filter interface
|
||||
addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
|
||||
addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
|
||||
addEvent(from_box, 'change', function(e) { SelectFilter.refresh_icons(field_id) });
|
||||
addEvent(to_box, 'change', function(e) { SelectFilter.refresh_icons(field_id) });
|
||||
addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); });
|
||||
addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); });
|
||||
addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
|
||||
SelectBox.init(field_id + '_from');
|
||||
SelectBox.init(field_id + '_to');
|
||||
// Move selected from_box options to to_box
|
||||
SelectBox.move(field_id + '_from', field_id + '_to');
|
||||
|
||||
if (!is_stacked) {
|
||||
// In horizontal mode, give the same height to the two boxes.
|
||||
var j_from_box = $(from_box);
|
||||
var j_to_box = $(to_box);
|
||||
var resize_filters = function() { j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); }
|
||||
if (j_from_box.outerHeight() > 0) {
|
||||
resize_filters(); // This fieldset is already open. Resize now.
|
||||
} else {
|
||||
// This fieldset is probably collapsed. Wait for its 'show' event.
|
||||
j_to_box.closest('fieldset').one('show.fieldset', resize_filters);
|
||||
var ps = from_box.parentNode.getElementsByTagName('p');
|
||||
for (var i = 0; i < ps.length; i++) {
|
||||
if (ps[i].className.indexOf("info") != -1) {
|
||||
// Remove <p class="info">, because it just gets in the way.
|
||||
from_box.parentNode.removeChild(ps[i]);
|
||||
} else if (ps[i].className.indexOf("help") != -1) {
|
||||
// Move help text up to the top so it isn't below the select
|
||||
// boxes or wrapped off on the side to the right of the add
|
||||
// button:
|
||||
from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initial icon refresh
|
||||
SelectFilter.refresh_icons(field_id);
|
||||
},
|
||||
refresh_icons: function(field_id) {
|
||||
var from = $('#' + field_id + '_from');
|
||||
var to = $('#' + field_id + '_to');
|
||||
var is_from_selected = from.find('option:selected').length > 0;
|
||||
var is_to_selected = to.find('option:selected').length > 0;
|
||||
// Active if at least one item is selected
|
||||
$('#' + field_id + '_add_link').toggleClass('active', is_from_selected);
|
||||
$('#' + field_id + '_remove_link').toggleClass('active', is_to_selected);
|
||||
// Active if the corresponding box isn't empty
|
||||
$('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0);
|
||||
$('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0);
|
||||
},
|
||||
filter_key_up: function(event, field_id) {
|
||||
var from = document.getElementById(field_id + '_from');
|
||||
// don't submit form if user pressed Enter
|
||||
if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
|
||||
from.selectedIndex = 0;
|
||||
// <div class="selector"> or <div class="selector stacked">
|
||||
var selector_div = quickElement('div', from_box.parentNode);
|
||||
selector_div.className = is_stacked ? 'selector stacked' : 'selector';
|
||||
|
||||
// <div class="selector-available">
|
||||
var selector_available = quickElement('div', selector_div, '');
|
||||
selector_available.className = 'selector-available';
|
||||
var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name]));
|
||||
quickElement('img', title_available, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of available %s. You may choose some by selecting them in the box below and then clicking the "Choose" arrow between the two boxes.'), [field_name]));
|
||||
|
||||
var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter');
|
||||
filter_p.className = 'selector-filter';
|
||||
|
||||
var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input");
|
||||
|
||||
var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_static_prefix + 'img/selector-search.gif', 'class', 'help-tooltip', 'alt', '', 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]));
|
||||
|
||||
filter_p.appendChild(document.createTextNode(' '));
|
||||
|
||||
var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter"));
|
||||
filter_input.id = field_id + '_input';
|
||||
|
||||
selector_available.appendChild(from_box);
|
||||
var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', 'javascript: (function(){ SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_all_link');
|
||||
choose_all.className = 'selector-chooseall';
|
||||
|
||||
// <ul class="selector-chooser">
|
||||
var selector_chooser = quickElement('ul', selector_div, '');
|
||||
selector_chooser.className = 'selector-chooser';
|
||||
var add_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Choose'), 'title', gettext('Choose'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_from","' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_link');
|
||||
add_link.className = 'selector-add';
|
||||
var remove_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Remove'), 'title', gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_to","' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_link');
|
||||
remove_link.className = 'selector-remove';
|
||||
|
||||
// <div class="selector-chosen">
|
||||
var selector_chosen = quickElement('div', selector_div, '');
|
||||
selector_chosen.className = 'selector-chosen';
|
||||
var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name]));
|
||||
quickElement('img', title_chosen, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of chosen %s. You may remove some by selecting them in the box below and then clicking the "Remove" arrow between the two boxes.'), [field_name]));
|
||||
|
||||
var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
|
||||
to_box.className = 'filtered';
|
||||
var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_all_link');
|
||||
clear_all.className = 'selector-clearall';
|
||||
|
||||
from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
|
||||
|
||||
// Set up the JavaScript event handlers for the select box filter interface
|
||||
addEvent(filter_input, 'keyup', function (e) {
|
||||
SelectFilter.filter_key_up(e, field_id);
|
||||
});
|
||||
addEvent(filter_input, 'keydown', function (e) {
|
||||
SelectFilter.filter_key_down(e, field_id);
|
||||
});
|
||||
addEvent(from_box, 'change', function (e) {
|
||||
SelectFilter.refresh_icons(field_id)
|
||||
});
|
||||
addEvent(to_box, 'change', function (e) {
|
||||
SelectFilter.refresh_icons(field_id)
|
||||
});
|
||||
addEvent(from_box, 'dblclick', function () {
|
||||
SelectBox.move(field_id + '_from', field_id + '_to');
|
||||
SelectFilter.refresh_icons(field_id);
|
||||
});
|
||||
addEvent(to_box, 'dblclick', function () {
|
||||
SelectBox.move(field_id + '_to', field_id + '_from');
|
||||
SelectFilter.refresh_icons(field_id);
|
||||
});
|
||||
addEvent(findForm(from_box), 'submit', function () {
|
||||
SelectBox.select_all(field_id + '_to');
|
||||
});
|
||||
SelectBox.init(field_id + '_from');
|
||||
SelectBox.init(field_id + '_to');
|
||||
// Move selected from_box options to to_box
|
||||
SelectBox.move(field_id + '_from', field_id + '_to');
|
||||
from.selectedIndex = 0;
|
||||
return false;
|
||||
|
||||
if (!is_stacked) {
|
||||
// In horizontal mode, give the same height to the two boxes.
|
||||
var j_from_box = $(from_box);
|
||||
var j_to_box = $(to_box);
|
||||
var resize_filters = function () {
|
||||
j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight());
|
||||
}
|
||||
if (j_from_box.outerHeight() > 0) {
|
||||
resize_filters(); // This fieldset is already open. Resize now.
|
||||
} else {
|
||||
// This fieldset is probably collapsed. Wait for its 'show' event.
|
||||
j_to_box.closest('fieldset').one('show.fieldset', resize_filters);
|
||||
}
|
||||
}
|
||||
|
||||
// Initial icon refresh
|
||||
SelectFilter.refresh_icons(field_id);
|
||||
},
|
||||
refresh_icons: function (field_id) {
|
||||
var from = $('#' + field_id + '_from');
|
||||
var to = $('#' + field_id + '_to');
|
||||
var is_from_selected = from.find('option:selected').length > 0;
|
||||
var is_to_selected = to.find('option:selected').length > 0;
|
||||
// Active if at least one item is selected
|
||||
$('#' + field_id + '_add_link').toggleClass('active', is_from_selected);
|
||||
$('#' + field_id + '_remove_link').toggleClass('active', is_to_selected);
|
||||
// Active if the corresponding box isn't empty
|
||||
$('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0);
|
||||
$('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0);
|
||||
},
|
||||
filter_key_up: function (event, field_id) {
|
||||
var from = document.getElementById(field_id + '_from');
|
||||
// don't submit form if user pressed Enter
|
||||
if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
|
||||
from.selectedIndex = 0;
|
||||
SelectBox.move(field_id + '_from', field_id + '_to');
|
||||
from.selectedIndex = 0;
|
||||
return false;
|
||||
}
|
||||
var temp = from.selectedIndex;
|
||||
SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
|
||||
from.selectedIndex = temp;
|
||||
return true;
|
||||
},
|
||||
filter_key_down: function (event, field_id) {
|
||||
var from = document.getElementById(field_id + '_from');
|
||||
// right arrow -- move across
|
||||
if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
|
||||
var old_index = from.selectedIndex;
|
||||
SelectBox.move(field_id + '_from', field_id + '_to');
|
||||
from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
|
||||
return false;
|
||||
}
|
||||
// down arrow -- wrap around
|
||||
if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
|
||||
from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
|
||||
}
|
||||
// up arrow -- wrap around
|
||||
if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
|
||||
from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
var temp = from.selectedIndex;
|
||||
SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
|
||||
from.selectedIndex = temp;
|
||||
return true;
|
||||
},
|
||||
filter_key_down: function(event, field_id) {
|
||||
var from = document.getElementById(field_id + '_from');
|
||||
// right arrow -- move across
|
||||
if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
|
||||
var old_index = from.selectedIndex;
|
||||
SelectBox.move(field_id + '_from', field_id + '_to');
|
||||
from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
|
||||
return false;
|
||||
}
|
||||
// down arrow -- wrap around
|
||||
if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
|
||||
from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
|
||||
}
|
||||
// up arrow -- wrap around
|
||||
if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
|
||||
from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
})(django.jQuery);
|
||||
|
||||
@@ -1,139 +1,141 @@
|
||||
(function($) {
|
||||
$.fn.actions = function(opts) {
|
||||
var options = $.extend({}, $.fn.actions.defaults, opts);
|
||||
var actionCheckboxes = $(this);
|
||||
var list_editable_changed = false;
|
||||
var checker = function(checked) {
|
||||
if (checked) {
|
||||
showQuestion();
|
||||
} else {
|
||||
reset();
|
||||
}
|
||||
$(actionCheckboxes).prop("checked", checked)
|
||||
.parent().parent().toggleClass(options.selectedClass, checked);
|
||||
},
|
||||
updateCounter = function() {
|
||||
var sel = $(actionCheckboxes).filter(":checked").length;
|
||||
$(options.counterContainer).html(interpolate(
|
||||
ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), {
|
||||
sel: sel,
|
||||
cnt: _actions_icnt
|
||||
}, true));
|
||||
$(options.allToggle).prop("checked", function() {
|
||||
if (sel == actionCheckboxes.length) {
|
||||
value = true;
|
||||
showQuestion();
|
||||
} else {
|
||||
value = false;
|
||||
clearAcross();
|
||||
}
|
||||
return value;
|
||||
});
|
||||
},
|
||||
showQuestion = function() {
|
||||
$(options.acrossClears).hide();
|
||||
$(options.acrossQuestions).show();
|
||||
$(options.allContainer).hide();
|
||||
},
|
||||
showClear = function() {
|
||||
$(options.acrossClears).show();
|
||||
$(options.acrossQuestions).hide();
|
||||
$(options.actionContainer).toggleClass(options.selectedClass);
|
||||
$(options.allContainer).show();
|
||||
$(options.counterContainer).hide();
|
||||
},
|
||||
reset = function() {
|
||||
$(options.acrossClears).hide();
|
||||
$(options.acrossQuestions).hide();
|
||||
$(options.allContainer).hide();
|
||||
$(options.counterContainer).show();
|
||||
},
|
||||
clearAcross = function() {
|
||||
reset();
|
||||
$(options.acrossInput).val(0);
|
||||
$(options.actionContainer).removeClass(options.selectedClass);
|
||||
};
|
||||
// Show counter by default
|
||||
$(options.counterContainer).show();
|
||||
// Check state of checkboxes and reinit state if needed
|
||||
$(this).filter(":checked").each(function(i) {
|
||||
$(this).parent().parent().toggleClass(options.selectedClass);
|
||||
updateCounter();
|
||||
if ($(options.acrossInput).val() == 1) {
|
||||
showClear();
|
||||
}
|
||||
});
|
||||
$(options.allToggle).show().click(function() {
|
||||
checker($(this).prop("checked"));
|
||||
updateCounter();
|
||||
});
|
||||
$("div.actions span.question a").click(function(event) {
|
||||
event.preventDefault();
|
||||
$(options.acrossInput).val(1);
|
||||
showClear();
|
||||
});
|
||||
$("div.actions span.clear a").click(function(event) {
|
||||
event.preventDefault();
|
||||
$(options.allToggle).prop("checked", false);
|
||||
clearAcross();
|
||||
checker(0);
|
||||
updateCounter();
|
||||
});
|
||||
lastChecked = null;
|
||||
$(actionCheckboxes).click(function(event) {
|
||||
if (!event) { event = window.event; }
|
||||
var target = event.target ? event.target : event.srcElement;
|
||||
if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey === true) {
|
||||
var inrange = false;
|
||||
$(lastChecked).prop("checked", target.checked)
|
||||
.parent().parent().toggleClass(options.selectedClass, target.checked);
|
||||
$(actionCheckboxes).each(function() {
|
||||
if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) {
|
||||
inrange = (inrange) ? false : true;
|
||||
}
|
||||
if (inrange) {
|
||||
$(this).prop("checked", target.checked)
|
||||
.parent().parent().toggleClass(options.selectedClass, target.checked);
|
||||
}
|
||||
});
|
||||
}
|
||||
$(target).parent().parent().toggleClass(options.selectedClass, target.checked);
|
||||
lastChecked = target;
|
||||
updateCounter();
|
||||
});
|
||||
$('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function() {
|
||||
list_editable_changed = true;
|
||||
});
|
||||
$('form#changelist-form button[name="index"]').click(function(event) {
|
||||
if (list_editable_changed) {
|
||||
return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."));
|
||||
}
|
||||
});
|
||||
$('form#changelist-form input[name="_save"]').click(function(event) {
|
||||
var action_changed = false;
|
||||
$('div.actions select option:selected').each(function() {
|
||||
if ($(this).val()) {
|
||||
action_changed = true;
|
||||
}
|
||||
});
|
||||
if (action_changed) {
|
||||
if (list_editable_changed) {
|
||||
return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action."));
|
||||
} else {
|
||||
return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."));
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
/* Setup plugin defaults */
|
||||
$.fn.actions.defaults = {
|
||||
actionContainer: "div.actions",
|
||||
counterContainer: "span.action-counter",
|
||||
allContainer: "div.actions span.all",
|
||||
acrossInput: "div.actions input.select-across",
|
||||
acrossQuestions: "div.actions span.question",
|
||||
acrossClears: "div.actions span.clear",
|
||||
allToggle: "#action-toggle",
|
||||
selectedClass: "selected"
|
||||
};
|
||||
(function ($) {
|
||||
$.fn.actions = function (opts) {
|
||||
var options = $.extend({}, $.fn.actions.defaults, opts);
|
||||
var actionCheckboxes = $(this);
|
||||
var list_editable_changed = false;
|
||||
var checker = function (checked) {
|
||||
if (checked) {
|
||||
showQuestion();
|
||||
} else {
|
||||
reset();
|
||||
}
|
||||
$(actionCheckboxes).prop("checked", checked)
|
||||
.parent().parent().toggleClass(options.selectedClass, checked);
|
||||
},
|
||||
updateCounter = function () {
|
||||
var sel = $(actionCheckboxes).filter(":checked").length;
|
||||
$(options.counterContainer).html(interpolate(
|
||||
ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), {
|
||||
sel: sel,
|
||||
cnt: _actions_icnt
|
||||
}, true));
|
||||
$(options.allToggle).prop("checked", function () {
|
||||
if (sel == actionCheckboxes.length) {
|
||||
value = true;
|
||||
showQuestion();
|
||||
} else {
|
||||
value = false;
|
||||
clearAcross();
|
||||
}
|
||||
return value;
|
||||
});
|
||||
},
|
||||
showQuestion = function () {
|
||||
$(options.acrossClears).hide();
|
||||
$(options.acrossQuestions).show();
|
||||
$(options.allContainer).hide();
|
||||
},
|
||||
showClear = function () {
|
||||
$(options.acrossClears).show();
|
||||
$(options.acrossQuestions).hide();
|
||||
$(options.actionContainer).toggleClass(options.selectedClass);
|
||||
$(options.allContainer).show();
|
||||
$(options.counterContainer).hide();
|
||||
},
|
||||
reset = function () {
|
||||
$(options.acrossClears).hide();
|
||||
$(options.acrossQuestions).hide();
|
||||
$(options.allContainer).hide();
|
||||
$(options.counterContainer).show();
|
||||
},
|
||||
clearAcross = function () {
|
||||
reset();
|
||||
$(options.acrossInput).val(0);
|
||||
$(options.actionContainer).removeClass(options.selectedClass);
|
||||
};
|
||||
// Show counter by default
|
||||
$(options.counterContainer).show();
|
||||
// Check state of checkboxes and reinit state if needed
|
||||
$(this).filter(":checked").each(function (i) {
|
||||
$(this).parent().parent().toggleClass(options.selectedClass);
|
||||
updateCounter();
|
||||
if ($(options.acrossInput).val() == 1) {
|
||||
showClear();
|
||||
}
|
||||
});
|
||||
$(options.allToggle).show().click(function () {
|
||||
checker($(this).prop("checked"));
|
||||
updateCounter();
|
||||
});
|
||||
$("div.actions span.question a").click(function (event) {
|
||||
event.preventDefault();
|
||||
$(options.acrossInput).val(1);
|
||||
showClear();
|
||||
});
|
||||
$("div.actions span.clear a").click(function (event) {
|
||||
event.preventDefault();
|
||||
$(options.allToggle).prop("checked", false);
|
||||
clearAcross();
|
||||
checker(0);
|
||||
updateCounter();
|
||||
});
|
||||
lastChecked = null;
|
||||
$(actionCheckboxes).click(function (event) {
|
||||
if (!event) {
|
||||
event = window.event;
|
||||
}
|
||||
var target = event.target ? event.target : event.srcElement;
|
||||
if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey === true) {
|
||||
var inrange = false;
|
||||
$(lastChecked).prop("checked", target.checked)
|
||||
.parent().parent().toggleClass(options.selectedClass, target.checked);
|
||||
$(actionCheckboxes).each(function () {
|
||||
if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) {
|
||||
inrange = (inrange) ? false : true;
|
||||
}
|
||||
if (inrange) {
|
||||
$(this).prop("checked", target.checked)
|
||||
.parent().parent().toggleClass(options.selectedClass, target.checked);
|
||||
}
|
||||
});
|
||||
}
|
||||
$(target).parent().parent().toggleClass(options.selectedClass, target.checked);
|
||||
lastChecked = target;
|
||||
updateCounter();
|
||||
});
|
||||
$('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function () {
|
||||
list_editable_changed = true;
|
||||
});
|
||||
$('form#changelist-form button[name="index"]').click(function (event) {
|
||||
if (list_editable_changed) {
|
||||
return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."));
|
||||
}
|
||||
});
|
||||
$('form#changelist-form input[name="_save"]').click(function (event) {
|
||||
var action_changed = false;
|
||||
$('div.actions select option:selected').each(function () {
|
||||
if ($(this).val()) {
|
||||
action_changed = true;
|
||||
}
|
||||
});
|
||||
if (action_changed) {
|
||||
if (list_editable_changed) {
|
||||
return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action."));
|
||||
} else {
|
||||
return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."));
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
/* Setup plugin defaults */
|
||||
$.fn.actions.defaults = {
|
||||
actionContainer: "div.actions",
|
||||
counterContainer: "span.action-counter",
|
||||
allContainer: "div.actions span.all",
|
||||
acrossInput: "div.actions input.select-across",
|
||||
acrossQuestions: "div.actions span.question",
|
||||
acrossClears: "div.actions span.clear",
|
||||
allToggle: "#action-toggle",
|
||||
selectedClass: "selected"
|
||||
};
|
||||
})(django.jQuery);
|
||||
|
||||
102
static/admin/js/actions.min.js
vendored
102
static/admin/js/actions.min.js
vendored
@@ -1,6 +1,96 @@
|
||||
(function(a){a.fn.actions=function(n){var b=a.extend({},a.fn.actions.defaults,n),e=a(this),g=false,k=function(c){c?i():j();a(e).prop("checked",c).parent().parent().toggleClass(b.selectedClass,c)},f=function(){var c=a(e).filter(":checked").length;a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:_actions_icnt},true));a(b.allToggle).prop("checked",function(){if(c==e.length){value=true;i()}else{value=false;l()}return value})},i=
|
||||
function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},j=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},l=function(){j();a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)};a(b.counterContainer).show();
|
||||
a(this).filter(":checked").each(function(){a(this).parent().parent().toggleClass(b.selectedClass);f();a(b.acrossInput).val()==1&&m()});a(b.allToggle).show().click(function(){k(a(this).prop("checked"));f()});a("div.actions span.question a").click(function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("div.actions span.clear a").click(function(c){c.preventDefault();a(b.allToggle).prop("checked",false);l();k(0);f()});lastChecked=null;a(e).click(function(c){if(!c)c=window.event;var d=c.target?
|
||||
c.target:c.srcElement;if(lastChecked&&a.data(lastChecked)!=a.data(d)&&c.shiftKey===true){var h=false;a(lastChecked).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(e).each(function(){if(a.data(this)==a.data(lastChecked)||a.data(this)==a.data(d))h=h?false:true;h&&a(this).prop("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);lastChecked=d;f()});a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function(){g=
|
||||
true});a('form#changelist-form button[name="index"]').click(function(){if(g)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))});a('form#changelist-form input[name="_save"]').click(function(){var c=false;a("div.actions select option:selected").each(function(){if(a(this).val())c=true});if(c)return g?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")):
|
||||
confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})};a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"}})(django.jQuery);
|
||||
(function (a) {
|
||||
a.fn.actions = function (n) {
|
||||
var b = a.extend({}, a.fn.actions.defaults, n), e = a(this), g = false, k = function (c) {
|
||||
c ? i() : j();
|
||||
a(e).prop("checked", c).parent().parent().toggleClass(b.selectedClass, c)
|
||||
}, f = function () {
|
||||
var c = a(e).filter(":checked").length;
|
||||
a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected", "%(sel)s of %(cnt)s selected", c), {sel: c, cnt: _actions_icnt}, true));
|
||||
a(b.allToggle).prop("checked", function () {
|
||||
if (c == e.length) {
|
||||
value = true;
|
||||
i()
|
||||
} else {
|
||||
value = false;
|
||||
l()
|
||||
}
|
||||
return value
|
||||
})
|
||||
}, i =
|
||||
function () {
|
||||
a(b.acrossClears).hide();
|
||||
a(b.acrossQuestions).show();
|
||||
a(b.allContainer).hide()
|
||||
}, m = function () {
|
||||
a(b.acrossClears).show();
|
||||
a(b.acrossQuestions).hide();
|
||||
a(b.actionContainer).toggleClass(b.selectedClass);
|
||||
a(b.allContainer).show();
|
||||
a(b.counterContainer).hide()
|
||||
}, j = function () {
|
||||
a(b.acrossClears).hide();
|
||||
a(b.acrossQuestions).hide();
|
||||
a(b.allContainer).hide();
|
||||
a(b.counterContainer).show()
|
||||
}, l = function () {
|
||||
j();
|
||||
a(b.acrossInput).val(0);
|
||||
a(b.actionContainer).removeClass(b.selectedClass)
|
||||
};
|
||||
a(b.counterContainer).show();
|
||||
a(this).filter(":checked").each(function () {
|
||||
a(this).parent().parent().toggleClass(b.selectedClass);
|
||||
f();
|
||||
a(b.acrossInput).val() == 1 && m()
|
||||
});
|
||||
a(b.allToggle).show().click(function () {
|
||||
k(a(this).prop("checked"));
|
||||
f()
|
||||
});
|
||||
a("div.actions span.question a").click(function (c) {
|
||||
c.preventDefault();
|
||||
a(b.acrossInput).val(1);
|
||||
m()
|
||||
});
|
||||
a("div.actions span.clear a").click(function (c) {
|
||||
c.preventDefault();
|
||||
a(b.allToggle).prop("checked", false);
|
||||
l();
|
||||
k(0);
|
||||
f()
|
||||
});
|
||||
lastChecked = null;
|
||||
a(e).click(function (c) {
|
||||
if (!c)c = window.event;
|
||||
var d = c.target ?
|
||||
c.target : c.srcElement;
|
||||
if (lastChecked && a.data(lastChecked) != a.data(d) && c.shiftKey === true) {
|
||||
var h = false;
|
||||
a(lastChecked).prop("checked", d.checked).parent().parent().toggleClass(b.selectedClass, d.checked);
|
||||
a(e).each(function () {
|
||||
if (a.data(this) == a.data(lastChecked) || a.data(this) == a.data(d))h = h ? false : true;
|
||||
h && a(this).prop("checked", d.checked).parent().parent().toggleClass(b.selectedClass, d.checked)
|
||||
})
|
||||
}
|
||||
a(d).parent().parent().toggleClass(b.selectedClass, d.checked);
|
||||
lastChecked = d;
|
||||
f()
|
||||
});
|
||||
a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function () {
|
||||
g =
|
||||
true
|
||||
});
|
||||
a('form#changelist-form button[name="index"]').click(function () {
|
||||
if (g)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))
|
||||
});
|
||||
a('form#changelist-form input[name="_save"]').click(function () {
|
||||
var c = false;
|
||||
a("div.actions select option:selected").each(function () {
|
||||
if (a(this).val())c = true
|
||||
});
|
||||
if (c)return g ? confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")) :
|
||||
confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))
|
||||
})
|
||||
};
|
||||
a.fn.actions.defaults = {actionContainer: "div.actions", counterContainer: "span.action-counter", allContainer: "div.actions span.all", acrossInput: "div.actions input.select-across", acrossQuestions: "div.actions span.question", acrossClears: "div.actions span.clear", allToggle: "#action-toggle", selectedClass: "selected"}
|
||||
})(django.jQuery);
|
||||
|
||||
@@ -15,7 +15,7 @@ var DateTimeShortcuts = {
|
||||
clockLinkName: 'clocklink', // name of the link that is used to toggle
|
||||
shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
|
||||
admin_media_prefix: '',
|
||||
init: function() {
|
||||
init: function () {
|
||||
// Get admin_media_prefix by grabbing it off the window object. It's
|
||||
// set in the admin/base.html template, so if it's not there, someone's
|
||||
// overridden the template. In that case, we'll set a clearly-invalid
|
||||
@@ -27,7 +27,7 @@ var DateTimeShortcuts = {
|
||||
}
|
||||
|
||||
var inputs = document.getElementsByTagName('input');
|
||||
for (i=0; i<inputs.length; i++) {
|
||||
for (i = 0; i < inputs.length; i++) {
|
||||
var inp = inputs[i];
|
||||
if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {
|
||||
DateTimeShortcuts.addClock(inp);
|
||||
@@ -38,10 +38,13 @@ var DateTimeShortcuts = {
|
||||
}
|
||||
},
|
||||
// Add clock widget to a given field
|
||||
addClock: function(inp) {
|
||||
addClock: function (inp) {
|
||||
var num = DateTimeShortcuts.clockInputs.length;
|
||||
DateTimeShortcuts.clockInputs[num] = inp;
|
||||
DateTimeShortcuts.dismissClockFunc[num] = function() { DateTimeShortcuts.dismissClock(num); return true; };
|
||||
DateTimeShortcuts.dismissClockFunc[num] = function () {
|
||||
DateTimeShortcuts.dismissClock(num);
|
||||
return true;
|
||||
};
|
||||
|
||||
// Shortcut links (clock icon and "Now" link)
|
||||
var shortcuts_span = document.createElement('span');
|
||||
@@ -93,7 +96,7 @@ var DateTimeShortcuts = {
|
||||
var cancel_p = quickElement('p', clock_box, '');
|
||||
cancel_p.className = 'calendar-cancel';
|
||||
quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
|
||||
django.jQuery(document).bind('keyup', function(event) {
|
||||
django.jQuery(document).bind('keyup', function (event) {
|
||||
if (event.which == 27) {
|
||||
// ESC key closes popup
|
||||
DateTimeShortcuts.dismissClock(num);
|
||||
@@ -101,13 +104,13 @@ var DateTimeShortcuts = {
|
||||
}
|
||||
});
|
||||
},
|
||||
openClock: function(num) {
|
||||
var clock_box = document.getElementById(DateTimeShortcuts.clockDivName+num)
|
||||
var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName+num)
|
||||
openClock: function (num) {
|
||||
var clock_box = document.getElementById(DateTimeShortcuts.clockDivName + num)
|
||||
var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName + num)
|
||||
|
||||
// Recalculate the clockbox position
|
||||
// is it left-to-right or right-to-left layout ?
|
||||
if (getStyle(document.body,'direction')!='rtl') {
|
||||
if (getStyle(document.body, 'direction') != 'rtl') {
|
||||
clock_box.style.left = findPosX(clock_link) + 17 + 'px';
|
||||
}
|
||||
else {
|
||||
@@ -123,21 +126,24 @@ var DateTimeShortcuts = {
|
||||
clock_box.style.display = 'block';
|
||||
addEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
|
||||
},
|
||||
dismissClock: function(num) {
|
||||
document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
|
||||
removeEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
|
||||
dismissClock: function (num) {
|
||||
document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
|
||||
removeEvent(document, 'click', DateTimeShortcuts.dismissClockFunc[num]);
|
||||
},
|
||||
handleClockQuicklink: function(num, val) {
|
||||
DateTimeShortcuts.clockInputs[num].value = val;
|
||||
DateTimeShortcuts.clockInputs[num].focus();
|
||||
DateTimeShortcuts.dismissClock(num);
|
||||
handleClockQuicklink: function (num, val) {
|
||||
DateTimeShortcuts.clockInputs[num].value = val;
|
||||
DateTimeShortcuts.clockInputs[num].focus();
|
||||
DateTimeShortcuts.dismissClock(num);
|
||||
},
|
||||
// Add calendar widget to a given field.
|
||||
addCalendar: function(inp) {
|
||||
addCalendar: function (inp) {
|
||||
var num = DateTimeShortcuts.calendars.length;
|
||||
|
||||
DateTimeShortcuts.calendarInputs[num] = inp;
|
||||
DateTimeShortcuts.dismissCalendarFunc[num] = function() { DateTimeShortcuts.dismissCalendar(num); return true; };
|
||||
DateTimeShortcuts.dismissCalendarFunc[num] = function () {
|
||||
DateTimeShortcuts.dismissCalendar(num);
|
||||
return true;
|
||||
};
|
||||
|
||||
// Shortcut links (calendar icon and "Today" link)
|
||||
var shortcuts_span = document.createElement('span');
|
||||
@@ -182,9 +188,9 @@ var DateTimeShortcuts = {
|
||||
|
||||
// next-prev links
|
||||
var cal_nav = quickElement('div', cal_box, '');
|
||||
var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');');
|
||||
var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev(' + num + ');');
|
||||
cal_nav_prev.className = 'calendarnav-previous';
|
||||
var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');
|
||||
var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext(' + num + ');');
|
||||
cal_nav_next.className = 'calendarnav-next';
|
||||
|
||||
// main box
|
||||
@@ -206,7 +212,7 @@ var DateTimeShortcuts = {
|
||||
var cancel_p = quickElement('p', cal_box, '');
|
||||
cancel_p.className = 'calendar-cancel';
|
||||
quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');
|
||||
django.jQuery(document).bind('keyup', function(event) {
|
||||
django.jQuery(document).bind('keyup', function (event) {
|
||||
if (event.which == 27) {
|
||||
// ESC key closes popup
|
||||
DateTimeShortcuts.dismissCalendar(num);
|
||||
@@ -214,9 +220,9 @@ var DateTimeShortcuts = {
|
||||
}
|
||||
});
|
||||
},
|
||||
openCalendar: function(num) {
|
||||
var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num)
|
||||
var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num)
|
||||
openCalendar: function (num) {
|
||||
var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1 + num)
|
||||
var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName + num)
|
||||
var inp = DateTimeShortcuts.calendarInputs[num];
|
||||
|
||||
// Determine if the current value in the input has a valid date.
|
||||
@@ -232,7 +238,7 @@ var DateTimeShortcuts = {
|
||||
|
||||
// Recalculate the clockbox position
|
||||
// is it left-to-right or right-to-left layout ?
|
||||
if (getStyle(document.body,'direction')!='rtl') {
|
||||
if (getStyle(document.body, 'direction') != 'rtl') {
|
||||
cal_box.style.left = findPosX(cal_link) + 17 + 'px';
|
||||
}
|
||||
else {
|
||||
@@ -247,17 +253,17 @@ var DateTimeShortcuts = {
|
||||
cal_box.style.display = 'block';
|
||||
addEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
|
||||
},
|
||||
dismissCalendar: function(num) {
|
||||
document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none';
|
||||
dismissCalendar: function (num) {
|
||||
document.getElementById(DateTimeShortcuts.calendarDivName1 + num).style.display = 'none';
|
||||
removeEvent(document, 'click', DateTimeShortcuts.dismissCalendarFunc[num]);
|
||||
},
|
||||
drawPrev: function(num) {
|
||||
drawPrev: function (num) {
|
||||
DateTimeShortcuts.calendars[num].drawPreviousMonth();
|
||||
},
|
||||
drawNext: function(num) {
|
||||
drawNext: function (num) {
|
||||
DateTimeShortcuts.calendars[num].drawNextMonth();
|
||||
},
|
||||
handleCalendarCallback: function(num) {
|
||||
handleCalendarCallback: function (num) {
|
||||
format = get_format('DATE_INPUT_FORMATS')[0];
|
||||
// the format needs to be escaped a little
|
||||
format = format.replace('\\', '\\\\');
|
||||
@@ -266,21 +272,21 @@ var DateTimeShortcuts = {
|
||||
format = format.replace('\t', '\\t');
|
||||
format = format.replace("'", "\\'");
|
||||
return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[",
|
||||
num,
|
||||
"].value = new Date(y, m-1, d).strftime('",
|
||||
format,
|
||||
"');DateTimeShortcuts.calendarInputs[",
|
||||
num,
|
||||
"].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+",
|
||||
num,
|
||||
").style.display='none';}"].join('');
|
||||
num,
|
||||
"].value = new Date(y, m-1, d).strftime('",
|
||||
format,
|
||||
"');DateTimeShortcuts.calendarInputs[",
|
||||
num,
|
||||
"].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+",
|
||||
num,
|
||||
").style.display='none';}"].join('');
|
||||
},
|
||||
handleCalendarQuickLink: function(num, offset) {
|
||||
var d = new Date();
|
||||
d.setDate(d.getDate() + offset)
|
||||
DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);
|
||||
DateTimeShortcuts.calendarInputs[num].focus();
|
||||
DateTimeShortcuts.dismissCalendar(num);
|
||||
handleCalendarQuickLink: function (num, offset) {
|
||||
var d = new Date();
|
||||
d.setDate(d.getDate() + offset)
|
||||
DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]);
|
||||
DateTimeShortcuts.calendarInputs[num].focus();
|
||||
DateTimeShortcuts.dismissCalendar(num);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ function showAddAnotherPopup(triggeringLink) {
|
||||
if (href.indexOf('?') == -1) {
|
||||
href += '?_popup=1';
|
||||
} else {
|
||||
href += '&_popup=1';
|
||||
href += '&_popup=1';
|
||||
}
|
||||
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
|
||||
win.focus();
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
/*
|
||||
calendar.js - Calendar functions by Adrian Holovaty
|
||||
depends on core.js for utility functions like removeChildren or quickElement
|
||||
*/
|
||||
calendar.js - Calendar functions by Adrian Holovaty
|
||||
depends on core.js for utility functions like removeChildren or quickElement
|
||||
*/
|
||||
|
||||
// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
|
||||
var CalendarNamespace = {
|
||||
monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
|
||||
daysOfWeek: gettext('S M T W T F S').split(' '),
|
||||
firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')),
|
||||
isLeapYear: function(year) {
|
||||
return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
|
||||
isLeapYear: function (year) {
|
||||
return (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0));
|
||||
},
|
||||
getDaysInMonth: function(month,year) {
|
||||
getDaysInMonth: function (month, year) {
|
||||
var days;
|
||||
if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
|
||||
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
|
||||
days = 31;
|
||||
}
|
||||
else if (month==4 || month==6 || month==9 || month==11) {
|
||||
else if (month == 4 || month == 6 || month == 9 || month == 11) {
|
||||
days = 30;
|
||||
}
|
||||
else if (month==2 && CalendarNamespace.isLeapYear(year)) {
|
||||
else if (month == 2 && CalendarNamespace.isLeapYear(year)) {
|
||||
days = 29;
|
||||
}
|
||||
else {
|
||||
@@ -27,10 +27,10 @@ var CalendarNamespace = {
|
||||
}
|
||||
return days;
|
||||
},
|
||||
draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
|
||||
draw: function (month, year, div_id, callback) { // month = 1-12, year = 1-9999
|
||||
var today = new Date();
|
||||
var todayDay = today.getDate();
|
||||
var todayMonth = today.getMonth()+1;
|
||||
var todayMonth = today.getMonth() + 1;
|
||||
var todayYear = today.getFullYear();
|
||||
var todayClass = '';
|
||||
|
||||
@@ -39,7 +39,7 @@ var CalendarNamespace = {
|
||||
var calDiv = document.getElementById(div_id);
|
||||
removeChildren(calDiv);
|
||||
var calTable = document.createElement('table');
|
||||
quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
|
||||
quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month - 1] + ' ' + year);
|
||||
var tableBody = quickElement('tbody', calTable);
|
||||
|
||||
// Draw days-of-week header
|
||||
@@ -48,7 +48,7 @@ var CalendarNamespace = {
|
||||
quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]);
|
||||
}
|
||||
|
||||
var startingPos = new Date(year, month-1, 1 - CalendarNamespace.firstDayOfWeek).getDay();
|
||||
var startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay();
|
||||
var days = CalendarNamespace.getDaysInMonth(month, year);
|
||||
|
||||
// Draw blanks before first of month
|
||||
@@ -61,17 +61,17 @@ var CalendarNamespace = {
|
||||
// Draw days of month
|
||||
var currentDay = 1;
|
||||
for (var i = startingPos; currentDay <= days; i++) {
|
||||
if (i%7 == 0 && currentDay != 1) {
|
||||
if (i % 7 == 0 && currentDay != 1) {
|
||||
tableRow = quickElement('tr', tableBody);
|
||||
}
|
||||
if ((currentDay==todayDay) && (month==todayMonth) && (year==todayYear)) {
|
||||
todayClass='today';
|
||||
if ((currentDay == todayDay) && (month == todayMonth) && (year == todayYear)) {
|
||||
todayClass = 'today';
|
||||
} else {
|
||||
todayClass='';
|
||||
todayClass = '';
|
||||
}
|
||||
var cell = quickElement('td', tableRow, '', 'class', todayClass);
|
||||
|
||||
quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
|
||||
quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '(' + year + ',' + month + ',' + currentDay + '));');
|
||||
currentDay++;
|
||||
}
|
||||
|
||||
@@ -99,15 +99,15 @@ function Calendar(div_id, callback) {
|
||||
this.currentYear = this.today.getFullYear();
|
||||
}
|
||||
Calendar.prototype = {
|
||||
drawCurrent: function() {
|
||||
drawCurrent: function () {
|
||||
CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
|
||||
},
|
||||
drawDate: function(month, year) {
|
||||
drawDate: function (month, year) {
|
||||
this.currentMonth = month;
|
||||
this.currentYear = year;
|
||||
this.drawCurrent();
|
||||
},
|
||||
drawPreviousMonth: function() {
|
||||
drawPreviousMonth: function () {
|
||||
if (this.currentMonth == 1) {
|
||||
this.currentMonth = 12;
|
||||
this.currentYear--;
|
||||
@@ -117,7 +117,7 @@ Calendar.prototype = {
|
||||
}
|
||||
this.drawCurrent();
|
||||
},
|
||||
drawNextMonth: function() {
|
||||
drawNextMonth: function () {
|
||||
if (this.currentMonth == 12) {
|
||||
this.currentMonth = 1;
|
||||
this.currentYear++;
|
||||
@@ -127,11 +127,11 @@ Calendar.prototype = {
|
||||
}
|
||||
this.drawCurrent();
|
||||
},
|
||||
drawPreviousYear: function() {
|
||||
drawPreviousYear: function () {
|
||||
this.currentYear--;
|
||||
this.drawCurrent();
|
||||
},
|
||||
drawNextYear: function() {
|
||||
drawNextYear: function () {
|
||||
this.currentYear++;
|
||||
this.drawCurrent();
|
||||
}
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
(function($) {
|
||||
$(document).ready(function() {
|
||||
// Add anchor tag for Show/Hide link
|
||||
$("fieldset.collapse").each(function(i, elem) {
|
||||
// Don't hide if fields in this fieldset have errors
|
||||
if ($(elem).find("div.errors").length == 0) {
|
||||
$(elem).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser' +
|
||||
i +'" class="collapse-toggle" href="#">' + gettext("Show") +
|
||||
'</a>)');
|
||||
}
|
||||
});
|
||||
// Add toggle to anchor tag
|
||||
$("fieldset.collapse a.collapse-toggle").click(function(ev) {
|
||||
if ($(this).closest("fieldset").hasClass("collapsed")) {
|
||||
// Show
|
||||
$(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]);
|
||||
} else {
|
||||
// Hide
|
||||
$(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
});
|
||||
(function ($) {
|
||||
$(document).ready(function () {
|
||||
// Add anchor tag for Show/Hide link
|
||||
$("fieldset.collapse").each(function (i, elem) {
|
||||
// Don't hide if fields in this fieldset have errors
|
||||
if ($(elem).find("div.errors").length == 0) {
|
||||
$(elem).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser' +
|
||||
i + '" class="collapse-toggle" href="#">' + gettext("Show") +
|
||||
'</a>)');
|
||||
}
|
||||
});
|
||||
// Add toggle to anchor tag
|
||||
$("fieldset.collapse a.collapse-toggle").click(function (ev) {
|
||||
if ($(this).closest("fieldset").hasClass("collapsed")) {
|
||||
// Show
|
||||
$(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]);
|
||||
} else {
|
||||
// Hide
|
||||
$(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
});
|
||||
})(django.jQuery);
|
||||
|
||||
14
static/admin/js/collapse.min.js
vendored
14
static/admin/js/collapse.min.js
vendored
@@ -1,2 +1,12 @@
|
||||
(function(a){a(document).ready(function(){a("fieldset.collapse").each(function(c,b){0==a(b).find("div.errors").length&&a(b).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser'+c+'" class="collapse-toggle" href="#">'+gettext("Show")+"</a>)")});a("fieldset.collapse a.collapse-toggle").click(function(){a(this).closest("fieldset").hasClass("collapsed")?a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]):a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset",
|
||||
[a(this).attr("id")]);return!1})})})(django.jQuery);
|
||||
(function (a) {
|
||||
a(document).ready(function () {
|
||||
a("fieldset.collapse").each(function (c, b) {
|
||||
0 == a(b).find("div.errors").length && a(b).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser' + c + '" class="collapse-toggle" href="#">' + gettext("Show") + "</a>)")
|
||||
});
|
||||
a("fieldset.collapse a.collapse-toggle").click(function () {
|
||||
a(this).closest("fieldset").hasClass("collapsed") ? a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [a(this).attr("id")]) : a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset",
|
||||
[a(this).attr("id")]);
|
||||
return!1
|
||||
})
|
||||
})
|
||||
})(django.jQuery);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Core javascript helper functions
|
||||
|
||||
// basic browser identification & version
|
||||
var isOpera = (navigator.userAgent.indexOf("Opera")>=0) && parseFloat(navigator.appVersion);
|
||||
var isOpera = (navigator.userAgent.indexOf("Opera") >= 0) && parseFloat(navigator.appVersion);
|
||||
var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]);
|
||||
|
||||
// Cross-browser event handlers.
|
||||
@@ -44,7 +44,7 @@ function quickElement() {
|
||||
}
|
||||
var len = arguments.length;
|
||||
for (var i = 3; i < len; i += 2) {
|
||||
obj.setAttribute(arguments[i], arguments[i+1]);
|
||||
obj.setAttribute(arguments[i], arguments[i + 1]);
|
||||
}
|
||||
arguments[1].appendChild(obj);
|
||||
return obj;
|
||||
@@ -62,20 +62,20 @@ function removeChildren(a) {
|
||||
var xmlhttp;
|
||||
/*@cc_on @*/
|
||||
/*@if (@_jscript_version >= 5)
|
||||
try {
|
||||
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
|
||||
} catch (e) {
|
||||
try {
|
||||
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
|
||||
} catch (E) {
|
||||
xmlhttp = false;
|
||||
}
|
||||
}
|
||||
@else
|
||||
xmlhttp = false;
|
||||
@end @*/
|
||||
try {
|
||||
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
|
||||
} catch (e) {
|
||||
try {
|
||||
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
|
||||
} catch (E) {
|
||||
xmlhttp = false;
|
||||
}
|
||||
}
|
||||
@else
|
||||
xmlhttp = false;
|
||||
@end @*/
|
||||
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
|
||||
xmlhttp = new XMLHttpRequest();
|
||||
xmlhttp = new XMLHttpRequest();
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -90,7 +90,7 @@ function findPosX(obj) {
|
||||
obj = obj.offsetParent;
|
||||
}
|
||||
// IE offsetParent does not include the top-level
|
||||
if (isIE && obj.parentElement){
|
||||
if (isIE && obj.parentElement) {
|
||||
curleft += obj.offsetLeft - obj.scrollLeft;
|
||||
}
|
||||
} else if (obj.x) {
|
||||
@@ -107,7 +107,7 @@ function findPosY(obj) {
|
||||
obj = obj.offsetParent;
|
||||
}
|
||||
// IE offsetParent does not include the top-level
|
||||
if (isIE && obj.parentElement){
|
||||
if (isIE && obj.parentElement) {
|
||||
curtop += obj.offsetTop - obj.scrollTop;
|
||||
}
|
||||
} else if (obj.y) {
|
||||
@@ -120,49 +120,49 @@ function findPosY(obj) {
|
||||
// Date object extensions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Date.prototype.getTwelveHours = function() {
|
||||
Date.prototype.getTwelveHours = function () {
|
||||
hours = this.getHours();
|
||||
if (hours == 0) {
|
||||
return 12;
|
||||
}
|
||||
else {
|
||||
return hours <= 12 ? hours : hours-12
|
||||
return hours <= 12 ? hours : hours - 12
|
||||
}
|
||||
}
|
||||
|
||||
Date.prototype.getTwoDigitMonth = function() {
|
||||
return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);
|
||||
Date.prototype.getTwoDigitMonth = function () {
|
||||
return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1);
|
||||
}
|
||||
|
||||
Date.prototype.getTwoDigitDate = function() {
|
||||
Date.prototype.getTwoDigitDate = function () {
|
||||
return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
|
||||
}
|
||||
|
||||
Date.prototype.getTwoDigitTwelveHour = function() {
|
||||
Date.prototype.getTwoDigitTwelveHour = function () {
|
||||
return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours();
|
||||
}
|
||||
|
||||
Date.prototype.getTwoDigitHour = function() {
|
||||
Date.prototype.getTwoDigitHour = function () {
|
||||
return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
|
||||
}
|
||||
|
||||
Date.prototype.getTwoDigitMinute = function() {
|
||||
Date.prototype.getTwoDigitMinute = function () {
|
||||
return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
|
||||
}
|
||||
|
||||
Date.prototype.getTwoDigitSecond = function() {
|
||||
Date.prototype.getTwoDigitSecond = function () {
|
||||
return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
|
||||
}
|
||||
|
||||
Date.prototype.getHourMinute = function() {
|
||||
Date.prototype.getHourMinute = function () {
|
||||
return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
|
||||
}
|
||||
|
||||
Date.prototype.getHourMinuteSecond = function() {
|
||||
Date.prototype.getHourMinuteSecond = function () {
|
||||
return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond();
|
||||
}
|
||||
|
||||
Date.prototype.strftime = function(format) {
|
||||
Date.prototype.strftime = function (format) {
|
||||
var fields = {
|
||||
c: this.toString(),
|
||||
d: this.getTwoDigitDate(),
|
||||
@@ -177,7 +177,7 @@ Date.prototype.strftime = function(format) {
|
||||
X: this.toLocaleTimeString(),
|
||||
y: ('' + this.getFullYear()).substr(2, 4),
|
||||
Y: '' + this.getFullYear(),
|
||||
'%' : '%'
|
||||
'%': '%'
|
||||
};
|
||||
var result = '', i = 0;
|
||||
while (i < format.length) {
|
||||
@@ -196,7 +196,7 @@ Date.prototype.strftime = function(format) {
|
||||
// ----------------------------------------------------------------------------
|
||||
// String object extensions
|
||||
// ----------------------------------------------------------------------------
|
||||
String.prototype.pad_left = function(pad_length, pad_string) {
|
||||
String.prototype.pad_left = function (pad_length, pad_string) {
|
||||
var new_string = this;
|
||||
for (var i = 0; new_string.length < pad_length; i++) {
|
||||
new_string = pad_string + new_string;
|
||||
@@ -207,13 +207,13 @@ String.prototype.pad_left = function(pad_length, pad_string) {
|
||||
// ----------------------------------------------------------------------------
|
||||
// Get the computed style for and element
|
||||
// ----------------------------------------------------------------------------
|
||||
function getStyle(oElm, strCssRule){
|
||||
function getStyle(oElm, strCssRule) {
|
||||
var strValue = "";
|
||||
if(document.defaultView && document.defaultView.getComputedStyle){
|
||||
if (document.defaultView && document.defaultView.getComputedStyle) {
|
||||
strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
|
||||
}
|
||||
else if(oElm.currentStyle){
|
||||
strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
|
||||
else if (oElm.currentStyle) {
|
||||
strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1) {
|
||||
return p1.toUpperCase();
|
||||
});
|
||||
strValue = oElm.currentStyle[strCssRule];
|
||||
|
||||
@@ -14,259 +14,258 @@
|
||||
* Licensed under the New BSD License
|
||||
* See: http://www.opensource.org/licenses/bsd-license.php
|
||||
*/
|
||||
(function($) {
|
||||
$.fn.formset = function(opts) {
|
||||
var options = $.extend({}, $.fn.formset.defaults, opts);
|
||||
var $this = $(this);
|
||||
var $parent = $this.parent();
|
||||
var updateElementIndex = function(el, prefix, ndx) {
|
||||
var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))");
|
||||
var replacement = prefix + "-" + ndx;
|
||||
if ($(el).prop("for")) {
|
||||
$(el).prop("for", $(el).prop("for").replace(id_regex, replacement));
|
||||
}
|
||||
if (el.id) {
|
||||
el.id = el.id.replace(id_regex, replacement);
|
||||
}
|
||||
if (el.name) {
|
||||
el.name = el.name.replace(id_regex, replacement);
|
||||
}
|
||||
};
|
||||
var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off");
|
||||
var nextIndex = parseInt(totalForms.val(), 10);
|
||||
var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off");
|
||||
// only show the add button if we are allowed to add more items,
|
||||
(function ($) {
|
||||
$.fn.formset = function (opts) {
|
||||
var options = $.extend({}, $.fn.formset.defaults, opts);
|
||||
var $this = $(this);
|
||||
var $parent = $this.parent();
|
||||
var updateElementIndex = function (el, prefix, ndx) {
|
||||
var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))");
|
||||
var replacement = prefix + "-" + ndx;
|
||||
if ($(el).prop("for")) {
|
||||
$(el).prop("for", $(el).prop("for").replace(id_regex, replacement));
|
||||
}
|
||||
if (el.id) {
|
||||
el.id = el.id.replace(id_regex, replacement);
|
||||
}
|
||||
if (el.name) {
|
||||
el.name = el.name.replace(id_regex, replacement);
|
||||
}
|
||||
};
|
||||
var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off");
|
||||
var nextIndex = parseInt(totalForms.val(), 10);
|
||||
var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off");
|
||||
// only show the add button if we are allowed to add more items,
|
||||
// note that max_num = None translates to a blank string.
|
||||
var showAddButton = maxForms.val() === '' || (maxForms.val()-totalForms.val()) > 0;
|
||||
$this.each(function(i) {
|
||||
$(this).not("." + options.emptyCssClass).addClass(options.formCssClass);
|
||||
});
|
||||
if ($this.length && showAddButton) {
|
||||
var addButton;
|
||||
if ($this.prop("tagName") == "TR") {
|
||||
// If forms are laid out as table rows, insert the
|
||||
// "add" button in a new table row:
|
||||
var numCols = this.eq(-1).children().length;
|
||||
$parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="javascript:void(0)">' + options.addText + "</a></tr>");
|
||||
addButton = $parent.find("tr:last a");
|
||||
} else {
|
||||
// Otherwise, insert it immediately after the last form:
|
||||
$this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="javascript:void(0)">' + options.addText + "</a></div>");
|
||||
addButton = $this.filter(":last").next().find("a");
|
||||
}
|
||||
addButton.click(function(e) {
|
||||
e.preventDefault();
|
||||
var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS");
|
||||
var template = $("#" + options.prefix + "-empty");
|
||||
var row = template.clone(true);
|
||||
row.removeClass(options.emptyCssClass)
|
||||
.addClass(options.formCssClass)
|
||||
.attr("id", options.prefix + "-" + nextIndex);
|
||||
if (row.is("tr")) {
|
||||
// If the forms are laid out in table rows, insert
|
||||
// the remove button into the last table cell:
|
||||
row.children(":last").append('<div><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></div>");
|
||||
} else if (row.is("ul") || row.is("ol")) {
|
||||
// If they're laid out as an ordered/unordered list,
|
||||
// insert an <li> after the last list item:
|
||||
row.append('<li><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></li>");
|
||||
} else {
|
||||
// Otherwise, just insert the remove button as the
|
||||
// last child element of the form's container:
|
||||
row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
|
||||
}
|
||||
row.find("*").each(function() {
|
||||
updateElementIndex(this, options.prefix, totalForms.val());
|
||||
var showAddButton = maxForms.val() === '' || (maxForms.val() - totalForms.val()) > 0;
|
||||
$this.each(function (i) {
|
||||
$(this).not("." + options.emptyCssClass).addClass(options.formCssClass);
|
||||
});
|
||||
// Insert the new form when it has been fully edited
|
||||
row.insertBefore($(template));
|
||||
// Update number of total forms
|
||||
$(totalForms).val(parseInt(totalForms.val(), 10) + 1);
|
||||
nextIndex += 1;
|
||||
// Hide add button in case we've hit the max, except we want to add infinitely
|
||||
if ((maxForms.val() !== '') && (maxForms.val()-totalForms.val()) <= 0) {
|
||||
addButton.parent().hide();
|
||||
}
|
||||
// The delete button of each row triggers a bunch of other things
|
||||
row.find("a." + options.deleteCssClass).click(function(e) {
|
||||
e.preventDefault();
|
||||
// Remove the parent form containing this button:
|
||||
var row = $(this).parents("." + options.formCssClass);
|
||||
row.remove();
|
||||
nextIndex -= 1;
|
||||
// If a post-delete callback was provided, call it with the deleted form:
|
||||
if (options.removed) {
|
||||
options.removed(row);
|
||||
}
|
||||
// Update the TOTAL_FORMS form count.
|
||||
var forms = $("." + options.formCssClass);
|
||||
$("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
|
||||
// Show add button again once we drop below max
|
||||
if ((maxForms.val() === '') || (maxForms.val()-forms.length) > 0) {
|
||||
addButton.parent().show();
|
||||
}
|
||||
// Also, update names and ids for all remaining form controls
|
||||
// so they remain in sequence:
|
||||
for (var i=0, formCount=forms.length; i<formCount; i++)
|
||||
{
|
||||
updateElementIndex($(forms).get(i), options.prefix, i);
|
||||
$(forms.get(i)).find("*").each(function() {
|
||||
updateElementIndex(this, options.prefix, i);
|
||||
if ($this.length && showAddButton) {
|
||||
var addButton;
|
||||
if ($this.prop("tagName") == "TR") {
|
||||
// If forms are laid out as table rows, insert the
|
||||
// "add" button in a new table row:
|
||||
var numCols = this.eq(-1).children().length;
|
||||
$parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="javascript:void(0)">' + options.addText + "</a></tr>");
|
||||
addButton = $parent.find("tr:last a");
|
||||
} else {
|
||||
// Otherwise, insert it immediately after the last form:
|
||||
$this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="javascript:void(0)">' + options.addText + "</a></div>");
|
||||
addButton = $this.filter(":last").next().find("a");
|
||||
}
|
||||
addButton.click(function (e) {
|
||||
e.preventDefault();
|
||||
var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS");
|
||||
var template = $("#" + options.prefix + "-empty");
|
||||
var row = template.clone(true);
|
||||
row.removeClass(options.emptyCssClass)
|
||||
.addClass(options.formCssClass)
|
||||
.attr("id", options.prefix + "-" + nextIndex);
|
||||
if (row.is("tr")) {
|
||||
// If the forms are laid out in table rows, insert
|
||||
// the remove button into the last table cell:
|
||||
row.children(":last").append('<div><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></div>");
|
||||
} else if (row.is("ul") || row.is("ol")) {
|
||||
// If they're laid out as an ordered/unordered list,
|
||||
// insert an <li> after the last list item:
|
||||
row.append('<li><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></li>");
|
||||
} else {
|
||||
// Otherwise, just insert the remove button as the
|
||||
// last child element of the form's container:
|
||||
row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
|
||||
}
|
||||
row.find("*").each(function () {
|
||||
updateElementIndex(this, options.prefix, totalForms.val());
|
||||
});
|
||||
// Insert the new form when it has been fully edited
|
||||
row.insertBefore($(template));
|
||||
// Update number of total forms
|
||||
$(totalForms).val(parseInt(totalForms.val(), 10) + 1);
|
||||
nextIndex += 1;
|
||||
// Hide add button in case we've hit the max, except we want to add infinitely
|
||||
if ((maxForms.val() !== '') && (maxForms.val() - totalForms.val()) <= 0) {
|
||||
addButton.parent().hide();
|
||||
}
|
||||
// The delete button of each row triggers a bunch of other things
|
||||
row.find("a." + options.deleteCssClass).click(function (e) {
|
||||
e.preventDefault();
|
||||
// Remove the parent form containing this button:
|
||||
var row = $(this).parents("." + options.formCssClass);
|
||||
row.remove();
|
||||
nextIndex -= 1;
|
||||
// If a post-delete callback was provided, call it with the deleted form:
|
||||
if (options.removed) {
|
||||
options.removed(row);
|
||||
}
|
||||
// Update the TOTAL_FORMS form count.
|
||||
var forms = $("." + options.formCssClass);
|
||||
$("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
|
||||
// Show add button again once we drop below max
|
||||
if ((maxForms.val() === '') || (maxForms.val() - forms.length) > 0) {
|
||||
addButton.parent().show();
|
||||
}
|
||||
// Also, update names and ids for all remaining form controls
|
||||
// so they remain in sequence:
|
||||
for (var i = 0, formCount = forms.length; i < formCount; i++) {
|
||||
updateElementIndex($(forms).get(i), options.prefix, i);
|
||||
$(forms.get(i)).find("*").each(function () {
|
||||
updateElementIndex(this, options.prefix, i);
|
||||
});
|
||||
}
|
||||
});
|
||||
// If a post-add callback was supplied, call it with the added form:
|
||||
if (options.added) {
|
||||
options.added(row);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
// If a post-add callback was supplied, call it with the added form:
|
||||
if (options.added) {
|
||||
options.added(row);
|
||||
}
|
||||
});
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
/* Setup plugin defaults */
|
||||
$.fn.formset.defaults = {
|
||||
prefix: "form", // The form prefix for your django formset
|
||||
addText: "add another", // Text for the add link
|
||||
deleteText: "remove", // Text for the delete link
|
||||
addCssClass: "add-row", // CSS class applied to the add link
|
||||
deleteCssClass: "delete-row", // CSS class applied to the delete link
|
||||
emptyCssClass: "empty-row", // CSS class applied to the empty row
|
||||
formCssClass: "dynamic-form", // CSS class applied to each form in a formset
|
||||
added: null, // Function called each time a new form is added
|
||||
removed: null // Function called each time a form is deleted
|
||||
};
|
||||
|
||||
|
||||
// Tabular inlines ---------------------------------------------------------
|
||||
$.fn.tabularFormset = function(options) {
|
||||
var $rows = $(this);
|
||||
var alternatingRows = function(row) {
|
||||
$($rows.selector).not(".add-row").removeClass("row1 row2")
|
||||
.filter(":even").addClass("row1").end()
|
||||
.filter(":odd").addClass("row2");
|
||||
return this;
|
||||
};
|
||||
|
||||
var reinitDateTimeShortCuts = function() {
|
||||
// Reinitialize the calendar and clock widgets by force
|
||||
if (typeof DateTimeShortcuts != "undefined") {
|
||||
$(".datetimeshortcuts").remove();
|
||||
DateTimeShortcuts.init();
|
||||
}
|
||||
/* Setup plugin defaults */
|
||||
$.fn.formset.defaults = {
|
||||
prefix: "form", // The form prefix for your django formset
|
||||
addText: "add another", // Text for the add link
|
||||
deleteText: "remove", // Text for the delete link
|
||||
addCssClass: "add-row", // CSS class applied to the add link
|
||||
deleteCssClass: "delete-row", // CSS class applied to the delete link
|
||||
emptyCssClass: "empty-row", // CSS class applied to the empty row
|
||||
formCssClass: "dynamic-form", // CSS class applied to each form in a formset
|
||||
added: null, // Function called each time a new form is added
|
||||
removed: null // Function called each time a form is deleted
|
||||
};
|
||||
|
||||
var updateSelectFilter = function() {
|
||||
// If any SelectFilter widgets are a part of the new form,
|
||||
// instantiate a new SelectFilter instance for it.
|
||||
if (typeof SelectFilter != 'undefined'){
|
||||
$('.selectfilter').each(function(index, value){
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix );
|
||||
|
||||
// Tabular inlines ---------------------------------------------------------
|
||||
$.fn.tabularFormset = function (options) {
|
||||
var $rows = $(this);
|
||||
var alternatingRows = function (row) {
|
||||
$($rows.selector).not(".add-row").removeClass("row1 row2")
|
||||
.filter(":even").addClass("row1").end()
|
||||
.filter(":odd").addClass("row2");
|
||||
};
|
||||
|
||||
var reinitDateTimeShortCuts = function () {
|
||||
// Reinitialize the calendar and clock widgets by force
|
||||
if (typeof DateTimeShortcuts != "undefined") {
|
||||
$(".datetimeshortcuts").remove();
|
||||
DateTimeShortcuts.init();
|
||||
}
|
||||
};
|
||||
|
||||
var updateSelectFilter = function () {
|
||||
// If any SelectFilter widgets are a part of the new form,
|
||||
// instantiate a new SelectFilter instance for it.
|
||||
if (typeof SelectFilter != 'undefined') {
|
||||
$('.selectfilter').each(function (index, value) {
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length - 1], false, options.adminStaticPrefix);
|
||||
});
|
||||
$('.selectfilterstacked').each(function (index, value) {
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length - 1], true, options.adminStaticPrefix);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
var initPrepopulatedFields = function (row) {
|
||||
row.find('.prepopulated_field').each(function () {
|
||||
var field = $(this),
|
||||
input = field.find('input, select, textarea'),
|
||||
dependency_list = input.data('dependency_list') || [],
|
||||
dependencies = [];
|
||||
$.each(dependency_list, function (i, field_name) {
|
||||
dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
|
||||
});
|
||||
if (dependencies.length) {
|
||||
input.prepopulate(dependencies, input.attr('maxlength'));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$rows.formset({
|
||||
prefix: options.prefix,
|
||||
addText: options.addText,
|
||||
formCssClass: "dynamic-" + options.prefix,
|
||||
deleteCssClass: "inline-deletelink",
|
||||
deleteText: options.deleteText,
|
||||
emptyCssClass: "empty-form",
|
||||
removed: alternatingRows,
|
||||
added: function (row) {
|
||||
initPrepopulatedFields(row);
|
||||
reinitDateTimeShortCuts();
|
||||
updateSelectFilter();
|
||||
alternatingRows(row);
|
||||
}
|
||||
});
|
||||
$('.selectfilterstacked').each(function(index, value){
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix );
|
||||
|
||||
return $rows;
|
||||
};
|
||||
|
||||
// Stacked inlines ---------------------------------------------------------
|
||||
$.fn.stackedFormset = function (options) {
|
||||
var $rows = $(this);
|
||||
var updateInlineLabel = function (row) {
|
||||
$($rows.selector).find(".inline_label").each(function (i) {
|
||||
var count = i + 1;
|
||||
$(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
|
||||
});
|
||||
};
|
||||
|
||||
var reinitDateTimeShortCuts = function () {
|
||||
// Reinitialize the calendar and clock widgets by force, yuck.
|
||||
if (typeof DateTimeShortcuts != "undefined") {
|
||||
$(".datetimeshortcuts").remove();
|
||||
DateTimeShortcuts.init();
|
||||
}
|
||||
};
|
||||
|
||||
var updateSelectFilter = function () {
|
||||
// If any SelectFilter widgets were added, instantiate a new instance.
|
||||
if (typeof SelectFilter != "undefined") {
|
||||
$(".selectfilter").each(function (index, value) {
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length - 1], false, options.adminStaticPrefix);
|
||||
});
|
||||
$(".selectfilterstacked").each(function (index, value) {
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length - 1], true, options.adminStaticPrefix);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
var initPrepopulatedFields = function (row) {
|
||||
row.find('.prepopulated_field').each(function () {
|
||||
var field = $(this),
|
||||
input = field.find('input, select, textarea'),
|
||||
dependency_list = input.data('dependency_list') || [],
|
||||
dependencies = [];
|
||||
$.each(dependency_list, function (i, field_name) {
|
||||
dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id'));
|
||||
});
|
||||
if (dependencies.length) {
|
||||
input.prepopulate(dependencies, input.attr('maxlength'));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$rows.formset({
|
||||
prefix: options.prefix,
|
||||
addText: options.addText,
|
||||
formCssClass: "dynamic-" + options.prefix,
|
||||
deleteCssClass: "inline-deletelink",
|
||||
deleteText: options.deleteText,
|
||||
emptyCssClass: "empty-form",
|
||||
removed: updateInlineLabel,
|
||||
added: (function (row) {
|
||||
initPrepopulatedFields(row);
|
||||
reinitDateTimeShortCuts();
|
||||
updateSelectFilter();
|
||||
updateInlineLabel(row);
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
return $rows;
|
||||
};
|
||||
|
||||
var initPrepopulatedFields = function(row) {
|
||||
row.find('.prepopulated_field').each(function() {
|
||||
var field = $(this),
|
||||
input = field.find('input, select, textarea'),
|
||||
dependency_list = input.data('dependency_list') || [],
|
||||
dependencies = [];
|
||||
$.each(dependency_list, function(i, field_name) {
|
||||
dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
|
||||
});
|
||||
if (dependencies.length) {
|
||||
input.prepopulate(dependencies, input.attr('maxlength'));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$rows.formset({
|
||||
prefix: options.prefix,
|
||||
addText: options.addText,
|
||||
formCssClass: "dynamic-" + options.prefix,
|
||||
deleteCssClass: "inline-deletelink",
|
||||
deleteText: options.deleteText,
|
||||
emptyCssClass: "empty-form",
|
||||
removed: alternatingRows,
|
||||
added: function(row) {
|
||||
initPrepopulatedFields(row);
|
||||
reinitDateTimeShortCuts();
|
||||
updateSelectFilter();
|
||||
alternatingRows(row);
|
||||
}
|
||||
});
|
||||
|
||||
return $rows;
|
||||
};
|
||||
|
||||
// Stacked inlines ---------------------------------------------------------
|
||||
$.fn.stackedFormset = function(options) {
|
||||
var $rows = $(this);
|
||||
var updateInlineLabel = function(row) {
|
||||
$($rows.selector).find(".inline_label").each(function(i) {
|
||||
var count = i + 1;
|
||||
$(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
|
||||
});
|
||||
};
|
||||
|
||||
var reinitDateTimeShortCuts = function() {
|
||||
// Reinitialize the calendar and clock widgets by force, yuck.
|
||||
if (typeof DateTimeShortcuts != "undefined") {
|
||||
$(".datetimeshortcuts").remove();
|
||||
DateTimeShortcuts.init();
|
||||
}
|
||||
};
|
||||
|
||||
var updateSelectFilter = function() {
|
||||
// If any SelectFilter widgets were added, instantiate a new instance.
|
||||
if (typeof SelectFilter != "undefined"){
|
||||
$(".selectfilter").each(function(index, value){
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix);
|
||||
});
|
||||
$(".selectfilterstacked").each(function(index, value){
|
||||
var namearr = value.name.split('-');
|
||||
SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
var initPrepopulatedFields = function(row) {
|
||||
row.find('.prepopulated_field').each(function() {
|
||||
var field = $(this),
|
||||
input = field.find('input, select, textarea'),
|
||||
dependency_list = input.data('dependency_list') || [],
|
||||
dependencies = [];
|
||||
$.each(dependency_list, function(i, field_name) {
|
||||
dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id'));
|
||||
});
|
||||
if (dependencies.length) {
|
||||
input.prepopulate(dependencies, input.attr('maxlength'));
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
$rows.formset({
|
||||
prefix: options.prefix,
|
||||
addText: options.addText,
|
||||
formCssClass: "dynamic-" + options.prefix,
|
||||
deleteCssClass: "inline-deletelink",
|
||||
deleteText: options.deleteText,
|
||||
emptyCssClass: "empty-form",
|
||||
removed: updateInlineLabel,
|
||||
added: (function(row) {
|
||||
initPrepopulatedFields(row);
|
||||
reinitDateTimeShortCuts();
|
||||
updateSelectFilter();
|
||||
updateInlineLabel(row);
|
||||
})
|
||||
});
|
||||
|
||||
return $rows;
|
||||
};
|
||||
})(django.jQuery);
|
||||
|
||||
116
static/admin/js/inlines.min.js
vendored
116
static/admin/js/inlines.min.js
vendored
@@ -1,9 +1,107 @@
|
||||
(function(b){b.fn.formset=function(d){var a=b.extend({},b.fn.formset.defaults,d),c=b(this),d=c.parent(),i=function(a,e,g){var d=RegExp("("+e+"-(\\d+|__prefix__))"),e=e+"-"+g;b(a).prop("for")&&b(a).prop("for",b(a).prop("for").replace(d,e));a.id&&(a.id=a.id.replace(d,e));a.name&&(a.name=a.name.replace(d,e))},f=b("#id_"+a.prefix+"-TOTAL_FORMS").prop("autocomplete","off"),g=parseInt(f.val(),10),e=b("#id_"+a.prefix+"-MAX_NUM_FORMS").prop("autocomplete","off"),f=""===e.val()||0<e.val()-f.val();c.each(function(){b(this).not("."+
|
||||
a.emptyCssClass).addClass(a.formCssClass)});if(c.length&&f){var h;"TR"==c.prop("tagName")?(c=this.eq(-1).children().length,d.append('<tr class="'+a.addCssClass+'"><td colspan="'+c+'"><a href="javascript:void(0)">'+a.addText+"</a></tr>"),h=d.find("tr:last a")):(c.filter(":last").after('<div class="'+a.addCssClass+'"><a href="javascript:void(0)">'+a.addText+"</a></div>"),h=c.filter(":last").next().find("a"));h.click(function(d){d.preventDefault();var f=b("#id_"+a.prefix+"-TOTAL_FORMS"),d=b("#"+a.prefix+
|
||||
"-empty"),c=d.clone(true);c.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+g);c.is("tr")?c.children(":last").append('<div><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></div>"):c.is("ul")||c.is("ol")?c.append('<li><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></li>"):c.children(":first").append('<span><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></span>");c.find("*").each(function(){i(this,
|
||||
a.prefix,f.val())});c.insertBefore(b(d));b(f).val(parseInt(f.val(),10)+1);g=g+1;e.val()!==""&&e.val()-f.val()<=0&&h.parent().hide();c.find("a."+a.deleteCssClass).click(function(d){d.preventDefault();d=b(this).parents("."+a.formCssClass);d.remove();g=g-1;a.removed&&a.removed(d);d=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(d.length);(e.val()===""||e.val()-d.length>0)&&h.parent().show();for(var c=0,f=d.length;c<f;c++){i(b(d).get(c),a.prefix,c);b(d.get(c)).find("*").each(function(){i(this,
|
||||
a.prefix,c)})}});a.added&&a.added(c)})}return this};b.fn.formset.defaults={prefix:"form",addText:"add another",deleteText:"remove",addCssClass:"add-row",deleteCssClass:"delete-row",emptyCssClass:"empty-row",formCssClass:"dynamic-form",added:null,removed:null};b.fn.tabularFormset=function(d){var a=b(this),c=function(){b(a.selector).not(".add-row").removeClass("row1 row2").filter(":even").addClass("row1").end().filter(":odd").addClass("row2")};a.formset({prefix:d.prefix,addText:d.addText,formCssClass:"dynamic-"+
|
||||
d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:c,added:function(a){a.find(".prepopulated_field").each(function(){var d=b(this).find("input, select, textarea"),c=d.data("dependency_list")||[],e=[];b.each(c,function(d,b){e.push("#"+a.find(".field-"+b).find("input, select, textarea").attr("id"))});e.length&&d.prepopulate(e,d.attr("maxlength"))});"undefined"!=typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(),DateTimeShortcuts.init());"undefined"!=
|
||||
typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],false,d.adminStaticPrefix)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],true,d.adminStaticPrefix)}));c(a)}});return a};b.fn.stackedFormset=function(d){var a=b(this),c=function(){b(a.selector).find(".inline_label").each(function(a){a+=1;b(this).html(b(this).html().replace(/(#\d+)/g,"#"+a))})};a.formset({prefix:d.prefix,
|
||||
addText:d.addText,formCssClass:"dynamic-"+d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:c,added:function(a){a.find(".prepopulated_field").each(function(){var d=b(this).find("input, select, textarea"),c=d.data("dependency_list")||[],e=[];b.each(c,function(d,b){e.push("#"+a.find(".form-row .field-"+b).find("input, select, textarea").attr("id"))});e.length&&d.prepopulate(e,d.attr("maxlength"))});"undefined"!=typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(),
|
||||
DateTimeShortcuts.init());"undefined"!=typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],false,d.adminStaticPrefix)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],true,d.adminStaticPrefix)}));c(a)}});return a}})(django.jQuery);
|
||||
(function (b) {
|
||||
b.fn.formset = function (d) {
|
||||
var a = b.extend({}, b.fn.formset.defaults, d), c = b(this), d = c.parent(), i = function (a, e, g) {
|
||||
var d = RegExp("(" + e + "-(\\d+|__prefix__))"), e = e + "-" + g;
|
||||
b(a).prop("for") && b(a).prop("for", b(a).prop("for").replace(d, e));
|
||||
a.id && (a.id = a.id.replace(d, e));
|
||||
a.name && (a.name = a.name.replace(d, e))
|
||||
}, f = b("#id_" + a.prefix + "-TOTAL_FORMS").prop("autocomplete", "off"), g = parseInt(f.val(), 10), e = b("#id_" + a.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off"), f = "" === e.val() || 0 < e.val() - f.val();
|
||||
c.each(function () {
|
||||
b(this).not("." +
|
||||
a.emptyCssClass).addClass(a.formCssClass)
|
||||
});
|
||||
if (c.length && f) {
|
||||
var h;
|
||||
"TR" == c.prop("tagName") ? (c = this.eq(-1).children().length, d.append('<tr class="' + a.addCssClass + '"><td colspan="' + c + '"><a href="javascript:void(0)">' + a.addText + "</a></tr>"), h = d.find("tr:last a")) : (c.filter(":last").after('<div class="' + a.addCssClass + '"><a href="javascript:void(0)">' + a.addText + "</a></div>"), h = c.filter(":last").next().find("a"));
|
||||
h.click(function (d) {
|
||||
d.preventDefault();
|
||||
var f = b("#id_" + a.prefix + "-TOTAL_FORMS"), d = b("#" + a.prefix +
|
||||
"-empty"), c = d.clone(true);
|
||||
c.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id", a.prefix + "-" + g);
|
||||
c.is("tr") ? c.children(":last").append('<div><a class="' + a.deleteCssClass + '" href="javascript:void(0)">' + a.deleteText + "</a></div>") : c.is("ul") || c.is("ol") ? c.append('<li><a class="' + a.deleteCssClass + '" href="javascript:void(0)">' + a.deleteText + "</a></li>") : c.children(":first").append('<span><a class="' + a.deleteCssClass + '" href="javascript:void(0)">' + a.deleteText + "</a></span>");
|
||||
c.find("*").each(function () {
|
||||
i(this,
|
||||
a.prefix, f.val())
|
||||
});
|
||||
c.insertBefore(b(d));
|
||||
b(f).val(parseInt(f.val(), 10) + 1);
|
||||
g = g + 1;
|
||||
e.val() !== "" && e.val() - f.val() <= 0 && h.parent().hide();
|
||||
c.find("a." + a.deleteCssClass).click(function (d) {
|
||||
d.preventDefault();
|
||||
d = b(this).parents("." + a.formCssClass);
|
||||
d.remove();
|
||||
g = g - 1;
|
||||
a.removed && a.removed(d);
|
||||
d = b("." + a.formCssClass);
|
||||
b("#id_" + a.prefix + "-TOTAL_FORMS").val(d.length);
|
||||
(e.val() === "" || e.val() - d.length > 0) && h.parent().show();
|
||||
for (var c = 0, f = d.length; c < f; c++) {
|
||||
i(b(d).get(c), a.prefix, c);
|
||||
b(d.get(c)).find("*").each(function () {
|
||||
i(this,
|
||||
a.prefix, c)
|
||||
})
|
||||
}
|
||||
});
|
||||
a.added && a.added(c)
|
||||
})
|
||||
}
|
||||
return this
|
||||
};
|
||||
b.fn.formset.defaults = {prefix: "form", addText: "add another", deleteText: "remove", addCssClass: "add-row", deleteCssClass: "delete-row", emptyCssClass: "empty-row", formCssClass: "dynamic-form", added: null, removed: null};
|
||||
b.fn.tabularFormset = function (d) {
|
||||
var a = b(this), c = function () {
|
||||
b(a.selector).not(".add-row").removeClass("row1 row2").filter(":even").addClass("row1").end().filter(":odd").addClass("row2")
|
||||
};
|
||||
a.formset({prefix: d.prefix, addText: d.addText, formCssClass: "dynamic-" +
|
||||
d.prefix, deleteCssClass: "inline-deletelink", deleteText: d.deleteText, emptyCssClass: "empty-form", removed: c, added: function (a) {
|
||||
a.find(".prepopulated_field").each(function () {
|
||||
var d = b(this).find("input, select, textarea"), c = d.data("dependency_list") || [], e = [];
|
||||
b.each(c, function (d, b) {
|
||||
e.push("#" + a.find(".field-" + b).find("input, select, textarea").attr("id"))
|
||||
});
|
||||
e.length && d.prepopulate(e, d.attr("maxlength"))
|
||||
});
|
||||
"undefined" != typeof DateTimeShortcuts && (b(".datetimeshortcuts").remove(), DateTimeShortcuts.init());
|
||||
"undefined" != typeof SelectFilter && (b(".selectfilter").each(function (a, b) {
|
||||
var c = b.name.split("-");
|
||||
SelectFilter.init(b.id, c[c.length - 1], false, d.adminStaticPrefix)
|
||||
}), b(".selectfilterstacked").each(function (a, b) {
|
||||
var c = b.name.split("-");
|
||||
SelectFilter.init(b.id, c[c.length - 1], true, d.adminStaticPrefix)
|
||||
}));
|
||||
c(a)
|
||||
}});
|
||||
return a
|
||||
};
|
||||
b.fn.stackedFormset = function (d) {
|
||||
var a = b(this), c = function () {
|
||||
b(a.selector).find(".inline_label").each(function (a) {
|
||||
a += 1;
|
||||
b(this).html(b(this).html().replace(/(#\d+)/g, "#" + a))
|
||||
})
|
||||
};
|
||||
a.formset({prefix: d.prefix,
|
||||
addText: d.addText, formCssClass: "dynamic-" + d.prefix, deleteCssClass: "inline-deletelink", deleteText: d.deleteText, emptyCssClass: "empty-form", removed: c, added: function (a) {
|
||||
a.find(".prepopulated_field").each(function () {
|
||||
var d = b(this).find("input, select, textarea"), c = d.data("dependency_list") || [], e = [];
|
||||
b.each(c, function (d, b) {
|
||||
e.push("#" + a.find(".form-row .field-" + b).find("input, select, textarea").attr("id"))
|
||||
});
|
||||
e.length && d.prepopulate(e, d.attr("maxlength"))
|
||||
});
|
||||
"undefined" != typeof DateTimeShortcuts && (b(".datetimeshortcuts").remove(),
|
||||
DateTimeShortcuts.init());
|
||||
"undefined" != typeof SelectFilter && (b(".selectfilter").each(function (a, b) {
|
||||
var c = b.name.split("-");
|
||||
SelectFilter.init(b.id, c[c.length - 1], false, d.adminStaticPrefix)
|
||||
}), b(".selectfilterstacked").each(function (a, b) {
|
||||
var c = b.name.split("-");
|
||||
SelectFilter.init(b.id, c[c.length - 1], true, d.adminStaticPrefix)
|
||||
}));
|
||||
c(a)
|
||||
}});
|
||||
return a
|
||||
}
|
||||
})(django.jQuery);
|
||||
|
||||
17674
static/admin/js/jquery.js
vendored
17674
static/admin/js/jquery.js
vendored
File diff suppressed because it is too large
Load Diff
2207
static/admin/js/jquery.min.js
vendored
2207
static/admin/js/jquery.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,29 +1,29 @@
|
||||
(function($) {
|
||||
$.fn.prepopulate = function(dependencies, maxLength) {
|
||||
(function ($) {
|
||||
$.fn.prepopulate = function (dependencies, maxLength) {
|
||||
/*
|
||||
Depends on urlify.js
|
||||
Populates a selected field with the values of the dependent fields,
|
||||
URLifies and shortens the string.
|
||||
dependencies - array of dependent fields id's
|
||||
maxLength - maximum length of the URLify'd string
|
||||
*/
|
||||
return this.each(function() {
|
||||
Depends on urlify.js
|
||||
Populates a selected field with the values of the dependent fields,
|
||||
URLifies and shortens the string.
|
||||
dependencies - array of dependent fields id's
|
||||
maxLength - maximum length of the URLify'd string
|
||||
*/
|
||||
return this.each(function () {
|
||||
var field = $(this);
|
||||
|
||||
field.data('_changed', false);
|
||||
field.change(function() {
|
||||
field.change(function () {
|
||||
field.data('_changed', true);
|
||||
});
|
||||
|
||||
var populate = function () {
|
||||
// Bail if the fields value has changed
|
||||
if (field.data('_changed') == true) return;
|
||||
|
||||
|
||||
var values = [];
|
||||
$.each(dependencies, function(i, field) {
|
||||
if ($(field).val().length > 0) {
|
||||
values.push($(field).val());
|
||||
}
|
||||
$.each(dependencies, function (i, field) {
|
||||
if ($(field).val().length > 0) {
|
||||
values.push($(field).val());
|
||||
}
|
||||
})
|
||||
field.val(URLify(values.join(' '), maxLength));
|
||||
};
|
||||
|
||||
22
static/admin/js/prepopulate.min.js
vendored
22
static/admin/js/prepopulate.min.js
vendored
@@ -1 +1,21 @@
|
||||
(function(a){a.fn.prepopulate=function(d,g){return this.each(function(){var b=a(this);b.data("_changed",false);b.change(function(){b.data("_changed",true)});var c=function(){if(b.data("_changed")!=true){var e=[];a.each(d,function(h,f){a(f).val().length>0&&e.push(a(f).val())});b.val(URLify(e.join(" "),g))}};a(d.join(",")).keyup(c).change(c).focus(c)})}})(django.jQuery);
|
||||
(function (a) {
|
||||
a.fn.prepopulate = function (d, g) {
|
||||
return this.each(function () {
|
||||
var b = a(this);
|
||||
b.data("_changed", false);
|
||||
b.change(function () {
|
||||
b.data("_changed", true)
|
||||
});
|
||||
var c = function () {
|
||||
if (b.data("_changed") != true) {
|
||||
var e = [];
|
||||
a.each(d, function (h, f) {
|
||||
a(f).val().length > 0 && e.push(a(f).val())
|
||||
});
|
||||
b.val(URLify(e.join(" "), g))
|
||||
}
|
||||
};
|
||||
a(d.join(",")).keyup(c).change(c).focus(c)
|
||||
})
|
||||
}
|
||||
})(django.jQuery);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
var timeParsePatterns = [
|
||||
// 9
|
||||
{ re: /^\d{1,2}$/i,
|
||||
handler: function(bits) {
|
||||
handler: function (bits) {
|
||||
if (bits[0].length == 1) {
|
||||
return '0' + bits[0] + ':00';
|
||||
} else {
|
||||
@@ -11,19 +11,19 @@ var timeParsePatterns = [
|
||||
},
|
||||
// 13:00
|
||||
{ re: /^\d{2}[:.]\d{2}$/i,
|
||||
handler: function(bits) {
|
||||
handler: function (bits) {
|
||||
return bits[0].replace('.', ':');
|
||||
}
|
||||
},
|
||||
// 9:00
|
||||
{ re: /^\d[:.]\d{2}$/i,
|
||||
handler: function(bits) {
|
||||
handler: function (bits) {
|
||||
return '0' + bits[0].replace('.', ':');
|
||||
}
|
||||
},
|
||||
// 3 am / 3 a.m. / 3am
|
||||
{ re: /^(\d+)\s*([ap])(?:.?m.?)?$/i,
|
||||
handler: function(bits) {
|
||||
handler: function (bits) {
|
||||
var hour = parseInt(bits[1]);
|
||||
if (hour == 12) {
|
||||
hour = 0;
|
||||
@@ -44,7 +44,7 @@ var timeParsePatterns = [
|
||||
},
|
||||
// 3.30 am / 3:15 a.m. / 3.00am
|
||||
{ re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i,
|
||||
handler: function(bits) {
|
||||
handler: function (bits) {
|
||||
var hour = parseInt(bits[1]);
|
||||
var mins = parseInt(bits[2]);
|
||||
if (mins < 10) {
|
||||
@@ -69,13 +69,13 @@ var timeParsePatterns = [
|
||||
},
|
||||
// noon
|
||||
{ re: /^no/i,
|
||||
handler: function(bits) {
|
||||
handler: function (bits) {
|
||||
return '12:00';
|
||||
}
|
||||
},
|
||||
// midnight
|
||||
{ re: /^mid/i,
|
||||
handler: function(bits) {
|
||||
handler: function (bits) {
|
||||
return '00:00';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,119 +1,106 @@
|
||||
var LATIN_MAP = {
|
||||
'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç':
|
||||
'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I',
|
||||
'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö':
|
||||
'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U',
|
||||
'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä':
|
||||
'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
|
||||
'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó':
|
||||
'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u',
|
||||
'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I',
|
||||
'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U',
|
||||
'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
|
||||
'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u',
|
||||
'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'
|
||||
}
|
||||
var LATIN_SYMBOLS_MAP = {
|
||||
'©':'(c)'
|
||||
'©': '(c)'
|
||||
}
|
||||
var GREEK_MAP = {
|
||||
'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8',
|
||||
'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p',
|
||||
'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w',
|
||||
'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s',
|
||||
'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i',
|
||||
'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8',
|
||||
'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P',
|
||||
'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W',
|
||||
'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I',
|
||||
'Ϋ':'Y'
|
||||
'α': 'a', 'β': 'b', 'γ': 'g', 'δ': 'd', 'ε': 'e', 'ζ': 'z', 'η': 'h', 'θ': '8',
|
||||
'ι': 'i', 'κ': 'k', 'λ': 'l', 'μ': 'm', 'ν': 'n', 'ξ': '3', 'ο': 'o', 'π': 'p',
|
||||
'ρ': 'r', 'σ': 's', 'τ': 't', 'υ': 'y', 'φ': 'f', 'χ': 'x', 'ψ': 'ps', 'ω': 'w',
|
||||
'ά': 'a', 'έ': 'e', 'ί': 'i', 'ό': 'o', 'ύ': 'y', 'ή': 'h', 'ώ': 'w', 'ς': 's',
|
||||
'ϊ': 'i', 'ΰ': 'y', 'ϋ': 'y', 'ΐ': 'i',
|
||||
'Α': 'A', 'Β': 'B', 'Γ': 'G', 'Δ': 'D', 'Ε': 'E', 'Ζ': 'Z', 'Η': 'H', 'Θ': '8',
|
||||
'Ι': 'I', 'Κ': 'K', 'Λ': 'L', 'Μ': 'M', 'Ν': 'N', 'Ξ': '3', 'Ο': 'O', 'Π': 'P',
|
||||
'Ρ': 'R', 'Σ': 'S', 'Τ': 'T', 'Υ': 'Y', 'Φ': 'F', 'Χ': 'X', 'Ψ': 'PS', 'Ω': 'W',
|
||||
'Ά': 'A', 'Έ': 'E', 'Ί': 'I', 'Ό': 'O', 'Ύ': 'Y', 'Ή': 'H', 'Ώ': 'W', 'Ϊ': 'I',
|
||||
'Ϋ': 'Y'
|
||||
}
|
||||
var TURKISH_MAP = {
|
||||
'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U',
|
||||
'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G'
|
||||
'ş': 's', 'Ş': 'S', 'ı': 'i', 'İ': 'I', 'ç': 'c', 'Ç': 'C', 'ü': 'u', 'Ü': 'U',
|
||||
'ö': 'o', 'Ö': 'O', 'ğ': 'g', 'Ğ': 'G'
|
||||
}
|
||||
var RUSSIAN_MAP = {
|
||||
'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh',
|
||||
'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o',
|
||||
'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c',
|
||||
'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu',
|
||||
'я':'ya',
|
||||
'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh',
|
||||
'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O',
|
||||
'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C',
|
||||
'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'', 'Ы':'Y', 'Ь':'', 'Э':'E', 'Ю':'Yu',
|
||||
'Я':'Ya'
|
||||
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', 'ж': 'zh',
|
||||
'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
|
||||
'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c',
|
||||
'ч': 'ch', 'ш': 'sh', 'щ': 'sh', 'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu',
|
||||
'я': 'ya',
|
||||
'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'Yo', 'Ж': 'Zh',
|
||||
'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N', 'О': 'O',
|
||||
'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U', 'Ф': 'F', 'Х': 'H', 'Ц': 'C',
|
||||
'Ч': 'Ch', 'Ш': 'Sh', 'Щ': 'Sh', 'Ъ': '', 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'Yu',
|
||||
'Я': 'Ya'
|
||||
}
|
||||
var UKRAINIAN_MAP = {
|
||||
'Є':'Ye', 'І':'I', 'Ї':'Yi', 'Ґ':'G', 'є':'ye', 'і':'i', 'ї':'yi', 'ґ':'g'
|
||||
'Є': 'Ye', 'І': 'I', 'Ї': 'Yi', 'Ґ': 'G', 'є': 'ye', 'і': 'i', 'ї': 'yi', 'ґ': 'g'
|
||||
}
|
||||
var CZECH_MAP = {
|
||||
'č':'c', 'ď':'d', 'ě':'e', 'ň': 'n', 'ř':'r', 'š':'s', 'ť':'t', 'ů':'u',
|
||||
'ž':'z', 'Č':'C', 'Ď':'D', 'Ě':'E', 'Ň': 'N', 'Ř':'R', 'Š':'S', 'Ť':'T',
|
||||
'Ů':'U', 'Ž':'Z'
|
||||
'č': 'c', 'ď': 'd', 'ě': 'e', 'ň': 'n', 'ř': 'r', 'š': 's', 'ť': 't', 'ů': 'u',
|
||||
'ž': 'z', 'Č': 'C', 'Ď': 'D', 'Ě': 'E', 'Ň': 'N', 'Ř': 'R', 'Š': 'S', 'Ť': 'T',
|
||||
'Ů': 'U', 'Ž': 'Z'
|
||||
}
|
||||
|
||||
var POLISH_MAP = {
|
||||
'ą':'a', 'ć':'c', 'ę':'e', 'ł':'l', 'ń':'n', 'ó':'o', 'ś':'s', 'ź':'z',
|
||||
'ż':'z', 'Ą':'A', 'Ć':'C', 'Ę':'e', 'Ł':'L', 'Ń':'N', 'Ó':'o', 'Ś':'S',
|
||||
'Ź':'Z', 'Ż':'Z'
|
||||
'ą': 'a', 'ć': 'c', 'ę': 'e', 'ł': 'l', 'ń': 'n', 'ó': 'o', 'ś': 's', 'ź': 'z',
|
||||
'ż': 'z', 'Ą': 'A', 'Ć': 'C', 'Ę': 'e', 'Ł': 'L', 'Ń': 'N', 'Ó': 'o', 'Ś': 'S',
|
||||
'Ź': 'Z', 'Ż': 'Z'
|
||||
}
|
||||
|
||||
var LATVIAN_MAP = {
|
||||
'ā':'a', 'č':'c', 'ē':'e', 'ģ':'g', 'ī':'i', 'ķ':'k', 'ļ':'l', 'ņ':'n',
|
||||
'š':'s', 'ū':'u', 'ž':'z', 'Ā':'A', 'Č':'C', 'Ē':'E', 'Ģ':'G', 'Ī':'i',
|
||||
'Ķ':'k', 'Ļ':'L', 'Ņ':'N', 'Š':'S', 'Ū':'u', 'Ž':'Z'
|
||||
'ā': 'a', 'č': 'c', 'ē': 'e', 'ģ': 'g', 'ī': 'i', 'ķ': 'k', 'ļ': 'l', 'ņ': 'n',
|
||||
'š': 's', 'ū': 'u', 'ž': 'z', 'Ā': 'A', 'Č': 'C', 'Ē': 'E', 'Ģ': 'G', 'Ī': 'i',
|
||||
'Ķ': 'k', 'Ļ': 'L', 'Ņ': 'N', 'Š': 'S', 'Ū': 'u', 'Ž': 'Z'
|
||||
}
|
||||
|
||||
var ALL_DOWNCODE_MAPS=new Array()
|
||||
ALL_DOWNCODE_MAPS[0]=LATIN_MAP
|
||||
ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP
|
||||
ALL_DOWNCODE_MAPS[2]=GREEK_MAP
|
||||
ALL_DOWNCODE_MAPS[3]=TURKISH_MAP
|
||||
ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP
|
||||
ALL_DOWNCODE_MAPS[5]=UKRAINIAN_MAP
|
||||
ALL_DOWNCODE_MAPS[6]=CZECH_MAP
|
||||
ALL_DOWNCODE_MAPS[7]=POLISH_MAP
|
||||
ALL_DOWNCODE_MAPS[8]=LATVIAN_MAP
|
||||
var ALL_DOWNCODE_MAPS = new Array()
|
||||
ALL_DOWNCODE_MAPS[0] = LATIN_MAP
|
||||
ALL_DOWNCODE_MAPS[1] = LATIN_SYMBOLS_MAP
|
||||
ALL_DOWNCODE_MAPS[2] = GREEK_MAP
|
||||
ALL_DOWNCODE_MAPS[3] = TURKISH_MAP
|
||||
ALL_DOWNCODE_MAPS[4] = RUSSIAN_MAP
|
||||
ALL_DOWNCODE_MAPS[5] = UKRAINIAN_MAP
|
||||
ALL_DOWNCODE_MAPS[6] = CZECH_MAP
|
||||
ALL_DOWNCODE_MAPS[7] = POLISH_MAP
|
||||
ALL_DOWNCODE_MAPS[8] = LATVIAN_MAP
|
||||
|
||||
var Downcoder = new Object();
|
||||
Downcoder.Initialize = function()
|
||||
{
|
||||
Downcoder.Initialize = function () {
|
||||
if (Downcoder.map) // already made
|
||||
return ;
|
||||
Downcoder.map ={}
|
||||
Downcoder.chars = '' ;
|
||||
for(var i in ALL_DOWNCODE_MAPS)
|
||||
{
|
||||
return;
|
||||
Downcoder.map = {}
|
||||
Downcoder.chars = '';
|
||||
for (var i in ALL_DOWNCODE_MAPS) {
|
||||
var lookup = ALL_DOWNCODE_MAPS[i]
|
||||
for (var c in lookup)
|
||||
{
|
||||
Downcoder.map[c] = lookup[c] ;
|
||||
Downcoder.chars += c ;
|
||||
}
|
||||
}
|
||||
Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+','g') ;
|
||||
}
|
||||
|
||||
downcode= function( slug )
|
||||
{
|
||||
Downcoder.Initialize() ;
|
||||
var downcoded =""
|
||||
var pieces = slug.match(Downcoder.regex);
|
||||
if(pieces)
|
||||
{
|
||||
for (var i = 0 ; i < pieces.length ; i++)
|
||||
{
|
||||
if (pieces[i].length == 1)
|
||||
{
|
||||
var mapped = Downcoder.map[pieces[i]] ;
|
||||
if (mapped != null)
|
||||
{
|
||||
downcoded+=mapped;
|
||||
continue ;
|
||||
}
|
||||
}
|
||||
downcoded+=pieces[i];
|
||||
for (var c in lookup) {
|
||||
Downcoder.map[c] = lookup[c];
|
||||
Downcoder.chars += c;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+', 'g');
|
||||
}
|
||||
|
||||
downcode = function (slug) {
|
||||
Downcoder.Initialize();
|
||||
var downcoded = ""
|
||||
var pieces = slug.match(Downcoder.regex);
|
||||
if (pieces) {
|
||||
for (var i = 0; i < pieces.length; i++) {
|
||||
if (pieces[i].length == 1) {
|
||||
var mapped = Downcoder.map[pieces[i]];
|
||||
if (mapped != null) {
|
||||
downcoded += mapped;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
downcoded += pieces[i];
|
||||
}
|
||||
}
|
||||
else {
|
||||
downcoded = slug;
|
||||
}
|
||||
return downcoded;
|
||||
@@ -125,9 +112,9 @@ function URLify(s, num_chars) {
|
||||
// remove all these words from the string before urlifying
|
||||
s = downcode(s);
|
||||
removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from",
|
||||
"is", "in", "into", "like", "of", "off", "on", "onto", "per",
|
||||
"since", "than", "the", "this", "that", "to", "up", "via",
|
||||
"with"];
|
||||
"is", "in", "into", "like", "of", "off", "on", "onto", "per",
|
||||
"since", "than", "the", "this", "that", "to", "up", "via",
|
||||
"with"];
|
||||
r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
|
||||
s = s.replace(r, '');
|
||||
// if downcode doesn't hit, the char will be stripped here
|
||||
|
||||
Reference in New Issue
Block a user