Export for OpenSpending
Export for OpenSpending

--- /dev/null
+++ b/admin/neo4jimporter/.classpath
@@ -1,1 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
 

--- /dev/null
+++ b/admin/neo4jimporter/.project
@@ -1,1 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>neo4jimporter</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
 

--- /dev/null
+++ b/admin/neo4jimporter/.settings/org.eclipse.jdt.core.prefs
@@ -1,1 +1,7 @@
+#Sun Aug 07 18:15:32 EST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.5
 

--- /dev/null
+++ b/admin/neo4jimporter/.settings/org.eclipse.m2e.core.prefs
@@ -1,1 +1,6 @@
+#Sun Aug 07 18:14:30 EST 2011
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
 

--- /dev/null
+++ b/admin/neo4jimporter/pom.xml
@@ -1,1 +1,18 @@
-
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.lambdacomplex.contractdashboard</groupId>
+  <artifactId>neo4jimporter</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <dependencies>
+  	<dependency>
+  		<groupId>org.neo4j</groupId>
+  		<artifactId>neo4j-kernel</artifactId>
+  		<version>1.4</version>
+  	</dependency>
+  	<dependency>
+    <groupId>postgresql</groupId>
+    <artifactId>postgresql</artifactId>
+    <version>9.0-801.jdbc4</version>
+</dependency>
+  </dependencies>
+</project>

--- /dev/null
+++ b/admin/neo4jimporter/src/main/java/Importer.java
@@ -1,1 +1,155 @@
+import java.io.ObjectInputStream.GetField;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.Map;
 
+import org.neo4j.graphdb.DynamicRelationshipType;
+import org.neo4j.kernel.impl.batchinsert.BatchInserter;
+import org.neo4j.kernel.impl.batchinsert.BatchInserterImpl;
+
+public class Importer {
+
+	public static void main(String[] argv) {
+		
+		 Map<String,String> props = new HashMap<String, String>();
+		 props.put("neostore.nodestore.db.mapped_memory", "22000000"); // <expected number of nodes * 9 bytes>
+		 props.put("neostore.relationshipstore.db.mapped_memory", "22000000"); // <expected number of relationships * 33 bytes>
+		  // create the batch inserter 
+		BatchInserter inserter = new
+		  BatchInserterImpl("neo4j-db/",props
+		 );
+		  
+
+
+		 
+		
+		System.out.println("-------- PostgreSQL "
+				+ "JDBC Connection Testing ------------");
+
+		try {
+
+			Class.forName("org.postgresql.Driver");
+
+		} catch (ClassNotFoundException e) {
+
+			System.out.println("Where is your PostgreSQL JDBC Driver? "
+					+ "Include in your library path!");
+			e.printStackTrace();
+
+		}
+
+		System.out.println("PostgreSQL JDBC Driver Registered!");
+
+		Connection conn = null;
+
+		try {
+
+			conn = DriverManager.getConnection(
+					"jdbc:postgresql://127.0.0.1:5432/contractDashboard",
+					"postgres", "snmc");
+
+		} catch (SQLException e) {
+
+			System.out.println("Connection Failed! Check output console");
+			e.printStackTrace();
+
+		}
+
+		if (conn != null) {
+			System.out.println("You made it, take control your database now!");
+		} else {
+			System.out.println("Failed to make connection!");
+		}
+		try {
+			// Print all warnings
+			for (SQLWarning warn = conn.getWarnings(); warn != null; warn = warn
+					.getNextWarning()) {
+				System.out.println("SQL Warning:");
+				System.out.println("State  : " + warn.getSQLState());
+				System.out.println("Message: " + warn.getMessage());
+				System.out.println("Error  : " + warn.getErrorCode());
+			}
+
+			// Get a statement from the connection
+			Statement stmt = conn.createStatement();
+
+			// Execute the query
+			ResultSet rs = stmt.executeQuery("SELECT distinct contractnotice.\"agencyName\",   contractnotice.\"supplierABN\",   contractnotice.\"supplierName\" FROM  public.contractnotice limit 300;");
+String previousAgency = "";
+
+			// Loop through the result set
+			while (rs.next()) {
+				long supplier,agency;
+				agency = doHash(rs.getString("agencyName"));
+				if (rs.getString("agencyName") != previousAgency) {
+					if (!inserter.nodeExists(agency)) {
+					Map<String, Object> properties = new HashMap<String, Object>();
+					  properties.put("Label", rs.getString("agencyName"));
+					  inserter.createNode(agency, properties);
+					}
+				}
+				if (rs.getString("supplierABN") != "0") {
+					supplier = doHash(rs.getString("supplierABN"));
+				} else {
+				supplier = doHash(rs.getString("supplierName"));
+				}
+				  // inject some data 
+			if (!inserter.nodeExists(supplier)) {
+				Map<String, Object> properties = new HashMap<String, Object>();
+			
+				  properties.put("Label", rs.getString("supplierName"));
+				  inserter.createNode(supplier, properties);
+			}
+				  
+				  inserter.createRelationship(agency, supplier,
+				  DynamicRelationshipType.withName("KNOWS"), null);
+				  
+			}
+			// Close the result set, statement and the connection
+			rs.close();
+			stmt.close();
+			conn.close();
+		} catch (SQLException se) {
+			System.out.println("SQL Exception:");
+
+			// Loop through the SQL Exceptions
+			while (se != null) {
+				System.out.println("State  : " + se.getSQLState());
+				System.out.println("Message: " + se.getMessage());
+				System.out.println("Error  : " + se.getErrorCode());
+
+				se = se.getNextException();
+			}
+		} catch (Exception e) {
+			System.out.println(e);
+		}
+		  // shutdown, makes sure all changes are written to disk
+		  inserter.shutdown();
+	}
+
+	static long doHash(String input) {
+		MessageDigest m;
+		try {
+			m = MessageDigest.getInstance("MD5");
+			m.reset();
+			m.update(input.getBytes());
+			byte[] digest = m.digest();
+			return new BigInteger(1, digest).longValue();
+		} catch (NoSuchAlgorithmException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return 0;
+
+	}
+
+
+}

--- /dev/null
+++ b/admin/neo4jimporter/src/main/java/JDBCExample.java
@@ -1,1 +1,50 @@
-
+import java.sql.DriverManager;
+import java.sql.Connection;
+import java.sql.SQLException;
+ 
+public class JDBCExample {
+ 
+	public static void main(String[] argv) {
+ 
+		System.out.println("-------- PostgreSQL "
+				+ "JDBC Connection Testing ------------");
+ 
+		try {
+ 
+			Class.forName("org.postgresql.Driver");
+ 
+		} catch (ClassNotFoundException e) {
+ 
+			System.out.println("Where is your PostgreSQL JDBC Driver? "
+					+ "Include in your library path!");
+			e.printStackTrace();
+			return;
+ 
+		}
+ 
+		System.out.println("PostgreSQL JDBC Driver Registered!");
+ 
+		Connection connection = null;
+ 
+		try {
+ 
+			connection = DriverManager.getConnection(
+					"jdbc:postgresql://127.0.0.1:5432/contractDashboard", "postgres",
+					"snmc");
+ 
+		} catch (SQLException e) {
+ 
+			System.out.println("Connection Failed! Check output console");
+			e.printStackTrace();
+			return;
+ 
+		}
+ 
+		if (connection != null) {
+			System.out.println("You made it, take control your database now!");
+		} else {
+			System.out.println("Failed to make connection!");
+		}
+	}
+ 
+}

 Binary files /dev/null and b/admin/neo4jimporter/target/classes/Importer.class differ
 Binary files /dev/null and b/admin/neo4jimporter/target/classes/JDBCExample.class differ
--- a/admin/partialdata/01Jan1970to01Jan1970val0to16000.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search

-

-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	

-There are no results that match your selection. 
+

--- a/admin/partialdata/01Jan1970to01Jan1970valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search

-

-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	

-There are no results that match your selection. 
+

--- a/admin/partialdata/07Jun2008to09Jun2008valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search

-

-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	

-There are no results that match your selection. 
+

--- a/admin/partialdata/12May2008to14May2008val0to8000.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search

-

-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	

-There are no results that match your selection. 
+

--- a/admin/partialdata/14Aug2007to18Aug2007valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search
 
-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	
-There are no results that match your selection. 

--- a/admin/partialdata/14Aug2007to22Aug2007valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search
 
-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	
-There are no results that match your selection. 

--- a/admin/partialdata/14Aug2007to29Aug2007valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search
 
-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	
-There are no results that match your selection. 

--- a/admin/partialdata/14Nov2007to18Nov2007valto.xls
+++ b/admin/partialdata/14Nov2007to18Nov2007valto.xls
@@ -254,7 +254,7 @@
 ="CN46513"	"Secure LAN facilities for ICON RFT project"	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Insurance and retirement services"	06-Nov-07	31-May-08	26290.12	=""	="MBITS - Managed Business IT Solutions"	15-Nov-07 02:02 PM	
 ="CN46515"	"Business Analyst"	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Management advisory services"	01-Nov-07	01-Feb-08	14960.00	=""	="Dialog Information Technology"	15-Nov-07 02:02 PM	
 ="CN46517-A1"	"Provision of recruitment services for the 2009 Traineeship Programme."	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Human resources services"	31-Oct-07	29-Feb-08	18053.00	=""	="Ross Human Directions Limited"	15-Nov-07 02:03 PM	
-="CN46518"	"To facilitate negotiations and implement Resource Sharing agreements in Australia's Tuna and Billfish fisheries. The consultant activities are as follows:1. Review existing options (research & interpretation)2. Consultation with stakeholders to identify views and positions (facilitation)3. Collate data, analyse data and prepare draft revised agreements between parties (research)4. Consultations to present, discuss and refine agreements between parties (facilitation)5. Further develop/refine agreements and implementation capabilities6. Consultation to finalise agreements and implementation capabilities7. Written report to Government on matters arising from the agreement and implementation.The key output of these activities will be revised recommendations for  resource sharing arrangement in the WTBF and the ETBF based on successful stakeholder consultation."	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Management advisory services"	25-Oct-07	25-Oct-08	10843.69	=""	="Ewan Colquhoun, RidgePartners"	15-Nov-07 02:03 PM	
+="CN46518"	"To facilitate negotiations and implement Resource Sharing agreements in Australia's Tuna and Billfish fisheries. "	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Management advisory services"	25-Oct-07	25-Oct-08	10843.69	=""	="Ewan Colquhoun, RidgePartners"	15-Nov-07 02:03 PM	
 ="CN46519"	"Sample Analysis - Foreign Certificate Audit"	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Management and Business Professionals and Administrative Services"	30-Oct-07	30-Apr-08	50000.00	=""	="National Measurement Institute"	15-Nov-07 02:03 PM	
 ="CN46520"	"Sample Analysis - Foreign Certificate Audit"	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Management and Business Professionals and Administrative Services"	30-Oct-07	30-Apr-08	20000.00	=""	="Silliker Microtech Pty Ltd"	15-Nov-07 02:03 PM	
 ="CN46521"	"Assessing the feasibility of stereo video and evaluating monitoring options for the southern bluefin tuna farm sector"	="Department of Agriculture Fisheries and Forestry"	15-Nov-07	="Management advisory services"	01-Jul-07	31-Dec-07	22000.00	=""	="Australian Southern Bluefin Tuna Industry Association"	15-Nov-07 02:03 PM	

--- a/admin/partialdata/15Sep2007to16Sep2007valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search
 
-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	
-There are no results that match your selection. 

--- a/admin/partialdata/22Aug2007to30Aug2007valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search
 
-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	
-There are no results that match your selection. 

--- a/admin/partialdata/29Aug2007to02Sep2007valto.xls
+++ /dev/null
@@ -1,4 +1,1 @@
-Advanced Search
 
-CN ID	Title	Agency	Publish Date	Category	Contract Start Date	Contract End Date	Value (AUD)	ATM ID	Supplier Name	LastUpdated	
-There are no results that match your selection. 

--- a/admin/partialdata/import.php
+++ b/admin/partialdata/import.php
@@ -1,9 +1,13 @@
 <?php
-include_once ("../lib/common.inc.php");
+include_once ("../../lib/common.inc.php");
 function processFile($fpath, $tablename)
 {
 	global $conn;
+	echo " ============== $fpath  ============== <br>";
+	flush();
 	$row = 1;
+	$success = 0;
+	$dupes = 0;
 	$handle = fopen($fpath, "r");
 	//"t" mode string translates windows line breaks to unix
 	$datamapping0507 = array(
@@ -16,7 +20,8 @@
 		"Title" => "description",
 		"Category" => "category",
 		"ATM ID" => "atmID",
-		"LastUpdated" => "",
+		"Supplier Name" => "supplierName",
+		"LastUpdated" => "amendDate",
 		"" => ""
 	);
 	$headers;
@@ -32,7 +37,7 @@
 		"value",
 		"atmID",
 		"supplierName",
-		"LastUpdated"
+		"amendDate"
 	);
 	if ($tablename == "contractnotice") {
 		$contractNoticeInsertQ = 'INSERT INTO contractnotice ("' . implode('" , "', $contractNoticeFields) . '") VALUES ( ';
@@ -50,7 +55,7 @@
 		}
 		elseif ($row > 3) {
 			if ($num > count($datamapping0507)) {
-				die("<font color=red>Error in data import; data mapping fields out of bounds or changed</font><br>" . $fname . print_r($data));
+				die("<font color=red>Error in data import; data mapping fields out of bounds or changed</font><br>" . $fname . "data:" .$num. print_r($data ,true). "mapping:" . count($datamapping0507). print_r($datamapping0507 ,true));
 			}
 			$contractNoticeInsert = Array();
 			$contractNoticeInsert[] = $fpath;
@@ -98,6 +103,7 @@
 				$contractNoticeInsertQ->execute($contractNoticeInsert);
 				$errors = $conn->errorInfo();
 				if ($errors[1] == 7 && strpos($errors[2], "duplicate key")) {
+					$dupes++;
 				}
 				elseif ($errors[1] == 0) {
 					$success++;
@@ -116,6 +122,9 @@
 		$row++;
 	}
 	fclose($handle);
+	echo " $dupes duplicate records<br>";
+		echo " $success records successfully created<br>";
+	flush();
 	return $success;
 }
 $path = './';
@@ -127,8 +136,9 @@
 	if ($dhandle) {
 		// loop through all of the files
 		while (false !== ($fname = readdir($dhandle))) {
-			if (($fname != '.') && ($fname != '..')) {
+			if (($fname != '.') && ($fname != '..') && (!isset($_REQUEST["filter"]) || strpos($fname,$_REQUEST["filter"]) != false)) {
 				echo "<a href=\"import.php?fname=$fname\">$fname</a>&nbsp;" . filesize($path . $fname) . "&nbsp;" . date("c", filemtime($path . $fname)) . "<br/>";
+				processFile($path . $fname, "contractnotice");
 			}
 		}
 	}
@@ -136,11 +146,9 @@
 else {
 	$success = 0;
 	$fname = $_REQUEST["fname"];
-	echo " ============== $fname  ============== <br>";
-	flush();
+	
 	$success+= processFile($path . $fname, "contractnotice");
-	echo "<br> $success records successfully created";
-	flush();
+
 }
 ?>
 

--- /dev/null
+++ b/admin/partialdata/phpQuery-onefile.php
@@ -1,1 +1,5702 @@
+<?php
+/**
+ * phpQuery is a server-side, chainable, CSS3 selector driven
+ * Document Object Model (DOM) API based on jQuery JavaScript Library.
+ *
+ * @version 0.9.5
+ * @link http://code.google.com/p/phpquery/
+ * @link http://phpquery-library.blogspot.com/
+ * @link http://jquery.com/
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @license http://www.opensource.org/licenses/mit-license.php MIT License
+ * @package phpQuery
+ */
 
+// class names for instanceof
+// TODO move them as class constants into phpQuery
+define('DOMDOCUMENT', 'DOMDocument');
+define('DOMELEMENT', 'DOMElement');
+define('DOMNODELIST', 'DOMNodeList');
+define('DOMNODE', 'DOMNode');
+
+/**
+ * DOMEvent class.
+ *
+ * Based on
+ * @link http://developer.mozilla.org/En/DOM:event
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ * @todo implement ArrayAccess ?
+ */
+class DOMEvent {
+	/**
+	 * Returns a boolean indicating whether the event bubbles up through the DOM or not.
+	 *
+	 * @var unknown_type
+	 */
+	public $bubbles = true;
+	/**
+	 * Returns a boolean indicating whether the event is cancelable.
+	 *
+	 * @var unknown_type
+	 */
+	public $cancelable = true;
+	/**
+	 * Returns a reference to the currently registered target for the event.
+	 *
+	 * @var unknown_type
+	 */
+	public $currentTarget;
+	/**
+	 * Returns detail about the event, depending on the type of event.
+	 *
+	 * @var unknown_type
+	 * @link http://developer.mozilla.org/en/DOM/event.detail
+	 */
+	public $detail;	// ???
+	/**
+	 * Used to indicate which phase of the event flow is currently being evaluated.
+	 *
+	 * NOT IMPLEMENTED
+	 *
+	 * @var unknown_type
+	 * @link http://developer.mozilla.org/en/DOM/event.eventPhase
+	 */
+	public $eventPhase;	// ???
+	/**
+	 * The explicit original target of the event (Mozilla-specific).
+	 *
+	 * NOT IMPLEMENTED
+	 *
+	 * @var unknown_type
+	 */
+	public $explicitOriginalTarget; // moz only
+	/**
+	 * The original target of the event, before any retargetings (Mozilla-specific).
+	 *
+	 * NOT IMPLEMENTED
+	 *
+	 * @var unknown_type
+	 */
+	public $originalTarget;	// moz only
+	/**
+	 * Identifies a secondary target for the event.
+	 *
+	 * @var unknown_type
+	 */
+	public $relatedTarget;
+	/**
+	 * Returns a reference to the target to which the event was originally dispatched.
+	 *
+	 * @var unknown_type
+	 */
+	public $target;
+	/**
+	 * Returns the time that the event was created.
+	 *
+	 * @var unknown_type
+	 */
+	public $timeStamp;
+	/**
+	 * Returns the name of the event (case-insensitive).
+	 */
+	public $type;
+	public $runDefault = true;
+	public $data = null;
+	public function __construct($data) {
+		foreach($data as $k => $v) {
+			$this->$k = $v;
+		}
+		if (! $this->timeStamp)
+			$this->timeStamp = time();
+	}
+	/**
+	 * Cancels the event (if it is cancelable).
+	 *
+	 */
+	public function preventDefault() {
+		$this->runDefault = false;
+	}
+	/**
+	 * Stops the propagation of events further along in the DOM.
+	 *
+	 */
+	public function stopPropagation() {
+		$this->bubbles = false;
+	}
+}
+
+
+/**
+ * DOMDocumentWrapper class simplifies work with DOMDocument.
+ *
+ * Know bug:
+ * - in XHTML fragments, <br /> changes to <br clear="none" />
+ *
+ * @todo check XML catalogs compatibility
+ * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
+ * @package phpQuery
+ */
+class DOMDocumentWrapper {
+	/**
+	 * @var DOMDocument
+	 */
+	public $document;
+	public $id;
+	/**
+	 * @todo Rewrite as method and quess if null.
+	 * @var unknown_type
+	 */
+	public $contentType = '';
+	public $xpath;
+	public $uuid = 0;
+	public $data = array();
+	public $dataNodes = array();
+	public $events = array();
+	public $eventsNodes = array();
+	public $eventsGlobal = array();
+	/**
+	 * @TODO iframes support http://code.google.com/p/phpquery/issues/detail?id=28
+	 * @var unknown_type
+	 */
+	public $frames = array();
+	/**
+	 * Document root, by default equals to document itself.
+	 * Used by documentFragments.
+	 *
+	 * @var DOMNode
+	 */
+	public $root;
+	public $isDocumentFragment;
+	public $isXML = false;
+	public $isXHTML = false;
+	public $isHTML = false;
+	public $charset;
+	public function __construct($markup = null, $contentType = null, $newDocumentID = null) {
+		if (isset($markup))
+			$this->load($markup, $contentType, $newDocumentID);
+		$this->id = $newDocumentID
+			? $newDocumentID
+			: md5(microtime());
+	}
+	public function load($markup, $contentType = null, $newDocumentID = null) {
+//		phpQuery::$documents[$id] = $this;
+		$this->contentType = strtolower($contentType);
+		if ($markup instanceof DOMDOCUMENT) {
+			$this->document = $markup;
+			$this->root = $this->document;
+			$this->charset = $this->document->encoding;
+			// TODO isDocumentFragment
+		} else {
+			$loaded = $this->loadMarkup($markup);
+		}
+		if ($loaded) {
+//			$this->document->formatOutput = true;
+			$this->document->preserveWhiteSpace = true;
+			$this->xpath = new DOMXPath($this->document);
+			$this->afterMarkupLoad();
+			return true;
+			// remember last loaded document
+//			return phpQuery::selectDocument($id);
+		}
+		return false;
+	}
+	protected function afterMarkupLoad() {
+		if ($this->isXHTML) {
+			$this->xpath->registerNamespace("html", "http://www.w3.org/1999/xhtml");
+		}
+	}
+	protected function loadMarkup($markup) {
+		$loaded = false;
+		if ($this->contentType) {
+			self::debug("Load markup for content type {$this->contentType}");
+			// content determined by contentType
+			list($contentType, $charset) = $this->contentTypeToArray($this->contentType);
+			switch($contentType) {
+				case 'text/html':
+					phpQuery::debug("Loading HTML, content type '{$this->contentType}'");
+					$loaded = $this->loadMarkupHTML($markup, $charset);
+				break;
+				case 'text/xml':
+				case 'application/xhtml+xml':
+					phpQuery::debug("Loading XML, content type '{$this->contentType}'");
+					$loaded = $this->loadMarkupXML($markup, $charset);
+				break;
+				default:
+					// for feeds or anything that sometimes doesn't use text/xml
+					if (strpos('xml', $this->contentType) !== false) {
+						phpQuery::debug("Loading XML, content type '{$this->contentType}'");
+						$loaded = $this->loadMarkupXML($markup, $charset);
+					} else
+						phpQuery::debug("Could not determine document type from content type '{$this->contentType}'");
+			}
+		} else {
+			// content type autodetection
+			if ($this->isXML($markup)) {
+				phpQuery::debug("Loading XML, isXML() == true");
+				$loaded = $this->loadMarkupXML($markup);
+				if (! $loaded && $this->isXHTML) {
+					phpQuery::debug('Loading as XML failed, trying to load as HTML, isXHTML == true');
+					$loaded = $this->loadMarkupHTML($markup);
+				}
+			} else {
+				phpQuery::debug("Loading HTML, isXML() == false");