// my icon
var myIcon = new GIcon();
myIcon.image = "map-marker.png";
myIcon.iconSize = new GSize(10,10);
myIcon.iconAnchor = new GPoint(5,5);

var http = createRequestObject();
var bubblePoint;

function createRequestObject() {
   	var tmpXmlHttpObject;
    
    	//depending on what the browser supports, use the right way to create the XMLHttpRequest object
	if (window.XMLHttpRequest)
	{ 
        	// Mozilla, Safari would use this method ...
	        tmpXmlHttpObject = new XMLHttpRequest();
	} else if (window.ActiveXObject) { 
        	// IE would use this method ...
        	tmpXmlHttpObject = new ActiveXObject("Microsoft.XMLHTTP");
    	}
	return tmpXmlHttpObject;
}

function makeGetRequest(type, param) {
	//make a connection to the server ... specifying that you intend to make a GET request 
	//to the server. Specifiy the page name and the URL parameters to send
	http.open('GET', 'dbret.php?' + param);

	//assign a handler for the response
	if(type=="bubbletext")
	{
		http.onreadystatechange = processResponseBubbleText;
	}

	//actually send the request to the server
	http.send(null);
}

function processResponseBubbleText() {
    //check if the response has been received from the server
    if(http.readyState == 4){
	
        //read and assign the response from the server
        var response = http.responseText;
	
	//parse
	var temp = JSON.parse(response);
		
        //in this case simply assign the response to the contents of the <div> on the page. 
        var html = document.createElement("span");
	if (temp['FName']!="")
	{
        	html.innerHTML = "<div id=\"bubbleTable\" style=\"width:250px;\"><table>"
				+ "<tr><td>Reg. Manager:</td><td><div id=\"name\">" +temp['FName']+" "+temp['LName']+ "</div></td></tr>"
                   	 	+ "<tr><td>Email:</td><td><div id=\"name\">" +temp['Email']+ "</div></td></tr>"
                	    	+ "<tr><td>Fax:</td><td><div id=\"name\">" +temp['BusinessFax']+ "</div></td></tr>"
               	    	 	+ "<tr><td>Phone:</td><td><div id=\"name\">" +temp['BusinessPhone']+ "</div></td></tr>"
                	    	+ "<tr><td>Cell:</td><td><div id=\"name\">" +temp['BusinessCell']+ "</div></td></tr>"
        	            	+ "</table></div>";
	}
	else
	{
                html.innerHTML = "<div id=\"bubbleTable\" style=\"width:250px;\"><table>"
                                + "<tr><td>Company:</td><td><div id=\"name\">" +temp['Company']+ "</div></td></tr>"
                                + "<tr><td>Phone:</td><td><div id=\"name\">" +temp['BusinessPhone']+ "</div></td></tr>"
                                + "<tr><td>Website:</td><td><div id=\"name\">" +temp['Website']+ "</div></td></tr>"
                                + "</table></div>";
		clearTable();
	}
	map.openInfoWindowHtml(bubblePoint, html);
    }
}








// create a US marker object
function createUSMarker(point,region,suboverlay)
{
	var marker = new GMarker(point, { icon: myIcon });

	GEvent.addListener(marker, "click", function()
        {
                bubblePoint = marker.getLatLng();
                makeGetRequest("bubbletext","type=bubbletext&region="+region);
                if (overlayAdded>-1)
                {
                        if (canadianOrAmerican==0)
                        {
                                map.removeOverlay(arrMgrPolygonCA[overlayAdded]);
                        }
                        else
                        {
                        	map.removeOverlay(arrMgrPolygon[overlayAdded][suboverlayAdded]);
                        }
                }
		
                map.addOverlay(arrMgrPolygon[region-1][suboverlay-1]);
		overlayAdded = region-1;
		suboverlayAdded = suboverlay-1;
                canadianOrAmerican = 1;

                createTable(region,suboverlay);
        });


	GEvent.addListener(marker, "mouseover", function()
	{
		map.disableInfoWindow();
		map.enableInfoWindow();
	});

    return marker;
}



// create a CA marker object
function createCAMarker(point,region)
{
        var marker = new GMarker(point, { icon: myIcon });
	var html = document.createElement("span");
	html.innerHTML = "<div id=\"bubbleTable\" style=\"width:275px;\"><table>"
                    + "<tr><td>Company:</td><td><div id=\"name\">Frontrunner Professional</div></td></tr>"
		    + "<tr><td></td><td><div id=\"name\">Matthews IMS Distributor</div></td></tr>"
		    + "<tr><td>Rep:</td><td><div id=\"name\">Mike Hepburn</div></td></tr>"
                    + "<tr><td>Email:</td><td><div id=\"name\">sales@frontrunnerpro.com</div></td></tr>"
                    + "<tr><td>Phone:</td><td><div id=\"name\">1-866-748-3625</div></td></tr>"
                    + "</table></div>";

        GEvent.addListener(marker, "click", function()
        {
		map.openInfoWindowHtml(point, html);

		if (overlayAdded>-1)
                {
                        if (canadianOrAmerican==0)
                        {
                                map.removeOverlay(arrMgrPolygonCA[overlayAdded]);
                        }
                        else
                        {
                        	map.removeOverlay(arrMgrPolygon[overlayAdded][suboverlayAdded]);
                        }
                }

		// set overlay variables
                map.addOverlay(arrMgrPolygonCA[region-1]);
                overlayAdded = region-1;
		suboverlayAdded = -1;
                canadianOrAmerican = 0;
		clearTable();
        });

        GEvent.addListener(marker, "mouseover", function()
        {
                map.disableInfoWindow();
                map.enableInfoWindow();
        });

	return marker;
}



// add the user marker to the map
function addUserToMap(response)
{
    if(!response || response.Status.code != 200)
    {
        alert("Sorry, we were unable to geocode that address");
    }
    else
    {
        place = response.Placemark[0];
        point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

        //if (userMarker)
        //{
        //    mgr.removeMarker(userMarker);
        //}

        map.setCenter(point, map.getZoom());
	markClosest(response.Placemark[0].AddressDetails.Country.CountryNameCode);
    }
}



function clearTable()
{
    var body = document.getElementsByTagName("body")[0];
    var oldTable = document.getElementsByTagName("table")[0];
    if(oldTable)
        body.removeChild(oldTable);
}


function createTable(region,suboverlay)
{
    //////////////////////////////
    // clean up and start up
    //////////////////////////////
    var body = document.getElementsByTagName("body")[0];

    var oldTable = document.getElementsByTagName("table")[0];
    if(oldTable)
        body.removeChild(oldTable);

    var tbl     = document.createElement("table");
    var tblBody = document.createElement("tbody");


    //////////////////////////////
    // create header
    //////////////////////////////
    var headerRow = document.createElement("tr");
    var headerTitles=new Array("State:","Territory:","Rep Name:","Email:","Phone:");

    for (var x=0; x<headerTitles.length; x++)
    {
        var cell = document.createElement("th");
        var cellText = document.createTextNode(headerTitles[x]);
        cell.appendChild(cellText);
	cell.setAttribute("id","tableheader");
        headerRow.appendChild(cell);
    }

    tblBody.appendChild(headerRow);


    //////////////////////////////
    // create rows
    //////////////////////////////
    for (var x=0; x<arrRepData.length; x++)
    {
        if (arrRepData[x][2]==region && arrRepData[x][7]==suboverlay)
        {
            // create a table row
            var row = document.createElement("tr");

            // create State cell
            var cellState = document.createElement("td");
            var cellStateText = document.createTextNode(arrRepData[x][3]);
            cellState.appendChild(cellStateText);
            row.appendChild(cellState);

            // create Terr cell
            var cellTerr = document.createElement("td");
            var cellTerrText = document.createTextNode(arrRepData[x][4]);
            cellTerr.appendChild(cellTerrText);
            row.appendChild(cellTerr);

            // create RepName cell
            var cellRepName = document.createElement("td");
            var cellRepNameText = document.createTextNode(arrRepData[x][0] + " " + arrRepData[x][1]);
            cellRepName.appendChild(cellRepNameText);
            cellRepName.setAttribute("id","name");
            row.appendChild(cellRepName);

            // create Email cell
            var cellContact = document.createElement("td");
            var cellContactText = document.createTextNode(arrRepData[x][6]);
            cellContact.appendChild(cellContactText);
            cellContact.setAttribute("id","email");
            row.appendChild(cellContact);

            // create Phone cell
            var cellContact = document.createElement("td");
            var cellContactText = document.createTextNode(arrRepData[x][5]);
            cellContact.appendChild(cellContactText);
            cellContact.setAttribute("id","name");
            row.appendChild(cellContact);


            // add the row to the end of the table body
            tblBody.appendChild(row);
        }
    }

    // put the <tbody> in the <table>
    tbl.appendChild(tblBody);

    // appends <table> into <body>
    body.appendChild(tbl);

    tbl.setAttribute("border", "0");
}






// handle search button
function doSearch()
{
	map.disableInfoWindow();
	map.enableInfoWindow();

	// get user address
	var userAddress = document.forms[0].q.value;

	// plot address
	geocoder.getLocations(userAddress, addUserToMap);
}





// highlight region user address is contained in
function markClosest(country)
{
    var j=0;
    var found = false;
    var x = point.lng();
    var y = point.lat();

    var indexFound = -1;
    var cntryFound = -1;
	var subindexFound = -1;
    
	// loop through all of the polygons in US
	if(country=="US")
	{
		for (var index=0; index<arrMgrPolygon.length; index++)
		{
			for(var subindex=0; subindex<arrMgrPolygon[index].length; subindex++)
			{
				var poly = arrMgrPolygon[index][subindex];
				j=0;
				found=false;
            
				for (var i=0; i < poly.getVertexCount(); i++)
				{
					j++;
					if (j == poly.getVertexCount()) {j = 0;}
        			        if (((poly.getVertex(i).lat() < y) && (poly.getVertex(j).lat() >= y)) || ((poly.getVertex(j).lat() < y) && (poly.getVertex(i).lat() >= y)))
               				{
						if ( poly.getVertex(i).lng() + (y - poly.getVertex(i).lat()) / (poly.getVertex(j).lat()-poly.getVertex(i).lat()) * (poly.getVertex(j).lng() - poly.getVertex(i).lng())<x )
                    				{
                        				found = !found;
                    				}
                			}
            			}

				if (found)
            			{
                			indexFound = index;
					subindexFound = subindex;
                			subindex = arrMgrPolygon[index].length;
					index = arrMgrPolygon.length;
					cntryFound=1;
                			break;
            			}
        		}
    		}
	}
	else
	{ // loop through all of the polygons in CA
        	for (var index=0; index<arrMgrPolygonCA.length; index++)
                {
                	var poly = arrMgrPolygonCA[index];
                        j=0;
                        found=false;

                        for (var i=0; i < poly.getVertexCount(); i++)
                        {
                        	j++;
                                if (j == poly.getVertexCount()) {j = 0;}
                                if (((poly.getVertex(i).lat() < y) && (poly.getVertex(j).lat() >= y)) || ((poly.getVertex(j).lat() < y) && (poly.getVertex(i).lat() >= y)))
                                {
                                	if ( poly.getVertex(i).lng() + (y - poly.getVertex(i).lat()) / (poly.getVertex(j).lat()-poly.getVertex(i).lat()) * (poly.getVertex(j).lng() - poly.getVertex(i).lng())<x )
                                        {
                                        	found = !found;
                                        }
                                }
                        }

                        if (found)
                        {
                        	indexFound = index;
                                index = arrMgrPolygonCA.length;
                                cntryFound=0;
                                break;
                        }
                }
        }


    
    	// display the polygon   
	if (indexFound>-1)
    	{
		// remove old overlay
		if (overlayAdded>-1)
                {
                        if (canadianOrAmerican==0)
                        {
                                map.removeOverlay(arrMgrPolygonCA[overlayAdded]);
                        }
                        else
                        {
                                map.removeOverlay(arrMgrPolygon[overlayAdded][suboverlayAdded]);
                        }
                }

		// add new overlay
		if (cntryFound==0)
		{
           		map.addOverlay(arrMgrPolygonCA[indexFound]);
		}
		else
                {
                        map.addOverlay(arrMgrPolygon[indexFound][subindexFound]);
                }


		overlayAdded = indexFound;
		suboverlayAdded = subindexFound;
		canadianOrAmerican = cntryFound;
		
		if (cntryFound==1)
		{
			createTable(indexFound+1,subindexFound+1);
		}
		else
		{
			var body = document.getElementsByTagName("body")[0];
			var oldTable = document.getElementsByTagName("table")[0];
			if(oldTable)
				body.removeChild(oldTable);
		}
    	}
}

