﻿/*
Built on jquery 1.4.2
Author: Jeff J. Crist
*/
(function($) {
    $(function() {
        function GetValueByType(val, column) {
            var td = document.createElement('td');
            switch (column.type) {
                case "date":
                    var reg = /\d+/;
                    var date = new Date(parseInt(reg.exec(val)[0]));
                    var formatDate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();
                    if (date < new Date()) {
                        $(td).addClass(column.passdueclass);
                    }
                    return $(td).append(formatDate);
                    break;
                case "url":
                    var a = document.createElement('a');
                    $(a).attr('href', column.url.replace(/{val}/, val));
                    $(a).html(val);
                    return $(td).append(a);
                    break;
                default:
                    return $(td).html(val);
                    break;
            }
        }

        function SortArray(array, c) {
            for (var i in c) {
                if (c[i].sort) {
                    switch (c[i].type) {
                        case ('date'):
                            var reg = /\d+/;
                            array = array.sort(function(a, b) {
                                var a_date = new Date(parseInt(reg.exec(eval("a." + c[i].name))));
                                var b_date = new Date(parseInt(reg.exec(eval("b." + c[i].name))));
                                if (a_date > b_date) return 1;
                                if (a_date < b_date) return -1;
                                return 0;
                            });
                            break;
                        case ('number'):
                            array = array.sort(function(a, b) { parseFloat(eval("a." + c[i].name)) - parseFloat(eval("b." + c[i].name)) });
                            break;
                        default:
                            array = array.sort(function(a, b) {
                                if (eval("a." + c[i].name) < eval("b." + c[i].name))
                                    return -1;
                                if (eval("a." + c[i].name) > eval("b." + c[i].name))
                                    return 1;
                                return 0;
                            });
                            break;
                    }
                    return (c[i].sort == 'desc') ? array.reverse() : array;
                }
            }
        }

        $.CreateTableFromJson = function(p, isDemo) {
            if (isDemo === true) {
                var homes = [
                                { "h_id": "3",
                                    "city": "Dallas",
                                    "state": "TX",
                                    "zip": "75201",
                                    "price": "162500",
                                    "date": "/Date(1625001)/"
                                },
                                { "h_id": "4",
                                    "city": "Bevery Hills",
                                    "state": "CA",
                                    "zip": "90210",
                                    "price": "319250",
                                    "date": "/Date(31925012)/"
                                },
                                { "h_id": "5",
                                    "city": "New York",
                                    "state": "NY",
                                    "zip": "00010",
                                    "price": "962500",
                                    "date": "/Date(962500123)/"
                                }
                            ];

                p = {
                    columns: [
                            { display: "ID", name: 'h_id', type: 'url', url: 'http://sw.formulaexpress.com?id={val}' },
                            { display: "Zip", name: 'zip' },
                            { display: "City", name: 'city' },
                            { display: "State", name: 'state', sort: 'asc' },
                            { display: "Price", name: 'price' },
                            { display: "Date", name: 'date', type: 'date', passdueclass: 'PastDueDate' }
                        ],
                    theme: 'default',
                    data: homes
                };
            }
            p = $.extend({
                theme: 'wideTable',
                nodatamsg: 'Sorry there was no data available.',
                rowPrefix: 'openRo'
            }, p);
            var array = typeof p.data != 'object' ? JSON.parse(p.data) : p.data;
            if (array && p.columns && array.length > 0)
                array = SortArray(array, p.columns);
            var g = {};
            g.t = document.createElement('table');
            g.thead = document.createElement('thead');
            g.tbody = document.createElement('tbody');
            g.tr = document.createElement('tr');
            g.th = document.createElement('th');
            g.td = document.createElement('td');

            $(g.t).addClass(p.theme);
            // table head
            var trh = $(g.tr).clone();
            if (p.columns) {
                for (var i in p.columns) {
                    var th = $(g.th).clone();
                    $(th).html(p.columns[i].display);
                    $(trh).append(th);
                }
            }
            else {
                for (var i in array[0]) {
                    var th = $(g.th).clone();
                    $(th).html(i);
                    $(trh).append(th);
                }
            }
            $(g.thead).append(trh);
            $(g.t).append(g.thead);

            // table body
            if (!array || array.length == 0) {
                $(g.td).attr('colspan', p.columns.length);
                $(g.td).html(p.nodatamsg);
                $(g.tr).append(g.td);
                $(g.tbody).append(g.tr);
                $(g.t).append(g.tbody);
            }
            // for every row in the array...
            if (array) {
                for (var row = 0; row < array.length; row++) {
                    var tr = $(g.tr).clone();
                    (row % 2 == 0) ? $(tr).addClass('odd') : $(tr).addClass('even');
                    $(tr).attr('id', p.rowPrefix + row);
                    //...read each column...
                    for (var column in array[row]) {
                        //...and for each column match it with the preference columns.
                        if (p.columns) {
                            for (var i in p.columns) {
                                if (column == p.columns[i].name)
                                    p.columns[i].value = GetValueByType(array[row][column], p.columns[i]);
                            }
                        }
                        //if there are no preferences, just output the raw data.
                        else {
                            var td = $(g.td).clone();
                            $(td).html(array[row][column]);
                            $(tr).append(td);
                        }
                    }
                    //order columns bassed on preference column order
                    for (var c in p.columns) {
                        $(tr).append(p.columns[c].value);
                        p.columns[c].value = '';
                    }
                    $(g.tbody).append(tr);
                }
            }
            $(g.t).append(g.tbody);
            return g.t;
        }
    });
})(jQuery);
