/**
 * 
 * Client side script for Datagrid
 * @author Jaroslav Moravec (jaroslav.moravec@e-invent.eu)
 * @version 1.0.10.20
 * 
 */

function Datagrid() {
	
	var self = this;
	self.filterFocus;
	self.dgItemIdent = "#jq_dgItemId-";
	self.highlightColor = "#B2E062";
	self.highlightTimeout = 5000;
	
	/**
	 * Initialize event listeners
	 */
	self.init = function() {
	
		/**
		 * Check all checkboxes in datagrid
		 */
		$(".jq_datagridCheckAll").live('click', function(){
			$(".jq_datagridCheckbox").attr("checked", $(this).attr("checked"));
		});
		
		/**
		 * Go to the first page event
		 */
		$(".jq_datagridPaginatorFirst").live('click', function(){
			var page = 1;
			self.changePage(page);
			return false;
		});
		
		/**
		 * Go to the previous page event
		 */
		$(".jq_datagridPaginatorPre").live('click', function(){
			var page = parseInt($(".jq_datagridPaginatorPage").val()) - 1;
			if (page < 1) {
				return false;
			}
			self.changePage(page);
			return false;
		});
		
		/**
		 * Go to the next page event
		 */
		$(".jq_datagridPaginatorNext").live('click', function(){
			var page = parseInt($(".jq_datagridPaginatorPage").val()) + 1;
			var lastPage = parseInt($("#datagridPaginatorLastPage").html());
			if (page > lastPage) {
				return false;
			}
			self.changePage(page);
			return false;
		});
		
		/**
		 * Go to the last page event
		 */
		$(".jq_datagridPaginatorLast").live('click', function(){
			var page = parseInt($("#datagridPaginatorLastPage").html());
			self.changePage(page);
			return false;
		});
		
		/**
		 * Go to the page event (when pressed enter)
		 * @param {Object} event
		 */
		$(".jq_datagridPaginatorPage").live('keypress', function(event){
			var code = event.keyCode || event.which;
			if(code == 13) {
				var page = parseInt($(".jq_datagridPaginatorPage").val());
				var lastPage = parseInt($("#datagridPaginatorLastPage").html());
				if (page < 1) {
					page = 1;
				}
				if (page > lastPage) {
					page = lastPage;
				}
				self.changePage(page);
			}
		});
		
		/**
		 * Show/hide filter inputs event
		 */
		$(".jq_datagridFilter").live('click', function(){
			
			var filterInputsVisible = $('div.filter:visible');
			
			if (filterInputsVisible.length > 0) {
				$('div.filter').slideUp();
			} else {
				$('div.filter').slideDown();
			}
			
			return false;
		});
		
		/**
		 * Checkbox action submit event
		 */
		$(".jq_datagridCheckboxActionSubmit").live('click', function() {
			if (confirm(php.lang.trans.dgConfirm)) {
				var action = $(".jq_datagridCheckboxAction").val();
				var checked = datagrid.getChecked();
				eval(action+"(datagrid.getChecked())");
			}
		});
		
		$(".dgSorting").live('click', function() {
			var tmp = $(this).attr("id").split("-");
			var column = tmp[1];
			var way = 'DESC';
			if ($(this).hasClass('dgOrderDESC')) {
				way = 'ASC';
			}
			self.changeOrder(column, way);
			return false;
		});
		
		//Hide filter textfields
		self.checkFilter();
		//Init typewatch filter
		self.initFilterTypewatch();
		//Filter date click event
		self.initDaterangepicker();
		//Init change events
		self.initLiveChange();
		//Init spinner (set position)
		self.initSpinner();
	};
	
	/**
	 * Change page (AJAX)
	 * @param Int page
	 */
	self.changePage = function(page) {
		self.showSpinner();
		system.ajaxRequest (
			[ 'ext', php.extId ],
			'actionChangePage',
			[
				[ 'page', page ]
			],
			{ fce : self.updateSnippet }
		);
		return false;
	};
	
	/**
	 * Change order (AJAX)
	 * @param String column name of column
	 * @param String way (DESC|ASC)
	 */
	self.changeOrder = function(column, way) {
		self.showSpinner();
		system.ajaxRequest (
			[ 'ext', php.extId ],
			'actionChangeOrder',
			[
				[ 'column', column ],
				[ 'way', way]
			],
			{ fce : self.updateSnippet }
		);
	};
	
	/**
	 * Change items per page (AJAX)
	 * @param Int items
	 */
	self.changeItems = function(items) {
		self.showSpinner();
		system.ajaxRequest (
			[ 'ext', php.extId ],
			'actionChangeItemsPerPage',
			[
				[ 'items', items ]
			],
			{ fce : self.updateSnippet }
		);
	};
	
	/**
	 * Apply filter (AJAX)
	 * @param String column name of column
	 * @param String filter text of filter
	 */
	self.addFilter = function(column, filter) {
		self.showSpinner();
		self.filterFocus = column;
		system.ajaxRequest (
			[ 'ext', php.extId ],
			'actionAddFilter',
			[
				[ 'column', column ],
				[ 'filter', filter]
			],
			{ fce : self.updateSnippet }
		);
	};
	
	/**
	 * Apply extendedfilter (AJAX)
	 *
	 * *
	 * * NELZE POUZIT MULTIVYBER Z AGREGACNICH FUNKCI
	 * * Pokud zatam sloupec, ktery je vysledkem agregacni funkce a zaroven
	 * * predam filter jako pole hodnot, VYSLEDEK NEBUDE SPRAVNY
	 * * @todo
	 *  
	 * @param String column name of column
	 * @param String filter text of filter or array (!WARNING read the manual!)
	 */
	self.addExtendedFilter = function(anchor, column, filter) {
		self.showSpinner();
		system.ajaxRequest (
				[ 'ext', php.extId ],
				'actionAddExtendedFilter',
				[
				 [ 'anchor', anchor],
				 [ 'column', column ],
				 [ 'filter', filter]
				],
				{ fce : self.updateSnippet }
		);
	};
	
	/**
	 * Remove extended filters by anchor names (AJAX)
	 * @param String, ... anchors (unlimited arguments)
	 */
	self.removeExtendedFilter = function() {
		self.showSpinner();
		var anchors = new Array();
		for (var i = arguments.length; i--; i > 0) {
			anchors.push(arguments[i]);
		}
		system.ajaxRequest (
				[ 'ext', php.extId ],
				'actionRemoveExtendedFilter',
				[
				 [ 'anchors', anchors]
				],
				{ fce : self.updateSnippet }
		);
	};

	/**
	 * Remove all exteded filters (AJAX)
	 */
	self.removeAllExtendedFilter = function() {
		self.showSpinner();
		system.ajaxRequest (
				[ 'ext', php.extId ],
				'actionAllRemoveExtendedFilter',
				[],
				{ fce : self.updateSnippet }
		);
	}

	/**
	 * Returns export of extended filter
	 */
	self.getExtendedFilter = function(ident) {
		if (php.datagridExtendedFilter && ident in php.datagridExtendedFilter) {
			return php.datagridExtendedFilter[ident];
		}
		return false;
	}
	
	/**
	 * Reload datagrid (update/rerender)
	 * @param String fceoutput (nothing useable)
	 * @param int id id of updated row it will be highlighted
	 */
	self.reload = function(fceoutput, id){
		self.showSpinner();
		system.ajaxRequest (
			[ 'ext', php.extId ],
			'actionReload',
			[
			],
			{ fce : self.updateSnippet, param: id }
		);
		self.checkFilter();
	};
	
	/**
	 * Get ids of checked rows
	 * Return ids of checked rows
	 */
	self.getChecked = function() {
		var checked = new Array();
		$(".jq_datagridCheckbox:checked").each(function() {
			checked.push($(this).val());
		});
		return checked;
	};
	
	/**
	 * Gets id of item (from actions)
	 * @param jQuery object
	 * @return int id of db row
	 */
	self.getItemId = function(element) {
		var tmp = $(element).attr('id').split("-");
		return tmp[1];
	};
	
	/**
	 * Initialize data range picker
	 */
	self.initDaterangepicker = function () {
		if ($(".jq_datagridFilterDate").length != 0) {
			$(".jq_datagridFilterDate").daterangepicker({
				dateFormat: 'dd.mm.yy',
				presets: {clear: php.lang.trans.dgClear, specificDate: php.lang.trans.dgSpecificDate, dateRange: php.lang.trans.dgDateRange},
				rangeStartTitle: php.lang.trans.dgStartDate,
				rangeEndTitle: php.lang.trans.dgEndDate,
				doneButtonText: 'OK',
				prevLinkText: php.lang.trans.dgPre,
				nextLinkText: php.lang.trans.dgNext,
				presetRanges: [ ],
				onClose: function(input) {
					var column = input.attr("name");
					var filter = input.val();
					self.addFilter(column, filter);
				},
				datepickerOptions: {
					dateFormat: 'dd.mm.yy',
					firstDay: 1,
					dayNamesMin: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'],
					monthNames: ['Leden','Únor','Březen','Duben','Květen','Červen','Červenec','Srpen','Září','Říjen','Listopad','Prosinec'],
					prevText: 'Předchozí',
					nextText: 'Následující'
				}
			});	
		}
	};
	
	/**
	 * Update datagrid snippet 
	 * @param String xmldata
	 * @param int id id of row (by db identifier)
	 */
	self.updateSnippet = function(xmldata, id) {
		$("#datagridContainer").html(xmldata);
		
		$("input[name='"+ self.filterFocus +"']").focus();
		self.checkFilter();	
		self.hideSpinner();
		self.initDaterangepicker();
		self.initFilterTypewatch();
		self.initLiveChange();
		self.initSpinner();
		
		if (!system.isEmpty(id)) {
			self.highlightItem(id);
		}

		// call update callback
		if (php.dgUpdateCallback) {
			eval(php.dgUpdateCallback);
		}
	};
	
	/**
	 * Highlight table row by id of 'identifier'
	 * @param int id
	 */
	self.highlightItem = function(id) {
		var originalColor = $(self.dgItemIdent + id + " td").css("background-color");
		$(self.dgItemIdent + id + " td").css("background-color", self.highlightColor);
		setTimeout(function() {
				$(self.dgItemIdent + id + " td") // @todo replace with animate in jquery 1.4.x
						.fadeTo("slow", 0.2, function() {$(this).css("backgroundColor", originalColor);})
						.fadeTo("normal", 1);
		}, self.highlightTimeout);
	};

	/**
	 * Check filter and hide filter textfields
	 */
	self.checkFilter = function() {
		
		var hide = true; 
		// hide filter icon if there is no filters
		if ($('div.filter').length == 0) {
			$('a.datagridFilterButton').hide();
		}
		
		$('div.filter input, div.filter .jq_dgFilterSelectbox').each(function() {
			if ($(this).val() != '') {
				hide = false;
			}
		});
		
		if (!hide) {
			$('a.datagridFilterButton').css('background-color', '#9F644F');
		} else {
			$('div.filter').hide(); 
		}
		// Fix input width
		self.fixInputFilterWidth();
	};
	
	/**
	 * Fix filter's input width - no overfloating
	 */
	self.fixInputFilterWidth = function() {
		var maxWidth = 250;
		$("div.filter input[class!='jq_dgFilterNumericInterval'][class!='jq_dgFilterNumeric']").each(function() {
			$(this).width(1);
			var width = $(this).parent().parent().width() - 6;
			if (width > maxWidth) width = maxWidth;
			$(this).width(width);
			
		});
	};
	
	/**
	 * Init live onchange events
	 * Init text filter type watching (auto post filter)
	 * Init numeric filter type watching and changing
	 */
	self.initFilterTypewatch = function() {
		// text filter
		$(".jq_datagridFilterText").typeWatch({wait: 500, captureLength: -1, callback: function(element) {
			var column = jQuery(element).attr('name');
			var filter = jQuery(element).val();
			self.addFilter(column, filter);
		}});
		
		// numeric filter
		$(".jq_dgFilterNumericMode").change(function() {
			if ($(this).val() == "-") {
				$(this).parent().find(".jq_dgFilterNumeric").hide();
				$(this).parent().find(".jq_dgFilterNumericInterval").show();
			} else {
				$(this).parent().find(".jq_dgFilterNumericInterval").hide();
				$(this).parent().find(".jq_dgFilterNumeric").show();
			}
			// check if is fully filled
			var send = true;
			$(this).parent().find("input:visible").each(function() {
				if ($(this).val() == '') {
					send = false; return send;
				}
			});
			if (!send) return false;
			
			self.addNumericFilter($(this).parent());
		});
		$(".jq_dgFilterNumeric").typeWatch({wait: 500, captureLength: -1, callback: function(element) {
			self.addNumericFilter($(element).parent());
		}});
		
		$(".jq_dgFilterNumericInterval").typeWatch({wait: 500, captureLength: -1, callback: function(element) {
			if (($(".jq_dgFilterNumericInterval").eq(0).val() == '') != ($(".jq_dgFilterNumericInterval").eq(1).val() == '')) {
				return;
			}
			self.addNumericFilter($(element).parent());
		}});
		
	};
	
	self.initLiveChange = function() {
		
		/**
		 * Change event select filter
		 */
		$(".jq_dgFilterSelect select").bind('change', function () {
			var column = $(this).attr('name');
			var filter = $(this).val();
			self.addFilter(column, filter);
		});
		
		/**
		 * Change showed items per page event
		 */
		$(".jq_datagridPaginatorItems").bind('change', function(){
			var items = $(this).val();
			self.changeItems(items);
			return false;
		});
		
		/**
		 * Checkbox action auto event
		 */
		$(".jq_datagridCheckboxAction").bind('change', function() {
			if (confirm(php.lang.trans.dgConfirm)) {
				var action = $(".jq_datagridCheckboxAction").val();
				var checked = datagrid.getChecked();
				eval(action+"(datagrid.getChecked())");
			}
		});
		
	};
	
	/**
	 * Adding numeric filter
	 */
	self.addNumericFilter = function(element) {
		var column = $(element).find("input:visible").attr('name');
		var filter = $(element).find(".jq_dgFilterNumericMode").val();
		var inputs = $(element).find("input:visible");
		// determine interval
		if (filter == "-") {
			// check if is fully filled
			var send = true;
			if (!send) {
				return false;
			}
			// construct filter value
			filter = "(" + inputs.eq(0).val() + ")-(" + inputs.eq(1).val() + ")";
		} else {
			// check if is fully filled
			if (system.isEmpty(inputs.val())) {
				//return false;
			}
			// construct filter value
			filter = filter + inputs.val();
		}
		// add filter and send
		return self.addFilter(column, filter);
	};
	
	self.initSpinner = function() {
		var h = $("#datagridContainer").height();
		var w = $("#datagridContainer").width();
		$("#dgSpinner").css({
				height: h,
				width: w
		});
	};
	
	self.showSpinner = function() {
		$("#datagridContainer").fadeTo(100, 0.5);
		$("#dgSpinner").show();
	};
	
	self.hideSpinner = function() {
		$("#dgSpinner").hide();
		$("#datagridContainer").css('opacity', 0.5);
		$("#datagridContainer").fadeTo(100, 1);
	};
	
}

var datagrid = new Datagrid();

$(document).ready(function() {
	datagrid.init();
});

