var dg = {
	setup: function(datagrid) {
		if ($(datagrid+'_setup').get('value') != 'true') {
			$(datagrid+'_setup').set('value', 'true');

			if ($chk($(datagrid+'SearchBar'))) {
				var search_bar = $(datagrid+'SearchBar');

				search_bar.getElements('td.searchbar').each(function(el){
					if ($chk(el.getElement('select'))) {
						var select = el.getElement('select');
						select.addEvent('change', function(){
							dg.search(datagrid);
						});
						var size = el.getSize();
						el.getElement('select').set('style', 'width: '+(size.x-4)+'px !important; margin-left: 2px');
					} else {
						var numfields = el.getElements('input').length;
						for (var i=0; i < numfields; i++) {
							el.getElements('input')[i].addEvent('keyup', function(ev){
								if (ev.key == 'enter') {
									dg.search(datagrid);
								}
							});
							var size = el.getSize();
							el.getElements('input')[i].setStyles({
								width: size.x/(numfields) - 13,
								marginLeft: 2
							});
						}
					}
				});
			}
		}
	},
	
	clean_search: function(datagrid) {
		var search_bar = $(datagrid+'SearchBar');
		search_bar.getElements('input[type=text]').each(function(el){
			el.set('value');
		});
		search_bar.getElements('select').each(function(el){
			el.getElement('[selected]').set('selected', false);
			el.getElement('option').set('selected', 'selected');
		});
	},

	search: function (datagrid) {
		var element = $('datagrid_'+datagrid);
		var search_bar = $(datagrid+'SearchBar');
		var url = new URI(document.getElement('.datagridSearchUrl').get('value').replace(/\./g, 'DDOOTT'));
		var query = url.getData();

		// Search inputs
		var search_inputs = [];
		var x = 0;
		search_bar.getElements('td.searchbar').each(function(el, i){
			if ($chk(el.getElement('input')))
				var input = el.getElement('input');
			if ($chk(el.getElement('select')))
				var input = el.getElement('select');
			
			var search_input = {};
			search_input.field = input.get('field');
			search_input.value = input.get('real_value') ? input.get('real_value') : input.get('value');
			search_input.datatype = input.get('datatype');
			search_inputs[x++] = search_input;
			if (search_input.datatype == 'date') {
				var input_ = el.getElement('input[id^=search_max]');
				var search_input_ = {};
				search_input_.field = input_.get('field');
				search_input_.value = input_.get('real_value') ? input_.get('real_value') : input_.get('value');
				search_input_.datatype = input_.get('datatype');
				search_inputs[x++] = search_input_;
			}
		});
		
		for (x = 0; x < search_inputs.length; x++) {
			var data = search_inputs[x];

			if ( ! $chk(eval('query.'+datagrid)))
					eval('query.'+datagrid+' = {}');
			
			if (data.value) {
				data.field = data.field.replace(/\./g, 'DDOOTT');
				eval('query.'+datagrid+'.'+data.field+' = \''+data.value+'\'');
				eval('query.'+datagrid+'.type_'+data.field+' = \''+data.datatype+'\'');
				
			} else {
				data.field = data.field.replace(/\./g, 'DDOOTT');
				if ($chk(eval('query.'+datagrid+'.'+data.field)))
					eval('delete query.'+datagrid+'.'+data.field);
			}
			
			if ($chk(eval('query.'+datagrid+'.page')))
				eval('delete query.'+datagrid+'.page');
			if ($chk(eval('query.'+datagrid+'.offset')))
				eval('delete query.'+datagrid+'.offset');
		}

		url.setData(query);
		url = url.toString().replace(/DDOOTT/g, '.');

		dg.datagrid_send(url, datagrid, element);
	},

	datagrid_send: function(url, datagrid, element) {
		document.getElement('.datagridSearchUrl').set('value', url);
		
		var size = $('datagrid_'+datagrid).getElement('tbody').getSize();
		var pos = $('datagrid_'+datagrid).getElement('tbody').getPosition();
		var loader = new Element('div').set('id', datagrid+'_loader').addClass('datagrid loader').inject(document.body);
		loader.setStyles({
			marginLeft: 1,
			marginTop: 1,
			left: pos.x,
			top: pos.y
		});

		var holder = new Element('div').set('id', 'dataHolder').inject(document.body);
		if ($chk(searchRequest)) {
			searchRequest.cancel();
		}
		var searchRequest = new Request.HTML({
			url: url,
			onSuccess: function(tree, elements, data) {
				holder.set('html', data);
				holder.getElement('table[id=datagrid_'+datagrid+']').getElement('thead').getElement('tr').replaces(element.getElement('thead').getElement('tr'));
				holder.getElement('table[id=datagrid_'+datagrid+']').getElement('tbody').replaces(element.getElement('tbody'));
				holder.getElement('table[id=datagrid_'+datagrid+']').getElement('tfoot').replaces(element.getElement('tfoot'));
				holder.dispose();
				var size = $('datagrid_'+datagrid).getElement('tbody').getSize();
				loader.setStyles({
					width: size.x-1,
					height: size.y-1
				})
				loader.fade('out');
				(function(){loader.dispose()}).delay(300);
			}
		}).send();
	},

	go_page: function(datagrid, page, limit) {
		var element = $('datagrid_'+datagrid);
		var url = new URI(document.getElement('.datagridSearchUrl').get('value'));
		var query = url.getData();

		if ( ! $chk(eval('query.'+datagrid)))
			eval('query.'+datagrid+' = {}');

		eval('query.'+datagrid+'.limit = '+limit);
		eval('query.'+datagrid+'.offset = '+(limit*page));
		eval('query.'+datagrid+'.page = '+(page+1));

		url.setData(query);
		url = url.toString();

		if (element) {
			dg.datagrid_send(url, datagrid, element);
		} else {
			location.href = url;
		}
	},
	
	changelimit: function(datagrid, limit) {
		var element = $('datagrid_'+datagrid);
		var url = new URI(document.getElement('.datagridSearchUrl').get('value'));
		var query = url.getData();

		if ( ! $chk(eval('query.'+datagrid)))
			eval('query.'+datagrid+' = {}');

		eval('query.'+datagrid+'.limit = '+limit);
		eval('query.'+datagrid+'.offset = 0');
		eval('query.'+datagrid+'.page = 1');

		url.setData(query);
		url = url.toString();

		dg.datagrid_send(url, datagrid, element);
	},

	order: function(datagrid, field, ord) {
		if (!ord) ord = 'ASC';
		
		var element = $('datagrid_'+datagrid);
		var url = new URI(document.getElement('.datagridSearchUrl').get('value'));
		var query = url.getData();
		
		if ( ! $chk(eval('query.'+datagrid)))
			eval('query.'+datagrid+' = {}');
			
		eval('query.'+datagrid+'.order = \''+field+' '+ord+'\'');
		
		if ($chk(eval('query.'+datagrid+'.page')))
			eval('delete query.'+datagrid+'.page');
		if ($chk(eval('query.'+datagrid+'.offset')))
			eval('delete query.'+datagrid+'.offset');
		
		url.setData(query);
		url = url.toString();
		
		dg.datagrid_send(url, datagrid, element);
	}
};
