//
// @author: Juarez Gonçalves Nery Junior - https://juareznjunior.wordpress.com
// @email: juareznjunior@gmail.com
// @license: CC Attribution 2.5 Brazil http://creativecommons.org/licenses/by/2.5/br/
//
;(function($){
    var create = {
        elem: false
        ,appendTo:false
        ,run: function() {
            var $elem = create.elem
            ,$append = create.appendTo
            ,$tr = $elem.find('tr');
            
            if ($tr.length > 0) {
                if ('' !== $elem[0].className) {
                    $append.addClass($elem[0].className);
                }
                $tr.each(function(){
                    var selfTR = this
                    ,tr = document.createElement('tr')
                    ,th = document.createElement('th');
                    
                    $(th).width(12).appendTo(selfTR);
                        
                    $(selfTR).find('th').each(function(){
                        $(this).css({
                            width: $(this).width()
                            ,backgroundColor: $(this).css('background-color')
                        }).clone(true).attr({
                            rowSpan: this.rowSpan,
                            colSpan: this.colSpan
                        }).appendTo(tr);
                    });
                    $(tr).appendTo($append);
                });
                
                if ('tfoot' === $elem[0].tagName.toLowerCase()) {
                    $elem.css('visibility',(($.browser.msie) ? 'hidden' : 'collapse'));
                }
            }
            
            create.elem = false;
            create.appendTo = false;
        }
    };                    
 
    $.fn.scrollTable = function(options){
        var options = $.extend({},$.fn.scrollTable.defaults,options);
        return this.each(function(){
            var $self = $(this)
            ,selfDOM = this;
 
            if (!$self.hasClass('hasGrid')) {
                $self.addClass('hasGrid').width('100%');
 
                var $TABLE = $self.find('table');
                
                if (0 === $TABLE.length) {
                    return;
                }
                
                $TABLE.width($self.width());
                
                var divHeader = document.createElement('div')
                ,divFooter = null
                ,$divHeader = $(divHeader).addClass('divHeader').append('<table><thead></thead></table>').insertBefore(selfDOM)
                ,$TABLE_THEAD = $TABLE.find('thead')
                ,$TABLE_TFOOT = $TABLE.find('tfoot')
                ,attrTable = {
                    cellSpacing: $TABLE.get(0).cellSpacing||'',
                    cellPadding: $TABLE.get(0).cellPadding||''
                };
                
                if ($TABLE_TFOOT.length) {
                    divFooter = document.createElement('div');
                    var $divFooter = $(divFooter).addClass('divFooter').append('<table><tfoot></tfoot></table>').insertAfter(selfDOM),
                    $TABLE_FOOTER_TFOOT = $divFooter.find('table').width($self.width()).attr(attrTable).find('tfoot');
                }
                
                var cpt = $('caption',$TABLE[0])
                ,$TABLE_HEADER_THEAD = $divHeader.find('table').each(function(){
                    if (cpt.length) {
                        $(this).append(cpt);
                    }
                }).attr(attrTable).width($self.width()).find('thead');
                
                // Create
                create.elem = $TABLE_THEAD;
                create.appendTo = $TABLE_HEADER_THEAD;
                create.run();
                if ($TABLE_TFOOT.length) {
                    create.elem = $TABLE_TFOOT;
                    create.appendTo = $TABLE_FOOTER_TFOOT;
                    create.run();
                }
                
                $self.css({
                    height: options.height
                    ,overflowY: 'scroll',overflowX: 'hidden'
                });
                
                var marginTop = 0;
                $TABLE_THEAD.each(function(){
                    marginTop += parseInt($(this).height())
                });
                
                $TABLE.css({marginTop: parseInt(marginTop+ 2)*(-1)});
                
                ($.isFunction(options.onComplete) && options.onComplete.call(selfDOM,divHeader,divFooter));
            };
        });
    };
    
    $.fn.scrollTable.defaults = {
        height:200
        ,onComplete:null
    };
})(jQuery);
