26 Nov 2011

SQL Pivot with dynamic columns


DECLARE @FromDate AS VARCHAR(20) = '21-Nov-2011 00:00:00'
DECLARE @ToDate AS VARCHAR(20) = '26-Nov-2011 23:59:59'
Declare @GuestHouseNo int=46

DECLARE @sql VARCHAR(max)=''
DECLARE @Columns VARCHAR(max)

SELECT @Columns = STUFF((SELECT     '],[' + CONVERT(VARCHAR(10), MR.ROOM_NO) + ' - ' + CONVERT(VARCHAR(100), MRB.MBed_Name)
                         FROM       MGuestHouse MGH
                         INNER JOIN Mroom MR ON MGH.GH_SRNO = MR.ROOM_GHOUSENO
                         INNER JOIN MroomBeds MRB ON MR.ROOM_SRNO = MRB.MBed_RoomSrno
                         WHERE      MGH.GH_SRNO = @GuestHouseNo
                         ORDER      BY MR.ROOM_NO
                         FOR XML path('')), 1, 2, '') + ']'

SET @sql += 'DECLARE @i AS INT=0; '
SET @sql += 'DECLARE @DT AS TABLE( '
SET @sql += 'Fdt DATETIME, '
SET @sql += 'Tdt DATETIME); '
SET @sql += 'WHILE @i < DATEDIFF(d, ''' + @FromDate + ''', ''' + @ToDate + ''') + 1 '
SET @sql += 'BEGIN '
SET @sql += 'INSERT INTO @DT '
SET @sql += 'VALUES      (DATEADD(d, @i, ''' + @FromDate + '''), '
SET @sql += 'CONVERT(VARCHAR(11), DATEADD(d, @i, ''' + @FromDate + '''), 106) + '' 23:59:59'' ) '
SET @sql += 'SET @i += 1 '
SET @sql += 'END; '
SET @sql+='select dt [Date], ' + @Columns + ' '
SET @sql+='from( '
SET @sql+='SELECT     CONVERT(VARCHAR(11), Fdt, 106) as DT '
SET @sql+=',CONVERT(VARCHAR(10), MRoom.ROOM_NO) + '' - '' + CONVERT(VARCHAR(100), MroomBeds.MBed_Name) AS [Room-Bed] '
SET @sql+=',CASE '
SET @sql+='WHEN TRB.trb_splroombyalloter = ''Y'' THEN (CASE '
SET @sql+='WHEN TRB.TRB_GUESTNAME IS NULL THEN ''Available'' '
SET @sql+='ELSE TRB.TRB_GUESTNAME '
SET @sql+='END + ''( '' + CASE TRB.trb_splroombyalloter '
SET @sql+='WHEN ''Y'' THEN ''*'' '
SET @sql+='ELSE '''' '
SET @sql+='END + '' ) '') '
SET @sql+='WHEN TRB.TRB_GUESTNAME IS NULL THEN ''Available'' '
SET @sql+='ELSE TRB.TRB_GUESTNAME '
SET @sql+='END AS GuestName '
SET @sql+=',Fdt,Tdt '
SET @sql+='FROM       MGuestHouse '
SET @sql+='INNER JOIN MRoom ON MGuestHouse.GH_SRNO = MRoom.ROOM_GHOUSENO '
SET @sql+='INNER JOIN MroomBeds ON MRoom.ROOM_SRNO = MroomBeds.MBed_RoomSrno '
SET @sql+='CROSS JOIN @DT '
SET @sql+='LEFT OUTER JOIN TRoomBooking TRB ON MroomBeds.MBed_srno = TRB.trb_bedno '
SET @sql+='AND TRB.TRB_FROMDATE BETWEEN fdt AND Tdt '
SET @sql+='AND TRB.TRB_TODATE BETWEEN Fdt AND Tdt '
SET @sql+='WHERE      MGuestHouse.GH_SRNO = '+ CAST(@GuestHouseNo as varchar) +' ) as MainTable '
SET @sql+='PIVOT (max(GuestName) FOR [Room-Bed] IN (' + @Columns + ')) AS PivotTable '

--print @sql
EXEC( @sql)

18 Nov 2011

Loop through textboxes in gridview using javascript

<script language="javascript" type="text/javascript">
            function Loop() {
                var grid = document.getElementById("<%=GridView1.ClientID%>");
                var inputs = grid.getElementsByTagName("input");
                for (var i = 0; i < inputs.length; i++) {
                    if (inputs[i].type == "text") {
                        if (inputs[i].value == "") {
                            if (inputs[i].name.indexOf("txtName") != -1) {
                                alert("Please Enter Name");
                                inputs[i].focus();
                                return false;
                            }
                        }
                    }
                }
            }
</script>

Check/uncheck CheckBox in a GridView using Javascript

Introduction

Check/uncheck CheckBox control inside a GridView using javascript without postback. This article will give an idea on how to achieve this task.

Some sample code is provided under Using the code heading and complete code is available in the project download.

Background

(Forums are flooded with the questions about how to check/uncheck CheckBox control inside a GridView using javascript without postback.

How To’s:

In this article a GridView control is used. Inside the GridView control there are 3 fields. One template field and two are bound fields to display some sample data.

Inside the TemplateField a CheckBox control is placed in the HeaderTemplate (with ID cbSelectAll and Text Select All), ItemTemplate and AlternatingItemTemplate.

Using the code

Code that will be required to achieve this task.
Javascript that will be required to perform the Select All action is as follow:
    <script type="text/javascript">
        function SelectAll(id)
        {
            //get reference of GridView control
            var grid = document.getElementById("<%= GridView1.ClientID %>");
            //variable to contain the cell of the grid
            var cell;
            
            if (grid.rows.length > 0)
            {
                //loop starts from 1. rows[0] points to the header.
                for (i=1; i<grid.rows.length; i++)
                {
                    //get the reference of first column
                    cell = grid.rows[i].cells[0];
                    
                    //loop according to the number of childNodes in the cell
                    for (j=0; j<cell.childNodes.length; j++)
                    {           
                        //if childNode type is CheckBox                 
                        if (cell.childNodes[j].type =="checkbox")
                        {
                        //assign the status of the Select All checkbox to the cell checkbox within the grid
                            cell.childNodes[j].checked = document.getElementById(id).checked;
                        }
                    }
                }
            }
        }
    </script>  
Code required to add an attribute of cbSelectAll CheckBox is as follow:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Binding GridView with the datasource

            //FillDataTable is a method that will return a DataTable
            //filled with some rows (code available in download)
            this.GridView1.DataSource = FillDataTable();
            this.GridView1.DataBind();
        }
    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        { 
            //Find the checkbox control in header and add an attribute
            ((CheckBox)e.Row.FindControl("cbSelectAll")).Attributes.Add("onclick", "javascript:SelectAll('" + 
                    ((CheckBox)e.Row.FindControl("cbSelectAll")).ClientID + "')");
        }
    }
Before clicking the Select All CheckBox
GridCheckBox
After clicking the Select All CheckBox
GridCheckBox

15 Nov 2011

AJAX Calander Extender - allow month and year selection

<cc1:CalendarExtender ID="ceFor" runat="server" Format="MMM-yyyy" PopupButtonID="imgFor"
                                           BehaviorID="calendar1" TargetControlID="txtFor" OnClientHidden="onCalendarHidden"  OnClientShown="onCalendarShown">
                                        </cc1:CalendarExtender>
                                        <script type="text/javascript">
                                            function onCalendarShown() {
                                                 var cal = $find("calendar1");
                                                 //Setting the default mode to month
                                                 cal._switchMode("months", true);
                                                 //Iterate every month Item and attach click event to it
                                                 if (cal._monthsBody) {
                                                     for (var i = 0; i < cal._monthsBody.rows.length; i++) {
                                                         var row = cal._monthsBody.rows[i];
                                                         for (var j = 0; j < row.cells.length; j++) {
                                                             Sys.UI.DomEvent.addHandler(row.cells[j].firstChild, "click", call);
                                                         }
                                                     }
                                                 }
                                             }
                                             function onCalendarHidden()
                                             {
                                                 var cal = $find("calendar1");
                                                 //Iterate every month Item and remove click event from it
                                                   if (cal._monthsBody) {
                                                     for (var i = 0; i < cal._monthsBody.rows.length; i++) {
                                                         var row = cal._monthsBody.rows[i];
                                                         for (var j = 0; j < row.cells.length; j++) {
                                                             Sys.UI.DomEvent.removeHandler(row.cells[j].firstChild,"click",call);
                                                         }
                                                     }
                                                 }
                                             }
                                             function call(eventElement)
                                            {
                                                var target = eventElement.target;
                                                switch (target.mode) {
                                                case "month":
                                                    var cal = $find("calendar1");
                                                    cal._visibleDate = target.date;
                                                    cal.set_selectedDate(target.date);
                                                    cal._switchMonth(target.date);
                                                    cal._blur.post(true);
                                                    cal.raiseDateSelectionChanged();
                                                    break;
                                                }
                                            }

                                        </script>

Get weeks in a year in SQL

WITH cteCalendar
AS (
    SELECT    DATEADD(DAY, DATEDIFF(DAY, 0, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 7 * Number)) / 7 * 7, 0) AS theMonday,
        1 + Number AS theWeek
    FROM    master..spt_values
    WHERE    Type = 'P'
        AND number BETWEEN 0 AND 52
)
SELECT        theWeek,
        theMonday,
        DATEADD(DAY, 6, theMonday) AS theSunday
FROM        cteCalendar
WHERE        2011 IN (DATEPART(YEAR, theMonday), DATEPART(YEAR, DATEADD(DAY, 6, theMonday)))
ORDER BY    theWeek

11 Nov 2011

Adding Row Number in SQL

SELECT ROW_NUMBER () OVER ( ORDER BY com_code )
       ,*
FROM   Mcompany

Search Whole Database SQL 2008

******************************************************************************/

DECLARE @searchFor VARCHAR(255)        SET @searchFor = '%AW999000%'

DECLARE @dbMask VARCHAR(255)           SET @dbMask = 'CGLHRIS'
DECLARE @includeUnderscoreTables BIT   SET @includeUnderscoreTables = 0

DECLARE @debug BIT                     SET @debug = 0

/*****************************************************************************/

SET NOCOUNT ON

-- Table that holds the list of tables to ignore
IF OBJECT_ID('tempdb..#ignore') IS NOT NULL DROP TABLE #ignore
CREATE TABLE #ignore (
    [TABLE_NAME] VARCHAR(255) PRIMARY KEY
    )

-- Populate ignore table
-- INSERT #ignore ([TABLE_NAME])

-- Results table
IF object_Id('tempDb..#found') IS NOT NULL DROP TABLE #found
CREATE TABLE #found (
    [databaseName] NVARCHAR(255)
    , [tableName] NVARCHAR(255)
    , [columnName] NVARCHAR(255)
    , [Id] NVARCHAR(255)
    , [value] NVARCHAR(MAX)
    )

-- SeachList
IF object_Id('tempDb..#searchList') IS NOT NULL DROP TABLE #searchList
CREATE TABLE #searchList (
    [TABLE_CATALOG] NVARCHAR(255)
    , [TABLE_SCHEMA] NVARCHAR(255)
    , [TABLE_NAME] NVARCHAR(255)
    , [COLUMN_NAME] NVARCHAR(255)
    , [COLLATION_NAME] NVARCHAR(255)
    , [DATA_TYPE] NVARCHAR(255)
    , [ID_FIELD] BIT DEFAULT 0
    )


-- Variables
DECLARE @sql NVARCHAR(MAX)
DECLARE @database VARCHAR(255)
DECLARE @tableName VARCHAR(255)
DECLARE @columnName VARCHAR(255)
DECLARE @schema VARCHAR(255)
DECLARE @dataType VARCHAR(255)
DECLARE @collation VARCHAR(255)
DECLARE @idField BIT
DECLARE @msgText VARCHAR(300)
DECLARE @now DATETIME


-- Populate the SearchList
DECLARE databaseCursor CURSOR LOCAL READ_ONLY FOR SELECT
    [name]
FROM
    sys.databases
WHERE
    [name] LIKE @dbMask

OPEN databaseCursor

    FETCH NEXT FROM databaseCursor INTO @database

    WHILE ( @@FETCH_STATUS = 0 ) BEGIN

        SET @msgText = 'Scanning ' + QUOTENAME(@database) + ' for target columns'
        RAISERROR(@msgText, 0, 1) WITH NOWAIT

        SET @sql = N'
        INSERT INTO #searchList (
            [TABLE_CATALOG]
            , [TABLE_SCHEMA]
            , [TABLE_NAME]
            , [COLUMN_NAME]
            , [COLLATION_NAME]
            , [DATA_TYPE]
            )
        SELECT
            QUOTENAME([TABLE_CATALOG])
            , QUOTENAME([TABLE_SCHEMA])
            , QUOTENAME([TABLE_NAME])
            , QUOTENAME([COLUMN_NAME])
            , [COLLATION_NAME]
            , [DATA_TYPE]
        FROM
            ' + QUOTENAME(@database) + '.information_schema.columns ic
        WHERE
            ic.[DATA_TYPE] IN (
                ''VARCHAR''
                , ''TEXT''
                , ''CHAR''
                , ''NVARCHAR''
                , ''NCHAR''
                , ''NTEXT''
            )

            AND (
                ic.[TABLE_NAME] NOT LIKE ''[_]%''
                OR @includeUnderscoreTables = 1
                )

            AND NOT EXISTS (
                SELECT 1
                FROM
                    #ignore i
                WHERE
                    i.[TABLE_NAME] = ic.[TABLE_NAME] COLLATE DATABASE_DEFAULT
                )

        UPDATE sl
        SET
            [ID_FIELD] = 1
        FROM
            #searchList sl
            JOIN ' + QUOTENAME(@database) + '.information_schema.columns isc ON
                QUOTENAME(isc.[TABLE_CATALOG]) = sl.[TABLE_CATALOG] COLLATE DATABASE_DEFAULT
                AND QUOTENAME(isc.[TABLE_SCHEMA]) = sl.[TABLE_SCHEMA] COLLATE DATABASE_DEFAULT
                AND QUOTENAME(isc.[TABLE_NAME]) = sl.[TABLE_NAME] COLLATE DATABASE_DEFAULT
                AND isc.[COLUMN_NAME] = ''Id'' COLLATE DATABASE_DEFAULT'

        IF @debug = 1 PRINT @sql

        EXEC sp_ExecuteSql
            @sql
            , N'@includeUnderscoreTables BIT
            , @database VARCHAR(255)'
            , @includeUNderscoreTables
            , @database

        FETCH NEXT FROM databaseCursor INTO @database
    END
CLOSE databaseCursor
DEALLOCATE databaseCursor

RAISERROR('', 0, 1) WITH NOWAIT

SET @msgText = 'Starting Search for string : ' + REPLACE(@searchFor, '%', '*')
RAISERROR(@msgText, 0, 1) WITH NOWAIT

RAISERROR('', 0, 1) WITH NOWAIT

-- Now serach through the list. This can take a while!
DECLARE searchCursor CURSOR LOCAL READ_ONLY FOR
SELECT
    [TABLE_CATALOG]
    , [TABLE_SCHEMA]
    , [TABLE_NAME]
    , [COLUMN_NAME]
    , [DATA_TYPE]
    , [COLLATION_NAME]
    , [ID_FIELD]
FROM
    #searchList
ORDER BY
    [TABLE_CATALOG]
    , [TABLE_SCHEMA]
    , [TABLE_NAME]
    , [COLUMN_NAME]

OPEN searchCursor

    FETCH NEXT FROM searchCursor INTO
        @database
        , @schema
        , @tableName
        , @columnName
        , @dataType
        , @collation
        , @IdField

    WHILE ( @@FETCH_STATUS = 0 ) BEGIN

        SET @now = GETDATE()
        SET @msgText =
            CONVERT(CHAR(11), @now, 106) + ' @ '
            + CONVERT(CHAR(8), @now, 108)
            + ' - Checking.... '
            + @database +
            '.'
            + @schema
            +
            '.'
            + @tableName
            + '.'
            + @columnName

        RAISERROR(@msgText, 0 , 1) WITH NOWAIT
           
        SET @sql = N'
        INSERT INTO #found (
            [databaseName]
            , [tableName]
            , [columnName]
            , [Id]
            , [value]
            )
        SELECT
            @database
            , @tableName
            , @columnName
            , ' + CASE @IdField WHEN 1 THEN '[Id]' ELSE 'NULL' END + '
            , ' + @columnName + '
        FROM
            ' + @database + '.' + @schema + '.' + @tableName + ' WITH (NOLOCK)
        WHERE
            ' + @columnName + ' LIKE @searchFor'

        -- Show and execute the sql
        IF @debug = 1 PRINT @sql

        EXEC sp_executeSql
            @sql
            , N'@database NVARCHAR(255)
            , @tableName NVARCHAR(255)
            , @columnName NVARCHAR(255)
            , @searchFor NVARCHAR(255)'
            , @database
            , @tableName
            , @columnName
            , @searchFor

        FETCH NEXT FROM searchCursor INTO
            @database
            , @schema
            , @tableName
            , @columnName
            , @dataType
            , @collation
            , @IdField

    END

CLOSE searchCursor
DEALLOCATE searchCursor

SELECT * FROM #found

7 Nov 2011

Sticky Table Headers using JQuery

<div style="width:3000px">
        some really really wide content goes here
    </div>        
    <table>
            <thead>
               <tr>
                    <th>
                        Full name
                    </th>
                    <th>
                        CCY
                    </th>
                    <th>
                        Last
                    </th>
                    <th>
                        +/-
                    </th>
                    <th>
                        %
                    </th>
                    <th>
                        Bid
                    </th>
                    <th>
                        Ask
                    </th>
                    <th>
                        Volume
                    </th>
                    <th>
                        Turnover
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>
                        A.P. Møller...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        33,220.00
                    </td>
                    <td>
                        760
                    </td>
                    <td>
                        2.34
                    </td>
                    <td>
                        33,140.00
                    </td>
                    <td>
                        33,220.00
                    </td>
                    <td>
                        594
                    </td>
                    <td>
                        19,791,910
                    </td>
                </tr>
                <tr>
                    <td>
                        A.P. Møller...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        34,620.00
                    </td>
                    <td>
                        640
                    </td>
                    <td>
                        1.88
                    </td>
                    <td>
                        34,620.00
                    </td>
                    <td>
                        34,700.00
                    </td>
                    <td>
                        9,954
                    </td>
                    <td>
                        346,530,246
                    </td>
                </tr>
                <tr>
                    <td>
                        Carlsberg A
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        380
                    </td>
                    <td>
                        0
                    </td>
                    <td>
                        0
                    </td>
                    <td>
                        371
                    </td>
                    <td>
                        391.5
                    </td>
                    <td>
                        6
                    </td>
                    <td>
                        2,280
                    </td>
                </tr>
                <tr>
                    <td>
                        Carlsberg B
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        364.4
                    </td>
                    <td>
                        8.6
                    </td>
                    <td>
                        2.42
                    </td>
                    <td>
                        363
                    </td>
                    <td>
                        364.4
                    </td>
                    <td>
                        636,267
                    </td>
                    <td>
                        228,530,601
                    </td>
                </tr>
                <tr>
                    <td>
                        Chr. Hansen...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        114.5
                    </td>
                    <td>
                        -1.6
                    </td>
                    <td>
                        -1.38
                    </td>
                    <td>
                        114.2
                    </td>
                    <td>
                        114.5
                    </td>
                    <td>
                        141,822
                    </td>
                    <td>
                        16,311,454
                    </td>
                </tr>
                <tr>
                    <td>
                        Coloplast B
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        809.5
                    </td>
                    <td>
                        11
                    </td>
                    <td>
                        1.38
                    </td>
                    <td>
                        809
                    </td>
                    <td>
                        809.5
                    </td>
                    <td>
                        85,840
                    </td>
                    <td>
                        69,363,301
                    </td>
                </tr>
                <tr>
                    <td>
                        D/S Norden
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        155
                    </td>
                    <td>
                        -1.5
                    </td>
                    <td>
                        -0.96
                    </td>
                    <td>
                        155
                    </td>
                    <td>
                        155.1
                    </td>
                    <td>
                        51,681
                    </td>
                    <td>
                        8,037,225
                    </td>
                </tr>
                <tr>
                    <td>
                        Danske Bank
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        69.05
                    </td>
                    <td>
                        2.55
                    </td>
                    <td>
                        3.83
                    </td>
                    <td>
                        69.05
                    </td>
                    <td>
                        69.2
                    </td>
                    <td>
                        1,723,719
                    </td>
                    <td>
                        115,348,068
                    </td>
                </tr>
                <tr>
                    <td>
                        DSV
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        105.4
                    </td>
                    <td>
                        0.2
                    </td>
                    <td>
                        0.19
                    </td>
                    <td>
                        105.2
                    </td>
                    <td>
                        105.4
                    </td>
                    <td>
                        674,873
                    </td>
                    <td>
                        71,575,035
                    </td>
                </tr>
                <tr>
                    <td>
                        FLSmidth &amp; Co.
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        295.8
                    </td>
                    <td>
                        -1.8
                    </td>
                    <td>
                        -0.6
                    </td>
                    <td>
                        295.1
                    </td>
                    <td>
                        295.8
                    </td>
                    <td>
                        341,263
                    </td>
                    <td>
                        100,301,032
                    </td>
                </tr>
                <tr>
                    <td>
                        G4S plc
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        22.53
                    </td>
                    <td>
                        0.05
                    </td>
                    <td>
                        0.22
                    </td>
                    <td>
                        22.53
                    </td>
                    <td>
                        22.57
                    </td>
                    <td>
                        190,920
                    </td>
                    <td>
                        4,338,150
                    </td>
                </tr>
                <tr>
                    <td>
                        Jyske Bank
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        144.2
                    </td>
                    <td>
                        1.4
                    </td>
                    <td>
                        0.98
                    </td>
                    <td>
                        142.8
                    </td>
                    <td>
                        144.2
                    </td>
                    <td>
                        78,163
                    </td>
                    <td>
                        11,104,874
                    </td>
                </tr>
                <tr>
                    <td>
                        Københavns ...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        1,580.00
                    </td>
                    <td>
                        -12
                    </td>
                    <td>
                        -0.75
                    </td>
                    <td>
                        1,590.00
                    </td>
                    <td>
                        1,620.00
                    </td>
                    <td>
                        82
                    </td>
                    <td>
                        131,110
                    </td>
                </tr>
                <tr>
                    <td>
                        Lundbeck
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        103.4
                    </td>
                    <td>
                        -2.5
                    </td>
                    <td>
                        -2.36
                    </td>
                    <td>
                        103.4
                    </td>
                    <td>
                        103.8
                    </td>
                    <td>
                        157,162
                    </td>
                    <td>
                        16,462,282
                    </td>
                </tr>
                <tr>
                    <td>
                        Nordea Bank
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        43.22
                    </td>
                    <td>
                        -0.06
                    </td>
                    <td>
                        -0.14
                    </td>
                    <td>
                        43.22
                    </td>
                    <td>
                        43.25
                    </td>
                    <td>
                        167,520
                    </td>
                    <td>
                        7,310,143
                    </td>
                </tr>
                <tr>
                    <td>
                        Novo Nordisk B
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        552.5
                    </td>
                    <td>
                        -3.5
                    </td>
                    <td>
                        -0.63
                    </td>
                    <td>
                        550.5
                    </td>
                    <td>
                        552.5
                    </td>
                    <td>
                        843,533
                    </td>
                    <td>
                        463,962,375
                    </td>
                </tr>
                <tr>
                    <td>
                        Novozymes B
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        805.5
                    </td>
                    <td>
                        5.5
                    </td>
                    <td>
                        0.69
                    </td>
                    <td>
                        805
                    </td>
                    <td>
                        805.5
                    </td>
                    <td>
                        152,188
                    </td>
                    <td>
                        121,746,199
                    </td>
                </tr>
                <tr>
                    <td>
                        Pandora
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        39.04
                    </td>
                    <td>
                        0.94
                    </td>
                    <td>
                        2.47
                    </td>
                    <td>
                        38.8
                    </td>
                    <td>
                        39.04
                    </td>
                    <td>
                        350,965
                    </td>
                    <td>
                        13,611,838
                    </td>
                </tr>
                <tr>
                    <td>
                        Rockwool In...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        492
                    </td>
                    <td>
                        0
                    </td>
                    <td>
                        0
                    </td>
                    <td>
                        482
                    </td>
                    <td>
                        492
                    </td>
                    <td></td>
                    <td></td>
                </tr>
                <tr>
                    <td>
                        Rockwool In...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        468
                    </td>
                    <td>
                        12
                    </td>
                    <td>
                        2.63
                    </td>
                    <td>
                        465.2
                    </td>
                    <td>
                        468
                    </td>
                    <td>
                        9,885
                    </td>
                    <td>
                        4,623,850
                    </td>
                </tr>
                <tr>
                    <td>
                        Sydbank
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        95
                    </td>
                    <td>
                        0.05
                    </td>
                    <td>
                        0.05
                    </td>
                    <td>
                        94.7
                    </td>
                    <td>
                        95
                    </td>
                    <td>
                        103,438
                    </td>
                    <td>
                        9,802,899
                    </td>
                </tr>
                <tr>
                    <td>
                        TDC
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        43.6
                    </td>
                    <td>
                        0.13
                    </td>
                    <td>
                        0.3
                    </td>
                    <td>
                        43.5
                    </td>
                    <td>
                        43.6
                    </td>
                    <td>
                        845,110
                    </td>
                    <td>
                        36,785,339
                    </td>
                </tr>
                <tr>
                    <td>
                        Topdanmark
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        854
                    </td>
                    <td>
                        13.5
                    </td>
                    <td>
                        1.61
                    </td>
                    <td>
                        854
                    </td>
                    <td>
                        855
                    </td>
                    <td>
                        38,679
                    </td>
                    <td>
                        32,737,678
                    </td>
                </tr>
                <tr>
                    <td>
                        Tryg
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        290.4
                    </td>
                    <td>
                        0.3
                    </td>
                    <td>
                        0.1
                    </td>
                    <td>
                        290
                    </td>
                    <td>
                        290.4
                    </td>
                    <td>
                        94,587
                    </td>
                    <td>
                        27,537,247
                    </td>
                </tr>
                <tr>
                    <td>
                        Vestas Wind...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        90.15
                    </td>
                    <td>
                        -4.2
                    </td>
                    <td>
                        -4.45
                    </td>
                    <td>
                        90.1
                    </td>
                    <td>
                        90.15
                    </td>
                    <td>
                        1,317,313
                    </td>
                    <td>
                        121,064,314
                    </td>
                </tr>
                <tr>
                    <td>
                        William Dem...
                    </td>
                    <td>
                        DKK
                    </td>
                    <td>
                        417.6
                    </td>
                    <td>
                        0.1
                    </td>
                    <td>
                        0.02
                    </td>
                    <td>
                        417
                    </td>
                    <td>
                        417.6
                    </td>
                    <td>
                        64,242
                    </td>
                    <td>
                        26,859,554
                    </td>
                </tr>
            </tbody>
        </table>
    <div style="height: 4000px">
        lots of content down here...
    </div>


$(function(){
    $("table").stickyTableHeaders();
});

(function ($) {
    $.StickyTableHeaders = function (el, options) {
        // To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;

        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;

        // Add a reverse reference to the DOM object
        base.$el.data('StickyTableHeaders', base);

        base.init = function () {
            base.options = $.extend({}, $.StickyTableHeaders.defaultOptions, options);

            base.$el.each(function () {
                var $this = $(this);
                $this.wrap('<div class="divTableWithFloatingHeader" style="position:relative"></div>');

                var originalHeaderRow = $('tr:first', this);
                originalHeaderRow.before(originalHeaderRow.clone());
                var clonedHeaderRow = $('tr:first', this);

                clonedHeaderRow.addClass('tableFloatingHeader');
                clonedHeaderRow.css('position', 'fixed');
                clonedHeaderRow.css('top', '0px');
                clonedHeaderRow.css('left', $this.css('margin-left'));
                clonedHeaderRow.css('display', 'none');

                originalHeaderRow.addClass('tableFloatingHeaderOriginal');

                // enabling support for jquery.tablesorter plugin
                $this.bind('sortEnd', function (e) { base.updateCloneFromOriginal(originalHeaderRow, clonedHeaderRow); });
            });

            base.updateTableHeaders();
            $(window).scroll(base.updateTableHeaders);
            $(window).resize(base.updateTableHeaders);
        };

        base.updateTableHeaders = function () {
            base.$el.each(function () {
                var $this = $(this);
                var $window = $(window);

                var fixedHeaderHeight = isNaN(base.options.fixedOffset) ? base.options.fixedOffset.height() : base.options.fixedOffset;

                var originalHeaderRow = $('.tableFloatingHeaderOriginal', this);
                var floatingHeaderRow = $('.tableFloatingHeader', this);
                var offset = $this.offset();
                var scrollTop = $window.scrollTop() + fixedHeaderHeight;
                var scrollLeft = $window.scrollLeft();

                if ((scrollTop > offset.top) && (scrollTop < offset.top + $this.height())) {
                    floatingHeaderRow.css('top', fixedHeaderHeight + 'px');
                    floatingHeaderRow.css('margin-top', 0);
                    floatingHeaderRow.css('left', (offset.left - scrollLeft) + 'px');
                    floatingHeaderRow.css('display', 'block');

                    base.updateCloneFromOriginal(originalHeaderRow, floatingHeaderRow);
                }
                else {
                    floatingHeaderRow.css('display', 'none');
                }
            });
        };

        base.updateCloneFromOriginal = function (originalHeaderRow, floatingHeaderRow) {
            // Copy cell widths and classes from original header
            $('th', floatingHeaderRow).each(function (index) {
                $this = $(this);
                var origCell = $('th', originalHeaderRow).eq(index);
                $this.removeClass().addClass(origCell.attr('class'));
                $this.css('width', origCell.width());
            });

            // Copy row width from whole table
            floatingHeaderRow.css('width', originalHeaderRow.width());
        };

        // Run initializer
        base.init();
    };

    $.StickyTableHeaders.defaultOptions = {
        fixedOffset: 0
    };

    $.fn.stickyTableHeaders = function (options) {
        return this.each(function () {
            (new $.StickyTableHeaders(this, options));
        });
    };

})(jQuery);