
 function mapObj()
 {
 this.ID = 0;
 this.mapPoint = '';
 this.marker = '';
 this.text = '';
 this.textRow = '';
 this.mapSet = 0;
 this.Pharmacy = '';
 this.Address = '';
 this.City = '';
 this.State = '';
 this.Zip = '';
 this.Phone = '';
 this.geoPoint = '';
 this.distance = '';
 this.zipDistance = '';
 this.toAddress = '';
 this.lat = '';
 this.lon = '';
 }


var startNum=0;
var restart = 0;

var mArray = new Array();
 

  function createYahooMarker(mObj) {
  	if(mObj.Phone && mObj.Phone.length >= 10)
	{
	area = mObj.Phone.substr(0,3);
	ex =  mObj.Phone.substr(3,3);
	pnum =  mObj.Phone.substr(6,4);
	
	phone = '('+area+') '+ex+'-'+pnum;
	}
    var myImage = new YImage();
	if(mObj.ID==0)
	{
	myImage.src = 'images/mapHOME.gif';
	myImage.size = new YSize(30,30);
	}
    else 
	{
	myImage.src = 'images/mapRX.gif';
    myImage.size = new YSize(30,30);
	}
    myImage.offsetSmartWindow = new YCoordPoint(0,0);
	mObj.toAddress = escape(mObj.Address+","+mObj.City+" "+mObj.State);
    var marker = new YMarker(mObj.geoPoint,myImage);
    
    var label = "<div class='label'>";
    if(mObj.ID!=0) marker.addLabel(label);
    YEvent.Capture(marker,EventsList.MouseClick, function() { marker.openSmartWindow(mObj.text);});
	//alert(num);
    return marker;
  }


String.prototype.trim=function(){
    return this.replace(/^\s*|\s*$/g,'');
}


function formatCurrency(num) {
if(num) num = num.toString().replace(/\$|\,/g,'');
if(isNaN(num))
num = "0";
sign = (num == (num = Math.abs(num)));
num = Math.floor(num*100+0.50000000001);
cents = num%100;
num = Math.floor(num/100).toString();
if(cents<10)
cents = "0" + cents;
for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
num = num.substring(0,num.length-(4*i+3))+','+
num.substring(num.length-(4*i+3));
return (((sign)?'':'-') + '' + num + '.' + cents);
}

var tempX = 0
var tempY = 0


function getMouseXY(e) {
  if (IE) { // grab the x-y pos.s if browser is IE
    tempX = event.clientX + document.body.scrollLeft
    tempY = event.clientY + document.body.scrollTop
  } else {  // grab the x-y pos.s if browser is NS
    tempX = e.pageX
    tempY = e.pageY
  }  

  if (tempX < 0){tempX = 0}
  if (tempY < 0){tempY = 0}  
  return true
}


 function getDistance(lat1, lon1, lat2, lon2, unit) {
	
	 	var startLat = lat1
      	var startLon = lon1

          var R = 3950
          var dLat = lat2 - startLat
          var dLong = lon2 - startLon

          var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(startLat) * Math.cos(lat2) * Math.sin(dLong / 2) * Math.sin(dLong / 2)
          var c  = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
          var d  = (R * c) / 58;
		  var dist = formatCurrency(d)	
	return dist
	}   
 

function showLoading()
{
loading = document.getElementById('LoadingBar')
loading.style.display = "block"	
}

function hideLoading()
{
loading = document.getElementById('LoadingBar')
loading.style.display = "none"	
}


function createScroll()
{
			var cellNumber = 0;
			
			var tableLayer = document.getElementById('pharmacyList');
			var mainWidth = parseInt(tableLayer.clientWidth);	
			var table = tableLayer.getElementsByTagName('TABLE');
			
			//GET NUMBER OF ENTRIES
			var sizeRow = table[1].getElementsByTagName('TR');

			if(sizeRow.length > 4)
			{
					document.getElementById('listDiv').style.width = (mainWidth - 16) + "px";
					if(document.all) document.getElementById('listDiv').style.width = (mainWidth - 20) + "px";
					document.getElementById("headerTable").style.width = (mainWidth) + "px";
			}
			var sizeCells = sizeRow[0].getElementsByTagName('TD');
		
			var header = document.getElementById('headerTable');
			var headerRow = header.getElementsByTagName("TR");
			for(j=0;j<(headerRow.length);j++)
			{
				cellCount = headerRow[j].getElementsByTagName('TH');
				if(cellCount.length > 1) cellNumber = j;
			}
			
			var headerCells = headerRow[cellNumber].getElementsByTagName("TH");
	
			for(j=0;j<(sizeCells.length-1);j++)
			{
				
				headerCells[j].style.width =  (sizeCells[j].clientWidth-10) + "px";
				if(document.all) headerCells[j].style.width = parseInt(headerCells[j].style.width) +5;
				
			}
			
			if(useFull)
			{
			var height = parseInt(document.getElementById('pharmacyList').style.height);
			var width = parseInt(document.getElementById('pharmacyList').clientWidth);
			document.getElementById('listDiv').style.height = height-150 + "px";
			document.getElementById('listDiv').style.width = width-16 + "px";
			}
			else
			{
				document.getElementById('listDiv').style.height = "auto";
			}
}


function setPage()
{
	var browserHeight = YAHOO.util.Dom.getClientHeight();
	var browserWidth = YAHOO.util.Dom.getClientWidth();
	var headerHeight = parseInt(document.getElementById('locateHeader').clientHeight);
	var formHeight = parseInt(document.getElementById('locateForm').clientHeight);
	var topHeight = headerHeight;
	
	var loading = document.getElementById('LoadingBar');
	loading.style.top = browserHeight/2 -20;
	loading.style.left = browserWidth/2 - 160;
	
	var mapDiv = document.getElementById('mapOutside');
	
	if(topHeight == 0) topHeight = 150;
	if(browserWidth > 1200)
	{
		var mapWidth = (browserWidth * 2)/3;
		var mapHeight = browserHeight - topHeight-20;
		var textWidth = browserWidth - mapWidth - 40;
	}
	else
	{
		var mapWidth = (browserWidth/2)-20;
		var mapHeight = browserHeight - topHeight-20;
		var textWidth = browserWidth - mapWidth - 50;
	}
	
	var browserWidth = YAHOO.util.Dom.getClientWidth();
	
	if(browserWidth <= 800)
	{
	 //mapDiv.style.top = 20+"px";
	 //mapDiv.style.left = 20+"px";
	}
	else
	{
	// mapDiv.style.top = 150+"px";
	// mapDiv.style.left = 150+"px";	
	}
	
		//var mapSize = new YSize(mapWidth, mapHeight)
		document.getElementById('pharmacyList').style.height = browserHeight-100  + "px";
}


 function setList()
 {
	 
	 var resultsTable = document.createElement('table');
	 resultsTable.setAttribute('cellPadding',0);
	 resultsTable.setAttribute('cellSpacing',0);
	 resultsTable.setAttribute('id','headerTable');
	 var tableHead = document.createElement('thead');
	 var tableRow = document.createElement('tr');
	 
	
	  var tableCell = document.createElement('th');
	 tableCell.innerHTML = "<a href=\"javascript:reSort('pharmacy')\">Pharmacy</a>"
	 tableRow.appendChild(tableCell);
	 
	 var tableCell = document.createElement('th');
	 tableCell.innerHTML = "Location"
	 tableRow.appendChild(tableCell);
	 
	 var tableCell = document.createElement('th');
	 tableCell.innerHTML = "Phone"
	 tableRow.appendChild(tableCell);
	 
	 
	  var tableCell = document.createElement('th');
	 tableCell.innerHTML = "<a href=\"javascript:reSort('distance')\">Distance</a>"
	 tableRow.appendChild(tableCell);
	 
	   var tableCell = document.createElement('th');
	 tableCell.innerHTML = "Map"
	 tableRow.appendChild(tableCell);
	 
	 tableHead.appendChild(tableRow);
	 resultsTable.appendChild(tableHead);
	 
	 document.getElementById('pharmacyList').appendChild(resultsTable);
	 
	 var listDiv = document.createElement('DIV');
	 listDiv.setAttribute('id','listDiv');
	 
	 var resultsTable = document.createElement('table');
	 resultsTable.setAttribute('cellPadding',0);
	 resultsTable.setAttribute('cellSpacing',0);
	 
	 var homeLat = mArray[0].lat
	 var homeLon = mArray[0].lon
	 
	

 	for(j=1;j<mArray.length;j++)
	{
		
		
		if(mArray[j].Phone && mArray[j].Phone.length >= 10)
		{
		area = mArray[j].Phone.substr(0,3);
		ex =  mArray[j].Phone.substr(3,3);
		pnum =  mArray[j].Phone.substr(6,4);
		phone = '('+area+') '+ex+'-'+pnum;
		}
		else phone = '';
		
		
		mArray[j].text = "<div class='info'><b>"+mArray[j].Pharmacy+"</b><br />Distance:"+formatCurrency(mArray[j].distance)+" miles<br />"+mArray[j].Address+"<br />"+mArray[j].City+", "+mArray[j].State+" "+ mArray[j].Zip+"<br />"+phone+"<br /><a href='http://maps.yahoo.com/beta/#maxp=location&q1=&q2="+mArray[j].toAddress+"&q1="+homeAddress+"' target='_blank' >Directions</a></div>";
	 mArray[j].textRow = mArray[j].Address+", "+mArray[j].City+", "+mArray[j].State+" "+ mArray[j].Zip+"<br />"+phone+"<br />Distance:"+formatCurrency(mArray[j].distance)+" miles <a href='http://maps.yahoo.com/beta/#maxp=location&q1=&q2="+mArray[j].toAddress+"&q1="+homeAddress+"' target='_blank' >Directions</a></div>";
	}
	
	// sort the results by distance
	
	//for (i=0; i<mArray.length-1; i++) {
 	//for (j=0; j<mArray.length-1-i; j++)
   // if (mArray[j+1].distance < mArray[j].distance) {  /* compare the two neighbors */
   //   tmp = mArray[j];         /* swap a[j] and a[j+1]      */
   //   mArray[j] = mArray[j+1];
   //   mArray[j+1] = tmp;
 // }
//}

	

	bubblesort(mArray,0,mArray.length-1);
	
	
	for(j=1;j<mArray.length;j++)
	{
	setResults(resultsTable,j,mArray[j].Pharmacy,mArray[j].Address,mArray[j].City,mArray[j].State,mArray[j].Zip,mArray[j].Phone,mArray[j].distance,mArray[j].ID);
	}

	listDiv.appendChild(resultsTable)
	var thisDiv = document.getElementById('pharmacyList');
	thisDiv.appendChild(listDiv);
	init();
	createScroll();
	hideLoading();
	
 }
 
 
 function bubblesort(array, start, finish)
{
   OSL = array.length;
	while(OSL >= 0)
	   {
   		UpperLimit = array.length -2;
			for(x = 0; x <=UpperLimit; x++)
			   {
				if(array[x].distance > array[x +1].distance)
				   {
		 			tempVar = array[x];
					array[x] = array[x+1];
					array[x + 1] = tempVar;
				   }
			   } 
		OSL = OSL - 1
	   }
}
 
  function Quicksort(vec, loBound, hiBound)
    /**************************************************************
        This function adapted from the algorithm given in:
            Data Abstractions & Structures Using C++, by
            Mark Headington and David Riley, pg. 586.

        Quicksort is the fastest array sorting routine for
        unordered arrays.  Its big O is n log n.
     **************************************************************/
    {

        var pivot, loSwap, hiSwap, temp;

        // Two items to sort
        if (hiBound - loBound == 1)
        {
            if (vec[loBound] > vec[hiBound])
            {
                temp = vec[loBound];
                vec[loBound] = vec[hiBound];
                vec[hiBound] = temp;
            }
            return;
        }

        // Three or more items to sort
        pivot = vec[parseInt((loBound + hiBound) / 2)];
        vec[parseInt((loBound + hiBound) / 2)] = vec[loBound];
        vec[loBound] = pivot;
        loSwap = loBound + 1;
        hiSwap = hiBound;

        do {
            // Find the right loSwap
            while (loSwap <= hiSwap && vec[loSwap] <= pivot)
                loSwap++;

            // Find the right hiSwap
            while (vec[hiSwap] > pivot)
                hiSwap--;

            // Swap values if loSwap is less than hiSwap
            if (loSwap < hiSwap)
            {
                temp = vec[loSwap];
                vec[loSwap] = vec[hiSwap];
                vec[hiSwap] = temp;
            }
        } while (loSwap < hiSwap);

        vec[loBound] = vec[hiSwap];
        vec[hiSwap] = pivot;


        // Recursively call function...  the beauty of quicksort

        // 2 or more items in first section        
        if (loBound < hiSwap - 1)
            Quicksort(vec, loBound, hiSwap - 1);


        // 2 or more items in second section
        if (hiSwap + 1 < hiBound)
            Quicksort(vec, hiSwap + 1, hiBound);
    }
 
 
 function reSort(type)
 {
	if(type=="distance")
	{
		for (i=1; i<mArray.length; i++) {
  	for (j=1; j<mArray.length-i; j++)
  	  if (mArray[j+1].distance < mArray[j].distance) {  /* compare the two neighbors */
      tmp = mArray[j];         /* swap a[j] and a[j+1]      */
      mArray[j] = mArray[j+1];
      mArray[j+1] = tmp;
 	 }
	}
	}
	else if (type="pharmacy")
	{
		for (i=1; i<mArray.length; i++) {
  	for (j=1; j<mArray.length-i; j++)
  	  if (mArray[j+1].Pharmacy < mArray[j].Pharmacy) {  /* compare the two neighbors */
      tmp = mArray[j];         /* swap a[j] and a[j+1]      */
      mArray[j] = mArray[j+1];
      mArray[j+1] = tmp;
 	 }
	}
	}
	
	
	document.getElementById('listDiv').innerHTML = '';
	
	 var resultsTable = document.createElement('table');
	 resultsTable.setAttribute('cellPadding',0);
	 resultsTable.setAttribute('cellSpacing',0);
	
	for(j=1;j<mArray.length;j++)
	{
	setResults(resultsTable,j,mArray[j].Pharmacy,mArray[j].Address,mArray[j].City,mArray[j].State,mArray[j].Zip,mArray[j].Phone,mArray[j].distance, mArray[j].ID);
	}
	listDiv.appendChild(resultsTable)
	
 }
 
 
 var homeAddress = '';
 var finalRadius = '';
 
 var street, city, state, zip = '';
 
 function getPharmacies()
 {
  hideMap();
  restart=0;
  //var address = document.getElementById('txtAddress').value;
  //var city = document.getElementById('txtCity').value;
  //var state = document.getElementById('txtState').options[document.getElementById('txtState').selectedIndex].value
  //var zip =  document.getElementById('txtZip').value;
  parseAddress();
  var radius = document.getElementById('selectRadius').options[document.getElementById('selectRadius').selectedIndex].value
  radius = parseInt(radius)+2;
  if(zip =='' || zip.length <5)
  {
	document.getElementById('errorDiv').innerHTML = 'Zip Code is required.';
	document.getElementById('errorDiv').style.display="block";  
  }
  else
  {
  showLoading();
  mArray = new Array();
  document.getElementById('errorDiv').style.display="none";  
  document.getElementById('pharmacyHome').innerHTML = '';
  document.getElementById('pharmacyList').innerHTML = '';
  var mypoint = street+", "+city+" "+state+" "+zip;
  myPoint = mypoint;
  homeAddress = mypoint;
  finalRadius = radius;
  var browserWidth = YAHOO.util.Dom.getClientWidth();
  
  
   setObject(0,'HOME',street,city,state,zip);
    var thisDiv = document.getElementById('pharmacyHome');
	if(street == '')
	{
		thisDiv.innerHTML = '<h4>Zip Code (distances are calculated from the center of the zip code):</h4><table><tr><td><a href="javascript:panTo(1);"><img src="images/iconHome.gif"></a></td><td>'+zip+'</td></tr></table>';
	}
	else
	{
	thisDiv.innerHTML = '<h4>Starting Address:</h4><table><tr><td><a href="javascript:panTo(1);"><img src="images/iconHome.gif"></a></td><td>'+street+','+city+', '+state+' '+zip+'</td></tr></table>';
	}
	 var thisDiv = document.getElementById('pharmacyList')
	 var divDiv = document.createElement("div");
	 divDiv.className="resultHeader";
	 divDiv.innerHTML = 'Participating Pharmacies Within a '+(radius-2)+' Mile Radius';
	 thisDiv.appendChild(divDiv);
  mapTest.GetPharmacyData(myPoint,street, city, state, zip,radius, GetPharmacyData_CallBack)
  document.getElementById('pharmacyResults').style.display ="block";
  }
 }
 
 
 var rows = 0;
 function GetPharmacyData_CallBack(res)
 {
 if (res.error != null)
 {
  //we should probably do better than this
  alert(res.error); 
  return;
}


var table = res.value.Tables[0];
mArray[0].lat = table.Rows[0].lat;
mArray[0].lon = table.Rows[0].lon;

rows = res.value.Tables[1].Rows.length;

 
 var table = res.value.Tables[1]
 var startCount = 2;
 
 for(i=0;i<rows;i++)
 {
 var Pharmacy = table.Rows[i].Pharmacy
 var Address = table.Rows[i].Address1
 Address = Address.trim();
 var City = table.Rows[i].City
 City = City.trim();
 var State = table.Rows[i].State
 var Zip  = table.Rows[i].Zip
 var Phone = table.Rows[i].Phone
 var ID = table.Rows[i].PharmacyID;
 var Distance = table.Rows[i].distance;
 var lat = table.Rows[i].lat;
 var lon = table.Rows[i].lon;
 
 if(Distance <= document.getElementById('selectRadius').options[document.getElementById('selectRadius').selectedIndex].value) {	setObject(i+1, Pharmacy, Address, City,State,Zip,Phone, lat, lon, Distance)
 	startCount++;
 }
 }
setList();
 }
 
 function setResults(table,startCount,Pharmacy,Address,City,State,Zip,Phone,Distance, ID)
 {	
 	if(Phone && Phone.length >= 10)
	{
	area = Phone.substr(0,3);
	ex = Phone.substr(3,3);
	pnum = Phone.substr(6,4);
	
	Phone = '('+area+') '+ex+'-'+pnum;
	}
 	//var thisDiv = document.getElementById('pharmacyList')
	
	var tableBody = document.createElement('TBODY');
	tableBody.setAttribute('id',startCount+'_Row');
	
	var tableRow = document.createElement("tr");
	var toAddress = escape(Address+","+City+" "+State);
	
	if(startCount%2==1) 
	{
		tableRow.className = 'pharmacyRow';
	}
	else
	{
		tableRow.className = 'pharmacyRowEven';	
	}
	
	
	tableCell = document.createElement('TD');
	tableCell.innerHTML = Pharmacy;
	tableRow.appendChild(tableCell);
	
	tableCell = document.createElement('TD');
	tableCell.innerHTML = Address + '<br />' + City + ',' + State + ' ' + Zip;
	tableRow.appendChild(tableCell);
	
	tableCell = document.createElement('TD');
	tableCell.innerHTML = Phone;
	tableRow.appendChild(tableCell);
	
	tableCell = document.createElement('TD');
	tableCell.innerHTML = formatCurrency(Distance)+' miles';
	tableRow.appendChild(tableCell);
	
	tableCell = document.createElement('TD');
	tableCell.innerHTML = '<a href="javascript:loadMap('+ID+')"><img src="images/iconMap.gif" /></a>';
	tableRow.appendChild(tableCell);
	
	tableBody.appendChild(tableRow)
	
	table.appendChild(tableBody);
 }
 
 //modified for single scrolling table
 

 function setObject(num, name, address, city,state,zip,phone, lat, lon,Distance)
 {
 	var mObj = new mapObj;
	var GeoPoint = address+", "+city+" "+state+" "+zip;
	mObj.geoPoint = GeoPoint;
	mObj.ID = num;
	mObj.lat = lat;
	mObj.lon = lon;
	mObj.Pharmacy = name;
	mObj.Address = address;
	mObj.toAddress = GeoPoint;
	mObj.City = city;
	mObj.State = state;
	mObj.Zip = zip;
	mObj.Phone = phone;
	mObj.distance = Distance;
	mArray.push(mObj); 
 }
 

 // map controls
 
 function loadMap(ID)
 {
	 map.removeMarkersAll();
	 for(j=1;j<mArray.length;j++)
	 {
	 if(mArray[j].ID == ID)
	 {
	
		map.addZoomLong();
 	 // Display the map centered on a latitude and longitude
 	 	map.drawZoomAndCenter(mArray[j].geoPoint, 6);

		mArray[j].marker = createYahooMarker(mArray[j]);
   	 	map.addOverlay(mArray[j].marker);
		
		mArray[0].marker = createYahooMarker(mArray[0]);
   	 	map.addOverlay(mArray[0].marker);
		
		var mapHeader = document.getElementById('mapHeader');
		mapHeader.innerHTML = mArray[j].Pharmacy;
		
		var mapBottom = document.getElementById('mapBottom');
		mapBottom.innerHTML = mArray[j].textRow;
		
		var mapLayer = document.getElementById('mapOutside');
		
		var browserWidth = YAHOO.util.Dom.getClientWidth();
	if(browserWidth <= 800)
	{
	mapLayer.style.top = 20+"px";
	mapLayer.style.left = 20+"px";
	}
	else
	{
	mapLayer.style.top = 150+"px";
    mapLayer.style.left = 150+"px";	
	}
		
		if(!useFull)
		{
			if (window.innerHeight)
			{
		  		pos = window.pageYOffset
			}
			else if (document.documentElement && document.documentElement.scrollTop)
			{
				pos = document.documentElement.scrollTop
			}
			else if (document.body)
			{
			  pos = document.body.scrollTop
			}
			
			mapLayer.style.top = pos+parseInt(mapLayer.style.top) + "px";
		}
		
		
		mapLayer.style.display = 'block';
		
		var hitCheck = checkIntersect();
		if(hitCheck == "hit") document.getElementById('locateForm').style.visibility = 'hidden';
	 }
	 }
 }
 
 function hideMap()
 {
	var mapLayer = document.getElementById('mapOutside');
	mapLayer.style.display = 'none';
	var locateForm = document.getElementById('locateForm');
	locateForm.style.visibility = 'visible';
 }
 
 function beingDragged(div)
 {
	div.className = 'mapDrag'; 
 }
 
 function notDragged(div)
 {
	div.className = 'mapBase'; 
 }
 
 function checkIntersect()
 {
	var locateForm = document.getElementById('locateForm');
	var mapOutside = document.getElementById('mapOutside');

	var formTop = YAHOO.util.Dom.getY('locateForm');
	var formLeft = YAHOO.util.Dom.getX('locateForm');
	var formBottom = locateForm.clientHeight;
	var formBottom = parseInt(formBottom) + parseInt(formTop);
	var formRight = locateForm.clientWidth;
	var formRight = parseInt(formRight) + parseInt(formLeft);
	
	
	var mapTop = YAHOO.util.Dom.getY('mapOutside');
	var mapLeft = YAHOO.util.Dom.getX('mapOutside');
	var mapBottom = mapOutside.clientHeight;
	var mapBottom = parseInt(formBottom) + parseInt(mapTop);
	var mapRight = mapOutside.clientWidth;
	var mapRight = parseInt(formRight) + parseInt(mapLeft);
	
	if(mapTop < formBottom && mapLeft < formRight) return 'hit';

 }