var DEVXMain = function (data) {
	this.data = data;
    this.loading = false;
    this.entryTab = false;
    this.indexTableId = 0;
    this.indexTablesCount = 2;
    this.indexValues = [];
    this.excerptValues = [];
    this.moversLoading = false;
    this.markers = [];
    this.mapButtons = ['rare-earth', 'lithium', 'heavy-minerals', 'tantalum', 'indium', 'niobium'];
    this.mapInitPosition = {
        'rare-earth' : {zoom : 1, center : new google.maps.LatLng(37, -104)},
        'lithium' : {zoom : 1, center : new google.maps.LatLng(37, -109)},
        'heavy-minerals' : {zoom : 1, center : new google.maps.LatLng(20, -104)},
        'tantalum' : {zoom : 1, center : new google.maps.LatLng(34, 8)},
        'indium' : {zoom : 1, center : new google.maps.LatLng(22, -123)},
        'niobium' : {zoom : 1, center : new google.maps.LatLng(34, -98)}
    };
    this.currentMapId = 'rare-earth';
    this.markerId = -1;
};

DEVXMain.prototype.showTab = function (tab, hq_c) {
    for(var k in this.data.tabs) {
        if ((k == tab) || !Ext.get(this.data.li_prefix + this.data.tabs[k])) {
            continue;
        }
        Ext.get(this.data.li_prefix + this.data.tabs[k]).removeClass('current_tab');
        Ext.get(this.data.a_prefix + this.data.tabs[k]).removeClass('view_menu_curr');
    }
    Ext.get(this.data.li_prefix + tab).addClass('current_tab');
    Ext.get(this.data.a_prefix + tab).addClass('view_menu_curr');
    var form=new DEVXForm({'loader':loader});
    form.loadObj2ID('index.php?act=main&hdl=companies&hq_c='+hq_c, this.data.tabDiv, function () {
        eval(form.jscode);
    });
}

DEVXMain.prototype.showMoversTab = function(tab) {
    if (this.moversLoading || this.currentMoversTab == tab) return;
    this.currentMoversTab = tab;
    this.moversLoading = true;
//    var mask = new Ext.LoadMask(Ext.get('moversData'));
//    mask.show();
    for (var i = 0; i < this.moversTabs.length; i++) {
        if (this.moversTabs[i] == tab) {
            Ext.get('li_'+this.moversTabs[i]).addClass('current_tab');
            continue;
        }
        Ext.get('li_'+this.moversTabs[i]).removeClass('current_tab');
    }
	var cform=new DEVXForm({'loader':loader});
	var url='index.php?act=movers&hdl=fp_companies_list';
    if (tab == 'gainers') {
        url += '&gainer=Y';
    } else if (tab == 'losers') {
        url += '&loser=Y';
    } else if (tab == 'volume') {
        url += '&volume_gainer=Y';
    }
    var s = this;
	cform.loadObj2ID(url, 'moversData', function() { /*mask.hide();*/ s.moversLoading = false;});
}


DEVXMain.prototype.loadIndexPreviews = function() {
    var count = this.indexValues.length;
    for (var i = 0; i < count; i++) {
        $('#indexPreview'+i).sparkline(this.indexValues[i], {
            type: 'line',
            height: '15px',
            width: '46px',
            lineColor: '#00f',
            fillColor: '#cdf',
            spotColor: '#f80',
            spotRadius: 1,
            lineWidth: 1
        });
    }
    for (i in this.excerptValues) {
        if (!parseInt(i)) {
            continue;
        }
        $('.company-spark-line-chart-'+i).sparkline(this.excerptValues[i], {
            type: 'line',
            height: '15px',
            width: '46px',
            lineColor: '#00f',
            fillColor: '#cdf',
            spotColor: '#f80',
            spotRadius: 1,
            lineWidth: 1
        });
    }
}

DEVXMain.prototype.showIndexTable = function(id) {
    if (id == this.indexTableId) return;
    this.indexTableId = id;
    for (var i = 0; i < this.indexTablesCount; i++) {
        if (i == id) {
            $('#indexTable'+i).show();
            document.getElementById('selectIndexTable'+i).src = this.url+'images/index-button'+i+'-selected.png';
            continue;
        }
        $('#indexTable'+i).hide();
        document.getElementById('selectIndexTable'+i).src = this.url+'images/index-button'+i+'-unselected.png';
    }
}

DEVXMain.prototype.initMap = function() {
    var myOptions = {
        zoom: 2,
        scrollwheel: false,
        center: new google.maps.LatLng(0, 0),
        disableDoubleClickZoom : true,
        streetViewControl : false,
        mapTypeControl : false,
        zoomControlOptions : {
            style : google.maps.ZoomControlStyle.SMALL,
            position : google.maps.ControlPosition.TOP_RIGHT
        },
        mapTypeId: google.maps.MapTypeId.TERRAIN
    };
    
    this.map = new google.maps.Map(document.getElementById('googleMapDiv'), myOptions);
    
    var s = this;
    google.maps.event.addListener(this.map, 'projection_changed', function(){
        s.dummy = new DummyOView(s.map);
        s.updateCurrentMarkerPopupPosition();
    });
    google.maps.event.addListener(this.map, 'center_changed', function(){
        if (Ext.get('markerPopup')) Ext.get('markerPopup').hide();
    });
    google.maps.event.addListener(this.map, 'zoom_changed', function(){
        if (Ext.get('markerPopup')) Ext.get('markerPopup').hide();
    });
    google.maps.event.addListener(this.map, 'idle', function(){
        s.updateCurrentMarkerPopupPosition();
    });
    google.maps.event.addListener(this.map, 'drag', function(){
        s.updateCurrentMarkerPopupPosition();
    });
//    google.maps.event.addListener(this.map, 'dragend', function(){
//        alert(s.map.getCenter().lat() + ' ' + s.map.getCenter().lng());
//    });
}

DEVXMain.prototype.addPropMarker = function(prop_count, id, geometry, color) {
    var img = 'fp_marker_'+color;
    var mwidth = 12;
    var mheight = 17;
    var offset = 58;
    var size = 1;
    if (prop_count > 1) {
        offset = (prop_count < 10)? 60 : 62;
        mwidth = mheight = (prop_count < 10)? 28 : 32;
        size = (prop_count < 10)? 2 : 3;
        if (prop_count < 15) {
            img = 'marker_count_'+prop_count;
        } else {
            img = 'marker_count_more_14';
        }
    }
    var position = new google.maps.LatLng(geometry.lat, geometry.lng);

    var count = this.markers.length;
    for (var i = 0; i < count; i++) {
        if (this.markers[i].markerSize < size){
            this.markers[i].setZIndex(this.markers[i].getZIndex()+1);
        }
    }

    this.markers[id] = new google.maps.Marker({
        flat : true,
        icon : new google.maps.MarkerImage(
            this.url+'img/markers/'+img+'.png',
            new google.maps.Size(mwidth, mheight),
            new google.maps.Point(0,0),
            new google.maps.Point(mwidth/2, mheight),
            new google.maps.Size(mwidth, mheight)
        ),
        raiseOnDrag : false,
        position: position,
        zIndex : 4 - size
    });
    this.markers[id].markerSize = size;
    this.markers[id].popupOffset = offset;
    geometry.location = position;
    this.markers[id].resultGeometry = geometry;
    var s = this;
    google.maps.event.addListener(this.markers[id], 'click', function(e){ s.onPropMarkerClick(e, id) });
}

DEVXMain.prototype.afterPropMarkersLoaded = function() {
    var bounds = new google.maps.LatLngBounds();
    
    var count = this.markers.length;
    for (var i = 0; i < count; i++) {
        this.markers[i].setMap(this.map);
        var geometry = this.markers[i].resultGeometry;
        if (geometry.region) {
            for (var k in geometry.region) {
                if (typeof(geometry.region[k].lat) == 'undefined') continue;
                bounds.extend(new google.maps.LatLng(geometry.region[k].lat, geometry.region[k].lng))
            }
        }
    }

    this.map.setMapTypeId(google.maps.MapTypeId.TERRAIN);
    if (this.mapInitPosition[this.currentMapId]) {
        this.map.setZoom(this.mapInitPosition[this.currentMapId].zoom);
        this.map.setCenter(this.mapInitPosition[this.currentMapId].center);
    }
    //this.map.fitBounds(bounds);
}

DEVXMain.prototype.clearMapMarkers = function() {
    var count = this.markers.length;
    for (var i = 0; i < count; i++) {
        this.markers[i].setMap(null);
    }
    this.markers = [];
    this.markerId = -1;
}

DEVXMain.prototype.changeMapList = function(id, mineral, link) {
    var count = this.mapButtons.length;
    for (var i = 0; i < count; i++) {
        if (this.mapButtons[i] == id) {
            Ext.get('fp-Button-'+this.mapButtons[i]).addClass('fp-mapButtons-selected');
            continue;
        }
        Ext.get('fp-Button-'+this.mapButtons[i]).removeClass('fp-mapButtons-selected');
    }
    var form=new DEVXForm({'loader':loader});
    this.currentMapId = id;
    form.loadObj2ID('index.php?act=main&hdl=map_data&mineral='+mineral+'&link='+link, 'fp-mapLeft', function () {
        eval(form.jscode);
    });
}

DEVXMain.prototype.onPropMarkerClick = function(e, id) {
    if (typeof(this.markers[id]) == 'undefined') {
        this.markerId = -1;
        Ext.get('markerPopup').hide();
        return;
    }
    var marker = this.markers[id];
    if (this.markerId == id) {
        this.updateCurrentMarkerPopupPosition();
    } else {
        this.markerId = id;
        document.getElementById('markerPopupContent').innerHTML = '';
        document.getElementById('markerPopupContent').style.height = '';
        this.updateCurrentMarkerPopupPosition();
        var mask = new Ext.LoadMask('markerPopup', {msg : '&nbsp;', msgCls : 'x-mask-loading-fp-map'});
        mask.show();
        var form=new DEVXForm({'loader':loader});
        var s = this;
        form.loadObj2ID('index.php?act=main&hdl=map_marker_popup&mineral='+this.currentMineral+'&lat='+marker.resultGeometry.lat+'&lng='+marker.resultGeometry.lng, 'markerPopupContent', function () {
            mask.hide();
            eval(form.jscode);
            s.updateCurrentMarkerPopupPosition();
        });
    }
}

DEVXMain.prototype.updateCurrentMarkerPopupPosition = function() {
    if (typeof(this.markerId) == 'undefined' || this.markerId == -1 || typeof(this.markers[this.markerId]) == 'undefined'
        || this.loading || typeof(this.dummy) == 'undefined' || typeof(this.dummy.getProjection()) == 'undefined')
    {
        return;
    }
    var marker = this.markers[this.markerId];
    var map_div = Ext.get('googleMapDiv');
    var point = this.dummy.getProjection().fromLatLngToContainerPixel(marker.resultGeometry.location);
    if (typeof(point) == 'undefined') {
        return;
    }
    var offset = [2, -17];
    if (marker.markerSize == 2) {
        offset = [-4, -25];
    } else if (marker.markerSize == 3) {
        offset = [-5, -29];
    }
    var x = point.x + offset[0];
    var y = point.y + offset[1];
    var el = Ext.get('markerPopup');
    if (x <= 0 || y <= 0 || x >= map_div.getWidth() || y >= map_div.getHeight()) {
        this.markerId = -1;
        el.hide();
        return;
    }
    var left = x  + map_div.getLeft() - el.getWidth() / 2 + this.markers[this.markerId].popupOffset;
    var top = y + map_div.getTop() - el.getHeight();
    el.applyStyles({left: left+'px', top: top+'px'});
    el.show();
}

DEVXMain.prototype.closeMarkerWindow = function() {
    this.markerId = -1;
    if (Ext.get('markerPopup')) Ext.get('markerPopup').hide();
}

var main = new DEVXMain({});
