var stopMgrMap = null;
var latdiff = 0;
var lngdiff = 0;
var stopMgrInitialized = false;
var stopMgrLoadedAgency = null;
var markerList = new Array();

Ext.onReady(function () {

function stopMgrInit(stopMgrPanel) {
    if (! stopMgrInitialized) {
        loadStopMgr(true);
        stopMgrInitialized = true;
    } else if (stopMgrLoadedAgency != yai) {
        stopMgrLoadedAgency = yai;
        loadStopMgr();
    }
}

function getStopsForMap() {
    clearMarkerList();
    // there's no point plotting if you're zoomed way out
    if (Map.gmap.getZoom() >= 13) {
	var n = Map.gmap.getBounds().getNorthEast().lat();
	var s = Map.gmap.getBounds().getSouthWest().lat();
	var e = Map.gmap.getBounds().getNorthEast().lng();
	var w = Map.gmap.getBounds().getSouthWest().lng();
	var centerLat = Map.gmap.getCenter().lat();
	var centerLng = Map.gmap.getCenter().lng();
	StopNearStore.reload({params: { centerLat: centerLat, centerLng: centerLng, n: n, s: s, e: e, w: w, yai: yai } });
    }
}

function clearMarkerList() {
    for (var ctr = 0; ctr < markerList.length; ctr++) {
        GEvent.removeListener(markerList[ctr].listener);
        Map.gmap.removeOverlay(markerList[ctr]);
    }
    markerList = new Array();
}

function removeMarker(stop_id) {
    for (var ctr = 0; ctr < markerList.length; ctr++) {
        if (markerList[ctr].stop_id == stop_id) {
            var marker = markerList.splice(ctr, 1);
            GEvent.removeListener(marker.listener);
            Map.gmap.removeOverlay(marker);
        }
    }
}

function addMarker(glatlng, stop) {
    var marker = new GMarker(glatlng, defaultIcon);
    marker.stop = stop;
    marker.listener = GEvent.addListener(marker, 'click', function (overlay, latlng, overlaylatlng) {
        showStopInfo(this.stop);
    }); 
    markerList.push(marker);
    return marker;
}


// Stop Grid Config
var Stop = Ext.data.Record.create([
	{ name: 'id',                   mapping: 'g_stop_id' },
	{ name: 'code',                 mapping: 'g_stop_code' },
	{ name: 'name',                 mapping: 'g_stop_name' },
	{ name: 'desc',                 mapping: 'g_stop_desc' },
	{ name: 'lat',                  mapping: 'g_stop_lat' },
	{ name: 'lng',                  mapping: 'g_stop_lon' },
	{ name: 'zone_id',              mapping: 'g_zone_id' },
	{ name: 'url',                  mapping: 'g_stop_url' },
	{ name: 'location_type',        mapping: 'g_location_type' },
	{ name: 'parent_station',       mapping: 'g_parent_station' }
    ]);

var StopProxy = new Ext.data.HttpProxy({ url: 'json.php', method: 'GET' });
var StopReader  = new Ext.data.JsonReader({ root: 'rows' }, Stop);
var StopNearStore = new Ext.data.Store({
    proxy: StopProxy,
    reader: StopReader,
    baseParams: {
	task: 'getStopsNear'
    }
});
StopNearStore.on('load', function(store, obj) {
    clearMarkerList();
    StopNearStore.each(function (stop) {
	marker = addMarker(new GLatLng(stop.data.lat, stop.data.lng), stop);
	Map.gmap.addOverlay(marker);
    });
    main.tabs.stopMgr.stopList.setTitle('Stops (' + StopNearStore.getTotalCount() + ')');
});
var StopGrid = new Ext.grid.GridPanel({
    id: 'stopGrid',
    store: StopNearStore,
    loadMask: true,
    autoScroll: true,
    header: false,
    viewConfig: {
	forceFit: true
    },
    columns: [
	{width: 50, sortable: false, dataIndex: 'name'}
    ],
    selModel: new Ext.grid.RowSelectionModel()
});

function showStopInfo(stop) {
    if (stop.data.desc.length == 0) {
        desc = '[no description provided]';
    } else {
        desc = stop.data.desc;
    }
    StopRouteStore.reload({ params: { yai: yai, stop_id: stop.data.id } });
    StopRouteStore.on('load', function() {
        StopRouteStore.purgeListeners();
        var servicedby = '';

        StopRouteStore.each(function (rec) {
            servicedby += '<tr><td><div style="background-color: #' + rec.data.color + '; height: 12; width: 12;"></div></td><td style="font-size: 12px;">' + rec.data.short_name + ": " + rec.data.long_name + "</td></tr>";
        }, this);
        Map.gmap.openInfoWindowHtml(new GLatLng(stop.data.lat, stop.data.lng), '<div style="font-family: arial; font-size: 12px;">' + stop.data.name + '<hr>' + desc + '<hr>Serviced by routes:<br><table>' + servicedby + '</table></div>');
    }, this);
}

StopGrid.selModel.on('rowselect', function(s, rowIndex, stop) {
    showStopInfo(stop);
    StopForm.getForm().items.each(function (field) {
        field.setValue(stop.get(field.name));
    });
});
var StopRouteReader = new Ext.data.JsonReader({ root: 'rows' }, Route);
var StopRouteProxy = new Ext.data.HttpProxy({ url: 'json.php', method: 'GET' });
StopRouteStore = new Ext.data.Store({
    proxy: StopRouteProxy,
    reader: StopRouteReader,
    baseParams: {
        task: 'getRoutesForStop'
    }
});


function toggleNearStops(button, e) {
    if (button.pressed == true) {
        zoomListener = GEvent.addListener(Map.gmap, 'zoomend', function (oldz, newz) {
            // only on zoom in
            if (oldz > newz) return;
            getStopsForMap();
        });
        moveListener = GEvent.addListener(Map.gmap, 'dragend', function () {
            getStopsForMap();
        });
        getStopsForMap();
    } else {
        clearMarkerList();
        GEvent.removeListener(moveListener);
        GEvent.removeListener(zoomListener);
    }
}


var Map = new Ext.ux.GMapPanel({
    xtype: 'gmappanel',
    region: 'center',
    zoomLevel: 15,
    gmapType: 'map',
    mapConfOpts: [
        'enableScrollWheelZoom',
        'enableDoubleClickZoom',
        'enableDragging'
    ],
    mapControls: ['GLargeMapControl3D', 'GMapTypeControl'],
    mapTypes: [G_NORMAL_MAP,G_SATELLITE_MAP,G_HYBRID_MAP,G_PHYSICAL_MAP],
    setCenter: {
        geoCodeAddr: 'USA',
        marker: {title: 'USA'}
    },
    markers: []
});


var StopForm = new Ext.FormPanel({
    id: 'stopForm',
    region: 'south',
    frame: true,
    layout: 'fit',
    bodyStyle: 'padding: 0 0 0',
    items: [{
        layout: 'column',
        items: [{
            columnWidth: .25,
            layout: 'form',
            items: [
                { xtype: 'textfield', fieldLabel: 'Stop ID', name: 'id' },
                { xtype: 'textfield', fieldLabel: 'Stop Name', name: 'name' }]
        },{
            columnWidth: .25,
            layout: 'form',
            items: [
                { xtype: 'textfield', fieldLabel: 'Code', name: 'code' },
                { xtype: 'textfield', fieldLabel: 'Zone ID', name: 'zone_id' }
            ]
        },{
            columnWidth: .25,
            layout: 'form',
            items: [
                { xtype: 'textfield', fieldLabel: 'Is Station?', name: 'location_type' },
                { xtype: 'textfield', fieldLabel: 'Station', name: 'parent_station' }
            ]
        },{
            columnWidth: .25,
            layout: 'form',
            items: [
                { xtype: 'textfield', fieldLabel: 'Latitude', name: 'lat' },
                { xtype: 'textfield', fieldLabel: 'Longitude', name: 'lng' }
            ]
        }]
    },{
        xtype: 'textarea',
        fieldLabel: 'Description',
        name: 'desc',
        height: '100',
        anchor: '98%'
    }],
    buttons: [{ text: 'Save' }]
});

var stopMgr = new Ext.Panel({
    layout: 'border',
    id: 'stopMgr',
    title: 'Stop Manager',

    defaults: {
	collapsible: true,
	split: true,
        animFloat: false,
        autoHide: false,
        useSplitTips: true
    },
    items: [{
	title: 'Stop Information',
	id: 'stopMgrStopinfo',
	region: 'south',
        floatable: false,
        layout: 'fit',
	height: 150,
	minSize: 75,
	maxSize: 250,
        margins: '0 0 0 0',
	cmargins: '5 0 0 0',
        items: [StopForm]
    },{
	title: 'Stops',
	id: 'stopMgrStoplist',
	region:'west',
        floatable: false,
	margins: '0 0 0 0',
	cmargins: '5 5 0 0',
        layout: 'fit',
	width: 175,
	minSize: 100,
	maxSize: 250,
        items: [StopGrid]
    },{
id: 'stopMgrMap',
        tbar: new Ext.Toolbar({
                items: [
                    { id: 'nearToggle', text: 'Show Nearby Stops', enableToggle: true, pressed: true, handler: toggleNearStops }
                ]
            }),
	collapsible: false,
        layout: 'fit',
	region:'center',
	margins: '0 0 0 0',
        items: [Map]
        
    }]
});

function loadStopMgr(init) {
    stopMgrLoadedAgency = yai;
    if (init) {
        GEvent.addListener(Map.gmap, 'load', function () {
                getStopsForMap();
        });
        zoomListener = GEvent.addListener(Map.gmap, 'zoomend', function (oldz, newz) {
            // only on zoom in
            if (oldz > newz) {
                getStopsForMap();
            }
        });
        moveListener = GEvent.addListener(Map.gmap, 'dragend', function () {
                getStopsForMap();
        });
        ads = new GAdsManager(Map.gmap, 'ca-pub-7897815954291269', { channel: '0833443484', maxAdsOnMap: 10 } );
        ads.enable();
    }
    if (! init && shapeMgrLoadedAgency == yai) {
        return;
    }
    if (agency && agency.data.lat && agency.data.lng) {
        Map.setMapCenter(defaultLat + ',' +  defaultLng);
    } else if (agency && agency.data.city) {
        //Ext.MessageBox.alert('GeoCoding Info', 'The default map location was geocoded from "' + agency.data.city + '".  You can set the default map location in the agency manager.');
        Map.setMapCenter(agency.data.city);
    } else {
        Ext.MessageBox.alert('Warning', 'The default map location and city name are not set.');
        Map.setMapCenter('USA');
    }
}

    main.tabs.stopMgr = main.tabs.add(stopMgr);
    main.tabs.stopMgr.stopList = stopMgr.findById('stopMgrStoplist');
    main.tabs.stopMgr.map = stopMgr.findById('stopMgrMap');
    main.tabs.stopMgr.stopInfo = StopForm;
    // initial the records
    main.tabs.stopMgr.on('activate', stopMgrInit);

});

// vim: et sts=4 cindent sw=4
