/*
	-----------------------------------------------
	Google Member Map v2.0
	 2005
	Developed for XMB by hanez
	hanezhanez@yahoo.com

	Coded using Google Api Documentation, inspired by and partly based on evilC's "GeoXMB" hack: 
	http://www.evilc.com/xmb/

	Admin Panel On/Off Switch, lang vars modified (1 was 1.8), added What They Are Doing to misc.php,
	changed the membermap.gif to a map.jpg and put it in the theme folders, minor html changes done in
	the template, renamed template from membermap2 to membermap done by: WormHole @ XMB Garage.

	Last Updated: September 25th 2008

	Modification Description:
	This modification provides a world map (powered by Google Maps) on which members can put their pin.

	Supported: XMB 1.9.8 Engage Final SP2/SP3

                  Updated for 1.9.8 by: WormHole @ XMB Garage

	Installation Note: Before adding this mod to your forum, you should back up all files related to this mod.

	License Note: This mod is released under the GPL License.

  	-----------------------------------------------
*/

=======
Step 1:
=======

===================================
Go To Admin Panel -> Insert Raw SQL
===================================

Upload provided file named "SQL.txt" & click "Submit Changes" button.

=======================================================================================================================
=======
Step 2:
=======

Please upload the following file to your forum directory.

"membermap.php"

Please upload the following files to your forum's root directory.

"ajax_get.php", "ajax_post.php"

Please upload the following files to your theme directories.

map.jpg


=======================================================================================================================
=======
Step 3:
=======

Go to http://www.google.com/apis/maps/ and sign up for a Google Maps API Key

REMEMBER / COPY-PASTE YOUR KEY - YOU WILL NEED IT FOR THE STEP FOR MEMBER.PHP


=======================================================================================================================
=======
Step 4:
=======

=============
Edit File: cp.php
=============


==========
Find Code:
==========

        $statson = $statsoff = '';
        settingHTML('stats', $statson, $statsoff);


==============
Add Code Below
==============

        // Member Map Mod Begin
        $membermapstatus_on = $membermapstatus_off = '';
        settingHTML('membermapstatus', $membermapstatus_on, $membermapstatus_off);
        // Member Map Mod End

==========
Find Code:
==========

        printsetting1($lang['reportpoststatus'], 'reportpostnew', $reportposton, $reportpostoff);


==============
Add Code Below:
==============

        // Member Map Mod Begin
        printsetting1($lang['membermapstatus'], 'membermapstatusnew', $membermapstatus_on, $membermapstatus_off, $langfile);
        // Member Map Mod End


==========
Find Code:
==========

        $smileyinsertnew = formOnOff('smileyinsertnew');

===============
Add Code Below:
===============

        // Member Map Mod Begin
        $membermapstatusnew = formOnOff('membermapstatusnew');
       // Member Mad Mod End


==========
Find Code:
==========

            onlinetoday_status='$onlinetoday_statusnew'


================
Replace Code With:
================

            onlinetoday_status='$onlinetoday_statusnew',
            membermapstatus='$membermapstatusnew'

===============================================================================================================
=======
Step 5:
=======

========================
Edit File: English.lang.php
========================
========================
Add To End Of File Above ?> :
========================

// Google Member Map Mod Begin
$lang['membermap'] = "Member Map";
$lang['membermapbygoogle'] = "Member Map by Google";
$lang['membermapcomments'] = "Comments / Location";
$lang['membermapdragzoom'] = "Drag the map with your mouse, or double-click to center. Zoom in and out using the controls at the left.";
$lang['membermapgoogle'] = "$bbname Members Map";
$lang['membermaplatitude'] = "Latitude:";
$lang['membermaplongitude'] = "Longitude:";
$lang['membermaplist'] = "Member List:";
$lang['membermaponline'] = "Viewing Member Map";
$lang['membermappinloc'] = "Pinpoint your location by clicking on the map.";
$lang['membermapstatus'] = "Member Map Status:";
// Google Member Map Mod End

===============================================================================================================

=======
Step 6:
=======

========================
Edit File: header.php
========================


==========
Find Code:
==========

$bbcodescript = '';

===============
Add Code Below:
===============

$googleapikey = '';

==========
Find Code:
==========

// 'Forum Rules'-link
if ($SETTINGS['bbrules'] == 'on') {
    $links[] = '<img src="'.$imgdir.'/top_bbrules.gif" alt="'.$lang['altrules'].'" border="0" /> <a href="faq.php?page=forumrules"><font class="navtd">'.$lang['textbbrules'].'</font></a>';
}

==============
Add Code Below
==============

// Member Map-link
if ($SETTINGS['membermapstatus'] == 'on') {
    $links[] = '<img src="'.$THEME['imgdir'].'/map.jpg" alt="'.$lang['membermap'].'" border="0" /> <a href="membermap.php"><font class="navtd">'.$lang['membermap'].'</font></a>';
}

===============================================================================================================
=======
Step 7:
=======

=================
Edit File: member.php
=================
=================
Find Code (2 Times):
=================

) VALUES ('$username'

========================
Replace Code With (both times):
========================

, map_latitude, map_longitude, map_comment) VALUES ('$username'

============================================
Find Code In-Line At End Of  Both Above Query Statements:
============================================

)");

================
Replace Code With:
================

, '', '', '')");


=======================================================================================================================
============
Step 8:
============


========================
Edit File: membermap.php
========================


==========
Find Code:
==========

$googleapikey = "<script src=\"http://maps.google.com/maps?file=api&v=1&key=abcdefg\" type=\"text/javascript\"></script>";


===================================================
Find Code In-Line In The Middle Of Above Statement:
===================================================

abcdef

==================
Replace Code With:
==================

Your google api key (created in step 3)


=======================================================================================================================
=======
Step 9:
=======


=======================
Edit File: /include/online.inc.php
=======================


==========
Find Code:
==========

    } else if (false !== strpos($url, '/today.php')) {
        $location = $lang['onlinetodaysposts'];

==================
Add Code Below:
==================

    // Google Member Map Mod Begin
    } elseif (false !== strpos($url, '/membermap.php')) {
        $location = $lang['membermaponline'];
    // Google Member Map Mod End

If you have the Topic Activity hack installed then do the step below in place of the step above.

=======================
Edit File: /include/online.inc.php
=======================

==========
Find Code:
==========

    } elseif (false !== strpos($url, '/activity.php')) {
        $location = $lang['topicactivityonline'];

===================
Add Code Below:
===================

    // Google Member Map Mod Begin
    } elseif (false !== strpos($url, '/membermap.php')) {
        $location = $lang['membermaponline'];
    // Google Member Map Mod End

=======================================================================================================================
=======
Step 10:
=======


========================================
Go to admin panel -> templates -> header
========================================

==========
Find Code:
==========

$bbcodescript

===============
Add Code Below:
===============

$googleapikey


=======================================================================================================================
=======
Step 11:
=======

=============================================================================
Go to admin panel -> templates -> create template name -> membermap
=============================================================================

=========
Add Code:
=========

<table cellspacing="0" cellpadding="0" border="0" width="$THEME[tablewidth]" align="center">
 <tr>
  <td bgcolor="$THEME[bordercolor]" width="100%">

   <table border="0" cellspacing="$THEME[borderwidth]" cellpadding="$THEME[tablespace]" width="100%">
    <tr class="category">
     <td align="center"><font color="$THEME[cattext]"><strong>Google Member Map</strong></font></td>
     <td align="center"><font color="$THEME[cattext]"><div id="switch"></div></strong></font></td>
    </tr>
    <tr>
     <td bgcolor="$THEME[altbg2]" class="tablerow">
      <table align="center" style="font-size: inherit;" cellpadding="0" cellspacing="0" border="0">
       <tr>
        <td valign="middle">

    <script language="javascript" type="text/javascript">
    <!--

function getWindowSize() {
    var e = new Object();
    if(window.self && self.innerWidth) {
        e.width = self.innerWidth;
        e.height = self.innerHeight;
    } else if(document.documentElement && document.documentElement.clientHeight) {
        e.width = document.documentElement.clientWidth;
        e.height = document.documentElement.clientHeight;
    } else {
        e.width = document.body.clientWidth;
        e.height = document.body.clientHeight;
    }

    return e;

}

var NS = getWindowSize();

var width = NS.width - 250;
var height = NS.height - 140;

document.write('<div id="map" style="width: ' + width  + 'px; height: ' + height + 'px;">') ;

    // -->
    </script>

        </td>
       </tr>
      </table>
     </td>
     <td width="150" bgcolor="$THEME[altbg2]" class="tablerow" valign="top"><div id="div_rightbar"></div></td>
    </tr>
   </table>
  </td>
 </tr>
</table>

<table cellspacing="0" cellpadding="0" border="0" width="$THEME[tablewidth]" align="center">
 <tr>
  <td width="75%" align="center"><font color="$THEME[cattext]">$lang[membermapdragzoom]</font></td><td align="right"><div id="submitstatus"></div></td>
 </tr>
</table>

<script language="javascript" type="text/javascript">

//<![CDATA[

// CONFIG
var stdlat = '5.9765625';
var stdlng = '30.29701788337205';
var stdzoom = '15';

// INITIALIZATION

// Google map initalization
var map = new GMap(document.getElementById("map"));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.setMapType(G_HYBRID_TYPE);
map.centerAndZoom(new GPoint(stdlat,stdlng), stdzoom);

// Initialize variables
var marker = new Array();
var currentlat = '';
var currentlng = '';
var currentcomment = '';
lastcenter = false;
lastzoom = false;
addmarker = false;
aplisten = false;
psubmit = false;

// Create Icons
iconarray=[];
iconarray[0]=new GIcon();
iconarray[0].image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
iconarray[0].shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
iconarray[0].iconSize = new GSize(12, 20);
iconarray[0].shadowSize = new GSize(22, 20);
iconarray[0].iconAnchor = new GPoint(6, 20);
iconarray[0].infoWindowAnchor = new GPoint(5, 1);

iconarray[1]=new GIcon();
iconarray[1].image = "http://labs.google.com/ridefinder/images/mm_20_blue.png";
iconarray[1].shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
iconarray[1].iconSize = new GSize(12, 20);
iconarray[1].shadowSize = new GSize(22, 20);
iconarray[1].iconAnchor = new GPoint(6, 20);
iconarray[1].infoWindowAnchor = new GPoint(5, 1);

iconarray[2]=new GIcon();
iconarray[2].image = "http://labs.google.com/ridefinder/images/mm_20_green.png";
iconarray[2].shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
iconarray[2].iconSize = new GSize(12, 20);
iconarray[2].shadowSize = new GSize(22, 20);
iconarray[2].iconAnchor = new GPoint(6, 20);
iconarray[2].infoWindowAnchor = new GPoint(5, 1);

// Start default mode (view)
viewMode(1);

// FUNCTIONS
// Functions to make map auto-resize when browser window is resized.
var resizingInterval = null;
var resizingFlag = false;

window.onresize = function() {
    var NS = getWindowSize();
    document.getElementById("map").style.width = (NS.width - 250) +
'px';
    document.getElementById("map").style.height = (NS.height - 140) +
'px';
    resizingFlag = true;

    if (resizingInterval==null) resizingInterval = setInterval("checkResizeEnd()", 100);
};

function checkResizeEnd() {
    if (!resizingFlag) {
        map.onResize();
        clearInterval(resizingInterval);
        resizingInterval = null;
    }
    resizingFlag = false;
};

// Function to show processing
function Processing(on) {
    if (on == 1) {
        document.getElementById("submitstatus").innerHTML = 'Processing...';
    } else {
        document.getElementById("submitstatus").innerHTML = '';
    }
}

// Function creates marker and info window
function createMarker(point, imode, username, avatar, comment) {    // imode: icon from iconarray
    var marker = new GMarker(point, iconarray[imode]);
    if (imode!=1){  // Show marker info window except when mode is add/edit
        if (avatar == '') {
            var infobox = '<div style="width: 190px; height: 94px; overflow:auto"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>';
        } else {
            var infobox = '<div style="width: 220px; height: 94px; overflow:auto"><table width="100%" border="0" cellspacing="0" cellpadding="2"><tr><td width="80" valign="top" style="margin-left: 5px;"><img src="'+avatar+'" border="0" width="80" height="80"></td>';
        }
        infobox += '<td valign="top" align="left" width="100%"><b><a href="$SETTINGS[boardurl]member.php?action=viewpro&member='+username+'" target="_blank" style="font-family: $THEME[font];font-size: 12px;color: black;">'+username+'</a>\
        </b><hr><font  style="font-family: $THEME[font];font-size: 10px;color: black;">'+comment.replace(/</g,'&lt;').replace(/\n/g,"<br />")+'</font><br />\
        </td></tr></table></div>';

        GEvent.addListener(marker, "click", function() {
            marker.openInfoWindowHtml(infobox);
        });
    }
    return marker;
}

// Function activated when clicking member from list
function MoveAndOpen(selectval){
    selarray = new Array;
    selectval = document.mmview.memberName.options[document.mmview.memberName.selectedIndex].value;
    selarray = selectval.split("|",6);

    var xy = new GPoint(selarray[0],selarray[1]);
    map.recenterOrPanToLatLng(xy);
    var marker = createMarker(xy,2,selarray[2],selarray[3],selarray[4]);

    if (selarray[3] == '') {
        var infobox = '<div style="width: 190px; height: 94px; overflow:auto"><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>';
    } else {
        var infobox = '<div style="width: 220px; height: 94px; overflow:auto"><table width="100%" border="0" cellspacing="0" cellpadding="2"><tr><td width="80" valign="top" style="margin-left: 5px;"><img src="'+selarray[3]+'" border="0" width="80" height="80"></td>';
    }

    infobox += '<td valign="top" align="left" width="100%"><b><a href="$SETTINGS[boardurl]member.php?action=viewpro&member='+selarray[2]+'" target="_blank" style="font-family: $THEME[font];font-size: 12px;color: black;">'+selarray[2]+'</a>\
    </b><hr><font style="font-family: $THEME[font];font-size: 10px;color: black;">'+selarray[4].replace(/\n/g,"<br />")+'</font><br />\
    </td></tr></table></div>';

    map.openInfoWindowHtml(xy, infobox,new GSize(-1, -19));
}

// Store user point and info in database
function pointSubmit(){
    psubmit = true;
    request2 = GXmlHttp.create();
    request2.open('POST', "./include/ajax_post.php?action=addpoint" , true);
    request2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request2.send('PointLat=' + document.form_pointform.PointLat.value.replace(/&/g,'%26')+'&PointLng=' + document.form_pointform.PointLng.value.replace(/&/g,'%26')+'&PointComment=' + document.form_pointform.PointComment.value.replace(/&/g,'%26')+ '&memberid=' + document.form_pointform.memberid.value);

    setTimeout("viewMode(1)",1500);
}

// Delete user point and info from database
function pointDelete(){
    request4 = GXmlHttp.create();
    request4.open('POST', "./include/ajax_post.php?action=deletepoint" , true);
    request4.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    request4.send('memberid=' + document.form_pointform.memberid.value);

    setTimeout("viewMode(1);map.recenterOrPanToLatLng(new GPoint(stdlat,stdlng));map.zoomTo(stdzoom);",1500);
}

// Main function to initiate actions and generate html
function viewMode(mode){
    // Remove add/edit listener if present
    if (aplisten){
        GEvent.removeListener(aplisten);
        aplisten=false;
    }

    switch (mode){
        case 1:     // View
        map.clearOverlays();
        document.getElementById("switch").innerHTML = '$mmeditlink';

        // Recenter and zoom if [ back ] button pushed
        if (lastcenter != false && psubmit !=  true){
            map.recenterOrPanToLatLng(lastcenter);
            map.zoomTo(lastzoom);
        }
        psubmit = false;

        var request1 = GXmlHttp.create();
        request1.open("GET", "./include/ajax_get.php?action=allpoints", true);
        request1.onreadystatechange = function() {
            if (request1.readyState == 4) {

                var xmlDoc = request1.responseXML;
                var markers = xmlDoc.documentElement.getElementsByTagName("marker");

                var righthtml = '<center><br /><form method="post" action="MoveAndOpen()" name="mmview">\
                    <select size="24"  name="memberName" onchange="if(this.options[this.selectedIndex].value) MoveAndOpen()">\
                    <option class="navtd">$lang[membermaplist]</option>';

                for (var i = 0; i < markers.length; i++) {
                    var pointlat = markers[i].getAttribute("lat");
                    var pointlng = markers[i].getAttribute("lng");
                    var pusername = markers[i].getAttribute("username");
                    var pavatar = markers[i].getAttribute("avatar");
                    var pcomment = markers[i].getAttribute("comment");
                    var point = new GPoint(parseFloat(pointlat),parseFloat(pointlng));
                    var marker = createMarker(point,0,pusername,pavatar,pcomment);
                    map.addOverlay(marker);

                    righthtml += '<option value="' + pointlat + '|' + pointlng + '|' + pusername + '|' + pavatar + '|' + pcomment + '">' + pusername + '</option>';
                }
                righthtml  += '</select></form></center>';
                document.getElementById("div_rightbar").innerHTML = righthtml;
            }
            Processing(0);
        }
        request1.send(null);
        break;

        case 2: // Add
        map.clearOverlays();
        lastcenter = map.getCenterLatLng();
        lastzoom=map.getZoomLevel();
        document.getElementById("switch").innerHTML = '<div onclick="viewMode(1);" style="font-size:10px;cursor:pointer;cursor:hand;" align="center">[ back ]</div>';

        // Check if user already stored a point
        var request3 = GXmlHttp.create();
        request3.open("GET", "./include/ajax_get.php?action=userpoint", true);
        request3.onreadystatechange = function() {
            if (request3.readyState == 4) {
                var xmlDoc = request3.responseXML;
                var markers = xmlDoc.documentElement.getElementsByTagName("marker");

                if (markers.length == 2) {
                    currentlat = markers[1].getAttribute("lat");
                    currentlng = markers[1].getAttribute("lng");
                    currentcomment = markers[1].getAttribute("comment");

                    var point = new GPoint(parseFloat(currentlat),parseFloat(currentlng));
                    var marker = createMarker(point,1);
                    map.addOverlay(marker);
                    map.recenterOrPanToLatLng(point);

        document.getElementById("div_rightbar").innerHTML = '<form name="form_pointform">\
            <table border="0" cellpadding="2" cellspacing="0" width="100%"><tr><td class="tablerow">\
            <br/>Pinpoint your location by clicking on the map<br/>\
            <br/>Latitude:<br/><input type="text" name="PointLat" value="' + currentlat + '" size="18" tabindex="1" readonly="readonly" />\
            <br/><br/>Longitude:<br/><input type="text" name="PointLng" value="' + currentlng + '"  size="18" tabindex="2" readonly="readonly"/>\
            <br/><br/>Comments / location:<br/><textarea name="PointComment" type="text" rows="3" cols="18" tabindex="3">' + currentcomment + '</textarea>\
            <br/><br/><input type="hidden" name="memberid" value="$self[username]"><input type="button" value="Submit" onclick="Processing(1);pointSubmit();" name="PointSubmit" tabindex="4">&nbsp;&nbsp;<input type="button" value="Reset" onclick="Processing(1);pointDelete();" name="PointDelete" tabindex="5">\
            </td></tr></table></form><br/>';

                } else {

        document.getElementById("div_rightbar").innerHTML = '<form name="form_pointform">\
            <table border="0" cellpadding="2" cellspacing="0" width="100%"><tr><td class="tablerow">\
            <br/>Pinpoint your location by clicking on the map<br/>\
            <br/>Latitude:<br/><input type="text" name="PointLat" size="18" tabindex="1" readonly="readonly"/>\
            <br/><br/>Longitude:<br/><input type="text" name="PointLng" size="18" tabindex="2" readonly="readonly"/>\
            <br/><br/>Comments / location:<br/><textarea name="PointComment" type="text" rows="3" cols="18" tabindex="3"></textarea>\
            <br/><br/><input type="hidden" name="memberid" value="$self[username]"><input type="button" value="Submit" onclick="Processing(1);pointSubmit()" name="PointSubmit" tabindex="4">\
            </td></tr></table></form>';
                }
            }
        }
        request3.send(null);

        aplisten=GEvent.addListener(map, 'click', function(overlay, point) {
            map.clearOverlays(); // Clear existing point user

            if (addmarker){
                map.removeOverlay(addmarker);   // Remove previously clicked marker
            }

            addmarker=createMarker(point, 1);
            map.addOverlay(addmarker);

            if (document.form_pointform){
                document.form_pointform.PointLat.value = point.x;
                document.form_pointform.PointLng.value = point.y;
            }
        });
        break;
    }
}

//]]>
</script>

===========
End Step 11!
===========

=======================================================================================================================
 OPTIONAL - CONFIGURATION - OPTIONAL - CONFIGURATION - OPTIONAL - CONFIGURATION - OPTIONAL - CONFIGURATION - OPTIONAL - 
=======================================================================================================================

==========================================
Step 12: Change Default Starting Map & Zoom
==========================================

========================================
Go to admin panel -> templates -> header
========================================


==========
Find Code:
==========

var stdlat = '5.9765625';
var stdlng = '30.29701788337205';
var stdzoom = '15';

==================
Replace Values With:
==================

Your own values (lookup lat/lng using the 'place your pin' option, zoom level between 1-16)



========================================================================================================
Optional - Step 12: Make Membermap Member's Only Feature (By Default Membermap Can Be Viewed By Everyone)
Use The Following Code If You Want Only Members To Have Access To The Membermap:
========================================================================================================


========================
Edit File: membermap.php
========================

==========
Find Code:
==========

// if (!X_MEMBER) error("You must be registered and logged in to see the Membermap.");

==================
Replace Code With:
==================

if (!X_MEMBER) error("You must be registered and logged in to see the Membermap.");


========================================================================================================
Known Bugs (as of October 6th 2005)
========================================================================================================
-Quotes or apostrophes in comments don't work properly
-Mozilla: carriage returns in comments are not displayed
========================================================================================================