/*!
 * jQuery FixedTableHeader plugin
 *
 * Copyright 2014 Hung Nguyen
 *
 * Date: Tue Nov 4 2014 07:00:00 GMT
 */
/*jslint browser: true, nomen: true, unparam: true, node: true*/
/*global $, jQuery*/
'use strict';
(function ($) {
	
	var $fixedHeader;
	var $fixedButton;
	var $originalButton;
	var $originalHeader;
	var originalWidth = [];
	var $fixedFoot;
	var $originalFoot;
	var originalWidthFoot = [];
	
	var $tfootTop;
	var $theaderTop;

	var increase = 0;
	
	$.fn.fixedTableHeader = function () {
        return this.each(function (key, item) {
            var $self = $(this),
                $fixedHeader,
                $originalHeader,
                tableTopOffset,
                tableBottomOffset,
                headerHeight;
           
           var $fixedButton;
           var $originalButton;
           
           var $fixedFoot,
                $originalFoot,
                footHeight;
                
           if(typeof window !== 'undefined') 
           {
               // store navigator properties to use later
               var userAgent = 'navigator' in window && 'userAgent' in navigator && navigator.userAgent.toLowerCase() || '';
               var vendor = 'navigator' in window && 'vendor' in navigator && navigator.vendor.toLowerCase() || '';
               var appVersion = 'navigator' in window && 'appVersion' in navigator && navigator.appVersion.toLowerCase() || '';

               // is current browser chrome?
               if(/chrome|chromium/i.test(userAgent) && /google inc/.test(vendor))
           	   {
               	 	increase = 1;
           	   }
               else 
           	   {
               		increase = 0;
           	   }
           }
           
            if ($.isEmptyObject(originalWidth)) {
                $self.find('thead > tr > th').each(function (key, item) {
                    originalWidth.push($(item).width() + increase);
                });
            }
            
			if ($.isEmptyObject(originalWidthFoot)) {
			    $self.find('tfoot > tr > td').each(function (key, item) {
			        originalWidthFoot.push($(item).width() + increase);
			    });
			}

            function init() {
            	try
            	{
            	    $fixedHeader.empty();
            	    $fixedButton.empty();
            	}
            	catch(e){
        		}
                $originalHeader = $self.find('thead:first');
                $fixedHeader = $originalHeader.clone();
                $fixedHeader.css('position', 'fixed');
                $fixedHeader.css('display', 'none');
                
//                $originalButton = $('#headerPulsantiGestione').find('div');
//                $fixedButton = $('#headerPulsantiGestione').clone();
                var h = $('#headerPulsantiGestione').height();
//                var w = $('#headerPulsantiGestione').width();
//                $fixedButton.css('position', 'fixed');
//                $fixedButton.css('display', 'block');
//                $fixedButton.css('top', 0);
//                $fixedButton.css('padding-top', '5px');
//                $fixedButton.css('height', h + 2);
//                $fixedButton.css('z-index', 9999999999999999);
//                $fixedButton.css('width', w);
                
                $fixedHeader.css('top', h + 10);
                
//                var t = $('#headerPulsantiGestione').height();
//                $fixedHeader.css('top', t + 2);
                
                $fixedHeader.find("th").each(function (index) {           
					$(this).children("div").each(
					function(param) {
				    	var str = this.id;
					    if(!(str.lastIndexOf('FixHead') == str.length - 'FixHead'.length)) {
						    $(this).attr("id",this.id + "FixHead");
					    }
				    });
				});

				try
				{
				    $fixedFoot.empty();
				}
				catch(e){
				}
				$originalFoot = $self.find('tfoot:first');
				$fixedFoot = $originalFoot.clone();
				$fixedFoot.css('position', 'fixed');
				$fixedFoot.css('display', 'none');
				$fixedFoot.css('top', $(window).innerHeight() - ($originalFoot.height() + increase));
				
				
				$fixedFoot.find("td").each(function (index) {           
					$(this).children("div").each(
					function(param) {
				    	var str = this.id;
					    if(!(str.lastIndexOf('FixHead') == str.length - 'FixHead'.length)) {
						    $(this).attr("id",this.id + "FixHead");
					    }
				    });
				});

				onResize();
                $originalHeader.after($fixedHeader);
                $originalFoot.after($fixedFoot);
//                $originalButton.after($fixedButton);
                
//				$(window).unbind('scroll');
//				$(window).unbind('resize');
				$(window).resize(onResize);
				$(window).scroll(onScroll);
            }

            function left() {
                return parseInt($self.offset().left, 10) -  parseInt($(window).scrollLeft(), 10);
            }

            function onResize() {
                $fixedHeader.css('left', left());
                $fixedHeader.css('width', $self.find('thead').width()) + increase;
                $fixedHeader.find("th").each(function (index) {
                    originalWidth[index] = $originalHeader.find("th").eq(index).width() + increase;
                    $(this).css("min-width", $originalHeader.find("th").eq(index).width() + increase);
                    $(this).css("max-width", $originalHeader.find("th").eq(index).width() + increase);
                });
                
				$fixedFoot.css('left', left());
				$fixedFoot.css('width', $self.find('tfoot').width()) + increase;
				$fixedFoot.css('top', $(window).innerHeight() - ($originalFoot.height() + increase));
				$fixedFoot.find("td").each(function (index) {
					originalWidthFoot[index] = $originalFoot.find("td").eq(index).width() + increase;
					$(this).css("min-width", $originalFoot.find("td").eq(index).width() + increase);
                    $(this).css("max-width", $originalFoot.find("td").eq(index).width() + increase);
				});
				
				if ($('#headerPulsantiGestione').css("position") === "fixed") 
					$('#headerPulsantiGestione').css('left', left());
				else
					$('#headerPulsantiGestione').css('left', 0);
				
				$('#headerPulsantiGestione').css('width', $fixedHeader.width());
				var h = $('#headerPulsantiGestione').height();
				$fixedHeader.css('top', h + 10);
            }

            function onRename()
            {
            	var $self = $(this);
            	$originalHeader = $self.find('thead:first');
            	$fixedHeader = $originalHeader.clone();

            	onResize();
            }

            function onScroll() {
                tableTopOffset = $self.offset().top;
                headerHeight = $fixedHeader.find('tr').height();
                tableBottomOffset = tableTopOffset + $self.height() - headerHeight;

                if($fixedHeader != null)
                {
	                $fixedHeader.find('th').each(function (key, item) {
	                    $(item).css('min-width', parseInt(originalWidth[key], 10));
	                    $(item).css('max-width', parseInt(originalWidth[key], 10));
	                    $(item).css('z-index', 888);
	                });
	
	                $fixedHeader.css('left', left());
	                if ($(window).scrollTop() > tableTopOffset && $(window).scrollTop() < tableBottomOffset) {
	                    $fixedHeader.show();
	                    $('#headerPulsantiGestione').css('position', 'fixed');
	                    $('#headerPulsantiGestione').css('display', 'block');
	                    $('#headerPulsantiGestione').css('top', 0);
	                    $('#headerPulsantiGestione').css('left', left());
	                    $('#headerPulsantiGestione').css('width', $fixedHeader.width());
	                } else {
	                    $fixedHeader.hide();
	                    $('#headerPulsantiGestione').css('position', 'relative');
	                    $('#headerPulsantiGestione').css('left', 0);
	                }
                }
                
				if($fixedFoot != null)
				{
				    $fixedFoot.find('td').each(function (key, item) {
				        $(item).css('min-width', parseInt(originalWidthFoot[key], 10));
				        $(item).css('max-width', parseInt(originalWidthFoot[key], 10));
				    });
				
				    $fixedFoot.css('left', left());
				    var scrollBottom = $(window).scrollTop() + $(window).height();
				    
				    if (scrollBottom < tableBottomOffset) {
				        $fixedFoot.show();
				    } else {
				        $fixedFoot.hide();
				    }
				}
            }
            init();
        });
    };
    
	$.fn.fixedTableHeaderRename = function () {
		 return this.each(function (key, item) {
			var $self = $(this);
			$originalHeader = $self.find('thead:first');
			$fixedHeader = $originalHeader.clone();
			$fixedHeader.css('left', left());
	        $fixedHeader.css('width', $self.find('thead').width()) + increase;
	        $fixedHeader.find("th").each(function (index) {
	            originalWidth[index] = $originalHeader.find("th").eq(index).width() + increase;
	            $(this).css("min-width", $originalHeader.find("th").eq(index).width() + increase);
	            $(this).css("max-width", $originalHeader.find("th").eq(index).width() + increase);
	        });
	        
			function left() {
			    return parseInt($self.offset().left, 10) -  parseInt($(window).scrollLeft(), 10);
			}
		});
	};

}(jQuery));
