function indexJobs(xml) {
	for (var i = 0; i < jobs.length; i++) {
		addToIndex(jobs[i]);
	}
	if (debug) alert("Jobs: "+jobs.length);
}

function addToIndex(job) {
	var d = new LADDERS.search.document();
	d.add("id", job.id);
	d.add("title", job.title);
	d.add("city", job.city);
	d.add("region", job.region);
	d.add("country", job.country);
	d.add("duration", job.duration);
	d.add("category", job.categoryName);
	d.add("subcategory", job.subcategoryName);
	d.add("mission", job.mission);
	d.add("experience", job.experience);
	d.add("cash", job.cash);
	d.add("company", job.company);
	index.addDocument(d);
}


function drawMap() {
	if (!gmap) {
		gmap = new GMap2(document.getElementById("map"));

		var mt = gmap.getMapTypes();
		for (var i=0; i<mt.length; i++) {
			//mt[i].getMinimumResolution = function() {return 7;}
			mt[i].getMaximumResolution = function() {return 11;}
		}

		gmap.addControl(new GLargeMapControl());
		//gmap.addControl(new GSmallMapControl());
		gmap.addControl(new GMapTypeControl());
		//gmap.addControl(new GScaleControl());
		gmap.setCenter(new GLatLng(43, -94), 4);
		// overview
		//gmap.addControl(new GOverviewMapControl(new GSize(200,200)));

		var baseIcon = new GIcon();
        baseIcon.iconSize=new GSize(32,32);
        baseIcon.shadowSize=new GSize(56,32);
        baseIcon.iconAnchor=new GPoint(16,32);
        baseIcon.infoWindowAnchor=new GPoint(16,0);
    	//icon = new GIcon(baseIcon, "http://maps.google.com/mapfiles/kml/pal3/icon21.png", null, "http://maps.google.com/mapfiles/kml/pal3/icon21s.png");
    	//icon = new GIcon(baseIcon, "jobmap/pin.png", null, "jobmap/pin_shadow.png");
	}
	else {
		gmap.clearOverlays();
		markers = new Array();
		sideBar = "";
	}

	var bounds = new GLatLngBounds();
	var markerCount = 0;
	// text search
	var queryHits = executeQuery();
	//alert(queryHits);
	for (var jobCount = 0; jobCount < jobs.length; jobCount++) {
		if (includeJob(jobs[jobCount], queryHits)) {
			var point = new GLatLng(parseFloat(jobs[jobCount].lat), parseFloat(jobs[jobCount].lng));
			bounds.extend(point);
			//alert(point);
			var marker = createMarker(point, jobCount, markerCount);
			markers.push(marker);
			gmap.addOverlay(marker);
			markerCount++;
		}
	}
	document.getElementById("side_bar").innerHTML = sideBar;
	if (!bounds.isEmpty()) {
		centerAndZoomMap(bounds);
	}
	else {
		document.getElementById("side_bar").innerHTML = "No jobs fit this selection criteria.";
	}
}

function executeQuery() {
	var query = document.getElementById("jsKeywords").value;
	if (query != null && query.length > 0 && query != 'Keywords') {
		var result = index.search(query);
		return result;
	}
	return null;
}

function createMarker(point, jobCount, markerCount) {
	var job = jobs[jobCount];
	var marker = new GMarker(point, icon);

	var page1 = "<div class='jobTitle'>" + job.title + "</div>"
		+"<div class='jobLocation'>"+job.city+", "+job.region+", "+job.country+" ("+job.id+")</div><br/>"
		+"<div><a style='color: blue;' href='jobDetails.jsp?id="+job.id+"' target='_blank'>more details</a></div>"
		;

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

	sideBar += '<li><a href="" onclick="showInfo('+markerCount+'); return false;">' + job.title + '</a></li>';
	return marker;
}

function showInfo(markerCount) {
	if (debug) alert("Clicked on job: "+markerCount);
	var marker = markers[markerCount];
	gmap.panTo(marker.getPoint());
	GEvent.trigger(marker,"click");
}

function includeJob(job, queryHits) {
	return includeJobByRegion(job) && includeJobByCategory(job) && includeJobByQueryHits(job, queryHits);
}

function includeJobByRegion(job) {
	var r = getSelectedValue("jsLocation").split("-");
	if (debug) alert("region="+r);
	// country always present, region - optional
	var country = null;
	var region = null;
	if (r.length >= 1) {
		country = r[0];
	}
	if (r.length == 2) {
		region = r[1];
	}
	// special case - separators, etc
	if (country == 0) {
		return true;
	}

	result = region != null ? job.regionId == region : job.countryId == country; 
	//alert("country="+country+", region="+region+" -> "+result);
	return result;
}

function includeJobByCategory(job) {
	var r = getSelectedValue("jsCategory").split("-");
	if (debug) alert("category="+r);
	// category always present, subcategory - optional
	var category = null;
	var subcategory = null;
	if (r.length >= 1) {
		category = r[0];
	}
	if (r.length == 2) {
		subcategory = r[1];
	}
	// special case - separators, etc
	if (category == 0) {
		return true;
	}

	result = subcategory != null ? job.subcategoryId == subcategory : job.categoryId == category; 
	return result;
}

function includeJobByQueryHits(job, queryHits) {
	if (queryHits == null) {
		return true;
	}
	for(var i = 0; i < queryHits.length; i++) {
	 	if (job.id == queryHits[i]) {
	 		return true;
	 	}
	}
	return false;
}

function centerAndZoomMap(bounds) {
	var center = bounds.getCenter();
	var newZoom = gmap.getBoundsZoomLevel(bounds);
	if (gmap.getZoom() != newZoom) {
		gmap.setCenter(center, newZoom);
	}
	else {
	    gmap.panTo(center);
	}
}

function getSelectedValue(name) {
	var s = document.getElementById(name);
	if (!s) {
		alert("Can't find ["+name+"]");
	}
	return s.options[s.selectedIndex].value;
}

function setSelectedValue(name, value) {
	var s = document.getElementById(name);
	if (!s) {
		alert("Can't find ["+name+"]");
	}
	for(var i = 0; i < s.options.length; i++) {
		if (s.options[i].value == value) {
			s.options[i].selected = true;
			break;		
		}
	}
}
