
	var cal1; 
	var cal2;
	

	function fromYYYYMMDDtoMMDDYYYY(dat) {
		if (!dat)
			return null;
		var findData = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
		var matches = dat.match(findData);
		return matches[2]+'/'+matches[3]+'/'+matches[1];
	}	
	
	function monthYearFromYYYYMMDD(dat){
		if (!dat)
			return null;
		var findData = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
		var matches = dat.match(findData);
		return parseFloat(matches[2])+'/'+matches[1];
	}

	function calInit() {
		if (!cal1) {
			var startD = fromYYYYMMDDtoMMDDYYYY(a_startdate);
			var endD = fromYYYYMMDDtoMMDDYYYY(a_enddate);
			
			
			cal1 = new YAHOO.widget.Calendar("cal1","calendarContainer1", monthYearFromYYYYMMDD(a_startdate), startD); 
			cal2 = new YAHOO.widget.Calendar("cal2","calendarContainer2", monthYearFromYYYYMMDD(a_enddate), endD);
			cal1.render(); 
			cal2.render();
		}
			
		document.getElementById('containerForCalendars').style.display = 'block';
	} 
	function calCancel() {
		calClose();
	}
	function calSelect() {
		var startDate = null;
		var arrDates = cal1.getSelectedDates();
		for (var i = 0; i < arrDates.length; ++i) {
			startDate = arrDates[i];
		}
		if (startDate == null) {
			alert(t('Please select a "From" date'));
			return false;
		}

		var endDate = null;
		arrDates = cal2.getSelectedDates();
		for (var i = 0; i < arrDates.length; ++i) {
			endDate = arrDates[i];
		}
		if (endDate == null) {
			alert(t('Please select a "To" date'));
			return false;
		}

		if (endDate < startDate) {
			alert(t('The "From" date should be before the "To" date'));
			return false;
		}

		//remove restrictions on map panning
		a_mapid=null;
		a_crimeid=null;

		clearAllSelectedPeriods(); // clears the preset date ranges (like 'last 30 days')
		document.getElementById('custom_date_start').value = startDate.getFullYear() + '-' + (startDate.getMonth() + 1) + '-' + startDate.getDate();
		document.getElementById('custom_date_end').value = endDate.getFullYear() + '-' + (endDate.getMonth() + 1) + '-' + endDate.getDate();
		calClose();
		loadMap();
	}
	function clearCustomDates() {
		document.getElementById('custom_date_start').value = '';
		document.getElementById('custom_date_end').value = '';
	}
	function calClose() {
		document.getElementById('containerForCalendars').style.display = 'none';
	}
	
	function toggleCrimeTypes() {
		var crimeTypeImg = document.getElementById('crimeTypeToggleBtn');
		var crimeTypeWrap = document.getElementById('crimeTypeFilterWrapper');
		var districtImg = document.getElementById('districtToggleBtn');
		var districtWrap = document.getElementById('districtFilterWrapper');
		toggleWindow(crimeTypeImg, crimeTypeWrap, districtImg, districtWrap);
	}

	function toggleWindow(onImg, onWrap, offImg, offWrap) {
		if (offWrap)
			offWrap.style.display = 'none';
		if (offImg)
			offImg.src = offImg.src.replace(/open/, "closed");
		if (onWrap.style.display == 'none' || onImg.src.match(/closed/)) {
			onWrap.style.display = 'block';
			onImg.src = onImg.src.replace(/closed/, "open");
			return 'on';
		} else {
			onWrap.style.display = 'none';
			onImg.src = onImg.src.replace(/open/, "closed");
			return 'off';
		}
	}
	function toggleDistrict(img) {
		var crimeTypeImg = document.getElementById('crimeTypeToggleBtn');
		var crimeTypeWrap = document.getElementById('crimeTypeFilterWrapper');
		var districtImg = document.getElementById('districtToggleBtn');
		var districtWrap = document.getElementById('districtFilterWrapper');
		toggleWindow(districtImg, districtWrap, crimeTypeImg, crimeTypeWrap) ;
	}

	function toggleTypes(type) {
		var curImg = document.getElementById(type+'ToggleBtn');
		var curWrap = document.getElementById(type+'FilterWrapper');
		if(type=='area')type='crimeType';
		else type='area';
		var prevImg = document.getElementById(type+'ToggleBtn');
		var prevWrap = document.getElementById(type+'FilterWrapper');
		return toggleWindow(curImg, curWrap, prevImg, prevWrap);
	}

	var resultsWidth = 0;
	var hideShowMapText = '';
	function toggleMapVisibility(obj) {
		var map = document.getElementById('map');
		var largeMap = document.getElementById('largeMap');
		var tabsAndResults = document.getElementById('tabsAndResults');
		if (map.style.display == 'none') {
			map.style.display = 'block';
			obj.innerHTML = hideShowMapText;
			if (largeMap) {
				tabsAndResults.style.width = resultsWidth;
			} else {
				tabsAndResults.style.display = 'none';
			}
		} else {
			map.style.display = 'none';
			resultsWidth = tabsAndResults.style.width;
			hideShowMapText = obj.innerHTML;
			obj.innerHTML = t('Show Map');
			var mapWidth = map.style.width;
			tabsAndResults.style.width = (parseInt(mapWidth))+"px";
			tabsAndResults.style.display = 'block'; 
		}
		// map searchResults
	}

	function toggleBullseye(span) {
		if (span.className.match(/filterItemSelected/)) {
			span.className = span.className.replace(/filterItemSelected/, 'filterItem');
			showBullseye = false;
			clearPolyOverlays();
		} else {
			span.className = span.className.replace(/filterItem/, 'filterItemSelected');
			showBullseye = true;
			drawCircles();
		}
	}

	function toggleFilterPeriod(periodSpan)	{
		
		//remove restrictions on map panning
		a_mapid=null;
		a_crimeid=null;

		var siblingsAndMe = periodSpan.parentNode.getElementsByTagName('SPAN');
		for (var i = 0; i < siblingsAndMe.length; i++) {
			// if this is changed to something like : siblingsAndMe[i].setAttribute('class', ...
			// then you need to do setAttribute('className' ...  for IE, but just setAttribute('class' .. for other browsers.
			// rather than have two lines of code, i took out the call to setAttribute and just set the className directly.
			siblingsAndMe[i].className = 'filterItem'+(siblingsAndMe[i] == periodSpan ? 'Selected':'');
		}
		document.getElementById('dayrange').value = periodSpan.innerHTML;
		clearCustomDates();
		//loadMap();
		getDataForNewFilter();
	}
	
	/*
	function clearAllSelectedPeriods() { // this function was moved to calendar.js
	} // */
	
	
										
	function toggleResultsView(view) {
		var mytab = document.getElementById('searchResults'+view.getAttribute("CR:value"));
		if (mytab.getAttribute('hasResults') == 'false' || mytab.getAttribute('outofarea')=='true')
			return;
		var siblingsAndMe = view.parentNode.getElementsByTagName('SPAN');
		for (var i = 0; i < siblingsAndMe.length; i++) {
			var tab = document.getElementById('searchResults'+siblingsAndMe[i].getAttribute("CR:value"));
			if (tab != mytab) {
				tab.style.display = 'none';
			} else {
				tab.style.display = 'block';
			}
			var attr = tab.getAttribute('hasResults');
			if (attr=='false') continue;
			siblingsAndMe[i].className = 'filterItem'+(siblingsAndMe[i] == view ? 'Selected':'');
		}
	}

	function updateResultsTabs() {
		
		if(!document.getElementById('resultsTabs')){
			return;
		}
		
		var firstDisplaySet = false;
		var views = document.getElementById('resultsTabs').getElementsByTagName('SPAN');
		for (var i=0; i< views.length; i++) {
			tab = document.getElementById('searchResults'+views[i].getAttribute("CR:value"));
			tab.setAttribute("hasResults", tab.innerHTML.replace(/\s*/g,'')==''?"false":"true");
			if (tab.getAttribute("hasResults")=='false') {
				tab.style.display = 'none';
				views[i].className = "filterItemDisabled";
			} else {
				if (!firstDisplaySet) {
					firstDisplaySet = true;
					tab.style.display = 'block';
					views[i].className = "filterItemSelected";
				} else {
					tab.style.display = 'none';
					views[i].className = "filterItem";
				}
			}
			if (tab.getAttribute("outofarea")=='true') {
				views[i].className = 'filterItemDisabled';
			}
		}
	}
	


	function toggleSort(listSort)	{
		var siblingsAndMe = listSort.parentNode.getElementsByTagName('SPAN');
		for (var i = 0; i < siblingsAndMe.length; i++) {
			// if this is changed to something like : siblingsAndMe[i].setAttribute('class', ...
			// then you need to do setAttribute('className' ...  for IE, but just setAttribute('class' .. for other browsers.
			// rather than have two lines of code, i took out the call to setAttribute and just set the className directly.
			siblingsAndMe[i].className = 'filterItem'+(siblingsAndMe[i] == listSort ? 'Selected':'');
		}
		crimeSortBy = listSort.getAttribute("CR:value");
		//loadMap();
		loadCrimeList(crimelistXMLArray);
	}
	

	function setupPeriodFilters() {
		// setup period filters to work with whichever one is selected. 
		// (ie, this sets up the page to work with the default period.
		// the default period is stored in the js var named 'dayrange'
		var periodFilters = document.getElementById('periodFilters').getElementsByTagName('SPAN');
		for (var i = 0; i < periodFilters.length; i++) {
			if (periodFilters[i].innerHTML == dayrange) {
				periodFilters[i].className = "filterItemSelected";
				document.getElementById('dayrange').setAttribute('value', periodFilters[i].innerHTML);
			}
		}

		if (!dayrange) {
			try {
				doShowCustomDateRange(a_startdate, a_enddate);
			} catch(e) {}
		}
	}



	function selectCrimeSpan(span, select) {
		var crimeId = span.id.match(/\d+/)[0];
		if (select) {
			span.className = 'filterItemSelected';
			from_array = hidden_categories;
			to_array = displayed_categories;
		} else {
			span.className = 'filterItem';
			from_array = displayed_categories;
			to_array = hidden_categories;
		}
		for (var i = 0; i < from_array.length; i++) {
			if (from_array[i].id == crimeId) {
				var category = from_array.splice(i, 1);
				try {
					to_array.push(category[0]);
				} catch (e) {
					to_array.push(category);
				}
				break;
			}
		}
	}

	function toggleSubCategory(i, j, force, prefix) {
		if (typeof(prefix) == 'undefined' || prefix === null) {
			prefix = '';
		} else {
			prefix = String(prefix);
		}
		
		var add = null;
		var ele = document.getElementById(prefix+'category_sub_'+i+'_'+j);
		if (!ele) { return; }
		var forced = false;
		if (typeof(force) != 'undefined' && force === '1' || force === '0') {
			forced = true;
		}
		if ((ele.className.match(/crimeTypeSubCheck/) && !forced) || (forced && (force === '0' || force === 0))) {
			ele.className = 'crimeTypeSub';
			window[prefix+'displayed_categories'][i][j] = false;
		} else {
			ele.className = 'crimeTypeSub crimeTypeSubCheck';
			window[prefix+'displayed_categories'][i][j] = true;
		}
		if (force !== '0' && force !== '1') {
			toggleMainCategory(i, true, '-1', prefix);
		}
	}

	function toggleOneMainCategory(id, prefix, doMain) { // like toggleMainCategory, but also turns all other main categories off
		if (typeof(prefix) == 'undefined' || prefix === null) {
			prefix = '';
		} else {
			prefix = String(prefix);
		}
		if (typeof(doMain)=='undefined')
			doMain = true;
		for (var i in window[prefix+'subcategories']) {
			if (i != id)
				toggleMainCategory(i, false, '0', prefix);
		}
		if (doMain)
			toggleMainCategory(id, false, '-1', prefix);
		if (prefix!='area_')
			getDataForNewFilter();
	}

	function toggleOneSubCategory(i, j, prefix) {
		toggleOneMainCategory(i, prefix, false);
		toggleSubCategory(i, j, null, prefix);
	}

	function toggleAllCrimeTypes(state, prefix) { //state can be '1' or '0'
		if (typeof(prefix) == 'undefined' || prefix === null) {
			prefix = '';
		} else {
			prefix = String(prefix);
		}
		for (var i in window[prefix+'subcategories']) {
			toggleMainCategory(i, false, state, prefix);
		}
		if (prefix!='area_')
			getDataForNewFilter();
	}

	function toggleMainCategory(i, verify, force, prefix) { // force can be undefined (ie, is optional) -- otherwise, needs to be '1' or '0'
		if (typeof(prefix) == 'undefined' || prefix === null) {
			prefix = '';
		} else {
			prefix = String(prefix);
		}
		if (typeof(force) == 'undefined') {
			force = '-1';
		}
		var ele = document.getElementById(prefix+'category_main_'+i);
		//if (!ele) alert('!ele: '+ prefix+'category_main_'+i);
		var checked = '0'; // 0 means no, 1 means yes, and 2 means partial
		if (force != '-1') {
			checked = force;
		} else if (verify) {
			var all = true;
			var any = false;
			for (var j in window[prefix+'subcategories'][i]) {
				if (!j.match(/^\d+$/)) {
					continue;
				}
				var subIsChecked = document.getElementById(prefix+'category_sub_'+i+'_'+j).className.match(/crimeTypeSubCheck/);
				all = all && subIsChecked;
				any = any || subIsChecked;
			}
			if (all) {
				checked = '1';
			} else if (any) {
				checked = '2';
			}
		} else {
			if (!ele.className.match(/crimeTypeMainCheck/) && !ele.className.match(/crimeTypeMainPartial/)) {
				checked = '1';
			}
		}
		if (prefix == 'area_') {
			shapefile_selected[i] = (checked == '1' || checked == '2');
		}
		if (checked == '1') {
			ele.className = 'crimeTypeMain crimeTypeMainCheck';
		} else if (checked == '2') {
			ele.className = 'crimeTypeMain crimeTypeMainPartial';
		} else {
			ele.className = 'crimeTypeMain';
		}
		if (!verify) {
			for (var j in window[prefix+'subcategories'][i]) {
				if (!j.match(/^\d+$/)) {
					continue;
				}
				toggleSubCategory(i, j, checked, prefix);
			}
		}
	
		if (force == '-1' && prefix!='area_')
			getDataForNewFilter();
	}

	function toggleFilterCrime(crimeSpanElement) { // usually, the arg passed in should be an element. however, there are two special
							// cases where it can be a string: either 'show_all' or 'hide_all'
		//remove restrictions on map panning
		a_mapid=null;
		a_crimeid=null;
					
		if (crimeSpanElement == 'show_all' || crimeSpanElement == 'hide_all') {
			var spans = document.getElementById('crimeFilters').getElementsByTagName('SPAN');
			for (var i = 0; i < spans.length; i++) {
				if(spans[i].id.indexOf('crime_filter')==0) { // just want to highlight the crime spans (ie, exclude the 'hide all' and 'show all' spans)
						selectCrimeSpan(spans[i], crimeSpanElement == 'show_all');
				}
			}
		} else {
			selectCrimeSpan(crimeSpanElement, crimeSpanElement.className == 'filterItem');
		}
		getDataForNewFilter();
	}
	
	function setFilterCrime(subCrime){
		
	}


	try {
		if(a_startdate!=null){
			document.getElementById('custom_date_start').value = a_startdate;
			document.getElementById('custom_date_end').value = a_enddate;
		}
	} catch (e) {}

	try {
		setupPeriodFilters();
	} catch (e) {}


