@@ -205,7 +205,7 @@
var replaceWith = settings.name_prefix + '[' + newIndex + ']';

if (settings.children) {
$.each(settings.children, function(key, child) {
$.each(settings.children, function (key, child) {
var childCollection = collection.find(child.selector).eq(index);
var childSettings = childCollection.data('collection-settings');
if (childSettings) {
@@ -254,10 +254,7 @@

var settings = collection.data('collection-settings');

if (settings.position_field_selector) {
putFieldValue(elements.eq(newIndex).find(settings.position_field_selector), oldIndex);
putFieldValue(elements.eq(oldIndex).find(settings.position_field_selector), newIndex);
} else {
if (!settings.position_field_selector) {
changeElementIndex(collection, elements, settings, oldIndex, oldIndex, '__swap__');
changeElementIndex(collection, elements, settings, newIndex, newIndex, oldIndex);
changeElementIndex(collection, elements, settings, oldIndex, '__swap__', newIndex);
@@ -352,6 +349,10 @@
elements.each(function (index) {
var element = $(this);

if (isInitialization) {
element.data('index', index);
}

var actions = element.find('.' + settings.prefix + '-actions').addBack().filter('.' + settings.prefix + '-actions');
if (actions.length === 0) {
actions = $('<div class="' + settings.prefix + '-actions"></div>');
@@ -373,7 +374,7 @@
'enabled': settings.allow_up,
'selector': settings.prefix + '-up',
'html': settings.up,
'condition': elements.length - delta > 1 && elements.index(element) !== 0
'condition': elements.length - delta > 1 && elements.index(element) - delta > 0
}, {
'enabled': settings.allow_down,
'selector': settings.prefix + '-down',
@@ -475,12 +476,24 @@
var doAdd = function (container, that, collection, settings, elements, element, index, isDuplicate) {
if (elements.length < settings.max && (isDuplicate && trueOrUndefined(settings.before_duplicate(collection, element)) || trueOrUndefined(settings.before_add(collection, element)))) {
var prototype = collection.data('prototype');

var freeIndex = elements.length;
if (settings.position_field_selector) {
var maxIndex = -1;
elements.each(function () {
var currentIndex = $(this).data('index');
if (currentIndex > maxIndex) {
maxIndex = currentIndex;
}
});
freeIndex = maxIndex + 1;
}

if (index === -1) {
index = elements.length - 1;
}
var regexp = new RegExp(pregQuote(settings.prototype_name), 'g');
var code = $(prototype.replace(regexp, freeIndex));
var code = $(prototype.replace(regexp, freeIndex)).data('index', freeIndex);
var elementsParent = $(settings.elements_parent_selector);
var tmp = elementsParent.find('> .' + settings.prefix + '-tmp');
var id = $(code).find('[id]').first().attr('id');
@@ -501,11 +514,8 @@
tmp.before(code);
}

if (settings.position_field_selector) {
putFieldValue(code.find(settings.position_field_selector), freeIndex);
}

elements = collection.find(settings.elements_selector);

var action = code.find('.' + settings.prefix + '-add, .' + settings.prefix + '-duplicate');
if (action.length > 0) {
action.addClass(settings.prefix + '-action').data('collection', collection.attr('id'));
@@ -528,7 +538,15 @@
}

if (code !== undefined && settings.fade_in) {
code.fadeIn('fast');
code.fadeIn('fast', function () {
if (settings.position_field_selector) {
doRewritePositions(settings, elements);
}
});
} else {
if (settings.position_field_selector) {
return doRewritePositions(settings, elements);
}
}

return elements;
@@ -549,6 +567,9 @@
elements = collection.find(settings.elements_selector);
elements = shiftElementsDown(collection, elements, settings, index - 1);
}
if (settings.position_field_selector) {
doRewritePositions(settings, elements);
}
};
if (settings.fade_out) {
element.fadeOut('fast', function () {
@@ -572,6 +593,10 @@
}
}

if (settings.position_field_selector) {
return doRewritePositions(settings, elements);
}

return elements;
};

@@ -585,6 +610,10 @@
}
}

if (settings.position_field_selector) {
return doRewritePositions(settings, elements);
}

return elements;
};

@@ -610,9 +639,22 @@
}
dumpCollectionActions(collection, settings, false);

if (settings.position_field_selector) {
return doRewritePositions(settings, elements);
}

return elements;
};

var doRewritePositions = function (settings, elements) {
$(elements).each(function () {
var element = $(this);
putFieldValue(element.find(settings.position_field_selector), elements.index(element));
});

return elements;
}

// we're in a $.fn., so in $('.collection').collection(), $(this) equals $('.collection')
var elems = $(this);

@@ -813,9 +855,9 @@
};
array.sort(sorter);

$.each(array, function(newIndex, object) {
$.each(array, function (newIndex, object) {
var ids = [];
$(elements).each(function(index) {
$(elements).each(function (index) {
ids.push($(this).attr('id'));
});

@@ -824,7 +866,7 @@

if (newIndex !== oldIndex) {
elements = doMove(collection, settings, elements, element, oldIndex, newIndex);
putFieldValue(element.find(settings.position_field_selector), newIndex);
putFieldValue(element.find(settings.position_field_selector), elements.index(element));
}
});
} // if (settings.position_field_selector) {