Index: wwwroot/includes/qcodo/_core/qcodo.inc.php
===================================================================
--- wwwroot/includes/qcodo/_core/qcodo.inc.php	(revision 43)
+++ wwwroot/includes/qcodo/_core/qcodo.inc.php	(working copy)
@@ -167,6 +167,12 @@
 	QApplicationBase::$ClassFile['qwaiticon'] = __QCODO_CORE__ . '/qform/QWaitIcon.class.php';
 	QApplicationBase::$ClassFile['qcontrolgrouping'] = __QCODO_CORE__ . '/qform/QControlGrouping.class.php';
 	QApplicationBase::$ClassFile['qdropzonegrouping'] = __QCODO_CORE__ . '/qform/QDropZoneGrouping.class.php';
+	
+	//QReport
+	QApplicationBase::$ClassFile['qreportbase'] = __QCODO_CORE__ . '/qform/QReportBase.class.php';
+	QApplicationBase::$ClassFile['qreportcellstyle'] = __QCODO_CORE__ . '/qform/QReportCellStyle.class.php';
+	QApplicationBase::$ClassFile['qreportcell'] = __QCODO_CORE__ . '/qform/QReportCell.class.php';
+		
 
 	if (__DATAGEN_CLASSES__) {
 		@include(__DATAGEN_CLASSES__ . '/_class_paths.inc.php');
Index: wwwroot/includes/qcodo/_core/qform/QReportBase.class.php
===================================================================
--- wwwroot/includes/qcodo/_core/qform/QReportBase.class.php	(revision 0)
+++ wwwroot/includes/qcodo/_core/qform/QReportBase.class.php	(revision 0)
@@ -0,0 +1,310 @@
+<?php
+
+	class QReportBase extends QPaginatedControl {
+		///////////////////////////
+		// Private Member Variables
+		///////////////////////////
+		// APPEARANCE
+		protected $objAlternateRowStyle = null;
+		protected $strBorderCollapse = QBorderCollapse::NotSet;
+		protected $objOverrideRowStyleArray = null;
+		protected $objRowStyle = null;
+
+		// LAYOUT
+		protected $intCellPadding = -1;
+		protected $intCellSpacing = -1;
+		protected $strGridLines = QGridLines::None;
+		protected $blnShowHeader = true;
+		protected $blnShowFooter = false;
+
+		// Data
+		protected $objData = array();
+		protected $objHeader = array();
+		protected $intCurrentRow = 0;
+
+		protected $strTemplate;
+		protected $strText;
+		protected $blnHtmlEntities = false;
+		
+		// MISC
+		protected $strLabelForNoneFound;
+		protected $strLabelForPaginated;
+
+		public function __construct($objParentObject, $strControlId = null) {
+			try {
+				parent::__construct($objParentObject, $strControlId);
+			} catch (QCallerException  $objExc) {
+				$objExc->IncrementOffset();
+				throw $objExc;
+			}
+
+
+			// Labels
+			$this->strLabelForNoneFound = QApplication::Translate('<b>Results:</b> No %s found.');
+			$this->strLabelForPaginated = QApplication::Translate('<b>Results:</b>&nbsp;%s&nbsp;%s-%s&nbsp;of&nbsp;%s.');
+		}
+		//////////
+		// Methods
+		//////////
+		public function PushRow() {
+			$this->intCurrentRow++;
+			$objData = array();
+			foreach(func_get_args() as $objArg) {
+				if (!($objArg instanceof QReportCell)){
+					if(!is_array($objArg))
+						throw new QCallerException("Object isn't a QReportCell");
+					else {
+						foreach($objArg as $objCell){
+							if (!($objCell instanceof QReportCell))		
+								throw new QCallerException("object isn't a QReportCell");
+							array_push($objData,$objCell);
+						}	
+					}
+							
+				}
+				else
+					array_push($objData,$objArg);
+			}
+			array_push($this->objData,$objData);
+		}
+
+		public function PushHeaderRow() {
+
+			$objData = array();
+			foreach(func_get_args() as $objArg) {
+				if (!($objArg instanceof QReportCell)){
+					if(!is_array($objArg))
+						throw new QCallerException("Object isn't a QReportCell");
+					else {
+						foreach($objArg as $objCell){
+							if (!($objCell instanceof QReportCell))		
+								throw new QCallerException("object isn't a QReportCell");
+							array_push($objData,$objCell);
+						}	
+					}
+							
+				}
+				else
+					array_push($objData,$objArg);
+			}
+			array_push($this->objHeader,$objData);
+		}
+
+		public function AddRow($objRow) {
+			$this->intCurrentRow++;
+			/**
+			 * TODO Check that $objRow contains QReportCell's
+			 */
+			array_push($this->objData,$objRow->objCells);
+		}
+		
+		public function CellCount() {
+			$intCount = 0;
+			foreach($objData as $objCellRow) {
+				$intCount += sizeof($objCellRow);
+			}
+			return $intCount;
+		}
+
+		public function ParsePostData() {}
+
+		public function Clear() {
+			$this->objData = array();
+		}
+
+		protected function GetControlHtml() {
+			$this->DataBind();
+
+			// Setup Style
+			$strStyle = $this->GetStyleAttributes();
+			if ($strStyle)
+				$strStyle = sprintf('style="%s"', $strStyle);
+
+			$intMaxCols = 0;
+			$strReportBodyRows = array();
+			
+			//Render Headers
+			foreach($this->objHeader as $objHeaderCellRow) {
+				$strHeaderCellsRow = array();
+				foreach($objHeaderCellRow as $objHeaderCell) {						
+					array_push($strHeaderCellsRow,sprintf('<td %s>%s</td>',
+						$objHeaderCell->GetAttributes(),
+						$objHeaderCell->Render()
+					));
+				}
+				array_push($strReportBodyRows,sprintf('<tr>%s</tr>',implode("\n",$strHeaderCellsRow)));
+			}
+						
+			// Render Data Cells
+			foreach($this->objData as $objCellRow) {
+				$i = 0;
+				$strRowCells = array();
+				foreach($objCellRow as $objCell) {						
+					array_push($strRowCells,sprintf('<td %s>%s</td>',
+						$objCell->GetAttributes(),
+						$objCell->Render()
+					));
+					$intMaxCols = (++$i > $intMaxCols?$i:$intMaxCols);
+				}
+
+				array_push($strReportBodyRows,sprintf('<tr>%s</tr>',
+					implode("\n",$strRowCells)
+				));
+			}
+
+			$strReportBody = sprintf('<tbody>%s</tbody>',
+				implode("\n",$strReportBodyRows)
+			);
+
+			$strToReturn = sprintf('<table id="%s" %s%s>',$this->strControlId,$this->GetAttributes(),$strStyle);
+			
+			if ($this->objPaginator)
+				$strToReturn .= "<caption>\r\n" . $this->GetPaginatorRowHtml($this->objPaginator) . "</caption>\r\n";
+			
+			$strToReturn.= sprintf('%s</table>',$strReportBody);
+
+			$this->objData = array();
+			
+			return $strToReturn;
+		}
+		
+			protected function GetPaginatorRowHtml($objPaginator) {
+			$strToReturn = "  <span class=\"right\">";
+			$strToReturn .= $objPaginator->Render(false);
+			$strToReturn .= "</span>\r\n  <span class=\"left\">";
+			if ($this->TotalItemCount > 0) {
+				$intStart = (($this->PageNumber - 1) * $this->ItemsPerPage) + 1;
+				$intEnd = $intStart + count($this->DataSource) - 1;
+				$strToReturn .= sprintf($this->strLabelForPaginated,
+					$this->strNounPlural,
+					$intStart,
+					$intEnd,
+					$this->TotalItemCount);
+			} else {
+				$intCount = count($this->objDataSource);
+				if ($intCount == 0)
+					$strToReturn .= sprintf($this->strLabelForNoneFound, $this->strNounPlural);
+				else if ($intCount == 1)
+					$strToReturn .= sprintf($this->strLabelForOneFound, $this->strNoun);
+				else
+					$strToReturn .= sprintf($this->strLabelForMultipleFound, $intCount, $this->strNounPlural);
+			}
+
+			$strToReturn .= "</span>\r\n";
+
+			return $strToReturn;
+		}		
+
+		/////////////////////////
+		// Public Properties: GET
+		/////////////////////////
+		public function __get($strName) {
+			switch ($strName) {
+				// APPEARANCE
+				case "AlternateRowStyle": return $this->objAlternateRowStyle;
+				case "BorderCollapse": return $this->strBorderCollapse;
+				case "RowStyle": return $this->objRowStyle;
+
+				// LAYOUT
+				case "CellPadding": return $this->intCellPadding;
+				case "CellSpacing": return $this->intCellSpacing;
+				case "GridLines": return $this->strGridLines;
+				case "ShowHeader": return $this->blnShowHeader;
+				case "ShowFooter": return $this->blnShowFooter;
+
+				default:
+					try {
+						return parent::__get($strName);
+					} catch (QCallerException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+			}
+		}
+
+
+		/////////////////////////
+		// Public Properties: SET
+		/////////////////////////
+		public function __set($strName, $mixValue) {
+			switch ($strName) {
+				// APPEARANCE
+				case "AlternateRowStyle":
+					try {
+						$this->objAlternateRowStyle = QType::Cast($mixValue, "QDataGridRowStyle");
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "BorderCollapse":
+					try {
+						$this->strBorderCollapse = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "RowStyle":
+					try {
+						$this->objRowStyle = QType::Cast($mixValue, "QDataGridRowStyle");
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+					
+				// LAYOUT
+				case "CellPadding":
+					try {
+						$this->intCellPadding = QType::Cast($mixValue, QType::Integer);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "CellSpacing":
+					try {
+						$this->intCellSpacing = QType::Cast($mixValue, QType::Integer);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "GridLines":
+					try {
+						$this->strGridLines = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "ShowHeader":
+					try {
+						$this->blnShowHeader = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+
+				case "ShowFooter":
+					try {
+						$this->blnShowFooter = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+
+				default:
+					try {
+						parent::__set($strName, $mixValue);
+						break;
+					} catch (QCallerException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+			}
+		}
+	}
\ No newline at end of file
Index: wwwroot/includes/qcodo/_core/qform/QReportCell.class.php
===================================================================
--- wwwroot/includes/qcodo/_core/qform/QReportCell.class.php	(revision 0)
+++ wwwroot/includes/qcodo/_core/qform/QReportCell.class.php	(revision 0)
@@ -0,0 +1,110 @@
+<?php
+
+	class QReportCell extends QBaseClass {
+		/**
+		 * TODO
+		 * Overwrite __get and __set methods to set these variables 
+		 * properly
+		 */
+		public $intColumn;
+		public $intRow;
+		public $intColSpan;
+		public $intRowSpan;
+		public $strCellTag;
+
+		protected $mixCellContent;
+		protected $objCellStyle;
+
+		public function __construct($mixCellContent, $objCellStyle = null, $strCellTag = 'td', $intColSpan = 1, $intRowSpan = 1) {
+			$this->mixCellContent = $mixCellContent;
+			$this->objCellStyle = $objCellStyle;
+			$this->strCellTag = $strCellTag;
+			$this->intColSpan = $intColSpan;
+			$this->intRowSpan = $intRowSpan;
+		}
+
+		public function Render() {
+			if(!is_null($this->objCellStyle))
+				return $this->objCellStyle->DataFormatter($this->mixCellContent);
+			else
+				return $this->mixCellContent;
+		}
+
+		public function GetAttributes() {
+			$strToReturn = "";
+			if(!is_null($this->objCellStyle)) {
+				$strToReturn .= $this->objCellStyle->GetAttributes();
+			}
+
+			if($this->intColSpan > 1) {
+				$strToReturn .= sprintf('colspan="%d" ',$this->intColSpan);
+			}
+
+			if($this->intRowSpan > 1) {
+				$strToReturn .= sprintf('rowspan="%d" ',$this->intRowSpan);
+			}
+
+			return $strToReturn;
+		}
+
+		public function __get($strName) {
+			switch ($strName) {
+				case "CellTag": return $this->strCellTag;
+				case "ColSpan": return $this->intColSpan;
+				case "RowSpan": return $this->intRowSpan;
+				default:
+					try {
+						return parent::__get($strName);
+					} catch (QCallerException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+			}
+		}
+
+		public function __set($strName, $mixValue) {
+			switch ($strName) {
+				// APPEARANCE
+				case "CellTag": 
+					try {
+						$this->strCellTag = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "ColSpan": 
+					try {
+						$this->intColSpan = QType::Cast($mixValue, QType::Integer);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "RowSpan": 
+					try {
+						$this->intRowSpan = QType::Cast($mixValue, QType::Integer);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "Content":
+					try {
+						$this->mixCellContent = $mixValue;
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				default:
+					try {
+						parent::__set($strName, $mixValue);
+						break;
+					} catch (QCallerException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+			}
+		}
+	}
Index: wwwroot/includes/qcodo/_core/qform/QReportCellStyle.class.php
===================================================================
--- wwwroot/includes/qcodo/_core/qform/QReportCellStyle.class.php	(revision 0)
+++ wwwroot/includes/qcodo/_core/qform/QReportCellStyle.class.php	(revision 0)
@@ -0,0 +1,380 @@
+<?php
+	// This defines a the stle for a row <tr> for a DataGrid
+	// All the appearance properties should be self-explanatory.
+
+	// For more information about DataGrid appearance, please see DataGrid.inc
+	
+	class QReportCellStyle extends QBaseClass {
+		protected $strBackColor = null;
+		protected $strBorderColor = null;
+		protected $strBorderStyle = QBorderStyle::NotSet;
+		protected $strBorderWidth = null;
+		protected $strCssClass = null;
+		protected $blnFontBold = false;
+		protected $blnFontItalic = false;
+		protected $strFontNames = null;
+		protected $blnFontOverline = false;
+		protected $strFontSize = null;
+		protected $blnFontStrikeout = false;
+		protected $blnFontUnderline = false;
+		protected $strForeColor = null;
+		protected $strHeight = null;
+		protected $strHorizontalAlign = QHorizontalAlign::NotSet;
+		protected $strVerticalAlign = QVerticalAlign::NotSet;
+		protected $blnWrap = true;
+
+		protected $strDataFormatMethod;
+		protected $objDataFormatControl;
+
+		public function SetDataFormatter($strMethodName, $objParentControl = null) {
+			$this->strDataFormatMethod = $strMethodName;
+			$this->objDataFormatControl = $objParentControl;
+		}
+
+		public function DataFormatter($mixCellContent) {
+			// Run the DataFormatter (if applicable)
+			if (($this->strDataFormatMethod)) {
+				try {
+					if($this->objDataFormatControl && method_exists($this->objDataFormatControl,$this->strDataFormatMethod)) {
+						$mixCellContent = call_user_method($this->strDataFormatMethod,$this->objDataFormatControl,$mixCellContent);
+					}
+					else {
+						$mixCellContent = call_user_method($this->strDataFormatMethod,$this,$mixCellContent);
+					}
+				} catch (QCallerException $objExc) {
+					$objExc->IncrementOffset();
+					throw $objExc;
+				}
+			}
+			
+			return $mixCellContent;
+		}
+
+		public function ApplyOverride(QReportCellStyle $objOverrideStyle) {
+			$objNewStyle = clone $this;
+
+			if (!$objOverrideStyle->Wrap)
+				$objNewStyle->Wrap = false;
+			
+			if (($objOverrideStyle->HorizontalAlign) && ($objOverrideStyle->HorizontalAlign != QHorizontalAlign::NotSet))
+				$objNewStyle->HorizontalAlign = $objOverrideStyle->HorizontalAlign;
+
+			if (($objOverrideStyle->VerticalAlign) && ($objOverrideStyle->VerticalAlign != QVerticalAlign::NotSet))
+				$objNewStyle->VerticalAlign = $objOverrideStyle->VerticalAlign;
+
+			if ($objOverrideStyle->Height)
+				$objNewStyle->Height = $objOverrideStyle->Height;
+
+			if ($objOverrideStyle->CssClass)
+				$objNewStyle->CssClass = $objOverrideStyle->CssClass;
+
+			if ($objOverrideStyle->ForeColor)
+				$objNewStyle->ForeColor = $objOverrideStyle->ForeColor;
+			if ($objOverrideStyle->BackColor)
+				$objNewStyle->BackColor = $objOverrideStyle->BackColor;
+			if ($objOverrideStyle->BorderColor)
+				$objNewStyle->BorderColor = $objOverrideStyle->BorderColor;
+			if ($objOverrideStyle->BorderWidth)
+				$objNewStyle->BorderWidth = $objOverrideStyle->BorderWidth;
+			if (($objOverrideStyle->BorderStyle) && ($objOverrideStyle->BorderStyle != QBorderStyle::NotSet))
+				$objNewStyle->BorderStyle = $objOverrideStyle->BorderStyle;
+
+			if ($objOverrideStyle->FontNames)
+				$objNewStyle->FontNames = $objOverrideStyle->FontNames;
+			if ($objOverrideStyle->FontSize)
+				$objNewStyle->FontSize = $objOverrideStyle->FontSize;
+
+			if ($objOverrideStyle->FontBold)
+				$objNewStyle->FontBold = true;
+			if ($objOverrideStyle->FontItalic)
+				$objNewStyle->FontItalic = true;
+
+			if ($objOverrideStyle->FontUnderline)
+				$objNewStyle->FontUnderline = true;
+			if ($objOverrideStyle->FontOverline)
+				$objNewStyle->FontOverline = true;
+			if ($objOverrideStyle->FontStrikeout)
+				$objNewStyle->FontStrikeout = true;
+
+			return $objNewStyle;
+		}
+
+		public function GetAttributes() {
+			$strToReturn = "";
+
+			if (!$this->blnWrap)
+				$strToReturn .= 'nowrap="nowrap" ';
+
+			switch ($this->strHorizontalAlign) {
+				case QHorizontalAlign::Left:
+					$strToReturn .= 'align="left" ';
+					break;
+				case QHorizontalAlign::Right:
+					$strToReturn .= 'align="right" ';
+					break;
+				case QHorizontalAlign::Center:
+					$strToReturn .= 'align="center" ';
+					break;
+				case QHorizontalAlign::Justify:
+					$strToReturn .= 'align="justify" ';
+					break;
+			}
+
+			switch ($this->strVerticalAlign) {
+				case QVerticalAlign::Top:
+					$strToReturn .= 'valign="top" ';
+					break;
+				case QVerticalAlign::Middle:
+					$strToReturn .= 'valign="middle" ';
+					break;
+				case QVerticalAlign::Bottom:
+					$strToReturn .= 'valign="bottom" ';
+					break;
+			}
+
+			if ($this->strCssClass)
+				$strToReturn .= sprintf('class="%s" ', $this->strCssClass);
+
+			$strStyle = "";			
+			
+			if ($this->strHeight) {
+				if (is_numeric($this->strHeight))
+					$strStyle .= sprintf("height:%s;", $this->strHeight);
+				else
+					$strStyle .= sprintf("height:%spx;", $this->strHeight);
+			}
+			if ($this->strForeColor)
+				$strStyle .= sprintf("color:%s;", $this->strForeColor);
+			if ($this->strBackColor)
+				$strStyle .= sprintf("background-color:%s;", $this->strBackColor);
+			if ($this->strBorderColor)
+				$strStyle .= sprintf("border-color:%s;", $this->strBorderColor);
+			if ($this->strBorderWidth) {
+				$strStyle .= sprintf("border-width:%s;", $this->strBorderWidth);
+				if ((!$this->strBorderStyle) || ($this->strBorderStyle == QBorderStyle::NotSet))
+					// For "No Border Style" -- apply a "solid" style because width is set
+					$strStyle .= "border-style:solid;";
+			}
+			if (($this->strBorderStyle) && ($this->strBorderStyle != QBorderStyle::NotSet))
+				$strStyle .= sprintf("border-style:%s;", $this->strBorderStyle);
+			
+			if ($this->strFontNames)
+				$strStyle .= sprintf("font-family:%s;", $this->strFontNames);
+			if ($this->strFontSize) {
+				if (is_numeric($this->strFontSize))
+					$strStyle .= sprintf("font-size:%spx;", $this->strFontSize);
+				else
+					$strStyle .= sprintf("font-size:%s;", $this->strFontSize);
+			}
+			if ($this->blnFontBold)
+				$strStyle .= "font-weight:bold;";
+			if ($this->blnFontItalic)
+				$strStyle .= "font-style:italic;";
+			
+			$strTextDecoration = "";
+			if ($this->blnFontUnderline)
+				$strTextDecoration .= "underline ";
+			if ($this->blnFontOverline)
+				$strTextDecoration .= "overline ";
+			if ($this->blnFontStrikeout)
+				$strTextDecoration .= "line-through ";
+			
+			if ($strTextDecoration) {
+				$strTextDecoration = trim($strTextDecoration);
+				$strStyle .= sprintf("text-decoration:%s;", $strTextDecoration);
+			}
+			
+			if ($strStyle)
+				$strToReturn .= sprintf('style="%s" ', $strStyle);
+			
+			return $strToReturn;
+		}
+
+		/////////////////////////
+		// Public Properties: GET
+		/////////////////////////
+		public function __get($strName) {
+			switch ($strName) {
+				case "BackColor": return $this->strBackColor;
+				case "BorderColor": return $this->strBorderColor;
+				case "BorderStyle": return $this->strBorderStyle;
+				case "BorderWidth": return $this->strBorderWidth;
+				case "CssClass": return $this->strCssClass;
+				case "FontBold": return $this->blnFontBold;
+				case "FontItalic": return $this->blnFontItalic;
+				case "FontNames": return $this->strFontNames;
+				case "FontOverline": return $this->blnFontOverline;
+				case "FontSize": return $this->strFontSize;
+				case "FontStrikeout": return $this->blnFontStrikeout;
+				case "FontUnderline": return $this->blnFontUnderline;
+				case "ForeColor": return $this->strForeColor;
+				case "Height": return $this->strHeight;
+				case "HorizontalAlign": return $this->strHorizontalAlign;
+				case "VerticalAlign": return $this->strVerticalAlign;
+				case "Wrap": return $this->blnWrap;
+
+				default:
+					try {
+						return parent::__get($strName);
+					} catch (QCallerException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+			}
+		}
+
+		/////////////////////////
+		// Public Properties: SET
+		/////////////////////////
+		public function __set($strName, $mixValue) {
+			switch ($strName) {
+				case "BackColor": 
+					try {
+						$this->strBackColor = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "BorderColor":
+					try {
+						$this->strBorderColor = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "BorderStyle":
+					try {
+						$this->strBorderStyle = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "BorderWidth":
+					try {
+						$this->strBorderWidth = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "CssClass":
+					try {
+						$this->strCssClass = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "FontBold":
+					try {
+						$this->blnFontBold = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "FontItalic":
+					try {
+						$this->blnFontItalic = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "FontNames":
+					try {
+						$this->strFontNames = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "FontOverline":
+					try {
+						$this->blnFontOverline = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "FontSize":
+					try {
+						$this->strFontSize = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "FontStrikeout":
+					try {
+						$this->blnFontStrikeout = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "FontUnderline":
+					try {
+						$this->blnFontUnderline = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "ForeColor":
+					try {
+						$this->strForeColor = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "Height":
+					try {
+						$this->strHeight = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "HorizontalAlign":
+					try {
+						$this->strHorizontalAlign = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "VerticalAlign":
+					try {
+						$this->strVerticalAlign = QType::Cast($mixValue, QType::String);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+				case "Wrap":
+					try {
+						$this->blnWrap = QType::Cast($mixValue, QType::Boolean);
+						break;
+					} catch (QInvalidCastException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+
+				default:
+					try {
+						parent::__set($strName, $mixValue);
+						break;
+					} catch (QCallerException $objExc) {
+						$objExc->IncrementOffset();
+						throw $objExc;
+					}
+			}
+		}
+	}
+?>
+
Index: wwwroot/includes/qcodo/qform/QReport.class.php
===================================================================
--- wwwroot/includes/qcodo/qform/QReport.class.php	(revision 0)
+++ wwwroot/includes/qcodo/qform/QReport.class.php	(revision 0)
@@ -0,0 +1,4 @@
+<?php
+
+	class QReport extends QReportBase {
+	}
Index: wwwroot/qreport-samples/paginator.php
===================================================================
--- wwwroot/qreport-samples/paginator.php	(revision 0)
+++ wwwroot/qreport-samples/paginator.php	(revision 0)
@@ -0,0 +1,71 @@
+ <?php
+ 
+ include("../includes/prepend.inc.php");
+ 
+ class QReportForm extends QForm {
+ 	
+ 		protected $rptVendor;
+
+		protected $rptVendorHeaderStyle;
+		protected $rptVendorNameStyle;
+		protected $rptVendorFooterStyle;
+ 	
+ 		protected function Form_Create() {
+
+			$this->rptVendor = new QReport($this);
+			$this->rptVendor->BorderColor = "#CCC";
+			$this->rptVendor->BorderWidth = 1;
+			$this->rptVendor->BorderStyle = QBorderStyle::Solid;
+			
+			$this->rptVendor->Paginator = new QPaginator($this->rptVendor);
+			$this->rptVendor->TotalItemCount = 75;
+			$this->rptVendor->ItemsPerPage = 10;
+
+			/**
+			 * Report Styles
+			 */
+			$this->rptVendorHeaderStyle = new QReportCellStyle();
+			$this->rptVendorHeaderStyle->BackColor = '#444';
+			$this->rptVendorHeaderStyle->ForeColor = '#FFF';
+
+			$this->rptVendorNameStyle = new QReportCellStyle();
+			$this->rptVendorNameStyle->BackColor = '#DDD';
+
+			$this->rptVendorFooterStyle = new QReportCellStyle();
+			$this->rptVendorFooterStyle->BorderColor = '#000';
+			$this->rptVendorFooterStyle->BorderStyle = QBorderStyle::Double;
+			$this->rptVendorFooterStyle->BackColor = '#444';
+			$this->rptVendorFooterStyle->ForeColor = '#FFF';
+			
+			$this->rptVendor->SetDataBinder('DataBind_Load');
+			
+			$this->rptVendor->PushHeaderRow(
+										new QReportCell("Name",$this->rptVendorHeaderStyle),
+										new QReportCell("Vendor Id",$this->rptVendorHeaderStyle),
+										new QReportCell("Amount#1",$this->rptVendorHeaderStyle),
+										new QReportCell("Amount#2",$this->rptVendorHeaderStyle),
+										new QReportCell("Amount#4",$this->rptVendorHeaderStyle),
+										new QReportCell("Amount#5",$this->rptVendorHeaderStyle)
+									);
+			
+ 		}
+ 		
+ 		public function DataBind_Load(){
+ 			
+			$intOffset = ($this->rptVendor->PageNumber - 1) * $this->rptVendor->ItemsPerPage;						
+
+			for($i=$intOffset;$i<=($intOffset + $this->rptVendor->ItemsPerPage);$i++){
+				$objCellArray = array();
+				for($j=1;$j<=6;$j++){
+				  if($j==1)		
+					array_push($objCellArray, new QReportCell($i . "-" . $j,$this->rptVendorNameStyle));
+				  else
+				  	array_push($objCellArray, new QReportCell($i . "-" . $j));									
+				}
+			$this->rptVendor->PushRow($objCellArray);
+			} 				
+ 		}
+ }
+ 
+ QReportForm::Run("QReportForm");
+ ?> 
\ No newline at end of file
Index: wwwroot/qreport-samples/paginator.tpl.php
===================================================================
--- wwwroot/qreport-samples/paginator.tpl.php	(revision 0)
+++ wwwroot/qreport-samples/paginator.tpl.php	(revision 0)
@@ -0,0 +1,6 @@
+<?php $this->RenderBegin(); ?>
+ <div>
+ 	<?php $this->rptVendor->Render(); ?>
+</div>
+
+<?php $this->RenderEnd(); ?>
\ No newline at end of file
Index: wwwroot/qreport-samples/tabular.php
===================================================================
--- wwwroot/qreport-samples/tabular.php	(revision 0)
+++ wwwroot/qreport-samples/tabular.php	(revision 0)
@@ -0,0 +1,121 @@
+<?php
+	require_once("../includes/prepend.inc.php");
+	//require_once("QReport.class.php");
+
+if (!isset($this)) {
+	class QReportForm extends QForm {
+		protected $rptVendor;
+
+		protected $rptVendorHeaderStyle;
+		protected $rptVendorNameStyle;
+		protected $rptVendorFooterStyle;
+
+		protected $calBeginDate;
+		protected $calEndDate;
+
+		protected function Form_Create() {
+			$this->calBeginDate = new QDateTimePicker($this);
+			$this->calBeginDate->Name = 'From';
+			$this->calBeginDate->DateTime = new QDateTime("Now");
+			$this->calBeginDate->DateTimePickerType = QDateTimePickerType::Date;
+
+			$this->calEndDate = new QDateTimePicker($this);
+			$this->calEndDate->Name = 'To';
+			$this->calEndDate->DateTime = new QDateTime("Now");
+			$this->calEndDate->DateTimePickerType = QDateTimePickerType::Date;
+
+			/**
+			 * Define Report
+			 */
+			$this->rptVendor = new QReport($this);
+			$this->rptVendor->BorderColor = "#CCC";
+			$this->rptVendor->BorderWidth = 1;
+			$this->rptVendor->BorderStyle = QBorderStyle::Solid;
+
+			/**
+			 * Report Styles
+			 */
+			$this->rptVendorHeaderStyle = new QReportCellStyle();
+			$this->rptVendorHeaderStyle->BackColor = '#444';
+			$this->rptVendorHeaderStyle->ForeColor = '#FFF';
+
+			$this->rptVendorNameStyle = new QReportCellStyle();
+			$this->rptVendorNameStyle->BackColor = '#DDD';
+
+			$this->rptVendorFooterStyle = new QReportCellStyle();
+			$this->rptVendorFooterStyle->BorderColor = '#000';
+			$this->rptVendorFooterStyle->BorderStyle = QBorderStyle::Double;
+			$this->rptVendorFooterStyle->BackColor = '#444';
+			$this->rptVendorFooterStyle->ForeColor = '#FFF';
+
+			/**
+			 * Bind the Data
+			 */
+			$this->rptVendor->SetDataBinder('rptVendor_Bind');
+		}
+
+		public function rptVendor_Bind() {
+			$this->rptVendor->PushRow(
+										new QReportCell("Name",$this->rptVendorHeaderStyle),
+										new QReportCell("Vendor Id",$this->rptVendorHeaderStyle),
+										new QReportCell("Amount",$this->rptVendorHeaderStyle)
+									);
+
+			/**
+			 * For testing purposes, I threw in a CSV file of data.  See 
+			 * below for an example of using Qcodo ORM to do a database 
+			 * query.  This is just dummy data that doesn't mean 
+			 * anything.
+			 */
+			$count = $total = 0;
+			$fp = fopen("testdata.csv","r");
+			while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) {
+				$this->rptVendor->PushRow(	
+										new QReportCell($data[2],$this->rptVendorNameStyle),
+										new QReportCell($data[0]),
+										new QReportCell($data[1])
+									);
+				$total += $data[1];
+				$count++;
+			}
+			fclose($fp);
+
+			$this->rptVendor->PushRow(
+										new QReportCell("Average",$this->rptVendorFooterStyle,2),
+										new QReportCell(($total / $count),$this->rptVendorFooterStyle) // Average
+									);
+			/**
+			 * Qcodo ORM Database Query with QReport
+			$objVendors = Vendor::LoadAll($objClauses);
+			foreach($objVendors as $objVendor) {
+				$this->rptVendor->PushRow(	
+										new QReportCell($objVendor->Name,$this->rptVendorNameStyle),
+										new QReportCell($objVendor->VendorId),
+										new QReportCell($objVendor->AccountId)
+									);
+			}
+
+			$intAverage = Vendor::QuerySingle(
+				QQ::All(),
+				QQ::Clause(
+					QQ::GroupBy(QQN::Vendor()->VendorId),
+					QQ::Average(QQN::Vendor()->AccountId,'vendor_average')
+				));
+			$this->rptVendor->PushRow(
+										new QReportCell("Average",$this->rptVendorFooterStyle,2),
+										new QReportCell($intAverage->GetVirtualAttribute('vendor_average'),$this->rptVendorFooterStyle)
+									);
+			 */
+		}
+	}
+
+	QReportForm::Run("QReportForm",__FILE__);
+	return;
+}
+?>
+<?php $this->RenderBegin() ?>
+	<?php $this->calBeginDate->RenderWithName(); ?>
+	<?php $this->calEndDate->RenderWithName(); ?>
+	<br /><br />
+	<?php $this->rptVendor->Render(); ?>
+<?php $this->RenderEnd() ?>
Index: wwwroot/qreport-samples/testdata.csv
===================================================================
--- wwwroot/qreport-samples/testdata.csv	(revision 0)
+++ wwwroot/qreport-samples/testdata.csv	(revision 0)
@@ -0,0 +1,86 @@
+"1","100","Alberts Organics/Boulder Fruit"
+"2","101","Albertson's"
+"3","102","Carpenter's Cupboard"
+"4","103","Advantage Logistics"
+"5","104","Anonymous"
+"6","105","Atlas Cold Storage"
+"7","106","Atlas Logistics"
+"8","107","Barber Poultry"
+"9","108","Bear Valley"
+"10","109","Berry Patch Farms"
+"11","110","Bremner Biscuit"
+"12","111","Boyers Coffee"
+"13","112","Carolina Logistics"
+"14","113","Cereform"
+"15","114","Chiquita"
+"16","115","Colorado Natural Eggs"
+"17","116","Colorado Tortilla"
+"18","117","Con Agra"
+"19","118","Cooseman's"
+"20","119","Cormark"
+"21","120","Crazy Merchant"
+"22","121","CR England"
+"23","122","Del Monte"
+"24","123","Denver Rescue Mission"
+"25","124","Domenico"
+"26","125","Donsons"
+"27","126","Door to Door Organics"
+"28","127","Entenmanns/Orowheat"
+"29","128","Family Festival"
+"30","129","Food Bank of the Rockies"
+"31","130","Federal Fruit & Produce"
+"32","131","Feed the Children"
+"33","132","Freshpack"
+"34","133","Fresh Point"
+"35","134","Grant Family Farms"
+"36","135","Hoopeston"
+"37","136","Hope Fellowship"
+"38","137","King Soopers Reclamation"
+"39","138","Kirkpatrick Brokerage"
+"40","139","Loving Hands"
+"41","140","Mile High Express"
+"42","141","Mountainview Distributing"
+"43","142","Nobel Sysco"
+"44","143","Pepperidge"
+"45","144","Petrocco"
+"46","145","Pillar of Fire"
+"47","146","Rainbow United"
+"48","147","Safeway"
+"49","148","Sakata"
+"50","149","Salvation Army"
+"51","150","Sav-A-Lot"
+"52","151","Shamrock"
+"53","152","Share Colorado"
+"54","153","Silver State Foods"
+"55","154","Southwest Traders"
+"56","155","Southern Colorado Farms"
+"57","156","St. Peter & Paul"
+"58","157","Stahl Orchards"
+"59","158","Target"
+"60","159","USF/Albertson's"
+"61","160","Vicorp"
+"62","161","Whole Foods"
+"63","349","Ready Foods"
+"65","351","Henderson Trucking"
+"66","352","Lopez Foods"
+"67","353","Petrocco-Glean"
+"68","354","Sakata- Glean"
+"69","355","Domenico-Glean"
+"70","356","Dawn"
+"71","357","Nest Fresh"
+"72","358","Food Drive"
+"73","359","Food Purchase"
+"74","360","Gypsy Transport"
+"75","361","9 Cares Colorado Shares"
+"76","362","Broncos Wives Drive"
+"77","363","yoplait"
+"78","364","Sysco"
+"79","367","Cooper Tea Company"
+"80","368","Naturally Foods"
+"81","378","High Summit Foods"
+"82","379","Rocky Mountain Foods"
+"83","380","Castle Rock Meats"
+"84","381","Pre-CICS Vendor"
+"85","383","Pizza Hut"
+"86","386","Snyder's of Hanover"
+"87","387","Southwest Automated Security"

