var livegrid = {
  
  sortAscendImg : '/images/datagrid/arrow_up.gif',
  sortDescendImg : '/images/datagrid/arrow_down.gif',
  gridAry : [],
	activeGridId : null,
	activePreviewId : null,
  numResults : 0,
  allCheckBoxesChecked : true,
	
  init       : function(id,url,perPage,total) {
	//$(id).style.width = Element.getDimensions('datagridtable-'+id).width +30+'px' 
	  this.gridAry[id] = new Rico.LiveGrid('datagridtable-'+id,perPage, total, url, {prefetchBuffer: true})
    ajaxEngine.registerAjaxObject( 'datagridtable-'+id+'_callback',new SearchRowsConfigurator(this.gridAry[id]))
  },
	reload : function(id,url,perPage,total) {
		this.gridAry[id] = new Rico.LiveGrid('datagridtable-'+id,perPage, total, url, {prefetchBuffer: true})
	},
  reset      : function(id) {
	$('datagrid_records_number').innerHTML = 'Loading...'
	 this.removeSortImages(id)
	 this.removeSortClass(id)
	 this.resetForm(id)
	 this.gridAry[id].options.requestParameters = ['reset=true']
   this.gridAry[id].resetContents()
   this.gridAry[id].requestContentRefresh(0)
  },
  filter     : function(id,paramAry) {
		$('datagrid_records_number').innerHTML = 'Loading...'
	  this.removeSortImages(id)
		this.removeSortClass(id)
		if (paramAry) {
			var params = this.getParams(id).concat(paramAry);
		} else {
			var params = this.getParams(id)
		}
    this.gridAry[id].options.requestParameters = params
    this.gridAry[id].resetContents()
    this.gridAry[id].requestContentRefresh(0)
  },
  sort      : function(id,field) {
		if (typeof lumD != "undefined") {
      var pAry = this.getParams(id).concat(lumD.requestParams());
		} else {
		  var pAry = this.getParams(id)
	  }
		var dir  = this.getSortImageDir(id,field)
		
	  this.removeSortImages(id)
		this.removeSortClass(id)
	  pAry.push('sort_col='+field)
	  pAry.push('sort_dir='+dir)

	  Element.addClassName($('sort_by_'+field).parentNode,'sorted_by')
    new Insertion.After('sort_by_'+field,this.sortImage(dir))
    this.gridAry[id].options.requestParameters = pAry
    this.gridAry[id].resetContents()
    this.gridAry[id].requestContentRefresh(0)
  },
  getParams : function(id) {
	var form = $(id).getElementsByTagName('form')[0]
	var fAry = Form.getElements(form)
	var pAry = Array()
	for(var i=0;i<fAry.length;i++) {
	  if (fAry[i].name.match(/searches\[([a-z_0-9]*)\]/)) {
	    pAry.push('search_'+RegExp.$1+'='+$F(fAry[i]))
	  } else if(fAry[i].name.match(/filters\[([a-z_0-9]*)\]/)) {
		pAry.push('filter_'+RegExp.$1+'='+$F(fAry[i]))
	  }
	}
	return pAry
  },
	addSortAssets : function(datagrid,field) {
		Element.addClassName($('sort_by_'+field).parentNode,'sorted_by')
    new Insertion.After('sort_by_'+field,livegrid.sortImage(livegrid.getSortImageDir(datagrid,field)))
	},
  sortImage : function(dir) {
		imageClass = "class='sortImage'"
    return dir == 'ASC'? "<img src=\""+this.sortAscendImg+"\" " + imageClass +"/>" : "<img src=\""+this.sortDescendImg+"\" + imageClass +/>"
  },
  removeSortImages : function(id) {
    var imgs = $(id).getElementsByTagName('img')
	for(var i=0;i<imgs.length;i++){
	  if (imgs[i].src.indexOf(this.sortAscendImg) > -1 || imgs[i].src.indexOf(this.sortDescendImg) > -1) {
	    Element.remove(imgs[i])
		--i
	  }
	}
  },
	removeSortClass : function(id) {
		var sortFields = $(id).getElementsByTagName('th')
		for(var i=0;i<sortFields.length;i++){
			 Element.removeClassName(sortFields[i],'sorted_by')
		}
	},
  getSortImageDir  : function(id,field) {
    var imgs = $('sort_by_'+field).parentNode.getElementsByTagName('img')
		var img;
		for(var i =0;i<imgs.length;i++) {
		  if (Element.hasClassName(imgs[i],'sortImage')) {
				img = imgs[i];
			}
		}
		//alert(img);
	if (img && img.src.indexOf(this.sortAscendImg) > -1){
	  return 'DESC'
	} else {
      return 'ASC'
	}
  },
  resetForm      : function(id) {
	  $(id).getElementsByTagName('form')[0].reset()
  },
  toggleClass    : function(row) {
	var tds = row.getElementsByTagName('td')
	for(var i=0;i<tds.length;i++) {
      if (tds[i].className == 'highlighted') {
	    Element.removeClassName(tds[i],'highlighted')
	  } else {
	    Element.addClassName(tds[i],'highlighted')	
	  }
	}
  },
  dataView      : function(view,row) {
	 window.location = view+'/'+ this.currentRowId(row)
  },
	currentRowId  :function(row) {
		var lastCell = row.getElementsByTagName('td')[row.getElementsByTagName('td').length-1]
	  return lastCell.getElementsByTagName('span')[0].id.stripNum()
	},
	destroy       : function(id,row,url) {
		if (!confirm('Are you sure?')) return false
		this.activeGridId = id
		url = url+'/'+this.currentRowId(row.parentNode.parentNode.parentNode)
		new Ajax.Request(url,{
			method : "post",
		  onComplete : function(request) {
				livegrid.reset(livegrid.activeGridId)
			}
		})
	},
	positionBelow : function(datagrid,container) {
	  livegrid._positionBelow(datagrid,container);
		//Assume this is the only datagrid on the page
		this.activeGridId = datagrid
		this.activePreviewId = container
	  Event.observe(window, 'resize', function() {
       livegrid._positionBelow(livegrid.activeGridId,livegrid.activePreviewId);
    });
	},
	_positionBelow : function(datagrid,container) {
		//Align directly under datagrid. 
		var datagridTable = $(datagrid).getElementsByTagName('table')[1]
		$(container).style.left = parseInt(Position.positionedOffset($(datagridTable))[0]) + 'px'
		$(container).style.top = parseInt(Position.positionedOffset($(datagridTable))[1]) + 
		                         parseInt(Element.getDimensions(datagridTable).height) + 'px'
	},
	loadingPreview : false,
	previewPanes : [],
	loadPreview : function(rowID,url) {
			 if (this.loadingPreview) {return false;}
			 var row = rowID;
			 this.removeCurrentRowClass();
			 Element.addClassName(row,'current_row');
			 $('sprout_preview').innerHTML = ''
			 this.notice('Loading...')
			 if (this.previewPanes[livegrid.currentRowId(row)]) {
				 $('sprout_preview').innerHTML = this.previewPanes[livegrid.currentRowId(row)];
				 this.loadingPreview = false;
				 $('sprout_notice').style.visibility = 'hidden'
			 } else {
				 this.loadingPreview = true;
				 new Ajax.Request(url + livegrid.currentRowId(row),{method :"post"})
			 }
			 Element.show('sprout_preview');
	},
	notice      : function(text) {
		$('sprout_notice').innerHTML = text
		$('sprout_notice').style.visibility = ''
	},
	clearNotice : function() {
		$('sprout_notice').innerHTML = ''
		$('sprout_notice').style.visibility = 'hidden'
	},
	removeCurrentRowClass : function() {
			var tId = 'datagridtable-datagrid'
		 var rows = $(tId).getElementsByTagName('tr');
		 for(var i=0;i<rows.length;i++) {
				  Element.removeClassName(rows[i],'current_row');
		 };
	},
	checkedRows : function() {
		return livegrid.currentCheckBoxIds.compact();
		
		var tId = 'datagridtable-datagrid'
		var checkedIds = []
	  var checkboxes = $(tId).getElementsByTagName('input') 
		for(var i=0;i<checkboxes.length;i++) {
			if (checkboxes[i].checked) {
				checkedIds.push(checkboxes[i].value)
			}
		}
		return checkedIds;
	},
	
	/* Checkbox methods assume there is only one livegrid on the page and it has the default name */
	
	onClickForCheckBox : function(e,id) {
	  var el = Event.element(e);
    Event.stop(e);
	  setTimeout('livegrid.onClickTimeout(\''+el.id+'\',\''+id+'\')',50);
  },
  onClickTimeout : function(cid,id) {
		livegrid.updateCheckBoxes(id); 
		//alert(livegrid.currentCheckBoxIds);
		//alert(livegrid.checkedRows())
		if (!$(cid).checked) { 
		  livegrid.allCheckBoxesChecked = false;
		  if (typeof lumD != "undefined") lumD.addCompareDiamond(id);
		}
		else { 
		  if (typeof lumD != "undefined") lumD.removeCompareDiamond(id);
		}
    $(cid).checked = !$(cid).checked; 
	},
	clearCheckBoxes : function() {
	  var tId = 'datagridtable-datagrid'
		livegrid.allCheckBoxesChecked = false
	  var checkboxes = $(tId).getElementsByTagName('input') 
		for(var i=0;i<checkboxes.length;i++) {
			checkboxes[i].checked = false;
		}
	},
	checkAllCheckBoxes : function() {
		var tId = 'datagridtable-datagrid'
		livegrid.allCheckBoxesChecked = true
	  var checkboxes = $(tId).getElementsByTagName('input') 
		for(var i=0;i<checkboxes.length;i++) {
			checkboxes[i].checked = true;
		}
	},
	changeNumResults : function(num) {
		if ($('datagrid_records_number')) {
		 $('datagrid_records_number').innerHTML = 'SEARCH RESULTS: <span class="yellow">' + num + '</span> DIAMONDS'
		}
	},
	toggleAllCheckBoxes : function(el) {
	  if (el.checked) {
			livegrid.checkAllCheckBoxes();
			livegrid.currentCheckBoxIds = livegrid.allCheckBoxIds
			livegrid.updateAllInBuffer(true);
		} else {
			livegrid.clearCheckBoxes();
			livegrid.currentCheckBoxIds = []
			livegrid.updateAllInBuffer(false);
		}
	},
	allCheckBoxIds : [], /*Every id returned in previous request*/
	currentCheckBoxIds : [],
	onUpdate : function(response) {
		//livegrid.allCheckBoxIds = response.split(',')
		//if (livegrid.allCheckBoxesChecked) {
		  //livegrid.currentCheckBoxIds = livegrid.allCheckBoxIds
		//}
	},
	statusKey    : 6,/*checkbox column*/
	
	enableCheckBox : function(buffer_row) {
		//alert('enabling checkbox')
		livegrid.gridAry['datagrid'].buffer.rows[buffer_row][this.statusKey] = livegrid.gridAry['datagrid'].buffer.rows[buffer_row][this.statusKey].replace(/input\s/,'input checked="checked" ') 
	/*
	 var pattern = /cb_\d+/
		var result = livegrid.gridAry['datagrid'].buffer.rows[buffer_row][this.statusKey].match(pattern)
		if (result) {
		  var val = result.toString().replace('cb_','');
		  lumD.addCompareClass(val);
		}
		*/
		//alert(livegrid.gridAry['datagrid'].buffer.rows[buffer_row][this.statusKey]);
	},
	disableCheckBox : function(buffer_row) {
		livegrid.gridAry['datagrid'].buffer.rows[buffer_row][this.statusKey] = livegrid.gridAry['datagrid'].buffer.rows[buffer_row][this.statusKey].replace(/checked="checked"/g,'')  
	},
	/*updates buffer*/
  updateCheckBoxes   : function(id) {
		
     var pattern = new RegExp('value="'+id+'"')
     for(var i=0;i<livegrid.gridAry['datagrid'].buffer.rows.length;i++) {
       if (livegrid.gridAry['datagrid'].buffer.rows[i][this.statusKey].match(pattern)) {
         if (this.currentCheckBoxIds.indexOf(id) == -1) {
				   this.currentCheckBoxIds.push(id)
           livegrid.enableCheckBox(i);
         } else {
           livegrid.disableCheckBox(i);
           this.currentCheckBoxIds[this.currentCheckBoxIds.indexOf(id)] = null
         }
         break
		   }
     }
  },
	updateAllInBuffer : function(checked) {
     for(var i=0;i<livegrid.gridAry['datagrid'].buffer.rows.length;i++) {
				 if (checked) {
           livegrid.enableCheckBox(i);
         } else {
           livegrid.disableCheckBox(i);
         }
     }
	},
	autoUpdateAllInBuffer : function() {
		 var a = $A(this.currentCheckBoxIds);
		 var dg = livegrid.gridAry['datagrid'];
     for(var i=0;i<livegrid.gridAry['datagrid'].buffer.rows.length;i++) {
				 var pattern = /cb_\d+/
				 var result = livegrid.gridAry['datagrid'].buffer.rows[i][this.statusKey].match(pattern)
				 if (result) {
					   var val = result.toString().replace('cb_','');
						 if (a.indexOf(val) != -1) {
						
							 //$('diamond_debugger').innerHTML =  $('diamond_debugger').innerHTML + '<br/>' + 'Yes ' + val
							 livegrid.enableCheckBox(i);
							
						 } else {
							// $('diamond_debugger').innerHTML =  $('diamond_debugger').innerHTML + '<br/>' + 'No ' + val
							 livegrid.disableCheckBox(i);
						 }
						// livegrid.gridAry['datagrid'].viewPort.refreshContents(0,true);
				 }
     }
		
		 //livegrid.gridAry['datagrid'].viewPort.refreshContents(0,true);
		//livegrid.gridAry['datagrid'].viewPort.refreshContents(0,true);
	},
	//After datagrid update
	afterRowUpdate : function() {
		
		livegrid.autoUpdateAllInBuffer(); //wont' do anything without checkboxes
	},
	onScroll : function() {
		if ($('scroll_notifier')) {
	    var dg = FindXYWH($('datagridtable-datagrid'))
		  $('scroll_notifier').style.left =  500 + 'px';
		  $('scroll_notifier').style.top  =  200 + 'px';
			Element.show('scroll_notifier');
		}
	}
}

SearchRowsConfigurator = Class.create();

SearchRowsConfigurator.prototype = {

   initialize: function(liveGrid) {
     this.liveGrid = liveGrid;
   },

   ajaxUpdate: function(ajaxResponse) {
		  if ($('scroll_notifier')) {
				 Element.hide('scroll_notifier')
			}
		 	var debug = ajaxResponse.getElementsByTagName("debugger_output")[0];
			
			var reponse = (debug.text != undefined ? debug.text : debug.textContent);
			//livegrid.currentCheckBoxIds = [];
			if ($('debugger')) $('debugger').innerHTML = reponse;
			livegrid.onUpdate(reponse);
      var cell = ajaxResponse.getElementsByTagName("numresults")[0];
      var numResults = cell.text != undefined ? cell.text : cell.textContent;
			livegrid.numResults = numResults;
			//alert(numResults)
			if ($('datagrid_records_number')) {
			  livegrid.changeNumResults(livegrid.numResults);
		  }
      if ( this.liveGrid.metaData.getTotalRows() != numResults ) {
         this.liveGrid.metaData.setTotalRows(numResults);
         this.liveGrid.scroller.updateSize();
      }
			//alert(livegrid.currentCheckBoxIds);
			livegrid.gridAry['datagrid'].viewPort.refreshContents(0,true);
   }
};