
function SprayMissionTable(mapinfo,type,options) {
    this.mapinfo = mapinfo;
    this.missionlist = [];
    this.missionmap = {};
    this.type = type;
    if ( this.type == "active" ) {
       this.tablename = "Active Missions";
       this.headers = ['Mission','Line','Begin','End'];
    }
    if ( this.type == "completed" ) {
       this.tablename = "Completed Missions";
       this.headers = ['Mission','Line','Begin','End'];
    }

    this.setOptions(options);
    this.hideIfEmpty = true;
    this.table = new SortableCheckTable(this.tablename.replace(/ /,''),options);
    this.table.setCaption(this.tablename); 
    this.table.setHeaders(this.headers); 
    this.table.sortColumn = 2;
    this.table.secondarySortColumn = 3;
    this.l = this.mapinfo.layers[this.mapinfo.layerMapping[this.tablename]];
    this.missions = {};
    if ( typeof(this.mapinfo.mission_types) == "undefined" ) {
        this.mapinfo.mission_types = 0;
    } else {
        this.mapinfo.mission_types += 1;
    }
    if ( typeof(this.mapinfo.mission_types_disabled) == "undefined" ) {
        this.mapinfo.mission_types_disabled = 0;
    }
   
    this.addLegendToggleCallback(); 

    this.init();
    this.refresh();
}

SprayMissionTable.prototype.setOptions = function(options) {
    if ( typeof(options) == "undefined" ) return;
    if ( typeof(this.options) == "undefined" ) this.options = {};
    for (var key in options) {
        this.options[key] = options[key];
    }
}

SprayMissionTable.prototype.init = function() {
    // Create callback for checkbox
    var obj = this;
    var mapobj = this.mapinfo;

    var mapping = {};

    for ( var i = 0; i < this.l.polylines.length; i++ ) {
        var pl = this.l.polylines[i];
        var plcount = 0;
        for ( var j = 0; j < this.l.markers.length; j++ ) {
            if ( plcount > 1 ) break;
            if ( ! this.l.markers[j] | typeof(pl.label) == "undefined" ) continue;
            if ( this.l.markers[j].fullname == ( pl.label.replace(/Mission /,'') + " Start" ) ) {
                pl.start = this.l.markers[j];
                plcount += 1; 
            } else if ( this.l.markers[j].fullname == ( pl.label.replace(/Mission /,'') + " End" ) ) {
                pl.end = this.l.markers[j];
                plcount += 1; 
            }
        }
    }

    var mcallback = function(event) {
        if ( ! event ) event = window.event;
        var el = event.target;

        if ( el.tagName == "TD" ) var row = el.parentNode;
        else if ( el.tagName == "INPUT" ) {
            var row = el.parentNode.parentNode;
        } else if ( el.tagName == "TABLE" ) {
            return;
        } else {
            var row = el;
        }

        var reltarget = event.relatedTarget || event.fromElement;

        if ( ! mapobj.hlock ) {
            mapobj.hlock = true;
            event.cancelBubble = true;
            if ( event.stopPropagation ) event.stopPropagation();

            var mission = row.childNodes[1].innerHTML;

            if  ( event.type == "mouseover" ) {
                if ( obj.isMissionShown(mission) ) {
                    obj.highlightMission(mission);
                }
            } else {
                obj.unhighlightMission(mission);
            }

            mapobj.hlock = false;
        }
    }

    var ccallback = function(event){
        if ( typeof(event.target) == "undefined" ) {
            var el = event;
        } else {
            var el = event.target;
        }
        var mission = el.parentNode.nextSibling.innerHTML;

        if ( el.checked != true ) {
            obj.hideMission(mission);
        } else {
            obj.showMission(mission);
        }
    };

    var clickcallback = function(event) {
        if ( ! event ) event = window.event;
        var row = event.target;
        if ( row.tagName == "TD" ) row = row.parentNode;
        else if ( row.tagName == "INPUT" ) return;
        event.cancelBubble = true;
        if ( event.stopPropagation ) event.stopPropagation();

        var mission = row.childNodes[1].innerHTML;
        var sites = obj.l.placemarks;

        if ( ! obj.isMissionShown(mission) ) {
            row.firstChild.firstChild.checked = true;
            GEvent.trigger(row.firstChild.firstChild,'click',row.firstChild.firstChild);
        }

        var m = obj.missions[mission];
        var middlelegn = Math.round(m.ovs.length/2)-1;
        var middlepoint = sites[m.sitenum].points[0][Math.round(sites[m.sitenum].points[0].length/2)];
        mapobj.onPolylineClick(m.ovs[middlelegn],middlepoint,m.ovs[middlelegn]);
    }

    var lastrow = null;
    var rows = this._dom.firstChild.firstChild.childNodes[2].childNodes;
    GEvent.addListener(mapobj,'polylineclicked',function(mission) {
        for ( var i = 0; i < rows.length; i++ ) {
            if ( rows[i].childNodes[1].innerHTML == mission ) {
                lastrow = rows[i];
                lastrow.style.color = "#9C0000";
                GEvent.addListener(this.objMap,"infowindowclose",function() {
                    lastrow.style.color = "#333333";
                });
                break;
            }
        }
    });

    this.table.setCheckboxCallback(ccallback);
    this.table.setMouseoverCallback(mcallback);
    this.table.setRowClickCallback(clickcallback);
}

SprayMissionTable.prototype.initMission = function(mission) {
    if ( ! this.missions[mission] || this.missions[mission].ovs || this.missions[mission].length < 1 ) {
        if ( typeof(this.missions[mission]) == "undefined" ) {
            this.missions[mission] = new Object();
        }
        this.missions[mission].ovs = [];
        for ( var i = 0; i < this.l.placemarks.length; i++ ) {
            if ( mission == this.l.placemarks[i].abbreviation.replace(/Mission /,'') ) {
                this.missions[mission].sitenum = i;
                for ( j = 0; j < this.l.placemarks[i].pls.length; j++ ) {
                    this.missions[mission].ovs.push(this.l.placemarks[i].pls[j]);
                }
                break;
            }
        }
    }
}

SprayMissionTable.prototype.highlightMission = function(mission) {
    this.initMission(mission);
    this.unhighlightMission();
    if ( ! this.missions[mission].highlight ) {
        var sites = this.l.placemarks;
        var allpoints = [];
        for ( var j = 0; j < sites.length; j++ ) {
            if ( sites[j].name == "Mission " + mission ) {
                for ( var k = 0; k < sites[j].points.length; k++ ) {
                    for ( var m = 0; m < sites[j].points[k].length; m++ ) {
                        allpoints.push(sites[j].points[k][m]);
                    }
                }
            }
        }
        this.missions[mission].highlight = new GPolyline(allpoints,"#FFFFFF",2,0.7);
    }

    var hold = this.mapinfo.highlight;
    this.mapinfo.highlight = this.missions[mission].highlight;
    if ( hold ) this.mapinfo.objMap.removeOverlay(hold);
    this.mapinfo.objMap.addOverlay(this.mapinfo.highlight);
}

SprayMissionTable.prototype.unhighlightMission = function() {
    if ( this.mapinfo.highlight ) {
        this.mapinfo.objMap.removeOverlay(this.mapinfo.highlight);
    }
}

SprayMissionTable.prototype.hideMission = function(mission) {
    this.initMission(mission);
    if ( this.missions[mission].ovs ) {
        if ( this.mapinfo.highlight ) this.mapinfo.objMap.removeOverlay(this.mapinfo.highlight);
        this.mapinfo.highlight = null;

        this.mapinfo.objMap.closeInfoWindow();
        for ( var j = 0; j < this.missions[mission].ovs.length; j++ ) {
            this.missions[mission].ovs[j].hide();
            if ( ! this.missions[mission].ovs[j].start.isHidden() ) this.missions[mission].ovs[j].start.hide();
            if ( ! this.missions[mission].ovs[j].end.isHidden() ) this.missions[mission].ovs[j].end.hide();
        }
    }
    this.missions[mission].shown = false;
}

SprayMissionTable.prototype.isMissionShown = function(mission) {
    var m = this.missions[mission];
    if ( m ) {
        if ( typeof(m.shown) != "undefined" ) return m.shown;
        return this.l.added && this.l.shown;
    } else {
        return this.l.added && this.l.shown;
    }
}

SprayMissionTable.prototype.showMission = function(mission) {
    this.initMission(mission);
    if ( this.missions[mission].ovs ) {
        for ( var j = 0; j < this.missions[mission].ovs.length; j++ ) {
            if ( this.missions[mission].ovs[j].added ) {
                this.missions[mission].ovs[j].show();
            } else {
                this.mapinfo.objMap.addOverlay(this.missions[mission].ovs[j]);
                this.missions[mission].ovs[j].added = true;
            }

            if ( this.missions[mission].ovs[j].start.isHidden() && ! this.mapinfo.startStopHidden ) this.missions[mission].ovs[j].start.show();
            if ( this.missions[mission].ovs[j].end.isHidden() && ! this.mapinfo.startStopHidden ) this.missions[mission].ovs[j].end.show();
        }
    }
    this.missions[mission].shown = true;
}

SprayMissionTable.prototype.refresh = function() {
    this.leginfo = [];
    this.table.deleteRows();
    this.nummissions = 0;  

    for ( var i = 0; i < this.l.placemarks.length; i++ ) {
        var layer = this.l.placemarks[i];
        
        if ( layer.name.match(/(Start|End)/) ) continue;

        var legs = layer.freevars['Legs'].split(' ');
        var mp = Math.floor(legs.length/2);
        var middleleg = [legs[mp],legs[mp+1]];
        var shown = true;
        for ( var j = 0; j < layer.pls.length; j++ ) {
            layer.pls[j].middleleg = middleleg;
        }

        for ( var j = 0; j < this.l.polylines.length; j++ ) {
            shown = shown && this.l.added && ! this.l.polylines[j].isHidden();
        }

        var rowdata = [shown,layer.freevars['abbreviation'],layer.freevars['Line'],layer.freevars['Begin'],layer.freevars['End']];

        if (layer.freevars['Status'] == this.type && typeof(this.missionmap[layer.freevars['abbreviation']]) == "undefined" ) {
            this.missionlist.push(layer.freevars['abbreviation']);
            this.missionmap[layer.freevars['abbreviation']] = this.nummissions;
            this.nummissions += 1;
            var rowindex = this.table.addRow(rowdata);
            this.leginfo[rowindex] = layer.freevars['Legs'].split(/ /);
        }
    }

    // Hide display of empty tables
    this.toDom();
    if ( this.hideIfEmpty && this.nummissions < 1 ) {
        this._dom.style.display = "none";  
        var legend = document.getElementById("ind_"+this.tablename.replace(/ /,'_'));
        if ( legend ) {
            var toggle = legend.getElementsByTagName("INPUT")[0]; 
            toggle.checked = false;
            toggle.disabled = true;
        }
    } else {
        this._dom.style.display = "inline"; 
    }

    // Sort by line number by default
    var el = this._dom.firstChild.firstChild.childNodes[1].firstChild.childNodes[2];
    GEvent.trigger(el,'click',el);
}

SprayMissionTable.prototype.addLegendToggleCallback = function() {
    var tl = "ind_" + this.tablename.replace(/ /,'_');
    this.toDom();
    var obj = this;
    var table = this._dom.lastChild.firstChild;
    var tablecb = table.childNodes[1].firstChild.firstChild.firstChild;

    var cb = function(e) {
        if ( ! e ) e = window.event;
        tablecb.checked = this.checked;

        if ( this.checked ) {
            obj.mapinfo.mission_types_disabled -= 1;
            for ( var i = 0; i < obj.missionlist.length; i++ ) {
                obj.showMission(obj.missionlist[i]);
            }
        } else {
            obj.mapinfo.objMap.closeInfoWindow(); 
            obj.mapinfo.mission_types_disabled += 1;
            for ( var i = 0; i < obj.missionlist.length; i++ ) {
                obj.hideMission(obj.missionlist[i]);
            }
        }

        var rows = table.childNodes[2].childNodes;
        for ( var i = 0; i < rows.length; i++ ) {
            rows[i].firstChild.firstChild.checked = this.checked;
        }
    };

    var rcb = function(e) {
        if ( ! e ) e = window.event;
        legend_checkbox.checked = this.checked;
        if ( this.checked ) {
            obj.mapinfo.mission_types_disabled -= 1;
        } else {
            obj.mapinfo.objMap.closeInfoWindow(); 
            obj.mapinfo.mission_types_disabled += 1;
        }
    };

    var mlel = document.getElementById("MapLegend");
    var tel  = document.getElementById(tl);

    if ( mlel != null && tel != null ) {
        var legend_checkbox = tel.getElementsByTagName("input")[0];
        GEvent.addDomListener(legend_checkbox,'click',cb);
        GEvent.addDomListener(tablecb,'click',rcb);

    } else {
        GEvent.addListener(this.mapinfo,'legendloaded',function(e) {
            var legend_checkbox = document.getElementById(tl).getElementsByTagName("input")[0];

            GEvent.addDomListener(legend_checkbox,'click',cb);
            GEvent.addDomListener(tablecb,'click',rcb);
        });
    }
}

SprayMissionTable.prototype.toDom = function() {
    if ( ! this._dom ) {
        var table = this.table.toDom();
        this._dom = document.createElement("div");
        this._dom.appendChild(table);
    }
    return this._dom;
}
