var all_towers = [];
var hull_icon;
var celltower_icon;

var DBG_SHOW_HVERTICES = false;

function initGSMIcons() {
    hull_icon = new GIcon();
    hull_icon.image = "icons/i_hull.png";
    hull_icon.shadow = "icons/shadow.png";
    hull_icon.iconSize = new GSize(24,20);
    hull_icon.shadowSize = new GSize(34,20);
    hull_icon.iconAnchor = new GPoint(6, 18);    
    hull_icon.infoWindowAnchor = new GPoint(9, 5);

    celltower_icon = new GIcon();
    celltower_icon.image = "icons/i_gsm_tower.png";
    celltower_icon.shadow = "icons/shadow.png";
    /*
    celltower_icon.iconSize = new GSize(38,62);
    celltower_icon.shadowSize = new GSize(42,20);
    */
    celltower_icon.iconSize = new GSize(30,48);
    celltower_icon.iconAnchor = new GPoint(16, 58);    
    celltower_icon.infoWindowAnchor = new GPoint(9, 5);

    
}

// ============
// CLASSES
// ============

// Constructor
// input: 
//  center - GLatLng object
//  size - number of data points in cluster
function GSMCell(center_, size_, hull_, lac_, cellid_) {
    this.center = center_;
    this.size = size_;
    this.hull = hull_;
    this.lac = lac_;
    this.cellid = cellid_;


    // create marker
    // this marker is created before drawing, based on density
    var cmarker = createCellMarker(this);

    // create polyline circle
    this.hull.push(this.hull[0]);
    var hullpoly = new GPolygon(this.hull, 1, '#ff0000');
    this.hull.pop();

    // create hull structures
    var hullmarkers = [];
    for (var j in this.hull) {
        var marker = new GMarker(this.hull[j], hull_icon);
        hullmarkers.push(marker);
    }

    if (DBG_FLAG)
        dbg("cluster [" + this.size + "]: (" + this.center.lat() + ", " + this.center.lng() + ")"); 

    this.info_contents = 
                "<b>id:</b> (" + this.lac + ", " + this.cellid + "<br>" +
                "<b>center:</b> " + this.center.lat() + ", " + this.center.lng() + "<br>"+
                "<b>size:</b> " + this.size + "<br>" +
                "<b># hull vertices:</b> " + this.hull.length + "<br>";

    this.erase = function() {
        // add all hull markers
        if (hullmarkers.length > 1) {
            for (var i in hullmarkers) {
                map.removeOverlay(hullmarkers[i]);
            }
            map.removeOverlay(hullpoly);
        }
        // add centroid marker
        map.removeOverlay(cmarker);
        // add polyline
    }

    this.draw = function() {
        // add all hull markers
        if (hullmarkers.length > 1) {
            if (DBG_SHOW_HVERTICES) {
                for (var i in hullmarkers) {
                    map.addOverlay(hullmarkers[i]);
                }
            }
            map.addOverlay(hullpoly);
        }
        // add centroid marker
        map.addOverlay(cmarker);
        // add polyline
    }

    this.infopop = function() {
        cmarker.openInfoWindowHtml(this.info_contents);
    }
}


// input:   c is a cell 
// ouput:   returns a marker with appropriate info window labelling
function createCellMarker(c) {
    var marker = new GMarker(c.center, celltower_icon);
    //var marker = new GMarker(c.center, celltower_icon);
    GEvent.addListener(marker, "mouseover", 
        function() {
            marker.openInfoWindowHtml(c.info_contents);
        }
    );

    GEvent.addListener(marker, "click", 
        function() {
            c.erase()
        }
    );
    return marker;
}

// -------------------------
// AJAX loading stuff

function loadGSMCellData() {
    var file_arg = 'data/larry/larry-gsm-plot.xml';
    map.clearOverlays();
    all_towers=[];
    dbg_clear('dbg_txt');
    dbg('loading XML GSM Towers from: '+ file_arg);
    var request = GXmlHttp.create();
    request.open('GET', file_arg, true);
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            var xmlDoc = request.responseXML;
            var xml_cells = xmlDoc.documentElement.getElementsByTagName("GSM_Cell");
            var meta = xmlDoc.documentElement.getElementsByTagName("Data");
            var discoveries = parseInt(meta[0].getAttribute("discoveries"));
            dbg(""+ discoveries + " unique celltower id's");
            dbg("xml_cells: " + xml_cells.length);
            xml_parse_cell(xml_cells);
        }

    }
    request.send(null);
}

function xml_parse_cell(cells_) {
    for (var i in cells_) {
        var e = cells_[i]
        var e_hull = e.getElementsByTagName("ConvexHull");
        var size = e.getElementsByTagName("Size");
        var lac = e.getElementsByTagName("LAC");
        var cid = e.getElementsByTagName("CellId");
        var hullpts = e.getElementsByTagName("HVertex");
        
        // size of places where we've seen this tower, lac, id
        size = parseInt(size[0].firstChild.nodeValue);
        lac = lac[0].firstChild.nodeValue;
        cid = cid[0].firstChild.nodeValue;
        
        // center of convex hull
        var clat = parseFloat(e_hull[0].getAttribute("clat"));
        var clng = parseFloat(e_hull[0].getAttribute("clng"));
        var hullsize = parseInt(e_hull[0].getAttribute("size"));
        var center = new GLatLng(clat,clng);

        if (DBG_FLAG) {
            dbg('('+lac+','+cid+'): size='+size+', hull@('+clat+', '+clng+') w/ '+ hullpts.length +' vertices');
        }

        var hull = [];
        for (var j=0; j < hullpts.length; j++) {
            var hp = hullpts[j];
            var hlat = parseFloat(hp.getAttribute("lat"));
            var hlng = parseFloat(hp.getAttribute("lng"));
            hull.push(new GLatLng(hlat,hlng));
        }
        
        // XXX remove (0,0) id
        if (lac == '0' && cid == '0')
            continue;

        var cell = new GSMCell(center, size, hull, lac, cid);
        all_towers.push(cell);


        if (i == cells_.length-1) {
            dbg('done: length of all_towers='+all_towers.length);
            all_towers.sort(function(a,b) { return b.size - a.size; });
            populate_gsm_list();
            
        }
    } 
} 

function populate_gsm_list() {
    var target = document.forms['form_GSM'].elements['gsm_select'];
    target.length = 0;
    target.length = all_towers.length;

    for (var index in all_towers) {
        var tower = all_towers[index];
        target[index].text = '[' + tower.size + ',' +tower.hull.length+'] (' + tower.lac + ','+ tower.cellid +')';
        target[index].value = index;
    }
}

function draw_cell(cell) {
    //map.clearOverlays();
    cell.draw();
    map.setCenter(cell.center);
    cell.infopop();
}

function draw_all_cells() {
    //map.clearOverlays();
    for (var i in all_towers) {
        all_towers[i].draw();
    }
}

function draw_big_cells() {
    //map.clearOverlays();
    for (var i=0; i < 5; i++) {
        all_towers[i].draw();
    }
}

function clear_cells() {
    for (var i in all_towers) {
        all_towers[i].erase();
    }
}

function set_dbg_hvertices(val) {
    DBG_SHOW_HVERTICES = val;
}
