Index: wwwroot/assets/js/jquery.jqDock.min.js
===================================================================
--- wwwroot/assets/js/jquery.jqDock.min.js	(revision 0)
+++ wwwroot/assets/js/jquery.jqDock.min.js	(revision 0)
@@ -0,0 +1,3 @@
+/*jQuery plugin : jqDock v1.2 */
+;(function($){if(!$.fn.jqDock){var jqDock=function(){return{version:1.2,defaults:{size:36,distance:54,coefficient:1.5,duration:500,align:'bottom',labels:false,source:false,loader:null},useJqLoader:$.browser.opera||$.browser.safari,shrinkInterval:100,docks:[],X:0,Y:0,verthorz:{v:{wh:'height',xy:'Y',tl:'top',lead:'Top',trail:'Bottom',act:'ActualInv'},h:{wh:'width',xy:'X',tl:'left',lead:'Left',trail:'Right',act:'Actual'}},elementCss:{position:'relative',borderWidth:0,borderStyle:'none',verticalAlign:'top'},vanillaDiv:'<div style="position:relative;margin:0px;padding:0px;border:0px none;background-color:transparent;">',initDock:function(id){var ME=this,Dock=this.docks[id],op=Dock.Opts,off=0,AI=$('a, img',Dock.Menu),i=0,j,el,wh,acc,upad,opPre95=($.browser.opera&&(1*($.browser.version.match(/^(\d+\.\d+)/)||[0,0])[1])<9.5);this.removeText(Dock.Menu);if(op.orient.vh=='h'){AI.css(this.elementCss);if(opPre95||!$.boxModel){AI.filter('a').css({lineHeight:0,fontSize:'0px'})}else{var hcss={display:'block'};hcss['float']='left';AI.filter('img').css(hcss)}}else{AI.not($('a img',Dock.Menu)).wrap(this.vanillaDiv+'</div>').end().css(this.elementCss).css({display:'block'})}while(i<Dock.Elem.length){el=Dock.Elem[i++];wh=this.keepProportion(el,op.size,{vh:op.orient.inv,inv:op.orient.vh});el.Actual=el.Final=el.Initial=wh[op.vh.wh];el.SizeDiff=el[op.vh.wh]-el.Initial;el.Img.css(wh);el.Img.removeAttr('title').attr({alt:''}).parent('a').removeAttr('title');el.ShrinkStep=Math.floor(el.SizeDiff*this.shrinkInterval/op.duration);Dock[op.vh.inv.wh]=Math.max(Dock[op.vh.inv.wh],op.size+el.Pad[op.vh.inv.lead]+el.Pad[op.vh.inv.trail]);el.Offset=off;el.Centre=el.Offset+el.Pad[op.vh.lead]+(el.Initial/2);off+=el.Initial+el.Pad[op.vh.lead]+el.Pad[op.vh.trail]}i=0;while(i<Dock.Elem.length){el=Dock.Elem[i++];acc=0;upad=el.Pad[op.vh.lead]+el.Pad[op.vh.trail];Dock.Spread+=el.Initial+upad;this.setSizes(id,el.Centre);j=Dock.Elem.length;while(j){acc+=Dock.Elem[--j].Final+upad}Dock[op.vh.wh]=Math.max(Dock[op.vh.wh],acc)}while(i){el=Dock.Elem[--i];el.Final=el.Initial}var wrap=[this.vanillaDiv,'<div class="jqDock" style="position:absolute;top:0px;left:0px;padding:0px;','margin:0px;overflow:visible;height:',Dock.height,'px;width:',Dock.width,'px;"></div></div>'].join('');Dock.Yard=$(Dock.Menu).wrapInner(wrap).find('div.jqDock');$.each([op.vh.lead,op.vh.trail],function(n,v){Dock.Borders[v]=ME.asNumber(Dock.Yard.css('border'+v+'Width'))});if(Dock.Borders[op.vh.lead]){Dock.Yard.css(op.vh.tl,Math.ceil(Dock.Borders[op.vh.lead]/2))}while(i<Dock.Elem.length){el=Dock.Elem[i];this.changeSize(id,i,el.Final,true);el.Img.addClass('jqDockMouse'+id+'_'+(i++))}$(Dock.Menu).show();if(Dock.Opts.labels){$.each(Dock.Elem,function(i){ME.setLabel(id,this.Label)});Dock.Label.hide()}Dock.Yard.bind('mouseover mouseout mousemove',function(e){ME.mouseHandler(e)})},altImage:function(){var alt=$(this).attr('alt');return(alt&&alt.match(/\.(gif|jpg|jpeg|png)$/i))?alt:false},removeText:function(el){var i=el.childNodes.length,j;while(i){j=el.childNodes[--i];if(j.childNodes&&j.childNodes.length){this.removeText(j)}else if(j.nodeType==3){el.removeChild(j)}}},asNumber:function(x){var r=parseInt(x,10);return isNaN(r)?0:r},keepProportion:function(el,dim,orient){var r={},vh=this.verthorz[orient.vh],inv=this.verthorz[orient.inv];r[vh.wh]=dim;r[inv.wh]=Math.round(dim*el[inv.wh]/el[vh.wh]);return r},deltaXY:function(id){var Dock=this.docks[id];if(Dock.Current!==false){var op=Dock.Opts,el=Dock.Elem[Dock.Current],p=el.Pad[op.vh.lead]+el.Pad[op.vh.trail],off=el.Img.offset();Dock.Delta=Math.floor((this[op.vh.xy]-off[op.vh.tl])*(p+el.Initial)/(p+el.Actual))+el.Offset;this.doLabel(id,off)}},setLabel:function(id,label){var Dock=this.docks[id],ME=this,pad={};if(!Dock.Label){Dock.Label=$('<div class="jqDockLabel jqDockMouse'+id+'_00 jqDockLabelImage" style="position:absolute;margin:0px;"></div>').hide().bind('click',function(){Dock.Elem[Dock.Current].Img.trigger('click')}).appendTo(Dock.Yard)}if(label.txt){Dock.Label.text(label.txt);$.each(['Top','Right','Bottom','Left'],function(n,v){pad[v]=ME.asNumber(Dock.Label.css('padding'+v))});$.each(this.verthorz,function(vh,o){label[o.wh]=Dock.Label[o.wh]();label[o.wh+'Pad']=pad[o.lead]+pad[o.trail]})}},doLabel:function(id,off){var Dock=this.docks[id];if(Dock.Opts.labels&&Dock.Current!==false){var el=Dock.Elem[Dock.Current],L=el.Label,op=Dock.Opts,what=typeof off=='string'?off:'move';switch(what){case'show':case'hide':Dock.Label[L.txt?what:'hide']();break;case'change':Dock.Label[0].className=Dock.Label[0].className.replace(/(jqDockLabel)(Link|Image)/,'$1'+(el.Linked?'Link':'Image'));Dock.Label.text(L.txt).css({width:L.width,height:L.height}).hide();break;default:var doff=Dock.Yard.offset(),css={top:off.top-doff.top,left:off.left-doff.left},splt=op.labels.split('');if(splt[0]=='m'){css.top+=Math.floor((el[op.vh.inv.act]-L.height-L.heightPad)/2)}else if(splt[0]=='b'){css.top+=el[op.vh.inv.act]+el.Pad.Top+el.Pad.Bottom-L.height-L.heightPad}if(splt[1]=='c'){css.left+=Math.floor((el[op.vh.act]-L.width-L.widthPad)/2)}else if(splt[1]=='r'){css.left+=el[op.vh.act]+el.Pad.Left+el.Pad.Right-L.width-L.widthPad}Dock.Label.css(css)}}},mouseHandler:function(e){var r=null,t=e.target.className.match(/jqDockMouse(\d+)_(\d+)/),rt=!!(e.relatedTarget)&&e.relatedTarget.tagName!==undefined;if(t){r=false;var id=1*t[1],Dock=this.docks[id],idx=t[2]=='00'?Dock.Current:1*t[2];this.X=e.pageX;this.Y=e.pageY;if(e.type=='mousemove'){if(idx==Dock.Current){this.deltaXY(id);if(Dock.OnDock&&Dock.Expanded){this.setSizes(id);this.factorSizes(id)}}}else{var rel=rt&&e.relatedTarget.className.match(/jqDockMouse(\d+)_(\d+)/);if(e.type=='mouseover'&&(!Dock.OnDock||idx!==Dock.Current)){Dock.Current=idx;this.doLabel(id,'change');this.deltaXY(id);if(Dock.Expanded){this.doLabel(id,'show')}if(rt&&(!rel||rel[1]!=id)){Dock.Timestamp=(new Date()).getTime();this.setSizes(id);Dock.OnDock=true;this.overDock(id)}}else if(rt&&e.type=='mouseout'){if(!rel||rel[1]!=id){Dock.OnDock=false;this.doLabel(id,'hide');var i=Dock.Elem.length;while((i--)){Dock.Elem[i].Final=Dock.Elem[i].Intial}this.offDock(id)}}}}return r},overDock:function(id){var Dock=this.docks[id];if(Dock.OnDock){var ME=this,el=Dock.Elem,i=el.length;while((i--)&&!(el[i].Actual<el[i].Final)){}if(i<0){Dock.Expanded=true;this.deltaXY(id);this.doLabel(id,'show')}else{this.setSizes(id);this.factorSizes(id);setTimeout(function(){ME.overDock(id)},60)}}},offDock:function(id){var Dock=this.docks[id];if(!Dock.OnDock){var ME=this,done=true,i=Dock.Elem.length,el,sz;while(i){el=Dock.Elem[--i];if(el.Actual>el.Initial){sz=el.Actual-el.ShrinkStep;if(sz>el.Initial){done=false}else{sz=el.Initial}this.changeSize(id,i,sz)}}this.deltaXY(id);if(done){while(i<Dock.Elem.length){el=Dock.Elem[i++];el.Actual=el.Final=el.Initial}Dock.Current=Dock.Expanded=false}else{setTimeout(function(){ME.offDock(id)},this.shrinkInterval)}}},setSizes:function(id,mxy){var Dock=this.docks[id],op=Dock.Opts,i=Dock.Elem.length,el,sz;mxy=mxy||Dock.Delta;while(i){el=Dock.Elem[--i];sz=Math.floor(el.SizeDiff*Math.pow(Math.abs(mxy-el.Centre),op.coefficient)/op.attenuation);el.Final=(sz<el.SizeDiff?el[op.vh.wh]-sz:el.Initial)}},factorSizes:function(id){var Dock=this.docks[id],op=Dock.Opts,lapse=op.duration+60;if(Dock.Timestamp){lapse=(new Date()).getTime()-Dock.Timestamp;if(lapse>=op.duration){Dock.Timestamp=0}}if(lapse>60){var f=lapse<op.duration?lapse/op.duration:0,i=0,el;while(i<Dock.Elem.length){el=Dock.Elem[i];this.changeSize(id,i++,(f?Math.floor(el.Initial+((el.Final-el.Initial)*f)):el.Final))}}},changeSize:function(id,idx,dim,force){var Dock=this.docks[id],el=Dock.Elem[idx];if(force||el.Actual!=dim){var op=Dock.Opts,bdr=($.boxModel||op.orient.vh=='v')?0:Dock.Borders[op.vh.lead]+Dock.Borders[op.vh.trail];if(el.Source[2]&&!force&&el.Actual==el.Initial){el.Img[0].src=el.Source[1]}if(Dock.OnDock){this.deltaXY(id)}Dock.Spread+=dim-el.Actual;var css=this.keepProportion(el,dim,op.orient),diff=op.size-css[op.vh.inv.wh],m='margin',z=op.vh.inv;switch(op.align){case'bottom':case'right':css[m+z.lead]=diff;break;case'middle':case'center':css[m+z.lead]=(diff+diff%2)/2;css[m+z.trail]=(diff-diff%2)/2;break;case'top':case'left':css[m+z.trail]=diff;break;default:}Dock.Yard[op.vh.wh](Dock.Spread+bdr);el.Img.css(css);Dock.Yard.css('margin'+op.vh.lead,Math.floor(Math.max(0,(Dock[op.vh.wh]-Dock.Spread)/2)));el.Actual=dim;el.ActualInv=css[op.vh.inv.wh];if(el.Source[2]&&!force&&el.Actual==el.Initial){el.Img[0].src=el.Source[0]}}}}}();$.fn.jqDock=function(opts){return this.filter(function(){var i=jqDock.docks.length;while((i--)&&this!=jqDock.docks[i].Menu){}return(i<0)&&($('img',this).length)}).hide().each(function(){var id=jqDock.docks.length;jqDock.docks[id]={Elem:[],Menu:this,OnDock:false,Expanded:false,Timestamp:0,width:0,height:0,Spread:0,Borders:{},Yard:false,Opts:$.extend({},jqDock.defaults,opts||{}),Current:false,Delta:0,Loaded:0,Label:false};var Dock=jqDock.docks[id],op=Dock.Opts;op.attenuation=Math.pow(op.distance,op.coefficient);op.orient=({left:1,center:1,right:1}[op.align])?{vh:'v',inv:'h'}:{vh:'h',inv:'v'};op.vh=$.extend({},jqDock.verthorz[op.orient.vh],{inv:jqDock.verthorz[op.orient.inv]});op.loader=(op.loader)&&typeof op.loader=='string'&&/^image|jquery$/i.test(op.loader)?op.loader.toLowerCase():'';op.labels=op.labels===true?{top:'bc',left:'tr',right:'tl'}[op.align]||'tc':(typeof op.labels=='string'&&{tl:1,tc:1,tr:1,ml:1,mc:1,mr:1,bl:1,bc:1,br:1}[op.labels]?op.labels:false);$('img',this).each(function(n){var me=$(this),s0=me.attr('src'),s1=(op.source?op.source.call(me[0],n):false)||jqDock.altImage.call(this)||s0,tx=op.labels?me.attr('title')||me.parent('a').attr('title')||'':'';Dock.Elem[n]={Img:me,Source:[s0,s1,!(s0==s1)],Label:{txt:tx,width:0,height:0,widthPad:0,heightPad:0},Initial:0,Actual:0,ActualInv:0,Final:0,Offset:0,Centre:0,Pad:{},Linked:!!me.parent('a').length,width:0,height:0};$.each(['Top','Right','Bottom','Left'],function(i,v){Dock.Elem[n].Pad[v]=jqDock.asNumber(me.css('padding'+v))})});var jqld=(!op.loader&&jqDock.useJqLoader)||op.loader=='jquery';$.each(Dock.Elem,function(i){var me=this,iLoaded=function(){me.height=this.height;me.width=this.width;if(++Dock.Loaded>=Dock.Elem.length){setTimeout(function(){jqDock.initDock(id)},0)}};if(jqld){$('<img />').bind('load',iLoaded).attr({src:this.Source[1]})}else{var pre=new Image();pre.onload=function(){iLoaded.call(this);pre.onload=function(){}};pre.src=this.Source[1]}})}).end()};$.jqDock=function(x){return jqDock[x]?jqDock[x]:null}}})(jQuery);
+
Index: wwwroot/examples/advanced_ajax/jqdock.php
===================================================================
--- wwwroot/examples/advanced_ajax/jqdock.php	(revision 0)
+++ wwwroot/examples/advanced_ajax/jqdock.php	(revision 0)
@@ -0,0 +1,86 @@
+<?php
+require('../../includes/prepend.inc.php');
+
+class ExampleForm extends QForm {
+
+        //Dock definition
+        protected $dckMenuVertical;
+        protected $dckMenuHorizontal;
+
+        //Dock Items Vertical
+		protected $dckItemHomeV;
+		protected $dckItemStudentsV;
+		protected $dckItemGroupsV;
+		protected $dckItemLevelsV;
+
+        //Dock Items Horizontal
+		protected $dckItemHomeH;
+		protected $dckItemStudentsH;
+		protected $dckItemGroupsH;
+		protected $dckItemLevelsH;
+
+		protected function Form_Create() {
+
+        $this->dckMenuVertical = new QJqDock($this);
+        $this->dckMenuHorizontal = new QJqDock($this);
+
+        $this->dckMenuVertical->Align = 'bottom';
+        $this->dckMenuVertical->Labels = 'bc';
+        $this->dckMenuVertical->Size = 48;
+        $this->dckMenuVertical->Distance = 60;
+        $this->dckMenuVertical->Coefficient = 1.5;
+
+        $this->dckMenuHorizontal->Align = 'right';
+        $this->dckMenuHorizontal->Labels = 'tr';
+        $this->dckMenuHorizontal->Size = 32;
+        $this->dckMenuHorizontal->Distance = 40;
+        $this->dckMenuHorizontal->Coefficient = 2;
+
+        //Vertical Items
+        $this->dckItemHomeV = new QJqDockItem($this->dckMenuVertical);
+        $this->dckItemHomeV->Link = '/admin';
+        $this->dckItemHomeV->ImageSource = '/assets/images/home.png';
+        $this->dckItemHomeV->Title = QApplication::Translate('Home');
+
+        $this->dckItemStudentsV = new QJqDockItem($this->dckMenuVertical);
+        $this->dckItemStudentsV->Link = '/admin/students';
+        $this->dckItemStudentsV->ImageSource = '/assets/images/student.png';
+        $this->dckItemStudentsV->Title = QApplication::Translate('Students');
+
+        $this->dckItemGroupsV = new QJqDockItem($this->dckMenuVertical);
+        $this->dckItemGroupsV->Link = '/admin/groups';
+        $this->dckItemGroupsV->ImageSource = '/assets/images/students.png';
+        $this->dckItemGroupsV->Title = QApplication::Translate('Groups');
+
+        $this->dckItemLevelsV = new QJqDockItem($this->dckMenuVertical);
+        $this->dckItemLevelsV->Link = '/admin/levels';
+        $this->dckItemLevelsV->ImageSource = '/assets/images/level.png"';
+        $this->dckItemLevelsV->Title = QApplication::Translate('Levels');
+
+        //Horizontal Items
+        $this->dckItemHomeH = new QJqDockItem($this->dckMenuHorizontal);
+        $this->dckItemHomeH->Link = '/admin';
+        $this->dckItemHomeH->ImageSource = '/assets/images/home.png';
+        $this->dckItemHomeH->Title = QApplication::Translate('Home');
+
+        $this->dckItemStudentsH = new QJqDockItem($this->dckMenuHorizontal);
+        $this->dckItemStudentsH->Link = '/admin/students';
+        $this->dckItemStudentsH->ImageSource = '/assets/images/student.png';
+        $this->dckItemStudentsH->Title = QApplication::Translate('Students');
+
+        $this->dckItemGroupsH = new QJqDockItem($this->dckMenuHorizontal);
+        $this->dckItemGroupsH->Link = '/admin/groups';
+        $this->dckItemGroupsH->ImageSource = '/assets/images/students.png';
+        $this->dckItemGroupsH->Title = QApplication::Translate('Groups');
+
+        $this->dckItemLevelsH = new QJqDockItem($this->dckMenuHorizontal);
+        $this->dckItemLevelsH->Link = '/admin/levels';
+        $this->dckItemLevelsH->ImageSource = '/assets/images/level.png"';
+        $this->dckItemLevelsH->Title = QApplication::Translate('Levels');
+
+		}
+
+}
+
+ExampleForm::Run('ExampleForm','jqdock.tpl.php');
+?>
Index: wwwroot/examples/advanced_ajax/jqdock.tpl.php
===================================================================
--- wwwroot/examples/advanced_ajax/jqdock.tpl.php	(revision 0)
+++ wwwroot/examples/advanced_ajax/jqdock.tpl.php	(revision 0)
@@ -0,0 +1,27 @@
+<?php require('../includes/header.inc.php'); ?>
+	<?php $this->RenderBegin(); ?>
+
+	<div class="instructions">
+		<div class="instruction_title">QJqDock</div>
+
+        <p>The Dock - as anyone familiar with a Mac will know - is a set of iconic
+        images that expand when rolled over with the cursor, and usually perform
+        some action when clicked. This plugin mimics that behaviour by transforming
+        a contiguous set of HTML images into an expanding Dock, vertical or horizontal,
+        with or without labels.</p>
+        
+        <p>Basically, all the Dock does is expand a reduced size image towards its full size
+        when the cursor is on or near it. You can specify a vertical or
+        horizontal orientation for the Dock, and select the direction in which the
+        image should expand and whether to show labels or not. The styling and positioning
+        of the Dock is (almost) entirely down to you.</p>
+     </div>
+
+    <div id="dockmenu" style="height:300px">
+    <?php
+        $this->dckMenuHorizontal->Render();
+        $this->dckMenuVertical->Render();
+    ?>
+    </div>
+        <?php $this->RenderEnd(); ?>
+<?php require('../includes/footer.inc.php'); ?>
\ No newline at end of file
Index: wwwroot/examples/includes/examples.inc.php
===================================================================
--- wwwroot/examples/includes/examples.inc.php	(revision 177)
+++ wwwroot/examples/includes/examples.inc.php	(working copy)
@@ -51,6 +51,7 @@
 			array_push(Examples::$Categories[$intIndex], '/qcodo_query/subsql.php * Custom SQL Subqueries for QQuery');
 			array_push(Examples::$Categories[$intIndex], '/qcodo_query/intro.php * Performing Custom SQL Queries');
 			array_push(Examples::$Categories[$intIndex], '/qcodo_query/qcache.php * Caching Query Results with QueryArrayCached');
+			array_push(Examples::$Categories[$intIndex], '/qcodo_query/migrating.php * From Beta 2: Migrating from "Manual Queries"');
 
 			$intIndex++;
 			Examples::$Categories[$intIndex] = array();
@@ -89,7 +90,6 @@
 			Examples::$Categories[$intIndex]['description'] = 'The QDataGrid and QDataRepeater controls';
 			array_push(Examples::$Categories[$intIndex], '/datagrid/intro.php * Basic QDataGrid');
 			array_push(Examples::$Categories[$intIndex], '/datagrid/variables.php * The QDataGrid Variables');
-			array_push(Examples::$Categories[$intIndex], '/datagrid/rowactions.php * Making entire QDataGrid rows clickable');
 			array_push(Examples::$Categories[$intIndex], '/datagrid/sorting.php * QDataGrid Sorting');
 			array_push(Examples::$Categories[$intIndex], '/datagrid/pagination.php * QDataGrid Pagination');
 			array_push(Examples::$Categories[$intIndex], '/datagrid/ajax.php * Enabling AJAX on the QDataGrid');
@@ -133,6 +133,8 @@
 			array_push(Examples::$Categories[$intIndex], '/advanced_ajax/dialog_box.php Modal "Dialog Boxes"');
 			array_push(Examples::$Categories[$intIndex], '/advanced_ajax/more_dialog_boxes.php Pre-built Dialog Boxes: Confirmations and Prompts');
 			array_push(Examples::$Categories[$intIndex], '/advanced_ajax/jquery_effects.php JQuery Effects');
+			array_push(Examples::$Categories[$intIndex], '/advanced_ajax/tab_panel.php JQuery Tab panels');
+            array_push(Examples::$Categories[$intIndex], '/advanced_ajax/jqdock.php JQuery Dock');
 			
 			Examples::$AdditionalCode['/advanced_ajax/dialog_box.php'] = array('CalculatorWidget.class.php','CalculatorWidget.tpl.php');
 
@@ -140,14 +142,13 @@
 			Examples::$Categories[$intIndex] = array();
 			Examples::$Categories[$intIndex]['name'] = 'Other Advanced Controls';
 			Examples::$Categories[$intIndex]['description'] = 'A collection of examples for some of the more advanced/complex QControls';
-			array_push(Examples::$Categories[$intIndex], '/other_controls/fckeditor.php Rich Text Editing with QFCKEditor');
 			array_push(Examples::$Categories[$intIndex], '/image_label/intro.php Introduction to QImageLabel');
 			array_push(Examples::$Categories[$intIndex], '/other_controls/autocomplete.php * Auto-complete Textbox');
 			array_push(Examples::$Categories[$intIndex], '/treenav/treenav.php Introduction to QTreeNav');
 			array_push(Examples::$Categories[$intIndex], '/other_controls/image.php Introduction to QImageControl');
 			array_push(Examples::$Categories[$intIndex], '/other_controls/datetime.php Date and DateTime-based QControls');
 			array_push(Examples::$Categories[$intIndex], '/other_controls/file_asset.php Combining Controls: A Better Way to Upload Files');
-		
+
 			$intIndex++;
 			Examples::$Categories[$intIndex] = array();
 			Examples::$Categories[$intIndex]['name'] = 'MetaControls, Meta DataGrids, and the Drafts';
@@ -177,7 +178,6 @@
 			Examples::$Categories[$intIndex]['name'] = 'Other Tidbits';
 			Examples::$Categories[$intIndex]['description'] = 'Other random examples, samples and tutorials';
 			array_push(Examples::$Categories[$intIndex], '/other/optimistic_locking.php * Optimistic Locking and QForms');
-			array_push(Examples::$Categories[$intIndex], '/other/diff.php * QObjectDiff: What fields changed in my form?');
 			array_push(Examples::$Categories[$intIndex], '/other/attribute_overriding.php Attribute Overriding');
 			array_push(Examples::$Categories[$intIndex], '/other/alternate_template.php Specifying a Template Filepath');
 			array_push(Examples::$Categories[$intIndex], '/other/single.php Single File QForms');
Index: wwwroot/includes/qcodo/qform/QJqDock.class.php
===================================================================
--- wwwroot/includes/qcodo/qform/QJqDock.class.php	(revision 0)
+++ wwwroot/includes/qcodo/qform/QJqDock.class.php	(revision 0)
@@ -0,0 +1,129 @@
+<?php
+/**
+ * QJqDock
+ *
+ * @uses QPanel
+ * @package
+ * @subpackage panels
+ * @version
+ * @author enzo <enzo@anexusit.com>
+ *
+ */
+class QJqDock extends QPanel
+{
+
+	protected $strAlign;
+	protected $strLabels;
+	protected $fltSize;
+	protected $intDistance;
+	protected $fltCoefficient;
+	
+    public function __construct($objParentObject,$strControlId = null)
+    {
+        parent::__construct($objParentObject,$strControlId);
+        // Init
+        $this->strTemplate = __TEMPLATES__ . '/' . __CLASS__ . '.tpl.php';
+        $this->setJavaScripts();
+    }	
+
+	private function setJavaScripts() {
+		$this->AddJavascript(__JQUERY_BASE__);
+		$this->AddJavascript('jquery.jqDock.min.js');
+		$this->AddStyleSheet('jqDock.css');
+		if (QApplication::IsBrowser(QBrowserType::InternetExplorer)) {
+			$this->AddStyleSheet('jqDock.css_ie.css');
+		}
+	}
+	
+
+
+	public function Render($blnDisplayOutput = true)
+	{
+		$strToReturn = parent::Render($blnDisplayOutput);
+		QApplication::ExecuteJavaScript(sprintf(
+           "$(document).ready(
+                function()
+                {
+                    $('#%s-dock').jqDock(
+                        {
+                        align: '%s',
+                        labels: '%s',
+                        size: %s,
+                        distance: %s,
+                        coefficient: %s
+                        });
+                });
+           ", $this->strControlId // ID of This Control
+		, $this->strAlign // Align
+		, $this->strLabels // label orientation
+		, $this->fltSize // Size
+		, $this->intDistance // Distance
+		, $this->fltCoefficient // Coefficient
+		));
+
+		return $strToReturn;
+	}
+
+	/**
+	 * @access public
+	 * @param string $strName
+	 * @return mixed
+	 */
+	public function __get($strName)
+	{
+		switch ($strName)
+		{
+			case 'Align': return $this->strAlign;
+			case 'Labels': return $this->strLabels;
+			case 'Size': return $this->fltSize;
+			case 'Distance': return $this->intDistance;
+			case 'Coefficient': return $this->fltCoefficient;
+			default:
+				try
+				{
+					return parent::__get($strName);
+				}
+				catch (QCallerException $objExc)
+				{
+					$objExc->IncrementOffset();
+					throw $objExc;
+				}
+		}
+	}
+
+	/**
+	* @access public
+	* @param string $strName
+	* @param mixed $mixValue
+	*/
+	public function __set($strName, $mixValue)
+	{
+		$this->blnModified = true;
+		try
+		{
+			switch ($strName)
+			{
+				case 'Align': $this->strAlign = QType::Cast($mixValue, QType::String); break;
+				case "Labels": $this->strLabels = QType::Cast($mixValue, QType::String); break;
+				case "Size": $this->fltSize = QType::Cast($mixValue, QType::Float); break;
+				case "Distance": $this->intDistance = QType::Cast($mixValue, QType::Integer); break;
+				case "Coefficient": $this->fltCoefficient = QType::Cast($mixValue, QType::Float); break;
+				default: parent::__set($strName, $mixValue);
+			}
+		}
+		catch (QInvalidCastException $objExc)
+		{
+			$objExc->IncrementOffset();
+			throw $objExc;
+		}
+		catch (QCallerException $objExc)
+		{
+			$objExc->IncrementOffset();
+			throw $objExc;
+		}
+	}
+
+
+}
+
+?>
\ No newline at end of file
Index: wwwroot/includes/qcodo/qform/QJqDockItem.class.php
===================================================================
--- wwwroot/includes/qcodo/qform/QJqDockItem.class.php	(revision 0)
+++ wwwroot/includes/qcodo/qform/QJqDockItem.class.php	(revision 0)
@@ -0,0 +1,95 @@
+<?php
+/**
+ * QJqDock
+ *
+ * @uses QPanel
+ * @package
+ * @subpackage panels
+ * @version
+ * @author enzo <enzo@anexusit.com>
+ *
+ */
+class QJqDockItem extends QPanel
+{
+
+	protected $strImageSource;
+	protected $strLink;
+	protected $strTitle;
+	
+    public function __construct($objParentObject,$strControlId = null)
+    {
+        parent::__construct($objParentObject,$strControlId);
+    }	
+
+
+	public function GetControlHtml()
+	{
+		$strToReturn = sprintf('<a href="%s"><img src="%s" alt="%s" title="%s"/></a>'
+		, $this->strLink 
+		, $this->strImageSource
+		, $this->strTitle
+		, $this->strTitle
+		);
+		
+		return $strToReturn;
+	}
+
+	/**
+	 * @access public
+	 * @param string $strName
+	 * @return mixed
+	 */
+	public function __get($strName)
+	{
+		switch ($strName)
+		{
+			case 'Link': return $this->strLink;
+			case 'ImageSource': return $this->strImageSource;
+			case 'Title': return $this->strTitle;
+			default:
+				try
+				{
+					return parent::__get($strName);
+				}
+				catch (QCallerException $objExc)
+				{
+					$objExc->IncrementOffset();
+					throw $objExc;
+				}
+		}
+	}
+
+	/**
+	* @access public
+	* @param string $strName
+	* @param mixed $mixValue
+	*/
+	public function __set($strName, $mixValue)
+	{
+		$this->blnModified = true;
+		try
+		{
+			switch ($strName)
+			{
+				case 'Link': $this->strLink = QType::Cast($mixValue, QType::String); break;
+				case "ImageSource": $this->strImageSource = QType::Cast($mixValue, QType::String); break;
+				case "Title": $this->strTitle = QType::Cast($mixValue, QType::String); break;
+				default: parent::__set($strName, $mixValue);
+			}
+		}
+		catch (QInvalidCastException $objExc)
+		{
+			$objExc->IncrementOffset();
+			throw $objExc;
+		}
+		catch (QCallerException $objExc)
+		{
+			$objExc->IncrementOffset();
+			throw $objExc;
+		}
+	}
+
+
+}
+
+?>
\ No newline at end of file
Index: wwwroot/templates/QJqDock.tpl.php
===================================================================
--- wwwroot/templates/QJqDock.tpl.php	(revision 0)
+++ wwwroot/templates/QJqDock.tpl.php	(revision 0)
@@ -0,0 +1,7 @@
+<div id="<?php _p($_CONTROL->ControlId); ?>-dock">
+
+    <?php
+    foreach($_CONTROL->GetChildControls() as $Item) {
+    	$Item->Render();    	
+    } ?>
+</div>
\ No newline at end of file

