var geocoder;
var map;
var jsnphr = {};
var bounds = new google.maps.LatLngBounds();
var wbsvc = '/PharmacyLocator/Service.asmx/'
//var wbsvc = 'Service.asmx/'

var onlyonce = 0;
var butneveragain = 0;

function initialize_map() {
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(30.59259, -91.525523);
    var myOptions = {
        zoom: 3,
        center: latlng,
        scaleControl: true,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_pan"), myOptions);

    google.maps.event.addListener(map, 'bounds_changed', function(){
        google.maps.event.clearListeners(map, 'bounds_changed');
        google.maps.event.addListener(map, 'dragend', arachd);
        google.maps.event.addListener(map, 'zoom_changed', arachd);
    });
}

function arachd(){
    $("#detail_pan").html('');

    if (onlyonce == 1)
        return;

    if (butneveragain == 0) {
        onlyonce = 1;
        var zm = map.getZoom();
        map.setZoom(zm + 1); //it seems to zoom out click from the given radius (often resulting in to many results).
        onlyonce = 0;
        butneveragain = 1;
    }

    var ne_lat = map.getBounds().getNorthEast().lat();
    var ne_lng = map.getBounds().getNorthEast().lng();
    var sw_lat = map.getBounds().getSouthWest().lat();
    var sw_lng = map.getBounds().getSouthWest().lng();
    
    var ws = wbsvc+'FindByLatLong';
    var req = '{ne_lat:'+ne_lat+",ne_lng:"+ne_lng+",sw_lat:"+sw_lat+",sw_lng:"+sw_lng + ', is24Hours:' + ($('#cb_24hours:checked').val()?'true':'false') + '}';

    $.ajax({
        url: ws,
        type: 'POST',
        data: req,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(res){
            if(res == null || res == undefined || res.d.length < 1){
            }else{
                pcsres(res, false);
            }
        },
        error: function(){
            alert('Sorry, your request cannot be accomplished this time.\nPlease try again');
        }
    });
}

function schpmcyadd() {
    butneveragain = 0;

    var add = $.trim($("#txt_address").val());
    var rds = $.trim($("#txt_radius").val());
    var dtc = $.trim($("#txt_distance").val());

    if(isNaN(rds) || rds == '' || rds == undefined){
        $("#txt_radius").val(5);
        rds = 5;
    }

    var mls = rds;
    if(dtc == 'K'){
        mls = parseInt(rds) * 0.621371192;
    }
    var rdius= parseInt(mls) * 1609.3;

    geocoder.geocode({
        'address': add
    }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);

            var circleOptions = {
                center: map.getCenter(),
                fillOpacity: 0,
                strokeOpacity: 0,
                map: map,
                radius: rdius
            }
            var circle = new google.maps.Circle(circleOptions);
            map.fitBounds(circle.getBounds());

            //var zm = map.getZoom();
            //map.setZoom(zm + 1); //it seems to zoom out click from the given radius (often resulting in to many results).

        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}

function pcsres(res, fit){
    clear_markers();
    jsnphr = {};
    bounds = new google.maps.LatLngBounds();

    var html = '<p>&nbsp;</p><div>';
    var cnt = 0;
    var pgcnt = 0;
    var perpage = 10; //this changes the number of pharmacies listed per page
    $.each(res.d, function (ndx, pharmacy) {
        var location = new google.maps.LatLng(pharmacy.lat, pharmacy.lng);
        var marker = new google.maps.Marker({
            position: location,
            map: map,
            title: pharmacy.name
        });

        google.maps.event.addListener(marker, 'click',function(){
            shwnmp(pharmacy.id)
        });

        var opt = {};
        $.each(pharmacy.options, function(oid, odata){
            if(odata.value == 'Yes'){
                opt[oid] = odata.name
            }
        });

        jsnphr[pharmacy.id] = {
            'name': pharmacy.name,
            'lat': pharmacy.lat,
            'lng': pharmacy.lng,
            'add': pharmacy.address,
            'cty': pharmacy.city,
            'stt': pharmacy.state,
            'zip': pharmacy.zip,
            'phn': pharmacy.phonenumber,
            'eml': pharmacy.email,
            'fax': pharmacy.fax,
            'hours': pharmacy.hours,
            'languages': pharmacy.languages,
            'options': opt,
            'mkr': marker
        }

        if(fit != undefined && fit == true){
            bounds.extend(location);
            map.fitBounds(bounds);

            if(res.d.length == 1){
                map.setZoom(14);
            }
        }

        cnt++;
        if (cnt > perpage) {
            cnt = 1;
            html += '</ul></div>';
        }

        if (cnt == 1) {
            pgcnt++;
            if (pgcnt == 1)
                html += '<div id="divRes' + pgcnt + '" style="display:block">';
            else
                html += '<div id="divRes' + pgcnt + '" style="display:none">';
            html += '<ul class="phar">';
        }

        html += '<li><div id="map_phar_'+pharmacy.id+'" style="text-align:left;"><strong>'+pharmacy.name+'</strong><br/>';
        html += '<em>'+pharmacy.address+', '+pharmacy.city+'</em><br/>';
        html += '<em>'+pharmacy.state+'&nbsp;&nbsp;&nbsp;&nbsp;'+pharmacy.zip+'</em><br/></div>';
        html += '<a href="javascript: void(0)" onclick="shwnmp(' + pharmacy.id + ')">Show More Details</a></li>';
    });
    html += '</ul></div></div>';

    if (pgcnt > 1) {
        html += '<div align="center">';
        for (var j = 1; j <= pgcnt; j++) {
            if (j == 1)
                html += '<a href="javascript: void(0)" onclick="shwpg(this);" id="atg' + j + '" name="divRes' + j + '" style="font-weight:bold;font-size:large;">' + j + '</a>';
            else
                html += ', <a href="javascript: void(0)" onclick="shwpg(this);" id="atg' + j + '" name="divRes' + j + '" style="font-weight:normal;font-size:small;">' + j + '</a>';
        }
        html += '</div>';
    }

    $("#detail_pan").html(html);
}

function shwpg(atg) {
    var divname = atg.name;
    $("#" + divname).show("slow").siblings().hide("slow");

    var atgname = atg.id;
    $("#" + atgname).css("font-weight", "bold").siblings().css("font-weight", "normal");
    $("#" + atgname).css("font-size", "large").siblings().css("font-size", "small");
}

function mrdtl(id){
    var data = jsnphr[id];
    var el = $("#info_"+id);
    var tp = el.parent('div').offset().top;//(parseInt(el.offset().top)+15)
    var ht = '<div class="popup_more_dtl" id="popup_more_dtl_'+id+'" style="left: '+el.offset().left+'px;top: '+(parseInt(tp)-6)+'px;">'+drwppup(data, id)+'</div>';
    $("body").append(ht);
    collapsible_();
}

function shwnmp(ndx){
    close_info_win();
    
    var tmp_ = jsnphr[ndx];
    var content_html = $("#map_phar_"+ndx).html();
    content_html = '<div style="font-size:11px;height:80px;padding-top:7px;">'+content_html+'<a href="javascript: void(0)" id="info_'+ndx+'" onclick="mrdtl('+ndx+')">Please click here for more information</a></div>';
    tmp_.mkr.infowindow = new google.maps.InfoWindow({
        content: content_html
    });
    tmp_.mkr.infowindow.open(map, tmp_.mkr);
}

function clear_markers(){
    $.each(jsnphr, function(i, itm){
        itm.mkr.setMap(null);
    });
}

$(document).ready(function(){
    $("#txt_radius").blur(function(){
        var v = $.trim($(this).val());
        
        if(isNaN(v) || v == '' || v == undefined){
            $(this).val(5);
        }
    });

    $("#txt_radius").live('keydown', function(event) {
        if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 110 || event.keyCode == 190 || (event.keyCode >= 35 && event.keyCode <= 40)) {
        }
        else {
            if (event.keyCode < 48 || (event.keyCode > 57 && event.keyCode < 96) || event.keyCode > 105) {
                event.preventDefault();
            }
        }
    });

    $("#schpmcy").click(schpmcyadd);
    $("#txt_address").keypress(function(e){
        if(e.keyCode==13){schpmcyadd();}
    });
    $("#txt_radius").keypress(function(e){
        if(e.keyCode==13){schpmcyadd();}
    });
    $("#txt_distance").keypress(function(e){
        if(e.keyCode==13){schpmcyadd();}
    });
});

function drwppup(data, id){
    var hm = '<div align="right"><a onclick="$(\'#popup_more_dtl_'+id+'\').remove()" href="javascript: void(0)">Close</a>';
    hm += '</div><table cellpadding="2" width="100%" style="font-size: 12px;">';
    hm += '<tr><td colspan="2"><strong>'+data.name+'</strong></td></tr>';
    if(data.phn.length > 0)
	    hm += '<tr><td>Telephone</td><td>: '+data.phn+'</td></tr>';
    if(data.fax.length > 0)
	    hm += '<tr><td>Fax</td><td>: '+data.fax+'</td></tr>';
    if(data.eml.length > 0)
	    hm += '<tr><td>Email</td><td>: '+data.eml+'</td></tr>';
    hm += '<tr><td colspan="2">&nbsp;</td></tr><tr><td valign="top">Address</td><td>: '+data.add+'</td></tr>';
    hm += '<tr><td></td><td></td></tr><tr><td>City</td><td>: '+data.cty+'</td></tr>';
    hm += '<tr><td>State</td><td>: '+data.stt+'</td></tr><tr><td>Zip Code</td><td>: '+data.zip+'</td></tr>';
    hm += '</table>'
    if(data.hours.length>0)
    {
	    hm += '<div style="font-weight: bold; margin-top: 10px;">';
	    hm += 'Store Hours&nbsp;&nbsp;&nbsp;&nbsp;<span style="cursor: pointer;text-decoration: underline;font-weight: normal;" class="expand_data">Expand</span></div><div class="colapsible" style="display: none;"><table width="100%" border="0" cellspacing="0" cellpadding="2" style="font-size: 12px;">';
	    $.each(data.hours, function(hndx, hdata){
        	hm += '<tr><td>'+hdata.day+'</td><td>'+hdata.hours+'</td></tr>';
	    });
	    hm += '</table></div>';
    }
    if(data.languages.length>0)
    {
	    hm += '<div style="font-weight: bold; margin-top: 10px;">';
	    hm += 'Spoken Languages&nbsp;&nbsp;&nbsp;&nbsp;<span style="cursor: pointer;text-decoration: underline;font-weight: normal;" class="expand_data">Expand</span></div><div class="colapsible" style="display: none;"><ul>';
	    $.each(data.languages, function(i1, lang){
	        hm += '<li>'+lang+'</li>';
	    });
	    hm += '</ul></div>';
    }
    if(data.options.length>0)
    {
	    hm += '<div style="font-weight: bold; margin-top: 10px;">';
	    hm += 'Store Options&nbsp;&nbsp;&nbsp;&nbsp;<span style="cursor: pointer;text-decoration: underline;font-weight: normal;" class="expand_data">Expand</span></div><div class="colapsible" style="display: none;"><ul>';
	    $.each(data.options, function(i2, opt){
	        hm += '<li>'+opt+'</li>';
	    });
	    hm += '</ul></div>';
    }
    return hm;
}

function collapsible_(){
    $(".expand_data").click(function(){
        if($(this).parent("div").next("div.colapsible").is(":visible")){
            $(this).parent("div").next("div.colapsible").hide();
            $(this).text('Expand');
        }else{
            $(this).parent("div").next("div.colapsible").show();
            $(this).text('Close');
        }
    });
}

function close_info_win(){
    $.each(jsnphr, function(id, phr){
        if(phr.mkr.infowindow){
            phr.mkr.infowindow.close();
            $("#popup_more_dtl_"+id).remove();
        }
    })
}
