﻿//holds routes and trips
var _systemDisplay = new SystemDisplay();  //The system display div and properties
var _system = new TransitSystem(); //Hold the collection of trips (System)
var _systemCollection = new SystemCollection(); //Hold the collection of systems

var _tripStrokeColor = "#89905d";
var _tripFillColor = "#89905d";

function AddSegmentToTrip(corridorId) {
    var corridor = _corridors.FindByID(corridorId);
    _system.AddSegment(corridor);
    _tripDisplay.UpdateCorridorInfo(corridor, true);
    _tripDisplay.AddSegmentToList(corridor);

    _tripDisplay.EditsMade(true);
    //If system has been re-built and now is being edited, then remove it from the previous systems list.
    if (_tripDisplay.SystemId > -1) {
        _systemCollection.Remove(_tripDisplay.SystemId);
        _systemDisplay.UpdateDisplay(_systemCollection.CreateSystemDisplay());
    }
   
    //Now Update Static Trip Display in upper left corner
    _tripDisplay.SetCapitalCost(_system.CapitalCost);
    _tripDisplay.SetTravelTime(_system.TravelTime);
    _tripDisplay.SetRiders(_system.Riders);
    _tripDisplay.SetBenefits(_system.Benefits);
    _tripDisplay.SetOperatingCost(_system.OperatingCost);
    //Close window
    _gmap.closeInfoWindow();
}

function RemoveCorridorFromCurrentSystem(corridorId) {
    //Clear line coloring
    var corridor = _corridors.FindByID(corridorId);
    //corridor.SetAsTripPart(false);
    _system.RemoveSegment(corridor);

    _tripDisplay.RemoveSegmentFromList(corridorId);
    _tripDisplay.RefreshTripList();
    _tripDisplay.UpdateCorridorInfo(corridor, false);

    _tripDisplay.EditsMade(true);
    //If system has been re-built and now is being edited, then remove it from the previous systems list.
    if (_tripDisplay.SystemId > -1) {
        _systemCollection.Remove(_tripDisplay.SystemId);
        _systemDisplay.UpdateDisplay(_systemCollection.CreateSystemDisplay());
    }
    
    //Now Update Static Trip Display in upper left corner
    _tripDisplay.SetCapitalCost(_system.CapitalCost);
    _tripDisplay.SetTravelTime(_system.TravelTime);
    _tripDisplay.SetRiders(_system.Riders);
    _tripDisplay.SetBenefits(_system.Benefits);
    _tripDisplay.SetOperatingCost(_system.OperatingCost);
    //Close window
    _gmap.closeInfoWindow();
}

function DoneWithSystem() {
    //Save the System to the 'Previous Systems' area
    if (_system.count > 0) {
        //Add System to System Collection
        _systemCollection.Add(_system);
        //_systemDisplay.SetVisible(true);
        _systemDisplay.UpdateDisplay(_systemCollection.CreateSystemDisplay());
        ClearMap();
        _system = new TransitSystem(); //Start a new System Object.
        _tripDisplay.EditsMade(false);
    }
    else {
        alert("You must build a system before you can save one.");
    }
}



function RebuildTrip(sysId) {
    _tripDisplay.EditsMade(false);
    var sys = _systemCollection.FindByID(sysId);
    var seg = sys.segments;
    _tripDisplay.SystemId = sysId;

    _tripDisplay.SetCapitalCost(sys.CapitalCost);
    _tripDisplay.SetTravelTime(sys.TravelTime);
    _tripDisplay.SetRiders(sys.Riders);
    _tripDisplay.SetBenefits(sys.Benefits);
    _tripDisplay.SetOperatingCost(sys.OperatingCost);

    for (var j = 0; j < seg.length; j++) {
        if (seg[j] != null) {
            //Change color
            if (seg[j].visible) {
                _tripDisplay.UpdateCorridorInfo(seg[j], true);
            }
            //Recreate Trip List
            _tripDisplay.AddSegmentToList(seg[j]);
            _system.AddSegment(seg[j]);
        }
    }
}



//****************************************System Object**********************************
function TransitSystem() {
    this.segments = new Array();
    this.centers = new Array();
    this.count = 0;
    this.selected = false;
    this.Id = -1;
    this.submitted = false;

    //Add the numeric info
    this.CapitalCost = 0;
    this.TravelTime = 0;
    this.Riders = 0;
    this.Benefits = 0;
    this.OperatingCost = 0;

    this.AddSegment = function(route) {
        this.count++;
        //route.Id = this.count;
        this.segments.push(route);
        //Add the numeric info
        this.CapitalCost += route.CapitalCost;
        this.TravelTime += route.TravelTime;
        this.Riders += route.Riders;
        this.Benefits += route.Benefits;
        this.OperatingCost += route.OperatingCost;

        if (this.CapitalCost >= _maxCost) {
            _maxCostReached = true;
        }
    }

    this.RemoveSegment = function(route) {
        this.count--;
        for (var i = 0; i < this.segments.length; i++) {
            if (this.segments[i]) {
                if (this.segments[i].Id == route.Id) {
                    this.segments[i] = null;
                }
            }
        }
        //Add the numeric info
        this.CapitalCost -= route.CapitalCost;
        this.TravelTime -= route.TravelTime;
        this.Riders -= route.Riders;
        this.Benefits -= route.Benefits;
        this.OperatingCost -= route.OperatingCost;

        if (this.CapitalCost < _maxCost) {
            _maxCostReached = false;
        }
    }

    this.AddCenter = function(center) {
        this.centers.push(center);
    }

    this.Clear = function() {
        this.trips.length = 0;
        this.count = 0;
        this.CapitalCost = 0;
        this.TravelTime = 0;
        this.Riders = 0;
        this.Benefits = 0;
        this.OperatingCost = 0;
    }

    this.ToggleSelected = function() {
        this.selected = !this.selected;
    }

    //returns the number of pixels to display in Cap Cost div
    this.GetCapitalCostForDisplay = function() {
        var pxPerCostUnit = _summaryDivPixels / _maxCost;
        var pixels = Math.floor((this.CapitalCost * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.CapitalCost * pxPerCostUnit);
        return pixels;
    }

    //returns the number of pixels to display in Op Cost div
    this.GetOperatingCostForDisplay = function() {
        var pxPerCostUnit = _summaryDivPixels / _maxOpCost;
        var pixels = Math.floor((this.OperatingCost * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.OperatingCost * pxPerCostUnit);
        return pixels * _beneMultiplier;
    }

    //returns the number of pixels to display in Riders div
    this.GetRidersForDisplay = function() {
        pxPerCostUnit = _summaryDivPixels / _maxRiders;
        var pixels = Math.floor((this.Riders * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.Riders * pxPerCostUnit);
        return pixels * _beneMultiplier;
    }

    //returns the number of pixels to display in Env Ben div
    this.GetBenefitsForDisplay = function() {
        pxPerCostUnit = _summaryDivPixels / _maxBenefits;
        var pixels = Math.floor((this.Benefits * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.Benefits * pxPerCostUnit);
        return pixels * _beneMultiplier;
    }
}

/////////////////System Collection

function SystemCollection() {
    this.systems = new Array();
    this.count = 0;
    this.marked = false;
    this.uniqueID = 0; //A Unique ID that only increments

    this.Add = function(system) {
        this.count++;
        this.uniqueID++;
        system.Id = this.uniqueID;
        this.systems.push(system);
    }

    this.Clear = function() {
        this.systems.length = 0;
        this.count = 0;
        this.uniqueID = 0;
    }

//If there was an error submitting, clear all systems from being selected or 'Submitted'
    this.CancelSelectedSystems = function() {
        for (var i = 0; i < _systemCollection.systems.length; i++) {
            if (_systemCollection.systems[i]) {
                if (_systemCollection.systems[i].selected) {
                    _systemCollection.systems[i].selected == false;
                }
            }
        }
    }

    //keeps track of whether 1 or more items are checked in the system list
    this.FindMarked = function() {
        var mFlag = false;
        for (var i = 0; i < this.systems.length; i++) {
            if (this.systems[i]) {
                if (this.systems[i].selected) {
                    mFlag = true;
                    break;
                }
            }
        }
        if (mFlag == true) {
            $("#uxDeleteSystem")[0].disabled = false;
            //enable submit, delete button
            $("#uxSubmitSystem")[0].disabled = false;
            //$("#uxDeleteSystem")[0].src = 'images/delete-button.jpg';
        }
        else {
            $("#uxDeleteSystem")[0].disabled = true;
            //enable submit, delete button
            $("#uxSubmitSystem")[0].disabled = true;
            //$("#uxDeleteSystem")[0].src = 'images/delete-button-off.jpg';
        }
    }

    //Delete a system from the 'previous systems' spot
    this.DeleteSystems = function() {
        //For each checked system in the previous systems list, delete 
        for (var i = 0; i < this.systems.length; i++) {
            if (this.systems[i]) {
                if (this.systems[i].selected) {
                    this.Remove(this.systems[i].Id);
                }
            }
            _systemDisplay.UpdateDisplay(this.CreateSystemDisplay());
            this.FindMarked();
        }
    }

    this.FindByID = function(Id) {
        for (var i = 0; i < this.systems.length; i++) {
            if (this.systems[i]) {
                if (this.systems[i].Id == Id) {
                    return this.systems[i];
                }
            }
        }
        return null;
    }

    this.Remove = function(Id) {
        for (var i = 0; i < this.systems.length; i++) {
            if (this.systems[i]) {
                if (this.systems[i].Id == Id) {
                    this.systems[i] = null;
                    this.count--;
                    if (this.count < 1) {
                        //disable submit, delete button
                        $("#uxSubmitSystem")[0].disabled = true;
                        $("#uxDeleteSystem")[0].disabled = true;
                    }
                    return;
                }
            }
        }
    }

    this.CreateSystemDisplay = function() {
        var outputHTML = "";
        for (var i = 0; i < this.systems.length; i++) {
            if (this.systems[i]) {
                var sys = this.systems[i];

                outputHTML += "<table cellpadding='0' cellspacing='0' style='width:80%; margin:0px auto;'><tbody style='border: none;'>";
                outputHTML += "<tr><td style='text-align:center;vertical-align:top;padding:0px;'><input id='uxSysCheck_" + sys.Id + "' type='checkbox' onclick='_systemCollection.FindByID(" + sys.Id + ").ToggleSelected(), _systemCollection.FindMarked()'/><span style='padding-left:3px;color:Navy; font-size:1em;white-space:nowrap'>System #" + sys.Id + "</span></td>";
                outputHTML += "<td style='padding: 0px;text-align:center;vertical-align:top;'>";
                outputHTML += "<table cellpadding='0' cellspacing='0' style='width:100%'><tbody style='border: none;'><tr>";
                outputHTML += "<td style='padding:1px 3px 1px 0px;text-align: right;'>Capital cost</td>";
                outputHTML += "<td style='padding:1px 0px; text-align: left;'><img alt='' src='images/capitalcost.gif' /></td>";
                outputHTML += "<td style='padding:1px 0px;'><div class='summaryStatWrapper'><div class='summaryStatBar' style='width:" + sys.GetCapitalCostForDisplay() + "px;'></div></div></td>";
                outputHTML += "</tr><tr><td style='padding:1px 3px 1px 0px;text-align: right;'>Operating cost</td>";
                outputHTML += "<td style='padding:1px 0px; text-align: left;'><img alt='' src='images/OMcost.gif' /></td>";
                outputHTML += "<td style='padding:1px 0px;'><div class='summaryStatWrapper'><div class='summaryStatBar' style='width:" + sys.GetOperatingCostForDisplay() + "px;'></div></div>";
                outputHTML += "</tr><tr><td style='padding:1px 3px 1px 0px;text-align: right;'>Ridership</td>";
                outputHTML += "<td style='padding:1px 0px; text-align: left;'><img alt='' src='images/ridership.gif' /></td>";
                outputHTML += "<td style='padding:1px 0px;'><div class='summaryStatWrapper'><div class='summaryStatBar' style='width:" + sys.GetRidersForDisplay() + "px;'></div></div>";
                outputHTML += "</tr><tr><td style='padding:1px 3px 1px 0px;text-align: right;'>Environmental benefit</td>";
                outputHTML += "<td style='padding:1px 0px; text-align: left;'><img alt='' src='images/enviro.gif' /></td>";
                outputHTML += "<td style='padding:1px 0px;'><div class='summaryStatWrapper'><div class='summaryStatBar' style='width:" + sys.GetBenefitsForDisplay() + "px;'></div></div>";

                //below ends table in column 2 and column 2 itself.
                outputHTML += "</tr></tbody></table></td>";
                outputHTML += "<td style='padding:0px;vertical-align:top'><input type='button' value='Review' onclick='ClearMap();RebuildTrip(" + sys.Id + ");showPrevSystems();'/></td>";
                outputHTML += "</tr></tbody></table><div class='dotted_line1'></div>";

            } else { 
                // do nothing (system with this id was probably deleted at some point
            }
        }
        return outputHTML;
    }
 }

/***************Trip Display Object*******************/
function TripDisplay() {

    //Cost Attributes
    this.CapitalCost = 0; 
    this.TravelTime = 0; 
    this.Riders = 0; 
    this.Benefits = 0; 
    this.OperatingCost = 0;

    this.editsMade = false;
    this.SystemId = -1;
    this.list = new Array();

    this.Clear = function() {
        this.SetCapitalCost(0);
        this.SetTravelTime(0);
        this.SetRiders(0);
        this.SetBenefits(0);
        this.SetOperatingCost(0);

        var p = $("#divTripList")[0];
        this.list.length = 0;
        p.innerHTML = "";
        this.SystemId = -1;
    }

    this.SetCapitalCost = function(price) {
        this.CapitalCost = price;
        var pxPerCostUnit = _summaryDivPixels / _maxCost;
        var p = $("#uxTripCapitalCost");
        //dont want the number of pixels to exceed 80;
        var pixels = Math.floor((this.CapitalCost * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.CapitalCost * pxPerCostUnit);
        p.css("width", pixels);
    }

    this.SetTravelTime = function(bd) {

    }

    this.SetRiders = function(rd) {
        this.Riders = rd;
        pxPerCostUnit = _summaryDivPixels / _maxRiders;
        var p = $("#uxTripRiders");

        var pixels = Math.floor((this.Riders * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.Riders * pxPerCostUnit);
        p.css("width", pixels * _beneMultiplier);
    }

    this.SetBenefits = function(co) {
        this.Benefits = co;
        pxPerCostUnit = _summaryDivPixels / _maxBenefits;
        var p = $("#uxTripBenefits");

        var pixels = Math.floor((this.Benefits * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.Benefits * pxPerCostUnit);
        p.css("width", pixels * _beneMultiplier);
    }

    this.SetOperatingCost = function(co) {
        this.OperatingCost = co;
        //div width = 80 px; 70 cost units = 80 px; therefore each cost unit = 1.14 px
        var pxPerCostUnit = _summaryDivPixels / _maxOpCost;
        var p = $("#uxTripOC");
        var pixels = Math.floor((this.OperatingCost * pxPerCostUnit > _summaryDivPixels) ? _summaryDivPixels : this.OperatingCost * pxPerCostUnit);
        p.css("width", pixels * _beneMultiplier);
    }

    this.AddSegmentToList = function(segment) {
        var p = $("#divTripList")[0];
        this.list[segment.Id] = "<div style='width:90%'><span style='float:left; width:140px;'>" + segment.Name + "</span> <img style='display:block; float:right; width:16px; height:16px;' src='images/cancel.gif' alt='Remove' onclick='RemoveCorridorFromCurrentSystem(" + segment.Id + ")' /></div>";
        p.innerHTML += "<div style='width:90%'><span style='float:left; width:140px;'>" + segment.Name + "</span> <img style='display:block; float:right; width:16px; height:16px;' src='images/cancel.gif' alt='Remove' onclick='RemoveCorridorFromCurrentSystem(" + segment.Id + ")' /></div>";
    }

    this.RemoveSegmentFromList = function(routeId) {
        this.list[routeId] = "";
    }

    this.RefreshTripList = function() {
        var p = $("#divTripList")[0];
        p.innerHTML = "";
        for (var i = 0; i < this.list.length; i++) {
            if (this.list[i] != undefined) {
                if (this.list[i] != "") {
                    p.innerHTML += this.list[i];
                }
            }
        }
    }

    this.UpdateCorridorInfo = function(segment, highlight) {
        if (segment) {
            if (highlight) {
                segment.SetSelected(true);
            }
            else {
                segment.SetSelected(false);
            }
        }
    }

    this.UpdateCenterColor = function(center) {
        //Cycle through each center and assign it the proper color
        center.Circle.setFillColor(_tripFillColor);
    }

    this.EditsMade = function(isEditMade) {
        this.editsMade = isEditMade;
        var doneButton = $("#uxDoneWithTrip")[0];
        var saveButton = $("#uxSave")[0];
        if (isEditMade) {
            //doneButtton.disabled = false;
            //doneButtton.src = "images/done-button.jpg";
            doneButton.onclick = function() { DoneWithSystem(); }
            doneButton.style.color = "#000000";
            saveButton.src = "images/save.jpg";
        }
        else {
            //doneButtton.disabled = true;
            //doneButtton.src = "images/done-button-off.jpg";
            doneButton.onclick = function() { return; }
            doneButton.style.color = "#999999";
            saveButton.src = "images/save-off.jpg";
            
        }
    }
}


/***************System Display Object*******************/
function SystemDisplay() {
    this.visible = false;
    this.systems = new Array();

    this.SetVisible = function(makeVisible) {
        this.visible = makeVisible;
        if (makeVisible == true) {
            $("#wrapperSystems")[0].style.display = "block";
            $("#uxSubmitSystem")[0].disabled = false;
            //$("#uxSubmitSystem")[0].src = "images/submit-button.jpg";
        }
        else {
            $("#wrapperSystems")[0].style.display = "none";
            $("#uxSubmitSystem")[0].disabled = true;
            //$("#uxSubmitSystem")[0].src = "images/submit-button-off.jpg";
        }
    }

    //Status is s - 'submitting', e - 'error', f - 'success', d - 'default display'
    this.SetSubmittingMode = function(status) {
        switch (status) {

            case 's':
                $("#uxPrevSysLabel")[0].innerHTML = _submittingText;
                $("#uxSubmitSystem")[0].disabled = true;
                $("#uxDeleteSystem")[0].disabled = true;
                break;

            case 'e':
                $("#uxPrevSysLabel")[0].innerHTML = _errorText;
                $("#uxSubmitSystem")[0].disabled = true;
                $("#uxDeleteSystem")[0].disabled = true;
                //Show error message, then hide
                _systemCollection.CancelSelectedSystems(); _systemDisplay.UpdateDisplay(_systemCollection.CreateSystemDisplay()); _systemDisplay.SetSubmittingMode('d');
                break;

            case 'f':
                $("#uxPrevSysLabel")[0].innerHTML = _successText;
                $("#uxSubmitSystem")[0].disabled = true;
                $("#uxDeleteSystem")[0].disabled = true;
                //Hide Prev Systems Div
                //setTimeout("showPrevSystems(), _systemDisplay.UpdateDisplay(_systemCollection.CreateSystemDisplay()), _systemDisplay.SetSubmittingMode('d')", 4000);
                _systemDisplay.UpdateDisplay(_systemDisplay.CreateFinishedDisplay());
                _systemCollection.Clear();
                _systemDisplay.ResetSavedSystemDisplay();
                break;

            case 'd':
                $("#uxPrevSysLabel")[0].innerHTML = _prevSystemText;
                $("#uxSubmitSystem")[0].disabled = true;
                $("#uxDeleteSystem")[0].disabled = true;
                break;
        }
    }

    this.CreateFinishedDisplay = function() {
        var outputHTML = "";
        var end = (_systemCollection.count > 1) ? "systems" : "system"

        outputHTML += "<table cellpadding='0' cellspacing='0' style='width:100%'><tbody>";
        outputHTML += "<tr><td colspan='3' style='text-align:center;'>Successfully submitted " + end + "! Thank you.</td>";
        outputHTML += "</tr><tr style='height:40px;'>";
        outputHTML += "<td><a href='http://www.surveymonkey.com/s.aspx?sm=11_2brVMQqfIjEyfGeTipnXg_3d_3d' target='_blank'>Complete the Questionnaire</a></td><td>...or...</td><td><a href='#' onclick='showPrevSystems(); _systemDisplay.SetSubmittingMode(\"d\");' style='cursor:pointer;'>Create more systems</span></td>";
        outputHTML += "</tr></tbody></table><div class='dotted_line1'></div>";

        return outputHTML;
    }

    this.UpdateDisplay = function(html) {
        $("#wrapperSysDisplay")[0].innerHTML = html;
        this.ResetSavedSystemDisplay();
    }

    this.ResetSavedSystemDisplay = function() {
        var savedSystemHtml = '';
        var id = -1;
        for (var i = 0; i < _systemCollection.systems.length; i++) {
            if (_systemCollection.systems[i]) {
                sysId = _systemCollection.systems[i].Id;
                savedSystemHtml += "<div style='padding:2px;'><a href='#' onclick='ClearMap();RebuildTrip(" + sysId + ");return false'>System #" + sysId + "</a></div>"
            }
        }
        if (savedSystemHtml.length == 0)
            savedSystemHtml = "Currently no saved systems";

        savedSystemHtml += "<div class='dotted_line1' style='margin-top:2px;'></div>";
        $('#divSavedSystems').html(savedSystemHtml);
    }
}