/**
  * Method to move a row in the ordering sequence of a group of rows defined by an SQL WHERE clause.
  * Negative numbers move the row up in the sequence and positive numbers move it down.
  *
  * @param   integer  $delta  The direction and magnitude to move the row in the ordering sequence.
  * @param   string   $where  WHERE clause to use for limiting the selection of rows to compact the
  *                           ordering values.
  *
  * @return  mixed    Boolean  True on success.
  *
  * @throws  UnexpectedValueException
  */
 public function move($delta, $where = '')
 {
     if (!$this->onBeforeMove($delta, $where)) {
         return false;
     }
     // If there is no ordering field set an error and return false.
     $ordering_field = $this->getColumnAlias('ordering');
     if (!in_array($ordering_field, $this->getKnownFields())) {
         throw new UnexpectedValueException(sprintf('%s does not support ordering.', $this->_tbl));
     }
     // If the change is none, do nothing.
     if (empty($delta)) {
         $result = $this->onAfterMove();
         return $result;
     }
     $k = $this->_tbl_key;
     $row = null;
     $query = $this->_db->getQuery(true);
     // If the table is not loaded, return false
     if (empty($this->{$k})) {
         return false;
     }
     // Select the primary key and ordering values from the table.
     $query->select(array($this->_db->qn($this->_tbl_key), $this->_db->qn($ordering_field)));
     $query->from($this->_tbl);
     // If the movement delta is negative move the row up.
     if ($delta < 0) {
         $query->where($this->_db->qn($ordering_field) . ' < ' . $this->_db->q((int) $this->{$ordering_field}));
         $query->order($this->_db->qn($ordering_field) . ' DESC');
     } elseif ($delta > 0) {
         $query->where($this->_db->qn($ordering_field) . ' > ' . $this->_db->q((int) $this->{$ordering_field}));
         $query->order($this->_db->qn($ordering_field) . ' ASC');
     }
     // Add the custom WHERE clause if set.
     if ($where) {
         $query->where($where);
     }
     // Select the first row with the criteria.
     $this->_db->setQuery($query, 0, 1);
     $row = $this->_db->loadObject();
     // If a row is found, move the item.
     if (!empty($row)) {
         // Update the ordering field for this instance to the row's ordering value.
         $query = $this->_db->getQuery(true);
         $query->update($this->_tbl);
         $query->set($this->_db->qn($ordering_field) . ' = ' . $this->_db->q((int) $row->{$ordering_field}));
         $query->where($this->_tbl_key . ' = ' . $this->_db->q($this->{$k}));
         $this->_db->setQuery($query);
         $this->_db->execute();
         // Update the ordering field for the row to this instance's ordering value.
         $query = $this->_db->getQuery(true);
         $query->update($this->_tbl);
         $query->set($this->_db->qn($ordering_field) . ' = ' . $this->_db->q((int) $this->{$ordering_field}));
         $query->where($this->_tbl_key . ' = ' . $this->_db->q($row->{$k}));
         $this->_db->setQuery($query);
         $this->_db->execute();
         // Update the instance value.
         $this->{$ordering_field} = $row->{$ordering_field};
     } else {
         // Update the ordering field for this instance.
         $query = $this->_db->getQuery(true);
         $query->update($this->_tbl);
         $query->set($this->_db->qn($ordering_field) . ' = ' . $this->_db->q((int) $this->{$ordering_field}));
         $query->where($this->_tbl_key . ' = ' . $this->_db->q($this->{$k}));
         $this->_db->setQuery($query);
         $this->_db->execute();
     }
     $result = $this->onAfterMove();
     return $result;
 }