/**
  * Merge fields in a specified template
  * 
  * @since 1.1.0
  * @static
  * 
  * @param string $template_file
  * @param array $merge_fields
  * @return string|\argent_error 
  */
 public static function merge_template($template_file = NULL, $merge_fields = array())
 {
     $error = new argent_error();
     if (!file_exists($template_file)) {
         $error->add('1100', 'File does not exist', $template_file, 'argent_notification');
     }
     if (!is_array($merge_fields)) {
         $error->add('1041', 'Invalid merge fields specified', $merge_fields, 'argent_notification');
     }
     if ($error->has_errors()) {
         return $error;
     }
     $template = file_get_contents($template_file);
     if (!$template) {
         $error->add('1101', 'File could not be read', $template, 'argent_notification');
     }
     if ($error->has_errors()) {
         return $error;
     }
     if (count($merge_fields) > 0) {
         foreach ($merge_fields as $field => $value) {
             $template = str_replace("%%FIELD_" . $field, $value, $template);
         }
     }
     return $template;
 }
 /**
  * Log an error
  * 
  * @static
  * @since 1.0.1
  * @param string $code Error code
  * @param string $message Error message
  * @param string $payload Data related to or causing the error
  * @param string $application The name of your module e.g. "Search API"
  * @return boolean 
  */
 public static function log_error($code, $message = "", $payload = NULL, $application = 'argent_powered_app')
 {
     if (argent_error::check($code)) {
         if ($code->has_errors()) {
             $errors = $code->read();
             if (!empty($errors)) {
                 foreach ($errors as $code => $error) {
                     $message = $error['message'];
                     $payload = $error['data'];
                     /* Timestamp */
                     $errmsg = date('Y-m-d H:i:s');
                     /* Process */
                     $errmsg .= "\t[{$application}]\t";
                     /* IP */
                     $errmsg .= $_SERVER['REMOTE_ADDR'] . "\t";
                     /* UA */
                     $errmsg .= $_SERVER['HTTP_USER_AGENT'] . "\t";
                     /* Error Code */
                     $errmsg .= $code . "\t";
                     /* Error Message */
                     $errmsg .= $message . "\t";
                     /* Error PayLoad */
                     $errmsg .= "\t" . $payload;
                     self::write_to_log("error", $errmsg);
                     return true;
                 }
             }
         }
         return false;
     }
     /* Timestamp */
     $errmsg = date('Y-m-d H:i:s');
     /* Process */
     $errmsg .= "\t[{$application}]\t";
     /* IP */
     $errmsg .= $_SERVER['REMOTE_ADDR'] . "\t";
     /* UA */
     $errmsg .= $_SERVER['HTTP_USER_AGENT'] . "\t";
     /* Error Code */
     $errmsg .= $code . "\t";
     /* Error Message */
     $errmsg .= $message . "\t";
     /* Error PayLoad */
     $errmsg .= "\t" . (string) $payload;
     self::write_to_log("error", $errmsg);
     return true;
 }
 /**
  * Revokes a User Right
  * 
  * @param string $user_id
  * @param string $right
  * @return boolean
  */
 public static function revoke_right($user_id, $right)
 {
     $error = new argent_error();
     $db = new argent_database();
     if (!self::object_exists($user_id)) {
         $error->add('1013', 'Invalid user account', $user_id, 'argent_uauth');
     }
     $right_id = self::right_exists($right);
     if (!$right_id) {
         $error->add('1042', 'Invalid user right', $right, 'argent_uauth');
     }
     if (!self::user_has_right($right, $user_id)) {
         return true;
     }
     return $user_right = argent_meta::unrelate($user_id, $right_id, 'user_right');
 }
 /**
  * Break a defined relationship relationship between two objects
  * 
  * @param string $primary_object_id
  * @param string $secondary_object_id
  * @param string $relationship
  * @return array|\argent_error
  */
 public static function unrelate($primary_object_id, $secondary_object_id, $relationship, $include_reverse = false)
 {
     $error = new argent_error();
     $db = new argent_database();
     $related = self::related($primary_object_id, $secondary_object_id, $relationship, $include_reverse);
     if (argent_error::check($related)) {
         return $related;
     }
     if (!$related) {
         return $related;
     }
     $sql = "\r\n                    DELETE FROM\r\n                        `ua_relationships`\r\n                    WHERE\r\n                        (`primary_object_id` = '{$db->escape_value($primary_object_id)}'\r\n                    AND\r\n                        `secondary_object_id` = '{$db->escape_value($secondary_object_id)}' )\r\n                    ";
     if ($include_reverse) {
         $sql .= "\r\n                    OR\r\n                        (`primary_object_id` = '{$db->escape_value($secondary_object_id)}'\r\n                    AND\r\n                        `secondary_object_id` = '{$db->escape_value($primary_object_id)}' )\r\n                    ";
     }
     $sql .= "\r\n                    AND\r\n                        `relationship` = '{$db->escape_value($relationship)}'\r\n                    ";
     $db->query($sql);
     return true;
 }