var groupedProjects = [];
var lastSelectedPsn = null;
var lastScrollPosition = null;

var selectedProjects = null;
var selectedProjectIndex = 0;
var selectedPointSymbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND, 20, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([50,50,50]), 1), new dojo.Color([255,255,0,0.5]));
var selectedLineSymbol = new esri.symbol.CartographicLineSymbol(esri.symbol.CartographicLineSymbol.STYLE_SOLID, new dojo.Color([255,255,0,0.5]), 5, esri.symbol.CartographicLineSymbol.CAP_ROUND, esri.symbol.CartographicLineSymbol.JOIN_MITER, 3);
var selectedGraphic = null;

var bShowProjectsClick = false;

// Tab Components
function toggle_tab(the_tab) {
    var scrollPosition;

    if (window.pageYOffset)
        scrollPosition = window.pageYOffset + 'px';
    else if (document.documentElement.scrollTop)
        scrollPosition = document.documentElement.scrollTop + 'px';
    else
        scrollPosition = document.body.scrollTop + 'px';
    //alert(scrollPosition);

    reset_tabs();

    // set visibility class
    the_element_id = the_tab + "_container";
    the_elem = document.getElementById( the_element_id );
    the_elem.className = "visible";

    // set active class
    the_element_id = the_tab + "_a";
    the_elem = document.getElementById( the_element_id );
    the_elem.className = "on";
    
    var elementId = null;
    
    switch(the_tab) {
        case 'project_list':
            if(lastSelectedPsn && !bShowProjectsClick) {    
                elementId = 'PROJ_' + lastSelectedPsn;
            }
            break;
        case 'project_map':
            elementId = 'container';
            break;
    }
    
    if(elementId) {
        window.setTimeout('document.getElementById(\'' + elementId + '\').scrollIntoView()', 100);
    }
    
    /*if(lastSelectedPsn && !bShowProjectsClick) {    
        //the anchor is not visible yet, need to set a timeout to set the position.
        window.setTimeout('document.getElementById(\'PROJ_' + lastSelectedPsn + '\').scrollIntoView()', 100);
    }*/
}

function reset_tabs() {
    // reset tabs and visibility of divs
    var a = new Array("project_list", "project_map", "project_overview");

    for(i=0; i < a.length; i++) {
        the_element_id = a[i] + "_container";
        the_elem = document.getElementById( the_element_id );
        the_elem.className = "invisible";

        the_element_id = a[i] + "_a";
        the_elem = document.getElementById( the_element_id );
        the_elem.className = "";
    }
}

function adjustMapSize() {
    var headerCoords = dojo.coords(dojo.byId('head'), true);
    var footerCoords = dojo.coords(dojo.byId('footWrap'), true);
    var bodyCoords = dojo.coords(dojo.byId('container'), true);
    var height = bodyCoords.h - (headerCoords.h + footerCoords.h);
    
    var mapDiv = dojo.byId('mapDiv');
    mapDiv.style.height = height + 'px';
    mapDiv.style.width = bodyCoords.w + 'px';
    alert(mapDiv.style.width + ',' +  bodyCoords.h + ', ' + height);
    //dojo.byId('project_list_container'/*'wrapper'*/).style.height = height + "px";
}

function updateMap(pin, type) {
    if(!type) {
        return;
    }
    
    var project = findProjectByPin(pin);
    selectProjectInList(project ? project.PROJ_SEQ : null);
    toggle_tab('project_map');
    
    /*if(selectedProjects) {
        for(var index = 0; index < selectedProjects.features.length; index++) {
            if(selectedProjects.features[index].attributes.PIN == pin) {
                //the project is already in the existing result set. just use this result set.
                selectedProjectIndex = index;
                window.setTimeout('zoomToProjectInformation()', 100);
                return;
            }
        }
    }*/
    
    
    var layerName = '';
    type = type.toLowerCase();
    switch(type) {
        case 'point':
            layerName = 'Projects_Stimulus_Pt_ID';
            break;
        case 'line':
            layerName = 'Projects_Stimulus_ID';
        break;
    }

    var field = 'PIN';
    var value = pin;
    var dataSource = mapApp.getCustomDataSource("MultiLayerIdentifyDataSource");
    var identifyOptions = dojo.clone(dataSource.displayOptions);
    //identifyOptions.zoomToSelectionType = zoomToSelectionType.zoomToSelectionTypeAll;
    //identifyOptions.resultSetDisplayType = resultSetDisplayType.resultSetDisplayTypeInfoWindow;
    identifyOptions.layerName = "Projects Stimulus";
    identifyOptions.identifyLayerName = layerName;

    mdot.mapping.framework.QueryEngine.attributeQuery(mapApp, field, value, identifyOptions, null,
    function(resultSet) {
            selectedProjects = resultSet;
            selectedProjectIndex = 0;
            window.setTimeout('zoomToProjectInformation()', 100);
        }
    );
}

function findProjectByPin(pin) {
    for(var index = 0; index < projects.length; index++) {
        if(projects[index].PIN == pin) {
            return projects[index];
        }
    }
    return null;
}

function findProjectByPsn(psn) {
    for(var index = 0; index < projects.length; index++) {
        if(projects[index].PROJ_SEQ == psn) {
            return projects[index];
        }
    }
    return null;
}

function initProjects() {
    for(var index = 0; index < projects.length; index++) {
        var p = projects[index];
        var status = p.REPORTING_STATUS;
        var arrayOfProjects;
        if(!groupedProjects[status]) {
            arrayOfProjects = [];
            groupedProjects[status] = arrayOfProjects;
        }
        else {
            arrayOfProjects = groupedProjects[status];
        }
        
        arrayOfProjects[arrayOfProjects.length] = p;
    }
}

function getGroupProjectKeys() {
    var keys = [];
    for(var status in groupedProjects) {
        keys[keys.length] = status;
    }
    keys.sort( function (a, b){return (a > b) - (a < b);} );
    return keys;
}

function showProjects(status) {
    bShowProjectsClick = true;
    toggle_tab('project_list');
    document.getElementById(status + '_Listing').scrollIntoView();
    bShowProjectsClick = false;
    return false;
}

function printOverview() {
    initProjects();
    var keys = getGroupProjectKeys();
    var totalCount = 0;
    var totalCost = 0;
    for(var index = 0; index < keys.length; index++) {
        var status = keys[index];
        var array = groupedProjects[status];
        var count = array.length;
        var cost = 0;
        
        for(var index2 = 0; index2 < count; index2++) {
            var p = array[index2];
            cost += p.EST_CONST_COST;
        }
        
        totalCount += count;
        totalCost += cost;
		
		document.writeln('<tr>');
		document.writeln('<td><strong>' + status + '</strong><br/><a href="#" onclick="showProjects(\'' + status + '\');return false;">Project Details</a></td>');
		document.writeln('<td class="right">' + count + '</td>');
		document.writeln('<td class="right">' + formatCurrency(cost) + '</td>');
		document.writeln('</tr>');
    }
    
    document.writeln('<tr>');
    document.writeln('<td class="total">Grand Total</td>');
    document.writeln('<td class="total">' + totalCount + '</td>');
    document.writeln('<td class="total">' + formatCurrency(totalCost) + '</td>');
	document.writeln('</tr>');
}

function printProjects() {
    var keys = getGroupProjectKeys();
    for(var index = 0; index < keys.length; index++) {
        var status = keys[index];
        var array = groupedProjects[status];
        printProjectHeader(status);
        printProjectBody(array);
    }
}

function makeChart() {
    var totalProjects = projects.length;
    var postAdvertisedCost = 0;
    var postAdvertisedCount = 0;
    var preAdvertisedCost = 0;
    var preAdvertisedCount = 0;
    
    for(var index = 0; index < projects.length; index++) {
        var p = projects[index];
        var status = p.REPORTING_STATUS;
        var cost = p.EST_CONST_COST;
        
        if(status.indexOf('1-') == 0) {
            preAdvertisedCost += cost;
            preAdvertisedCount++;
        }
        else {
            postAdvertisedCost += cost;
            postAdvertisedCount++;
        }
    }
    
    var percentCount = (postAdvertisedCount / (postAdvertisedCount + preAdvertisedCount)) * 100;
    var percentCost = (postAdvertisedCost / (postAdvertisedCost + preAdvertisedCost)) * 100;
    
    percentCount = Math.round(percentCount*10)/10;
    percentCost = Math.round(percentCost*10)/10;
    
    var imgUrl = '';
    imgUrl += 'http://chart.apis.google.com/chart?';
    imgUrl += 'cht=bvg';
    imgUrl += '&amp;chs=380x300';
    imgUrl += '&amp;chd=t:' + percentCount + ',' + percentCost;
    imgUrl += '&amp;chxr=1,0,100';
    imgUrl += '&amp;chds=0,100';
    imgUrl += '&amp;chco=ff0000|228B22';
    imgUrl += '&amp;chbh=100,0,75';
    imgUrl += '&amp;chxt=x,y';
    imgUrl += '&amp;chxl=0:|by Number of Projects|by Estimated+Construction+Costs';
    imgUrl += '&amp;chxs=0,000000,12';
    imgUrl += '&amp;chtt=Percentage+of+ARRA+Projects+That+Have+Been+Advertised';
    imgUrl += '&amp;chts=000000,12';
    imgUrl += '&amp;chg=0,10,5,5';
    imgUrl += '&amp;chm=N*f0*%,000000,0,-1,11';
    
    /*
<img src="http://chart.apis.google.com/chart?
cht=bvg
&amp;chs=380x300
&amp;chd=t:83.3,64.4
&amp;chxr=1,0,100
&amp;chds=0,100
&amp;chco=ff0000|228B22
&amp;chbh=100,0,75
&amp;chxt=x,y
&amp;chxl=0:|by Number of Projects|by Estimated+Construction+Costs
&amp;chxs=0,000000,12
&amp;chtt=Percentage+of+ARRA+Projects+That+Have+Been+Advertised
&amp;chts=000000,12
&amp;chg=0,10,5,5
&amp;chm=N*f0*%,000000,0,-1,11"
alt="MaineDOT - ARRA Projects Graph" />

    */
    
    //http://chart.apis.google.com/chart?bvg&chs=450x400&chd=t:0.8,0.6&chxr=1,0,100&chds=0,100&chco=ff0000|00ff00&chbh=100,0,100&chxt=x,y&chxl=0:|by Number of Projects|by Estimated+Construction+Costs&chxs=0,000000,13&chtt=Percentage+of+ARRA+Projects+That+Have+Been+Advertised&chts=000000,16&chg=0,10,5,5&chm=N*f0*%,000000,0,-1,11
    
    document.writeln('<img src="' + imgUrl + '" alt="MaineDOT - ARRA Projects Graph"/>');
}

function printProjectHeader(status) {
    var title = status.substring(status.indexOf("-") + 1);
    document.writeln('<div id="' + status + '_Listing">');
    
    document.writeln('<table style="width: 100%;"><tr><td align="left">');
    document.writeln('<h1 class="table">ARRA Reporting Status: <strong>' + title + ' Projects</strong></h1>');
	//document.writeln('</td><td align="right"><h1 class="table"><a href="#" onclick="toggle_tab(\'project_overview\');return false;">Back</a></h1></td></tr></table>');
	document.writeln('</td><td align="right"><a href="#" onclick="document.scroll(0,0); return false;" class="defaultLink">Top</a></td></tr></table>');
	
	document.writeln('<table class="list" cellspacing=0>');
	document.writeln('<tr>');
	document.writeln('<th>PIN</td>');
	document.writeln('<th>Title</td>');
	//document.writeln('<th>Scope</td>');
	document.writeln('<th>Work Plan Description</td>');
	document.writeln('<th>Status Date</td>');
	document.writeln('<th>Program Manager</td>');
	document.writeln('<th>Contact</td>');
	document.writeln('<th>Estimated Construction&nbsp;Costs</td>');
	document.writeln('</tr>');
}

function printProjectBody(arrayOfProjects) {
    for(var index = 0; index < arrayOfProjects.length; index++) {
        var p = arrayOfProjects[index];    
        document.writeln('<tr id="PROJ_' + p.PROJ_SEQ + '">');
	    document.write('<td>');
	
	    if(p.PIN) {
	        document.write(p.PIN);
	    }
	    else {
	        document.write('&nbsp;');
	    }
	
	    if(p.IS_MAPPABLE) {
    	    document.write('<br/><a id="PROJ_' + p.PROJ_SEQ + '_LINK" href="#" onclick="updateMap(\'' + p.PIN + '\', \'' + p.SHAPE_TYPE + '\');return false;">View&nbsp;Map</a>');
	    }
	    document.writeln('</td>');
	    document.writeln('<td>' + scrub(p.TITLE) + '</td>');
	    //document.writeln('<td>' + scrub(p.SCOPE) + '</td>');
	    document.writeln('<td>' + scrub(p.WORK_PLAN_DESCRIPTION) + '</td>');
	    document.writeln('<td>' + scrub(p.STATUS_DESC_DATE) + '</td>');
	    document.writeln('<td>' + scrub(p.PROGRAM_MANAGER) + '</td>');
	    document.writeln('<td>' + scrub(p.LEAD_UNIT_CONTACT) + '</td>');
	    document.writeln('<td class="right">' + scrub(formatCurrency(p.EST_CONST_COST)) + '</td>');
        document.writeln('</tr>');
    }
    document.writeln('</table>');
    document.writeln('</div>');
}

function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g,'');
    if(isNaN(num))
        num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num*100+0.50000000001);
    cents = num%100;
    num = Math.floor(num/100).toString();
    if(cents<10)
        cents = "0" + cents;
    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        num = num.substring(0,num.length-(4*i+3))+','+
    num.substring(num.length-(4*i+3));
    return (((sign)?'':'-') + '$' + num);
}

function onIdentifyProjects(resultSet) {
    selectProjectInList(null);
    selectedProjects = resultSet;
    selectedProjectIndex = 0;
    showProjectInformation();
}

function zoomToProjectInformation() {
    var handle = dojo.connect(mapApp.map, "onExtentChange", function(extent, delta, levelChange, lod) {
        dojo.disconnect(handle);
        showProjectInformation();
    });
    //mdot.mapping.framework.Util.setExtent(selectedProjects.features, mapApp.map, mapApp.defaultScaleForZoom);
    var extent = mdot.mapping.framework.Util.getResultSetExtent(selectedProjects.features, mapApp.map, 16000);
    if(extent != null) {
        mapApp.setExtent2(extent);
    }
    else {
        alert('Failed to find project in map.');
    }
}

function showProjectInformation() {
    var map = mapApp.map;      
    clearSelectedGraphics();
    
    var features = selectedProjects.features;
    var html = '<span class="identifyLabel">No projects found</span>';
    var title = "Stimulus Projects";
    var geometry = null;
    if(features.length > 0) {
        html = '';
        var attributes = features[selectedProjectIndex].attributes;
        title = "PIN: " + attributes.PIN;
        
        selectProjectInList(attributes.PROJ_SEQ);
        
        var project = findProjectByPsn(attributes.PROJ_SEQ);
        
        geometry = features[selectedProjectIndex].geometry;
        selectedGraphic = new esri.Graphic(geometry, geometry.type == 'point' ? selectedPointSymbol : selectedLineSymbol);
        map.graphics.add(selectedGraphic);
        
        html += '<table class="identifyTable">';
        html += '<tr class="identifyRow1"><td class="identifyLabel">Title:</td></tr><tr class="identifyRow1"><td class="identifyValue">' + scrub(attributes.Title) + '</td></tr>';
        html += '<tr class="identifyRow2"><td class="identifyLabel">Description:</td></tr>';
        html += '<tr class="identifyRow2"><td class="identifyValue">' + attributes.Work_Plan_Description + '</td></tr>';
        html += '<tr class="identifyRow1"><td class="identifyLabel">Status:</td></tr><tr class="identifyRow1"><td class="identifyValue">' + scrub(attributes.Status_Desc_Date) + '</td></tr>';
        html += '<tr class="identifyRow2"><td class="identifyValue"><strong>Estimated Cost:</strong>&nbsp;' + scrub(formatCurrency(attributes.EST_CONST_COST)) + '</td></tr>';
        html += '<tr class="identifyRow1"><td class="identifyValue"><strong>PIN:</strong>&nbsp;' + scrub(attributes.PIN) + '</td></tr>';
        html += '<tr class="identifyRow2"><td class="identifyValue"><strong>Program Manager:</strong>&nbsp;' + scrub(attributes.Program_Manager) + '</td></tr>';
        html += '<tr class="identifyRow1"><td class="identifyValue"><strong>Contact:</strong>&nbsp;' + scrub(attributes.Phone) + '</td></tr>';

        html += '<tr class="identifyRow3"><td width="100%"><table class="identifyTable" width="100%"><tr><td class="linkValue"  width="50%"><a href="#" class="infoLink" onclick="zoomToSelectedProject();return false;">View in Map</a></td>';
        html += '<td class="linkValue" width="50%" align="right"><a href="#" class="infoLink" onclick="selectProjectInList(' + attributes.PROJ_SEQ + ');toggle_tab(\'project_list\');return false;">View in List</a></td></tr></table>';
        
        if(features.length > 1) {
           // html += '<tr><td>&nbsp;</td></tr>';
            html += '<tr>';
            html += '<td class="navValue" width="100%" align="center">';
            html += '<a href="#" class="infoLink" onclick="showProjectInformationAt(\'first\');return false;">&lt;&lt;</a>&nbsp;&nbsp;&nbsp;';
            html += '<a href="#" class="infoLink" onclick="showProjectInformationAt(\'previous\');return false;">&lt;</a>&nbsp;&nbsp;';
            html += (selectedProjectIndex + 1) + ' of ' + features.length + ' Projects&nbsp;&nbsp;';
            html += '<a href="#" class="infoLink" onclick="showProjectInformationAt(\'next\');return false;">&gt;</a>&nbsp;&nbsp;&nbsp;';
            html += '<a href="#" class="infoLink" onclick="showProjectInformationAt(\'last\');return false;">&gt;&gt;</a>';
        }
        else {
            html += '<tr><td>&nbsp;</td></tr>';
        }
        html += '</table>';
    }
    
    dojo.byId('projectsIdentifyResults').innerHTML = html;
    
    //map.infoWindow.setContent(html);
    //map.infoWindow.setTitle(title);
    
    /*var point = selectedProjects.clientEvent ? selectedProjects.clientEvent.screenPoint : null;
    if(!point) {
        //attribute query
        if(geometry) {
            point = map.toScreen(mdot.mapping.framework.Util.getCenter(geometry));
        }
        else {
            point = map.toScreen(map.extent.getCenter());
        }
    }
    
    if(!map.infoWindow.isShowing) {
        map.infoWindow.resize(350, 200);
        map.infoWindow.show(point, map.getInfoWindowAnchor(point));
    }*/
}

function showProjectInformationAt(loc) {
    switch(loc) {
        case 'first':
            selectedProjectIndex = 0;
            break;
        case 'previous':
            selectedProjectIndex--;
            break;
        case 'next':
            selectedProjectIndex++;
            break;
        case 'last':
            if(selectedProjects && selectedProjects.features)
               selectedProjectIndex = selectedProjects.features.length - 1;
            else
                selectedProjectIndex = 0;
            break;
    }
    
    if(selectedProjectIndex < 0) {
        selectedProjectIndex = 0;
    }
    if(selectedProjects && selectedProjects.features && selectedProjectIndex >= selectedProjects.features.length) {
        selectedProjectIndex = selectedProjects.features.length - 1;
    }
    showProjectInformation();
}

function selectProjectInList(psn) {
    if(lastSelectedPsn)
        applyRowStyle(lastSelectedPsn, "");
    
    lastSelectedPsn = psn;
    if(lastSelectedPsn)
        applyRowStyle(lastSelectedPsn, "selectedRow");
}

function zoomToSelectedProject() {
    var features = selectedProjects.features;
    if(features.length > 0 && selectedProjectIndex > -1 && selectedProjectIndex < features.length) {
        var geometry = features[selectedProjectIndex].geometry;
        var extent = null;
        if(geometry.type == "point") {
            extent = mdot.mapping.framework.Util.getExtentFromScale(geometry, mapApp.map, 16000);
        }
        else {
            extent = geometry.getExtent();
        }
        mapApp.setExtent2(extent);
    }
}

function clearSelectedGraphics() {
    if(selectedGraphic) {
        mapApp.map.graphics.remove(selectedGraphic);
        selectedGraphic = null;
    }
}

function applyRowStyle(psn, cssClassName) {
    if(!psn)
        return;
        
    var row = document.getElementById('PROJ_' + psn);
    if(row) {
        row.className = cssClassName;
    }
    else {
        alert('could not find PROJ_' + psn);
    }
}

function scrub(s) {
    return s ? s : "Not available";
}
