2 * File: FixedHeader.min.js
4 * Author: Allan Jardine (www.sprymedia.co.uk)
6 * Copyright 2009-2011 Allan Jardine, all rights reserved.
8 * This source file is free software, under either the GPL v2 license or a
9 * BSD (3 point) style license, as supplied with this software.
11 * This source file is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
15 var FixedHeader
=function(a
,c
){if("function"!=typeof this.fnInit
)alert("FixedHeader warning: FixedHeader must be initialised with the 'new' keyword.");else{var b
={aoCache
:[],oSides
:{top
:!0,bottom
:!1,left
:!1,right
:!1},oZIndexes
:{top
:104,bottom
:103,left
:102,right
:101},oMes
:{iTableWidth
:0,iTableHeight
:0,iTableLeft
:0,iTableRight
:0,iTableTop
:0,iTableBottom
:0},oOffset
:{top
:0},nTable
:null,bUseAbsPos
:!1,bFooter
:!1};this.fnGetSettings
=function(){return b
};this.fnUpdate
=function(){this._fnUpdateClones();this._fnUpdatePositions()};
16 this.fnPosition
=function(){this._fnUpdatePositions()};this.fnInit(a
,c
);if("function"==typeof a
.fnSettings
)a
._oPluginFixedHeader
=this}};
17 FixedHeader
.prototype={fnInit
:function(a
,c
){var b
=this.fnGetSettings(),d
=this;this.fnInitSettings(b
,c
);if("function"==typeof a
.fnSettings
){if("functon"==typeof a
.fnVersionCheck
&&!0!==a
.fnVersionCheck("1.6.0")){alert("FixedHeader 2 required DataTables 1.6.0 or later. Please upgrade your DataTables installation");return}var e
=a
.fnSettings();if(""!=e
.oScroll
.sX||
""!=e
.oScroll
.sY
){alert("FixedHeader 2 is not supported with DataTables' scrolling mode at this time");return}b
.nTable
=e
.nTable
;e
.aoDrawCallback
.push({fn
:function(){FixedHeader
.fnMeasure();
18 d
._fnUpdateClones
.call(d
);d
._fnUpdatePositions
.call(d
)},sName
:"FixedHeader"})}else b
.nTable
=a
;b
.bFooter
=0<$
(">tfoot",b
.nTable
).length?
!0:!1;b
.bUseAbsPos
=jQuery
.browser
.msie
&&("6.0"==jQuery
.browser
.version||
"7.0"==jQuery
.browser
.version
);b
.oSides
.top
&&b
.aoCache
.push(d
._fnCloneTable("fixedHeader","FixedHeader_Header",d
._fnCloneThead
));b
.oSides
.bottom
&&b
.aoCache
.push(d
._fnCloneTable("fixedFooter","FixedHeader_Footer",d
._fnCloneTfoot
));b
.oSides
.left
&&b
.aoCache
.push(d
._fnCloneTable("fixedLeft","FixedHeader_Left",
19 d
._fnCloneTLeft
));b
.oSides
.right
&&b
.aoCache
.push(d
._fnCloneTable("fixedRight","FixedHeader_Right",d
._fnCloneTRight
));FixedHeader
.afnScroll
.push(function(){d
._fnUpdatePositions
.call(d
)});jQuery(window
).resize(function(){FixedHeader
.fnMeasure();d
._fnUpdateClones
.call(d
);d
._fnUpdatePositions
.call(d
)});FixedHeader
.fnMeasure();d
._fnUpdateClones();d
._fnUpdatePositions()},fnInitSettings
:function(a
,c
){if("undefined"!=typeof c
){if("undefined"!=typeof c
.top
)a
.oSides
.top
=c
.top
;if("undefined"!=typeof c
.bottom
)a
.oSides
.bottom
=
20 c
.bottom
;if("undefined"!=typeof c
.left
)a
.oSides
.left
=c
.left
;if("undefined"!=typeof c
.right
)a
.oSides
.right
=c
.right
;if("undefined"!=typeof c
.zTop
)a
.oZIndexes
.top
=c
.zTop
;if("undefined"!=typeof c
.zBottom
)a
.oZIndexes
.bottom
=c
.zBottom
;if("undefined"!=typeof c
.zLeft
)a
.oZIndexes
.left
=c
.zLeft
;if("undefined"!=typeof c
.zRight
)a
.oZIndexes
.right
=c
.zRight
;if("undefined"!=typeof c
.offsetTop
)a
.oOffset
.top
=c
.offsetTop
}a
.bUseAbsPos
=jQuery
.browser
.msie
&&("6.0"==jQuery
.browser
.version||
"7.0"==jQuery
.browser
.version
)},
21 _fnCloneTable
:function(a
,c
,b
){var d
=this.fnGetSettings(),e
;if("absolute"!=jQuery(d
.nTable
.parentNode
).css("position"))d
.nTable
.parentNode
.style
.position
="relative";e
=d
.nTable
.cloneNode(!1);e
.removeAttribute("id");var f
=document
.createElement("div");f
.style
.position
="absolute";f
.style
.top
="0px";f
.style
.left
="0px";f
.className
+=" FixedHeader_Cloned "+a
+" "+c
;if("fixedHeader"==a
)f
.style
.zIndex
=d
.oZIndexes
.top
;if("fixedFooter"==a
)f
.style
.zIndex
=d
.oZIndexes
.bottom
;if("fixedLeft"==a
)f
.style
.zIndex
=d
.oZIndexes
.left
;
22 else if("fixedRight"==a
)f
.style
.zIndex
=d
.oZIndexes
.right
;e
.style
.margin
="0";f
.appendChild(e
);document
.body
.appendChild(f
);return{nNode
:e
,nWrapper
:f
,sType
:a
,sPosition
:"",sTop
:"",sLeft
:"",fnClone
:b
}},_fnMeasure
:function(){var a
=this.fnGetSettings(),c
=a
.oMes
,b
=jQuery(a
.nTable
),d
=b
.offset(),e
=this._fnSumScroll(a
.nTable
.parentNode
,"scrollTop");this._fnSumScroll(a
.nTable
.parentNode
,"scrollLeft");c
.iTableWidth
=b
.outerWidth();c
.iTableHeight
=b
.outerHeight();c
.iTableLeft
=d
.left
+a
.nTable
.parentNode
.scrollLeft
;
23 c
.iTableTop
=d
.top
+e
;c
.iTableRight
=c
.iTableLeft
+c
.iTableWidth
;c
.iTableRight
=FixedHeader
.oDoc
.iWidth
-c
.iTableLeft
-c
.iTableWidth
;c
.iTableBottom
=FixedHeader
.oDoc
.iHeight
-c
.iTableTop
-c
.iTableHeight
},_fnSumScroll
:function(a
,c
){for(var b
=a
[c];(a
=a
.parentNode
)&&!("HTML"==a
.nodeName||
"BODY"==a
.nodeName
);)b
=a
[c];return b
},_fnUpdatePositions
:function(){var a
=this.fnGetSettings();this._fnMeasure();for(var c
=0,b
=a
.aoCache
.length
;c
<b
;c
++)"fixedHeader"==a
.aoCache
[c].sType?
this._fnScrollFixedHeader(a
.aoCache
[c]):
24 "fixedFooter"==a
.aoCache
[c].sType?
this._fnScrollFixedFooter(a
.aoCache
[c]):"fixedLeft"==a
.aoCache
[c].sType?
this._fnScrollHorizontalLeft(a
.aoCache
[c]):this._fnScrollHorizontalRight(a
.aoCache
[c])},_fnUpdateClones
:function(){for(var a
=this.fnGetSettings(),c
=0,b
=a
.aoCache
.length
;c
<b
;c
++)a
.aoCache
[c].fnClone
.call(this,a
.aoCache
[c])},_fnScrollHorizontalRight
:function(a
){var c
=this.fnGetSettings(),b
=c
.oMes
,d
=FixedHeader
.oWin
,e
=FixedHeader
.oDoc
,f
=a
.nWrapper
,g
=jQuery(f
).outerWidth();d
.iScrollRight
<b
.iTableRight?
25 (this._fnUpdateCache(a
,"sPosition","absolute","position",f
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+b
.iTableWidth
-g
+"px","left",f
.style
)):b
.iTableLeft
<e
.iWidth
-d
.iScrollRight
-g?c
.bUseAbsPos?
(this._fnUpdateCache(a
,"sPosition","absolute","position",f
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",e
.iWidth
-d
.iScrollRight
-g
+"px","left",f
.style
)):(this._fnUpdateCache(a
,"sPosition","fixed",
26 "position",f
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
-d
.iScrollTop
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",d
.iWidth
-g
+"px","left",f
.style
)):(this._fnUpdateCache(a
,"sPosition","absolute","position",f
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+"px","left",f
.style
))},_fnScrollHorizontalLeft
:function(a
){var c
=this.fnGetSettings(),b
=c
.oMes
,d
=FixedHeader
.oWin
,e
=a
.nWrapper
,f
=jQuery(e
).outerWidth();d
.iScrollLeft
<b
.iTableLeft?
27 (this._fnUpdateCache(a
,"sPosition","absolute","position",e
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+"px","top",e
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+"px","left",e
.style
)):d
.iScrollLeft
<b
.iTableLeft
+b
.iTableWidth
-f?c
.bUseAbsPos?
(this._fnUpdateCache(a
,"sPosition","absolute","position",e
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+"px","top",e
.style
),this._fnUpdateCache(a
,"sLeft",d
.iScrollLeft
+"px","left",e
.style
)):(this._fnUpdateCache(a
,"sPosition","fixed","position",e
.style
),
28 this._fnUpdateCache(a
,"sTop",b
.iTableTop
-d
.iScrollTop
+"px","top",e
.style
),this._fnUpdateCache(a
,"sLeft","0px","left",e
.style
)):(this._fnUpdateCache(a
,"sPosition","absolute","position",e
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+"px","top",e
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+b
.iTableWidth
-f
+"px","left",e
.style
))},_fnScrollFixedFooter
:function(a
){var c
=this.fnGetSettings(),b
=c
.oMes
,d
=FixedHeader
.oWin
,e
=FixedHeader
.oDoc
,f
=a
.nWrapper
,g
=jQuery("thead",c
.nTable
).outerHeight(),h
=jQuery(f
).outerHeight();
29 d
.iScrollBottom
<b
.iTableBottom?
(this._fnUpdateCache(a
,"sPosition","absolute","position",f
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+b
.iTableHeight
-h
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+"px","left",f
.style
)):d
.iScrollBottom
<b
.iTableBottom
+b
.iTableHeight
-h
-g?c
.bUseAbsPos?
(this._fnUpdateCache(a
,"sPosition","absolute","position",f
.style
),this._fnUpdateCache(a
,"sTop",e
.iHeight
-d
.iScrollBottom
-h
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+"px","left",
30 f
.style
)):(this._fnUpdateCache(a
,"sPosition","fixed","position",f
.style
),this._fnUpdateCache(a
,"sTop",d
.iHeight
-h
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
-d
.iScrollLeft
+"px","left",f
.style
)):(this._fnUpdateCache(a
,"sPosition","absolute","position",f
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+h
+"px","top",f
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+"px","left",f
.style
))},_fnScrollFixedHeader
:function(a
){for(var c
=this.fnGetSettings(),b
=c
.oMes
,d
=FixedHeader
.oWin
,e
=
31 a
.nWrapper
,f
=0,g
=c
.nTable
.getElementsByTagName("tbody"),h
=0;h
<g
.length
;++h
)f
+=g
[h].offsetHeight
;b
.iTableTop
>d
.iScrollTop
+c
.oOffset
.top?
(this._fnUpdateCache(a
,"sPosition","absolute","position",e
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+"px","top",e
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+"px","left",e
.style
)):d
.iScrollTop
+c
.oOffset
.top
>b
.iTableTop
+f?
(this._fnUpdateCache(a
,"sPosition","absolute","position",e
.style
),this._fnUpdateCache(a
,"sTop",b
.iTableTop
+f
+"px","top",e
.style
),this._fnUpdateCache(a
,
32 "sLeft",b
.iTableLeft
+"px","left",e
.style
)):c
.bUseAbsPos?
(this._fnUpdateCache(a
,"sPosition","absolute","position",e
.style
),this._fnUpdateCache(a
,"sTop",d
.iScrollTop
+"px","top",e
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
+"px","left",e
.style
)):(this._fnUpdateCache(a
,"sPosition","fixed","position",e
.style
),this._fnUpdateCache(a
,"sTop",c
.oOffset
.top
+"px","top",e
.style
),this._fnUpdateCache(a
,"sLeft",b
.iTableLeft
-d
.iScrollLeft
+"px","left",e
.style
))},_fnUpdateCache
:function(a
,c
,b
,d
,e
){a
[c]!=b
&&(e
[d]=
33 b
,a
[c]=b
)},_fnCloneThead
:function(a
){var c
=this.fnGetSettings(),b
=a
.nNode
;for(a
.nWrapper
.style
.width
=jQuery(c
.nTable
).outerWidth()+"px";0<b
.childNodes
.length
;)jQuery("thead th",b
).unbind("click"),b
.removeChild(b
.childNodes
[0]);a
=jQuery("thead",c
.nTable
).clone(!0)[0];b
.appendChild(a
);jQuery("thead>tr th",c
.nTable
).each(function(a
){jQuery("thead>tr th:eq("+a
+")",b
).width(jQuery(this).width())});jQuery("thead>tr td",c
.nTable
).each(function(a
){jQuery("thead>tr td:eq("+a
+")",b
).width(jQuery(this).width())})},
34 _fnCloneTfoot
:function(a
){var c
=this.fnGetSettings(),b
=a
.nNode
;for(a
.nWrapper
.style
.width
=jQuery(c
.nTable
).outerWidth()+"px";0<b
.childNodes
.length
;)b
.removeChild(b
.childNodes
[0]);a
=jQuery("tfoot",c
.nTable
).clone(!0)[0];b
.appendChild(a
);jQuery("tfoot:eq(0)>tr th",c
.nTable
).each(function(a
){jQuery("tfoot:eq(0)>tr th:eq("+a
+")",b
).width(jQuery(this).width())});jQuery("tfoot:eq(0)>tr td",c
.nTable
).each(function(a
){jQuery("tfoot:eq(0)>tr th:eq("+a
+")",b
)[0].style
.width(jQuery(this).width())})},_fnCloneTLeft
:function(a
){var c
=
35 this.fnGetSettings(),b
=a
.nNode
,d
=$
("tbody",c
.nTable
)[0];for($
("tbody tr:eq(0) td",c
.nTable
);0<b
.childNodes
.length
;)b
.removeChild(b
.childNodes
[0]);b
.appendChild(jQuery("thead",c
.nTable
).clone(!0)[0]);b
.appendChild(jQuery("tbody",c
.nTable
).clone(!0)[0]);c
.bFooter
&&b
.appendChild(jQuery("tfoot",c
.nTable
).clone(!0)[0]);$
("thead tr",b
).each(function(){$
("th:gt(0)",this).remove()});$
("tfoot tr",b
).each(function(){$
("th:gt(0)",this).remove()});$
("tbody tr",b
).each(function(){$
("td:gt(0)",this).remove()});
36 this.fnEqualiseHeights("tbody",d
.parentNode
,b
);c
=jQuery("thead tr th:eq(0)",c
.nTable
).outerWidth();b
.style
.width
=c
+"px";a
.nWrapper
.style
.width
=c
+"px"},_fnCloneTRight
:function(a
){for(var c
=this.fnGetSettings(),b
=$
("tbody",c
.nTable
)[0],d
=a
.nNode
,e
=jQuery("tbody tr:eq(0) td",c
.nTable
).length
;0<d
.childNodes
.length
;)d
.removeChild(d
.childNodes
[0]);d
.appendChild(jQuery("thead",c
.nTable
).clone(!0)[0]);d
.appendChild(jQuery("tbody",c
.nTable
).clone(!0)[0]);c
.bFooter
&&d
.appendChild(jQuery("tfoot",c
.nTable
).clone(!0)[0]);
37 jQuery("thead tr th:not(:nth-child("+e
+"n))",d
).remove();jQuery("tfoot tr th:not(:nth-child("+e
+"n))",d
).remove();$
("tbody tr",d
).each(function(){$
("td:lt("+(e
-1)+")",this).remove()});this.fnEqualiseHeights("tbody",b
.parentNode
,d
);c
=jQuery("thead tr th:eq("+(e
-1)+")",c
.nTable
).outerWidth();d
.style
.width
=c
+"px";a
.nWrapper
.style
.width
=c
+"px"},fnEqualiseHeights
:function(a
,c
,b
){var d
=$
(a
+" tr:eq(0)",c
).children(":eq(0)"),e
=d
.outerHeight()-d
.height(),f
=$
.browser
.msie
&&("6.0"==$
.browser
.version||
"7.0"==
38 $
.browser
.version
);$
(a
+" tr",b
).each(function(b
){$
.browser
.mozilla||$
.browser
.opera?$
(this).children().height($
(a
+" tr:eq("+b
+")",c
).outerHeight()):$
(this).children().height($
(a
+" tr:eq("+b
+")",c
).outerHeight()-e
);f||$
(a
+" tr:eq("+b
+")",c
).height($
(a
+" tr:eq("+b
+")",c
).outerHeight())})}};FixedHeader
.oWin
={iScrollTop
:0,iScrollRight
:0,iScrollBottom
:0,iScrollLeft
:0,iHeight
:0,iWidth
:0};FixedHeader
.oDoc
={iHeight
:0,iWidth
:0};FixedHeader
.afnScroll
=[];
39 FixedHeader
.fnMeasure
=function(){var a
=jQuery(window
),c
=jQuery(document
),b
=FixedHeader
.oWin
,d
=FixedHeader
.oDoc
;d
.iHeight
=c
.height();d
.iWidth
=c
.width();b
.iHeight
=a
.height();b
.iWidth
=a
.width();b
.iScrollTop
=a
.scrollTop();b
.iScrollLeft
=a
.scrollLeft();b
.iScrollRight
=d
.iWidth
-b
.iScrollLeft
-b
.iWidth
;b
.iScrollBottom
=d
.iHeight
-b
.iScrollTop
-b
.iHeight
};FixedHeader
.VERSION
="2.0.6";FixedHeader
.prototype.VERSION
=FixedHeader
.VERSION
;
40 jQuery(window
).scroll(function(){FixedHeader
.fnMeasure();for(var a
=0,c
=FixedHeader
.afnScroll
.length
;a
<c
;a
++)FixedHeader
.afnScroll
[a]()});