
/* namspace 'inspectorManager' */
var inspectorManager;

if (!inspectorManager) {
    inspectorManager = {};
}

(function () {

    inspectorManager.visibleType = '';
    inspectorManager.types = {   // also the names of div ids
        flash: 'inspectorContainerFlash', 
        buoy: 'inspectorContainerBuoy', 
        text: 'inspectorContainerText', 
        search: 'inspectorContainerSearch'
    };


    inspectorManager.hide = function (type) {
        if (inspectorManager.visibleType === type) {
            inspectorManager.visibleType = '';
        }
        document.getElementById(inspectorManager.types[type]).style.display = 'none';
    };
    
    inspectorManager.hideAll = function () {
        for (var i in inspectorManager.types) {
            inspectorManager.hide(i);
        }
    };

    inspectorManager.show = function (type) {
        if (inspectorManager.visibleType !== type) {
            inspectorManager.visibleType = type;
            document.getElementById(inspectorManager.types[type]).style.display = 'block';
            for (var i in inspectorManager.types) {
                if (type !== i) {
                    inspectorManager.hide(i);
                }
            }
        }
    };
    
    inspectorManager.showSearch = function () {
        inspectorManager.show("search");
        var inp = document.getElementById("inspectorSearchTextBox");
        if (inp) inp.focus();
    };


    inspectorManager.setHTML = function (html) {
        var el = document.getElementById(inspectorManager.types.text)
        el.innerHTML = html;
        el.scrollTop = 0;
        inspectorManager.show('text');
    };


    inspectorManager.loadFrames = function () {
        document.getElementById(inspectorManager.types.flash).appendChild(
            general.createIFrame('inspectorFlashFrame', 256, 407, '/dep/inspectors.htm')
        );
    };


    inspectorManager.displayWeatherZone = function (dataPointId) {
        YAHOO.util.Connect.asyncRequest(
            'POST',
            '/WebServices/DataPoints.asmx/GetLatestWeatherZoneData?r=' + general.rand(),
            {
                success: inspectorManager.weatherZone.onWeatherZoneSuccess, 
                failure: inspectorManager.weatherZone.onWeatherZoneFailure
            },
            JSON.encode({dataPointId: dataPointId})
        );
    };


    inspectorManager.displayBuoy = function (dataPointId) {
        inspectorManager.show('buoy');
        if (!SWMap.buoyChart) {
            SWMap.buoyChart = new SW.Controls.BuoyChart(document.getElementById(inspectorManager.types.buoy), dataPointId);
            SWMap.buoyChart.className = "";
            SWMap.buoyChart.render();
            // on save, add the id to the struct
            SWMap.buoyChart.onAddSuccess.subscribe(function() { SWMap.savedBuoyIds[SWMap.buoyChart.currentDataPointId + "n"] = SWMap.buoyChart.currentDataPointId; }, this);
        }
        else {
            SWMap.buoyChart.displayData(dataPointId);
        }
        if (!general.objectContainsValue(SWMap.savedBuoyIds, SWMap.buoyChart.currentDataPointId)) {
            SWMap.buoyChart.showAddLink();
        }
        else {
            SWMap.buoyChart.hideAddLink();
        }
    };


    inspectorManager.displayTideStation = function (dataPointId) {
        inspectorManager.show('flash');
        general.getFrameWindow('inspectorFlashFrame').tide.setDataPoint(dataPointId);
    };
    
    
    inspectorManager.displayVirtualBuoy = function (dataPointId, name) {
        alert("not implemented");
    };
    
    
    // search specific
    inspectorManager.search = {
    
        doSearch:  function (searchResultsContainerId, searchText) {
            var el = document.getElementById(searchResultsContainerId);
            el.scrollTop = 0;
            
            // get rid of % (SQL wildcard) and trim off outside whitespace
            searchText = searchText.replace(/[% ]+/g, ' ').replace(/^\s+/, '').replace(/\s+$/, ''); 
            
            if (searchText.length < 3) {
                el.innerHTML = '"' + searchText + '" is too short, search for at least 3 characters.';
            } else {
                el.innerHTML = '<div style="position:absolute; top:30%; left:50%; text-align:center; width:200px;margin-left:-100px;"><img src="/assets/images/loading.gif" /><br />Searching</div>';
                
               YAHOO.util.Connect.asyncRequest(
                    'POST',
                    '/WebServices/DataPoints.asmx/SearchMap?r=' + general.rand(),
                    {
                        success: inspectorManager.search.onSearchSuccess,
                        failure: inspectorManager.search.onSearchFailure,
                        argument: {searchText: searchText, resultsContainer: el}
                    },
                    JSON.encode({searchText: searchText})                
                );
                
            }
        },
        
    
        onSearchSuccess: function (response) {
        
            var args = response.argument;
            var result = JSON.decode(response.responseText);
        
            if (!result) {
                inspectorManager.search.onSearchFailure(response);
                return;
            }
        
            function clickRegion (evt, data) {
                YAHOO.util.Event.preventDefault(evt);
                SWMap.perspectiveView.close();
                mapGeneral.centerAndZoomOnRegionAnimation(SWMap.world.regionsById[data.Id]);
                return false;
            }            
            
            function clickDataPoint (evt, data) {
                YAHOO.util.Event.preventDefault(evt);

                SWMap.perspectiveView.close();
                SWMap.animationControl.setType('off');
                SWMap.markerSelectionControl.selectMarkerType('none');
                
                var MARKER_ZOOM = 14; // level to zoom to when clicking marker
                if (SWMap.map.getZoom() === MARKER_ZOOM) { // we may end up panning to marker because we're at the right zoom
                    handlers.setMoveEndHandler('ON_PAN_TO_MARKER');
                }
                SWMap.map.centerAndZoom(data.Lat, data.Lng, MARKER_ZOOM);
                SWMap.markerSelectionControl.selectMarkerType(data.dataType);
                
                return false;
            }
                        
            var regex = new RegExp('(' + args.searchText.replace(/([^\d\w_-])/g, "\\$1") + ')', 'ig')
            
            function addResults (elements, nameSingular, namePlural, icon, items, enumName) {
                var heading = document.createElement('h4');
                heading.innerHTML = items.length + ' ' + ((items.length == 1) ? nameSingular : namePlural);
                
                elements.push(heading);
                
                var list = document.createElement('ul');
                list.className = 'pins';
                
                for (id in items) {
                    var item = items[id];
                
                    var li = document.createElement('li');
                    li.style.backgroundImage = 'url(' + icon + ')';
                    
                    var anchor = document.createElement('a');
                    anchor.href = '#';
                    
                    if (item.Lat) { // clicking a point
                        item.dataType = enumName;
                        YAHOO.util.Event.addListener(anchor, 'click', clickDataPoint, item);
                    } else { // clicking a region
                        YAHOO.util.Event.addListener(anchor, 'click', clickRegion, item);
                    }
                    
                    // make search text highlighted
                    anchor.innerHTML = item.Name.replace(
                        regex,
                        '<span style="background-color:#ffc; text-decoration:inherit;">$1</span>'
                    );
                    
                    li.appendChild(anchor);
                    list.appendChild(li);
                }
                
                elements.push(list);
            }
            
            
            var elements = [];            
            var typeId, dataType;
            
            // do regions - TODO internationalize
            if (result.Regions.length) {
                addResults(
                    elements, 
                    "Region", 
                    "Regions", 
                    "/assets/images/icn-region-16.gif", 
                    result.Regions
                );
            }
            
            // do data points
            for (typeId in result.DataTypes) {
                dataType = SW.Markers.DATA_TYPES_BY_ID[typeId] || null;
                addResults(
                    elements, 
                    dataType.singular, 
                    dataType.plural, 
                    dataType.icon.replace(".png", "-16.png"), 
                    result.DataTypes[typeId].Points, 
                    dataType.enumName
                );
            }

            var el = document.createElement("div");
            if (elements.length) {
                el.innerHTML = 'You searched for <strong>' + args.searchText + '</strong>';
            } else {
                el.innerHTML = '<strong>No results</strong> found for <strong>' + args.searchText + '</strong>';
            }
            elements.push(el);
            
            general.replaceAllChildren(args.resultsContainer, elements);
        },
    
    
        onSearchFailure: function (response) {
            var args = response.argument;
            var html = "<strong>An error occurred searching for '" + args.searchText + "'. Please try again later.</strong>";
            args.resultsContainer.innerHTML = html;
        }
    };


    inspectorManager.displaySurfSpot = function (dataPointId, name) {
        var onSuccess = function(data){
            if (data.VirtualBuoyData.Spectral) {
                // save for easy access to details
                inspectorManager.currentDataPointData = data;
                inspectorManager.show('flash');
                general.getFrameWindow('inspectorFlashFrame').surfProbe.setData(data);
            } 
            else {
                // TODO better messaging
                inspectorManager.setHTML('<strong>No data for surf probe: ' + data.title + '</strong>');
            }
        };
        var onFailure = function(data){
            // TODO better messaging
            inspectorManager.setHTML('<strong>Surf Probe (' + eventArgs.name + ') data could not be loaded. Try again later.</strong>');
        };
        var startDate = SWMap.dateBar.currentStartDate;

        var forecastDataManager = new SW.ForecastDataManager();
        forecastDataManager.onGetDataSuccess.subscribe(onSuccess, this);
        forecastDataManager.onGetDataFailure.subscribe(onFailure, this);
        forecastDataManager.getSurfSpotData(dataPointId, name, startDate);
            
    };
    
    
    // global inspector FullChart object
    inspectorManager.fullChart = {};
    inspectorManager.displayVirtualBuoyDetails = function () {
        // TODO - add calendar control to view history of surf probe
        if (!inspectorManager.virtualBuoyDetailsPanel) {
            inspectorManager.virtualBuoyDetailsPanel = new YAHOO.widget.Panel("virtualBuoyDetailsPanel",  
                { 
                    context: ["map-left-column", "tl", "tr"],
                    width: "515px", 
                    height: "0px", 
                    close: true, 
                    draggable: false, 
                    modal: true,
                    zindex: 5005,
                    visible: false,
                    monitorresize : false,
                    iframe: false
                } 
            );
            
            var chartContainer = document.createElement("div");
            
            inspectorManager.virtualBuoyDetailsPanel.setBody(chartContainer);
            inspectorManager.virtualBuoyDetailsPanel.render(document.body);
            
            var heightChangeCallback = function (newHeight) {
                document.getElementById("virtualBuoyDetailsPanel").style.height = newHeight + "px";
            }
            inspectorManager.fullChart = new SW.Controls.ForecastChart(chartContainer);
            inspectorManager.fullChart.onHeightChange.subscribe(heightChangeCallback, this);
            
            // make the onclick of the mask close the panel
            YAHOO.util.Event.on("virtualBuoyDetailsPanel_mask", "click", 
                function(){
                    inspectorManager.virtualBuoyDetailsPanel.hide();
                }
            );

        }
        // show the panel (have to show so flash will display)
        inspectorManager.virtualBuoyDetailsPanel.show();
        inspectorManager.fullChart.displayData(inspectorManager.currentDataPointData);
        
    };
    
    inspectorManager.displayTideChartDetails = function () {
        var dpId = general.getFrameWindow('inspectorFlashFrame').tide.currentDpId;
        var theFrameWindow;
        // if this is the first time displaying
        if (!inspectorManager.tideDetailsPanel) {
            
            inspectorManager.tideDetailsPanel = general.createOverlayWindow(
                'tideDetailsPanel',
                general.createIFrame("tideDetailsIframe", 518, 300, "/dep/tide-chart-large.aspx?dataPointId=" + dpId),
                518,
                300,
                ["map-left-column", "tl", "tr"]
            );
        }
        // not first time displaying
        else if (theFrameWindow = general.getFrameWindow("tideDetailsIframe")){
            // change the datapointid
            theFrameWindow.document.getElementById("flashObjectTide").setTide(dpId);
        }
        // show the panel
        inspectorManager.tideDetailsPanel.show();
    };
    

    inspectorManager.weatherZone = {
        onWeatherZoneSuccess: function(response) {
        
            var result = JSON.decode(response.responseText);
            
            if (result) {
                // date is in format "/Date(123123125412541)/" when we just want a number; TODO change service to return just a plain number in the first place
                var date = result.DateRelevant;
                date = parseInt(date.substring(6, date.length - 2));
                if (date <= 0) {
                    date = general.getDate();
                }
                
                var html = 
                    '<div style="background:#03369B url(/assets/images/background_textweather.gif) repeat-x; height:36px; padding:0 3px; overflow:hidden;"><b style="color:white">'
                    + result.Name 
                    + '</b></div>'
                    + '<div style="background:#EBE9DE; border-bottom:1px solid #8d8e86; height:30px; position:relative; margin-bottom:2px;">'
                    + '<div style="display:inline; position:absolute; top:6px; left:20px; border:1px solid #8d8e86; border-bottom:0; background:#FFF; height:20px; line-height:20px; font-size:90%; font-weight:bold; padding:2px;">'
                    + ' Posted: ' 
                    + general.dateFormat(date, 'ddd, mmm dd yyyy hh:MM tt') 
                    + '</div>'
                    + '</div>'
                
                    + '<div style="width:251px; height:333px; overflow:auto; padding:2px;">'
                    + inspectorManager.weatherZone.formatText(result.RawData) 
                    + '</div>';
                
                inspectorManager.setHTML(html);
            }
            else {
                inspectorManager.weatherZone.onWeatherZoneFailure(response);
            }
        },

        
        onWeatherZoneFailure: function(response) {
            // TODO better messaging
            inspectorManager.setHTML('<strong>Weather data could not be loaded. Try again later.</strong>');
        },
        
        
        formatText: function(text) {
            var textFormatted = "<strong>No recent marine weather report</strong>";
            if (text) textFormatted = text.replace(
                /\.+([A-Za-z ]+)\.\.\./g, 
                '<b style="background:#FFC;display:block;margin-top:6px;">$1</b>'
            );
            return textFormatted;
        }
    };
})();