<?php
include_once("includes/base.inc");

$page = new Page("/");
$page->event = "finder";
$page->name = "Food Finder";
$page->title = "Food Finder";
$page->body = "<h2>Food Finder</h2>";
$page->body .= "<p>The food finder is designed to help find foods meeting various criteria. Drag the sliders below to vary the range of inputs. The system will attempt to find food items that fall within those ranges. You can also add additional nutrients to the search by choosing the &apos;Add Nutrient&apos; option.</p>";

$startingOptions =
array("http://semanticdiet.com/data/usda/nndsr/23/nutrients/208",
      "http://semanticdiet.com/data/usda/nndsr/23/nutrients/204",
      "http://semanticdiet.com/data/usda/nndsr/23/nutrients/205",      
      "http://semanticdiet.com/data/usda/nndsr/23/nutrients/203");

set_time_limit(0);

foreach($startingOptions as $idx => $uri) {

  $start = microtime(true);
  $data = array();
  $doc = new DOMDocument();
  $doc->load("http://localhost:2020/books?query=".urlencode("PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX nndsr: <http://semanticdiet.com/schema/usda/nndsr/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX sd: <http://semanticdiet.com/schema/> PREFIX oper2: <http://sweet.jpl.nasa.gov/2.0/mathOperation.owl#> PREFIX units: <http://sweet.jpl.nasa.gov/2.0/sciUnits.owl#> SELECT ?label ?unit WHERE { <$uri> rdfs:label ?label . <$uri> sd:measuredIn ?unitsper . ?unitsper oper2:productOf ?theUnit . { ?theUnit a units:BaseUnit } UNION { ?theUnit a units:UnitDerivedByScaling } ?theUnit units:hasSymbol ?unit . }"));
  $page->addMessage("Took ".(microtime(true)-$start)." seconds to query for label and units.");
  $start = microtime(true);
  $results = $doc->getElementsByTagName("result");
  $bindings = $results->item(0)->getElementsByTagName("binding");
  for($i=0;$i<$bindings->length;$i++) {
    $binding = $bindings->item($i);
    if($binding->getAttribute("name")=="label")
      $label = trim($binding->textContent);
    if($binding->getAttribute("name")=="unit")
      $unit = trim($binding->textContent);
  }
  $page->addMessage("Took ".(microtime(true)-$start)." seconds to process query result.");


  $start = microtime(true);
  /*
  $doc = new DOMDocument();
  $doc->load("http://localhost:2020/books?query=".urlencode("PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX nndsr: <http://semanticdiet.com/schema/usda/nndsr/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?val WHERE { ?measure a nndsr:Measurement . ?measure nndsr:measureOf <$uri> . ?measure nndsr:measuredValue ?val }"));
  $page->addMessage("Took ".(microtime(true)-$start)." seconds to query for data.");
  $start = microtime(true);
  $results = $doc->getElementsByTagName("result");
  $len = $results->length;


  $minVal = 10000000;
  $maxVal = 0;

  for($i=0;$i<$len;$i++) {
    $bindings = $results->item($i)->getElementsByTagName("binding");
    $binding = $bindings->item(0);
    if($binding->getAttribute("name")=="val") {
      $val = floatval(trim($binding->textContent));
      $data[] = $val;
      if($val < $minVal) $minVal = $val;
      if($val > $maxVal) $maxVal = $val;
    }
  }
  */
  $contents = file_get_contents("http://localhost:2020/books?query=".urlencode("PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX nndsr: <http://semanticdiet.com/schema/usda/nndsr/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?val WHERE { ?measure a nndsr:Measurement . ?measure nndsr:measureOf <$uri> . ?measure nndsr:measuredValue ?val }"));
  $page->addMessage("Took ".(microtime(true)-$start)." seconds to retrieve data.");
  $start = microtime(true);
  $matches = array();
  $num = preg_match_all("|<result>[\s]*<binding name=\"val\">[\s]*<literal[^>]*>([^>]*)</literal>[\s]*</binding>[\s]*</result>|",$contents,$matches);
  $minVal = 10000000;
  $maxVal = 0;
  foreach($matches[1] as $idx => $val) {
    $val = floatval(trim($val));
    $data[] = $val;
    if($val < $minVal) $minVal = $val;
    if($val > $maxVal) $maxVal = $val;
  }
  $page->addMessage("Took ".(microtime(true)-$start)." seconds to process query result.");
  
  $start = microtime(true);
  $max = 0;
  $data2 = array();
  for($i=0;$i<count($data);$i++) {
    $pos = (int)floor(($data[$i]-$minVal)/($maxVal-$minVal)*100.0);
    if(!isset($data2[$pos])) {
      $data2[$pos] = array();
    }
    $data2[$pos][] = $data[$i];
    if($max < count($data2[$pos])) {
      $max = count($data2[$pos]);
    }
  }
  $page->addMessage("Took ".(microtime(true)-$start)." seconds to transform results.");
  
  $start = microtime(true);
  $page->body .= "<div class=\"nutrient-range-finder\">";
  $page->body .= "$label: <input type=\"text\" class=\"left-text\" value=\"$minVal $unit\" />";
  $page->body .= "<div class=\"data-finder\">";
  
  foreach($data2 as $pos => $arr) {
    $height = (int)(count($arr)/$max*100);
    if($height==0 && count($arr)>0) {
      $height = 1;
    }
    $page->body .= "<div class=\"data-point\" style=\"left: $pos%; height: $height%;\"></div>";
  }
  
  $page->body .= "</div>";
  $page->body .= "<input type=\"text\" class=\"right-text\" value=\"$maxVal $unit\" />";
  $page->body .= "</div>";
  $page->addMessage("Took ".(microtime(true)-$start)." seconds to generate page contents.");

}

$page->addScript("js/jquery-1.4.2.min.js","text/javascript");
$page->addScript("js/jquery-ui-1.8.6.custom.min.js","text/javascript");
$page->addScript("js/finder.js","text/javascript");
$page->addStylesheet("themes/default/finder.css");

$currentTheme->render($page);

?>
