Beginings of scoring
Beginings of scoring


Former-commit-id: 25071f148abb2abe0e2436ec3b83a60f7394b665

file:a/about.php -> file:b/about.php
Organisational Data Sources <?php
  include_once('include/common.inc.php');
  include_header();
  ?>
  <div class="foundation-header">
  <h1><a href="about.php">About/FAQ</a></h1>
  <h4 class="subheader">Lorem ipsum.</h4>
  </div>
  <h2> What is this? </h2>
  Disclosr is a project to monitor Australian Federal Government agencies
  compliance with their <a href="http://www.oaic.gov.au/publications/other_operational/foi_policy_frequently_asked_questions.html#_Toc291837571">"proactive disclosure requirements"</a>.
  OGRE (Open Government Realization Evaluation) is a ranking of compliance with these requirements.
  Prometheus is the agent which polls agency websites to assess compliance.
   
  <h2> Open everything </h2>
  all documents released CC-BY 3 AU
  Open source git @
   
  <h2>Organisational Data Sources</h2>
   
http://www.comlaw.gov.au/Browse/Results/ByTitle/AdministrativeArrangementsOrders/Current/Ad/0 defines departments http://www.comlaw.gov.au/Browse/Results/ByTitle/AdministrativeArrangementsOrders/Current/Ad/0 defines departments
Agencies can be found in the Schedule to an Appropriation Bill (budget), Schedule to FMA Regulations and/or Public Service Act. Agencies can be found in the Schedule to an Appropriation Bill (budget), Schedule to FMA Regulations and/or Public Service Act.
   
http://www.finance.gov.au/publications/flipchart/docs/FMACACFlipchart.pdf summarises these http://www.finance.gov.au/publications/flipchart/docs/FMACACFlipchart.pdf summarises these. view-source:https://www.tenders.gov.au/?event=public.advancedsearch.home is great for the suspended/active status
   
When defining the hierachy, this system is designed towards monitoring accountablity. Thus large agencies that have registered their own ABN When defining the hierachy, this system is designed towards monitoring accountablity. Thus large agencies that have registered their own ABN
and have their own accountablity mechanisms/website recieve a seperate record as a child of their department. and have their own accountablity mechanisms/website recieve a seperate record as a child of their department.
Some small agencies will choose to simply rely on their parent department's accountablity measures. Some small agencies will choose to simply rely on their parent department's accountablity measures.
   
This flows through to organisation name and other/past names. A department that accounts for an agency will list that agency as an other child name. This flows through to organisation name and other/past names. A department that accounts for an agency will list that agency as an other child name.
As agencies themselves shift between departments, there may be scope for providing time ranges but typically the newest hierarchy will be the one recorded. As agencies themselves shift between departments, there may be scope for providing time ranges but typically the newest hierarchy will be the one recorded.
A department/agency name will be the newest active name assigned to that ABN. A department/agency name will be the newest active name assigned to that ABN.
   
  ABN information is derived from the ABR. This is the definitive umpire about which former name should be linked to which current name.
  For example "Department of Transport and Regional Services" became "Department of Infrastructure, Transport, Regional Development and Local Government" (same ABN)
  however it later split into "Department of Infrastructure and Transport" (same ABN)
  and "Department of Regional Australia, Regional Development and Local Government" (new ABN).
   
Statistical information from http://www.apsc.gov.au/stateoftheservice/1011/statsbulletin/section1.html#t2total https://www.apsedii.gov.au/apsedii/CustomQueryx33.shtml Statistical information from http://www.apsc.gov.au/stateoftheservice/1011/statsbulletin/section1.html#t2total https://www.apsedii.gov.au/apsedii/CustomQueryx33.shtml
  and individual annual reports.
   
Open Government Scoring <h2>Open Government Scoring</h2>
+1 point for every true Has... attribute +1 point for every true Has... attribute
-1 point for every false Has... (ie. Has Not) attribute -1 point for every false Has... (ie. Has Not) attribute
   
  Don't like this? Make your own score, suggest a better scoring mechanism.
   
  <?php
  include_footer();
  ?>
file:a/common.inc.php (deleted)
<?php  
 
function createAgencyDesignDoc() {  
 
$ddoc->_id = '_design/app';  
$ddoc->views = new StdClass();  
// by abn, by name  
$ddoc->views->byABN = new StdClass();  
$ddoc->views->byABN->map = "function(doc) { emit(doc.abn, doc); };";  
$ddoc->views->byName = new StdClass();  
$ddoc->views->byName->map = "function(doc) { emit(doc.name, doc); };";  
$ddoc->views->getActive = new StdClass();  
$ddoc->views->getActive->map = 'function(doc) { if (doc.status == "active") { emit(doc._id, doc); } };';  
$ddoc->views->getSuspended = new StdClass();  
$ddoc->views->getSuspended->map = 'function(doc) { if (doc.status == "suspended") { emit(doc._id, doc); } };';  
$ddoc->views->getScrapeRequired = new StdClass();  
$ddoc->views->getScrapeRequired->map = "function(doc) { emit(doc.abn, doc); };";  
 
return true;  
}  
require (realpath(dirname(__FILE__) . '/couchdb/settee/src/settee.php'));  
 
$server = new SetteeServer('http://127.0.0.1:5984');  
 
function include_header() {  
?>  
<!DOCTYPE html>  
 
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->  
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->  
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->  
<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->  
<!--[if gt IE 8]><!--> <html lang="en"> <!--<![endif]-->  
<head>  
<meta charset="utf-8" />  
 
<!-- Set the viewport width to device width for mobile -->  
<meta name="viewport" content="width=device-width" />  
 
<title>Welcome to Foundation</title>  
 
<!-- Included CSS Files -->  
<link rel="stylesheet" href="stylesheets/foundation.css">  
<link rel="stylesheet" href="stylesheets/app.css">  
 
<!--[if lt IE 9]>  
<link rel="stylesheet" href="stylesheets/ie.css">  
<![endif]-->  
 
 
<!-- IE Fix for HTML5 Tags -->  
<!--[if lt IE 9]>  
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>  
<![endif]-->  
 
</head>  
<body>  
 
<!-- navBar -->  
<div id="navBar" class="container">  
<div class="row">  
<div class="four columns">  
<h1><a href="/">Disclosr</a></h1>  
</div>  
<div class="eight columns hide-on-phones">  
<strong class="right">  
<a href="../grid.php">Features</a>  
<a href="../case-soapbox.php">Case Studies</a>  
<a href="index.php">Documentation</a>  
<a href="http://github.com/navb/foundation">Github</a>  
<a href="../files/foundation-download-2.1.4.zip" class="small blue nice button src-download">Download</a>  
 
</strong>  
</div>  
</div>  
</div>  
<!-- /navBar -->  
 
<!-- container -->  
<div class="container">  
<?php }  
 
function include_footer() { ?>  
</div>  
<!-- container -->  
 
 
 
 
<!-- Included JS Files -->  
<script src="javascripts/foundation.js"></script>  
<script src="javascripts/app.js"></script>  
 
</body>  
</html>  
 
<?php } ?>  
 
 
 
<?php <?php
   
include_once('common.inc.php'); include_once('include/common.inc.php');
include_header(); include_header();
   
$sag->setDatabase("disclosr-agencies", true); function displayValue($key, $value, $mode) {
//get an agency record as json/html, search by name/abn/id if ($mode == "view") {
  if (is_array($value)) {
  echo "<tr><td>$key</td><td><ol>";
  foreach ($value as $subkey => $subvalue) {
  echo "<li>$subvalue</li>";
  }
  echo "</ol></td></tr>";
  } else {
  echo "<tr><td>$key</td><td>$value</td></tr>";
  }
  }
  if ($mode == "edit") {
  if (is_array($value)) {
  echo '<div class="row">
  <div class="seven columns">
  <fieldset>
  <h5>' . $key . '</h5>';
  foreach ($value as $subkey => $subvalue) {
  echo "<label>$subkey</label><input class='input-text' type='text' id='$key$subkey' name='$key" . '[' . $subkey . "]' value='$subvalue'/></tr>";
  }
  echo "</fieldset>
  </div>
  </div>";
  } else {
  if (strpos($key, "_") === 0) {
  echo"<input type='hidden' id='$key' name='$key' value='$value'/>";
  } if (strpos($key, "has") === 0) {
  echo "<label for='$key'><input type='checkbox' id='$key' name='$key' value='$value'> $key</label>";
  } else {
  echo "<label>$key</label><input class='input-text' type='text' id='$key' name='$key' value='$value'/>";
  if ((strpos($key,"URL") > 0 || $key == 'website')&& $value != "") {
  echo "<a href='$value'>view</a>";
  }
  if ($key == 'abn') {
  echo "<a href='http://www.abr.business.gov.au/SearchByAbn.aspx?SearchText=33380054835'>view abn</a>";
  }
  }
  }
  }
  //
  }
   
  function addDefaultFields($row) {
  $defaultFields = Array("name");
  foreach ($defaultFields as $defaultField) {
  if (!isset($row[$defaultField]))
  $row[$defaultField] = "";
  }
  return $row;
  }
   
  $db = $server->get_db('disclosr-agencies');
   
  if (isset($_REQUEST['id'])) {
  //get an agency record as json/html, search by name/abn/id
// by name = startkey="Ham"&endkey="Ham\ufff0" // by name = startkey="Ham"&endkey="Ham\ufff0"
// edit? // edit?
$rows = $sag->get('/_design/app/_view/byABN?include_docs=true')->body->rows; // &endkey='.$searchVar  
foreach ($rows as $row) {  
echo "<table>";  
echo '<tr> <td colspan="2"><h3>' . $row->doc->agencyName . "</h3></td></tr>";  
echo "<tr><th>Field Name</th><th>Field Value</th></tr>";  
foreach ($row->doc as $key => $value) {  
if (is_a($value, 'stdClass')) {  
echo "<tr><td>$key</td><td>".var_dump($value,true)."</td></tr>";  
} else echo "<tr><td>$key</td><td>$value</td></tr>";  
} // also show documents/URLs available  
   
echo "</table>"; $row = $db->get($_REQUEST['id']);
} //print_r($row);
  if (sizeof($_POST) > 0) {
  //print_r($_POST);
  if (isset($_POST['_id']) && $db->get_rev($_POST['_id']) == $_POST['_rev']) {
  echo "Edited version was latest version, continue saving";
  $newdoc = $_POST;
  $newdoc['metadata']['lastModified'] = time();
  $row = $db->save($newdoc);
  } else {
  echo "ALERT doc revised by someone else while editing.";
  }
  }
   
include_footer(); $mode = "edit";
  $row = addDefaultFields(object_to_array($row));
  if ($mode == "view") {
  echo '<table width="100%">';
  echo '<tr> <td colspan="2"><h3>' . $row['name'] . "</h3></td></tr>";
  echo "<tr><th>Field Name</th><th>Field Value</th></tr>";
  }
  if ($mode == "edit") {
  ?>
  <input id="addfield" type="button" value="Add Field"/>
  <script>
  window.onload = function() {
  $(document).ready(function() {
  // put all your jQuery goodness in here.
  // http://charlie.griefer.com/blog/2009/09/17/jquery-dynamically-adding-form-elements/
  $('#addfield').click(function() {
  var field_name=window.prompt("fieldname?","");
  if (field_name !="") {
  $('#submitbutton').before($('<span></span>')
  .append("<label>"+field_name+"</label>")
  .append("<input class='input-text' type='text' id='"+field_name+"' name='"+field_name+"'/>")
  );
  }
  });
  });
  };
  </script>
  <form id="editform" class="nice" method="post">
  <?php
   
  }
  foreach ($row as $key => $value) {
  echo displayValue($key, $value, $mode);
  }
  if ($mode == "view") {
  echo "</table>";
  }
  if ($mode == "edit") {
  echo '<input id="submitbutton" type="submit"/></form>';
  }
  } else {
   
  try {
  $rows = $db->get_view("app", "showNamesABNs")->rows;
  //print_r($rows);
  foreach ($rows as $row) {
  // print_r($row);
  echo '<li><a href="getAgency.php?id=' . $row->key . '">' .
  (isset($row->value->name) && $row->value->name != "" ? $row->value->name : "NO NAME " . $row->value->abn)
  . '</a></li>';
  }
  } catch (SetteeRestClientException $e) {
  setteErrorHandler($e);
  }
  }
  include_footer();
  ?>
file:a/import.php -> file:b/import.php
<?php <?php
require_once 'common.inc.php';  
  require_once 'include/common.inc.php';
  try {
  $server->create_db('disclosr-agencies');
  } catch (SetteeRestClientException $e) {
  setteErrorHandler($e);
  }
$db = $server->get_db('disclosr-agencies'); $db = $server->get_db('disclosr-agencies');
//createAgencyDesignDoc(); createAgencyDesignDoc();
$conn = new PDO("pgsql:dbname=contractDashboard;user=postgres;password=snmc;host=localhost"); $conn = new PDO("pgsql:dbname=contractDashboard;user=postgres;password=snmc;host=localhost");
$namesQ = 'select agency.abn, string_agg("agencyName",\',\') as names from agency inner join agency_nametoabn on agency.abn::text = agency_nametoabn.abn group by agency.abn;'; $namesQ = 'select agency.abn, string_agg("agencyName",\'|\') as names from agency inner join agency_nametoabn on agency.abn::text = agency_nametoabn.abn group by agency.abn;';
$abntonames = Array(); $abntonames = Array();
foreach ($conn->query($namesQ) as $row) { foreach ($conn->query($namesQ) as $row) {
$abntonames[$row['abn']] = explode(",",$row['names']); $abntonames[$row['abn']] = explode("|", $row['names']);
} }
$result = $conn->query("select * from agency"); $result = $conn->query("select * from agency");
while ($agency = $result->fetch(PDO::FETCH_ASSOC)) { while ($agency = $result->fetch(PDO::FETCH_ASSOC)) {
  $agency['_id'] = md5($agency['abn']);
$agency['otherNames'] = $abntonames[$agency['abn']]; $agency['otherNames'] = $abntonames[$agency['abn']];
if (sizeof($abntonames[$agency['abn']]) == 1) $agency['name'] = $abntonames[$agency['abn']][0]; if (sizeof($abntonames[$agency['abn']]) == 1)
$agency["lastScraped"] = "1/1/1970"; $agency['name'] = $abntonames[$agency['abn']][0];
$agency["scrapeDepth"] = 1; $agency["lastScraped"] = "1/1/1970";
$doc = $db->save($agency); $agency["scrapeDepth"] = 1;
print_r($doc); try {
} $doc = $db->save($agency);
  //print_r($doc);
  echo $agency['abn'] . " imported \n<br>";
  } catch (SetteeRestClientException $e) {
  setteErrorHandler($e);
  }
  }
?> ?>
   
  <?php
 
  include_once ('couchdb.inc.php');
  include_once ('template.inc.php');
 
  # Convert a stdClass to an Array. http://www.php.net/manual/en/language.types.object.php#102735
 
  function object_to_array(stdClass $Class) {
  # Typecast to (array) automatically converts stdClass -> array.
  $Class = (array) $Class;
 
  # Iterate through the former properties looking for any stdClass properties.
  # Recursively apply (array).
  foreach ($Class as $key => $value) {
  if (is_object($value) && get_class($value) === 'stdClass') {
  $Class[$key] = object_to_array($value);
  }
  }
  return $Class;
  }
 
  # Convert an Array to stdClass. http://www.php.net/manual/en/language.types.object.php#102735
 
  function array_to_object(array $array) {
  # Iterate through our array looking for array values.
  # If found recurvisely call itself.
  foreach ($array as $key => $value) {
  if (is_array($value)) {
  $array[$key] = array_to_object($value);
  }
  }
 
  # Typecast to (object) will automatically convert array -> stdClass
  return (object) $array;
  }
  ?>
 
 
 
  <?php
 
  include "schemas/schemas.inc.php";
 
  function createAgencyDesignDoc() {
  global $db;
  $obj = new stdClass();
  $obj->_id = "_design/" . urlencode("app");
  $obj->language = "javascript";
  $obj->views->byABN->map = "function(doc) { emit(doc.abn, doc); };";
  $obj->views->byName->map = "function(doc) { emit(doc.name, doc);
  for (name in doc.otherNames) {
  if (doc.otherNames[name] != '' && doc.otherNames[name] != doc.name) {
  emit(doc.otherNames[name], doc);
  }
  }
  };";
  $obj->views->byLastModified->map = "function(doc) { emit(doc.metadata.lastModified, doc); }";
  $obj->views->getActive->map = 'function(doc) { if (doc.status == "active") { emit(doc._id, doc); } };';
  $obj->views->getSuspended->map = 'function(doc) { if (doc.status == "suspended") { emit(doc._id, doc); } };';
  $obj->views->getScrapeRequired->map = "function(doc) { emit(doc.abn, doc); };";
  $obj->views->showNamesABNs->map = "function(doc) { emit(doc._id, {name: doc.name, abn: doc.abn}); };";
  // http://stackoverflow.com/questions/646628/javascript-startswith
  $obj->views->score->map = 'if(!String.prototype.startsWith){
  String.prototype.startsWith = function (str) {
  return !this.indexOf(str);
  }
  }
 
  function(doc) {
  count = 0;
  for(var propName in doc) {
  if(typeof(doc[propName]) != "undefined" && propName.startsWith("l")) {
  count++
  }
  }
  emit(doc._id,{name: doc.name, score:count});
  }';
 
  // allow safe updates (even if slightly slower due to extra: rev-detection check).
  return $db->save($obj, true);
  }
 
  require ('couchdb/settee/src/settee.php');
 
  $server = new SetteeServer('http://127.0.0.1:5984');
 
  function setteErrorHandler($e) {
  echo $e->getMessage() . "<br>" . PHP_EOL;
  }
 
  ?>
 
  <?php
 
  function include_header() {
  ?>
  <!DOCTYPE html>
 
  <!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
  <!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
  <!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
  <!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
  <!--[if gt IE 8]><!--> <html lang="en"> <!--<![endif]-->
  <head>
  <meta charset="utf-8" />
 
  <!-- Set the viewport width to device width for mobile -->
  <meta name="viewport" content="width=device-width" />
 
  <title>Disclosr</title>
 
  <!-- Included CSS Files -->
  <link rel="stylesheet" href="stylesheets/foundation.css">
  <link rel="stylesheet" href="stylesheets/app.css">
 
  <!--[if lt IE 9]>
  <link rel="stylesheet" href="stylesheets/ie.css">
  <![endif]-->
 
 
  <!-- IE Fix for HTML5 Tags -->
  <!--[if lt IE 9]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->
 
  </head>
  <body>
 
  <!-- navBar -->
  <div id="navbar" class="container">
  <div class="row">
  <div class="four columns">
  <h1><a href="/">Disclosr</a></h1>
  </div>
  <div class="eight columns hide-on-phones">
  <strong class="right">
  <a href="getAgency.php">Agencies</a>
  <a href="about.php">About/FAQ</a>
  </strong>
  </div>
  </div>
  </div>
  <!-- /navBar -->
 
  <!-- container -->
  <div class="container">
  <?php }
 
  function include_footer() { ?>
  </div>
  <!-- container -->
 
 
 
 
  <!-- Included JS Files -->
  <script src="javascripts/foundation.js"></script>
  <script src="javascripts/app.js"></script>
  <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
 
  </body>
  </html>
 
  <?php }
 
  ?>
 
file:b/lib/FeedItem.php (new)
  <?php
  /**
  * Univarsel Feed Writer
  *
  * FeedItem class - Used as feed element in FeedWriter class
  *
  * @package UnivarselFeedWriter
  * @author Anis uddin Ahmad <anisniit@gmail.com>
  * @link http://www.ajaxray.com/projects/rss
  */
  class FeedItem
  {
  private $elements = array(); //Collection of feed elements
  private $version;
 
  /**
  * Constructor
  *
  * @param contant (RSS1/RSS2/ATOM) RSS2 is default.
  */
  function __construct($version = RSS2)
  {
  $this->version = $version;
  }
 
  /**
  * Add an element to elements array
  *
  * @access public
  * @param srting The tag name of an element
  * @param srting The content of tag
  * @param array Attributes(if any) in 'attrName' => 'attrValue' format
  * @return void
  */
  public function addElement($elementName, $content, $attributes = null)
  {
  $this->elements[$elementName]['name'] = $elementName;
  $this->elements[$elementName]['content'] = $content;
  $this->elements[$elementName]['attributes'] = $attributes;
  }
 
  /**
  * Set multiple feed elements from an array.
  * Elements which have attributes cannot be added by this method
  *
  * @access public
  * @param array array of elements in 'tagName' => 'tagContent' format.
  * @return void
  */
  public function addElementArray($elementArray)
  {
  if(! is_array($elementArray)) return;
  foreach ($elementArray as $elementName => $content)
  {
  $this->addElement($elementName, $content);
  }
  }
 
  /**
  * Return the collection of elements in this feed item
  *
  * @access public
  * @return array
  */
  public function getElements()
  {
  return $this->elements;
  }
 
  // Wrapper functions ------------------------------------------------------
 
  /**
  * Set the 'dscription' element of feed item
  *
  * @access public
  * @param string The content of 'description' element
  * @return void
  */
  public function setDescription($description)
  {
  $tag = ($this->version == ATOM)? 'summary' : 'description';
  $this->addElement($tag, $description);
  }
 
  /**
  * @desc Set the 'title' element of feed item
  * @access public
  * @param string The content of 'title' element
  * @return void
  */
  public function setTitle($title)
  {
  $this->addElement('title', $title);
  }
 
  /**
  * Set the 'date' element of feed item
  *
  * @access public
  * @param string The content of 'date' element
  * @return void
  */
  public function setDate($date)
  {
  if(! is_numeric($date))
  {
  $date = strtotime($date);
  }
 
  if($this->version == ATOM)
  {
  $tag = 'updated';
  $value = date(DATE_ATOM, $date);
  }
  elseif($this->version == RSS2)
  {
  $tag = 'pubDate';
  $value = date(DATE_RSS, $date);
  }
  else
  {
  $tag = 'dc:date';
  $value = date("Y-m-d", $date);
  }
 
  $this->addElement($tag, $value);
  }
 
  /**
  * Set the 'link' element of feed item
  *
  * @access public
  * @param string The content of 'link' element
  * @return void
  */
  public function setLink($link)
  {
  if($this->version == RSS2 || $this->version == RSS1)
  {
  $this->addElement('link', $link);
  }
  else
  {
  $this->addElement('link','',array('href'=>$link));
  $this->addElement('id', FeedWriter::uuid($link,'urn:uuid:'));
  }
 
  }
 
  /**
  * Set the 'encloser' element of feed item
  * For RSS 2.0 only
  *
  * @access public
  * @param string The url attribute of encloser tag
  * @param string The length attribute of encloser tag
  * @param string The type attribute of encloser tag
  * @return void
  */
  public function setEncloser($url, $length, $type)
  {
  $attributes = array('url'=>$url, 'length'=>$length, 'type'=>$type);
  $this->addElement('enclosure','',$attributes);
  }
 
  } // end of class FeedItem
  ?>
 
  <?php
  // RSS 0.90 Officially obsoleted by 1.0
  // RSS 0.91, 0.92, 0.93 and 0.94 Officially obsoleted by 2.0
  // So, define constants for RSS 1.0, RSS 2.0 and ATOM
 
  define('RSS1', 'RSS 1.0', true);
  define('RSS2', 'RSS 2.0', true);
  define('ATOM', 'ATOM', true);
 
  /**
  * Univarsel Feed Writer class
  *
  * Genarate RSS 1.0, RSS2.0 and ATOM Feed
  *
  * @package UnivarselFeedWriter
  * @author Anis uddin Ahmad <anisniit@gmail.com>
  * @link http://www.ajaxray.com/projects/rss
  */
  class FeedWriter
  {
  private $channels = array(); // Collection of channel elements
  private $items = array(); // Collection of items as object of FeedItem class.
  private $data = array(); // Store some other version wise data
  private $CDATAEncoding = array(); // The tag names which have to encoded as CDATA
 
  private $version = null;
 
  /**
  * Constructor
  *
  * @param constant the version constant (RSS1/RSS2/ATOM).
  */
  function __construct($version = RSS2)
  {
  $this->version = $version;
 
  // Setting default value for assential channel elements
  $this->channels['title'] = $version . ' Feed';
  $this->channels['link'] = 'http://www.ajaxray.com/blog';
 
  //Tag names to encode in CDATA
  $this->CDATAEncoding = array('description', 'content:encoded', 'summary');
  }
 
  // Start # public functions ---------------------------------------------
 
  /**
  * Set a channel element
  * @access public
  * @param srting name of the channel tag
  * @param string content of the channel tag
  * @return void
  */
  public function setChannelElement($elementName, $content)
  {
  $this->channels[$elementName] = $content ;
  }
 
  /**
  * Set multiple channel elements from an array. Array elements
  * should be 'channelName' => 'channelContent' format.
  *
  * @access public
  * @param array array of channels
  * @return void
  */
  public function setChannelElementsFromArray($elementArray)
  {
  if(! is_array($elementArray)) return;
  foreach ($elementArray as $elementName => $content)
  {
  $this->setChannelElement($elementName, $content);
  }
  }
 
  /**
  * Genarate the actual RSS/ATOM file
  *
  * @access public
  * @return void
  */
  public function genarateFeed()
  {
  header("Content-type: text/xml");
 
  $this->printHead();
  $this->printChannels();
  $this->printItems();
  $this->printTale();
  }
 
  /**
  * Create a new FeedItem.
  *
  * @access public
  * @return object instance of FeedItem class
  */
  public function createNewItem()
  {
  $Item = new FeedItem($this->version);
  return $Item;
  }
 
  /**
  * Add a FeedItem to the main class
  *
  * @access public
  * @param object instance of FeedItem class
  * @return void
  */
  public function addItem($feedItem)
  {
  $this->items[] = $feedItem;
  }
 
 
  // Wrapper functions -------------------------------------------------------------------
 
  /**
  * Set the 'title' channel element
  *
  * @access public
  * @param srting value of 'title' channel tag
  * @return void
  */
  public function setTitle($title)
  {
  $this->setChannelElement('title', $title);
  }
 
  /**
  * Set the 'description' channel element
  *
  * @access public
  * @param srting value of 'description' channel tag
  * @return void
  */
  public function setDescription($desciption)
  {
  $this->setChannelElement('description', $desciption);
  }
 
  /**
  * Set the 'link' channel element
  *
  * @access public
  * @param srting value of 'link' channel tag
  * @return void
  */
  public function setLink($link)
  {
  $this->setChannelElement('link', $link);
  }
 
  /**
  * Set the 'image' channel element
  *
  * @access public
  * @param srting title of image
  * @param srting link url of the imahe
  * @param srting path url of the image
  * @return void
  */
  public function setImage($title, $link, $url)
  {
  $this->setChannelElement('image', array('title'=>$title, 'link'=>$link, 'url'=>$url));
  }
 
  /**
  * Set the 'about' channel element. Only for RSS 1.0
  *
  * @access public
  * @param srting value of 'about' channel tag
  * @return void
  */
  public function setChannelAbout($url)
  {
  $this->data['ChannelAbout'] = $url;
  }
 
  /**
  * Genarates an UUID
  * @author Anis uddin Ahmad <admin@ajaxray.com>
  * @param string an optional prefix
  * @return string the formated uuid
  */
  public function uuid($key = null, $prefix = '')
  {
  $key = ($key == null)? uniqid(rand()) : $key;
  $chars = md5($key);
  $uuid = substr($chars,0,8) . '-';
  $uuid .= substr($chars,8,4) . '-';
  $uuid .= substr($chars,12,4) . '-';
  $uuid .= substr($chars,16,4) . '-';
  $uuid .= substr($chars,20,12);
 
  return $prefix . $uuid;
  }
  // End # public functions ----------------------------------------------
 
  // Start # private functions ----------------------------------------------
 
  /**
  * Prints the xml and rss namespace
  *
  * @access private
  * @return void
  */
  private function printHead()
  {
  $out = '<?xml version="1.0" encoding="utf-8"?>' . "\n";
 
  if($this->version == RSS2)
  {
  $out .= '<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  >' . PHP_EOL;
  }
  elseif($this->version == RSS1)
  {
  $out .= '<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  >' . PHP_EOL;;
  }
  else if($this->version == ATOM)
  {
  $out .= '<feed xmlns="http://www.w3.org/2005/Atom">' . PHP_EOL;;
  }
  echo $out;
  }
 
  /**
  * Closes the open tags at the end of file
  *
  * @access private
  * @return void
  */
  private function printTale()
  {
  if($this->version == RSS2)
  {
  echo '</channel>' . PHP_EOL . '</rss>';
  }
  elseif($this->version == RSS1)
  {
  echo '</rdf:RDF>';
  }
  else if($this->version == ATOM)
  {
  echo '</feed>';
  }
 
  }
 
  /**
  * Creates a single node as xml format
  *
  * @access private
  * @param srting name of the tag
  * @param mixed tag value as string or array of nested tags in 'tagName' => 'tagValue' format
  * @param array Attributes(if any) in 'attrName' => 'attrValue' format
  * @return string formatted xml tag
  */
  private function makeNode($tagName, $tagContent, $attributes = null)
  {
  $nodeText = '';
  $attrText = '';
 
  if(is_array($attributes))
  {
  foreach ($attributes as $key => $value)
  {
  $attrText .= " $key=\"$value\" ";
  }
  }
 
  if(is_array($tagContent) && $this->version == RSS1)
  {
  $attrText = ' rdf:parseType="Resource"';
  }
 
 
  $attrText .= (in_array($tagName, $this->CDATAEncoding) && $this->version == ATOM)? ' type="html" ' : '';
  $nodeText .= (in_array($tagName, $this->CDATAEncoding))? "<{$tagName}{$attrText}><![CDATA[" : "<{$tagName}{$attrText}>";
 
  if(is_array($tagContent))
  {
  foreach ($tagContent as $key => $value)
  {
  $nodeText .= $this->makeNode($key, $value);
  }
  }
  else
  {
  $nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent : htmlentities($tagContent);
  }
 
  $nodeText .= (in_array($tagName, $this->CDATAEncoding))? "]]></$tagName>" : "</$tagName>";
 
  return $nodeText . PHP_EOL;
  }
 
  /**
  * @desc Print channels
  * @access private
  * @return void
  */
  private function printChannels()
  {
  //Start channel tag
  switch ($this->version)
  {
  case RSS2:
  echo '<channel>' . PHP_EOL;
  break;
  case RSS1:
  echo (isset($this->data['ChannelAbout']))? "<channel rdf:about=\"{$this->data['ChannelAbout']}\">" : "<channel rdf:about=\"{$this->channels['link']}\">";
  break;
  }
 
  //Print Items of channel
  foreach ($this->channels as $key => $value)
  {
  if($this->version == ATOM && $key == 'link')
  {
  // ATOM prints link element as href attribute
  echo $this->makeNode($key,'',array('href'=>$value));
  //Add the id for ATOM
  echo $this->makeNode('id',$this->uuid($value,'urn:uuid:'));
  }
  else
  {
  echo $this->makeNode($key, $value);
  }
 
  }
 
  //RSS 1.0 have special tag <rdf:Seq> with channel
  if($this->version == RSS1)
  {
  echo "<items>" . PHP_EOL . "<rdf:Seq>" . PHP_EOL;
  foreach ($this->items as $item)
  {
  $thisItems = $item->getElements();
  echo "<rdf:li resource=\"{$thisItems['link']['content']}\"/>" . PHP_EOL;
  }
  echo "</rdf:Seq>" . PHP_EOL . "</items>" . PHP_EOL . "</channel>" . PHP_EOL;
  }
  }
 
  /**
  * Prints formatted feed items
  *
  * @access private
  * @return void
  */
  private function printItems()
  {
  foreach ($this->items as $item)
  {
  $thisItems = $item->getElements();
 
  //the argument is printed as rdf:about attribute of item in rss 1.0
  echo $this->startItem($thisItems['link']['content']);
 
  foreach ($thisItems as $feedItem )
  {
  echo $this->makeNode($feedItem['name'], $feedItem['content'], $feedItem['attributes']);
  }
  echo $this->endItem();
  }
  }
 
  /**
  * Make the starting tag of channels
  *
  * @access private
  * @param srting The vale of about tag which is used for only RSS 1.0
  * @return void
  */
  private function startItem($about = false)
  {
  if($this->version == RSS2)
  {
  echo '<item>' . PHP_EOL;
  }
  elseif($this->version == RSS1)
  {
  if($about)
  {
  echo "<item rdf:about=\"$about\">" . PHP_EOL;
  }
  else
  {
  die('link element is not set .\n It\'s required for RSS 1.0 to be used as about attribute of item');
  }
  }
  else if($this->version == ATOM)
  {
  echo "<entry>" . PHP_EOL;
  }
  }
 
  /**
  * Closes feed item tag
  *
  * @access private
  * @return void
  */
  private function endItem()
  {
  if($this->version == RSS2 || $this->version == RSS1)
  {
  echo '</item>' . PHP_EOL;
  }
  else if($this->version == ATOM)
  {
  echo "</entry>" . PHP_EOL;
  }
  }
 
 
 
  // End # private functions ----------------------------------------------
 
  } // end of class FeedWriter
 
  // autoload classes
  function __autoload($class_name)
  {
  require_once $class_name . '.php';
  }
file:b/rss.xml.php (new)
  <?php
 
  // Agency X updated Y, new files, diff of plain text/link text,
  // feed for just one agency or all
  // This is a minimum example of using the Universal Feed Generator Class
  include("lib/FeedWriter.php");
  //Creating an instance of FeedWriter class.
  $TestFeed = new FeedWriter(RSS2);
  //Setting the channel elements
  //Use wrapper functions for common channelelements
  $TestFeed->setTitle('Last Modified - All');
  $TestFeed->setLink('http://disclosr.lambdacomplex.org/rss.xml.php');
  $TestFeed->setDescription('This is test of creating a RSS 2.0 feed Universal Feed Writer');
  //Retriving informations from database
  $rows = $db->get_view("app", "byLastModified")->rows;
  //print_r($rows);
  foreach ($rows as $row) {
  //Create an empty FeedItem
  $newItem = $TestFeed->createNewItem();
  //Add elements to the feed item
  $newItem->setTitle($row['name']);
  $newItem->setLink($row['id']);
  $newItem->setDate(date("c", $row['metadata']['lastModified']));
  $newItem->setDescription($row['name']);
  //Now add the feed item
  $TestFeed->addItem($newItem);
  }
  //OK. Everything is done. Now genarate the feed.
  $TestFeed->genarateFeed();
  ?>
  <?php
 
  $schemas['agency'] = Array(
  "description" => "Representation of government agency and online transparency measures",
  "type" => "object",
  "properties" => Array(
  "name" => Array("type" => "string", "required" => true, "x-title"=> "Agency Name", "description" => "Agency Name, most recent and broadest"),
  "othernames" => Array("type" => "array", "required" => true, "x-title" => "Agency Past/Other Names", "description" => "Agency Names",
  "items" => Array("type" => "string")),
  ),
  /*"org":{"type":"object",
  "properties":{
  "organizationName":{"type":"string"},
  "organizationUnit":{"type":"string"}},
  }
  }*/
  );
  ?>
 
  <?php
  $schemas = Array();
  include("agency.json.php")
  ?>
 
file:b/score.php (new)
  <?php
 
  include_once('include/common.inc.php');
  include_header();
 
  $db = $server->get_db('disclosr-agencies');
 
  try {
  $rows = $db->get_view("score", "score")->rows;
  //print_r($rows);
  foreach ($rows as $row) {
  echo $row->value->name." ".$row->value->score."<br>";
  }
  } catch (SetteeRestClientException $e) {
  setteErrorHandler($e);
  }
 
  include_footer();
  ?>
/* Foundation v2.1.4 http://foundation.zurb.com */ /* Foundation v2.1.4 http://foundation.zurb.com */
/* Artfully masterminded by ZURB */ /* Artfully masterminded by ZURB */
   
/* ZURB bar copy*/ /* ZURB bar copy*/
#navbar { #navbar {
background: #222222; background: #222222;
border-bottom: solid 4px #00a5ff; border-bottom: solid 4px #00a5ff;
padding: 15px 20px 13px 20px; } padding: 15px 20px 13px 20px; }
@media handheld, only screen and (max-width: 767px) { @media handheld, only screen and (max-width: 767px) {
#navbar { #navbar {
padding-left: 20px; padding-left: 20px;
padding-right: 20px; } padding-right: 20px; }
} }
   
#navbar h1, #navbar h2 { #navbar h1, #navbar h2 {
margin-bottom: 0; margin-bottom: 0;
line-height: 1; } line-height: 1; }
#navbar h1 { #navbar h1 {
color: white; color: white;
font-size: 16px; font-size: 16px;
font-size: 1.6rem; font-size: 1.6rem;
font-weight: 800; } font-weight: 800; }
#navbar h1 a { color: #fff; font-weight: bold; } #navbar a { color: #fff; font-weight: bold; }
#navbar h2 a {  
text-indent: -99999px;  
display: block;  
width: 82px;  
height: 14px;  
background: url('../images/by-zurb.png'); }  
   
   
#navbar strong { display: block; margin: 0; padding: 0; height: 14px; line-height: 14px; position: relative; bottom: 4px; } #navbar strong { display: block; margin: 0; padding: 0; height: 14px; line-height: 14px; position: relative; bottom: 4px; }
#navbar strong a { #navbar strong a {
line-height: 14px; line-height: 14px;
color: #fff; color: #fff;
font-weight: 500; font-weight: 500;
padding-right: 12px; padding-right: 12px;
} }
#navbar strong a.button { padding: 4px 10px; font-weight: bold; } #navbar strong a.button { padding: 4px 10px; font-weight: bold; }
   
  /* other zurb copied css */
  .row { max-width: 1200px; }
   
  div.foundation-header { margin: 0 0 40px 0; padding: 30px 0 0 0; border-bottom: solid 1px #ccc; }
  div.foundation-header h1 { margin-bottom: 0; padding: 0; }
  div.foundation-header h1 a { color: #181818; }
  div.foundation-header h1 a:hover { color: #181818; }
  div.foundation-header .subheader { margin-bottom: 9px; }
   
  div.highlight { margin-bottom: 12px; }
   
  img.beta { position: absolute; top: 0px; right: 0px; }
   
  /* Footer */
  footer.row {
  margin-top: 80px;
  border-top: solid 1px #e6e6e6;
  padding-top: 20px; }
  footer.row h6 {
  color: #6f6f6f;
  font-size: 14px;
  font-size: 1.4rem;
  margin-bottom: 4px; }
  footer.row p {
  color: #626262;
  font-size: 12px;
  font-size: 1.2rem;
  line-height: 18px; }
  footer.row a {
  color: #222222; }
  footer.row a:hover {
  text-decoration: underline; }
   
   
   
  .row.display { background: #f4f4f4; margin-bottom: 10px; border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; }
  .row.display .column, .row.display .columns { background: #e7e7e7; font-size: 11px; text-indent: 3px; padding-top: 6px; padding-bottom: 6px; border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; }
   
// Agency X updated Y, new files, diff of plain text/link text,  
// feed for just one agency or all