﻿// CyberWatch tab functions

function CW() { }

CW.Init = function()
{
    CW.IsLoaded = false;
    CW.IsValid = false;
    CW.Action = "";
    CW.ConfirmationID = "";
};

CW.Load = function() {
    //alert("CW.Load = " + CW.Action);

    CW.EmailIsValid = false;
    CW.CrimesIsValid = false;
    CW.AddressIsValid = false;
    CW.CrimeCount = 0;
    CW.CrimeList = "";
    CW.WhatQuery = "";
    CW.WhereQuery = "";
    CW.EmailFormat = "html";

    CW.IsLoaded = true;
    CW.IsAddress = false;
    CW.AddrVerified = "";
    CW.AddrX = 0;
    CW.AddrY = 0;
    CW.Dist = 13;
    CW.DistDesc = "Never Set";

    CW.VerifyAddress = "Verify Address";
    CW.SwitchToAddress = "Switch to Address";
    CW.Address = "Address:";
    CW.VerifyIntersection = "Verify Intersection";
    CW.SwitchToIntersection = "Switch to Intersection";
    CW.Street = "Street:";

    CW.ToggleAddressStyle(); // This is easiest way to initialize fields

    CW.SaveBufferDistance();  // This will update CW.Dist
    CW.SetAddressFromWhereTab();
    CW.SetCrimesFromWhatTab();

    CW.CheckValid();

    UIHelper.HideStatusMessage(true);

    switch (CW.Action) {
        case "":
            CW.ShowInput();
            break;

        case "cwc":
            CW.ProcessConfirmation();
            break;

        case "cwu":
            CW.ProcessUnsubscribe();
            break;
    }
};

CW.CheckValid = function()
{
    CW.IsValid = (CW.EmailIsValid && CW.CrimesIsValid && CW.AddressIsValid);

    var valid = "<td class=\"valid\">Complete";
    var invalid = "<td class=\"invalid\">Not Valid";
    var s = "<table cellpadding=\"2\" cellspacing=\"0\"><tr><td colspan=\"2\"><h3>Validation Status</h3></td></tr>";

    s += "<tr><td>Email:</td>";
    if (CW.EmailIsValid) { s += valid } else { s += invalid };
    s += "</td></tr>";
    s += "<tr><td>Location:</td>";
    if (CW.AddressIsValid) { s += valid } else { s += invalid };
    s += "</td></tr>";
    s += "<tr><td>Crime Types:</td>";
    if (CW.CrimesIsValid) { s += valid } else { s += invalid };
    s += "</td></tr><table>";

    $("#cyberwatch-status").html(s);

    if (CW.AddressIsValid && CW.CrimesIsValid) {
        $("#cyberwatch-update-map").show();
    } else {
        $("#cyberwatch-update-map").hide();
    }

    if (CW.IsValid) {
        $("#cyberwatch-save-subscription").show();
    } else {
        $("#cyberwatch-save-subscription").hide();
    }
};

CW.ProcessConfirmation = function()
{
    //alert("CW.ProcessConfirmation = " + CW.ConfirmationID);

    $.ajax(
  	{
  	    type: "GET",
  	    url: "data.aspx",
  	    data: "page=confirm&id=" + CW.ConfirmationID,
  	    dataType: "json",
  	    error: CW.AjaxError,
  	    success: CW.SubscriptionResults
  	});
  	
    CW.ConfirmationID = "";
};

CW.ProcessUnsubscribe = function()
{
    //alert("CW.ProcessUnsubscribe = " + CW.ConfirmationID);

    $.ajax(
  	{
  	    type: "GET",
  	    url: "data.aspx",
  	    data: "page=unsubscribe&id=" + CW.ConfirmationID,
  	    dataType: "json",
  	    error: CW.AjaxError,
  	    success: CW.SubscriptionResults
  	});

    CW.ConfirmationID = "";
};

CW.SaveSubscription = function()
{
    //alert("CW.SaveSubscription");
    var params;

    CW.BuildWhatQuery();

    params = "e=" + $("#txt-cyber-email").val() + "&f=" + CW.EmailFormat;
    params += "&a=" + CW.AddrVerified.replace(/&/, "|") + "&x=" + CW.AddrX + "&y=" + CW.AddrY + "&d=" + CW.Dist + "&dd=" + CW.DistDesc;
    params += "&c=" + CW.CrimeList + "&q=" + CW.WhatQuery;

    $.ajax(
  	{
  	    type: "GET",
  	    url: "data.aspx",
  	    data: "page=subscribe&" + params,
  	    dataType: "json",
  	    error: CW.AjaxError,
  	    success: CW.SubscriptionResults
  	});
};
CW.SubscriptionResults = function(data, status)
{
    //alert("CW.SubscriptionResults ID = " + data.id + ", " + data.status + ", " + data.message);
    $("#cyberwatch-email").hide();
    $("#cyberwatch-location").hide();
    $("#cyberwatch-crimetypes").hide();
    $("#cyberwatch-update-map").hide();
    $("#cyberwatch-save-subscription").hide();
    $("#cyberwatch-status").hide();
    $("#cyberwatch-subscription").html(data.message);
    $("#cyberwatch-result").show();
};
CW.ShowInput = function()
{
    //alert("CW.ShowInput");
    $("#cyberwatch-result").hide();
    $("#cyberwatch-status").show();
    $("#cyberwatch-email").show();
    $("#cyberwatch-location").show();
    $("#cyberwatch-crimetypes").show();
};

CW.ToggleAddressStyle = function()
{
    if (CW.IsAddress) {
        CW.IsAddress = false;
        $("#cyberwatch-verify-address").html(CW.VerifyIntersection);
        $("#cyberwatch-toggle-address").html(CW.SwitchToAddress);
        $("#cyberwatch-street-title").html(CW.Street);
        $("#cyberwatch-intersection").show();
    } else {
        CW.IsAddress = true;
        $("#cyberwatch-verify-address").html(CW.VerifyAddress);
        $("#cyberwatch-toggle-address").html(CW.SwitchToIntersection);
        $("#cyberwatch-street-title").html(CW.Address);
        $("#cyberwatch-intersection").hide();
    }
};
CW.ShowError = function(msg)
{
    $("#cyberwatch-addrverify").hide();
    $("#cyberwatch-addrmessage").hide();
    $("#cyberwatch-multiple").hide();
    $("#cyberwatch-addrsplash").hide();

    $("#cyberwatch-addrerror").show();
    //$("#cyberwatch-addrerror").css("display", "block");
    $("#cyberwatch-addrerror").html(msg);
};
CW.ShowMessage = function(msg)
{
    $("#cyberwatch-addrverify").hide();
    $("#cyberwatch-addrerror").hide();
    $("#cyberwatch-multiple").hide();
    $("#cyberwatch-addrsplash").hide();

    $("#cyberwatch-addrmessage").html(msg);
    $("#cyberwatch-addrmessage").show();
};
CW.ShowMultiple = function(opts)
{
    $("#cyberwatch-addrverify").hide();
    $("#cyberwatch-addrmessage").hide();
    $("#cyberwatch-addrerror").hide();
    $("#cyberwatch-addrsplash").hide();

    $("#lst-cyber-locations").html(opts);
    $("#cyberwatch-multiple").show();
};

CW.EmailChanged = function()
{
    //alert("CW.EmailChanged = " + $("#txt-cyber-email").val().length);
    CW.EmailIsValid = false;
    if ($("#txt-cyber-email").val().length < 5) {
        CW.EmailMessage("&nbsp;", "");
    }
    else if ($("#txt-cyber-email").val().indexOf("@") == -1) {
        CW.EmailMessage("&nbsp;", "");
        //CW.EmailMessage("Full email address required", "warning");
    }
    else if ($("#txt-cyber-email").val().indexOf(".") == -1) {
        CW.EmailMessage("&nbsp;", "");
        //CW.EmailMessage("Waiting for domain...", "warning");
    }
    else if (parseInt($("#txt-cyber-email").val().length) - parseInt($("#txt-cyber-email").val().indexOf(".")) < 3) {
        CW.EmailMessage("&nbsp;", "");
        //CW.EmailMessage("Almost complete...", "warning");
    }
    else {
        //alert("CW.EmailChanged is valid");
        CW.EmailIsValid = true;
        CW.EmailMessage("&nbsp;", "");
    }
    CW.CheckValid();
};
CW.EmailMessage = function(msg, className)
{
    $("#cyberwatch-email-message").removeClass();
    $("#cyberwatch-email-message").addClass(className);
    $("#cyberwatch-email-message").html(msg);
};
CW.SaveEmailFormat = function()
{
    //alert("CW.SaveEmailFormat idx, val = " + $("#lst-cyber-format").attr("selectedIndex") + ", " + $("#lst-cyber-format").val());
    CW.EmailFormat = $("#lst-cyber-format").val();
};

CW.AddressChanged = function()
{
    if ($("#cyberwatch-addrverify").css("display") == "none") {
        $("#cyberwatch-addrverify").show();
        $("#cyberwatch-addrmessage").hide();
        $("#cyberwatch-addrerror").hide();
        $("#cyberwatch-multiple").hide();
    }
};
CW.FindAddress = function()
{
    //alert("CW.FindAddress");

    $("#cyberwatch-addrmessage").hide();
    $("#cyberwatch-addrerror").hide();
    $("#cyberwatch-addrsplash").show();
    $("#cyberwatch-addrsplash").animate({ color: "#ff0000" }, 1500);

    CW.AddrX = 0;
    CW.AddressIsValid = false;
    var params;

    if (CW.IsAddress == 1) {
        params = "address=" + $("#txt-cyber-street").val() + "&cross=";
    } else {
        params = "street=" + $("#txt-cyber-street").val() + "&cross=" + $("#txt-cyber-cross").val();
    }
    if (WHERE.IsValid) {
        params += "&jurcode=" + WHERE.JurCode;
    } else {
        params += "&jurcode=";
    }

    $.ajax(
  	{
  	    type: "GET",
  	    url: "data.aspx",
  	    data: "page=address&" + params,
  	    dataType: "json",
  	    error: CW.AjaxError,
  	    success: CW.SaveAddress
  	});
};

CW.AjaxError = function(XMLHttpRequest, status)
{
    //alert("CW.AjaxError = " + XMLHttpRequest.toString + ", " + status);
    $("#cyberwatch-email").hide();
    $("#cyberwatch-location").hide();
    $("#cyberwatch-crimetypes").hide();
    $("#cyberwatch-update-map").hide();
    $("#cyberwatch-save-subscription").hide();
    $("#cyberwatch-status").hide();
    $("#cyberwatch-subscription").html("An unknown server error has occurred.");
    $("#cyberwatch-result").show();
};

CW.SaveAddress = function(data, status)
{
    //alert("CW.SaveAddress = " + data.result + ", " + status);
    switch (data.result) {
        case 2:
        case 1:
            //alert("Address = " + data.address + ", Message = " + data.message);
            CW.AddrVerified = data.address;
            CW.AddrX = data.x;
            CW.AddrY = data.y;
            CW.ShowMessage(data.message);
            CW.AddressIsValid = true;
            CW.BuildWhereQuery();
            CW.CheckValid();
            break;

        case 3:
            //alert("Message = " + data.message);
            CW.ShowMultiple(data.message);
            break;

        case 4:
            //alert("Error = " + data.error);
            CW.ShowError(data.error);
            break;
    }
};

CW.AddressSelected = function()
{
    //alert("CW.AddressSelected = " + $("#lst-cyber-locations").val());
    var vals = $("#lst-cyber-locations").val().split("|");
    if (CW.IsAddress) {
        CW.AddrVerified = vals[0];
        CW.AddrX = vals[1];
        CW.AddrY = vals[2];
        CW.ShowMessage("Address verified as:<br /><br />" + CW.AddrVerified);
    } else {
        CW.AddrVerified = vals[0] + " &amp; " + vals[1];
        CW.AddrX = vals[2];
        CW.AddrY = vals[3];
        CW.ShowMessage("Intersection verified as:<br /><br />" + CW.AddrVerified);
    }
    CW.AddressIsValid = true;
    CW.BuildWhereQuery();
    CW.CheckValid();
};
CW.SaveBufferDistance = function()
{
    //alert("CW.SaveBufferDistance idx, val, text = " + $("#lst-cyber-buffer").attr("selectedIndex") + ", " + $("#lst-cyber-buffer").val() + ", " + $("#lst-cyber-buffer :selected").text());
    CW.Dist = $("#lst-cyber-buffer").val();
    CW.DistDesc = $("#lst-cyber-buffer :selected").text();
    CW.BuildWhereQuery();
};

CW.BuildWhereQuery = function()
{
    CW.WhereQuery = "coord|" + CW.AddrX + "|" + CW.AddrY + "|" + CW.Dist;
};

CW.SetAddressFromWhereTab = function()
{
    if (WHERE.IsValid && WHERE.AddrX != 0) {
        CW.AddrX = WHERE.AddrX;
        CW.AddrY = WHERE.AddrY;
        if (WHERE.AddrType == 1) {
            CW.AddrVerified = WHERE.AddrVerified;
            $("#txt-cyber-street").val(CW.AddrVerified);
            CW.ShowMessage("Address verified as:<br /><br />" + CW.AddrVerified);
        } else {
            if (CW.IsAddress) CW.ToggleAddressStyle();
            CW.AddrVerified = WHERE.AddrVerified;
            vals = WHERE.AddrVerified.split("&");
            $("#txt-cyber-street").val(vals[0]);
            $("#txt-cyber-cross").val(vals[1]);
            CW.ShowMessage("Intersection verified as:<br /><br />" + CW.AddrVerified);
        }
        CW.AddressIsValid = true;
        CW.BuildWhereQuery();
    }
};

CW.SetCrimesFromWhatTab = function()
{
    //alert("CW.SetCrimesFromWhatTab");

    // WHAT tab = <input value="1|$LYR|{a730dfea-c27b-48ce-8d65-cd05861fd518}|$GRP|{c6d0d1bb-9756-4eab-bc77-b89f7c57126f}|3|7|10" name="WhatQuery" id="WhatQuery" type="hidden">
    // ct-group-list = #layers|$LYR,{a730dfea-c27b-48ce-8d65-cd05861fd518},{c6d0d1bb-9756-4eab-bc77-b89f7c57126f},cs-ct-1-1-,#groups, ...repeat group codes

    var qgID, ctID;
    var groups = $("#ct-group-list").val().split(",");  // List of CyberWatch query groups
    //var vals = $("#WhatQuery").val().split("|");    // The What tab selections
    var vals = UIHelper.WhatQuery.split("|");    // What tab selections
    for (var idx = 3; idx < groups.length; idx += 3) {
        qgID = groups[idx]; // Query group ID
        ctID = groups[idx + 1]; // A simpler code for the ID
        //alert("qgID, ctID = " + qgID + ", " + ctID);
        var idx1 = 4;  // First group id
        while (idx1 < vals.length) {
            if (vals[idx1] == qgID) {
                idx1++;
                while (idx1 < vals.length) {
                    // $LYR and $GRP indicate a new layer or group, hence, the end of this one
                    if (vals[idx1].substr(0, 1) == "$") {
                        if (vals[idx1].substr(0, 2) == "$L") { idx = groups.length; } // Don't do another layer
                        idx1 = vals.length;
                        break;
                    }

                    // Set this check box
                    CW.CrimeCount++
                    $("#" + ctID + vals[idx1]).attr("checked", true);

                    idx1++;
                }
            } else {
                idx1++;
            }
        }
    }

    CW.CrimesIsValid = (CW.CrimeCount > 0);
};

CW.CrimeClicked = function(id)
{
    //alert("CW.CrimeClicked id = " + $("#" + id).attr("checked"));

    if ($("#" + id).attr("checked")) { CW.CrimeCount++ } else { CW.CrimeCount-- };

    CW.CrimesIsValid = (CW.CrimeCount > 0);
    CW.CheckValid();
};

CW.SelectCrimes = function(all)
{
    //alert("ct-group-list=" + $("#ct-group-list").val());

    CW.CrimeCount = 0;

    var id, knt;
    var groups = $("#ct-group-list").val().split(",");
    for (var idx = 3; idx < groups.length; idx += 3) {
        id = groups[idx + 1];
        knt = parseInt(groups[idx + 2]) + 1;
        for (var idx1 = 1; idx1 < knt; idx1++) {
            //alert("checkbox id=" + id + idx1 + ", set to: " + all + ", now=" + $("#" + id + idx1).attr("checked"));
            if (all) CW.CrimeCount++;
            $("#" + id + idx1).attr("checked", all);
            //break;
        }
    }

    CW.CrimesIsValid = (CW.CrimeCount > 0);
    CW.CheckValid();
};

CW.BuildWhatQuery = function()
{
    // WHAT tab = <input value="1|$LYR|{a730dfea-c27b-48ce-8d65-cd05861fd518}|$GRP|{c6d0d1bb-9756-4eab-bc77-b89f7c57126f}|3|7|10" name="WhatQuery" id="WhatQuery" type="hidden">
    // ct-group-list = #layers|$LYR,{a730dfea-c27b-48ce-8d65-cd05861fd518},{c6d0d1bb-9756-4eab-bc77-b89f7c57126f},cs-ct-1-1-,#groups, ...repeat group codes

    var qgID, ctID, knt, grps, ids;
    var pos, s, descs;
    var groups = $("#ct-group-list").val().split(",");

    //alert("CW.BuildWhatQuery groups = " + groups);

    grps = "";
    descs = "";
    CW.CrimeList = "";
    CW.WhatQuery = "";
    for (var idx = 3; idx < groups.length; idx += 3) {
        qgID = groups[idx];
        ctID = groups[idx + 1];
        knt = parseInt(groups[idx + 2]) + 1;

        ids = "";
        for (var idx1 = 1; idx1 < knt; idx1++) {
            //alert("checkbox id=" + ctID + idx1 + ", set to: " + all + ", now=" + $("#" + ctID + idx1).attr("checked"));
            if ($("#" + ctID + idx1).attr("checked")) {
                // This is a list of the query groups and id's for the mapping side of things (UpdateMap)
                ids += "|" + idx1;

                // This is a list of descriptions for CyberWatch
                // The ID of the crime is associated with a checkbox that is in a table cell.
                // The cell contains a checkbox and text. Extract the text portion of the cell only. It's after the input tag.
                s = $("#" + ctID + idx1).parent().get(0).innerHTML;
                pos = s.lastIndexOf(">");
                descs += "|" + s.substr(pos + 1).replace(/&nbsp;/g, " ");

                //alert("CW.CrimeClicked = " + s + "==>" + txt);
            }
        }
        if (ids != "") grps += "|$GRP|" + qgID + ids;
    }

    if (grps != "") {
        CW.WhatQuery = "1|$LYR|" + groups[2] + grps;
        CW.CrimeList = descs + "|";
    }

    //alert("CW.BuildWhatQuery = " + CW.WhatQuery);
};
