/*
	FD Grid 0.1
	
	Todo : Plusieurs sur la même page
*/
(function($){ 
     $.fn.extend({  
         fdGrid: function(options) { 
		 
			var defaults = {
				lang: 'fr',
				url: '',
				configUrl: '',
				rows: 25,                
				total: 0,                
				height: 'auto',          
				page: 1,                 
				data: {},  
				name: 'fdGrid',
				sortCols: ['auto'],      
				sortCol: 0,             
				sortOrder: 'asc',
				navBarFilterShow: 'always', // never|always;
				navBarShow: 'always',       // never|always; 
				navBarAlign: 'right',       // left|right|center; 
				navBarLocation: 'top',      // top|bottom; 
				selectorHeader: 'tr th',
				selectorFooter: null,
				filter: '',
				callback: null
			};
			var options = $.extend(defaults, options);
			
			switch(options.lang){
				case 'fr':
					var language = {
						msgLoading:          	    'En traitement, veuillez patientez...',
						msgLoadingPlugin:           '<span class="loadingPlugin">En traitement, veuillez patientez...</span>',
						msgStatusDispFromToTotal:   'Affichage {from} à {to} de {total}',
						msgStatusDispFromTo:        'Affichage {from} à {to}',
						msgPageOf:					'  de ',
						msgFilter:			        'Recherche  ',
						msgPage:				    'Page  '
					};
					break;
				case 'en':
					var language = {
						msgLoading:          	    'Loading, please wait...',
						msgLoadingPlugin:           '<span class="loadingPlugin">Loading, please wait...</span>',
						msgStatusDispFromToTotal:   'Display {from} to {to} of {total}',
						msgStatusDispFromTo:        'Display {from} to {to}',
						msgPageOf:					'  of ',
						msgFilter:			        'Search  ',
						msgPage:				    'Page  '
					};
					break;
				default:
					var language = {
						msgLoading:          	    'En traitement, veuillez patientez...',
						msgLoadingPlugin:           '<span class="loadingPlugin">En traitement, veuillez patientez...</span>',
						msgStatusDispFromToTotal:   'Affichage {from} à {to} de {total}',
						msgStatusDispFromTo:        'Affichage {from} à {to}',
						msgPageOf:					'  de ',
						msgFilter:			        'Recherche  ',
						msgPage:				    'Page  '
					};
					break;
			}
			var options = $.extend(language, options);
			
			return this.each(function() { 
                
				var cfg = $.extend(cfg, options);
				
				//Private options
				cfg.nbrPages = -1; 			
				cfg.navBarAdded = 'init';	// true|false|init; 
			
            	var obj = $(this); 
                obj.addClass('fdGrid');
			
				var m_content = $('<div />');
				
				var m_nav_bar = $('<div class="nav-toolbar" />');
				
				var m_rows = $('<select size="1" class="nav-rows"><option value="5">5</option><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select>').change( function() {
					cfg.rows = $(this).val();
					g.gotoPage(1);
				});
				
				var m_start_btn = $('<button type="button" class="nav-first"><br/></button>').click( function() {
					g.startPage();
				});	
			
				var m_prev_btn = $('<button type="button" class="nav-prev"><br/></button>').click( function() {
					g.prevPage();
				});
				
				var m_next_btn = $('<button type="button" class="nav-next"><br/></button>').click( function() {
					g.nextPage();
				});
			
				var m_last_btn = $('<button type="button" class="nav-last"><br/></button>').click( function() {
					g.lastPage();
				});		
			
				var m_page = $('<span class="nav-page">' + cfg.msgPage + '<input type="text" size="4" value="' + cfg.page + '" /></span>');
				m_page.find('input').bind('keypress blur', function(e) {
					if (e.type == 'keypress' && e.which != 13 && (e.which < 48 || e.which > 57)) 
					{
						e.preventDefault();
						return false;
					}
					if (e.type == 'keypress' && e.which == 13 || e.type == 'blur') 
					{
						var page = parseInt($(this).val());
						g.gotoPage(page);
					}	
				});
				
				var m_filter = $('<span class="nav-filter">' + cfg.msgFilter + '<input type="text" size="20" value="' + cfg.filter + '" /></span>');
				m_filter.find('input').bind('keypress', function(e) {
					if (e.type == 'keypress' && e.which == 13) 
					{
						var filter = $(this).val();
						cfg.filter = filter.toLowerCase();
						g.gotoPage(1);	
					}	
				});
				
				var m_delete_btn = $('<button type="button" class="nav-delete"><br/></button>').click( function() {
					m_filter.find('input').val('');
					cfg.filter = '';
					g.gotoPage(1);	
				});
				
				var m_split = $('<span class="grid-split" />');
				
				var m_reload_btn = $('<button type="button" class="nav-reload"><br/></button>').click( function() {
					g.update();
				});
				
				var m_status = $('<span class="nav-status">status</span>');
			
				var g = {
					init: function () {
						if (cfg.height == 'auto') {
							m_content.css({});
						} else {
							m_content.css({height: cfg.height, overflow: 'auto'});
						}
						obj.append(m_content);			
						m_content.html(cfg.msgLoadingPlugin);
						g.gotoPage(cfg.page);		
					},		
					gotoPage: function(page) {
						if (page > 0 && page <= cfg.nbrPages) {
							cfg.page = page;
						}
						m_page.find('input').val(cfg.page);
						g.update();	
					},
					nextPage: function() {
						if (cfg.navBarShow == 'always' || cfg.page + 1 <= cfg.nbrPages) {
							cfg.page = cfg.page + 1;
							g.gotoPage(cfg.page);
						}			
					},
					prevPage: function() {
						if (cfg.page - 1 > 0) {
							cfg.page = cfg.page - 1;
							g.gotoPage(cfg.page);
						}
			
					},
					startPage: function() {
						if (cfg.navBarShow == 'always' || cfg.nbrPages > 1) {
							cfg.page = 1;
							g.gotoPage(cfg.page);
						}
					},
					lastPage: function() {
						if (cfg.navBarShow == 'always' || cfg.nbrPages > 1) {
							cfg.page = cfg.nbrPages;
							g.gotoPage(cfg.page);
						}
					},
					updateTotal: function() {
						if (m_content.find('#fdGrid_total').length == 0) {
							cfg.total = -1;
							cfg.nbrPages = -1;
							return;
						}
						var total = m_content.find('#fdGrid_total').text();
						if (total == '') {
							cfg.total = -1;
							cfg.nbrPages = -1;
							return;				
						}
						cfg.total = parseInt(total);
						if (cfg.total > 0) {
							cfg.nbrPages = Math.ceil(cfg.total / cfg.rows);
						} else if (cfg.total == 0) {
							cfg.nbrPages = 1;
						} else {
							cfg.total = -1;
							cfg.nbrPages = -1;
						}
					},
					update: function(data) {
						var parms = {
							fdGrid_name: cfg.name,
							fdGrid_page: cfg.page,
							fdGrid_rows: cfg.rows,
							fdGrid_offset: (cfg.page - 1) * cfg.rows,
							fdGrid_sortCol: cfg.sortCol, 
							fdGrid_sortOrder: cfg.sortOrder,	
							fdGrid_filter: cfg.filter
						};
						
						if(data)	
							cfg.data = data;
						
						var header = m_content.find(cfg.selectorHeader);
						$.extend(parms, cfg.data);
				
						if(cfg.configUrl != ''){ 
							jQuery.ajax({
								url: cfg.configUrl,
								data: parms,
								async: false,
								type: 'POST',
								cache: false
							});
						}
						
						jQuery.ajax({
							url: cfg.url,
							data: parms,
							type: 'POST',
							cache: false,
							beforeSend: function(request) {
								m_reload_btn.removeClass('nav-reload');
								m_reload_btn.addClass('loading');
								m_reload_btn.attr('disabled', 'disabled');
								m_delete_btn.attr('disabled', 'disabled');
								m_next_btn.attr('disabled', 'disabled');
								m_last_btn.attr('disabled', 'disabled');
								m_prev_btn.attr('disabled', 'disabled');
								m_start_btn.attr('disabled', 'disabled');
								if (!($.browser.mozilla && $.browser.version.substr(0, 3) < '1.9')) { 
									m_rows.attr('disabled', 'disabled');
								}
								m_page.find('input').attr('disabled', 'disabled');
								m_filter.find('input').attr('disabled', 'disabled');
								//g.updateStatus(cfg.msgLoading);
							},
							success: function(result, status){
								m_content.html(result);
								g.updateTotal();
								g.updateHeader();
								g.updateNavBar();
								g.updateStatusDisplaying();
								if (cfg.callback) cfg.callback(g); 
							},
							error: function(request, status, error){
								var msg = '';
								if (status != undefined && status != 'error') {
									msg = status + '.';
								}
								if (error != undefined && error != 'error') {
									msg = error + '.';
								}
								m_content.html(msg);
							},
							complete: function(request, status){
								m_content.removeClass('loading');
								m_reload_btn.removeClass('loading');
								m_reload_btn.addClass('nav-reload');
								m_reload_btn.removeAttr('disabled');
								m_delete_btn.removeAttr('disabled');
								m_rows.removeAttr('disabled');
								m_page.find('input').removeAttr('disabled');
								m_filter.find('input').removeAttr('disabled');
							}
						});
					},
					updateStatus: function(status) {
						m_status.html(status);		
					},
					updateStatusDisplaying: function() {
						if (cfg.total > 0) {
							var disp = cfg.msgStatusDispFromToTotal;
						} 
						else {
							var disp = cfg.msgStatusDispFromTo;
						}
						var from = cfg.rows * (cfg.page - 1) + 1;
						var to = cfg.rows * cfg.page;
						if (cfg.total == 0) {
							from = 0;
							to = 0;
						} 
						else if (to > cfg.total && cfg.total != -1) {
							to = cfg.total;		
						}
						disp = disp.replace(/{from}/, from);
						disp = disp.replace(/{to}/, to);
						if (cfg.total > 0) {
							disp = disp.replace(/{total}/, cfg.total);
						}
						g.updateStatus(disp);
					},
					buildNavBar: function() {
						if (cfg.navBarShow == 'always') {
							m_rows.val(cfg.rows);
							if (m_rows.val() != cfg.rows) {
								m_rows.find('option').each( function(i) {
									if (cfg.rows < $(this).attr('value')) {
										$(this).before('<option value="' + cfg.rows + '">' + cfg.rows + '</option>');
										return(false); 
									}
								});
								m_rows.val(cfg.rows);
							}
							m_nav_bar.css('text-align', cfg.navBarAlign);
							if(cfg.navBarFilterShow == 'always') {
								m_nav_bar.append(m_filter);
								m_nav_bar.append(m_delete_btn);
								m_nav_bar.append(m_split.clone());
							}
							m_nav_bar.append(m_rows).append(m_split.clone());
							m_nav_bar.append(m_start_btn).append(m_prev_btn).append(m_split.clone());
							if (cfg.total > 0) {
								m_page.find('input').after(cfg.msgPageOf + '<span>' + cfg.nbrPages + '</span>');
							}
							m_nav_bar.append(m_page).append(m_split.clone());
							m_nav_bar.append(m_next_btn).append(m_last_btn).append(m_split.clone());
							m_nav_bar.append(m_reload_btn).append(m_split.clone());
							m_nav_bar.append(m_status);
							if (cfg.navBarLocation == 'top') {
								obj.prepend(m_nav_bar);
							} 
							else {
								obj.append(m_nav_bar);
							}
							cfg.navBarAdded = true;
						} 
						else {
							cfg.navBarAdded = false;
						}
					},		
					updateNavBar: function() {
						if (cfg.navBarAdded == 'init') {
							g.buildNavBar();			
						}
						if (!cfg.navBarAdded) {
							return false;
						}		
						m_page.find('span').html(cfg.nbrPages);
						var nbrRows = m_content.find('tr').length - 1; 
						if (cfg.selectorFooter != null) {
							nbrRows--;
						}
						if (nbrRows < cfg.rows) {
							m_next_btn.attr('disabled', 'disabled');				
							m_last_btn.attr('disabled', 'disabled');
						} 
						else if (cfg.navBarShow == 'always' && cfg.nbrPages == -1) {
							m_next_btn.removeAttr('disabled');
							m_last_btn.attr('disabled', 'disabled');
						} 
						else if (cfg.page + 1 > cfg.nbrPages) {
							if (cfg.nbrPages != -1) {
								m_next_btn.attr('disabled', 'disabled');
							}
							m_last_btn.attr('disabled', 'disabled');			
						} 
						else {
							m_next_btn.removeAttr('disabled');
							m_last_btn.removeAttr('disabled');				
						}
						if (cfg.page - 1 <= 0) {
							m_prev_btn.attr('disabled', 'disabled');
							m_start_btn.attr('disabled', 'disabled');
						} 
						else {
							m_prev_btn.removeAttr('disabled');
							m_start_btn.removeAttr('disabled');				
						}
					},
					updateHeader: function() {
						m_content.find(cfg.selectorHeader).each( function(i) {
							$(this).html('<span>' + $(this).html() + '</span>'); 
							var b_sortable = true;
							if ((cfg.sortCols[0] == 'auto' || $.inArray(i, cfg.sortCols) != -1) && i == cfg.sortCol) {
								(cfg.sortOrder == 'asc') ? $(this).addClass('sort-asc') : $(this).addClass('sort-desc');
							} 
							else if (cfg.sortCols[0] == 'auto' || $.inArray(i, cfg.sortCols) != -1) {
								$(this).addClass('sort-none');
							} 
							else {
								b_sortable = false;
							}
							if (b_sortable) {
								$(this).click( function(e) {
									if ($(e.target).is('input') || $(e.target).is('select')) {
										return(true); 
									}
									if ($(this).hasClass('sort-desc') || $(this).hasClass('sort-none')) {
										cfg.sortOrder = 'asc';
										cfg.sortCol = i;
									} 
									else if ($(this).hasClass('sort-asc')) {
										cfg.sortOrder = 'desc';
										cfg.sortCol = i;
									}
									$(this).addClass('sort-sorting');
									g.gotoPage(cfg.page);						
								});
							}
						});
					}
				};
			
				g.init();  
        	}); 
        } 
    }); 
})(jQuery); 