﻿// Includes
document.write('<script type="text/javascript" src="scripts/prototype.js"><\/script>');
document.write('<script type="text/javascript" src="scripts/common.js"><\/script>');
document.write('<script type="text/javascript" src="scripts/collection.js"><\/script>');
document.write('<script type="text/javascript" src="scripts/menu.js"><\/script>');
document.write('<script type="text/javascript" src="scripts/internetMenuDef.js"><\/script>');
document.write('<script type="text/javascript" src="scripts/tabs.js"><\/script>');
document.write('<script type="text/javascript" src="scripts/calendarcontrol.js"><\/script>');
document.write('<script type="text/javascript" src="scripts/itinerarySearch.js"><\/script>');

var ST = [];
var itinSch; 
var delayedExec;
var extWinTramSearch = null;
var resultsPanel = null;
var progressWindow = null;
var progressBar = null;
 
window.onload = function() {  
    if(mSiteLanguage == 'EN')
    {
        ST["City"] = "City";
        ST["RouteNumber"] = "Route Number";
        ST["StopHours"] = "Bus stop & times";
        ST["StartDest"] = "Start & destination";
        ST["ItinFieldError"] = "You must specify a full address (civic number, street and city) or a bus stop number(TRAM).";
        ST["NoAddressFound"] = "Address not found.";
        ST["StopInvalid"] = "Invalide bus stop number.";
        ST["EnterStartAddressStop"] = "Specify the start address or bus stop number.";
        ST["EnterEndAddressStop"] = "Specify the end address or bus stop number.";
        ST["SelectAddressList"] = "Select an address from the following list.";
        ST["MustSelectAddress"] = "You must select an address from the following list.";
        ST["AddressSum"] = "Find an itinerary on %s, %s at %s.";
        ST["BusStopSum"] = "Bus stop #%s";
        ST["Search"] = "Search";
        ST["Next"] = "Next";
        ST["Leave"] = "leaving";
        ST["Arrive"] = "arriving";
        ST["Ext_WindowTitle"] = "Find a Bus Stop";
        ST["Ext_PanelResultTitle"] = "Results";
        ST["Ext_TabGeneral"] = "Landmarks";
        ST["Ext_TabByCity"] = "By City";
        ST["Ext_TabByRoute"] = "By Route";
        ST["Ext_TabByAddress"] = "By Address";
        ST["Ext_TabByIntersection"] = "By Intersection";
        ST["Ext_SearchProgress"] = "Search in progress...";
        ST["Ext_FindTramCodeLabel"] = "Find Tram #";
    }
    else
    {
        ST["City"] = "Ville";
        ST["RouteNumber"] = "Numéro de circuit";
        ST["StopHours"] = "Arrêts et heures";
        ST["StartDest"] = "Départ et destination";
        ST["ItinFieldError"] = "Vous devez entrez une adresse complète (numéro civique, rue et ville) ou un numéro d'arrêt(TRAM).";
        ST["NoAddressFound"] = "Impossible de trouver l'adresse spécifiée.";
        ST["StopInvalid"] = "Numéro d'arrêt d'autobus invalide.";
        ST["EnterStartAddressStop"] = "Entrez l'adresse ou le numéro d'arrêt du lieu de départ.";
        ST["EnterEndAddressStop"] = "Entrez l'adresse ou le numéro d'arrêt du lieu d'arrivé.";
        ST["SelectAddressList"] = "Sélectionnez une adresse parmis la liste suivante.";
        ST["MustSelectAddress"] = "Vous devez sélectionnez une adresse parmis la liste suivante.";
        ST["AddressSum"] = "Trouver une itineraires le %s, %s à %s.";
        ST["BusStopSum"] = "Arrêt d'autobus #%s";
        ST["Search"] = "Rechercher";
        ST["Next"] = "Suivant";
        ST["Leave"] = "partant";
        ST["Arrive"] = "arrivant";
        ST["Ext_WindowTitle"] = "Trouver un Arrêt";
        ST["Ext_PanelResultTitle"] = "Résultats";
        ST["Ext_TabGeneral"] = "Lieux";
        ST["Ext_TabByCity"] = "Par Ville";
        ST["Ext_TabByRoute"] = "Par Circuit";
        ST["Ext_TabByAddress"] = "Par Adresse";
        ST["Ext_TabByIntersection"] = "Par Intersection";
        ST["Ext_SearchProgress"] = "Recherche en cour...";
        ST["Ext_FindTramCodeLabel"] = "Trouver un Code Allo-Tram";
    }
    
    calendarControl($('divSearchDate'), false);
    timeControl($('txtSearchTime'), false);

    initialize();
    BuildMenu(mSiteLanguage);
    BuildSubMenu(mSiteLanguage);
    var tb = new TabBox('divTabBox', [{text:ST['City'], code:'City'},{text:ST['RouteNumber'], code:'Route'},{text:ST['StopHours'], code:'Stop'},{text:ST['StartDest'], code:'StartDest'}], tabClick, 10, 50);
    
    // Check if there are current search values
    itinSch = new itiSearch();
    
    try
    {
        queryString = toQueryParams(document.location.href);
    }
    catch(ex)
    {
        queryString = new Object();
    }

    var queryString;
    $('searchType').value = (queryString['t'])?  queryString['t'] : 'c';
    $('txtTRAM').value = (queryString['tram'])? queryString['tram'] : '';
    if(queryString['city']) setSelectedIndex($('lstCity'), queryString['city']);
    if(queryString['route']) setSelectedIndex($('lstRoutes'), queryString['route']);
    if(queryString['stime']) setSelectedIndex($('lstStartTime'), queryString['stime']);
    if(queryString['etime']) setSelectedIndex($('lstEndTime'), queryString['etime']);

    
    itinSch.date = (queryString['idate']) ? queryString['idate'] : today();
    itinSch.searchTime = (queryString['itime']) ? queryString['itime'] : "6:00";
    itinSch.searchTimeType = (queryString['itimetype']) ? queryString['itimetype'] : "departure";
    
    itinSch.departure.time = (queryString['idtime']) ? queryString['idtime'] : "6:00";
    itinSch.departure.address.number = (queryString['idnum']) ? queryString['idnum'] : "";
    itinSch.departure.address.street = (queryString['idstreet']) ? queryString['idstreet'] : "";
    itinSch.departure.address.city = (queryString['idcity']) ? queryString['idcity'] : "";
    itinSch.departure.address.text = (queryString['idtext']) ? queryString['idtext']: "";
    itinSch.departure.tram = (queryString['idtram']) ? queryString['idtram'] : "";
    itinSch.departure.linkId = (queryString['idlink']) ? queryString['idlink']: null;
  
    
    itinSch.arrival.time = (queryString['iatime']) ? queryString['iatime'] : "10:00";
    itinSch.arrival.address.number = (queryString['ianum']) ? queryString['ianum'] : "";
    itinSch.arrival.address.street = (queryString['iastreet']) ? queryString['iastreet'] : "";
    itinSch.arrival.address.city = (queryString['iacity']) ? queryString['iacity'] : "";
    itinSch.arrival.address.text = (queryString['iatext']) ? queryString['iatext']: "";
    itinSch.arrival.tram = (queryString['iatram']) ? queryString['iatram'] : "";   
    itinSch.arrival.linkId = (queryString['ialink']) ? queryString['ialink']: null;

    itinSch.activeStep = (queryString['t'] && queryString['t'] == 'd' && queryString['idate']) ? 3: 0;

    itinMoveStep(0);
    
    // Now check what tab needs to be selected
    switch($('searchType').value)
    {
        case 'c':   tb.items[0].select(); break;
        case 'r':   tb.items[1].select(); break;  
        case 's':   tb.items[2].select(); break;
        case 'd':   tb.items[3].select(); break;     
    }
    
    new Ext.Button({
        renderTo:'divSearchByStop_findTramBtn',
        icon:'images/ico_searchBusStops.png',
        minWidth: '75',
        height: '25',
        text: ST["Ext_FindTramCodeLabel"],
        cls: 'x-btn-text-icon',
        style: 'margin-top: 10px;',
        listeners: {
            click: function()
            {
                searchForTram(0);
            }
        }
    });
    
    new Ext.Button({
        renderTo:'tabExtFindTram_ByCity_SearchButton',
        icon:'images/ico_searchBusStops.png',
        minWidth: '25',
        height: '25',
        text: ST["Search"],
        cls: 'x-btn-text-icon',
        style: 'margin-top: 4px;',
        listeners: {
            click: function()
            {
                onSearchForTramByCity();
            }
        }
    });
    
    new Ext.Button({
        renderTo:'tabExtFindTram_ByRoute_SearchButton',
        icon:'images/ico_searchBusStops.png',
        minWidth: '25',
        height: '25',
        text: ST["Search"],
        cls: 'x-btn-text-icon',
        style: 'margin-top: 4px;',
        listeners: {
            click: function()
            {
                onSearchForTramByRoute();
            }
        }
    });
    
    new Ext.Button({
        renderTo:'tabExtFindTram_ByAddr_SearchButton',
        icon:'images/ico_searchBusStops.png',
        minWidth: '25',
        height: '25',
        text: ST["Search"],
        cls: 'x-btn-text-icon',
        style: 'margin-top: 4px;',
        listeners: {
            click: function()
            {
                onSearchForTramByAddr();
            }
        }
    });
    
    new Ext.Button({
        renderTo:'tabExtFindTram_ByInter_SearchButton',
        icon:'images/ico_searchBusStops.png',
        minWidth: '25',
        height: '25',
        text: ST["Search"],
        cls: 'x-btn-text-icon',
        style: 'margin-top: 4px;',
        listeners: {
            click: function()
            {
                onSearchForTramByInter();
            }
        }
    });
}

function launchHelp()
{
    window.open("Help/helpScheduleSearch.aspx?T=" + $('searchType').value, "_blank", "height=500,width=400,resizable=yes,scrollbars=yes");
}

function tabClick(code)
{
    var shortCodes = [];
    shortCodes['City'] = 'c';
    shortCodes['Route'] = 'r';
    shortCodes['Stop'] = 's';
    shortCodes['StartDest'] = 'd';
    
    $('divSearchByCity').hide();
    $('divSearchByRoute').hide();
    $('divSearchByStop').hide();
    $('divSearchByStartDest').hide();
    $('divSearchBy' + code).show();
    
    $('searchType').value = shortCodes[code];
}

function onTramCodeSelection(tramCode)
{
    switch($('searchType').value)
    {
        case 's':
           $('txtTRAM').value = tramCode;
            break;
        case 'd':
           $('txtItinTRAM').value = tramCode;
           break;
    }
    
    if(extWinTramSearch) { extWinTramSearch.hide(); }
}

function onSearchForTramByCity()
{
    showSearchProgress();

    new Ajax.Request('ajaxHandler.ashx', 
    {
        method: 'post',
        parameters: 'M=TC&T=CITY&CITY=' + encodeURIComponent($('lstFindTramByCity_CityList').value),
        onSuccess: function(transport)
        {
            $('panelExtFindTram_Results').innerHTML = transport.responseText;
            if(resultsPanel) { resultsPanel.expand(); }
            hideSearchProgress();
        },
        onComplete: function(transport)
        {
            hideSearchProgress();
        }
    });
}

function onSearchForTramByRoute()
{
    showSearchProgress();
        
    new Ajax.Request('ajaxHandler.ashx', 
    {
        method: 'post',
        parameters: 'M=TC&T=ROUTE&BS_NO=' + encodeURIComponent($('lstFindTramByRoute_RouteList').value),
        onSuccess: function(transport)
        {
            $('panelExtFindTram_Results').innerHTML = transport.responseText;
            if(resultsPanel) { resultsPanel.expand(); }
        },
        onComplete: function(transport)
        {
            hideSearchProgress();
        }
    });
}

function onSearchForTramByAddr()
{
    showSearchProgress();
	var googleAddress = "";
    googleAddress += $('txtFindTramByAddr_CivicNo').value;
    googleAddress += " ";
    googleAddress += $('txtFindTramByAddr_StreetName').value;
    googleAddress += " ";
    googleAddress += $('txtFindTramByAddr_City').value;
    var gmapGeocoder = new google.maps.Geocoder();
    gmapGeocoder.geocode({ 'address': googleAddress }, function (results, status){
        if (status == google.maps.GeocoderStatus.OK && results[0].formatted_address.indexOf('Canada') != -1) {
            var lon = results[0].geometry.location.lng();
            var lat = results[0].geometry.location.lat();
            new Ajax.Request('ajaxHandler.ashx',
            {
                method: 'post',
                parameters: 'M=TC&T=INTER&x=' + lon + '&y=' + lat,
                onSuccess: function (transport) {
                    $('panelExtFindTram_Results').innerHTML = transport.responseText;
                    if (resultsPanel) { resultsPanel.expand(); }
                    hideSearchProgress();
                },
                onComplete: function (transport) {
                    hideSearchProgress();
                }
            });
        } else {
            alert(ST["NoAddressFound"]);
            hideSearchProgress();
        }        
    });  
    
    /*new Ajax.Request('ajaxHandler.ashx', 
    {
        method: 'post',
        parameters: 'M=TC&T=ADDR&CIVIC_NO=' + encodeURIComponent($('txtFindTramByAddr_CivicNo').value) + '&ST=' + encodeURIComponent($('txtFindTramByAddr_StreetName').value) + '&CITY=' + encodeURIComponent($('txtFindTramByAddr_City').value),
        onSuccess: function(transport)
        {
            $('panelExtFindTram_Results').innerHTML = transport.responseText;
            if(resultsPanel) { resultsPanel.expand(); }
            hideSearchProgress();
        },
        onComplete: function(transport)
        {
            hideSearchProgress();
        }
    });*/
}

function onSearchForTramByInter()
{
    showSearchProgress();
    var  googleAddress = $('txtFindTramByInter_Street1').value + " AND " + $('txtFindTramByInter_Street2').value + ", " + $('txtFindTramByInter_City').value + ", " + "QC";
    var gmapGeocoder = new google.maps.Geocoder();
    gmapGeocoder.geocode({ 'address': googleAddress }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK && results[0].formatted_address.indexOf('Canada') != -1) {
            var lon = results[0].geometry.location.lng();
            var lat = results[0].geometry.location.lat();
            new Ajax.Request('ajaxHandler.ashx',
            {
                method: 'post',
                parameters: 'M=TC&T=INTER&x=' + lon + '&y=' + lat,
                onSuccess: function (transport) {
                    $('panelExtFindTram_Results').innerHTML = transport.responseText;
                    if (resultsPanel) { resultsPanel.expand(); }
                    hideSearchProgress();
                },
                onComplete: function (transport) {
                    hideSearchProgress();
                }
            });
        } else {
            alert(ST["NoAddressFound"]);
            hideSearchProgress();
        }        
    });  
}

function showSearchProgress()
{
    progressBar = new Ext.ProgressBar({
        id:'searchProgressBar',
        width:200
    });
    
    progressWindow = new Ext.Window({
        title: ST["Ext_SearchProgress"],
        width: 213,
        height: 50,
        draggable: false,
        resizable: false,
        closable: false,
        modal: false,
        shadow:true,
        items: [progressBar]
    });
    progressWindow.show();
    progressWindow.alignTo(extWinTramSearch.getEl(), "c", [-100,-25]);
    extWinTramSearch.disable();
    progressBar.wait({
            interval:200,
            increment:15
        });
}

function hideSearchProgress()
{
    if(progressBar && progressWindow)
    {
        progressBar.reset();
        progressWindow.close();
        extWinTramSearch.enable();
    }
}

function searchForTram(tabIndex)
{
    if(extWinTramSearch == null)
    {
        var tabs = new Ext.TabPanel({
            activeTab: 0,
            items: [
            {
                title: ST["Ext_TabGeneral"],
                contentEl:'tabExtFindTram_General',
                listeners: {
                    activate: function(p)
                    {
                        if(resultsPanel) { resultsPanel.collapse(); }
                    }
                }
            },
            {
                title: ST["Ext_TabByCity"],
                contentEl:'tabExtFindTram_ByCity'
            },
            {
                title: ST["Ext_TabByRoute"],
                contentEl:'tabExtFindTram_ByRoute'
            },
            {
                title: ST["Ext_TabByAddress"],
                contentEl:'tabExtFindTram_ByAddress'
            },
            {
                title: ST["Ext_TabByIntersection"],
                contentEl:'tabExtFindTram_ByIntersection'
            }]
        });

        resultsPanel = new Ext.Panel({
            title:ST["Ext_PanelResultTitle"],
            contentEl:'panelExtFindTram_Results',
            collapsible: true,
            collapsed: true,
            height:150,
            autoScroll:true
        });
        
        extWinTramSearch = new Ext.Window({
            title: ST["Ext_WindowTitle"],
            width: 400,
            height: 'auto',
            draggable: true,
            resizable: false,
            closable: true,
            modal: true,
            closeAction:'hide',
            shadow:false,
            listeners: {
                move: function(e, x, y)
                {
                    if(resultsPanel) { resultsPanel.hide(); resultsPanel.show(); }
                }
            },
            items: [tabs,resultsPanel]
        });
    }

    if(tabIndex != "undefined")
    {
        var tabPanel = extWinTramSearch.items.item(0);
        tabPanel.setActiveTab(tabPanel.items.item(tabIndex));
    }
    
    extWinTramSearch.show();
}

function search()
{
    return true;
}

function setSelectedIndex(selectObj, value)
{
    var optionsCount = selectObj.options.length
    for(var i = 0; i < optionsCount; i++)
    {
        if(selectObj.options[i].value == value){
            selectObj.selectedIndex = i;
            return true;    
        }
    }
    
    return false;
}

function itinMouseOut(elm)
{
    elm.removeClassName("itineraryBoxActive");
}

function itinMouseOver(elm)
{
    if(typeof elm.removeClassName == 'undefined') Element.extend(elm);
    elm.addClassName("itineraryBoxActive");
}

function itinClick(startMode, startLocation, endMode, endLocation,itinDef)
{
    var params = {SM:startMode , S: startLocation, EM: endMode, E:endLocation, I:itinDef, B: window.location.href};
    var form =  $("formItinerary");
    writeHiddenValues(params, form);
    form.submit();
    
}

function timeStringAddHour(timeString, hoursToAdd)
{
    var arrTime = timeString.split(":");
    
    if(arrTime.length == 2)
    {
        var hour = parseInt(arrTime[0]);
        
        if(isNaN(hour) == false)
        {
            if(hoursToAdd < 0)
            {
                var posHour = Math.abs(hoursToAdd);
                
                if(hour - posHour < 0)
                {
                    return "0:" + arrTime[1];
                }
                else
                {
                    return hour - posHour + ":" + arrTime[1];
                }
            }
            else
            {
                var posHour = Math.abs(hoursToAdd);
                
                if(hour + posHour > 23)
                {
                    return "20:" + arrTime[1];
                }
                else
                {
                    return hour + posHour + ":" + arrTime[1];
                }
            }
        }
        else
        {
            return timeString;
        }
    }
    else
    {
        return timeString;
    }
}

function getTimeTypeFromControl()
{
    if($("rdoTimeType_Departure").checked == true)
    {
        return "departure";
    }
    else
    {
        return "arrival";
    }
}

function setTimeTypeToControl(timeType)
{
    if(timeType == "departure")
    {
        $("rdoTimeType_Departure").checked = true;
    }
    else
    {
        $("rdoTimeType_Arrival").checked = true;
    }
}

function itinSaveStepData()
{
        switch(itinSch.activeStep)
        {
            case 0:
                itinSch.date = $("txtItinDate").value;
                itinSch.searchTimeType = getTimeTypeFromControl();
                itinSch.searchTime = $("txtSearchTime").value;
                
                if(itinSch.searchTimeType == "departure")
                {
                    itinSch.departure.time = itinSch.searchTime;
                    itinSch.arrival.time = timeStringAddHour(itinSch.searchTime, 4);
                }
                else
                {
                    itinSch.arrival.time = itinSch.searchTime;
                    itinSch.departure.time = timeStringAddHour(itinSch.searchTime, -4);
                }
                itinSch.departure.time = timeStringAddHour(itinSch.departure.time, -1);
                itinSch.arrival.time = timeStringAddHour(itinSch.arrival.time, 1);
                break;
       
            case 1: 
                var dep = itinSch.departure;
                dep.address.number = $("txtCivicNo").value.strip();
                dep.address.street = $("txtStreetName").value.strip();
                dep.address.city = $("txtCity").value.strip(); 
                dep.address.text = ''; 
                dep.tram = $("txtItinTRAM").value.strip(); 
                break;
           
            case 2:
                var arr = itinSch.arrival;
                arr.address.number = $("txtCivicNo").value.strip();
                arr.address.street = $("txtStreetName").value.strip();
                arr.address.city = $("txtCity").value.strip();
                arr.address.text = '';
                arr.tram = $("txtItinTRAM").value.strip(); 
                break;
      }
}

function itinPreviousStep()
{
    itinSaveStepData();
    itinMoveStep(-1);
}

function itinNextStep()
{
	delayedExec = new PeriodicalExecuter(itinShowProgress, 0.5);
    itinSaveStepData();
    switch(itinSch.activeStep)
    {
        case 0:
            itinMoveStep(1);
            break;
   
        case 1: 
            var lst = $("lstAddressList");
            var dep = itinSch.departure;
            if(!lst.visible())
            {
                if(dep.address.number != "" && dep.address.street != "" && dep.address.city != "")
                {
                    findAddress(dep);
                } 
                else if(dep.tram != ""){
                    findBusStop(dep.tram);
                }
                else{
                    alert(ST["ItinFieldError"]);
                    showStepElement(1);
                    
                }  
               
            }
            else if(lst.selectedIndex != -1)
            {
                dep.linkId = lst.options[lst.selectedIndex].value;
                dep.address.text = lst.options[lst.selectedIndex].text;
                itinMoveStep(1);
            }
            else
            {
                alert(ST["MustSelectAddress"]); 
                showStepElement(1);   
            }
            break;
        
        case 2:
            var lst = $("lstAddressList");
            var arr = itinSch.arrival;

            if(!lst.visible())
            {
                if(arr.address.number != "" &&  arr.address.street != "" &&  arr.address.city != "")
                {
                    findAddress(arr);
                    if(arr.linkId != null) itinMoveStep(1);
                } 
                else if(arr.tram != ""){
                     findBusStop(arr.tram);
                }
                else{
                    alert(ST["ItinFieldError"]);
                    showStepElement(1);
                }  
               
            }
            else if(lst.selectedIndex != -1)
            {
                arr.linkId = lst.options[lst.selectedIndex].value;
                arr.address.text = lst.options[lst.selectedIndex].text;
                itinMoveStep(1);
            }
            else
            {
                alert(ST["MustSelectAddress"]); 
                showStepElement(1);   
            }
            break;
         case 3:
         {
            var qs = {
                idate: itinSch.date,
                itimetype: itinSch.searchTimeType,
                itime: itinSch.searchTime,
                idtime: itinSch.departure.time,
                idnum: itinSch.departure.address.number,
                idstreet: itinSch.departure.address.street,
                idcity: itinSch.departure.address.city,
                idtext: itinSch.departure.address.text,
                idtram: itinSch.departure.tram,
                idlink: itinSch.departure.linkId,
                iatime: itinSch.arrival.time,
                ianum: itinSch.arrival.address.number,
                iastreet: itinSch.arrival.address.street,
                iacity: itinSch.arrival.address.city,
                iatext: itinSch.arrival.address.text,
                iatram: itinSch.arrival.tram,
                ialink: itinSch.arrival.linkId,
                idx: itinSch.departure.x,
                idy: itinSch.departure.y,
                iax: itinSch.arrival.x,
                iay: itinSch.arrival.y   
                
            }  
            
            
            var form =  $("formSearch");
            writeHiddenValues(qs, form);
            form.submit();
            
         }
    }     
}

function buildAddressText(civicNumber, segDef)
{
    var s = civicNumber + " " + segDef.StreetName + ", " + segDef.BoroughName;
    
    if(segDef.CityName != segDef.BoroughName) s+= ", " + segDef.CityName;
    if(segDef.CountyName != segDef.CityName) s+= ", " + segDef.CountyName;
    s+= ", " + segDef.ProvinceName;
    
    return capitalizeEachWord(s);
}

function capitalizeEachWord(a)
{
    var b="";
    var same=true;
    for (i=0;i<=a.length;i++) {
        m = a.substr(i,1)
        b += (same)? m.toUpperCase(): m.toLowerCase();
        same = (m.toUpperCase() == m.toLowerCase())
    }
    return b;
}

function findAddress(locationObj)
{
    var googleAddress = "";
    var address = locationObj.address;
    googleAddress += address.number;
    googleAddress += " ";
    googleAddress += address.street;
    googleAddress += " ";
    googleAddress += address.city;
    address.text = googleAddress;
    var gmapGeocoder = new google.maps.Geocoder();
    gmapGeocoder.geocode({ 'address': googleAddress }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK && results[0].formatted_address.indexOf('Canada') != -1) {
            if (itinSch.activeStep == 1 ) {
                itinSch.departure.x = results[0].geometry.location.lng();
                itinSch.departure.y = results[0].geometry.location.lat();
                itinSch.departure.address.text = results[0].formatted_address;
                itinMoveStep(1);
            } else {
                itinSch.arrival.x = results[0].geometry.location.lng();
                itinSch.arrival.y = results[0].geometry.location.lat();
                itinSch.arrival.address.text = results[0].formatted_address;
                itinMoveStep(1);
            }
        } else {
            alert(ST["NoAddressFound"]);
            showStepElement(1);
        }
    });  
}

function findBusStop(sTramCode)
{
    var req = new Ajax.Request('ajaxHandler.ashx', 
    {
        method: 'post',
        parameters: {M:"NAV", CMD:"TRAM_EXISTS", T: sTramCode},
        onSuccess: function(transport) 
        {
            var result = eval("(" + transport.responseText + ")");
            if(result.ResponseContent == 1)
            {
                itinMoveStep(1);
            }
            else
            { 
                alert(ST["StopInvalid"]);
                showStepElement(1);
            } 
        }
    });
    
    
}

function itinShowProgress()
{
    showStepElement(3);
}

function showStepElement(elementIndex)
{
    var stepElms = $("tdItinSearchInput").childElements();
    for(var i=0; i < stepElms.length; i++){
        stepElms[i].hide();        
    }
    if(delayedExec) delayedExec.stop();
    stepElms[elementIndex].show();
}

function itinMoveStep(stepCount)
{
    itinSch.activeStep += stepCount;
    
    var stepLbls= $$(".stepBox");
    var stepArrows = $$(".arrowImg");
    
    for(var i=0; i < stepLbls.length; i++)
    {
        Element.extend(stepLbls[i]);
        Element.extend(stepArrows[i]);
        stepArrows[i].setStyle({visibility: 'hidden'});
        stepLbls[i].addClassName("inactiveStepBox");
    }
    
    switch(itinSch.activeStep)
    {
        case 0:
            $("txtItinDate").value = itinSch.date;
            $("txtSearchTime").value = itinSch.searchTime;
            setTimeTypeToControl(itinSch.searchTimeType);
            
            $("aPrevious").setStyle({visibility: "hidden"});
            showStepElement(0);
            break;
        case 1:
            
            divIndex = 1;
            $("txtCivicNo").value = itinSch.departure.address.number;
            $("txtStreetName").value = itinSch.departure.address.street;
            $("txtCity").value = itinSch.departure.address.city;
            $("txtItinTRAM").value = itinSch.departure.tram ; 
                           
            $("divStep2Instructions").update(ST["EnterStartAddressStop"]);
            $("lstAddressList").hide();
            $("tblStep2Input").show();
            
            itinSch.departure.linkId = null;
            itinSch.departure.text = "";
            $("aPrevious").setStyle({visibility: "visible"});
            showStepElement(1);
            break;
        case 2:
            $("txtCivicNo").value = itinSch.arrival.address.number;
            $("txtStreetName").value = itinSch.arrival.address.street;
            $("txtCity").value = itinSch.arrival.address.city;
            $("txtItinTRAM").value = itinSch.arrival.tram;   
                            
            $("divStep2Instructions").update(ST["EnterEndAddressStop"]);
            $("lstAddressList").hide();
            $("tblStep2Input").show();
            
            itinSch.arrival.linkId = null;
            itinSch.arrival.text = "";
            $("spanNext").update(ST["Next"]);
            
            var resultDiv = $("resultBox");
            showStepElement(1);
 
            break;
        case 3:
            var sDateSum = sprintf(ST["AddressSum"], itinSch.date, itinSch.searchTimeType == "departure" ? ST["Leave"] : ST["Arrive"], itinSch.searchTime);
            var sDepSum = (itinSch.departure.address.text != "") ? itinSch.departure.address.text : sprintf(ST["BusStopSum"], itinSch.departure.tram);
            var sArrSum = (itinSch.arrival.address.text != "") ? itinSch.arrival.address.text : sprintf(ST["BusStopSum"], itinSch.arrival.tram);
            
            $("tdDateSummary").update(sDateSum.escapeHTML());
            $("divDepSummary").update(sDepSum.escapeHTML());
            $("divArrSummary").update(sArrSum.escapeHTML());
            
            $("spanNext").update(ST["Search"]);
            $("aPrevious").setStyle({visibility: "visible"});
            showStepElement(2);
            break;
    }
       
    stepLbls[itinSch.activeStep].removeClassName("inactiveStepBox"); 
    stepArrows[itinSch.activeStep].setStyle({visibility: 'visible'}); 
}

function today()
{
    var date = new Date();
    if(!date) return "";
    sDay = String(date.getDate());
    sMonth =  String(date.getMonth() + 1); 
    sYear = String(date.getFullYear());
    
    if(sDay.length == 1) sDay = "0" + sDay;
	if(sMonth.length == 1) sMonth = "0" + sMonth;
	return sDay + "/" + sMonth + "/" + sYear;
}

function writeHiddenValues(params, form)
{   
    for(var pName in params){
        if(params[pName] != null)
        {
            var field = $(pName);
            if(!field){
                field = new Element("INPUT", {type: "hidden", name: pName, id: pName});
                form.appendChild(field);
            }
            field.value = params[pName];
        }
    }
}

function toQueryParams(s)
{
    s = s.replace(/\+/g,' ');
    return s.toQueryParams(); 
}
