/*
TODO: grid_prev und grid_next bezogen auf das jeweilige grid speichern!!! gegenwärtig fehlerhaft, da next bei zwei grids auf einer seite ggf das falsche cached und anzeigt!
*/

var $grid_next = false;
var $grid_curr = false;
var $grid_prev = false;

///////////////////////////////////////////////////////////////////////////////
$(document).ready(function() {

	$grid_curr = $( 'form.grid' );
	
	//$( '.loader' ).css( 'visibility', 'hidden' );
	
	set_grid_settings( $grid_curr );
	
	//$('select.search').selectbox();
	
	animate_highlighted();
} );

///////////////////////////////////////////////////////////////////////////////
function animate_highlighted() {
	
	var $highlighted = $( '.highlighted' );
	var normal_color = $highlighted.css( 'background-color' );
	$( 'td', $highlighted ).animate( { backgroundColor: normal_color }, 10000, function() {
		$( this ).css( 'background-color', '' ).parent().removeClass( 'highlighted' );
	}	);
}

///////////////////////////////////////////////////////////////////////////////
function set_grid_settings( $grid ) {

	if ( typeof init_form != 'undefined' ) init_form();
	
	$( 'td div.quickedit', $grid ).click( function() {
		//$( this ).parent().unbind( 'click' );
		
		$( this ).parent().parent().removeClass( 'hover' );
		
		var field = $( this ).attr( 'field' );
		$select = $( this ).parents( '.grid' ).find( 'select[name=' + field +']' );
		
		if ( $select.length ) {
			var $select = $( this ).hide().after( $select.eq(0).clone().addClass( 'quickedit' ) ).next();
			$select.find( 'option:contains(' + $( this ).text() +')' ).attr( 'selected', 'selected' ).end().focus().blur( function() {
				$( this ).prev().show().next().remove();
			} ).change( function() {
				var id = $( this ).prev().attr( 'id' );
				var field = $( this ).prev().attr( 'field' );
				var value = $( this ).val();
				
				var $td = $( this ).prev();
				
				$td.parent().parent().removeClass( 'hover' );
				
				$td.find( 'p' ).text( $('option:selected', this ).text() ).end().show().next().remove();

				$( '.loader', $grid ).css( 'visibility', 'visible' );
				$.ajax({
					type: 'POST',
					url: '?quickedit=1',
					data: 'id='+ id +'&field='+ field +'&value=' + value,
					dataType: 'html',
					complete: function() {
						$( '.loader' ).css( 'visibility', 'hidden' );
					},
					success: function( txt ) {
						
						$td.parent().parent().addClass( 'highlighted' );
						animate_highlighted();
					}
				});
				
			} );
			return;
		}
		
		$( this ).hide().after( '<input class="quickedit" type="text" value="' + $( this ).text() + '" />' ).next().keydown( function( e ) {
			switch ( e.keyCode ) {
				case 13: // ENTER
					var id = $( this ).prev().attr( 'id' );
					var field = $( this ).prev().attr( 'field' );
					var value = $( this ).val();
					
					var $td = $( this ).prev();
					
					$( '.loader', $grid ).css( 'visibility', 'visible' );
					$.ajax({
						type: 'POST',
						url: '?quickedit=1',
						data: 'id='+ id +'&field='+ field +'&value=' + value,
						dataType: 'html',
						complete: function() {
							$( '.loader' ).css( 'visibility', 'hidden' );
						},
						success: function( txt ) {
							
							$td.parent().parent().addClass( 'highlighted' );
							animate_highlighted();
						}
					});
					
					$td.find( 'p' ).text( value ).end().show().next().remove();
					break;
				case 27: // ESC
					$( this ).prev().show().next().remove();
					break;
			}
		} ).focus().blur( function() {
			$( this ).prev().show().next().remove();
		} );
	} );
	
	// Wenn Selects geändert werden (außer Action), submit ausführen!
	$( 'select', $grid ).not( '[name=action]' ).not( '.day' ).not( '.month' ).not( '.year' ).change( function() {
		$grid = $( this ).parents( 'form' );
		$grid.submit();
	}	);
	
	// Checked-Filter
	$( '.filter_checked', $grid ).click( function() {
		$grid = $( this ).parents( 'form' );
		$grid.submit();
	}	);
	
	// Wenn Action-Select geändert wird, Form-Target auf value ändern und submit (ohne AJAX) ausführen!
	$( 'select[name=action]', $grid ).change( function() {
		var $select = $( this );
		$grid = $select.parents( 'form' );
		//$grid.attr( 'action', $select.val() );
		$grid.attr( 'flag_ajax_disabled', 'true' ); // AJAX abschalten
		$grid.submit();
	}	);
	
	// Hover-Effekt aktivieren ...
	$( 'tr.result', $grid ).hover( function() {
		$( this ).addClass( 'hover' );
	}, function() {
		$( this ).removeClass( 'hover' );
	} );
	
	$( 'input.check_all', $grid ).click( check_click_all ); // Klick auf Checkbox im Header selektiert alle angezeigten Checkboxen
	$( 'tr.selectable td', $grid ).click( check_click ); // Klick auf (selectable) Spalte ändert Checkbox-Status
	
	// Klick direkt auf Checkbox muss Style der Spalte anpassen ...
	$( 'input.check_row', $grid ).click( function() {
		var $checkbox = $( this );
		var checkbox_state = !$checkbox.attr( 'checked' );
		$checkbox.attr( 'checked', checkbox_state );
	} );
	
	// Formular wird abgeschickt ...
	$grid.submit( function( e ) {
		
		var  $grid = $( this );
		
		if ( $grid.attr( 'flag_disabled' ) == 'true' ) { // Wenn Formular stop-Flag hat, abbrechen!
			return false;
		} else { // sonst stop-Flag aktivieren (damit nur einmal abgeschickt wird!)
			$grid.attr( 'flag_disabled', 'true' );
		}
		
		if ( $grid.attr( 'flag_ajax_disabled' ) == 'true' ) { // Wenn Formular submit-Flag hat, soll kein AJAX verwendet werden, also POST abschicken!
			return true;
		}
		
		// Herausfinden (Browserunabhängig) welcher Button den submit ausgelöst hat, und dessen name und value in data schreiben ...
		var data = {};
		
		if ( typeof e.explicitOriginalTarget != 'undefined' ) {
			data[ e.explicitOriginalTarget.name ] = e.explicitOriginalTarget.value;
			var button = e.explicitOriginalTarget.name;
		} else if ( typeof document.activeElement != 'undefined' ) {
			data[ document.activeElement.name ] = document.activeElement.value;
			var button = document.activeElement.name;
		} else {
			var button = '';
		}
		
		if ( button == 'next' ) { // Klick auf "Nächstes" ...
			
			if ( typeof $grid_next == 'object' ) { // Wenn es schon ein nächstes gibt ...
				if ( typeof $grid_prev == 'object' ) $grid_prev.remove(); // ggf. vorheriges löschen
				$grid_prev = $grid.hide(); // aktuelles als vorheriges speichern und ausblenden
				$grid = $grid_next.show(); // nächstes als aktuelles speichern und einblenden
				$grid_next = 'preload'; // nächstes-variable zurücksetzen auf "preload" (damit ajax-success weiß, dass die gewünschte bereits angezeigt wird)
				$grid_curr = $grid;
			} else if ( $grid_next == 'preload' ) { // Wenn es kein nächstes gibt, aber das nächste bereits per ajax geladen wird ...
				$grid_next = false; // "preload" zurücksetzen, so dass ajax-success das neue Grid automatisch angezeigt
				return false; // abbrechen! (da anderer prozess bereits läuft)
			}
		} else if ( button == 'prev' ) { // Klick auf "Vorheriges" ...
		
			if ( typeof $grid_prev == 'object' ) { // Wenn es schon ein vorheriges gibt ...
				if ( typeof $grid_next == 'object' ) $grid_next.remove(); // ggf. nächstes löschen
				$grid_next = $grid.hide(); // aktuelles als nächstes speichern und ausblenden
				$grid = $grid_prev.show(); // vorheriges als aktuelles speichern und einblenden
				$grid_prev = 'preload'; // vorheriges-variable zurücksetzen auf "preload" (damit ajax-success weiß, dass die gewünschte bereits angezeigt wird)
				$grid_curr = $grid;
			} else if ( $grid_prev == 'preload' ) { // Wenn es kein nächstes gibt, aber das nächste bereits per ajax geladen wird ...
				$grid_prev = false; // "preload" zurücksetzen, so dass ajax-success das neue Grid automatisch angezeigt
				return false; // abbrechen! (da anderer prozess bereits läuft)
			}
		} else {
			reset_preload();
		}
		
		$( 'input, select', $grid ).each( function() { // Alle Selects und Input-Felder im aktuellen Grid durchlaufen ...
			var $field = $( this );
			if ( $field.attr( 'type' ) == 'checkbox' && $field.attr('checked') != true ) return; // keine nicht-gecheckten Checkboxen
			if ( $field.attr( 'type' ) == 'submit' ) return; // keine Submit-Buttons!
			if ( typeof $field.attr( 'name' ) == 'undefined' ) return; // keine Inputs oder Selects ohne name-Attribut!
			var name = $field.attr( 'name' );
			if ( name.slice( -2 ) == '[]' ) { // Arrays erkennen
				if ( typeof data[ name ] != 'object' ) {
					data[ name ] = [];
				}
				data[ name ].push( $field.val() );
			} else {
				data[ name ] = $field.val(); // name = value in data schreiben ...
			}
		} );
		
		refresh( $grid, data, button );
		return false;
	} );
}

///////////////////////////////////////////////////////////////////////////////
function refresh( $grid, data, button ) {

	$( '.loader', $grid ).css( 'visibility', 'visible' );
	// Neues Grid per AJAX laden ...
	$.ajax({
		type: 'POST',
		url: '?get=grid',
		data: data,
		dataType: 'html',
		complete: function() {
			$( '.loader' ).css( 'visibility', 'hidden' );
		},
		success: function( txt ) {
			
			$grid_old = $grid;
			
			if ( button == 'next' ) {
				if ( $grid_next == 'preload' ) {
					var load_type = 'preload';
				} else {
					var load_type = '';
				}
				
				$grid_next = $grid.after( txt ).next();
				
				set_grid_settings( $grid_next );
				
				if ( load_type == 'preload' ) {
					$grid.attr( 'flag_disabled', false );
					$grid_next.hide();
				} else {
					if ( typeof $grid_prev == 'object' ) {
						$grid_prev.remove();
						$grid_prev = false;
					}
					$grid_prev = $grid.hide();
					$grid = $grid_next;
					$grid_next = 'preload';
					data.page = String( parseInt( data.page ) + 1 );
					refresh( $grid, data, button );
				}
			} else if ( button == 'prev' ) {
				if ( $grid_prev == 'preload' ) {
					var load_type = 'preload';
				} else {
					var load_type = '';
				}
				
				$grid_prev = $grid.after( txt ).next();
				
				set_grid_settings( $grid_prev );
				
				if ( load_type == 'preload' ) {
					$grid.attr( 'flag_disabled', false );
					$grid_prev.hide();
				} else {
					if ( typeof $grid_next == 'object' ) {
						$grid_next.remove();
						$grid_next = false;
					}
					$grid_next = $grid.hide();
					$grid = $grid_prev;
					$grid_prev = 'preload';
					data.page = String( parseInt( data.page ) - 1 );
					refresh( $grid, data, button );
				}
			} else {
				
				$grid = $grid.after( txt ).next();
				
				set_grid_settings( $grid );
				
				$grid_old.hide( 0, function() {
					$( this ).remove();
				} );
				if ( typeof $grid_prev == 'object' ) {
					$grid_prev.remove();
				}
				if ( typeof $grid_next == 'object' ) {
					$grid_next.remove();
				}
				$grid_prev = false;
				$grid_next = false;
			}
		}
	});
}

///////////////////////////////////////////////////////////////////////////////
function reset_preload() {

	//console.log( 'reset' );
	if ( typeof $grid_prev == 'object' ) $grid_prev.remove();
	$grid_prev = false;
	if ( typeof $grid_next == 'object' ) $grid_next.remove();
	$grid_next = false;
}

///////////////////////////////////////////////////////////////////////////////
function check_click_all( obj ) { // Klick auf Checkbox im Header selektiert alle angezeigten Checkboxen

	var $table = $( obj.target ).parents( 'table:first' );
	$( 'tr', $table ).each( function() {
		$( 'td:first', this ).click();
	} );
}

///////////////////////////////////////////////////////////////////////////////
function check_click( obj ) { // Klick auf (selectable) Spalte ändert Checkbox-Status
	
	reset_preload();
	var $tr = $( obj.target ).parents( 'tr:first' );
	var $checkbox = $( 'input.check_row', $tr );
	var checkbox_state = !$checkbox.attr( 'checked' );
	$checkbox.attr( 'checked', checkbox_state );

	if ( checkbox_state ) {
		$tr.addClass( 'selected' );
	} else {
		$tr.removeClass( 'selected' );
	}
}
