//Map Gadget Loader
/**
** Google Maps Widget
** Author: 32i from DIMALEX.EU
** Date : 04/11/08
**/

// Global variables
var neighborhoods = new Array();
var sm_overlay = new Array();
var search_markers = new Array();
var showCats = new Object();
var smenu = new Object();
//Check is browser IE 6.0 or 7.0. Sliding effect seems to work on IE8 beta, but give a shit on
var isIE  = (navigator.appVersion.indexOf("MSIE 6") != -1 || navigator.appVersion.indexOf("MSIE 7") != -1) ? true : false;

var markers_data = new Object();
markers_data.markers = new Object();
markers_data.events = new Object();
markers_data.visitor_centers = new Object();

var markers = new Object();
markers.markers = new Object();
markers.events = new Object();
markers.visitor_centers = new Object();

var circle, icon, radius_marker, map, visitors_center, category, search_marker, val, title, content;
var busy = false;
var serv = "http://"+self.location.hostname;

function widget_init(el){
    $("#"+el).append("<div id ='maps_header'></div>");
       
    $("#"+el).append("<div id='maps_content'><div id='maps_categories'><dl class='sideMenuList'></dl></div><div id='map' class='clientMap'>&nbsp;</div><div id='maps_listing'>&nbsp;</div></div><div id='maps_footer'></div>");
    if(walking_radius == 1){
    $("#maps_footer").append("<p><input type='checkbox' checked='checked' id='maps_set_radius'/><img alt='' src='/images/map-icons/radius_icon.png'/>Set Your Walking Radius<select id='maps_radius' name='radius'><option value='0.5'>Not far - 1/2 Mile</option><option value='1'>A long walk - 1 mile</option><option value='3'>A hike - 3 miles</option></select></p>");
    }
    $('#maps_header').load(serv+'/includes/header.html',{q:'header'},function(){
	    $('#maps_tabs li').each(function(){
	        $(this).click(function(){
        		var active = $('#maps_tabs li.active');
        		active.removeClass('active');
                $("#"+active.children('a').attr('rel')).hide();
        		$("#"+$(this).children('a').attr('rel')).show();
        		$(this).addClass('active');
	        });
       });
       addvcs();
        $('#maps_visitors_recenter').click(function(){
            vc = markers_data.visitor_centers[$('#maps_visitors_select').val()];
            visitors_recenter = new GLatLng(vc.lat,vc.lng);
         map.setCenter(visitors_recenter);
        }
        );
       $('#maps_search_clear').click(function(){
           for(i in sm_overlay){
               map.removeOverlay(sm_overlay[i]);
           }
           return false;
       });
       $('#maps_address_query_clear').click(function(){
               map.removeOverlay(search_marker);
           return false;
       });
       $('#maps_address_query_btn').click(function(){
           address = $('#maps_address_query').val();
            if(address == '')
                alert('Enter address please.');
            var geocoder = new GClientGeocoder();
            geocoder.getLatLng(address,function(latlng){
                if(latlng != null){
                    if(typeof(search_marker) == 'object'){
                        map.removeOverlay(search_marker);
                    }
                    map.setCenter(latlng);
                    search_marker = new GIcon(G_DEFAULT_ICON);
            		search_marker.image = serv+'/images/markers/default.png';
            		search_marker.iconSize = new GSize(30, 38);
            		search_marker.iconAnchor = new GPoint(0, 46);
            		search_marker.shadow = null;
            		search_marker = new GMarker(latlng, {icon: search_marker, draggable: false, clickable: true});
            		map.addOverlay(search_marker);
            		GEvent.addListener(search_marker, 'click', function(){
            		    html = '<div class="infowindow"><p>'+address+'</p></div>';	
        		        this.openInfoWindowHtml(html,{maxWidth:300});
            		});          
                }else{
                    alert('Hothing has founded, try again.');    
                }
            });
            return false;
       });
        $.ajax({
            url: serv+"/admin/client.php",
            dataType: "json",
            processData: 'false',
            data: 'q=getnhoods',
            success: addnhood
        });
        $('#recenter_to_nhood').click(function(){
            nhood_recenter = neighborhoods[$('#maps_neighborhood_select').val()];
         map.setCenter(nhood_recenter);
        }
        );
        $('#maps_query').focus(function(){
		  $('#maps_query').val('');
        });
        $('#maps_search_submit').click(function(){
		  $.ajax({
            url: serv+"/admin/client.php",
            dataType: "json",
            processData: 'false',
            data: 'q=searchpoints&search='+$('#maps_query').val(),
            success: showSearchResults
        });
        });
    });
    maps_init();
    setVisitorCenters();
    sideMenu();
    $('#maps_set_radius').click(function(){
        drawRadius();
    });
    $('#maps_radius').change(function(){
        if($('#maps_set_radius').attr('checked')){
            changeRadius();
        }
    });
    $('.categoryLinks').click(function(){
        if($(this).parent().attr('class') == 'maps_noexpand'){
            category = $(this).attr('id');
            if(!smenu[category].loaded){
                loadCategory(category,true);
                smenu[category].loaded = true;
                }
               else{
                    smenu[category].loaded = false;
                     ($(this).attr('id'),false);
                }
                $(this).toggleClass('active');
            }
            else if($(this).parent().attr('class') == 'maps_events'){
                changeCategory(this);
            }
            else{ // Simple category with sublevels
                category = $(this).attr('id');
                if(!smenu[category].loaded){
                    loadCategory(category,false);
                    smenu[category].loaded = true;
                }
                changeCategory(this);
            }
        return false;     
    });
    $('.events_filter').change(function(){
        category = $('.events_filter').parent().attr('id');
        if($(this).val() == 'none'){
            if(isIE){
                $('#child_'+category).hide();
            }else{
                $('#child_'+category).slideUp('middle');  
            }
            hideOnMap(category,true);
        }else{
            hideOnMap(category,true);
            var time =$(this).attr('value');
            $.ajax({
                url: serv+"/admin/client.php",
                dataType: "json",
                processData: 'false',
                data: 'q=getevents&time='+time,
                success: function(data){
                    if(isIE){
                        $('#child_'+category).hide();
                            categorize(data);
                            showOnMap(category,true);
                            markersList(category);
                            $('#child_'+category).show();
                    }else{
                        $('#child_'+category).slideUp('middle',function(){
                            categorize(data);
                            showOnMap(category,true);
                            markersList(category);
                            $('#child_'+category).slideDown('middle');
                        });
                    }   
                }
            });
        }
    });
    
    
    $('dd div a').click(function(){
        var id = $(this).attr('id');
        markersList(id);
        if(isIE){
            if($('#child_'+id).css('display') == 'block'){
                $('#child_'+id).hide();
            }else{
                $('#child_'+id).show();
            }
        }else if(!isIE){
           $('#child_'+id).slideToggle('middle');
        }
        //$('#child_'+id).slideToggle('middle');
        if($("#status_"+id).html() == '+'){
            $("#status_"+id).html('-');
            $(this).css("color","#222222");
        }
        else{
            $("#status_"+id).html('+');
            $(this).css("color","#ffffff");
        }
        return false;
    });
    $('.show').click(function(){
        category = $(this).attr('id');
        showOnMap(category,false);
        changeCheckboxState(category);
    return false;
    });
    $('.hide').click(function(){
        category = $(this).attr('id');
        hideOnMap(category,false);
        changeCheckboxState(category);
        return false;
    });
}
function sideMenu(){
    for(i in smenu){
        if(smenu[i] != undefined){
            content = "";
            var vis = "", bgcolor = "", active = "", parentClass = "", bordercolor = "";
            var m = smenu[i];
            if(m.color == ''){ bgcolor = '#AEC1CC'; } else if(m.color != ''){ bgcolor= m.color; }
            titleId = (m.type == 2)?m.id:"show";
            title = "<a href='#' class ='categoryLinks' id='"+m.id+"'>"+m.title+"<span><img src='"+serv+"/images/icons/"+m.icon+"'></span></a>";  
            
            if(m.type != 2 && m.type != 3){
                content += "<p>Click on the checkboxes to hide and show categories on the map</p>";
                content += "<p class='maps_controls'><a class='show' href='#' id='"+m.id+"'>SHOW ALL</a><a class='hide' href='#' id='"+m.id+"'>HIDE ALL</a></p>";
                content += "<div>";
                for(j in sub_smenu[m.id]){
                        content += "<a style='background-color:"+colorParent(bgcolor,-0.2)+"' id='"+sub_smenu[m.id][j].point_type_id+"' href='#'> <span id='status_"+sub_smenu[m.id][j].point_type_id+"'>+</span> "+sub_smenu[m.id][j].title+"</a>";
                        content += "<div class='child' id='child_"+sub_smenu[m.id][j].point_type_id+"' style='background-color:"+colorParent(bgcolor,-0.35)+"'></div>";
                }
                content += "</div>";
            } else if (m.type == 3){
                content += "<p>Choose form the list which events to show on the map</p>";
                content += "<div id='"+sub_smenu[m.id].point_type_id+"'>";
                content += "<select class='events_filter'>";
                content += "<option value = 'none'>None</option>";
                content += "<option value = 'day'>Today's Events</option>";
                content += "<option value = 'week'>This Week's Events</option>";
                content += "<option value = 'month'>This Month's Events</option>";
                content += "</select>";
                content += "</div>";
                content += "<div class='child' style='display:none;' id='child_"+sub_smenu[m.id].point_type_id+"'>&nbsp;</div>";
            }            
            parentClass = (m.type == 2)?"maps_noexpand":"maps_expand";
            parentClass = (m.type == 3)?"maps_events":parentClass;
            $(".sideMenuList").append("<dt class='"+parentClass+"'>"+title+"</dt>");
            if( i != 0){ vis = "display:none;"; }
            $(".sideMenuList").append("<dd style='"+vis+";background-color:"+bgcolor+";border-bottom:1px dotted;'>"+content+"</dd>");
        }
    }
}

function menuElementClass(id, title, icon, color, type, loaded){
    this.id = id;
    this.title = title;
    this.icon = icon;
    this.color = color;
    this.type = type;
    this.loaded = loaded;
}

function maps_init() {
	if (GBrowserIsCompatible() && $('#map')) {
		map = new GMap2(document.getElementById('map'));
		var mt = map.getMapTypes();
		for (var i=0; i<mt.length; i++) {
			mt[i].getMinimumResolution = function() {return 9;}
			mt[i].getMaximumResolution = function() {return 17;}
		}
		map.addControl(new GLargeMapControl());
		map.setCenter(new GLatLng(map_center.lat,map_center.lng),parseInt(map_center.zoom));	
		
		icon = new GIcon(G_DEFAULT_ICON);
		icon.image = serv+'/images/map-icons/default.png';
		icon.iconSize = new GSize(30, 38);
		icon.shadow = null;
		icon.infoWindowAnchor = new GPoint(10, 2);
		icon.imageMap = Array(0, 0, 34, 0, 34, 34, 0, 34);
		if(walking_radius == 1){
    		var radius_icon = new GIcon(G_DEFAULT_ICON);
    		radius_icon.image = serv+'/images/map-icons/radius_marker.png';
    		radius_icon.iconSize = new GSize(29, 46);
    		radius_icon.iconAnchor = new GPoint(0, 46);
    		radius_icon.shadow = null;
    		radius_marker = new GMarker(map.getCenter(), {icon: radius_icon, draggable: true, clickable: false});
    		map.addOverlay(radius_marker);
    		drawCircle(radius_marker.getLatLng(), calcRadius());
    		GEvent.addListener(radius_marker, 'dragstart', startDrag);
    		GEvent.addListener(radius_marker, 'dragend', endDrag);
        }
	}
}

function drawRadius() {
	if (!$('#maps_set_radius').attr('checked')) {
		map.removeOverlay(circle);
		radius_marker.hide();
		$('#maps_radius').attr('checked','false');
	}
	else {
		$('#maps_radius').attr('checked','true');
		if (radius_marker.isHidden()) {
			radius_marker.show();
			drawCircle(radius_marker.getLatLng(), calcRadius());
		}
	}
}

function drawCircle(center, radius) {
	var points = Array();
	var projection = G_NORMAL_MAP.getProjection();
	var zoom = map.getZoom();
	var circle_center = projection.fromLatLngToPixel(center, zoom);
	var sides = 50;
	var length = 360 / sides;

	for (var i = 0; i < (sides + 1); i++) {
		var aRad = length * i * (Math.PI / 180);
		var pixelX = circle_center.x + radius * Math.cos(aRad);
		var pixelY = circle_center.y + radius * Math.sin(aRad);
		var pixel = new GPoint(pixelX, pixelY);
		var point = projection.fromPixelToLatLng(pixel, zoom);
		points.push(point);
	}
	circle = new GPolygon(points, '#EF6423', 2, 1, '#EF6423', 0.2);
	if (center != radius_marker.getLatLng()) {
		radius_marker.setLatLng(center);
	}
	map.addOverlay(circle);
}

function calcRadius() {
    var hypot = 918.72; // length of hypotenuse of map
    var meters_per_mile = 1609.344; // constant of meters in a mile
    var miles = $('#maps_radius').val(); // get number of miles in radius
    
    var corner = map.getBounds().getSouthWest();
    var distance = corner.distanceFrom(map.getBounds().getNorthEast());
    var meters_per_pixel = distance / hypot;
    
    return (meters_per_mile / meters_per_pixel) * miles; // pixels
}

function changeRadius() {
	map.removeOverlay(circle);
	drawCircle(radius_marker.getLatLng(), calcRadius());
}

function endDrag() {
	drawCircle(radius_marker.getLatLng(), calcRadius());
}

function startDrag() {
	map.removeOverlay(circle);
}

function changeCategory(el){
    $(el).toggleClass("active");
    if(isIE){
        //alert($(el).parent().next('dd').attr('style'));
        if($(el).parent().next('dd').css('display') == 'block'){
            $(el).parent().next('dd').hide();
        }else{
            $(el).parent().next('dd').show();
        }
    }else if(!isIE){
        $(el).parent().next('dd').slideToggle();   
    }
}

function createMarker(mrk,predefined_icon){
    var point = new GLatLng (mrk.lat,mrk.lng);
    if(typeof(predefined_icon) == 'object'){
        m_icon = predefined_icon;
    }else{
	    var m_icon = new GIcon(G_DEFAULT_ICON);
	    var marker_icon = (mrk.marker_icon == "")? marker_icon = 'default.png' : mrk.marker_icon;
	    m_icon.image = serv+'/images/markers/'+marker_icon;
		m_icon.iconSize = new GSize(30, 38);
		m_icon.iconAnchor = new GPoint(17, 18);
		m_icon.shadow = null;
    }
	var marker = new GMarker(point, m_icon);
	
    GEvent.addListener(marker,'click',function(){
   	    html = '<div class="infowindow" style="font-size: 12px;" align="left">';
       	if (mrk.event_id != undefined){
    		html += '<h2><a href="/events/id/' + mrk.event_id + '/">' + mrk.title + '</a></h2>';
	    }
    	else if (mrk.point_marker_id != undefined)
    		html += '<h2><a href="/attractions/' + mrk.point_marker_id + '/">' + mrk.title + '</a></h2>';
    	else
    		html += '<h2>' + mrk.title + '</h2>';
    
    	if (mrk.pic != null) {
    		html += '<img src="'+serv+'/' + mrk.pic + '" alt="" class="pic" width="65" height="65" />';
    	}
    	if (mrk.addr) {
    	    addr = mrk.addr.split(',');
    	    if(typeof(addr) != 'string'){
        	    addr[0] = (addr[0])? addr[0] : '';
        	    addr[1] = (addr[1])? addr[1] : '';
        	    addr[2] = (addr[2])? addr[2] : '';
        	    html += '<p width="150">' + addr[0]+'<br />' + addr[1]+''+ addr[2]+'</p>';
    	    }
    	    else{
    	        html += '<p width="150">' +mrk.addr+ '</p>';
    	    }
    	}
    	if (mrk.phone) {
    		html += '<p>Phone: ' +mrk.phone+'</p>';
    	}
    	if (mrk.site_url){
    		html += '<p><a href="http://' +mrk.site_url.replace('http://','')+'" target="_blank">Website</a></p>';
    	}
    	if (mrk.desc) {
    		html += '<div class="description">' + mrk.desc + '</div>';
    	}
    	html += '<ul><li><a href="javascript:map.setCenter(new GLatLng(' + mrk.lat + ',' + mrk.lng + '));"><img src="'+serv+'/images/map-icons/center_icon.png" alt="" />Center</a></li>';	
    	html += '<li><a href="javascript:map.setCenter(new GLatLng(' + mrk.lat + ',' + mrk.lng + '),17);"><img src="'+serv+'/images/map-icons/zoom_icon.png" alt="" />Zoom</a></li>';
    	if(!mrk.vc_id){
    	html += '<li><a href="javascript:infoPoint(' + mrk.point_type_id + ',' + mrk.id + ');"><img src="'+serv+'/images/map-icons/more_icon.png" alt="" />More</a></li>';}
    	html += '<li><a href="http://maps.google.com/maps?f=d&hl=en&daddr='+mrk.addr+'&ie=UTF8" target="_blank"><img src="'+serv+'/images/map-icons/directions_icon.png" alt="" />Directions</a></li></ul>';	
    	html += '</div>';	
    	this.openInfoWindowHtml(html, {maxWidth: 300});
	   });
	
	return marker;
}

function truncate(str, length) {
	if (str.length <= length) {
		return str;
	}
	else {
		return str.substring(0, length - 3) + '...';
	}
}

var searchPage = 1;

function showSearchResults(data){
    searchPage = 1;
    var sPC = 1;
    if(data != "" && data){
        l = Math.ceil(data.length/10);
        $('#maps_search_results').html('');
        for (i = 1; i<=l; i++){
            style = (i>1)?'style="display:none;"':"";
            $('#maps_search_results').append('<ul id="sr'+i+'" '+style+'></ul>');   
        }
        search_markers = new Array();
        for (i in data){
            search_markers[i] = createMarker(data[i],0);
            liclass = (i%2 == 0)?"odd":"";
            $('#sr'+sPC).append('<li class="'+liclass+'"><a href="javascript:addPoint('+i+','+data[i].lat+','+data[i].lng+')"><img width="20" height="20" src="'+serv+'/images/markers/'+data[i].marker_icon+'"/>'+data[i].title+'</a></li>');
            if(i%10 == 0 && i != 0){
                sPC++;
            }
        }
        //
        $('#maps_search_results').append('<div align="center" id="pageStat"></div>');
        $('#maps_search_results').append('<div align="center" class="search_controls"><input type="button" id="searchPrev" onclick="javascript:searchPrev();return false;" value="&lt;&lt;prev"> <input type="button" class="search_close" value="close"> <input type="button" id="searchNext" onclick="javascript:searchNext();return false;" value="next&gt;&gt;"></div>');
        $('#maps_search_results').show();
        $('#pageStat').html(+searchPage+" of "+Math.ceil(search_markers.length/10)+" pages");
        $('.search_close').click(function(){
            $('#maps_search_results').hide();
            return false;
        });
    }
    else{
        alert('No results found.');
    }
}
function searchNext(){
    if(searchPage< Math.ceil(search_markers.length/10)){
        searchPage++;
        $('#sr'+(searchPage-1)).toggle();
        $('#sr'+searchPage).toggle();
   }
    $('#pageStat').html(+searchPage+" of "+Math.ceil(search_markers.length/10)+" pages");
}

function searchPrev(){
     if(searchPage>1){
        $('#sr'+(searchPage-1)).toggle();
        $('#sr'+searchPage).toggle();
        searchPage--;
     }
     $('#pageStat').html(+searchPage+" of "+Math.ceil(search_markers.length/10));
}
function addPoint(i,lat,lng){
    sm_overlay[i] = search_markers[i];
    map.addOverlay(search_markers[i]);
    map.setCenter(new GLatLng(lat,lng));
    $('#maps_search_results').hide();
    search_markers = new Array();
}

function setVisitorCenters(){
	var visitors_icon = new GIcon(G_DEFAULT_ICON);
	visitors_icon.image = '/images/map-icons/marker_visitors.png';
	visitors_icon.iconSize = new GSize(30, 40);
	visitors_icon.iconAnchor = new GPoint(17, 18);
	visitors_icon.shadow = null;
	visitors_icon.imageMap = Array(0,0, 35,0, 35,35, 0,35);
	visitors_icon.infoWindowAnchor = new GPoint(17, 20);
    for(i in markers_data.visitor_centers){
    	markers.visitor_centers[i] = createMarker(markers_data.visitor_centers[i],visitors_icon);
    	map.addOverlay(markers.visitor_centers[i]);
    }
}

function addnhood(data){
    for(i in data){
        neighborhoods[data[i].neighborhoods_id] = new GLatLng(data[i].lat,data[i].lng);
        $('#maps_neighborhood_select').append('<option value="'+data[i].neighborhoods_id+'">'+data[i].title+'</option>');
    }
}

function addvcs(){
    for(i in markers_data.visitor_centers){
        $('#maps_visitors_select').append('<option value="'+i+'">'+markers_data.visitor_centers[i].title+'</option>');
    }
}

function sortMarkers(data){
    var sortedMarkers = new Object();
    for (i in data){
        if(data[i].point_type_id != undefined){
            var pId = parseInt(data[i].point_type_id);
            if(sortedMarkers[pId] == undefined){
                sortedMarkers[pId] = new Object();
            }
            var iId = parseInt(data[i].id);
            sortedMarkers[pId][iId] = data[i];
        }
    }
    return sortedMarkers;
}

function showOnMap(id, showSub){
    if(showSub){
        for(j in markers.markers[id]){
            map.removeOverlay(markers.markers[id][j]);
            map.addOverlay(markers.markers[id][j]);
        }
    }else{
        for(i in sub_smenu[id]){
            for(j in markers.markers[i]){
                map.removeOverlay(markers.markers[i][j]);
                map.addOverlay(markers.markers[i][j]);
            }
        }
    }
}

function hideOnMap(id, hideSub){
    if(hideSub){
        for(j in markers.markers[id]){
            markers.markers[id][j].hide();
        }
    }else{
        for(i in sub_smenu[id]){
            for(j in markers.markers[i]){
               markers.markers[i][j].hide();
            }
        }
    }
}

function changeCheckboxState(cat_id){
    for (i in sub_smenu[cat_id]){
       markersList(i);
    }
}
function categorize(data){
    var sm = sortMarkers(data);
    for (i in sm){
        markers_data.markers[i] = sm[i];
        markers.markers[i] = new Object();
        for(j in sm[i]){
            markers.markers[i][j] = createMarker(sm[i][j]);
        }
    }
}

function loadCategory(cat_id,show){
    $.ajax({
        url: serv+"/admin/client.php",
        dataType: "json",
        processData: 'false',
        data: 'q=getCategoryMarkers&category_id='+cat_id,
        success:function(data){
            categorize(data);
            if(show){
                showOnMap(cat_id,false);
            }
        }
    });
}

function markersList(id){
    $('#child_'+id).empty();
    $('#child_'+id+' .cb').unbind();
    $('#child_'+id+' span').unbind();
    var cnt = 0;
    for(i in markers_data.markers[id]){
        var checked = (markers.markers[id][i].isHidden())? '':'checked';
        var content = "<a href='#' onclick='return false;'><span title='Click to center map to marker'>"+markers_data.markers[id][i].title+"</span> <input type='checkbox' class='cb' value='"+markers_data.markers[id][i].id+"' id='"+markers_data.markers[id][i].id+"' "+checked+" > </a>";
        $('#child_'+id).append(content);
    }
    $('#child_'+id+' .cb').click(function(){
    if(!$(this).attr('checked')){
        map.removeOverlay(markers.markers[id][$(this).val()]);
        $(this).attr('checked','');
    }else{
        map.addOverlay(markers.markers[id][$(this).val()]);
        $(this).attr('checked','checked');
    }
    });
    $('#child_'+id+' span').click(function(){
    if(!$(this).next().attr('checked')){
        map.setCenter(markers.markers[id][$(this).next().val()].getLatLng());
        map.addOverlay(markers.markers[id][$(this).next().val()]);
        $(this).next().attr('checked','checked');
    }else{
        map.setCenter(markers.markers[id][$(this).next().val()].getLatLng());
    }
    });
}
//Hex to RGB;
function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h}
function colorParent(h,p){
    R = parseInt((cutHex(h)).substring(0,2),16) * (1 + parseFloat(p));
    G = parseInt((cutHex(h)).substring(2,4),16) * (1 + parseFloat(p));
    B = parseInt((cutHex(h)).substring(4,6),16) * (1 + parseFloat(p));
    return 'rgb('+parseInt(R)+','+parseInt(G)+','+parseInt(B)+')';
}
//End of Hex to RGB;