
var map;
var pin;
var pinarray;
var categoryarray;

//Map pin class
//Parameters:
//Street
//City
//Zip
//Suite # (can be left blank)
//Building Name
//Category ID
//Phone (optional)
//Image URL(optional)
function SolanoPin(Street, City, Zip, Suite, Name, CategoryNumber, Phone, ImageSrc, Lat, Long) {
	
	this.ImageSrc = ImageSrc;
	this.Phone = Phone;
	this.Street = ProperCase(Street);
	this.City = ProperCase(City);
	this.Zip = Zip;
	this.Suite = Suite;
	this.Name = ProperCase(Name);
	this.CategoryNumber = CategoryNumber;
	this.ID = 0;

	this.Lat = 0;
	if (Lat) {
		this.Lat = Lat;
	}

	this.Long = 0;
	if (Long) {
		this.Long = Long;
	}

	//Output title
	this.Title = function() {
		if (this.Name != "") {
			return this.Name;
		} else {
			return "";
		}
	}
	
	//Output formatted address
	this.Address = function() {
		var Output = "";
		if (this.Suite != "") {
			Output += this.Street + " #" + this.Suite + "<br>";
		} else {
			Output += this.Street + "<br>";
		}
		Output += this.City + ", CA";
		Output += " " + this.Zip;
		return Output;
	}
}

//Create map pins
function Initialize() {
	
	SetCategories();
	SetAddresses();
    StatusIndicators();

	//Default to county admin building
	function InitializeResponse() {
		setTimeout("LoadFromPinID(42)",1100); 
	}
	map = new VEMap("CountyMap");
	map.onLoadMap = InitializeResponse;
	map.LoadMap();

}

//Zoom in, and then draw pin
function DrawPin() {

	map.SetZoomLevel(16);

	//Create pin and open info box
	var S = new VEShape(VEShapeType.Pushpin, map.GetCenter());   
	S.SetTitle(pin.Title());
	
	//Check if showing phone # is required
	if (pin.Phone) {
		S.SetDescription("<b>Phone: </b>" + pin.Phone + "<br><b>Address:</b><br>" + pin.Address());
	} else {
		S.SetDescription(pin.Address());
	}

	S.SetCustomIcon("<img src='images/blinkpin.gif'/>"); 
	map.AddShape(S);
	map.ShowInfoBox(S);

	ClearLoadingStatus();

}

//Set link categories
//The category array offset is used for identifying where to categorize the links in "show all department links"
//Category ID = categoryarray offset
//Example: 0 = Agriculture
function SetCategories() {
	categoryarray = new Array();
	categoryarray[0] = "Agriculture";
	categoryarray[1] = "Airports";
	categoryarray[2] = "Government";
	categoryarray[3] = "Law";
	categoryarray[4] = "Child Support Services";
	categoryarray[5] = "Health & Social Services";
	categoryarray[6] = "Library";
	categoryarray[7] = "Schools";
	categoryarray[8] = "General Services";
}

//Create address pin objects
function SetAddresses() {
	var pn;
	var HTM = "";
	var Container;

	//Create pin objects (Alphabetical order, sorted by Service Location Name (eg Agricultural Commission))
	pinarray = new Array();

	//Example (with optional phone #)
	/* 
	pn = new SolanoPin("501 Texas Street","Fairfield","94533","","Agricultural Commission",0,"123-3456");
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("2510 Claybank Road","Fairfield","94533","","Animal Care Services",8,"123-3456");
	pn.ID = pinarray.length;
	pinarray.push(pn); /*
	
	//Example (no phone #)
	/* pn = new SolanoPin("501 Texas Street","Fairfield","94533","","Cooperative Extension",0);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 Texas St","Fairfield","94533","","Solano County Administrative Building",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("501 Texas Street","Fairfield","94533","","Weights & Measures",0);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("301 County Airport Road","Vacaville","95688","","Nut Tree Airport",1);
	pn.ID = pinarray.length;
	pinarray.push(pn); */

	pn = new SolanoPin("301 County Airport Road","VACAVILLE","95688","","Airport",1);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("2510 Claybank Road","FAIRFIELD","94533","","Animal Care Services",8);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","2700","Assessor-Recorder",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	
	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","2800","Auditor Controller",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","6500","Board of Supervisors",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);
	
	
	pn = new SolanoPin("501 TEXAS STREET","FAIRFIELD","94533","","Cooperative Extension",0);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("530 UNION AVENUE","FAIRFIELD","94533","100","Coroner",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","6500","County Administrator/Clerk of the Board",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);
	
	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","6600","County Counsel",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("400 Santa Clara Street","VALLEJO","94590","10","DCSS Vallejo Satellite Office",5);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("435 EXECUTIVE COURT NORTH","FAIRFIELD","94534","","Department of Child Support Services (DCSS)",	4);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 Texas St","FAIRFIELD","94533","3700","Department of Information Technology",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);
	
	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","4500","District Attorney",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("355 Tuolumne Street","Vallejo","94590","","Employment & Eligibility Services (H&SS)",5);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","6500","Equal Employment Opportunity",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("1150 KENTUCKY STREET","FAIRFIELD","94533","","FAIRFIELD CIVIC CENTER LIBRARY",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);


	pn = new SolanoPin("5050 BUSINESS CENTER DRIVE","FAIRFIELD","94533","","FAIRFIELD CORDELIA LIBRARY",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("475 Union Avenue","Fairfield","94533","","Family Violence Prevention",5);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("2300 Boynton Avenue","FAIRFIELD","94533","204","FIRST 5 SOLANO",5);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 Texas St.","FAIRFIELD","94533","2500","General Services",8);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("600 UNION AVENUE","FAIRFIELD","94533","","HALL OF JUSTICE",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("275 BECK AVENUE","FAIRFIELD","94533","","Health & Social Services",5);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","1800","Human Resources",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("505 SANTA CLARA ST","VALLEJO","94590","","JOHN F. KENNEDY LIBRARY",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("740 Beck Avenue","FAIRFIELD","94533","","Juvenile Hall",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("530 UNION AVENUE","FAIRFIELD","94533","","LAW & JUSTICE BUILDING",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("275 BECK AVENUE","FAIRFIELD","94533","","Mental Health (H&SS)",5);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("530 UNION AVENUE","FAIRFIELD","94533","100","Office of Emergency Services",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 Texas St.","FAIRFIELD","94533","2500","Parks",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("475 UNION AVE.","FAIRFIELD","94533","","Probation (Fairfield)",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("355 TUOLUMNE STREET","VALLEJO","94590","","Probation (Vallejo)",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS ST.","FAIRFIELD","94533","3500","Public Defender (Fairfield)",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("321 TUOLUMNE STREET","VALLEJO","94590","201","Public Defender (Vallejo)",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("275 Beck Avenue","FAIRFIELD","94533","","Public Guardian",5);
	pn.ID = pinarray.length;
	pinarray.push(pn);
	pn = new SolanoPin("275 Beck Avenue","FAIRFIELD","94533","","Public Health (H&SS)",	5);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","2700","Records",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 Texas Street","FAIRFIELD","94533","2600","Registrar of Voters",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","5500","Resource Management",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("44 SOUTH 2nd ST.","RIO VISTA","94571","","RIO VISTA LIBRARY",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","6700","Risk Management",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("530 Union Avenue","FAIRFIELD","94533","100","Sheriff's Office",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("321 Tuolumne Street","Vallejo","94590","","Sheriff's Office",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 Texas St","Fairfield","94533","","Solano County Administrative Building",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("600 UNION AVE.","FAIRFIELD","94533","","Solano County Law Library",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("321 TUOLUMNE ST","VALLEJO","94590","","SOLANO JUSTICE BUILDING",3);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("744 EMPIRE STREET","FAIRFIELD","94533","216","Solano LAFCo",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("1003 OAKWOOD AVE","VALLEJO","94591","","SPRINGSTOWNE LIBRARY",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("601 PINTAIL DRIVE","SUISUN CITY","94585","","SUISUN CITY LIBRARY",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("5100 BUSINESS CENTER DRIVE","FAIRFIELD","94534","","Superintendent of Schools",7);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","1900","Tax Collector",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","1900","Treasurer",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("1020 ULATIS DR.","VACAVILLE","95687","","VACAVILLE LIBRARY - CULTURAL CENTER",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("1 TOWN SQUARE PLAZA","VACAVILLE","95688","","VACAVILLE LIBRARY - TOWN SQUARE",6);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("401 AMADOR ST.","VALLEJO","94590","","Veterans Service Field Office",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("675 TEXAS STREET","FAIRFIELD","94533","4700","Veterans Service Office",2);
	pn.ID = pinarray.length;
	pinarray.push(pn);

	pn = new SolanoPin("501 Texas Street","FAIRFIELD","94533","","Weights & Measures",0);
	pn.ID = pinarray.length;
	pinarray.push(pn);
	

	//Loop through each pin
	for (var i=0; i<pinarray.length; i++) {

		//Generate drop down option
		pn = pinarray[i];
		document.mapform.departmentdropdown.options[i] = new Option(pn.Name,pn.ID);	
		
		//Generate categorized link
		HTM = "<br><a href='javascript:LoadFromLink(" + pn.ID + ")'>" + pn.Name + "</a>";
		Container = Get(pn.CategoryNumber);
		Container.innerHTML += HTM;

	}

	document.mapform.departmentdropdown.options[42].selected = true;	

}

function ProperCase(Str) {
	Str = ProperCase2(Str);
	Str = Str.replace("(fairfield)","(Fairfield)");
	Str = Str.replace("(vallejo)","(Vallejo)");
	Str = Str.replace("(h&ss)","(H&SS)");
	Str = Str.replace(" Of "," of ");
	Str = Str.replace("dcss","DCSS");
	Str = Str.replace("Dcss","DCSS");
	Str = Str.replace("\/clerk","\/Clerk");
	Str = Str.replace(" Lafco"," LAFCO");
	return Str;
}

//Propercase shortcut
function ProperCase2(s) {
	return s.toLowerCase().replace(/^(.)|\s(.)/g, 
	function($1) { return $1.toUpperCase(); });
}

//Load map from dropdown value
function SelectDropDown() {

	//Make link list invisible
	Get("categorized").style.display = "none";

	var DropDown = document.mapform.departmentdropdown;
	LoadFromPinID(DropDown.options[DropDown.options.selectedIndex].value);
}

//Load map from link
function LoadFromPinID(ID) {
	SetLoadingStatus("Loading Map...","");
	pin = pinarray[ID];
	BrowseToPin();
}

function LoadFromLink(ID) {
	
	//Hide links
	ToggleLinks();
	
	//Delete route
	map.DeleteRoute();

	//Flush directions
	Get("Directions").innerHTML = "";
	Get("Directions").style.display = "none";
	
	//Start map search
	SetLoadingStatus("Loading Map...","");
	pin = pinarray[ID];
	BrowseToPin();

}

//Find address, then draw pin
function BrowseToPin() {

	//Set from and to fields
	var Address = pin.Street + ", " + pin.City + ", CA"; 

	Get("from1").innerHTML = Address;
	Get("to2").innerHTML = Address;

	//Remove all pins
	map.DeleteAllShapes();

	//alert("test:" + pin.Lat);

	if (pin.Street.indexOf('675 Texas') > -1) {
		
		//map.SetCenter(new VELatLong(38.248182,-122.04125));

		//38.248195,-122.041234
		//map.SetCenter(new VELatLong(38.248195,-122.041234));
		//map.SetCenter(new VELatLong(38.248182,-122.04125));

		map.Find(null,pin.Street + "," + pin.City + ",CA"); 
		setTimeout("DrawPin()",1500);	

	} else {
	
		//Zoom to address, then call drawpin function
		try { 
			map.Find(null,pin.Street + "," + pin.City + ",CA"); 		
			setTimeout("DrawPin()",1500);	
		} catch(e) {  
			ClearLoadingStatus();
			alert(e.message); 
		}
	
	}

}

//Shorthand function for fetching js element
function Get(ElementName) {
	return document.getElementById(ElementName);
} 

//Show/Hide categorized address links
function ToggleLinks() {
	var T = Get("categorized");
	//var M = Get("CountyMap");

	//Hide links
	if (T.style.display == "") {
		T.style.display = "none";
		//M.style.display = "";

	//Show links
	} else {
		T.style.display = "";
		//M.style.display = "none";
	}
	
	//Hide info box
	map.HideInfoBox();

}

//Find map route
function MakeRoute(ButtonID) {
	var From;
	var To;
	var ProcessRoute = true;

	//Go button 1
	if (ButtonID == 1) {
		From = Get("from1").innerHTML;
		To = Get("to1").value;
		if (To == "") {
			ProcessRoute = false;
		}

	//Go button 2
	} else {
		From = Get("from2").value;
		To = Get("to2").innerHTML;
		if (From == "") {
			ProcessRoute = false;	
		}
	}	
	
	if (ProcessRoute == true) {

		SetLoadingStatus("Finding Map Route...");

		var options = new VERouteOptions();
		options.RouteCallback = RouteResponse;
		setTimeout("ClearLoadingStatus()",1200);
		map.GetDirections([From, To],options);

	} else {
		alert("No address was entered.");
	}
}

function RouteResponse(route){              
	var legs = route.RouteLegs; //Unroll route
	var turns = "<table border='0' width='100%'><tr><td><font face=arial>";
	turns += "<a href='javascript:ClipBoard()'><font size=2><b>Copy Directions to Clipboard</b></font></a><br>";
	turns += "<span id='clip'>";
	turns += "<b>Total distance: " + route.Distance.toFixed(1) + " mile(s)</b><br>"; 
	
	var numTurns = 0;           
	var leg = null;           
	
	//Parse route results           
	for(var i = 0; i < legs.length; i++){             
		leg = legs[i];            
		var turn = null; // The itinerary leg                                 
		for(var j = 0; j < leg.Itinerary.Items.length; j ++){                  
			turn = leg.Itinerary.Items[j];                 
			numTurns++;                  
			turns += numTurns + ". " + turn.Text + " (" + turn.Distance.toFixed(1) + " mi)<br>";               
		}            
	} 
	turns += "</span></font></td></tr></table>";

	//Show results
	Get("Directions").style.display = "";
	Get("Directions").innerHTML = turns;   
}

function ClipBoard(){

	var HTM = Get("clip").innerHTML;
	HTM = HTM.replace(/<BR>/g,"\n");
	HTM = HTM.replace("<B>","");
	HTM = HTM.replace("</B>","");

	Get("holdtext").innerText = HTM;
	Copied = Get("holdtext").createTextRange();
	Copied.execCommand("RemoveFormat");
	Copied.execCommand("Copy");

}

