// +------------------------------------------------------------------------------------+
// | jQuery plugin scrollTable                                                          |
// +------------------------------------------------------------------------------------+
// | @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/ |
// +------------------------------------------------------------------------------------+
// | <div id="myScroll">                                                                |
// |  <table>                                                                           |
// |   <thead>                                                                          |
// |    <tr>                                                                            |
// |     <th>Col1</th>                                                                  |
// |     <th>Col2</th>                                                                  |
// |    </tr>                                                                           |
// |   </thead>                                                                         |
// |   <tbody>                                                                          |
// |    <tr>                                                                            |
// |     <td>cel1</td>                                                                  |
// |     <td>cel2</td>                                                                  |
// |    </tr>                                                                           |
// |    (...)                                                                           |
// |   </tbody>                                                                         |
// |  </table>                                                                          |
// | </div>                                                                             |
// | $('div#myScroll').scrollTable()                                                    |
// +------------------------------------------------------------------------------------+
;(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);

