	TERRACOR.YUICellFormatter=(function(){
		var CHECK_ICON    = "<input type='checkbox' checked class='terra_toggle'>";
		var UNCHECK_ICON  = "<input type='checkbox' class='terra_toggle'>";
		
		return {	
			delete_button :  function (elCell, oRecord, oColumn, oData){				
				elCell.innerHTML = "<input type=button value='Delete'>";
			},
			edit_button : function (elCell, oRecord, oColumn, oData){				
				elCell.innerHTML = "<input type=button value='Edit'>";
			},
			toggle_button : function(elCell, oRecord, oColumn, oData){				
								
				if( oRecord.getData().id  )				
					elCell.innerHTML = CHECK_ICON;				
				else if(products[oRecord.getData().PartNum+oRecord.getData().WarehouseID])
					elCell.innerHTML = CHECK_ICON;				
				else				
					elCell.innerHTML = UNCHECK_ICON;												
			}
		}	
	})();
  	TERRACOR.YUITable = (function(){
		  	var myDataTable;
			var myColumnDefs;
		  	var myDataSource;
		  	var myPaginator;
		  	var myConfig;
		  	var initialRequestLine = '';
		  	var currentQueryString = '';
		  	var pagingDiv          = 'paging';
		  	var tableDiv           = 'yuitable';
		  	var mySchemaDef		   = null;
		  	var _dataSourceUrl     = '';
		  	var _getCriteria       = null; //function
		  	var _callAfterPaging   = function(){};
		  	var _state             = true;//true=visible ; false = hidden 
		  	var _saveRowsPerPage   = false;
		  	var DEFAULT_ROWS_PER_PAGE = 20000;
		  	/**init pagination**/
			function setupMyPaging(){
				myPaginator = new YAHOO.widget.Paginator({
				    containers         : [pagingDiv],
				    pageLinks          : 5,
				    rowsPerPage        : DEFAULT_ROWS_PER_PAGE ,
				    rowsPerPageOptions : [DEFAULT_ROWS_PER_PAGE,30,60,100],
				    template           : "<strong>{CurrentPageReport}</strong> {PreviousPageLink} {PageLinks} {NextPageLink} {RowsPerPageDropdown}"
				});
				return myPaginator;
			}	
			/**data source configuration**/
			function setupMyDatasource(){	
				myDataSource = new YAHOO.util.DataSource(_dataSourceUrl);
				myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
				myDataSource.connMethodPost = true; 
				myDataSource.responseSchema = mySchemaDef;
				return myDataSource;
			}
			/**return my table configuration**/
			function setupMyTableConfig(){
				myConfig = { 
				    initialRequest         : initialRequestLine, 
			    	generateRequest        : buildMyQueryString, 
			    	paginator              : setupMyPaging(), 
			    	paginationEventHandler : YAHOO.widget.DataTable.handleDataSourcePagination 
				};
				return myConfig;
			}
			/***builds the request line needed for page navigation**/
			function buildMyQueryString(state,dt){
			    currentQueryString =	"&start=" + state.pagination.recordOffset + 
			           					"&show=" + state.pagination.rowsPerPage; 
				if(typeof _getCriteria=='function') currentQueryString+=  _getCriteria();    			
			    return currentQueryString;
			}
			/**init yui data table**/
			function setupTable(tbleDiv,pageDiv,initialReqLine){
				initialRequestLine = initialReqLine;
				pagingDiv          = pageDiv;
				tableDiv           = tbleDiv;
				myDataTable = new YAHOO.widget.DataTable(tableDiv, myColumnDefs,setupMyDatasource(),setupMyTableConfig() );
				subscribeClickEvent();
			}
			/**subscribe events**/
			function subscribeClickEvent(){
				myDataTable.subscribe('cellClickEvent', function(ev) {
				    var target = YAHOO.util.Event.getTarget(ev);
				    var column = myDataTable.getColumn(target);
				    if(typeof column.clickFunction=='function'){				    	
				    	var _record = myDataTable.getRecord(target);				    
						column.clickFunction(_record,myDataTable.getTdEl({record:_record,column:column}));
					}
				});							
			}
			/**to initialize the table including the paging**/			
			function _reInitializeTable(useThisRequest){	
			 	  var request = useThisRequest ? useThisRequest : initialRequestLine+_getCriteria();	
				   var callback1 = { 
				            success : function(a,b,c){									
									myDataTable.onDataReturnInitializeTable(a,b,c);									
							}, 
				            failure : myDataTable.onDataReturnInitializeTable, 
			  	              scope : myDataTable 
				  };
				  per_page = DEFAULT_ROWS_PER_PAGE;				  
				  if( _saveRowsPerPage==true){				  	 
				  	 per_page = myPaginator.getRowsPerPage();
				  	 request = request+"&show="+per_page+"&start="+0;
				  }	 
				  myPaginator.setStartIndex(0,true);				  
				  myPaginator.setRowsPerPage(per_page,true); 		 										  		  	
		          myDataSource.sendRequest(request, callback1); 
 		          

			}
			/**enables row highlighting**/			
			function _enableRowHighlighting(){
				myDataTable.subscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow); 
				myDataTable.subscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow); 
			}
			/*****disables row highlighting****/
			/**enables row highlighting**/			
			function _disableRowHighlighting(){
				myDataTable.unsubscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow); 
				myDataTable.unsubscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow); 
			}				
			return function(){
				this.yTable = function(){
					return myDataTable;
				},
				this.init = function(tbleDiv,pageDiv,initialReqLine,mySchema,myCols,dataSourceUrl,getCriteria,callAfterPaging,saveRowsPerPage){
					
					if(typeof mySchema !='object'){
						alert('ERROR: invalid schema object\nHint:Provide an object that describes your schema structure');
						return;	
					}
					if(typeof myCols !='object'){
						alert('ERROR: invalid column def object\nHint:Provide an array of object that describes your column structure');
						return;	
					}
					_saveRowsPerPage = saveRowsPerPage;					
					mySchemaDef      = mySchema;		
					myColumnDefs     = myCols;	
					_dataSourceUrl   = dataSourceUrl;
					_getCriteria     = getCriteria;
					_callAfterPaging =callAfterPaging;
					setupTable(tbleDiv,pageDiv,initialReqLine);
					
				}
				,
				this.reInitializeTable  = function(newRequestUrlWithPostParam){										
					_reInitializeTable(newRequestUrlWithPostParam);
				},
				this.setRowHighlighting = function(bool){
					bool ? _enableRowHighlighting() : _disableRowHighlighting();
				},
				this.update = function(record,oData,sKey/**optional**/){
					if(sKey){
						myDataTable.getRecordSet().updateRecordValue(record,sKey,oData);
					}
					else{						
						myDataTable.getRecordSet().updateRecord(record,oData);  	
					}	
				},
				this.destroy = function(){
					if(myDataTable)	myDataTable.destroy();
					if(myPaginator)	myPaginator.destroy();
				},
				this.hide = function(){
					$D.setStyle(tableDiv,'display','none');
					$D.setStyle(pagingDiv,'display','none');
					_state = false;					
				},
				this.show = function(){
					$D.setStyle(tableDiv,'display','block');
					$D.setStyle(pagingDiv,'display','block');
					_state = true;					
					
				},
				this.toggle = function(){
					if(_state===true){
						this.hide();
					}
					else if(_state==false){
						this.show();
					}
				}
				

			}
		
	})();
	
	/*************************************************VERSION 2***********************************************/
		TERRACOR.YUICellFormatter2=(function(){
			var CHECK_ICON    = "<input type='checkbox' checked>";
			var UNCHECK_ICON  = "<input type='checkbox' >";
			
			return {	
				delete_button :  function (elCell, oRecord, oColumn, oData){				
					elCell.innerHTML = "<input type=button value='Delete'>";
				},
				edit_button : function (elCell, oRecord, oColumn, oData){				
					elCell.innerHTML = "<input type=button value='Edit'>";
				},
				toggle_button : function(config){
						return function(config){
							var cfg = config;					
							this.toogle = function(elCell, oRecord, oColumn, oData){										
						
								if(cfg.CHECK_KEY ){
									var key = cfg.CHECK_KEY;
									var value = cfg.CHECK_VALUE || undefined;							
									if(key.length && value==undefined){
										if( oRecord.getData(cfg.CHECK_KEY)){				
											elCell.innerHTML = CHECK_ICON;
										}	
										else{
											elCell.innerHTML = UNCHECK_ICON;													
										}	
									}
									else if(key.length && value!==undefined){
										if(oRecord.getData(cfg.CHECK_KEY) && oRecord.getData(cfg.CHECK_KEY).value==value){
											elCell.innerHTML = CHECK_ICON;
										}
										else{																	
											elCell.innerHTML = UNCHECK_ICON;
										}	
									}
								}
			
								else if(products[oRecord.getData().PartNum+oRecord.getData().WarehouseID])
									elCell.innerHTML = CHECK_ICON;				
								else				
									elCell.innerHTML = UNCHECK_ICON;												
							}
					}	
			   }()	
			}	
		})();	
	  	TERRACOR.YUITable2 = (function(){
		  	var myDataTable;
			var myColumnDefs;
		  	var myDataSource;
		  	var myPaginator;
		  	var myConfig;
		  	var initialRequestLine = '';
		  	var currentQueryString = '';
		  	var pagingDiv          = 'paging';
		  	var tableDiv           = 'yuitable';
		  	var mySchemaDef		   = null;
		  	var _dataSourceUrl     = '';
		  	var _getCriteria       = null; //function
		  	var _callAfterPaging   = function(){};
		  	var _state             = true;//true=visible ; false = hidden 
		  	
		  	var CONST_TOGLLER_FUNCTION_NAME = 'toggler';
		  	/**init pagination**/
			function setupMyPaging(){
				myPaginator = new YAHOO.widget.Paginator({
				    containers         : [pagingDiv],
				    pageLinks          : 5,
				    rowsPerPage        : 15,
				    rowsPerPageOptions : [2,15,30,60,100],
				    template           : "<strong>{CurrentPageReport}</strong> {PreviousPageLink} {PageLinks} {NextPageLink} {RowsPerPageDropdown}"
				});
				return myPaginator;
			}	
			/**data source configuration**/
			function setupMyDatasource(){	
				myDataSource = new YAHOO.util.DataSource(_dataSourceUrl);
				myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
				myDataSource.connMethodPost = true; 
				myDataSource.responseSchema = mySchemaDef;
				return myDataSource;
			}
			/**return my table configuration**/
			function setupMyTableConfig(){
				myConfig = { 
				    initialRequest         : initialRequestLine, 
			    	generateRequest        : buildMyQueryString, 
			    	paginator              : setupMyPaging(), 
			    	paginationEventHandler : YAHOO.widget.DataTable.handleDataSourcePagination 
				};
				return myConfig;
			}
			/***builds the request line needed for page navigation**/
			function buildMyQueryString(state,dt){
			    currentQueryString =	"&start=" + state.pagination.recordOffset + 
			           					"&show=" + state.pagination.rowsPerPage; 
				if(typeof _getCriteria=='function') currentQueryString+=  _getCriteria();    			
			    return currentQueryString;
			}
			/**init yui data table**/
			function setupTable(tbleDiv,pageDiv,initialReqLine){
				initialRequestLine = initialReqLine;
				pagingDiv          = pageDiv;
				tableDiv           = tbleDiv;
				myDataTable = new YAHOO.widget.DataTable(tableDiv, myColumnDefs,setupMyDatasource(),setupMyTableConfig() );
				subscribeClickEvent();
			}
			/**subscribe events**/
			function subscribeClickEvent(){
				myDataTable.subscribe('cellClickEvent', function(ev) {
				    var target = YAHOO.util.Event.getTarget(ev);
				    var _column = myDataTable.getColumn(target);	
				    var _record = myDataTable.getRecord(target);
					//alert(target);										    
				    if(typeof _column.clickFunction=='function'){										    	
				    	if(typeof _column.formatter=='function' && _column.formatter.name==CONST_TOGLLER_FUNCTION_NAME){
							var cell = myDataTable.getTdEl({record:_record,column:_column});
							var div = YAHOO.util.Dom.getFirstChild(cell);
							var checkbox = YAHOO.util.Dom.getFirstChild(div);							
							_column.clickFunction(_record,cell,checkbox);
						}
						else{			    	
							_column.clickFunction(_record,myDataTable.getTdEl({record:_record,column:_column}));
						}
							
					}
				});							
			}
			/**to initialize the table including the paging**/			
			function _reInitializeTable(useThisRequest){	
			 	  var request = useThisRequest ? useThisRequest : initialRequestLine+_getCriteria();	
				   var callback1 = { 
				            success : function(a,b,c){									
								myDataTable.onDataReturnInitializeTable(a,b,c);									
							}, 
				            failure : myDataTable.onDataReturnInitializeTable, 
			  	              scope : myDataTable 
				  };				 
				  		  	
		          myDataSource.sendRequest(request, callback1); 
				  myPaginator.setStartIndex(0,true);				 						
			}
			/**enables row highlighting**/			
			function _enableRowHighlighting(){
				myDataTable.subscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow); 
				myDataTable.subscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow); 
			}
			/*****disables row highlighting****/
			/**enables row highlighting**/			
			function _disableRowHighlighting(){
				myDataTable.unsubscribe("rowMouseoverEvent", myDataTable.onEventHighlightRow); 
				myDataTable.unsubscribe("rowMouseoutEvent", myDataTable.onEventUnhighlightRow); 
			}				
			return function(){
				this.yTable = function(){
					return myDataTable;
				},
				this.init = function(tbleDiv,pageDiv,initialReqLine,mySchema,myCols,dataSourceUrl,getCriteria,callAfterPaging){
					
					if(typeof mySchema !='object'){
						alert('ERROR: invalid schema object\nHint:Provide an object that describes your schema structure');
						return;	
					}
					if(typeof myCols !='object'){
						alert('ERROR: invalid column def object\nHint:Provide an array of object that describes your column structure');
						return;	
					}					
					mySchemaDef      = mySchema;		
					myColumnDefs     = myCols;	
					_dataSourceUrl   = dataSourceUrl;
					_getCriteria     = getCriteria;
					_callAfterPaging =callAfterPaging;
					setupTable(tbleDiv,pageDiv,initialReqLine);
					
				}
				,
				this.reInitializeTable  = function(newRequestUrlWithPostParam){										
					_reInitializeTable(newRequestUrlWithPostParam);
				},
				this.setRowHighlighting = function(bool){
					bool ? _enableRowHighlighting() : _disableRowHighlighting();
				},
				this.update = function(record,oData,sKey/**optional**/){
					if(sKey){
						myDataTable.getRecordSet().updateRecordValue(record,sKey,oData);
					}
					else{						
						myDataTable.getRecordSet().updateRecord(record,oData);  	
					}	
				},
				this.destroy = function(){
					if(myDataTable)	myDataTable.destroy();
					if(myPaginator)	myPaginator.destroy();
				},
				this.hide = function(){
					$D.setStyle(tableDiv,'display','none');
					$D.setStyle(pagingDiv,'display','none');
					_state = false;					
				},
				this.show = function(){
					$D.setStyle(tableDiv,'display','block');
					$D.setStyle(pagingDiv,'display','block');
					_state = true;					
					
				},
				this.toggle = function(){
					if(_state===true){
						this.hide();
					}
					else if(_state==false){
						this.show();
					}
				}, 
				
				this.add=function (){
					myDataTable.addRow();		
				}
				

			}
		
	})();