/**
  * Method to load a row from the database by primary key and bind the fields
  * to the FOFTable instance properties.
  *
  * @param   mixed    $keys   An optional primary key value to load the row by, or an array of fields to match.  If not
  *                           set the instance property value is used.
  * @param   boolean  $reset  True to reset the default values before loading the new row.
  *
  * @return  boolean  True if successful. False if row not found.
  *
  * @throws  RuntimeException
  * @throws  UnexpectedValueException
  */
 public function load($keys = null, $reset = true)
 {
     if (!$this->_tableExists) {
         $result = false;
         return $this->onAfterLoad($result);
     }
     if (empty($keys)) {
         // If empty, use the value of the current key
         $keyName = $this->_tbl_key;
         if (isset($this->{$keyName})) {
             $keyValue = $this->{$keyName};
         } else {
             $keyValue = null;
         }
         // If empty primary key there's is no need to load anything
         if (empty($keyValue)) {
             $result = true;
             return $this->onAfterLoad($result);
         }
         $keys = array($keyName => $keyValue);
     } elseif (!is_array($keys)) {
         // Load by primary key.
         $keys = array($this->_tbl_key => $keys);
     }
     if ($reset) {
         $this->reset();
     }
     // Initialise the query.
     $query = $this->_db->getQuery(true);
     $query->select($this->_tbl . '.*');
     $query->from($this->_tbl);
     // Joined fields are ok, since I initialized them in the constructor
     $fields = $this->getKnownFields();
     foreach ($keys as $field => $value) {
         // Check that $field is in the table.
         if (!in_array($field, $fields)) {
             throw new UnexpectedValueException(sprintf('Missing field in table %s : %s.', $this->_tbl, $field));
         }
         // Add the search tuple to the query.
         $query->where($this->_db->qn($this->_tbl . '.' . $field) . ' = ' . $this->_db->q($value));
     }
     // Do I have any joined table?
     $j_query = $this->getQueryJoin();
     if ($j_query) {
         if ($j_query->select && $j_query->select->getElements()) {
             //$query->select($this->normalizeSelectFields($j_query->select->getElements(), true));
             $query->select($j_query->select->getElements());
         }
         if ($j_query->join) {
             foreach ($j_query->join as $join) {
                 $t = (string) $join;
                 // Joomla doesn't provide any access to the "name" variable, so I have to work with strings...
                 if (stripos($t, 'inner') !== false) {
                     $query->innerJoin($join->getElements());
                 } elseif (stripos($t, 'left') !== false) {
                     $query->leftJoin($join->getElements());
                 } elseif (stripos($t, 'right') !== false) {
                     $query->rightJoin($join->getElements());
                 } elseif (stripos($t, 'outer') !== false) {
                     $query->outerJoin($join->getElements());
                 }
             }
         }
     }
     $this->_db->setQuery($query);
     $row = $this->_db->loadAssoc();
     // Check that we have a result.
     if (empty($row)) {
         $result = false;
         return $this->onAfterLoad($result);
     }
     // Bind the object with the row and return.
     $result = $this->bind($row);
     $this->onAfterLoad($result);
     return $result;
 }