﻿function GlanceManager(startYear, endYear, currTerr) {
    if (startYear == null) return;
    if (endYear == null) return;
    if (currTerr == null) return;

    // Constant & parameters
    this.getStartYear = function() {
        return typeof (startYear) == 'string' ? parseInt(startYear) : startYear;
    }
    this.getEndYear = function() {
        return typeof (endYear) == 'string' ? parseInt(endYear) : endYear;
    } 
    this.getGlanceTableId = function() {
        return 100;
    }

    // Object state
    this.currSerie = null;
    this.currSerieId = null;
    this.currSerieName = null;
    this._currDate = null;
    this.currUserDate = null;
    this.currFreq = FrequencyEnum.year;
    this.currYear = endYear;
    this.currTerr = 20;
    this.currSeasonallyAdjusted = false;
    this.currTableSelectedRow = -1;
    this.currTableSelectedCol = -1;
    this.keepMap = false;
    this.loadBlocked = false;

    // Properties
    this.getCurrDate = function() {
        return this._currDate;
    };

    this.setCurrDate = function(value) {
        // Change current year
        if( value != null )
            this.currYear = parseInt(value.substring(1, 5));

        this._currDate = value;
    };


    // Auxiliary methods
    this.setDefaultComboValues = function() {
        var c = document.getElementById("slFreq");
        if (c) document.getElementById("slFreq").selectedIndex = 0;
        c = document.getElementById("slArea");
        if (c) document.getElementById("slArea").selectedIndex = 0;
    };
    
    this.sorry = function() {
        alert("The page is under construction");
    };

    this.printPage = function() {
        sorry();
    };

    this.getCurrentSpan = function() {
        var begin, end;
        if (this.currFreq == FrequencyEnum.year) {
            begin = "Y" + year[currTerr].begin;
            end = "Y" + year[currTerr].end;
        } else if (this.currFreq == FrequencyEnum.month) {
            begin = "M" + month[currTerr].begin;
            end = "M" + month[currTerr].end;
        } else if (this.currFreq == FrequencyEnum.quarter) {
            begin = "Q" + quart[currTerr].begin;
            end = "Q" + quart[currTerr].end;
        }
        /*if (this.currFreq == FrequencyEnum.year) {
        begin = "Y" + this.getStartYear() + "-01-01";
        end = "Y" + this.getEndYear() + "-01-01";
        } else if (this.currFreq == FrequencyEnum.month) {
        begin = "M" + this.currYear + "-01-01";
        end = "M" + this.currYear + "-12-01";
        } else if (this.currFreq == FrequencyEnum.quarter) {
        if (this.currYear > this.getStartYear())
        begin = "Q" + (this.currYear - 1) + "-07-01";
        else
        begin = "Q" + this.currYear + "-01-01";

            if (this.currYear < this.getEndYear()) 
        end = "Q" + (this.currYear + 1) + "-04-01";
        else
        end = "Q" + this.currYear + "-10-01";
        }*/
        return { begin: begin, end: end };
    }

    this.getTableQuery = function() {
        url = "./TableData.ashx";
        url += "?table=" + this.getGlanceTableId();

        url += "&freq=" + this.currFreq;

        var span = this.getCurrentSpan();
        url += "&begin=" + span.begin;
        url += "&end=" + span.end;

        url += "&terr=" + this.currTerr;
        url += "&sadj=" + (this.currSeasonallyAdjusted ? "1" : "0");

        return url;
    };

    this.loadTable = function(keepMap) {
        if (this.loadBlocked) return;
        this.loadBlocked = true;
        WaitingIndicator.showWaiting();

        var wRequest = new Sys.Net.WebRequest();
        wRequest.set_httpVerb("GET");
        wRequest.set_url(this.getTableQuery());
        wRequest.add_completed(this.onLoadTable);
        this.keepMap = keepMap ? true : false;
        wRequest.invoke();
    };

    this.getTablePlaceHolder = function() {
        return document.getElementById("TablePlace");
    };

    this.getTableElement = function() {
        var cnt = document.getElementById("DataTableContainer");
        return cnt.getElementsByTagName("table")[0];
    };
    
    this.getTableXml = function() {
        var data = document.getElementById("DataTableContainer_data");
        if (data == null) return null;
        return data.getAttribute("data");
    };

    this.getTopChartData = function() {
        var span = this.getCurrentSpan();
        var data = {
            header: this.currSerieName,
            serie: this.currSerie,
            start: span.begin,
            end: span.end,
            terrId: this.currTerr,
            freq: this.currFreq
        };

        return data;
    };

    this.getBottomChartData = function() {
        var data = {
            header: this.currSerieName,
            serie: this.currSerie,
            date: this.getCurrDate(),
            freq: this.currFreq
        }
        
        return data;
    };

    this.getGlanceMapData = function() {
        var data = {
            serie: this.currSerie,
            date: this.getCurrDate()
        }

        return data;
    };

    this.fixFusionUnloadHandler = function() {
        var script = "if(window.onunload != null){window.onunload = null;}";
        eval(script);
        setTimeout(script, 500);
    };

    this._getColumnSelector = function() {
        var c = document.getElementById("ColumnArrow");
        return c;
    };

    this._selectTableColumn = function(colNumber) {
        if( colNumber < 0 ) return;
        var table = this.getTableElement();

        var headerCells = table.rows.item(0).cells;
        var cell = headerCells.item(colNumber);

        var left = cell.offsetLeft;
        var offParent = cell.offsetParent;
        while (offParent != null && offParent.tagName.toUpperCase() != "TABLE") {
            left += offParent.offsetLeft;
            offParent = offParent.offsetParent;
        }

        var c = this._getColumnSelector();
        var w = Math.round(cell.offsetWidth / 2);
        c.style.display = "block";
        c.style.left = (left + w + 12) + "px";
    };

    this.updateTableSelection = function() {
        var table = this.getTableElement();
        var rows = table.rows;
        for (var i = 1; i < rows.length; i++) {
            var cells = rows.item(i).cells;
            for (var j = 0; j < cells.length; j++) {
                cells.item(j).className = (i == this.currTableSelectedRow) ? "Selected" : "Unselected";
            }
        }
        this._selectTableColumn(this.currTableSelectedCol);
    };
    
    this.clearTable = function() {
        var table = this.getTableElement();
        var rows = table.rows;
        for (var i = 0; i < rows.length; i++) {
            var cells = rows.item(i).cells;
            for (var j = 0; j < cells.length; j++) {
                cells.item(j).className = "Unselected";
            }
        }
    };

    this.displayDialog = function(sURL, height, width) {
        var iDialogHeight = height;
        var iDialogWidth = width;
        var iDialogScreenX = (window.screen.width - iDialogWidth) / 2.0;
        var iDialogScreenY = (window.screen.height - iDialogHeight) / 2.0;
        var sDialogSpec = "alwaysRaised=1,height=" + iDialogHeight +
		    ",width=" + iDialogWidth + ",left=" + iDialogScreenX +
		    ",resizable=0,screenX=" + iDialogScreenX +
		    ",screenY=" + iDialogScreenY + ",top=" + iDialogScreenY +
		    ",scrollbars=1,status=0,titlebar=0";
        var childWindow;
        childWindow = window.open(sURL, "Dialog", sDialogSpec);
        childWindow.focus();
    };

    this.onSourceButtonClick = function(event, serId, terrId) {
        var url;

        switch (this.currFreq) {
            case FrequencyEnum.year:
                url = "?freq=1";
                url += "&fromYear=" + this.getStartYear();
                url += "&toYear=" + this.getEndYear();
                break;
            case FrequencyEnum.quarter:
                url = "?freq=3";
                url += "&fromYear=" + this.currYear;
                url += "&fromQtr=1";
                url += "&toYear=" + this.currYear;
                url += "&toQtr=4";
                break;
            case FrequencyEnum.month:
                url = "?freq=4";
                url += "&fromYear=" + this.currYear;
                url += "&fromMth=1";
                url += "&toYear=" + this.currYear;
                url += "&toMth=12";
                break;
        }

        url += "&area=" + this.currTerr;
        url += "&areaTo=-1";
        url += "&ser1=" + serId; //this.currSerieId;
        url += "&chartType=7&pok=0&twin=1";

        // Show dialog
        this.displayDialog("Info.aspx" + url, 400, 500);
    }

    this.selectTableRow = function(doc, serId, rowNumber) {
        var rows = XmlHelper.selectNodes(doc, "/datatable/parts/part/row");
        var row = rows[0];
        for (var i = 0; i < rows.length; i++) {
            if (rows[i].getAttribute("id") == serId) {
                row = rows[i];
                break;
            }
        }
        this.currSerieId = row.getAttribute("serie");
        this.currSerie = row.getAttribute("id");
        this.currSerieName = row.getAttribute("basic") == "" ?
                    row.getAttribute("name") : row.getAttribute("basic");
        //this.selectTableRow(rowNumber + 1);
        this.currTableSelectedRow = rowNumber + 1;
        this.updateTableSelection();

        BottomChart.loadChart(this.getBottomChartData(), true);
        TopChart.loadChart(this.getTopChartData(), true);
        GlanceMap.loadMap(this.getGlanceMapData());
        this.fixFusionUnloadHandler();
    };
 
    this.onDateColumnClick = function(event, date, colNumber, userDate) {
        this.currUserDate = userDate;

        var xml = this.getTableXml();
        if (xml != null) {
            this.setCurrDate(date);
            Manager.setHeader(Manager.buildSerieNameUserDateHeader());
            
            //this.selectTableColumn(colNumber + 2);
            this.currTableSelectedCol = colNumber + 2;
            this.updateTableSelection();

            BottomChart.loadChart(this.getBottomChartData(), true);
            GlanceMap.loadMap(this.getGlanceMapData());
            this.fixFusionUnloadHandler();
        }
    };

    this.onSerieRowClick = function(event, serId, rowNumber) {
        var xml = this.getTableXml();
        if (xml != null) {
            var doc = XmlHelper.getDocument(xml);
            this.selectTableRow(doc, serId, rowNumber);
        }
    };

    this.getExportForm = function() {
        return document.getElementById("expData");
    };

    this.getSubheader = function() {
        var c = document.getElementById("ContentSubheader");
        return c.innerHTML; 
    };

    this.setSubheader = function(value) {
        var c = document.getElementById("ContentSubheader");
        c.innerHTML = value;
    };

    this.buildSerieNameUserDateHeader = function() {
        return this.currSerieName + ", " + this.currUserDate ;
    };

    this.getHeader = function() {
        var c = document.getElementById("ContentHeader");
        return c.innerHTML;
    };

    this.setHeader = function(value) {
        var c = document.getElementById("ContentHeader");
        c.innerHTML = value;
    };

    this.buildHeader = function() {
        return "Statewide";
    };

    this.exportPage = function(format, target) {
        if (format == null) format = "rtf";

        var xml = this.getTableXml();
        var topXml = TopChart.xmlData;
        var bottomXml = BottomChart.xmlData;
        var mapXml = GlanceMap.xmlData;

        if (xml == null || topXml == null || bottomXml == null || mapXml == null) {
            if (format != "htm") alert("Can't export");
            else alert("Can't print");
            return;
        }

        var c = this.getExportForm();
        c.value = xml.replace(/&/img, "%26");

        c = document.getElementById("expFormat");
        c.value = format;

        c = document.getElementById("expSerieName");
        c.value = this.getSubheader();

        c = document.getElementById("expTerrName");
        c.value = this.getHeader();

        c = document.getElementById("expTopXml");
        c.value = topXml.replace(/&/img, "%26");
        c = document.getElementById("expTopSwf");
        c.value = TopChart.swfFile;
        c = document.getElementById("expTopWidth");
        c.value = TopChart.chartWidth;
        c = document.getElementById("expTopHeight");
        c.value = TopChart.chartHeight;

        c = document.getElementById("expBottomXml");
        c.value = bottomXml.replace(/&/img, "%26");
        c = document.getElementById("expBottomSwf");
        c.value = BottomChart.swfFile;
        c = document.getElementById("expBottomWidth");
        c.value = BottomChart.chartWidth;
        c = document.getElementById("expBottomHeight");
        c.value = BottomChart.chartHeight;

        // Map export
        //debugger;
        c = document.getElementById("expMapXml");
        c.value = mapXml.replace(/&/img, "%26");
        c = document.getElementById("expMapSwf");
        c.value = "maps/Usa_hawaii4.swf";
        c = document.getElementById("expMapWidth");
        c.value = "400";
        c = document.getElementById("expMapHeight");
        c.value = GlanceMap.mapHeight;

        c = document.getElementById("ExportForm");
        //c.target = format == "htm" ? "_blank" : "_self";
        c.target = target == null ? "_self" : target;
        c.submit();
    };

    /*
    this.loadMap = function() {
        var wRequest = new Sys.Net.WebRequest();
        wRequest.set_httpVerb("GET");
        wRequest.set_url(this.getTableQuery());
        wRequest.add_completed(this.onLoadTable);
        wRequest.invoke();
    };
    */

    this.hide = function() {
        this.setCurrDate(null);
        
        var header = document.getElementById("TableHeader");
        if (header) {
            header.innerHTML = "";
        }
    };

    this.checkPresence = function(xmlDoc) {
        //debugger;
        if (this.currSerie == null) return;

        var nodes = XmlHelper.selectNodes(xmlDoc, "/datatable/parts/part/row");
        var length = nodes.length;
        var node;
        for (var i = 0; i < length; i++) {
            node = nodes[i];
            if (node.getAttribute("id") == this.currSerie) {
                this.currTableSelectedRow = i+1;
                return;
            }
        }

        // Select different row
        if (nodes.length == 0) {
            this.hide();
        } else {
            var targetRowId = nodes[0].getAttribute("id");
            this.selectTableRow(xmlDoc,targetRowId, 0);
            this.setHeader(this.buildSerieNameUserDateHeader());
        }
    };

    // Control events
    this.window_OnResize = function(){
        this._selectTableColumn(this.currTableSelectedCol);
    };
    
    this.slFreq_OnChange = function(sender) {

        // Clear selection
        Manager.setCurrDate(null);
        //Manager.currYear = Manager.getEndYear();

        // Change frequency
        var value = parseInt(sender.value);
        switch (value) {
            case 0: Manager.currFreq = FrequencyEnum.year; break;
            case 1: Manager.currFreq = FrequencyEnum.quarter; break;
            case 2: Manager.currFreq = FrequencyEnum.month; break;
        }

        // Refresh our table
        Manager.loadTable();
    };

    this.slArea_OnChange = function(sender) {
        var value = parseInt(sender.value);

        this.currTerr = value;

        // Refresh our table
        Manager.loadTable(true);
    };

    this.onClickMapRegion = function(terrId) {
        var value = parseInt(terrId);

        var c = document.getElementById("slArea");
        var opts = c.options;
        for (var i = 0; i < opts.length; i++) {
            if (parseInt(opts.item(i).value) == value) {
                c.selectedIndex = i;
                break;
            }
        }
        this.currTerr = value;

        Manager.loadTable();
    };

    // Ajax events
    this.onLoadTable = function(executor, eventArgs) {
        try {
            //debugger;
            // Place table on the page
            if (executor.get_responseAvailable()) {
                var tableData = executor.get_responseData();

                var tablePlace = Manager.getTablePlaceHolder();
                tablePlace.innerHTML = tableData;
            }

            var xml = Manager.getTableXml();

            if (xml != null) {
                //debugger;
                // Change page state according new table
                var doc = XmlHelper.getDocument(xml);
                Manager.checkPresence(doc);

                var root = XmlHelper.selectNodes(doc, "/datatable");
                //Manager.setHeader(root[0].getAttribute("terr"));

                var rows = XmlHelper.selectNodes(doc, "/datatable/parts/part/row");
                var row = rows[0];
                if (!Manager.keepMap) {
                    Manager.currSerieId = row.getAttribute("serie");
                    Manager.currSerie = row.getAttribute("id");
                    var title = row.getAttribute("name");
                    if (row.getAttribute("units") != "") {
                        title += " (" + row.getAttribute("units") + ")";
                    }
                    Manager.currSerieName = row.getAttribute("basic") == "" ?
                    title : row.getAttribute("basic");

                    Manager.currTableSelectedRow = 1;
                }
                if (Manager.getCurrDate() == null) {
                    var dates = XmlHelper.selectNodes(doc, "/datatable/columns/cl");
                    //debugger;
                    var dateColumn = 0;
                    for (var i = 0; i < rows.length; i++) {
                        //var cells = rows[i].childNodes;
                        var cells = XmlHelper.selectNodes(doc, "/datatable/parts/part/row[@id='" + rows[i].getAttribute("id") + "']/c");

                        for (var j = 0; j < cells.length; j++) {
                            if (cells[j].getAttribute("value") != "") {
                                dateColumn = j > dateColumn ? j : dateColumn;
                            }
                        }
                    }
                    Manager.currTableSelectedCol = dateColumn + 2;
                    Manager.setCurrDate(dates[dateColumn].getAttribute("dateid"));
                    Manager.currUserDate = dates[dateColumn].getAttribute("name");
                }
                //}
                Manager.updateTableSelection();

                // Update table header
                var header = document.getElementById("TableHeader");
                if (header && typeof ("TerrDimension") != 'undefined') {
                    var n = TerrDimension[Manager.currTerr];
                    if (n != null)
                        header.innerHTML = n.name + " At a Glance";
                    TopChart.setVisible(true);
                    BottomChart.setVisible(true);
                }


                TopChart.loadChart(Manager.getTopChartData(), true);
                BottomChart.loadChart(Manager.getBottomChartData(), true);
                if (!Manager.keepMap)
                    GlanceMap.loadMap(Manager.getGlanceMapData());
                Manager.setHeader(Manager.buildSerieNameUserDateHeader());

                Manager.fixFusionUnloadHandler();
            } else {
                Manager.hide();
                TopChart.setVisible(false);
                BottomChart.setVisible(false);
            }
        } finally {
            Manager.loadBlocked = false;
            WaitingIndicator.hideWaiting();
        }
    };

}

var Manager = null;

///////////////////////////////////////////
//
//            Auxiliary functions
//
///////////////////////////////////////////
function printPage(windowName) {
    Manager.exportPage("htm", windowName);
}
window.printPage = printPage;

function dummy() {

}

///////////////////////////////////////////
//
//            Events
//
///////////////////////////////////////////
/**
* Data table subheader was clicked
*/
function onSourceButtonClick(event, serId, terrId) {
    //alert("Source,serid=" + serId);
    //alert("The page is under construction");
    //getSourceQuery(serId, terrId);
    Manager.onSourceButtonClick(event, serId, terrId);
}

/**
* Row serie header in the data table was clicked
*/
function onSerieRowClick(event, serId, rowNumber) {
    Manager.onSerieRowClick(event, serId, rowNumber);
    Manager.setHeader(Manager.buildSerieNameUserDateHeader());
}

/**
* Date colimn header in the data table was clicked
*/
function onDateColumnClick(event, date, colNumber, userDate) {
    Manager.onDateColumnClick(event, date, colNumber, userDate);
}

/**
* Map region click handler.
*/
function onClickMapRegion(par) {
    var arr = par.split(",");
    if (arr.length != 2) return;
    
    var region = arr[0];
    var terrId = arr[1];
    //alert(region);
    //alert(terrId);
    Manager.onClickMapRegion(terrId);
}

function onWindowResize() {
    Manager.window_OnResize();
}


