﻿/// <reference name="MicrosoftAjax.js" />
 
//Crime Service and Google maps globals
var map;
var baseIcon;
var lastReportDate;
var startupDate= new Date(2008,3,7); //Javascript month dates start with '0'
var dtStart;
var dtEnd;
//Selected date in calendar or textbox
var strSelected;
var rptSelectedStart;
var rptSelectedEnd;
//Submit user address requests--works with Safari, Firefox
document.onkeyup = KeyCheck; 

//Calendar
var rptcal;




//Filter on and off images
var on_hvr="crimeTypeImages/btn_cType_ON_hover.gif";
var off_hvr="crimeTypeImages/btn_cType_OFF_hover.gif";
var on_img= "crimeTypeImages/btn_cType_ON.gif";
var off_img="crimeTypeImages/btn_cType_OFF.gif";

//filter array contains codes corresponding to switched on filters.
 var arrFilters= new Array();
//default array contains all crime codes
 var arrDefault = new Array();
//list items for html info display of SA crime type
 var strSA ;
//list items for html  info display of DV crime type
 var strDV ;


function initialize() {
    if (GBrowserIsCompatible()) {
        // Create map object
        map = new GMap2($get("map"));
        map.addControl(new GLargeMapControl());
        map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(61.186553, -149.890659), 11);
         
        
        baseIcon = new GIcon();
        baseIcon.shadow = "markers/shadowPin.png";
        baseIcon.iconSize = new GSize(20, 34);
        baseIcon.shadowSize = new GSize(37, 34);
        baseIcon.iconAnchor = new GPoint(9, 34);
        baseIcon.infoWindowAnchor = new GPoint(9, 2);
        
        baseIcon.infoShadowAnchor = new GPoint(18, 25);
        

        
        CrimeService.LastReportDate(onDateSuccessInit);

        // Add listener for Google map moveend event
        GEvent.addListener(map, "moveend", onMapMoveEnd);
    }
    
}

/*==========================================
    CrimeService callbacks and helper functions
============================================*/
function onDateSuccessInit(result) {
    lastReportDate = Date();
    lastReportDate = result;
    dtStart = lastReportDate;
    dtEnd = lastReportDate;
    document.forms[0].txtdate.value=ParseDate(lastReportDate);
    //$get("txtdate").value=ParseDate(lastReportDate);
    //Label below the map div
    $get("mapdate").innerHTML = "Daily Crime Report:  "+   ParseDate(lastReportDate);
    
    //initialize calendar
    rptcal= new CalendarPopup("divcal");
    rptcal.showNavigationDropdowns();
    rptcal.setReturnFunction("cal_onchange"); 
    rptcal.setYearSelectStartOffset(0);
    rptcal.setTodayText("");    
    
    initializeCrimeCodeArray();

}

function onDateSuccessDateList(result) {
    lastReportDate = Date();
    lastReportDate = result;
    createDateList();
}

function onDateSuccessDateCal(result) {
    lastReportDate = Date();
    lastReportDate = result;
    document.forms[0].txtdate.value=ParseDate(lastReportDate);

    //$get("txtdate").value=ParseDate(lastReportDate);
 }





function onDateFailure(error,context,methodName) {
    $get("datalist").innerHTML= "Service call failure (LastReportDate)" + error;
}

function initializeCrimeCodeArray()
{
        CrimeService.GetCrimeCodeArray(initArray);
} 

//initialize arrDefault, the default array of visible crime
function initArray(result) {
   
   var arrResult= result; 
   for(i=0;i<arrResult.length;i++){
        var sub=  arrResult[i].substr(arrResult[i].indexOf(":")+1);
        arrDefault.push(sub);
        arrFilters.push(sub);
   }
   
   createMap(arrDefault,lastReportDate,lastReportDate);

}

function createMap(arry,p_start,p_end){
    
    var bounds = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    
    CrimeService.GetCrimeData(arry, southWest.lng(), southWest.lat(), northEast.lng(), northEast.lat(), p_start, p_end, onGetCrimeSuccess);
 }

function onGetCrimeSuccess(result) {
    
       map.clearOverlays();
       addNewMarkers(result);
       if (gpoint !=null){
            addAddressMarker();
       }
       $get("txtAddress").focus();
       

}


function onGetCrimeFailed(error, context, methodName) {
    $get("datalist").innerHTML= "Service call failure (GetCrimeData):" + error;
}

function onGetCrimeTimeout(error, context, methodName) {
    $get("datalist").innerHTML= "Service call timed out (GetCrimeData)";
}


/*=========================================
 Google Map callbacks and helper functions
 ===========================================*/

function addNewMarkers(result){
    
    var booSpecial=false;
    var booSA=false;
    strSA="";
    
    for(var i=0; i<result.length; i++){
        var mIcon = new GIcon(baseIcon);
        
        if(result[i].m_crimeCode !="SA" && result[i].m_crimeCode !="DV")
        {
            var point = new GPoint(result[i].m_longitude, result[i].m_latitude);
            var strIcon = new String(result[i].m_crimeCode);
            var strInfo =  '<div style="">' + getCrimeInfo(result[i])+ '</div>';

            mIcon.image = "markers/" + strIcon+ ".png";
            var marker = new GMarker(point, mIcon);
            addMarkerListener(marker,strInfo);
            map.addOverlay(marker);

        }
        else
        {
            //Victim privacy protection
            booSpecial= true;
            
            booSA = true;
            strSA = strSA + getCrimeSpecialInfo(result[i]);
             
        }

       } 
       
       if (booSpecial)
       {
          var mIcon = new GIcon(baseIcon);
          var point = new GPoint(-149.79906152, 61.17690208);
          mIcon.image = "markers/SaDv_pin.png";
          mIcon.iconSize = new GSize(33, 39);
          mIcon.shadow = "markers/SaDv_pin_shdw.png";
          mIcon.shadowSize= new GSize(69,39);
          var marker = new GMarker(point, mIcon);
 
          GEvent.addListener(marker,"click", function() {window.open("NotMappable.aspx?dt=" + encodeURIComponent(ParseDate(dtStart)),null,"height=600,width=400,left=20, titlebar=yes, resizable=yes"); });
          map.addOverlay(marker);
       }
}

function addMarkerListener(newmarker, htmlInfo){

    GEvent.addListener(newmarker,"click", function() {newmarker.openInfoWindowHtml(htmlInfo)});
}



function getCrimeSpecialInfo(crime)
{
   var sb = new Sys.StringBuilder();
   sb.append("<li style='font-family:Arial, Helvetica, sans-serif; font-size:10px; '><strong>Rpt#: </strong>" + String(crime.m_reportNo) + "&nbsp;"
            + "<strong>Date: </strong>" +String(crime.m_reportDate.getMonth()+ 1 ) + "/"         + String(crime.m_reportDate.getDate()) 
            + "/" + String(crime.m_reportDate.getFullYear())+ " " +crime.m_reportTimeString +"&nbsp;"
            +  "<strong>Category: </strong>"+String(crime.m_crimeType) +  "&nbsp;" 
            +  "</li>"
            );
        
    return sb;
}

function getCrimeInfo(crime)
{
   var sb = new Sys.StringBuilder();
   var sc = String();
   var sr = String();
   sr = "#";
   sc= 'window.open("http://www.muni.org/apd1/crimes.cfm","","");' ;
   sb.append("<div style='font-family:Arial, Helvetica, sans-serif; font-size:10px; '><strong>Report No.: </strong>" + String(crime.m_reportNo) + "<br/> "
            + "<strong>Report Date: </strong>" +String(crime.m_reportDate.getMonth()+ 1 ) + "/"         + String(crime.m_reportDate.getDate()) 
            + "/" + String(crime.m_reportDate.getFullYear())+ " " +crime.m_reportTimeString +"<br/>"
            +  "<strong>Street Name: </strong>" + String(crime.m_streetName).toUpperCase() + "<br/>"
            +  "<strong>Report Category: </strong>"+String(crime.m_crimeType) +  "<br/>" 
            +  "<a onclick='" +sc + "' href='"  + sr +  "' >Crime Types</a></div>"
            );
        
    return sb;
}



        
        
/*========================================================================
    Google Map Event Handlers and helper functions
==========================================================================*/

function onMapMoveEnd() {
    var bounds = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();
    
    arrFilters=  applyFilters();
    CrimeService.GetCrimeData(arrFilters, southWest.lng(), southWest.lat(), northEast.lng(), northEast.lat(), dtStart, dtEnd, onGetCrimeSuccess);
}

function applyFilters() {
    var arrNew= new Array();
    for(i=0; i<arrDefault.length;i++)
    {  
        if(arrDefault[i].toUpperCase()=="SA" || arrDefault[i].toUpperCase()=="DV")
        {
            arrNew.push(arrDefault[i]);
        }
        
        else
        { 
            //Get name of filter switch image  
            var name= arrDefault[i].toLowerCase()+"_onoff";
            //Check whether the image is an off image or an on image
            if( document[name].src.indexOf(on_img)>-1) {
                arrNew.push(arrDefault[i]);
            }
        }
    }
    
    return arrNew;
}
 /*========================================================
    Document event handlers
==========================================================*/
function KeyCheck(e)
{
var KeyID = (window.event) ? event.keyCode : e.keyCode;
if(KeyID==13)
{
    btnAddress_onclick();
}
return false;
}

function cal_init(){
    if(lastReportDate==undefined){
         CrimeService.LastReportDate(onDateSuccessDateCal);
         }
    else{
            //Disable all dates before designated website start date
           // rptcal.addDisabledDates(null, "04/06/08");
           // Disable all dates before 90 day history.
            //var disabledPrior= new Date();
            //disabledPrior.setDate(disabledPrior.getDate()-90);
             
            //if(disabledPrior<startupDate)
                rptcal.addDisabledDates(null,"04/06/08");
            //else
            //{
            //    rptcal.addDisabledDates(null,ParseDate(disabledPrior));
            //}
                
            nxtDate = new Date(lastReportDate.getFullYear(), lastReportDate.getMonth(), lastReportDate.getDate()+1);
            
            //Disable all dates after last report upload
            rptcal.addDisabledDates(ParseDate(nxtDate),null);
            if(strSelected==undefined)
            {
                strSelected = ParseDate(lastReportDate);
            }
            //Set calendar to lastReportDate
            rptcal.select(document.forms[0].txtdate,'calxy','M/d/yyyy',strSelected); 
            
        }
    return false;
}
function cal_onchange(y,m,d){
    dtStart= new Date(y,m-1,d);
    dtEnd = dtStart;
    strSelected=ParseDate(dtStart);
    $get("mapdate").innerHTML = "Daily Crime Report:  "+   ParseDate(dtStart);
    document.forms[0].txtdate.value = ParseDate(dtStart);
    //$get("txtdate").value = ParseDate(dtStart);
    createMap(arrFilters,dtStart,dtEnd); 
    return false; 
    
}



function openWindow(link)
{
    window.open(link,"","");
    return false;
}

function swapHoverImage(name){
    if( document[name].src.indexOf(on_img)>-1) 
        document[name].src=on_hvr; 
    else  
        document[name].src= off_hvr;
}

function restoreImage(name){
    if(document[name].src.indexOf(on_hvr)>-1) 
        document[name].src=on_img; 
    else 
        if(document[name].src.indexOf(off_hvr)>-1) 
            document[name].src= off_img;
}

function swapImage(name){
    var code= name.substr(0,name.indexOf("_")).toUpperCase();
    

    if(document[name].src.indexOf(on_img)>-1 || document[name].src.indexOf(on_hvr)>-1) 
    {
        document[name].src=off_img; 
        removeItems(arrFilters,code);
        //SA and DV are linked
        if(code=="SA")
            removeItems(arrFilters,"DV");
    }
    else { 
        document[name].src= on_img;
        arrFilters.push(code);
         //SA and DV are linked
        if(code=="SA")
            arrFilters.push("DV");
     }
     
     createMap(arrFilters, dtStart,dtEnd);  
}

//Individual filter switch handler
function allOnOff(onoff){
 var btnName;
 for(i=0;i<arrDefault.length;i++){
        btnName=arrDefault[i].toLowerCase()+"_"+"onoff";
        if(btnName != "dv_onoff")
            document[btnName].src=(onoff=="off"?off_img:on_img);
        else
            document["sa_onoff"].src=(onoff=="off"?off_img:on_img);

    }
}

//Unselect all handler
function allOff_onclick(){
    //Turn all buttons off
    allOnOff("off");
    arrFilters=[];
    //Create map with no markers
    createMap(arrFilters, dtStart,dtEnd);
}
//Select all  handler
function allOn_onclick(){
    //Turn all buttons on
    allOnOff("on");
    arrFilters= arrDefault;
    //Create map displaying all crimetypes
    createMap(arrDefault,dtStart,dtEnd);
}

/*====================================================================
    Other Helper functions
======================================================================*/



function ParseDate(d) { 
 var curr_date = d.getDate();
 var curr_month = d.getMonth() + 1;
 var curr_year = d.getFullYear();
 var strdt=curr_month + "/" + curr_date + "/" + curr_year 
 
 return( strdt);

}



//Remove function for arrays
function removeItems(array, item) {
var i = 0;
while (i < array.length) {
if (array[i] == item) {
array.splice(i, 1);
} else {
i++;
}
}
return array;
}




 
     
