#################################################################################################
#################################################################################################
#################################################################################################
# Commands subrutines
#################################################################################################
#################################################################################################
#################################################################################################

#################################################################################################
# sub add
# Usage: add($http_query);
# Returns: values for HTTP::Response
# Do: add stylesheet(s) to hash
# Used by: daemon
# Uses : addparsequery, addvalues, ok_replace,
#        ok_print, synerror_print, operror_print
#################################################################################################
sub add
{
   my $http_query = shift(@_); # querystring
   my $cont =""; # return value
   my @binds; #values of binds passed via querystring
   my $err; # error string
   if ($err = addparsequery($http_query,\@binds)) { return synerror_print($err,$add_usage); }
   else
   {
      foreach my $bind (@binds)
      {
         my ($a_key , $e_uri) = split(/,/,$bind,2);
         my $une_uri = uri_unescape($e_uri);
         if ($err = addvalues($a_key,$une_uri)) { $cont .= "$err\n"; }
         else { $cont .= ok_replace("$s_add\n",$a_key,$une_uri); }
      }#foreach
      return ok_print($cont);
   }
}
#################################################################################################

#################################################################################################
# sub remove
# Usage: remove($http_query);
# Returns: values for HTTP::Response
# Do: remove stylesheet(s) from hash
# Used by: daemon
# Uses : reparsequery, getkeys, recheckvalues, removevalues,
#        ok_print, synerror_print, operror_print
#################################################################################################
sub remove
{
   my $http_query = shift(@_); # querystring
   my $rem_keys;
   my $cont="";
   my $err;
   if ($http_query eq "")
   {
      my $i=0;
      foreach my $rem_key (keys %stylesheet_hash)
      {
         $cont .= removevalues($rem_key);
         $i++;
      }
      if ($i==0) { return operror_print($error{"re_no_sl"}); }
   }
   elsif ($err = reparsequery($http_query,$rem_keys)){return synerror_print($err,$remove_usage);}
   else
   {
      foreach my $rem_key (split (/,/,$rem_keys))
      {
         if (my $err = recheckvalues($rem_key)) { $cont .= "$err\n"; }
         else { $cont .= removevalues($rem_key); }
      }
   }
   return ok_print($cont);
}
#################################################################################################

#################################################################################################
# sub reload
# Usage: remove($http_query);
# Returns: values for HTTP::Response
# Do: remove stylesheet(s) from hash
# Used by: daemon
# Uses : reparsequery, getkeys, recheckvalues, removevalues,
#        ok_print, synerror_print, operror_print
#################################################################################################
sub reload #reload stylesheet(s) from hash
{
   my $http_query = shift(@_);
   my $rel_keys;
   my @rel_k;
   my $dr_cont = "";
   if ($http_query eq "")
   {
      my $i=0;
      foreach my $key (keys %stylesheet_hash)
      {
         if (my $err = reloadvalues($key))  {  return $dr_cont .= $err; }
         else {$dr_cont .= ok_replace("$s_reload\n",$key,$stylesheet_hash{$key}[0]);}
         $i++;
      }
      if ($i==0) { return operror_print($error{"re_no_sl"}); }
   }
   elsif ($err = reparsequery($http_query,$rel_keys)){return synerror_print($err,$reload_usage);}
   else
   {
      foreach my $key (split (/,/,$rel_keys))
      {
         if (my $err = reloadvalues($key))  {  return $dr_cont .= $err; }
         else {$dr_cont .= ok_replace("$s_reload\n",$key,$stylesheet_hash{$key}[0]);}
      }
   }
   return ok_print($dr_cont);
}
#################################################################################################

sub apply #apply stylesheets
{
   my $http_query = shift(@_);
   my $headers_ptr = shift(@_);
   my $xmluri;
   my @applykeys;
   my %app_param;
   my %app_prop;
   my $results;
   my $lastkey;
   my $enc;

   if (my $err=applyparsequery($http_query,\@applykeys,\%app_param,\%app_prop,$xmluri))
   {
      return synerror_print($err,$apply_usage);
   }
   elsif (my $err=applycheckvalues(\@applykeys)) { return operror_print($err); }
   elsif (my $err=load_xml_doc($xmluri,$results)) { return operror_print($err); }
   #apply
   foreach my $applykey (@applykeys)
   {
      $lastkey=$applykey;
      if (my $err=apply_style($applykey,\%{$app_param{$applykey}},$results))
      {
         return operror_print($err);
      }
   }#foreach
   my $i=0;
   while (my ($n, $v) = each %app_prop)
   {
      if (($n eq "method") or ($n eq "METHOD"))
      {
        if ($v eq 'html') { $headers_ptr->{'Content-Type'}='text/html'; }
        elsif ($v eq 'text') { $headers_ptr->{'Content-Type'}='text/plain'; }
        else { $headers_ptr->{'Content-Type'}='text/xml'; }
      }
      if (($n eq "encoding") or ($n eq "ENCODING"))
      {
        $headers_ptr->{'Content-Encoding'}=$v;
        if ($v ne "UTF-8") { $enc = $v; }
      }
      if (($n eq "media-type") or ($n eq "MEDIA_TYPE") or ($n eq "MEDIA-TYPE"))
      {
        $headers_ptr->{'Content-Type'}=$v;
      }
      $i++;
   }
   if ($i == 0)
   {
      %$headers_ptr= ('Cache-Control' => 'no-cache','Pragma' => "no-cache",'Expires' => '0');
      return get_results($lastkey,$results);
   }
   else
   {
      my $result;
      $headers_ptr->{'Cache-Control'} = 'no-cache';
      $headers_ptr->{'Pragma'} = "no-cache";
      $headers_ptr->{'Expires'} = '0';
      if ($headers_ptr->{'Content-Type'} eq 'text/html')
      {
         $result = get_results_html($results);
      }
      else
      {
         $result = get_results_prop($results);
         if ($enc)
         {
           $result = decode($result,$enc);
         }
      }
      return $result;
   }
}

sub list #list all the stylesheet loaded
{
   my $cont="";
   my $ind = 0;
   foreach $key (keys %stylesheet_hash)
   {
      $cont .= ok_replace("$list\n",$key,$stylesheet_hash{$key}[0]);
      $ind++;
   }
   if ($ind > 0) {   return ok_print($cont);  }
   else { return ok_print($empty);  }
}

sub home #return Dispay active
{
   if ($_[0] ne "") { return synerror_print($error{"home_qs"},$all_usage); }
   else {
      return ok_print($home_message.$all_usage);
   }
}

sub help #return html help
{
   if ($_[0] ne "") { return synerror_print($error{"help_qs"},$help_usage); }
   return ok_print($help_message.$all_usage);
}
