﻿/*!
 * CDI map functions
 * version 1.00 (05/26/2009)
 * NO license granted to any party.  
 */

/**
 *  These functions provide functionality for mapping data on Google Maps or BING Maps
 *  REQUIRES: cdi.data.js (and dependencies thereof)
 *  NOTES: In order to use this to build maps, a page must be built to support display of the map and map objects etc.
 */
 
 /* A MapObject looks like:
     {   label: pIcon.label, labelColor: pIcon.labelcolor, 
                primaryColor: pIcon.iconColor, strokeColor: pIcon.iconBorderColor,
                starColor: pIcon.starColor, starStrokeColor: pIcon.starBorderColor,
                addStar: (pIcon.starColor!="") }
 
 */

    var cdiCONSTObjectModeNormal = "";
    var cdiCONSTObjectModeTimeCapture = "time";

    var cdiOBJMap;
    var cdiOBJMapMarkerMgr;
    var cdiVARObjectMode = cdiCONSTObjectModeNormal;
    var cdiVARGettingMapData = false;
    var cdiVARMapCallback = null;
    var cdiVARMapCounter =0;

    var cdiVARImageSource = "http://chart.apis.google.com/chart?chst=";
    var cdiVARDefaultMapLabelColor = "161616";
    var cdiVARDefaultMapIconColor = "a04040";
    var cdiVARDefaultMapIconBorderColor = "161616";
    var cdiVARDefaultMapPolylineColor = "e6e6e6";
    var cdiVARDefaultMapIconBorderColorSelected = "20b020";
    var cdiVARDefaultMapIconBorderColorSelectedOk = "20b020";
    var cdiVARDefaultMapIconBorderColorSelectedNotOk = "b02020";
    var cdiVARDefaultMapLat = 33.64520648119227;
    var cdiVARDefaultMapLong =  -111.82159423828125;
    var cdiVARDefaultMapZoom = 13;

    var cdiVARMapObject = new Array();
    
    function cdiShowMap(pTarget, pMapLocId, pMapLocName, pShadow, pCallback)
    {
        if (cdiVARGettingMapData) {cdiVARMapCallback = (pCallback==null) ? true : pCallback; }
        var lat = cdiVARDefaultMapLat;
        var lng = cdiVARDefaultMapLong;
        var mapObj = null;
        if (pMapLocName!="") {
            mapObj = cdiGetMapObjectByName(pMapLocName);
            var latlng = mapObj.points[0].toString();
            latlng = latlng.substring(0, latlng.length-1);
            lat = latlng.split(",")[0].substring(1);
            lng = latlng.split(",")[1];
        }
        if (pMapLocId!=null && pMapLocId!="" && pMapLocId>0) {
            mapObj = cdiGetMapObjectById(pMapLocId);
            var latlng = mapObj.points[0].toString();
            latlng = latlng.substring(0, latlng.length-1);
            lat = latlng.split(",")[0].substring(1);
            lng = latlng.split(",")[1];
        }
        var singleMapObject = (pMapLocId!=null && pMapLocId!=0) || (pMapLocName!=null && pMapLocName!="");
        
        $(pTarget).css("min-height", "300px");
        cdiFNMapCreateMap($(pTarget).attr("id"), lat,lng, cdiVARDefaultMapZoom, {physical: true, hybrid: true, topo: true, satellite: true, normal: false });
        if (!cdiVARGettingMapData && !singleMapObject) {cdiFNAddMarkers(cdiFNMapCreateMarkers(cdiVARMapObject, pCallback));}
        if (singleMapObject) {
            var ary = new Array();
            ary.push(cdiFNMapCreateMarker(mapObj, pCallback));
            cdiFNAddMarkers(ary);
        }
        if (pShadow) {$(pTarget).parent().parent().parent().parent().removeShadow().dropShadow();}
    }    
    function cdiGetMapObjectByName(pName) {
        var returnObj = null;
        for(j=0; j<cdiVARMapObject.length; j++) {
            if (cdiVARMapObject[j].name==pName) {
                returnObj = cdiVARMapObject[j];                
                break;
            }
        }            
        return returnObj;
    }
    function cdiGetMapObjectById(pId) {
        var returnObj = null;
        for(j=0; j<cdiVARMapObject.length; j++) {
            if (cdiVARMapObject[j].id==pId) {
                returnObj = cdiVARMapObject[j];                
                break;
            }
        }            
        return returnObj;
    }
    function cdiGetMapData() {
        // pTarget must be realized and displayed and visible
        //if (cdiVARMapCreatingMutex) {return;}
        cdiVARGettingMapData = true;
        cdiVARMapObject.splice(0,cdiVARMapObject.length);
        cdiGetJSON("WSMapObject.asmx/List", "{inbound: ''}", 
            function(rtnmsg) {  
                if (rtnmsg=="undefined" || rtnmsg=="0.No Record/s" || rtnmsg==null) {return false;}
                var _rtn = eval(rtnmsg);
                for(j=0; j<_rtn.length; j++) {
                    // parse the data into a mapobject
                    var _template = (_rtn[j].template=="" || _rtn[j].template=="undefined" || _rtn[j].template==null) ? "mtMODefault" : _rtn[j].template;
                    var _points = _rtn[j].points;
                    if (_points.substring(_points.length-1)=="|") {_points= _points.substring(0, _points.length-1);}
                    var _ispoint = (_points.split("|").length<2);
                    var _pointary = [];
                    $.each(_points.split("|"), function(i, _pt) { // loop each point
                        var _lat = parseFloat(_pt.split(",")[0]); var _long = parseFloat(_pt.split(",")[1]);
                        _pointary[i] = new GLatLng(_lat, _long);
                    });
                    
                    _rtn[j].featureHtml = cdiGetFeatureList(_rtn[j].features,false,36);
                    _rtn[j].moreInfo = (_rtn[j].link=="") ? "<span style='float: left;'>&nbsp;</span>" : "<span class='cdiui-clicklink'><a href='content_pages/"+_rtn[j].link+"' target='_self'>more info...</a></span>";
                    var _colors = cdiGetColors(_rtn[j].colors);
                    var _pinstyle = (_colors.count>3) ? "pin_star" : "pin";

                    var _image = (_rtn[j].code=="~") ? cdiVARImageSource+"d_text_outline&chld="+cdiVARDefaultMapLabelColor+"|12|h|ffffff|_|O" :
                        cdiVARImageSource + "d_map_xpin_letter_withshadow&chld="+_pinstyle+"|"+_rtn[j].code.substring(0,1)+"|"+_colors.icon+"|"+_colors.text+"|"+_colors.star;
                    var _selectedimage = cdiVARImageSource+"d_map_xpin_letter_withshadow&chld="+_pinstyle+"|"+_rtn[j].code.substring(0,1)+"|"+cdiVARDefaultMapIconBorderColorSelected+"|"+_colors.text+"|"+_colors.star;
                    var _okimage = cdiVARImageSource + "d_map_xpin_letter_withshadow&chld="+_pinstyle+"|"+_rtn[j].code.substring(0,1)+"|"+cdiVARDefaultMapIconBorderColorSelectedOk+"|"+_colors.text+"|"+_colors.star;
                    var _notokimage = cdiVARImageSource + "d_map_xpin_letter_withshadow&chld="+_pinstyle+"|"+_rtn[j].code.substring(0,1)+"|"+cdiVARDefaultMapIconBorderColorSelectedNotOk+"|"+_colors.text+"|"+_colors.star;

                    // set the array item to the mapobject
                    cdiVARMapObject[j] = {id: _rtn[j].id, counter: j, 
                        name: _rtn[j].name, label: _rtn[j].code, 
                        desc: _rtn[j].desc,
                        infowindow: parseTemplate($("#"+_template).html(),_rtn[j] ),
                        color: _colors.text,
                        allcolors: _colors,
                        features: _rtn[j].features,
                        points: _pointary,
                        image: _image, selectedimage: _selectedimage, okimage: _okimage, notokimage: _notokimage,
                        ispolyline: !_ispoint, ispoint: _ispoint,
                        selectable: (_rtn[j].value>0)
                        }
                    }// end for
                cdiVARGettingMapData = false;
                if (cdiVARMapCallback!=null) {
                    if (cdiVARMapCallback==true) { cdiFNAddMarkers(cdiFNMapCreateMarkers(cdiVARMapObject, null)); }
                    else { cdiFNAddMarkers(cdiFNMapCreateMarkers(cdiVARMapObject, cdiVARMapCallback));}
                    cdiVARMapCallback = null;
                }
                }, null);
    }



    function cdiGetColors(pColorString) {
        var _colorsplt = pColorString.split("|");
        var _textcolor = (_colorsplt.length>0) ? _colorsplt[0] : cdiVARDefaultMapLabelColor;
        _textcolor = (_textcolor.substring(0,1)=="#") ? _textcolor.substring(1) : _textcolor;
        var _iconfillcolor = (_colorsplt.length>1) ? _colorsplt[1] : cdiVARDefaultMapIconColor;
        _iconfillcolor = (_iconfillcolor.substring(0,1)=="#") ? _iconfillcolor.substring(1) : _iconfillcolor;
        var _bordercolor = (_colorsplt.length>2) ? _colorsplt[2] : cdiVARDefaultMapIconBorderColor;
        _bordercolor = (_bordercolor.substring(0,1)=="#") ? _bordercolor.substring(1) : _bordercolor;
        var _starfillcolor = (_colorsplt.length>3) ? _colorsplt[3] : cdiVARDefaultMapIconBorderColorSelected;
        _starfillcolor = (_starfillcolor.substring(0,1)=="#") ? _starfillcolor.substring(1) : _starfillcolor;
        return {text: _textcolor, icon: _iconfillcolor, border: _bordercolor, star: _starfillcolor, count: _colorsplt.length};        
    }


    function cdiHighlightMapObjects(pHighlightFeatures) {
        cdiFNClearMap();
        var _highlight = false;
        for(j=0; j<cdiVARMapObject.length; j++) {
            if (pHighlightFeatures!="") {
                _highlight = stringContainsAllOf(pHighlightFeatures, cdiVARMapObject[j].features);
            }
            if (_highlight && cdiVARMapObject[j].ispolyline) {
                cdiOBJMap.addOverlay(cdiFNMapCreateMarker(cdiVARMapObject[j],null,cdiVARDefaultMapIconBorderColorSelected ));
            }
            if (_highlight && cdiVARMapObject[j].ispoint) {
                var _marker = cdiFNMapCreateMarker(cdiVARMapObject[j],null);
                cdiOBJMap.addOverlay(_marker );
                _marker.setImage(_marker.selectedimage); 
            }
            else {
                cdiOBJMap.addOverlay(cdiFNMapCreateMarker(cdiVARMapObject[j],null));
            }
        }
    }



    /* Mapping */
    function cdiFNMapCreateMap(pMapDiv, pMapLat, pMapLong, pMapInitialZoom, pMapTypes, pEntryModeCallback) {
        var _lat = parseFloat(pMapLat); var _long = parseFloat(pMapLong);
        cdiOBJMap = new google.maps.Map2(document.getElementById(pMapDiv));
        var _custmapui = new GMapUIOptions();
        _custmapui.maptypes = pMapTypes; 
        _custmapui.zoom = {doubleclick: true, scrollwheel: true};
        _custmapui.controls = {largemapcontrol3d: true, maptypecontrol: true};
        _mapinitialzoom = parseInt(pMapInitialZoom);
        _mapcenterlat = parseFloat(pMapLat);
        _mapcenterlong = parseFloat(pMapLong);
        cdiOBJMap.setCenter( new GLatLng(_mapcenterlat, _mapcenterlong) ,_mapinitialzoom);
        cdiOBJMap.setUI(_custmapui);
        cdiOBJMap.setMapType(G_PHYSICAL_MAP);
        //cdiOBJMapMarkerMgr = new MarkerManager(cdiOBJMap);
    }
    
    function cdiFNClearMap() {if (cdiOBJMap!=null) {cdiOBJMap.clearOverlays();cdiVARMapMarkerCounter=0;}    }
    
    function cdiFNSetMarkersToNormal(pCallback) {
        cdiFNClearMap();
        cdiFNAddMarkers(cdiFNMapCreateMarkers(cdiVARMapObject, pCallback));
   }
    
    function cdiFNMapCreateMarkers(pMapObjectArray, pCallback) {
        var returnArray = new Array();
        $.each(pMapObjectArray, function(i, obj) {
            returnArray.push(cdiFNMapCreateMarker(obj, pCallback));
        });
        return returnArray;
    }
    
    function cdiFNMapCreateMarker(pMapObject, pCallback, pHighlightColor) {
        if (pMapObject==null) {return null;}
        //chst=d_map_xpin_letter[_withshadow]
        //chld=<pin_style>|<character>|<fill_color>|<text_color>|<star_fill_color>
        var newIcon = new GIcon();
        newIcon.image = pMapObject.image;
        //newIcon.iconSize = new GSize(30, 20); 
        newIcon.shadow = "";
        //newIcon.shadowSize = new GSize(0,0); 
        newIcon.iconAnchor = (pMapObject.label=="~") ? new GPoint(3, 3) : new GPoint(10, 30);
        newIcon.infoWindowAnchor = new GPoint(5,5);
        var _linecolor = (pHighlightColor!=null && pHighlightColor!="") ? pHighlightColor : pMapObject.color;
        var _linewidth = (pHighlightColor!=null && pHighlightColor!="") ? 8 : 3;
        var _mapMarker = pMapObject.ispoint ? new GMarker(pMapObject.points[0], {icon: newIcon})
            : new GPolyline(pMapObject.points, "#" + _linecolor, _linewidth);

        _mapMarker.togglestate = 0;
        _mapMarker.image= newIcon.image;
        _mapMarker.selectedimage= pMapObject.selectedimage;
        _mapMarker.okimage= pMapObject.okimage;
        _mapMarker.notokimage = pMapObject.notokimage;
        _mapMarker.data = pMapObject;
        if (_mapMarker==null) {return false;} // return if something went wrong
        
        if (pCallback!=null) { // specialized callback
            // we callback regardless of # of points, consumer can always ignore based on isPoint
            GEvent.addListener(_mapMarker, "click",
                function(latlng) {pCallback(_mapMarker);} );
        }
        else {
            if (_mapMarker.data.ispoint) {_mapMarker.bindInfoWindowHtml(pMapObject.infowindow); }
            else {
                GEvent.addListener(_mapMarker, "click", function (latlng) { cdiOBJMap.openInfoWindowHtml(latlng, pMapObject.infowindow); });
            }
        }

        return _mapMarker;
        //cdiVARMapMarkerObject[cdiVARMapMarkerObject.length+1] = _mapMarker;
        // now we add to the overlay if a polyline (otherwise, the AddMarkers function will just add the markers)
        //if (pMapObject.ispolyline) {cdiOBJMap.addOverlay(_mapMarker); }
        //else {cdiVARMapMarkerObject[pMapObject.counter] = _mapMarker;}

    }

    function cdiFNAddMarkers(pMarkers) {
        if (cdiOBJMap==null) {return false;}
        for(j=0; j<pMarkers.length; j++) { cdiOBJMap.addOverlay(pMarkers[j]); }
    }



    /* Mapping - End */

