/**
* manages all interactions in the admin change_list
*/
(function($) {
$.fn.change_list = function(opts) {
var options = $.extend({}, $.fn.change_list.defaults, opts),
actionCheckboxes = $(options.actionCheckboxes);
checker = function(checked) {
if (checked) {
showQuestion();
} else {
reset();
}
actionCheckboxes.attr("checked", checked).parent().parent().toggleClass(options.selectedClass, checked);
};
updateCounter = function() {
var count = actionCheckboxes.filter(":checked").length;
if (count > 0) {
hideSubmitFooter();
$(options.actionContainer).show();
} else {
$(options.actionContainer).hide();
showSubmitFooter();
}
if ($(options.actionContainer).find("span._acnt").length > 0) {
$(options.actionContainer).find("span._acnt").html(count);
} else {
var actionCounter = $(options.actionContainer).find("span.action-counter"),
text = actionCounter.html();
actionCounter.html('' + count + '' + text.substring(1));
}
$(options.allToggle).attr("checked", function() {
if (count == 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.allContainer).show();
$(options.acrossQuestions).hide();
$(options.counterContainer).hide();
$(options.actionContainer).toggleClass(options.selectedClass);
};
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);
};
clearSelection = function() {
$(options.allToggle).attr("checked", false);
clearAcross();
checker(false);
updateCounter();
};
initializeFlexibleLayout = function(content) {
var SpanGrid,
PaddingRight,
MarginRight;
$('#content').addClass('content-flexible');
$(content).find('.span-flexible').next('.column').parent().addClass('layout-flexible-grid');
$(content).find('.column').next('.span-flexible').parent().addClass('layout-grid-flexible');
$(content).append('
');
// Layout Flexible + Grid
if ($(content).hasClass('layout-flexible-grid')) {
SpanGrid = $(content).find('.span-flexible').next('.column').outerWidth();
PaddingRight = SpanGrid + 20;
MarginRight = - SpanGrid - 20;
$(content).css({
'padding-right': PaddingRight
});
$(content).find('.span-flexible').next('.column').css({
'margin-right': -10000
});
}
// Layout Grid + Flexible
if ($(content).hasClass('layout-grid-flexible')) {
SpanGrid = $(content).find('.span-flexible').prev('.column').outerWidth();
PaddingLeft = SpanGrid + 20;
MarginLeft = - SpanGrid - 20;
$(content).css({
'padding-left': PaddingLeft
});
$(content).find('.span-flexible').prev('.column').css({
'margin-left': MarginLeft
});
}
};
HorizontalOverflow = function(content) {
var TableWidth = $(content).find('table').outerWidth();
var SpanFlexibleWidth = $(content).find('.span-flexible').outerWidth();
if (TableWidth > SpanFlexibleWidth) {
$(content).find('.span-flexible').css({
'min-width' : TableWidth + 1 + 'px'
});
$(content).find('.span-flexible').next('.column').css({
'border-right' : '20px solid transparent'
});
}
if (TableWidth < SpanFlexibleWidth) {
$(content).find('.span-flexible').css({
'min-width': 'auto'
});
}
};
ModifyTableElements = function() {
// UGLY HACK: add no-wrap to table-elements
// should be there already.
$('.changelist-results a.add-another').parent().addClass('nowrap');
};
initFilter = function() {
$("a.toggle-filters").click(function() {
$(".filter-pulldown").toggle();
$("#filters").toggleClass("open");
});
$(".filter_choice").change(function(){
location.href = $(this).val();
});
var filter_choice = $(".filter_choice");
for (var i = 0; i < filter_choice.length; i++) {
if (!$(filter_choice[i]).find(':first-child').attr('selected')) {
$("#filters").addClass('selected');
}
}
};
initLayout = function() {
initializeFlexibleLayout('.container-flexible');
$(window).resize(function(){
HorizontalOverflow('.container-flexible');
});
//window.onload = function () {
HorizontalOverflow('.container-flexible');
//};
};
showSubmitFooter = function() {
$("div#submit").show();
// need to uncheck all actions checkboxes and update counter
// (actions are not working if you want to edit items in the change_list)
//actionCheckboxes.attr("checked", false);
//clearSelection();
};
hideSubmitFooter = function() {
$("div#submit").hide();
};
// Show counter by default
$(options.counterContainer).show();
$(options.allToggle).show().click(function() {
checker($(this).attr("checked"));
updateCounter();
});
$("div.changelist-actions li.question a").click(function(event) {
event.preventDefault();
$(options.acrossInput).val(1);
showClear();
});
$("div.changelist-actions li.clear-selection a").click(function(event) {
event.preventDefault();
clearSelection();
});
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).attr("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).attr("checked", target.checked)
.parent().parent().toggleClass(options.selectedClass, target.checked);
}
});
}
$(target).parent().parent().toggleClass(options.selectedClass, target.checked);
lastChecked = target;
updateCounter();
});
$(options.actionSelect).attr("autocomplete", "off").change(function(evt){
$(this).parents("form").submit();
});
initLayout();
initFilter();
/*
* django version < 1.2.3 only
* hide the last coll if its an editable list
* because this coll has just the hidden input with the id (breaks ui)
if ($("#changelist").hasClass("editable")) {
// UGLY HACK: add th for thead when list_editables are activated.
$(".changelist-results tr").each(function() {
$(this).find("td:last").hide();
});
}
*/
/*
* deprecated code
* used to show submit footer if something changed only.
* way to complex to achieve this feature.
* now submit footer is visible if list_editable (and toggles visibility with action footer).
$("input.action-select, input#action-toggle, a.cancel-link").click(function() {
$("div#submit").hide();
});
//var edit_inlines = $("input[name!='_selected_action'][id!='action-toggle'][id!='searchbar']");
//edit_inlines.focus(showSubmitFooter);
// safari (5) needs this because focus event doesn't work on checkboxes (anymore)
//edit_inlines.end().find(":checkbox").click(showSubmitFooter);
var input_nodes = $("input[name!='_selected_action'][id!='action-toggle'][id!='searchbar']");
input_nodes.bind("change click", showSubmitFooter);
$("select[class!='filter_choice'][name!='action']").bind("change click", showSubmitFooter);
// FilebrowseField's button
$("a.fb_show").click(showSubmitFooter);
*/
$("td input.vForeignKeyRawIdAdminField, td input.vFileBrowseField, td a.add-another").each(function() {
$(this).parent().addClass('nowrap');
});
// Check state of checkboxes and reinit state if needed
actionCheckboxes.filter(":checked").each(function(i) {
$(this).parent().parent().toggleClass(options.selectedClass);
updateCounter();
if ($(options.acrossInput).val() == 1) {
showClear();
}
});
// if (!$("input#searchbar").val()) {
// $("input#searchbar").val(options.initialSearchVal);
// }
// $("input#searchbar").focus(function(){
// if ($(this).val() == options.initialSearchVal) {
// $(this).val("");
// }
// });
// $("input#searchbar").blur(function(){
// if (!$(this).val()) {
// $(this).val(options.initialSearchVal);
// }
// });
};
/* Setup plugin defaults */
$.fn.change_list.defaults = {
actionCheckboxes: "input.action-select",
actionContainer: "div.changelist-actions",
counterContainer: "li.action-counter",
allContainer: "div.changelist-actions li.all",
acrossInput: "div.changelist-actions input.select-across",
acrossQuestions: "div.changelist-actions li.question",
acrossClears: "div.changelist-actions li.clear-selection",
allToggle: "#action-toggle",
selectedClass: "selected",
actionSelect: "div.changelist-actions select",
initialSearchVal: "Search"
};
})(django.jQuery);