Index: branches/RC/core/admin_templates/js/form_controls.js =================================================================== diff -u -r10672 -r10673 --- branches/RC/core/admin_templates/js/form_controls.js (.../form_controls.js) (revision 10672) +++ branches/RC/core/admin_templates/js/form_controls.js (.../form_controls.js) (revision 10673) @@ -101,6 +101,16 @@ return $ret; } +MultiInputControl.prototype._getRecordIndex = function ($selected_index) { + var $object = this.getControl(this.FieldName, 'minput'); + + if (!isset($selected_index)) { + $selected_index = $object.selectedIndex; + } + + return $selected_index == -1 ? -1 : $object.options[$selected_index].value; +} + MultiInputControl.prototype.makeRequest = function($request_type, $record, $skip_index) { var $url = this.ValidateURL; for (var $field_name in $record) { @@ -126,7 +136,7 @@ } MultiInputControl.prototype.EditRecord = function() { - var $record_index = this.getControl(this.FieldName, 'minput').selectedIndex; + var $record_index = this._getRecordIndex(); // this.getControl(this.FieldName, 'minput').selectedIndex; if ($record_index == -1 || this.InEditing) { // no record selected return ; @@ -166,19 +176,19 @@ this.InEditing = false; } -MultiInputControl.prototype.ShowRecord = function($record_index) { +MultiInputControl.prototype.ShowRecord = function($option_index) { var $options = this.getControl(this.FieldName, 'minput').options; - if ($record_index < $options.length) { + if ($option_index < $options.length) { // update existing record - $options[$record_index].innerHTML = this.formatLine($record_index); + $options[$option_index].innerHTML = this.formatLine( this._getRecordIndex($option_index) ); } else { // create new record var $new_option = document.createElement('OPTION'); $options.add($new_option, $options.length); - $new_option.value = $record_index; // will be used in move up/down & sorting (if any) - $new_option.innerHTML = this.formatLine($record_index); + $new_option.value = $option_index; // will be used in move up/down & sorting (if any) + $new_option.innerHTML = this.formatLine(this.Records.length - 1); } } @@ -191,7 +201,7 @@ var $i = $control.length - 1; while ($i >= 0) { if ($control.options[$i].selected == true) { - this.Records.splice($i, 1); + this.Records[$control.options[$i].value] = null; // preserves index, when removing element from middle of array. this.Records.splice($control.options[$i].value, 1); $control.remove($i); } $i--; @@ -200,6 +210,16 @@ this.SaveValues(); } +MultiInputControl.prototype.MoveRecordsUp = function() { + move_options_up(this.getControl(this.FieldName, 'minput'), 1); + this.SaveValues(); +} + +MultiInputControl.prototype.MoveRecordsDown = function() { + move_options_down(this.getControl(this.FieldName, 'minput'), 1); + this.SaveValues(); +} + MultiInputControl.prototype.AddFromXML = function($xml) { var $document = getDocumentFromXML($xml); this.ProcessXMLNode($document); @@ -239,12 +259,16 @@ } MultiInputControl.prototype.SaveValues = function() { - var $i = 0; + var $object = this.getControl(this.FieldName, 'minput'); + var $record_index = 0; var $xml = ''; - while ($i < this.Records.length) { + + var $i = 0; + while ($i < $object.options.length) { + $record_index = $object.options[$i].value; $xml += ''; for (var $field_name in this.Controls) { - $xml += '' + this.htmlspecialchars(this.Records[$i][$field_name]) + ''; + $xml += '' + this.htmlspecialchars(this.Records[$record_index][$field_name]) + ''; } $xml += ''; $i++; @@ -309,6 +333,12 @@ } while ($i < this.Records.length) { + if (this.Records[$i] == null) { + // skip deleted records + $i++; + continue; + } + if ($i != $skip_index && this.compareRecords($record, this.Records[$i])) { alert(this.Messages['unique_error']); return false; @@ -342,6 +372,7 @@ return ; } + // params: 0 - action type, 1 - record data, 2 - option index switch ($params[0]) { case 'AddRecord': if (!$object.ValidateRecord($params[1])) { @@ -354,11 +385,12 @@ break; case 'SaveRecord': - if (!$object.ValidateRecord($params[1], $params[2])) { + $record_index = $object._getRecordIndex($params[2]); + if (!$object.ValidateRecord($params[1], $record_index)) { return ; } - $object.Records[$params[2]] = $params[1]; + $object.Records[$record_index] = $params[1]; $object.ShowRecord($params[2]); $object.CancelEditing(); @@ -400,6 +432,14 @@ $button = this.getControl(this.FieldName, 'delete_button'); $button.onclick = function() { eval($var_name).DeleteRecords() }; } + + if (this.hasPermission('move')) { + $button = this.getControl(this.FieldName, 'moveup_button'); + $button.onclick = function() { eval($var_name).MoveRecordsUp() }; + + $button = this.getControl(this.FieldName, 'movedown_button'); + $button.onclick = function() { eval($var_name).MoveRecordsDown() }; + } } MultiInputControl.prototype.hasPermission = function ($perm_name) {