﻿/*
Datagrid provide by: http://www.trirand.com/blog/?page_id=15
Online documentation: http://www.secondpersonplural.ca/jqgriddocs/index.htm
*/

var srlRequestJSONRQE;
var mapRQE;
var srlRequestPositionRQE;
var boundsRQE;
var srlFindRequestsMapSettings;
var panZoomMapControlRQE;
var markerManagerRQE;
var requestTypeSelectionCount;
var requestTypesSelected;

$(document).ready(function() {

    /* Initialize Dialog / Modal */
    initializeFindRequestDialogRQE();

    com.timmons.srl.Utility.initializeGenericButtons('#srlRQEModal button');

    requestTypeSelectionCount = 0;
    requestTypesSelected = [];

    /* Bind launch of Request Query Engine Modal to click of 
    Request Query Engine Link and initialize Google Map */
    $('#srlRequestQueryEngineButton').click(function() {
        $('#srlRQEModal').dialog('open');

        loadProblemTypes();

        if (!mapRQE) createFindRequestMapRQE(srlFindRequestsMapSettings);
        else mapRQE.checkResize();
    });

    $("#datepicker").click(function() {
        $("#datepicker").datepicker({ minDate: '-2M', maxDate: 0,
            showButtonPanel: true, showOn: 'button',
            buttonImage: 'images/calendar.gif',
            buttonImageOnly: true
        });
    });

    /* See http://odyniec.net/projects/selectlist/usage.html#classes for 
    information on the multi-selector used here*/
    $('select').selectList({
        onAdd: function(select, value, text) {
            if (value) {
                requestTypeSelectionCount++;
                if (requestTypeSelectionCount >= 5) {
                    alert('5 is the maximun Request Types this function will process. You currently have ' + requestTypeSelectionCount + ' selected.');
                    if (requestTypeSelectionCount == 5) {
                        requestTypesSelected[requestTypeSelectionCount - 1] = value;
                    }
                    updateRequestTypeSelectionCount(requestTypeSelectionCount);
                }
                else {
                    requestTypesSelected[requestTypeSelectionCount - 1] = value;
                    updateRequestTypeSelectionCount(requestTypeSelectionCount);
                }
            }
        },
        onRemove: function(select, value, text) {
            if (requestTypeSelectionCount <= 5) {
                //Updates the Array with all but the one just removed
                requestTypesSelected = _removeFromArray(value, requestTypesSelected);
            }
            requestTypeSelectionCount--;
            updateRequestTypeSelectionCount(requestTypeSelectionCount);
        }



    });

    template: '<li>%text%<br /><small>%value%</small></li>'

    /* When the window is resized we want to resize the Modal */
    $(window).resize(function() {

        resizeWindowRQE();
    });

    $('#requestQueryEngineSearchButton').click(function() {
        //if(requestTypeSelectionCount==0 && !$('#datePickerBegin').val() && !$('#datePickerEnd').val()){
        //    alert('Please filter your search by selecting at least (1) Request Type and/or a Date Range.');
        //}
        //else{
        clearGoogleMapRQE();
        showFindRequestLoadingRQE();
        _requestQueryEngineSearch();
        //}
    });

    $('#clearDatesButton').click(function() {
        $('#datePickerBegin').val(null);
        $('#datePickerEnd').val(null);
        $('#datePickerBegin').hide();
        $('#datePickerEnd').hide();
    });

    //Minimize Maximize code
    //Query Results
    $('#btnMinimizeQueryResults').click(function() {
        $('#frQueryResults').slideUp();
        $('#requestQueryResults').addClass('requestQueryResultsClosed');
        $('#requestQueryResults').removeClass('requestQueryResultsOpen');
        $('#btnMinimizeQueryResults').hide();
        $('#btnMaximizeQueryResults').show();
    });

    $('#btnMaximizeQueryResults').click(function() {
        $('#frQueryResults').slideDown();
        $('#requestQueryResults').removeClass('requestQueryResultsClosed');
        $('#requestQueryResults').addClass('requestQueryResultsOpen');
        $('#btnMaximizeQueryResults').hide();
        $('#btnMinimizeQueryResults').show();
    });

    //Query Options
    $('#btnMinimizeQueryOptions').click(function() {
        $('#queryOptions').slideUp();
        $('#requestQueryOptions').addClass('requestQueryOptionsClosed');
        $('#requestQueryOptions').removeClass('requestQueryOptionsOpen');
        $('#btnMinimizeQueryOptions').hide();
        $('#btnMaximizeQueryOptions').show();
    });

    $('#btnMaximizeQueryOptions').click(function() {
        $('#queryOptions').slideDown();
        $('#requestQueryOptions').removeClass('requestQueryOptionsClosed');
        $('#requestQueryOptions').addClass('requestQueryOptionsOpen');
        $('#btnMaximizeQueryOptions').hide();
        $('#btnMinimizeQueryOptions').show();
    });
    $('#datePickerBegin').hide();
    $('#datePickerEnd').hide();
    // $('#requestQueryOptions').draggable('enable');
    // $('#requestQueryResults').draggable('enable');
    
});

var _removeFromArray = function(valueToRemove, arrayToRemoveFrom) {
    var newArray = [];
    var arrayCounter = 0;
    for (var i = 0; i != arrayToRemoveFrom.length; i++) {
        if (arrayToRemoveFrom[i] != valueToRemove) {
            newArray[arrayCounter] = arrayToRemoveFrom[i];
            arrayCounter++;
        }
    }
    return newArray;
}

var _requestQueryEngineSearch = function() {
    //requestTypesSelected[]
    var queryJson = {};
    queryJson.problemsIds = [];
    queryJson.states = [];
    queryJson.dateRangeBegin = {};
    queryJson.dateRangeEnd = {};

    for (var i = 0; i != requestTypesSelected.length; i++) {
        queryJson.problemsIds[i] = requestTypesSelected[i];
    }

    if (requestTypesSelected.length == 0) {
        queryJson.problemsIds[0] = "ALL";
    }

    if ($('#RQEStatusOpen:checked').val()) {
        queryJson.states[0] = $('#RQEStatusOpen:checked').val();
    }
    if ($('#RQEStatusClosed:checked').val()) {
        queryJson.states[1] = $('#RQEStatusClosed:checked').val();
    }

    if ($('#RQEStatusProgress:checked').val()) {
        queryJson.states[2] = $('#RQEStatusProgress:checked').val();
    }

    if ($('#datePickerBegin').val() && $('#datePickerEnd').val()) {
        queryJson.dateRangeBegin = $('#datePickerBegin').val();
        queryJson.dateRangeEnd = $('#datePickerEnd').val();
    }
    else {
        queryJson.dateRangeBegin = null;
        queryJson.dateRangeEnd = null;
    }

    if (!$('#RQEStatusOpen:checked').val() &&
        !$('#RQEStatusClosed:checked').val() &&
        !$('#RQEStatusProgress:checked').val()) {
        queryJson.states[0] = 'OPEN'
        queryJson.states[1] = 'CLOSED'
        queryJson.states[2] = 'IN PROGRESS'
    }

    $.ajax({
        url: 'WebMethods/SRL_WS.asmx/GetAllRequestByQuery',
        data: '{ "queryIn": ' + JSON.stringify(JSON.stringify(queryJson)) + ' }',
        contentType: "application/json; charset=utf-8",
        success: function(msg) {

            var returnedJson = eval('(' + msg + ')');
            //returnedJson = eval('(' + returnedJson + ')');

            hideFindRequestLoadingRQE(this, renderRequestDataRQE, returnedJson);

            $('#srlPageLoadingImage').fadeTo(1000, 1, function() {
                $('#srlPageLoadingModal').hide();
            });

            $('#requestQueryResults').slideDown();
            $('#frQueryResults').slideUp();
            $('#frQueryResults').slideDown();
            $('#requestQueryResults').draggable({ handle: 'h3', containment: '#map_canvasRQE' });
            $('#frQueryResults .resultAccordion').accordion("destroy");
        }
    });

    $('#srlPageLoadingImage').fadeTo(1000, 1, function() {
        $('#srlPageLoadingModal').hide();
    });

}

function renderRequestDataRQE(returnedJson) {

    srlRequestJSONRQE = returnedJson;

    //var requestResult = $('#frQueryResults .requestResultTemplateRQE').html();
    var requestResult = new Object
    requestResult = $('#frQueryResults .requestResultTemplateRQE').html();

    $('#frQueryResults .resultsRQE').empty();

   $('#frQueryResults .resultsRQE').append('<div class="requestResultTemplateRQE" style="display:none">' + requestResult + '</div>');
    $('#frQueryResults .resultsRQE').find('.resultTipRQE').attr('id', '');

    if (returnedJson == 0) {
        $('#frQueryResultsNumMatches').text(returnedJson.length + ' matching records. Try expanding your search.');
    }
    else {
        $('#frQueryResultsNumMatches').text(returnedJson.length + ' matching records.');
    }

    $('#frQueryResults').fadeIn('fast', function() {

        //$('#srlModal #lmc3d').css('cssText', 'position: absolute; right: 20px !important; top: 40px !important;');

        var topLeft = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(340, 80));
        //movePanZoomControlRQE(topLeft);

        for (p in returnedJson) {

            $('#frQueryResults .resultsRQE').append('<h3 class="resultAccordionHeader removeable"><a href="#"></a></h3><div class="resultRQE">' + requestResult + '</div>');
        }

        $('#frQueryResults .resultsRQE .resultRQE').hide();

        $('#frQueryResults .resultsRQE a').each(function(i) {
            $(this).html = $(this).html(returnedJson[i].DESCRIPTION + "<br />(" + returnedJson[i].InitDate + ")");
        });

        $('#frQueryResults .resultsRQE .resultRQE').each(function(i) {
            if (returnedJson[i].CUSTOM3 != '' && returnedJson[i].CUSTOM4 != '') {
                $(this).find('.agoRQE').html('');

                $(this).find('.requestDescriptionRQE').html(returnedJson[i].DESCRIPTION);

                if (returnedJson[i].InitDate != null) {
                    $(this).find('.requestDateValueRQE').html(returnedJson[i].InitDate);
                }
                else {
                    $(this).find('.requestDateValueRQE').html('Date and time "Unknown"');
                }



                var WorkOrdersList = returnedJson[i].WorkOrdersList;

                var WorkOrdersHTML = "";

                if ($(WorkOrdersList).length > 0) {
                    $(WorkOrdersList).each(function(j) {
                        WorkOrdersHTML = WorkOrdersHTML + '<div class="workOrderHeaderRQE">WorkOrder:</div>';
                        WorkOrdersHTML = WorkOrdersHTML + '<div class="workOrderInfoRQE">Id: ' + WorkOrdersList[j].WorkOrderId + '</div>';
                        WorkOrdersHTML = WorkOrdersHTML + '<div class="workOrderInfoRQE">Desription: ' + WorkOrdersList[j].Description + '</div>';
                        WorkOrdersHTML = WorkOrdersHTML + '<div class="workOrderInfoRQE">Status: ' + WorkOrdersList[j].Status + '</div>';
                        WorkOrdersHTML = WorkOrdersHTML + '<div class="workOrderInfoRQE">Projected Finish Date: ' + WorkOrdersList[j].ProjFinishDate + '</div>';
                        WorkOrdersHTML = WorkOrdersHTML + '<div class="workOrderInfoRQE">Actual Finish Date: ' + WorkOrdersList[j].ActualFinishDate + '</div>';
                    });
                }

                $(this).find('.workOrderRQE').html(WorkOrdersHTML);


                $(this).attr('rel', '#resultTipRQE' + (i + 1));
                $(this).children('.resultTipRQE').attr('id', 'resultTipRQE' + (i + 1));

                if (returnedJson[i].WORKORDERID > 0) {
                    $(this).children('.resultTipRQE').find('.requestWorkOrder').find('.fieldRQE').html("Work Order");
                    $(this).children('.resultTipRQE').find('.requestWorkOrder').find('.valueRQE').html("***Assigned***");
                }

                $(this).children('.resultTipRQE').find('.requestStatusRQE').find('.valueRQE').html(returnedJson[i].Status);
                $(this).children('.resultTipRQE').find('.requestIdRQE').find('.valueRQE').html(returnedJson[i].REQUESTID);

                var newElem = $(this).children('.resultTipRQE').clone();
                $(newElem).append('<span class="resultIdRQE" style="display: none;">' + i + '</span>');
                $(newElem).attr('id', '');
                $(newElem).attr('class', 'gTipContentRQE');
                addGoogleMarkerRQE(returnedJson[i].CUSTOM3, returnedJson[i].CUSTOM4, $(newElem).get(0));
                $(newElem).show();
            }
        });

        //$('#frQueryResults .requestResultTemplateRQE').remove();
        $('#frQueryResults .resultAccordion').accordion({ header: 'h3', autoHeight: false, navigation: true, collapsible: true, clearStyle: true });
        bindRequestEventsRQE();
       
    });

    if (returnedJson.length > 0) {
        markerManagerRQE.refresh();
        zoomShowAllGoogleMarkersRQE();
    }
}

function bindRequestEventsRQE() {

    /** $("#frQueryResults .resultsRQE .resultRQE").hover(
    function() {
    $("#frQueryResults .resultsRQE .resultRQE").removeClass('ui-state-hover');
    $(this).addClass('ui-state-hover');
    },
    function() {
    $(this).removeClass('ui-state-hover');
    }
    );**/

    $("#frQueryResults .resultsRQE .resultRQE").each(function(i) {
        var parentcantainer = $(this);
        $(this).find('.zoomToGlobeRQE').show();
        $(this).find('.zoomToGlobeRQE').click(function() {

            if (!$(parentcantainer).hasClass('ui-state-active')) {

                var newElem = $(parentcantainer).children('.resultTipRQE').clone();
                $(newElem).attr('id', '');
                $(newElem).attr('class', 'gTipContentRQE');

                mapRQE.setCenter(new GLatLng(srlRequestJSONRQE[i].Lat, srlRequestJSONRQE[i].Lng), 16);
                mapRQE.openInfoWindow(mapRQE.getCenter(), $(newElem).get(0));
                $(newElem).show();

                //$("#frQueryResults .resultsRQE .resultRQE").removeClass('ui-state-active');
                //$(parentcantainer).addClass('ui-state-active');

                //                showRequestComments(this, i);
            }
        });
    });



    /**$("#frQueryResults .resultsRQE .resultRQE").each(function(i) {
    $(this).fadeIn("slow", function() {

            $(this).cluetip({
    local: true,
    cursor: 'pointer',
    showTitle: false,
    arrows: true,
    cluetipClass: 'jtip',
    mouseOutClose: true,
    cluezIndex: 1000,
    fx: {
    open: 'show', // can be 'show' or 'slideDown' or 'fadeIn'
    openSpeed: 'fast'
    }
    });
    });
    });**/
}

function movePanZoomControlRQE(position) {

    if (mapRQE) {

        mapRQE.removeControl(panZoomMapControl);
        panZoomMapControl = new GLargeMapControl3D();
        mapRQE.addControl(panZoomMapControl, position);
    }
}

function updateRequestTypeSelectionCount(selectionCount) {
    $('#filterControlsLabelsRQE').text('Request Type (5 max): ' + selectionCount + ' selected.');
}

function loadProblemTypes() {
    $.ajax({
        url: 'WebMethods/SRL_WS.asmx/GetProblemleafCollection_REQUESTsOnly',
        data: '{}',
        success: function(msg) {
            var requests = eval('(' + msg + ')');
            var options = '<option value=null></option>';
            for (i = 0; i < requests.length; i++) {
                options += '<option value=' + requests[i].PROBLEMSID + '>' + requests[i].DESCRIPTION + '</option>';
            }

            $('#RQERequestTypeSelector').html(options);
        }
    });
}

function initializeFindRequestDialogRQE() {

    /* Initialize Dialog / Modal */
    $("#srlRQEModal").dialog({
        modal: true,
        autoOpen: false,
        height: $(window).height() - 50,
        width: $(window).width() - 50,
        minHeight: 580,
        minWidth: 780,
        zIndex: 500,
        resizable: true,
        show: 'blind',
        hide: 'blind',
        focus: function(event, ui) { fixOverlayBugRQE(this); },
        resizeStop: resizeModalRQE
    });
}

function fixOverlayBugRQE(elem) {

    $(elem).parent().prev('.ui-widget-overlay').css('z-index', '499');
    resizeWindowRQE();
}

function resizeWindowRQE() {

    var newModalWidth = $(window).width() - 50;
    var newModalHeight = $(window).height() - 50;

    $("#srlRQEModal").dialog('option', 'height', newModalHeight);
    $("#srlRQEModal").dialog('option', 'width', newModalWidth);

    resizeModalRQE();



}

function resizeModalRQE() {

    $('#srlRQEModal').css('width', $('#srlRQEModal').parent().width() + 'px');
    $('#srlRQEModal').css('height', $('#srlRQEModal').parent().height() - 50 + 'px');

    $('#map_canvasRQE').css('width', $('#srlRQEModal').parent().width() - 20 + 'px');
    $('#map_canvasRQE').css('height', $('#srlRQEModal').parent().height() - 50 + 'px');

    $('#srlRQEModal').dialog('option', 'position', 'center');
}

function unloadGoogleMapsRQE() {
    GUnload();
}

$(document).unload(function() {

    unloadGoogleMapsRQE();
});

function initializeGoogleMapRQE(configurationSettings) {
    srlFindRequestsMapSettings = configurationSettings;
}

function showFindRequestLoadingRQE() {
    $('#srlPageLoadingModal').show();
}

function hideFindRequestLoadingRQE(obj, callback, param) {
    $('#srlPageLoadingImage').fadeTo(1000, 1, function() {
        $('#srlPageLoadingModal').hide();

        if (callback) callback.call(obj, param);
    });

}

function createFindRequestMapRQE(configurationSettings) {

    if (GBrowserIsCompatible()) {

        showFindRequestLoadingRQE();

        mapRQE = new GMap2(document.getElementById("map_canvasRQE"));

        GEvent.addListener(mapRQE, "load", function() {

            try {
                markerManagerRQE = new MarkerManager(mapRQE);
            } catch (ex) {
                alert(ex);
            }
        });

        GEvent.addListener(mapRQE, "tilesloaded", function() {

            hideFindRequestLoadingRQE();
        });

        mapRQE.setCenter(new GLatLng(configurationSettings.center.y, configurationSettings.center.x), configurationSettings.zoomLevel);

        panZoomMapControlRQE = new GLargeMapControl3D();
        var topRight = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(20, 40));

        mapRQE.addControl(panZoomMapControlRQE, topRight);
        mapRQE.addControl(new GMapTypeControl());

        boundsRQE = new GLatLngBounds();

        if (configurationSettings.mapServices && configurationSettings.mapServices.length > 0)
            addAGSMapsRQE(mapRQE, configurationSettings);

        //$('#srlModal #lmc3d').css('cssText', 'position: absolute; right: 20px !important; top: 40px !important;');
        $('#requestQueryOptions').draggable({ handle: 'h3', containment: '#map_canvasRQE' });
    }

    //console.log("Exit createFindRequestMapRQE() in findRequest.js");
}

function clearGoogleMapRQE() {
    //console.log("Enter clearGoogleMapRQE() in findRequest.js");

    //map.clearOverlays(); //unfortunately, this gets rid of everything, including ESRI AGS tiled map service layers
    markerManagerRQE.clearMarkers(); //Google recommends using this one...
    // doesn't seem to close info window if one is open. the following code fixes that
    var infoWindow = mapRQE.getInfoWindow();
    if (infoWindow) infoWindow.hide();
    //console.log("Exit clearGoogleMapRQE() in findRequest.js");
}

function zoomShowAllGoogleMarkersRQE() {

    newzoom = mapRQE.getBoundsZoomLevel(boundsRQE);
    //alert(newzoom);
    newcenter = boundsRQE.getCenter();
    mapRQE.setCenter(newcenter, newzoom);
}

function createGoogleMarkerRQE(point, html) {

    var marker = new GMarker(point);
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(html);
        var resultId = $(html).find('.resultId').text();
    });
    return marker;
}

function addGoogleMarkerRQE(GLat, GLng, html) {

    var point = new GLatLng(GLat, GLng);
    var marker = createGoogleMarkerRQE(point, html)
    markerManagerRQE.addMarker(marker, 0);

    boundsRQE.extend(point);
    zoomShowAllGoogleMarkersRQE();
}

var addAGSMapsRQE = function(mapRQE, configurationSettings) {
    //console.log("Enter addAGSMapsRQE()");

    var mapExtension = new esri.arcgis.gmaps.MapExtension(mapRQE);

    jQuery.each(
        configurationSettings.mapServices,
        function(i, mapService) {

            if (mapService.apiType == com.timmons.srl.configManager.apiType.ESRI) {
                if (mapService.layerType == com.timmons.srl.configManager.layerType.dynamicMapServiceLayer) {

                    var dynamicMapServiceLayer = new esri.arcgis.gmaps.DynamicMapServiceLayer(
                        mapService.url,
                        null,
                        mapService.opacity,
                        function(dynamicLayer) {
                            //console.log("Enter DynamicMapServiceLayer constructor callback");
                            mapRQE.addOverlay(dynamicLayer);
                            //console.log("Exit DynamicMapServiceLayer constructor callback");
                        }
                    );
                } else if (mapService.layerType == com.timmons.srl.configManager.layerType.tiledMapServiceLayer) {

                    var tiledMapServiceLayer = new esri.arcgis.gmaps.TiledMapServiceLayer(
                        mapService.url,
                        { opacity: mapService.opacity },
                        function(tileLayer) {
                            //console.log("Enter TiledMapServiceLayer constructor callback");
                            mapExtension.addToMap(tileLayer);
                            //console.log("Exit TiledMapServiceLayer constructor callback");
                        }
                    );
                }
            }
        }
    );
};
