﻿// Set up global namespace
var TranzMetro = {};
TranzMetro.globals = {};
TranzMetro.globals.haveJQuery = true;   // reset later if jQuery is not loaded

TranzMetro.Finder = {

    btnFindTimetable_onclick: function(sender) {
        // Get dropdown references
        var ddFinderLine = document.getElementById("ddFinderLine");
        var ddFinderFrom = document.getElementById("ddFinderFrom");
        var ddFinderTo = document.getElementById("ddFinderTo");
        var ddTimeTableWhen = document.getElementById("ddTimeTableWhen");

        // Get current direction
        var nDirectionID = querySt("DirectionID") == undefined ? 0 : querySt("DirectionID");

        // Get selected values
        var nLineID = selectedValue(ddFinderLine);
        var nFromID = selectedValue(ddFinderFrom);
        var nToID = selectedValue(ddFinderTo);
        var nDayID = selectedValue(ddTimeTableWhen);

        // Flip direction?
        if (ddFinderFrom.selectedIndex > ddFinderTo.selectedIndex) {
            nDirectionID = nDirectionID == 0 ? 1 : 0;
        }

        window.location = TranzMetro.globals.BaseURL + "Timetable.aspx?LineID=" + nLineID + "&DirectionID=" + nDirectionID + "&DayID=" + nDayID + "&FromID=" + nFromID + "&ToID=" + nToID;
    },

    btnFindFares_onclick: function(sender) {
        // Get dropdown references
        var ddFinderLine = document.getElementById("ddFinderLine");
        var ddFinderFrom = document.getElementById("ddFinderFrom");
        var ddFinderTo = document.getElementById("ddFinderTo");

        // Get selected values
        var nLineID = selectedValue(ddFinderLine);
        var nFromID = selectedValue(ddFinderFrom);
        var nToID = selectedValue(ddFinderTo);

        window.location = TranzMetro.globals.BaseURL + "Fares.aspx?LineID=" + nLineID + "&FromID=" + nFromID + "&ToID=" + nToID;
    },

    ddLine_onchange: function(sender) {
        var nSelectedLineID = selectedValue(sender);
        var hdHiddenLineField = document.getElementById("hdFinderLine");
        hdHiddenLineField.value = nSelectedLineID;
        this.FillStations(sender, nSelectedLineID);
        this.FillServices(nSelectedLineID);
        this.setFinderCookie();
    },

    ddFrom_onchange: function(sender) {
        var nSelectedStationID = selectedValue(sender);
        var hdHiddenFromField = document.getElementById("hdFinderFrom");
        var ddFinderTo = document.getElementById("ddFinderTo");
        var nToID = selectedValue(ddFinderTo);
        if (nSelectedStationID == nToID) {
            SelectOptionByVal(ddFinderTo, hdHiddenFromField.value);
            document.getElementById("hdFinderTo").value = selectedValue(ddFinderTo);
        }
        hdHiddenFromField.value = nSelectedStationID;
        this.setFinderCookie();
    },

    ddTo_onchange: function(sender) {
        var nSelectedStationID = selectedValue(sender);
        var hdHiddenToField = document.getElementById("hdFinderTo");
        var ddFinderFrom = document.getElementById("ddFinderFrom");
        var nFromID = selectedValue(ddFinderFrom);
        if (nSelectedStationID == nFromID) {
            SelectOptionByVal(ddFinderFrom, hdHiddenToField.value);
            document.getElementById("hdFinderFrom").value = selectedValue(ddFinderFrom);
        }
        hdHiddenToField.value = nSelectedStationID;
        this.setFinderCookie();
    },

    FillServices: function(nLineID) {
        var ddTimeTableWhen = document.getElementById("ddTimeTableWhen");
        var aServicesList = GetServiceArray(nLineID);
        var nToday = 0;
        var nDayID = querySt("DayID") == undefined ? nToday : querySt("DayID");
        this.PopulateDropDown(ddTimeTableWhen, aServicesList, 0, nDayID, true);
    },

    FillStations: function(sender, nSelectedLineID) {
        var ddFrom = document.getElementById("ddFinderFrom");
        var ddTo = document.getElementById("ddFinderTo");

        if (nSelectedLineID == 0) nSelectedLineID = "1";
        var myArray = aStationsServices[nSelectedLineID - 1][1];

        var nDirectionID = querySt("DirectionID") == undefined ? 0 : querySt("DirectionID");

        this.PopulateDropDown(ddFrom, myArray, nDirectionID, 0, false);
        this.PopulateDropDown(ddTo, myArray, nDirectionID, 0, false);

        ddTo.selectedIndex = ddTo.length - 1;

        document.getElementById("hdFinderFrom").value = selectedValue(ddFrom);
        document.getElementById("hdFinderTo").value = selectedValue(ddTo);
    },

    PopulateDropDown: function(DropDown, myArray, iReverse, nSelectedID, bIsServicesList) {
        // Work on array copy
        var varArray = myArray.slice();
        if (iReverse == 1)
            varArray.reverse();

        //remove the opd options from the DD List
        EmptyDropDown(DropDown);

        var nSelectedIndex = 0;
        var nSelIndex = 0;
        var bAlreadySeparated = false;
        //        var nSepIndex = (nSepAfterIndex == undefined || nSepAfterIndex == 0) ? 999 : nSepAfterIndex;

        for (var i = 0; i < varArray.length; i++) {
            var myOption = new Option;
            myOption.text = varArray[i][1];
            myOption.value = varArray[i][0];
            myOption.selected = (myOption.value == nSelectedID);

            if (!TranzMetro.globals.DownLevelBrowser && bIsServicesList) {
                if (i == 1) {
                    var myOptSep = new Option;
                    myOptSep.text = "-- Standard Schedules ----------------";
                    myOptSep.disabled = 1;
                    DropDown.options[nSelIndex] = myOptSep;
                    nSelIndex++;
                } else if (i > 7 && !bAlreadySeparated) {
                    var myOptSep = new Option;
                    myOptSep.text = "-- Special Schedules -----------------";
                    myOptSep.disabled = 1;
                    DropDown.options[nSelIndex] = myOptSep;
                    bAlreadySeparated = true;
                    nSelIndex++;
                }
            }

            // IE6 has a bug where it incorrectly sets the drop down selected index to one index - 1 of selected option
            // need to record the selected index here and explicitly set the dropdown index at the end.        
            if (myOption.selected) {
                nSelectedIndex = nSelIndex;
            }

            DropDown.options[nSelIndex] = myOption;
            nSelIndex++;
        }

        DropDown.selectedIndex = nSelectedIndex;
    },

    SetUpPage: function() {

        // Get Station array for selected line
        var ddFinderLine = document.getElementById("ddFinderLine");
        var ddFinderFrom = document.getElementById("ddFinderFrom");
        var ddFinderTo = document.getElementById("ddFinderTo");
        var ddTimeTableWhen = document.getElementById("ddTimeTableWhen");
        var hdHiddenLine = document.getElementById("hdFinderLine");
        var hdHiddenFrom = document.getElementById("hdFinderFrom");
        var hdHiddenTo = document.getElementById("hdFinderTo");

        var nToday = 0;
        var savedVals;
        var nLineID;

        // Handle Querystring
        if (querySt("LineID") == undefined) {
            savedVals = this.getFinderCookie(nLineID, nFromID, nToID);
            nLineID = savedVals[0];
        } else {
            nLineID = querySt("LineID"); // have a lineID, don't use cookie
            savedVals = [nLineID, 0, 0];
        }
        var nFromID = querySt("FromID") == undefined ? savedVals[1] : querySt("FromID");
        var nToID = querySt("ToID") == undefined ? savedVals[2] : querySt("ToID");
        var nDayID = querySt("DayID") == undefined ? nToday : querySt("DayID");
        var nDirectionID = querySt("DirectionID") == undefined ? 0 : querySt("DirectionID");

        var aFinderStationList = GetStationArray(nLineID);
        var aServicesList = GetServiceArray(nLineID);

        // Remember Line
        if (nLineID != 0)
            SelectOptionByVal(ddFinderLine, nLineID);

        // Fill From and Top drop downs with stations
        this.PopulateDropDown(ddFinderFrom, aFinderStationList, nDirectionID, nFromID, false);
        this.PopulateDropDown(ddFinderTo, aFinderStationList, nDirectionID, nToID, false);
        this.PopulateDropDown(ddTimeTableWhen, aServicesList, 0, nDayID, true);

        if (nToID == 0)
            this.DefaultTo(ddFinderTo);

        hdHiddenLine.value = selectedValue(ddFinderLine);
        hdHiddenFrom.value = selectedValue(ddFinderFrom);
        hdHiddenTo.value = selectedValue(ddFinderTo);

        document.getElementById("divFinderPane").style.display = "block";

        this.setFinderCookie();
    },

    DefaultTo: function(ddFinderTo) {
        ddFinderTo.selectedIndex = ddFinderTo.length - 1;
    },

    setFinderCookie: function() {
        var nLineID = selectedValue(document.getElementById("ddFinderLine"));
        var nFromID = selectedValue(document.getElementById("ddFinderFrom"));
        var nToID = selectedValue(document.getElementById("ddFinderTo"));
        var expires = new Date();
        expires.setFullYear(expires.getFullYear() + 1);
        setCookie("TMFinder", nLineID + "~" + nFromID + "~" + nToID, expires);
    },

    getFinderCookie: function() {
        var returnVals = [0, 0, 0];
        var cookieStr = getCookie("TMFinder");
        if (cookieStr != null) {
            var cookieVals = cookieStr.split("~");
            if (cookieVals[0] && cookieVals[0] != "") returnVals[0] = cookieVals[0];
            if (cookieVals[1] && cookieVals[1] != "") returnVals[1] = cookieVals[1];
            if (cookieVals[2] && cookieVals[2] != "") returnVals[2] = cookieVals[2];
        }
        return returnVals;
    }

};

function SelectOptionByVal(ddDropdown, val) {
    for (var i = 0; i < ddDropdown.options.length; i++) {
        if (ddDropdown.options[i].value == val)
            ddDropdown.options[i].selected = true;
    }
}

function EmptyDropDown(theList) {
    theList.options.length = 0;
}

function GetStationArray(iLineId) {
    if (iLineId == 0) iLineId = 1;
    return aStationsServices[iLineId - 1][1];
}

function GetServiceArray(iLineId) {
    if (iLineId == 0) iLineId = 1;
    return aStationsServices[iLineId - 1][2];
}

function querySt(ji) {
    var hu = window.location.search.substring(1);
    var gy = hu.split("&");
    for (i = 0; i < gy.length; i++) {
        ft = gy[i].split("=");
        if (ft[0] == ji) {
            return ft[1];
        }
    }
}

function bookTicket(url) {
    window.open(url, "TicketBooking", "toolbar=no, location=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width=530, height=750")
}
