// Author: Marko Šantić
// Web: http://www.omnisdata.com/omnigrid
// Email: marko@omnisdata.com
// Company: Omnisdata Ltd.
// Licence: MIT licence
// Required: Mootools 1.3
// Version: OmniGrid 1.2.6
// ****************************************************************************

/**
 * Modified by PCSG - Henning - Moritz
 */

var omniGrid = new Class({

	Implements: [Events,Options],

	getOptions : function()
	{
		return {
			alternaterows : true,
			showHeader    : true,
			sortHeader    : false,
			resizeColumns : true,
			selectable    : true,
			serverSort    : true,
			sortOn        : null,
			sortBy        : 'ASC',
			filterHide    : true,
			filterHideCls : 'hide',

			filterSelectedCls : 'filter',
			multipleSelection : true,
			editable          : false, // Grid.addEvent('editcomplete', function(data)
			editondblclick    : false,
			editType          : 'input', // textarea | input
			resizeHeaderOnly  : false,

			// accordion
			accordion             : false,
			openAccordionOnClick  : true,
			accordionRenderer     : null,
			accordionLiveRenderer : null,
			autoSectionToggle     : true, // if true just one section can be open/visible
			showtoggleicon        : true,
			toggleiconTitle       : 'Details',
			openAccordionOnDblClick:false,

			// pagination
			url        : null,
			pagination : false,
			page       : 1,
			perPageOptions: [5,10, 20, 50, 75, 100, 150, 200, 250, 500],
			perPage     : 20,
			filterInput : false,
			// dataProvider
			dataProvider : null,

			//export
			exportData  : false,
			exportTypes : {pdf : 'PDF', csv : 'CSV', json : 'JSON'}, // {print : 'Drucken', pdf : 'PDF', csv : 'CSV', json : 'JSON'},
			exportRenderer : null, // function(data){data.type data.data data.Grid}
			exportBinUrl   : URL_BIN_DIR + 'js/extern/omnigrid1.2.3/omnigrid/'
		};
	},

	initialize : function(container, options)
	{
		var t = this;
		t.setOptions(t.getOptions(), options);
		t.container = $(container);

		if (!t.container) {
			return;
		};

		//instanz name für element ids
		 if (typeof t.options.name == 'undefined') {
  			t.options.name = new Date().getMilliseconds();
 		};

		t.draw();
		t.reset();
		t.loadData();
	},

	// API
	reset : function()
	{
		var t = this;
		var o = t.options;

		t.renderData();

		t.refreshDelayID = null;
		t.dragging       = false;
		t.selected       = [];


		t.elements = t.ulBody.getElements('li');

		t.filtered    = false;
		t.lastsection = null;

		if (o.alternaterows) {
			t.altRow();
		};

		t.elements.each(function(el, i)
		{
			var data = o.data[i];

			if (data.onclick)
			{
				el.addEvent('click', function(evt)
				{
					if (typeof data.onclick == 'string')
					{
						if (!eval(data.onclick +'(el, data, evt);')) {
							return;
						};
					};

					data.onclick(el, data, evt);
				}.bind(this));

			} else
			{
				el.addEvent('click', t.onRowClick.bind(this));
			};

			if (data.ondblclick)
			{
				el.ondblclick = function()
				{
					if (typeof data.ondblclick == 'string')
					{
						if (!eval(data.ondblclick +'(el, data);')) {
							return;
						};
					};

					data.ondblclick(el, data);
				};
			} else {
				el.addEvent('dblclick',  t.onRowDblClick.bind(this));
			};

			el.addEvent('mouseover', t.onRowMouseOver.bind(this));
			el.addEvent('mouseout',  t.onRowMouseOut.bind(this));
		}, t);

		// Setup header
		t.container.getElements('.th').each(function(el, i)
		{
			//alert(el.dataType);
			var dataType = el.retrieve('dataType');

			if (dataType)
			{
				el.getdate = function(str)
				{
					function fixYear(yr)
					{
						yr = +yr;

						if (yr < 50)
						{
							yr += 2000;
						} else if (yr<100)
						{
							yr += 1900;
						};

						return yr;
					};

					var ret;

					if (str.length>12)
					{
						strtime = str.substring(str.lastIndexOf(' ')+1);
						strtime = strtime.substring(0,2)+strtime.substr(-2)
					} else
					{
						strtime = '0000';
					};

					// YYYY-MM-DD
					if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
						return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]) + strtime;
					};

					// DD/MM/YY[YY] or DD-MM-YY[YY]
					if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
						return (fixYear(ret[3])*10000) + (ret[2]*100) + (+ret[1]) + strtime;
					};

					return 999999990000; // So non-parsed dates will be last, not first
				};

				el.findData = function(elem)
				{
					var child = elem.getFirst();

					if (child) {
						return el.findData(child);
					};

					return elem.innerHTML.trim();
				};

				el.stripHTML = function(str)
				{
					var tmp = str.replace(/(<.*['"])([^'"]*)(['"]>)/g,

					function(x, p1, p2, p3) { return  p1 + p3;}

					);

					return tmp.replace(/<\/?[^>]+>/gi, '');
				};

				el.compare = function(a, b)
				{
					// a i b su LI elementi
					var var1 = a.getChildren()[i].innerHTML.trim();
					var var2 = b.getChildren()[i].innerHTML.trim();



					if (dataType == 'number' || dataType == 'integer' || dataType == 'int')
					{

						var1 = parseFloat(el.stripHTML(var1));
						var2 = parseFloat(el.stripHTML(var2));

						if (el.sortBy == 'ASC') {
							return var1-var2;
						};

						return var2-var1;
					};

					if (dataType == 'string')
					{
						var1 = var1.toUpperCase();
						var2 = var2.toUpperCase();

						if (var1 == var2) {
							return 0
						};

						if (el.sortBy == 'ASC' && var1 < var2) {
							return -1
						};
						/*
						if (var1 > var2) {
							//return -1
						};
						*/
						return 1;
					};

					if (dataType == 'date')
					{
						var1 = parseFloat(el.getdate(var1));
						var2 = parseFloat(el.getdate(var2));

						if (el.sortBy == 'ASC') {
							return var1-var2;
						};

						return var2-var1;
					};

					if (dataType == 'currency')
					{
						var1 = parseFloat(var1.substr(1).replace(',',''));
						var2 = parseFloat(var2.substr(1).replace(',',''));

						if (el.sortBy == 'ASC'){
							return var1-var2;
						};

						return var2-var1;
					};
				};
			};

		}, t);

		t.altRow();
	},

	// API
	// pretvara zadanu columnu u inline edit mode
	// options = {
	//		dataIndex:Number - column name || columnIndex:Number - column index
	//}
	edit: function(options)
	{
		var t    = this;
		var o    = t.options;
		var sels = t.getSelectedIndices();

		if (!sels || sels.length==0 || !o.editable) {
			return;
		};

		if (options.li)
		{
			var li = options.li;
		} else {
			var li = t.elements[ sels[0] ];
		};

		t.finishEditing();

		// nadi index u columnModel
		var c = options.columnIndex ? options.columnIndex : 0;
		var colmod;
		if (options.dataIndex)
		{
			for (; c < o.columnModel.length; c++)
			{
				colmod = o.columnModel[c];

				if (colmod.hidden) {
						continue;
				};
				//console.log(colmod.dataIndex+" "+options.dataIndex);
				if ( colmod.dataIndex == options.dataIndex ) {
					break;
				};
			};
		};

		if (c == o.columnModel.length) {
			return;
		};

		colmod = o.columnModel[c];

		if (!colmod.editable) {
			return;
		};

		var td       = li.getElements('div.td')[c];
		var data     = o.data[ sels[0] ];
		var width    = td.getStyle('width').toInt()-5;
		var height   = 15;
		var html     = data[colmod.dataIndex];
		var editType = colmod.editType ? colmod.editType : o.editType;

		td.innerHTML = '';

		var input = new Element(editType, {style:"width: " + width + "px; height: auto;", value: html} );

		input.addClass('inline');
		input.addEvent("keyup", t.finishEditing.bind(this) );
		input.addEvent("blur", t.finishEditing.bind(this) );
		input.addEvent("dblclick", t.finishEditing.bind(this) );
		input.setAttribute('title', 'Doppelklick oder Enter um die änderungen zu übernehmen');

		if (o.editType == 'textarea') {
			input.setAttribute('title', 'Doppelklick mit der linken Maustaste um die änderungen zu übernehmen');
		};

		input.inject(td);
		input.focus();

		t.inlineEditSafe = {row:sels[0], columnModel: colmod, td:td, input:input, oldvalue: html};
		t.inlineeditmode = true;

		return t.inlineEditSafe;
	},

	finishEditing: function(evt)
	{
		var t = this;
		var o = t.options;

		if (!t.inlineeditmode) {
			return;
		};

		if ( evt && evt.type == "keyup" && evt.key != 'enter' && evt.key != 'esc' && evt.type != 'dblclick') {
			return;
		};

		var row    = t.inlineEditSafe.row;
		var data   = t.options.data[ row ];
		var colmod = t.inlineEditSafe.columnModel;
		var td     = t.inlineEditSafe.td;
		var editType = colmod.editType ? colmod.editType : o.editType;

		if ( editType == 'textarea' && evt &&  evt.key != 'esc' && evt.type != 'dblclick') {
			return;
		};

		t.inlineeditmode = false;

		if (editType == 'input') {
			data[colmod.dataIndex] = ( evt && ( (evt.type == 'keyup' && evt.key == 'enter' ) || (evt.type == 'dblclick')) ) ? t.inlineEditSafe.input.value : t.inlineEditSafe.oldvalue;
		};

		if (editType == 'textarea') {
			data[colmod.dataIndex] = ( evt  && evt.type == 'dblclick') ? t.inlineEditSafe.input.value : t.inlineEditSafe.oldvalue;
		};

		td.innerHTML = colmod.labelFunction ? colmod.labelFunction(data, row, colmod) : data[colmod.dataIndex];

		if (td.innerHTML.length == 0) {
			td.innerHTML = '&nbsp;';
		};

		if ( evt && evt.type == 'keyup' && evt.key == 'enter' && t.inlineEditSafe.oldvalue != td.innerHTML )
		{
			t.inlineEditSafe.target = t;

			t.fireEvent("editcomplete", t.inlineEditSafe);
		};

		t.inlineEditSafe = null;
	},

	toggle : function(el)
	{
		if (el.style.display == 'block')
		{
			el.style.display = 'none';
			return;
		};

		el.style.display = 'block';
	},

	// API
	getSection : function(row)
	{
		return this.ulBody.getElement('.section-'+row);
	},

	// API
	removeSections : function()
	{
		var t        = this;
		var sections = t.ulBody.getElements('.section');
		var o        = t.options;

		if (o.showtoggleicon) {
			t.ulBody.getElements('.toggleicon').setStyle('background-position', '0 0');
		};

		for (var i = 0; i < sections.length; i++) {
			t.ulBody.removeChild( sections[i] );
		};
	},

	getLiParent: function (target)
	{
		target = $(target);

		while ( target && !target.hasClass('td') ){
			target = target.getParent();
		};

		if (target){
			return target.getParent();
		};
	},

	getTdParent: function (target)
	{
		target = $(target);

		while ( target && !target.hasClass('td') ){
			target = target.getParent();
		};

		if (target){
			return target;
		};
	},

	onRowMouseOver : function (evt)
	{
		var li = this.getLiParent(evt.target);

		if (!li) {
			return;
		};

		if (!this.dragging) {
			li.addClass('over');
		};

		if (!evt.target || typeof evt.target.getParent != 'function') {
			return;
		};

		this.fireEvent("mouseover", {
			target  : this,
			row     : li.retrieve('row'),
			element : li
		});
	},

	onRowMouseOut : function (evt)
	{
		var li = this.getLiParent(evt.target);

		if (!li) {
			return;
		};

		if (!this.dragging) {
			li.removeClass('over');
		};

		if (!evt.target || typeof evt.target.getParent != 'function') {
			return;
		};

		this.fireEvent("mouseout", {
			target  : this,
			row     : li.retrieve('row'),
			element : li
		});
	},

	onRowClick : function (evt)
	{
		var t  = this;
		var o  = t.options;
		var li = this.getLiParent(evt.target);


		if (!li) {
			return;
		};

		if (o.selectable)
		{
			var currentindex = li.retrieve('row');
			var selectedNum = t.selected.length;
			var dontselect = false;

			if ((!evt.control && !evt.shift && !evt.meta) || !t.options.multipleSelection)
			{
				t.elements.each(function(el, i)
				{
					el.removeClass('selected')
				}, this);

				t.selected = [];
			};

			if (evt.control || evt.meta)
			{
				for (var i=0; i < selectedNum; i++)
				{
					if (currentindex == t.selected[i])
					{
						t.elements[ currentindex ].removeClass('selected');
						t.selected.splice(i, 1 );

						dontselect = true;
					};
				};
			};

			if (evt.shift && o.multipleSelection)
			{
				var si = 0;

				if (t.selected.length > 0) {
					si = t.selected[selectedNum-1];
				};

				var endindex = currentindex;

				startindex = Math.min(si, endindex);
				endindex   = Math.max(si, endindex);

				for (var i = startindex; i <= endindex; i++)
				{
					t.elements[i].addClass('selected');
					t.selected.push( Number(i) );
				};
			};

			if (!dontselect)
			{
				li.addClass('selected');
				t.selected.push( Number(li.retrieve('row')) );
			};

			t.unique(t.selected, true);
		};

		if (o.accordion && o.openAccordionOnClick && !o.openAccordionOnDblClick) {
			t.accordianOpen(li);
		};

		t.fireEvent("click", {
			indices : t.selected,
			target  : t,
			row     : li.retrieve('row'),
			element : li,
			cell    : t.getTdParent(evt.target)
		});
	},

	toggleIconClick: function(evt)
	{
		var li = this.getLiParent(evt.target);

		this.accordianOpen(li);
	},

	accordianOpen: function(li)
	{
		var t       = this;
		var o       = t.options;
		var section = t.getSection(li.retrieve('row'));

		if (o.accordionLiveRenderer && section == null)
		{
			var li2 = new Element('li');
			li2.addClass('section');
			li2.addClass('section-'+li.retrieve('row'));
			li2.setStyle('width', t.sumWidth+2*t.visibleColumns); // inace se Div-ovi wrapaju, a u IE nastaje cudan 1px border ispod LI el.

			oSibling = li.nextSibling;

			if (!oSibling)
			{
				t.ulBody.appendChild(li2);
			} else
			{
				oSibling.parentNode.insertBefore( li2, oSibling );
			};

			section = li2;
		};

		if (o.autoSectionToggle)
		{
			if (t.lastsection)
			{
				if (t.lastsection != section)
				{
					t.lastsection.setStyle('display', 'none');
					t.lastsection.getPrevious().getElement('.toggleicon').setStyle('background-position', '0 0');
				};
			};

			if (!o.accordionRenderer) {
				section.setStyle('display', 'block');
			};
		};


		if (o.accordionRenderer || o.accordionLiveRenderer) {
			t.toggle( section );
		};

		if (o.accordionLiveRenderer)
		{
			t.showLoader();
			o.accordionLiveRenderer({
				parent : section,
				row    : li.retrieve('row'),
				grid   : t
			});
			t.hideLoader();
		};

		if (o.showtoggleicon) {
			li.getElement('.toggleicon').setStyle('background-position', section.getStyle('display') == 'block' ? '-16px 0' : '0 0');
		};

		t.lastsection = section;
	},

	onRowDblClick : function (evt)
	{
		var t  = this;
		var o  = this.options;
		var li = this.getLiParent(evt.target);

		if (!li) {
			return;
		};

		var target = evt.target;

		if (o.editable && o.editondblclick && target.hasClass('td'))
		{
			var childs = li.getChildren();

			for(var i = 0; i < childs.length; i++)
			{
				if (childs[i] == target){
					break;
				};
			};

			var obj = t.edit({columnIndex:i, li : li});

			if (obj)
			{
				if (typeof obj.input.selectRange == 'function'){
					obj.input.selectRange(0, obj.input.value.length);
				};
			};
		};

		if (o.accordion && o.openAccordionOnDblClick) {
			t.accordianOpen(li);
		};

		t.fireEvent("dblclick", {
			row     : li.retrieve('row'),
			target  : this,
			element : li,
			cell    : t.getTdParent(evt.target)
		});
	},

	onLoadData : function (data)
	{
		this.setData(data);

		// API
		this.fireEvent("loaddata", {
			target : this
		//	pkey  : data.pkey // brauch man nicht ???
		});
	},

	unique: function(a, asNumber)
	{
		function om_sort_number(a, b) {
			return a - b;
		};

		var sf =  asNumber ? om_sort_number : function(){};

		a.sort( sf );

		for (var i = 1; i < a.length; i++)
		{
			if (a[i-1] == a[i])
			{
				a.splice(i, 1);
				i--;
			};
		};

		return a;
	},
	// API
	loadData : function (url)
	{
		var t = this;
		var o = this.options;
		var c = this.container;

		if (!o.url && !o.dataProvider) {
			return;
		};

		var data = {};

		// pagination
		if (o.pagination)
		{
			data = {
				page    : o.page,
				perpage : o.perPage
			};
		};

		// server sorting
		if (o.serverSort)
		{
			data.sorton = o.sortOn;
			data.sortby = o.sortBy;
		};

		if (o.filterInput)
		{
			var cfilter = c.getElement('input.cfilter');

			if (cfilter) {
				data.filter = cfilter.value;
			};
		};

		t.showLoader();

		if (o.dataProvider){
			// load data throw external class
			o.dataProvider.loadData(data);
			return;
		};

		var url = (url != null) ? url : o.url;

		var request = new Request.JSON({
			url  : url,
			data : param
		});

		request.addEvent("complete", this.onLoadData.bind(this));
		request.get();
	},

	// API
	refresh : function()
	{
		this.resetButtons();

		if (typeof this.options.onrefresh == 'function') {
			this.options.onrefresh(this);
		};

		this.loadData();
	},

	resetButtons : function()
	{
		if (!this.options.buttons || !this.options.buttons.length) {
			return;
		};

		var btns = this.options.buttons;
		var _Btn;

		for (var i = 0, len = btns.length; i < len; i++)
		{
			if (!btns[ btns[i].name ]) {
				continue;
			};

			_Btn = btns[ btns[i].name ];

			if (btns[i].disabled)
			{
				_Btn.setDisable();
				continue;
			};

			_Btn.setNormal();
		};
	},

	dataLoader : function()
	{
		this.options.page = 1;

		this.onLoadData({
			data    : {},
			total   : 0,
			page    : 1,
			perPage : 0
		});

		this.loadData();
	},

	// API
	setData : function(data, cm)
	{
		var t         = this;
		var options   = t.options;
		var container = t.container;

		if (!data) {
			return;
		};

		options.data  = data.data;

		if (!options.columnModel) {
			t.setAutoColumnModel();
		};

		if (options.pagination)
		{
			if (typeof data.total == 'undefined'){
				data.total = options.data.length;
			};
			if (typeof data.page == 'undefined'){
				data.page = 1;
			};

			options.page    = data.page * 1;
			options.total   = data.total;
			options.maxpage = Math.ceil(options.total/options.perPage);

			container.getElement('div.pDiv input').value = data.page;
			var to = (data.page * options.perPage) > data.total ? data.total : (data.page*options.perPage);

			container.getElement('div.pDiv .pPageStat').set('html', ((data.page-1)*options.perPage+1)+'..'+to+' / '+data.total);
			container.getElement('div.pDiv .pcontrol span').set('html', options.maxpage);
		};
		if (cm && options.columnModel != cm)
		{
			options.columnModel = cm;
			t.draw();
		};

		t.reset();
		t.hideLoader();
	},

	// API
	getData : function()
	{
		if (typeof this.options.data == 'undefined') {
			return [];
		};

		return this.options.data;
	},

	// API
	getDataByRow : function(row)
	{
		if (row >= 0 && row < this.options.data.length) {
			return this.options.data[row];
		};
	},

	// API
	setDataByRow : function(row, data)
	{
		if (row >=0 && row < this.options.data.length)
		{
			this.options.data[row] = data;
			this.reset();
		};
	},

	setScroll: function(x, y)
	{
		var bDiv = this.container.getElement('.bDiv');

		new Fx.Scroll(bDiv).set(x, y);
	},

	// API
	addRow: function(data, row)
	{
		if (typeof row == 'undefined')
		{
			if (typeof this.options.data == 'undefined')
			{
				row = 0;
			} else
			{
				row = this.options.data.length;
			};
		};

		if (row >=0)
		{
			if (typeof this.options.data == 'undefined' ||
				!this.options.data)
			{
				this.options.data = [];
			};

			this.options.data.splice(row, 0, data);
			this.reset();
		};
	},

	// API
	deleteRow : function(row)
	{
		if (row >=0 && row < this.options.data.length)
		{
			this.options.data.splice(row, 1);
			this.reset();
		};
	},

	isHidden : function(i)
	{
		return this.elements[i].hasClass(
			this.options.filterHideCls
		);
	},

	hideWhiteOverflow: function(i)
	{
		if (this.container.getElement('.gBlock')) {
			this.container.getElement('.gBlock').dispose();
		};

		var pReload = this.container.getElement('div.pDiv .pReload');

		if (pReload) {
			pReload.removeClass('loading');
		};
	},

	showWhiteOverflow: function(i)
	{
		var t = this;
		var o = t.options;
		var c = t.container;

		// white overflow & loader
		if (c.getElement('.gBlock')) {
			c.getElement('.gBlock').dispose();
		};

		var gBlock = new Element('div', {style:'top: 0px; left: 0px; background: white none repeat scroll 0% 0%;  -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; position: absolute; z-index: 999; opacity: 0.5; filter: alpha(opacity=50'} ) ;
		var bDiv   = c.getElement('.bDiv');

		var top = 1;
		top += c.getElement('.tDiv') ? c.getElement('.tDiv').getSize().y : 0;
		top += c.getElement('.hDiv') ? c.getElement('.hDiv').getSize().y : 0;

		// height: (bDiv && bDiv.getSize().y ? bDiv.getSize().y:this.options.height)
		gBlock.setStyles({width:o.width, height: o.height-1, top:0});
		gBlock.addClass('gBlock');

		c.appendChild(gBlock);

		var pReload = c.getElement('div.pDiv .pReload');

		if (pReload) {
			pReload.addClass('loading');
		};
	},

	showLoader : function()
	{
		if (this.loader) {
			return;
		};

		this.showWhiteOverflow();
		this.loader = new Element('div');
		this.loader.addClass('elementloader');
		this.loader.inject(this.container);
		this.loader.setStyles({top:this.options.height/2-16, left:  this.options.width/2});
	},

	hideLoader : function()
	{
		if (!this.loader) {
			return;
		};

		this.hideWhiteOverflow();
		this.loader.dispose(); //not a function ?
		this.loader = null;
	},

	// API
	selectAll : function()
	{
		this.elements.each(function(el, i)
		{
			this.selected.push(el.retrieve('row'));
			el.addClass('selected');
		}, this);

		//this.resetButtons();
		this.fireEvent("click", {
			indices : this.selected,
			target  : this
		});
	},

	selectRow : function(Row, event)
	{
		if (typeof event != 'undefined' &&
			(event.shift || event.control || event.meta) &&
			this.options.multipleSelection)
		{
			// nothing
		} else
		{
			this.unselectAll();
		};

		this.selected.push(Row);
		Row.addClass('selected');
	},

	unSelectRow : function(Row, event)
	{
		Row.removeClass('selected');

		var sel  = this.selected;
		var nsel = [];

		for (var i = 0, len = sel.length; i < len; i++)
		{
			if (sel[i].hasClass('selected')) {
				nsel.push( sel[i] );
			};
		};

		this.selected = nsel;
	},

	// API
	unselectAll : function()
	{
		this.elements.each(function(el, i)
		{
			el.removeClass('selected');
		}, this);

		this.selected = [];

		this.resetButtons();
	},

	// API
	getSelectedIndices : function()
	{
		return this.selected;
	},

	// API
	setSelectedIndices : function(arr)
	{
		this.selected = arr;

		for (var i = 0, alen = arr.length; i < alen; i++)
		{
			var li = this.elements[arr[i]];

			// simulate user click
			this.onRowClick({
				target  : li.getFirst(),
				control : false
			});
		};
	},

	// mislim da je visak
	onMouseOver : function(obj)
	{
		obj.columnModel.onMouseOver(obj.element, obj.data);
	},

	removeHeader: function()
	{
		var obj = this.container.getElement('.hDiv');

		if (obj) {
			obj.empty();
		};

		this.options.columnModel = null;
	},
	// API
	removeAll : function()
	{
		if (this.ulBody) {
			this.ulBody.empty();
		};

		this.selected = [];
	},

	// API
	setColumnModel : function(cmu)
	{
		if (!cmu) {
			return;
		};

		this.options.columnModel = cmu;

		this.draw();
	},
	// API
	setColumnProperty: function(columnName, property, value)
	{
		var cmu = this.options.columnModel;

		if (!cmu || !columnName || !property){
			return;
		};

		columnName = columnName.toLowerCase();

		for (var i=0; i < cmu.length; i++)
		{
			if (cmu[i].dataIndex.toLowerCase() == columnName)
			{
				cmu[i][property] = value;
				return;
			};
		};
	},
     // Automatsko odredivanje column modela ako nije zadan
	setAutoColumnModel: function()
	{
		var t = this;
		var o = t.options;

		if (!o.data) {
			return;
		};

		var rowCount = o.data.length;

		if (!(rowCount>0)) {
			return;
		};

		o.columnModel = [];

		// uzmi schemu od prvog podatka
		for (var cn in o.data[0])
		{
			var dataType = typeof(o.data[0][cn]) == "number" ? "number" : "string";

			o.columnModel.push({header:cn, dataIndex:cn, dataType: dataType, editable:true});
		};

		t.fireEvent("autocolummodel", {target:this, columnModel:o.columnModel});
		t.draw();
	},
	// API
	setSize: function(w, h)
	{
		var t = this;
		var o = t.options;
		var c = t.container;
		// Width
		o.width = w ? w : o.width;

		c.setStyle('width', o.width);

		var width = o.width-2;

		if (o.buttons) {
			c.getElement('.tDiv').setStyle('width', width);
		};

		var hDiv = c.getElement('.hDiv');
		if (o.showHeader && hDiv) {
			hDiv.setStyle('width', width);
		};

		var bodyEl = c.getElement('.bDiv');
		bodyEl.setStyle('width', width);
		c.getElement('.pDiv').setStyle('width', width);

		// Height
		o.height = h ? h : o.height;

		bodyEl.setStyle('height', t.getBodyHeight() );
		c.setStyle('height', o.height);

		var gBlock = c.getElement('.gBlock');

		if (gBlock){
			gBlock.setStyles({width:o.width, height: bodyEl.getSize().y });
		};
	},

	onBodyScroll : function()
	{
		var hbox = this.container.getElement('.hDivBox');
		var bbox = this.container.getElement('.bDiv');
		var xs   = bbox.getScroll().x;

		hbox.setStyle('left', -xs);

		this.rePosDrag();
	},

	onBodyClick : function()
	{

	},

	onBodyMouseOver : function()
	{

	},

	onBodyMouseOut : function()
	{

	},

	// Drag columns events
	rePosDrag : function()
	{
		var t = this;
		var options = t.options;

		if (!options.resizeColumns) {
			return;
		};

		var dragTempWidth = 0;
		var container     = t.container;

		var cDrags  = container.getElements('.cDrag div');
		var scrollX = container.getElement('div.bDiv').getScroll().x;

		var cModel  = options.columnModel;
		var browser = Browser.Engine.trident;
		var cWidth  = 0;

		if( typeof browser == 'undefined'){
			browser = false;
		};

		for (var c = 0, oclen = cModel.length; c < oclen; c++)
		{
			var columnModel = cModel[c];
			var dragSt      = cDrags[c];

			if (typeof dragSt == 'undefined') {
				continue;
			};

			dragSt.setStyle('left', dragTempWidth + columnModel.width + cWidth + (browser ? 1 : 1 ) - scrollX);
			cWidth++;

			if (!columnModel.hidden) {
				dragTempWidth += columnModel.width;
			};
		};
	},

	onColumnDragComplete : function(target)
	{
		var t = this;

		t.dragging = false;

		var colindex = target.retrieve('column');
		var cDrag    = t.container.getElement('div.cDrag');
		var scrollX  = t.container.getElement('div.bDiv').getScroll().x;
		var dragSt   = cDrag.getElements('div')[colindex];
		var browser  = Browser.Engine.trident;
		var options  = t.options;
		var cModel   = options.columnModel;
		var c;

		var visibleColumns = t.visibleColumns;
        var elements       = t.ulBody.getElements('li.tr');

		t.sumWidth = 0;

		if (typeof browser == 'undefined') {
			browser = false;
		};

		for (var c = 0, len = cModel.length; c < len; c++)
		{
			var columnModel = cModel[c];

			if (c == colindex)
			{
				var pos = dragSt.getStyle('left').toInt()+scrollX-this.sumWidth-(browser ? -1 : 1 ); // zato sto je u dragSt.left +2
			} else if (!columnModel.hidden)
			{
				t.sumWidth += columnModel.width;
			};
		};

		if (typeof pos == 'undefined' || pos < 30) {
			pos = 30;
		};
		cModel[colindex].width = pos-2; // -2 fix by mor
		t.sumWidth += pos;

		t.ulBody.setStyle('width', t.sumWidth + visibleColumns * (browser ? 1 : 1));
		var hDivBox = $(t.options.name+'_hDivBox');

		hDivBox.setStyle('width', t.sumWidth + visibleColumns * 2);

		// header
		var columns   = hDivBox.getElements('div.th');
		var columnObj = columns[colindex];

		columnObj.setStyle('width', pos-(browser ? 6 : 6));

		// sve kolone u body
		elements.each(function(el, i)
		{
			el.setStyle('width', t.sumWidth + 2 * visibleColumns); // inace se Div-ovi wrapaju

			if (!el.hasClass('section'))
			{
				var columns   = el.getElements('div.td');
				var columnObj = columns[colindex];

				columnObj.setStyle('width', pos-(browser ? 6 : 6 ));
			};
		});

		t.rePosDrag();
	},

	onColumnDragStart : function(target)
	{
		this.dragging = true;
	},

	onColumnDragging : function(target)
	{
		target.setStyle('top', -1);
	},

	overDragColumn : function(evt)
	{
		evt.target.addClass('dragging');
	},

	outDragColumn : function(evt)
	{
		evt.target.removeClass('dragging');
	},

	// Header events
	clickHeaderColumn : function(evt)
	{
		if (this.dragging) {
			return;
		};

		var colindex    = evt.target.getAttribute('column');
		var columnModel = this.options.columnModel[colindex] || {};

		evt.target.removeClass(columnModel.sort);
		columnModel.sort = (columnModel.sort == 'ASC') ? 'DESC' : 'ASC';
		evt.target.addClass(columnModel.sort);

		this.sort(colindex);
	},

	overHeaderColumn : function(evt)
	{
		if (this.dragging) {
			return;
		};

		var colindex    = evt.target.getAttribute('column');
		var columnModel = this.options.columnModel[colindex] || {};

		if (typeof columnModel.onmouseover == 'function') {
			columnModel.onmouseover( evt );
		};

		evt.target.addClass(columnModel.sort);
	},

	outHeaderColumn : function(evt)
	{
		if (this.dragging) {
			return;
		};

		var colindex    = evt.target.getAttribute('column');
		var columnModel = this.options.columnModel[colindex] || {};

		if (typeof columnModel.onmouseout == 'function') {
			columnModel.onmouseout( evt );
		};

		evt.target.removeClass(columnModel.sort);
	},

	getBodyHeight: function()
	{
		var t = this;
		var o = t.options;

		var headerHeight      = o.showHeader ? 24+2 : 0;  //+2 radi bordera
		var toolbarHeight     = o.buttons ? t.container.getElement('.tDiv').getStyle('height').toInt() : 0;
		var paginationToolbar = o.pagination ? 26 : 0;

		return o.height-headerHeight-toolbarHeight-paginationToolbar-2; //+2 radi bordera
	},

	renderData : function()
	{
		var t = this;
		var o = t.options;
		t.ulBody.empty();
		t.inlineEditSafe = null;

		if (!o.data) {
			return;
		};

		var browser     = Browser.Engine.trident;
		var columnCount = o.columnModel.length;
		var rowCount    = o.data.length;

		for (var r = 0; r < rowCount; r++)
		{
			var li      = new Element('li');
			var rowdata = o.data[r];

			li.setStyle('width', t.sumWidth + 2 * t.visibleColumns);
			li.store('row', r);
			li.addClass('tr');

			if (o.data[r].cssClass) {
				li.addClass( o.data[r].cssClass );
			};

			t.ulBody.appendChild(li);

			if (o.tooltip) {
				o.tooltip.attach( tr );
			};

			var firstvisible = -1;

			for (var c = 0; c < columnCount; c++)
			{
				var columnModel = o.columnModel[c];

				var div = new Element('div');
				div.addClass('td');
				div.setStyle('width', columnModel.width-6);

				li.appendChild(div);

				firstvisible = (!columnModel.hidden && firstvisible == -1) ? c : firstvisible;

				var toggleicon = '';

				if (firstvisible == c && o.accordion && o.showtoggleicon) {
					toggleicon = "<div class='toggleicon' title='" + o.toggleiconTitle + "'></div>";
				};

				if (columnModel.hidden) {
					div.setStyle('display', 'none');
				};

				if (columnModel.onMouseOver)
				{
					div.onmouseover = t.onMouseOver.bind(t, {
						element     : div,
						columnModel : columnModel,
						data        : o.data[r]
					});
				};

				if (columnModel.title) {
					div.title = rowdata[columnModel.title];
				};

				// for ptools
				if (columnModel.dataType == 'button' &&
					o.data[r][columnModel.dataIndex])
				{
					if (typeof _ptools.Button != 'undefined')
					{
						var _btn      = o.data[r][columnModel.dataIndex];
						_btn.data     = o.data[r];

						_btn.data.row  = r;
						_btn.data.List = t;

						div.appendChild(
							new _ptools.Button(_btn).create()
						);
					};
				} else if (columnModel.dataType == "checkbox")
				{
					var input = new Element('input', {type:"checkbox"});

					input.onclick = (function(data)
					{
						var rowdata = data.list.options.data[ data.row ];
						var index   = data.columnModel.dataIndex;

						data.list.options.data[ data.row ][ index ] = data.input.checked ? 1 : 0;

					}).bind(this, {
						columnModel : columnModel,
						row         : r,
						list        : t,
						input       : input
					});

					div.appendChild( input );

					var val = rowdata[columnModel.dataIndex];

					if (val == 1 || val=='t') {
						input.set('checked', true);
					};

				} else if (columnModel.labelFunction != null)
				{
					div.innerHTML = columnModel.labelFunction(rowdata, r, columnModel);
				} else
				{
					var str = new String(rowdata[columnModel.dataIndex]);

					if (str == null || str == 'null' || str == 'undefined' || str == "" ) {
						str = '&nbsp;';
					};

					var trimmed = str.replace(/^\s+|\s+$/g, '');

					if(trimmed.length==0){
						str = '&nbsp;';
					};

					// Column text align propert.
					div.innerHTML = toggleicon+str;

					// *** reg. event to toggleicon ***
					if (firstvisible==c && o.accordion && o.showtoggleicon) {
						div.getElement('.toggleicon').addEvent('click', t.toggleIconClick.bind(this));
					};
				};
			};

			if (o.accordion && o.accordionRenderer && !o.accordionLiveRenderer)
			{
				var li2 = new Element('li');
				li2.addClass('section');
				li2.addClass('section-'+r);
				li2.setStyle('width', t.sumWidth+2*t.visibleColumns); // inace se Div-ovi wrapaju, a u IE nastaje cudan 1px border ispod LI el.

				t.ulBody.appendChild(li2);

				if (o.accordionRenderer)
				{
					o.accordionRenderer({
						parent : li2,
						row    : r,
						grid   : t
					});
				};
			};
		};
	},

	// Main draw function
	draw : function()
	{
		var t = this;

		var container   = t.container;
		var browser     = Browser.Engine.trident;
		var options     = t.options;
		var width       = options.width - (browser ? 2 : 2 ); //-2 radi bordera
		var columnCount = options.columnModel ? options.columnModel.length : 0;

		t.removeAll(); 	   // reset variables and only empty ulBody
		container.empty(); // empty all

		// Container
		if (options.width) {
			container.setStyle('width', options.width);
		};

		container.addClass('omnigrid');

		// Toolbar
		if (options.buttons)
		{
			var tDiv = new Element('div');
			tDiv.addClass('tDiv');
			tDiv.setStyle('width', width);
			tDiv.setStyle('height', 25 + (browser ? 2 : 0 )); // borderi u FF

			container.appendChild(tDiv);

			var bt  = options.buttons;

			for (var i = 0, blen = bt.length; i < blen; i++)
			{
				if (typeof _ptools.Button != 'undefined')
				{
					bt[i].List     = this;
					bt[i].Grid     = this;
					bt[bt[i].name] = new _ptools.Button(bt[i]);

					tDiv.appendChild(
						bt[bt[i].name].create()
					);
					continue;
				};

				var fBt = new Element('div');
				tDiv.appendChild(fBt);

				if (bt[i].separator)
				{
					fBt.addClass('btnseparator');
					continue;
				};

				fBt.addClass('fbutton');

				var cBt = new Element('div');
				cBt.addEvent('click', bt[i].onclick.bind(t, [bt[i].bclass, t]));
				cBt.addEvent('mouseover', function() {
					this.addClass('fbOver');
				});
				cBt.addEvent('mouseout', function() {
					this.removeClass('fbOver');
				});

				fBt.appendChild(cBt);

				var spanBt = new Element('span');
				spanBt.addClass(bt[i].bclass);
				spanBt.setStyle('padding-left', 20);
				spanBt.set('html', bt[i].name);
				cBt.appendChild(spanBt);
			};
		};

		// Header
		var hDiv = new Element('div');
		hDiv.addClass('hDiv');
		hDiv.setStyle('width', width); // borderi u FF
		container.appendChild(hDiv);

		var hDivBox = new Element('div');
		hDivBox.addClass('hDivBox');
		hDivBox.id = t.options.name+'_hDivBox';

		hDiv.appendChild(hDivBox);

		t.sumWidth       = 0;
		t.visibleColumns = 0; // razlikuje se od columnCount jer podaci za neke kolone su ocitani ali se ne prikazuju, npr. bitno kod li width

		for (var c = 0; c < columnCount; c++)
		{
			var columnModel = options.columnModel[c] || {};

			var div = new Element('div');

			// default postavke columnModela
			if (typeof columnModel.width == 'undefined') {
				columnModel.width = 100;
			};

			columnModel.sort = 'ASC';

			// Header events
			if (options.sortHeader)
			{
				div.addEvent('click', t.clickHeaderColumn.bind(this));
				div.addEvent('mouseout', t.outHeaderColumn.bind(this));
				div.addEvent('mouseover', t.overHeaderColumn.bind(this));
			};

			div.setAttribute('column', c);
			div.store('dataType', columnModel.dataType);
			div.addClass('th');
			div.setStyle('width', columnModel.width - (browser ? 6 : 6));
			hDivBox.appendChild(div);

			if (columnModel.hidden)
			{
				div.setStyle('display', 'none');
			} else
			{
				t.sumWidth += columnModel.width;
				t.visibleColumns++;
			};

			var header = columnModel.header;

			if (header) {
				div.innerHTML = header;
			};

			if (columnModel.image) {
				div.style.background = 'url("'+ columnModel.image +'") no-repeat center center';
			};
		};

		hDivBox.setStyle('width', t.sumWidth + t.visibleColumns * 2);

		if (!options.showHeader) {
			hDiv.setStyle('display', 'none');
		};

		// Column size drag
		if (options.height)
		{
			var bodyHeight = t.getBodyHeight();

			container.setStyle('height', options.height +2);
		};

		/* omni grid version + cWidth = -2; by mor*/
		if (this.options.resizeColumns)
		{
			var cDrag = new Element('div');
			cDrag.addClass('cDrag');
			var toolbarHeight = options.buttons ? tDiv.getStyle('height').toInt() : 0; // toolbar
			cDrag.setStyle('top', toolbarHeight);
			container.appendChild(cDrag);

			var dragTempWidth = 0;
			var cWidth        = -2;

			for (var c = 0; c < columnCount; c++)
			{
				var columnModel  = options.columnModel[c] || {};
				var dragSt       = new Element('div');
				var headerHeight = options.showHeader ? 24 + 2 : 0; // +2 border

				if (typeof columnModel.width == 'undefined') {
					columnModel.width = 100;
				};

				dragSt.setStyles({
					top     : 1,
					left    : dragTempWidth + cWidth + columnModel.width,
					height  : headerHeight,
					display : 'block'
				});

				dragSt.store('column', c);
				cDrag.appendChild(dragSt);

				// Events
				dragSt.addEvent('mouseout', t.outDragColumn.bind(this));
				dragSt.addEvent('mouseover', t.overDragColumn.bind(this));

				var dragMove = new Drag(dragSt, {snap:0}); // , {container: this.container.getElement('.cDrag') }
				dragMove.addEvent('drag', t.onColumnDragging.bind(this) );
				dragMove.addEvent('start', t.onColumnDragStart.bind(this) );
				dragMove.addEvent('complete', t.onColumnDragComplete.bind(this) );


				if (columnModel.hidden) {
					dragSt.setStyle('display', 'none');
				} else {
					dragTempWidth += columnModel.width;
				};

				cWidth++;
			};
		};

		// Body
		var bDiv = new Element('div');
		bDiv.addClass('bDiv');
		bDiv.id = t.options.name + '_bDiv';

		if (options.width) {
			bDiv.setStyle('width', width);
		};

		bDiv.setStyle('height', bodyHeight-3);
		container.appendChild(bDiv);

		//  scroll event
		t.onBodyScrollBind = t.onBodyScroll.bind(t);
		bDiv.addEvent('scroll', t.onBodyScrollBind);

		t.ulBody = new Element('ul');
		t.ulBody.setStyle('width', t.sumWidth + t.visibleColumns * (browser ? 1 : 1 )); // da se ne vidi visak, ul je overflow hidden

		bDiv.appendChild(t.ulBody);

		if (options.pagination && !container.getElement('div.pDiv'))
		{
			var pDiv = new Element('div');
			pDiv.addClass('pDiv');
			pDiv.setStyle('width', width);
			pDiv.setStyle('height', 30);

			container.appendChild(pDiv);

			var pDiv2 = new Element('div');
			pDiv2.addClass('pDiv2');
			pDiv.appendChild(pDiv2);

			var h = '<div class="pGroup"><select class="rp" name="rp">';


			var optIdx;
			var setDefaultPerPage = false;

			for (optIdx=0; optIdx < options.perPageOptions.length; optIdx++)
			{
				if (options.perPageOptions[optIdx] != options.perPage)
				{
					h = h +'<option value="' + options.perPageOptions[optIdx] + '">' + options.perPageOptions[optIdx] +'</option>';
				} else
				{
					setDefaultPerPage = true;
					h = h +'<option selected="selected" value="' + options.perPageOptions[optIdx] + '">' + options.perPageOptions[optIdx] +'</option>' ;
				};
			};

			h = h +'</select></div>';

			h = h +'<div class="btnseparator"></div><div class="pGroup"><div class="pFirst pButton"></div><div class="pPrev pButton"></div></div>';
			h = h +'<div class="btnseparator"></div><div class="pGroup"><span class="pcontrol"><input class="cpage" type="text" value="1" size="4" style="text-align:center"/> / <span></span></span></div>';
			h = h +'<div class="btnseparator"></div><div class="pGroup"><div class="pNext pButton"></div><div class="pLast pButton"></div></div>';
			h = h +'<div class="btnseparator"></div><div class="pGroup"><div class="pReload pButton"></div></div>';
			h = h +'<div class="btnseparator"></div><div class="pGroup"><span class="pPageStat"></div>';

			if (options.multipleSelection)
			{
				h = h +'<div class="btnseparator"></div>' +
						'<div class="pGroup">' +
							'<div class="pSelectAll" title="Alle auswählen"></div>' +
							'<div class="pUnselectAll" title="Auswahl aufheben"></div>' +
						'</div>';
			};

		    if (options.filterInput) {
				h = h +'<div class="btnseparator"></div><div class="pGroup"><span class="pcontrol"><input class="cfilter" title="Anzeige filtern" type="text" value="" style="" /><span></div>';
			};

			if (options.exportData) {
				h = h +'<div class="btnseparator"></div><div class="pGroup"><div class="pExport pButton" title="Drucken / Exportieren"></div></div>';
			};

			pDiv2.innerHTML = h;

			var o = null;

			if (o = pDiv2.getElement('.pFirst')) {
				o.addEvent('click', this.firstPage.bind(this));
			};

			if (o = pDiv2.getElement('.pPrev')) {
				o.addEvent('click', this.prevPage.bind(this));
			};

			if (o = pDiv2.getElement('.pNext')) {
				o.addEvent('click', this.nextPage.bind(this));
			};

			if (o = pDiv2.getElement('.pLast')) {
				o.addEvent('click', this.lastPage.bind(this));
			};

			if (o = pDiv2.getElement('.pReload')) {
				o.addEvent('click', this.refresh.bind(this));
			};

			if (o = pDiv2.getElement('.rp'))
			{
				o.addEvent('change', this.perPageChange.bind(this));
				o.value = options.perPage;
			};

			if (o = pDiv2.getElement('input.cpage')) {
				pDiv2.getElement('input').addEvent('keydown', this.pageChange.bind(this) );
			};

			if (this.options.filterInput)
			{
				if (o = pDiv2.getElement('input.cfilter')){
					pDiv2.getElement('input.cfilter').addEvent('keyup', this.filerData.bind(this) ); // goto 1 & refresh
				};
			};

			if (options.multipleSelection)
			{
				if (o = pDiv2.getElement('.pSelectAll')) {
					o.addEvent('click', this.selectAll.bind(this));
				};

				if (o = pDiv2.getElement('.pUnselectAll')) {
					o.addEvent('click', this.unselectAll.bind(this));
				};
			};

			if (o = pDiv2.getElement('.pExport')) {
				o.addEvent('click', this.getExportSelect.bind(this));
			};
		};
	},

	firstPage : function()
	{
		this.options.page = 1;
		this.refresh();
	},

	prevPage : function()
	{
		if (this.options.page > 1)
		{
			this.options.page--;
			this.refresh();
		};
	},

	nextPage : function()
	{
		if ((this.options.page+1) > this.options.maxpage) {
			return;
		};

		this.options.page++;
		this.refresh();
	},

	lastPage : function()
	{
		this.options.page = this.options.maxpage;
		this.refresh();
	},

	perPageChange : function()
	{
		this.options.page    = 1;
		this.options.perPage = this.container.getElement('.rp').value;
		this.refresh();
	},

	pageChange : function()
	{
		var np = this.container.getElement('div.pDiv2 input').value;

		if (np>0 && np<=this.options.maxpage)
		{
			if (this.refreshDelayID){
				$clear(this.refreshDelayID)
			};

			this.options.page   = np;
			this.refreshDelayID = this.refresh.delay(1000, this);
		};
	},

	// API
	gotoPage : function(p)
	{
		if (p > 0 && p <= this.options.maxpage)
		{
			this.options.page = p;
			this.refresh();
		};
	},

	setPerPage : function(p)
	{
		if (p > 0)
		{
			this.options.perPage = p;
			this.refresh();
		};
	},

	// API, not doc
	sort : function(index, by)
	{
		var t = this;
		var o = t.options;

		if (index < 0 || index >= o.columnModel.length) {
			return;
		};

		if (o.onStart) {
			t.fireEvent('onStart');
		};

		if (o.accordionLiveRenderer){
			t.removeSections();
		};

		var header = t.container.getElements('.th');
		var el     = header[index];

		if (by != null) {
			el.addClass(by.toLowerCase());
		};

		if (el.hasClass('ASC'))
		{
			el.sortBy = 'ASC';
		} else if (el.hasClass('DESC'))
		{
			el.sortBy = 'DESC';
		};

		if (o.serverSort)
		{
			o.sortOn = o.columnModel[index].dataIndex;
			o.sortBy = el.sortBy;

			t.refresh();
			return;
		};

		t.elements.sort(el.compare);
		t.elements.injectInside(t.ulBody);

		// Update selection array because indices has been changed
		t.selected = [];

		t.elements.each(function(el ,i)
		{
			if (el.hasClass('selected')) {
				this.selected.push(el.retrieve('row'));
			};

		}, t);

		// Filter
		if (t.filtered)
		{
			t.filteredAltRow();
			return;
		};

		t.altRow();
	},

	moveup : function()
	{
		var t = this;

		if (typeof t.selected[0] == 'undefined') {
			return;
		};

		var _data = [];
		var index = t.selected[0];
		var data  = t.options.data;

		if (index == 0) {
			return;
		};

		for (var i = 0, len = data.length; i < len; i++)
		{
			if (i == index) {
				continue;
			};

			if (i == index-1) {
				_data.push( data[index] );
			};

			_data.push( data[i] );
		};

		t.setData({data : _data	});
		t.setSelectedIndices([index-1]);
	},

	movedown : function()
	{
		var t = this;

		if (typeof t.selected[0] == 'undefined') {
			return;
		};

		var _data = [];
		var index = t.selected[0];
		var data  = t.options.data;

		if (index+1 >= parseInt(data.length)) {
			return;
		};

		for (var i = 0, len = data.length; i < len; i++)
		{
			if (i == index) {
				continue;
			};

			_data.push( data[i] );

			if (i == index+1) {
				_data.push( data[index] );
			};
		};

		t.setData({data : _data	});
		t.setSelectedIndices([index+1]);
	},

	altRow : function()
	{
		this.elements.each(function(el, i)
		{
			if (i % 2)
			{
				el.removeClass('erow');
				return;
			};

			el.addClass('erow');
		});
	},

	filteredAltRow : function()
	{
		this.ulBody.getElements('.'+this.options.filterSelectedCls).each(function(el, i)
		{
			if (i % 2)
			{
				el.removeClass('erow');
				return;
			};

			el.addClass('erow');
		});
	},

    filerData : function()
    {
		if (this.options.filterInput)
		{
			var cfilter = this.container.getElement('input.cfilter');

			if (cfilter) {
				this.filter(cfilter.value);
			};
		};
    },

	// API
	filter : function(form)
	{
		//var form = $(form);
		var col = 0;
		var key = '';

		if (!(form.length>0)) {
			this.clearFilter();
		};

		key = form;

		if (key)
		{
			for (var i = 0; i < this.options.data.length; i++)
			{
				var dat = this.options.data[i];

				for (var c = 0; c < this.options.columnModel.length; c++)
				{
					var columnModel = this.options.columnModel[c];

					if (columnModel.type == "checkbox") {
						continue;
					}

					var el = this.elements[i];

					if (this.options.filterHide) {
						el.removeClass('erow');
					};

					if (dat[columnModel.dataIndex] != null &&
						typeof dat[columnModel.dataIndex].toLowerCase == 'function' &&
						dat[columnModel.dataIndex].toLowerCase().indexOf(key) > -1)
					{
						el.addClass(this.options.filterSelectedCls);

						if (this.options.filterHide) {
							el.removeClass(this.options.filterHideCls);
						};

						break;
					} else
					{
						el.removeClass(this.options.filterSelectedCls);

						if (this.options.filterHide) {
							el.addClass(this.options.filterHideCls);
						};
					};
				};
			};

			if (this.options.filterHide)
			{
				this.filteredAltRow();
				this.filtered = true;
			};
		};
	},

	// API
	clearFilter : function()
	{
		this.elements.each(function(el,i)
		{
			el.removeClass(this.options.filterSelectedCls);

			if (this.options.filterHide) {
				el.removeClass(this.options.filterHideCls);
			};

		}, this);

		if (this.options.filterHide)
		{
			this.altRow();
			this.filtered = false;
		};
	},

	getExportSelect : function()
	{
		var t             = this;
		var options       = t.options;
		var selectWindow  = new Element('div');
		var exportBarDiv  = new Element('div');
		var exportDataDiv = new Element('div');
		var exportTextDiv = new Element('div');

		selectWindow.addClass('exportSelectDiv');
		exportBarDiv.addClass('exportSelectBtnDiv');
		exportDataDiv.addClass('exportItemsDiv');
		exportTextDiv.addClass('exportTextsDiv');

		exportTextDiv.set('html','Bitte wählen sie die Felder aus die exportiert werden sollen');

		t.container.appendChild( selectWindow );
		selectWindow.appendChild( exportTextDiv );
		selectWindow.appendChild( exportDataDiv );
		selectWindow.appendChild( exportBarDiv );

		for (var c = 0; c < options.columnModel.length; c++)
		{
			var columnModel = options.columnModel[c];
			var header      = columnModel.header;
			var dataIndex   = columnModel.dataIndex;

			if (columnModel.hidden ||
				columnModel.dataType == 'button'  ||
				columnModel.dataType == 'checkbox')
			{
				continue;
			};

			var div   = new Element('div');
			var span  = new Element('span');
			var input = new Element('input', {
				type    : 'checkbox',
				checked : 'checked',
				value   : dataIndex ,
				id      : 'export_'+dataIndex ,
				name    : dataIndex
			});

			div.addClass('exportItemDiv');
			span.innerHTML = header;
			div.appendChild(input);
			div.appendChild(span);

			exportDataDiv.appendChild(div);
		};

		for (exportType in options.exportTypes )
		{
			exportBarDiv.appendChild(
				new _ptools.Button({
					name 	 : exportType,
					text     : options.exportTypes[exportType],
					onclick  : function(Btn)
					{
						var Grid = Btn.getAttribute('Grid');
						var type = Btn.getAttribute('exportType');
						var Data = Grid.setExportData();
						Grid.exportGrid(type);
					},
					textimage  : options.exportBinUrl + exportType + '.png',
					Grid       : t,
					exportType : exportType
				}).create()
			);
		};

		exportBarDiv.appendChild(
			new _ptools.Button({
				name 	 : 'cancel',
				text     : 'Abbrechen',
				onclick  : function(Btn) {
					$$('.exportSelectDiv').destroy();
				},
				textimage : options.exportBinUrl + 'exit.png'
			}).create()
		);

		return false;
	},

	setExportData : function()
	{
		var t            = this;
		var options      = t.options;
		var data 		 = {header : {}, data : []};

		for (var c = 0; c < options.columnModel.length; c++)
		{
			var columnModel = options.columnModel[c];
			var header      = columnModel.header;
			var dataIndex   = columnModel.dataIndex;

			if (columnModel.hidden || columnModel.dataType == 'button'  || columnModel.dataType == 'checkbox') {
				continue;
			};

			if (!$('export_'+dataIndex).checked) {
				continue
			};

			data.header[dataIndex] = { header : header, dataIndex :dataIndex };
		};

		if (typeof options.data != 'undefined')
		{
			for (var i = 0; i < options.data.length; i++)
			{
				var dat      = options.data[i];
				data.data[i] = {};

				for (h in data.header){
					data.data[i][ data.header[h].dataIndex ] =  dat[data.header[h].dataIndex];
				};
			};
		};

		options.exportData = data;

		$$('.exportSelectDiv').destroy();

		return data;
	},

	exportGrid : function(type)
	{
		var t         = this;
		var options   = t.options;
		var data      = options.exportData;
		var exportUrl = options.exportBinUrl + 'export.php';

		if (typeof options.exportRenderer == 'function') {
			options.exportRenderer({Grid : t, data:data, type: type});
			return;
		};

		var tempData = {data:data, type: type};

		if (type != 'print')
		{
	    	var exportDataField = new Element('input', {
    			name  : 'data',
    			id    : 'exportDataField',
                value : JSON.stringify(tempData),
                style : 'display:none;'
			});

	        t.container.appendChild(exportDataField);

			var iFrame = new Element('iframe',{
				src         : exportUrl,
				id          : 'gridExportFrame',
				frameborder : '0',
				scrolling   : 'auto'
			});

			iFrame.addClass('exportFrame');
			t.container.appendChild(iFrame);
			setTimeout('$(\'exportDataField\').destroy(); $(\'gridExportFrame\').destroy();', 10000);

			return;
		};

		// @todo print funktion bauen
	}
});

