var map;

var loadingMsgs = new Array("One moment please", "Un momento por favor", "Un moment s'il vous pla&icirc;t", "Un momento per favore", "Ein moment bitte")
var currLoadingMsg = 0;
var newsPanel;
var timePanel;

var whereFieldVisible;
var newsDeptFieldVisible;
var whenFieldVisible;
var timePanelPriorlyVisible;
var newsFrameVisible;

var newsItems = [];
var visiblePushpins = [];

var currNewsDeptFilter = 0;
var currWhenFilterStart = 0;
var currWhenFilterEnd = 1;
var currWhatFilter = [];

var nmbLoadedFiles;
var todayFullDate = new Date();
var todayDate = new Date(todayFullDate.getFullYear(), todayFullDate.getMonth(), todayFullDate.getDate());
var milliTimezoneOffset = todayFullDate.getTimezoneOffset() * 60 * 1000;
var oneday = 1000*60*60*24;
// http://rtfm.atrax.co.uk/articles/article_13.asp
Array.prototype.intersection = function(arr2)  { 
	var returnArray = new Array(); var y = 0; 
	for(var x=0;x<this.length;x++)  { 
	if(arr2.contains(this[x]))  { 
	  returnArray[y++] = this[x]; 
	}}
	return y==0?null:returnArray; 
} 

Array.prototype.contains = function(r)  { 
	for(var x=0;x<this.length;x++)  { 
	if(this[x]==r)  { 
	  return true; 
	}}
	return false; 
} 

function geocode(e) {
 var key = e.which || e.keyCode;
 if(key == 13) {
  var where = document.getElementById('whereField');
  if (where.value != '' && where.value != '[Current map view]')
   whereFilter(where.value);
 }
}

function WebSearch(form) {
	where = '';
	if (form.whereField.value && form.whereField.value != '[Current map view]')
		where = '&w=' + form.whereField.value;
	//window.open('http://search.msn.com/local/results.aspx?q='+form.whatField.value+where+'&t=w&qcs=1')
	window.open('http://search.live.com/results.aspx?q='+ form.whereField.value);
}
var lastWhat = '';
function Search() {
	var what = document.getElementById('whatField');
	var bRefreshed = false;
	
	if(lastWhat != what.value)
	{
		lastWhat = what.value;
	
		if (what.value != '') {
			whatFilter(what.value);
			bRefreshed = true;
		}
		else if (what.value == '') {
			currWhatFilter = [];		
		}
	}

//	var where = document.getElementById('whereField');
//	if (where.value != '' && where.value != '[Current map view]') {
//		whereFilter(where.value);
//		bRefreshed = true;
//	}
	if (!bRefreshed) {
		setReminders();
		showNews();
	}

	return false;
}

function whereFilter(where) {
 map.FindLocation(where);
 showNews();
setReminders();

}

var sentOutKeywords;
var gottenBackKeywords;

function whatFilter(what) {
	var keywords = what.split(' ');

	sentOutKeywords = gottenBackKeywords = 0;

	currWhatFilter = [];

	for(var i=0; i<keywords.length; i++)
	{
		if(!(keywords[i] && keywords[i].length && keywords[i].length > 0))
			continue;
		
		// *****************
		// check sanity of keyword
		// preg 0-9a-zA-Z\.\-'
		
		sentOutKeywords++;
		loadSearchFile(keywords[i]);
	}
}

function loadSearchFile(keyword)
{
	var request = GetXmlHttp();
	
	request.open("GET", 'search/'+keyword+'.js');
	request.onreadystatechange = function() {
		if (request.readyState == 4)
		{
			sentOutKeywords--;
			
			if(request.status == 404)
			{
				alert(keyword + ' not found');

				if(sentOutKeywords == 0 && gottenBackKeywords == 0)
				{
					// this is the last keyword to come back: none of them successful
					
					resetWhat();
					showNews();
					setReminders();
				}

				return;
			}

			gottenBackKeywords++;
			
			try {
				var whatArray = eval(request.responseText);
			} catch(e) {
			}


			if (whatArray)
			{
				if(currWhatFilter.length > 0)
				{
					// array_intersect would give us 'keyword search' result
					currWhatFilter = currWhatFilter.intersection(whatArray);
				}
				else
				{
					// contact gives us all news containing any term
					currWhatFilter = currWhatFilter.concat(whatArray);
				}
			}

			if(sentOutKeywords == 0 && !(currWhatFilter && currWhatFilter.length && currWhatFilter.length > 0))
			{				
				// after parsing all keywords, we came upon the conclusion that the seach was too restrictive

				alert('Search is too restrictive - no results found');

				resetWhat();
				currWhatFilter = [];
			}

			showNews();
			setReminders();
		}
	};		
	request.send(null);	
}

function whenFilter(selectInput)
{
	if(selectInput.value != -1 && selectInput.value != 'adv')
	{
		document.getElementById('loadingDiv').innerHTML = loadingMsgs[currLoadingMsg++ % loadingMsgs.length];
		document.getElementById('loadingDiv').style.left = GetWindowWidth() / 2;
		document.getElementById('loadingDiv').style.top = GetWindowHeight() / 2;
		document.getElementById('loadingDiv').style.display = 'block';

		timePanelPriorlyVisible = false;
		if(timePanel)
			timePanel.Hide();
		
		setReminders();
		
		var whenFilter = selectInput.value.split('_');
		currWhenFilterStart = whenFilter[0] ;
		currWhenFilterEnd = whenFilter[1];

		setTimeout('showNews()', 50);
	}
	else if(selectInput.value == 'adv')
	{		
		ShowTimePanel();
		initSlider();
		replaceTimePanel();
		
		// *****************************
		// deal with initial currWhenFilterStart, currWhenFilterEnd
		// probably best to look at present config, and set slider from there, as much as possible
		// (i.e. if slider doesn't support news during last month, etc.)
	}
}

function newsDeptFilter(selectInput)
{
	if(selectInput.value != -1)
	{
		document.getElementById('loadingDiv').innerHTML = loadingMsgs[currLoadingMsg++ % loadingMsgs.length];
		document.getElementById('loadingDiv').style.left = GetWindowWidth() / 2;
		document.getElementById('loadingDiv').style.top = GetWindowHeight() / 2;
		document.getElementById('loadingDiv').style.display = 'block';
		
		setReminders();
		currNewsDeptFilter = selectInput.value;
		
		setTimeout('showNews()', 50);
	}
}

function setReminders()
{
	var newsDeptSelect = document.getElementById('newsDeptSelect');

	if(newsDeptSelect.value != -1)
		document.getElementById('newsDeptReminder').innerHTML = newsDeptSelect.options[newsDeptSelect.selectedIndex].text;


	var whenSelect = document.getElementById('whenSelect');

	if(whenSelect.value != -1 && whenSelect.value != 'adv')
		document.getElementById('whenReminder').innerHTML = whenSelect.options[whenSelect.selectedIndex].text;
		
	
	setWhereReminder();
	

	var whatField = document.getElementById('whatField');
	
	if(whatField.value != '')
	{
		document.getElementById('whatReminder').innerHTML = whatField.value;
		document.getElementById('whatReminder').style.color = "#000";
	}
	else
	{
		document.getElementById('whatReminder').innerHTML = 'Everything';
		document.getElementById('whatReminder').style.color = "#aaa";
	}
}

function setWhereReminder()
{
	var whereField = document.getElementById('whereField');

/*	if(whereField.value != '' && whereField.value != '[Current map view]')
	{
		document.getElementById('whereReminder').style.color = "#000";
		document.getElementById('whereReminder').innerHTML = 'Items around ' + whereField.value + '<br>';
	}
	else
*/	
		if(currWhatFilter.length > 0)
		{
			document.getElementById('whereReminder').style.color = "#f33";
			document.getElementById('whereReminder').innerHTML = 'All search results &bull; <a href="#" onClick="clearSearch()">clear</a><br>';
		}
		else
		{
			document.getElementById('whereReminder').style.color = "#33f";
			document.getElementById('whereReminder').innerHTML = 'Items in current map view<br>';
		}

}

function clearSearch()
{
	resetWhat();
	currWhatFilter = [];
	setReminders();
	showNews();
}

var newsDirectory = [];
var pendingNewsFiles = [];
function loadNews() {
	document.getElementById('loadingDiv').innerHTML = "Loading news...";
	document.getElementById('loadingDiv').style.left = GetWindowWidth() / 2;
	document.getElementById('loadingDiv').style.top = GetWindowHeight() / 2;
	document.getElementById('loadingDiv').style.display = 'block';
	
	var request = GetXmlHttp();
	for(var i=0; i<10; i++)
	{
		pendingNewsFiles[i] = true;
		loadFile("data/news." + i + ".js", i);
	}
}

function newsSort(a,b) {
	return b[5] - a[5];
}

var filesLoaded = [];
function loadFile(url, i)
{
	if (filesLoaded[url]) return;
	filesLoaded[url] = true;
	var request = GetXmlHttp();
	request.open("GET", url);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			pendingNewsFiles[i] = false;
			if (!request.responseText) return;
			var result = eval(request.responseText);
			result.pop();
			newsItems = newsItems.concat(result);
			if (!in_array(true, pendingNewsFiles)) {
				newsItems.sort(newsSort);
				document.getElementById('loadingDiv').style.display = 'none';		
				showNews();				
			}
		}
	};
	request.send(null);
}

function getNews(id)
{
	for(var i=0; i < newsItems.length; i++)
	{
		if(newsItems[i][0] == id)
			return newsItems[i];
	}
	return [];
}

var currentMoreNewsHash = null;
function displayMoreNews(hashKey, iStart) {
	closeNewsHint();

	currentMoreNewsHash = hashKey;
	var hintData = '<table width="100%" height="100%" cellpadding=1 border=0 style="background: white;"><tr height=100><td style="vertical-align: top">';
	var nbPages = 1;
	var iEnd;
	iStart = iStart != undefined ? iStart : 0;
	for(var i=iStart; i<locationHash[hashKey].length; i++) {
		if ((i ) % 5 == 0) {
			//if (iStart != 0 && nbPages == 2)
			//		hintData += '<a href="#" class=moreNewsPrevNext onclick="displayMoreNews(\''+hashKey+'\','+(iStart-10)+');"><b>&lt;&lt;Previous page</b></a>';
			
			if (nbPages >= 3) {
//				hintData += '<a href="#" class=moreNewsPrevNext onclick="displayMoreNews(\''+hashKey+'\','+i+');"><b>Next page &gt;&gt;</b></a>';
				iEnd = i;
				break;
			}
			if (nbPages != 1)
				hintData += '</td><td style="vertical-align: top">';
			nbPages++;
		}
		hintData += '<span style="font-size: 12px">&bull;</span> <a href="#" class=moreNews onclick="displayNews('+locationHash[hashKey][i]+');colorAsRead('+hashKey+');">'+getNews(locationHash[hashKey][i])[1]  +'</a><br>';
	}
	
	if(nbPages == 2)
		hintData += '</td><td>&nbsp;';
	
	hintData += '</td></tr>';
	

	if((iStart && iStart > 0) || (i < locationHash[hashKey].length && iEnd))
	{
		hintData += '<tr><td>';
	
		if(iStart && iStart > 0)
			hintData += '<a href="#" class=moreNewsPrevNext onclick="displayMoreNews(\''+hashKey+'\','+(iStart-10)+');"><b>&lt;&lt; Previous page</b></a>';
		else
			hintData += '&nbsp;';
	
		hintData += '</td><td>';
	
		if(i < locationHash[hashKey].length && iEnd)
			hintData += '<a href="#" class=moreNewsPrevNext onclick="displayMoreNews(\''+hashKey+'\','+iEnd+');"><b>Next page &gt;&gt;</b></a>';
		else
			hintData += '&nbsp;';
	
		hintData += '</td></tr>';
	}	

	hintData += '</table>';
	var d = document.getElementById('moreNewsDiv');
	d.innerHTML = hintData;

	var d = document.getElementById('moreNewsLocation');
	d.innerHTML = getNews(locationHash[hashKey][0])[6];

	var d= document.getElementById('newsHintContainer');
	d.style.display = 'block';
//	d.style.height = map.height / 3 + 'px';
	d.style.top = Math.ceil((GetWindowHeight() / 2) - ($('map').offsetHeight / 6));
	d.style.width = ($('map').offsetWidth - 220) / 1.5 + 'px';
	d.style.height = '130px';
	d.style.left = (GetWindowWidth() / 2) - (parseInt(d.style.width) / 2) + 'px';
}

function closeMoreNews() {
	document.getElementById('newsHintContainer').style.display = 'none';

	if(currentMoreNewsHash)
	{
		var d = document.getElementById('newsPin_'+currentMoreNewsHash);
		if (d)
		{
			if(coloredAsRead[currentMoreNewsHash])
			{
				d.getElementsByTagName('img')[0].src='images/mini-read.gif';
			}
		}
	}

	currentMoreNewsHash = null;
}

var currentHint = null;
var currentHintId = null;
var currentHintTimeout = null;
function showNewsHint(hashKey, id, bShowAll)
{
	if (!document.getElementById('newsPin_'+hashKey)) return;

	// if we opened the moreNews div, moving around the map and having hints popup is not helpful
	if (document.getElementById('newsHintContainer').style.display == "block") return;
//	closeMoreNews();

	if(currentHintTimeout)
		clearTimeout(currentHintTimeout);
	
	if(currentHint == hashKey && currentHintId == id) return;

	closeNewsHint();
	var hint = document.getElementById('pushPinHint');
	if(hint.style.display == 'block')
		return;

	hint.onmouseover = function () { 
		if(currentHintTimeout)
			clearTimeout(currentHintTimeout);
		};
	hint.onmouseout = function () { delayedHintClose(); };
	
	//moveHintToBorder(hint, parseInt(document.getElementById('newsPin_'+hashKey).offsetTop), parseInt(document.getElementById('newsPin_'+hashKey).offsetLeft) + 14);
	moveHintToBorder(hint, $('newsPin_' + hashKey));	
	document.getElementById('newsPin_'+hashKey).getElementsByTagName('img')[0].src='images/mini-on.gif';
	var hintData = ''
	if (!id)
	{
		hintData += '<p class="newsLocation">'+getNews(locationHash[hashKey][0])[6]+'</p>';
		
		for(var i=0; i<locationHash[hashKey].length && (i < 3 || bShowAll); i++)
		{
		 	hintData += '<p class="news">';
		 	
		 	hintData += '<a href="#" onclick="displayNews('+locationHash[hashKey][i]+');colorAsRead('+hashKey+');">'+getNews(locationHash[hashKey][i])[1]  +'</a></p>';
		 }
	}
	else
	{
		hintData += '<p class="newsLocation">'+getNews(id)[6]+'</p>';
		hintData += '<p class="news"><a href="#" onclick="displayNews('+id+');colorAsRead('+hashKey+');">'+getNews(id)[1]  +'</a></p>';
	}

	if (locationHash[hashKey].length > 3 && !bShowAll)
		hintData += '<p style="font-size: xx-small; text-align: right; margin: 0 0 0 0;">... <a href="#" onclick="displayMoreNews(\''+hashKey+'\')">more news</a> at this location</p>';
	hint.innerHTML = hintData;
//	document.getElementById('pushPinHint').innerHTML = 'article '+id;

	hint.style.padding = 3;
//	document.getElementById('pushPinHint').style.height = 30;
//	hint.style.width = 250;
	hint.style.height = (locationHash[hashKey].length * 26 ) + 20 + "px";
	hint.style.display = 'block';
	currentHint = hashKey;
	currentHintId = id;
}

function moveHintToBorder(hint, pin) {
 Position.clone(pin, hint);
 hint.style.left = parseInt(hint.style.left) + 14;
 hint.style.width = '250px';
}

/*function moveHintToBorder(hint, y, x)
{
	var agt=navigator.userAgent.toLowerCase();
	var is_gecko = (agt.indexOf('gecko') != -1);
	var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));

	var divX = parseInt(x);
	var divY = parseInt(y);
	var divW = parseInt(hint.style.width);
	var divH = parseInt(hint.style.height);

	if(is_ie)
	{
		var screenW = document.body.clientWidth;
		var screenH = document.body.clientHeight;
	}
	else if(is_gecko)
	{
		var screenW = window.innerWidth;
		var screenH = window.innerHeight - 20;
	}
//	if(divW + divX > screenW + $('map').offsetLeft)
//		divX = screenW - divW - 5;
	
//	if(divH + divY + 50 > screenH + $('map').offsetTop)
//		divY = screenH - divH - 50;

	hint.style.top = divY + 'px';
	hint.style.left = divX + 'px';
}*/

function delayedHintClose()
{
	currentHintTimeout = setTimeout('closeNewsHint()', 500);
}

function closeNewsHint()
{
	document.getElementById('pushPinHint').style.display = 'none';
	if (currentHint) {
		var d = document.getElementById('newsPin_'+currentHint);
		if (d) {
			if(coloredAsRead[currentHint])
				d.getElementsByTagName('img')[0].src='images/mini-read.gif';
			else
				d.getElementsByTagName('img')[0].src='images/mini-off.gif';
		}
	}
	currentHint = null;
	currentHintId = null;
}

var coloredAsRead = [];
function colorAsRead(llhash1,llhash2)
{
	coloredAsRead[llhash1 +','+ llhash2] = true;
}

var newsToDisplay = -1;
function displayNews(newsID) {
	closeNewsHint();
	var d = document.getElementById('newsFrame');
	d.src = 'http://www.msnbc.msn.com/id/' + newsID;
	var news = getNews(newsID);
	var pt = new VELatLong(news[3], news[4]);
	map.PanToLatLong(pt);
	newsToDisplay = newsID;
}

function displayNews_helper() {
	if (timePanel)
	if(timePanel.el.style.display == "block")
	{
		timePanelPriorlyVisible = true;
		timePanel.Hide();
	}

	newsFrameVisible = true;

	var c = document.getElementById('newsFrameContainer');
	c.style.display = 'block';
	c.style.width = $('map').offsetWidth - 220+ 'px';
	c.style.top = ((GetWindowHeight()) / 2) + 25 - (($('map').offsetHeight - 150) / 2) + 'px';
	c.style.height = $('map').offsetHeight - 150  + 'px';	
	newsToDisplay = -1;
}

function closeNews() {
	document.getElementById('newsFrameContainer').style.display = 'none';
	
	newsFrameVisible = false;

	if(timePanelPriorlyVisible)
	{
		timePanelPriorlyVisible = false;
		timePanel.Show();
	}
}

var locationHash = [];
function showNews()
{
	if(!newsFrameVisible)
		closeNews();
	
	//closeNewsHint();
	map.Clear();
	locationHash = [];
	var shown = 0;
	var showLimit = 5000;
	var newsPanelData = '';
	var newsPanelItems = [];
	var nbpins = 0;
	var processedNews = [];
	var bWhatFilter = currWhatFilter.length > 0;
	var view = map.GetMapView();
	var maxY = view.TopLeftLatLong.Latitude;
	var minY = view.BottomRightLatLong.Latitude;
	var minX = view.TopLeftLatLong.Longitude;
	var maxX = view.BottomRightLatLong.Longitude;
	var fontsize = 12; //8 * map.zoomLevel;
	for(var i = 0; i < newsItems.length - 1 && shown < showLimit; i++)
	{
		if (!newsItems[i][1]) continue;
		var newsFullDate = new Date();
		newsFullDate.setTime(newsItems[i][5].getTime() /*- milliTimezoneOffset*/);
		var newsDate = new Date(newsFullDate.getFullYear(), newsFullDate.getMonth(), newsFullDate.getDate());

		var dayDelta = Math.abs((todayDate.getTime() - newsDate.getTime()) / oneday);
		if (dayDelta < currWhenFilterStart || dayDelta >= currWhenFilterEnd) {
			continue;
		}
		var llhash = new String(newsItems[i][3]) + ',' + new String(newsItems[i][4]);
		if (newsItems[i][3] == "0.000000") continue;
		// categoryFilter - 0 is all news, -1 is for display purposes only
		if(currNewsDeptFilter && currNewsDeptFilter > 0)
		{
			if(currNewsDeptFilter != newsItems[i][2])
				continue;
		}
		if (bWhatFilter) {
			if (!in_array(newsItems[i][0], currWhatFilter)) continue;
			if (!processedNews[newsItems[i][0]]) {
				newsPanelItems.push([i,llhash]);
				// newsPanelData += '<a onMouseOver="showNewsHint(\''+llhash+'\','+newsItems[i][0]+')" onclick="displayNews('+newsItems[i][0]+');" href="#">'+newsItems[i][1]+'</a><br>'+newsItems[i][5].toUTCString()+'<br><br>';
				processedNews[newsItems[i][0]] = true;
			}									
		}
		if ((newsItems[i][3] < minY || newsItems[i][3] > maxY) || (newsItems[i][4] < minX || newsItems[i][4] > maxX))
			continue;
			
		if (!processedNews[newsItems[i][0]] && !bWhatFilter) {
			newsPanelItems.push([i,llhash]);
			//newsPanelData += '<a onMouseOver="showNewsHint(\''+llhash+'\','+newsItems[i][0]+')" onclick="displayNews('+newsItems[i][0]+');" href="#">'+newsItems[i][1]+'</a><br>'+newsItems[i][5].toUTCString()+'<br><br>';
			processedNews[newsItems[i][0]] = true;
		}				
					
		shown++;
		if(!locationHash[llhash])
		{
			//map.AddPushpin('newsPin_'+llhash, newsItems[i][3], newsItems[i][4], 10, 10, 'newsPin', '<img onclick="displayNews('+newsItems[i][0]+');colorAsRead('+llhash+');" onMouseOver="showNewsHint(\''+llhash+'\')" onMouseOut="delayedHintClose()" src="'+ ((coloredAsRead[llhash])? 'images/mini-read.gif' : 'images/mini-off.gif') +'" />', 5);

			var pt = new VELatLong(newsItems[i][3], newsItems[i][4]);
			var pin = new VEPushpin('newsPin_'+llhash, pt, 'images/mini-off.gif', '', '');
			pin.newsItems = newsItems[i][0];
			pin.llhash = llhash;
			map.AddPushpin(pin);
			locationHash[llhash] = [newsItems[i][0]];
		}
		else 
		{
			if (!in_array(newsItems[i][0],locationHash[llhash]))
				locationHash[llhash].push(newsItems[i][0]);
		}
	}
	
	var lastDate = 0;
	var shownDates = 0;
	
	var days = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
	var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

	for(var i = 0; i < newsPanelItems.length; i++)
	{
		var newsFullDate = new Date();;
		newsFullDate.setTime(newsItems[newsPanelItems[i][0]][5].getTime() - milliTimezoneOffset);
		var newsDate = new Date(newsFullDate.getFullYear(), newsFullDate.getMonth(), newsFullDate.getDate());
		
		if(lastDate == 0 || lastDate.getTime() != newsDate.getTime())
		{
			if(shownDates++ > 0)
				newsPanelData += "</div><br>";

			newsPanelData += "<div style='font-size: 9px; font-weight: bold'>";
			newsPanelData += days[newsDate.getDay()].substr(0,3) + ", " + newsDate.getDate() + ' ' + months[newsDate.getMonth()].substr(0,3) + ' ' + newsDate.getFullYear() + '</div>';
			
			newsPanelData += "<div style='border-top: 1px solid #000; background-color: #"+ ((shownDates % 2)? 'fff':'eee')+"'>";
			
			lastDate = newsDate;
		}
		else
			newsPanelData += '<br>';

//		newsPanelData += 'orig <span style="font-size: small">'+newsItems[newsPanelItems[i][0]][5].toString()+'</span><br>';
//		newsPanelData += 'new <span style="font-size: small">'+newsFullDate.toString()+'</span><br>';

		var llhash = new String(newsItems[newsPanelItems[i][0]][3]) + ',' + new String(newsItems[newsPanelItems[i][0]][4]);
		newsPanelData += '<a onMouseOver="showNewsHint(\''+newsPanelItems[i][1]+'\','+newsItems[newsPanelItems[i][0]][0]+')" onclick="displayNews('+newsItems[newsPanelItems[i][0]][0]+');colorAsRead('+llhash+');" href="#">'+newsItems[newsPanelItems[i][0]][1]+'</a><br>';
		// <br>'+newsItems[newsPanelItems[i][0]][5].toUTCString()+'
	}

	// end the background-color madness
	if(newsPanelItems.length > 0)
		newsPanelData += "</div>";

	if (!locationHash[currentHint])
		closeNewsHint();
		
		
	if(newsPanelData.length == 0)
		newsPanelData = "<br><div style='margin: 6px; color:#555'>No news items found within the given "+((currWhatFilter == 0)? "map view, " : "")+"time frame and news department.<br><br>Try "+((currWhatFilter == 0)? "<b><a href='#' onClick='map.ZoomOut();' style='color:#555'>zooming out</a></b>, " : "")+"selecting another date range in the <b>When</b> menu or making another selection in the <b>News dept.</b> menu.</a>";
		
	document.getElementById('newsPanelItems').innerHTML = newsPanelData;
	document.getElementById('loadingDiv').style.display = 'none';
}

function in_array(elem,arr) {
	for(var i=0; i<arr.length; i++) if (arr[i] == elem) return true;
	return false;
}

function GetXmlHttp() {
	var xmlhttp=false;
		/*@cc_on @*/
		/*@if (@_jscript_version >= 5)
		// JScript gives us Conditional compilation, we can cope with old IE versions.
		// and security blocked creation of the objects.
		 try {
		  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		 } catch (e) {
		  try {
		   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		  } catch (E) {
		   xmlhttp = false;
		  }
		 }
		@end @*/
		if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		  xmlhttp = new XMLHttpRequest();
		}
	return xmlhttp;
}

function swapWhereField(forceShow)
{
	var newState;
	
	if(typeof forceShow == 'undefined')
		newState = !whereFieldVisible;
	else
		newState = forceShow;
	
	document.getElementById('whereFieldDiv').style.display = (newState? "block" : "none");
	document.getElementById('whereFieldEllipsis').style.display = (newState? "none" : "block");
	document.getElementById('wherehelp3').style.display = (newState? "block" : "none");
	document.getElementById('wherehelp4').style.display = (newState? "block" : "none");
	
	whereFieldVisible = newState;
}

function resetWhen()
{
	timePanelPriorlyVisible = false;
	document.getElementById('whenSelect').selectedIndex = 0;
	currWhenFilterStart = 0;
	currWhenFilterEnd = 1;
}

function resetNewsDept()
{
	document.getElementById('newsDeptSelect').selectedIndex = 0;
	currNewsDeptFilter = 0;
}

function swapNewsDeptField(forceShow)
{
	var newState;
	
	if(typeof forceShow == 'undefined')
		newState = !newsDeptFieldVisible;
	else
		newState = forceShow;
	
	document.getElementById('newsDeptFieldDiv').style.display = (newState? "block" : "none");
	document.getElementById('newsDeptFieldEllipsis').style.display = (newState? "none" : "block");
	
	newsDeptFieldVisible = newState;
}

function swapWhenField(forceShow)
{
	var newState;
	
	if(typeof forceShow == 'undefined')
		newState = !whenFieldVisible;
	else
		newState = forceShow;
	
	document.getElementById('whenFieldDiv').style.display = (newState? "block" : "none");
	document.getElementById('whenFieldEllipsis').style.display = (newState? "none" : "block");
	
	whenFieldVisible = newState;
}

function ShowNewsPanel()
{
	var introFrame=document.getElementById('newsPanelDiv');
	//introFrame.style.display = 'block';
	var height = GetWindowHeight() - 125;
	var p=new VE_Panel_o("newsp",5,110,180,height,"blue",72,"News bar",introFrame,"","",false);
	
	p.body.className="VE_Panel_o_body_help";
	p.SetToolbarSize(0);



//	p.SetFooterSize(130);
//	p.SetFooter('<script type="text/javascript"><!-- google_ad_client = "pub-6633175980396561"; google_ad_width = 200; google_ad_height = 200; google_ad_format = "200x200_as"; google_ad_type = "text_image"; google_ad_channel = "6893250819"; google_color_border = "000000"; google_color_bg = "F0F0F0"; google_color_link = "0000FF"; google_color_text = "000000"; google_color_url = "008000"; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>');

	
//	p.SetFooterSize(0);
//	p.SetFooter("<center><b><a style='font-size:12px' href='http://poly9.viavirtualearth.com/Poly9/MSNBC-Rita/' target=_blank>See Hurricane Rita news</a></b></center>");


	p.onTitleClick=function(e)
	{
		e.srcPanel.Toggle();
	};
	

	newsPanel = p;
}


function ShowTimePanel()
{
	var timeFrame=document.getElementById('sliderdiv');
//	timeFrame.style.top = '51px';
//	timeFrame.style.left = '760px';
	timeFrame.style.display = 'block';
	var p=new VE_Panel_o("timep",GetWindowWidth() - 370,80,360,80,"blue",72,"Date selection",timeFrame,"a");

	p.body.className="VE_Panel_o_body_help";
	p.SetToolbarSize(0);
	p.SetFooterSize(0);

	p.onCloseClick=function(e)
	{
		e.srcPanel.Hide();

		// to avoid nasty surprise upon opening it up again
		if(e.srcPanel.min)
			e.srcPanel.Maximize();
			
		resetWhen();
		
		setReminders();
		
		document.getElementById('loadingDiv').innerHTML = loadingMsgs[currLoadingMsg++ % loadingMsgs.length];
		document.getElementById('loadingDiv').style.left = GetWindowWidth() / 2;
		document.getElementById('loadingDiv').style.top = GetWindowHeight() / 2;
		document.getElementById('loadingDiv').style.display = 'block';
		
		setTimeout('showNews()', 50);
	};

	p.onTitleClick=function(e)
	{
		e.srcPanel.Toggle();
	};

	timePanel = p;
}

function replaceTimePanel()
{
	if (!timePanel) return;
	sliderOffset = parseInt(timePanel.el.style.left) + 20;
}

// var lastDate = '20050906';
function updateTimePanel()
{
	var duration = (currRight - currLeft + 1) / 50;
	var startSlider = (currLeft + 5) / 50;
	var endSlider = startSlider + duration;


	// inverse since most recent is at right (i.e. day 0)
	var start = 5 - startSlider;
	var end = 6 - endSlider;



	// ********************************************************************
	// ********************************************************************
	// use REAL date addition function
	// i.e. create Date object, add number of days, get resulting date...
	// ********************************************************************
	
	var lastDateObj = new Date(); // lastDate.substr(0,4),lastDate.substr(4,2) - 1,lastDate.substr(6,2)

	
	var startDateObj = new Date(); // lastDateObj.getDate() - currWhenFilterStart;
	startDateObj.setTime(lastDateObj.getTime());
	
	with(startDateObj)
	{
		setDate(lastDateObj.getDate() - start);
	}
	
	var endDateObj = new Date(); // lastDateObj.getDate() - currWhenFilterEnd;
	endDateObj.setTime(lastDateObj.getTime());
	
	with(endDateObj)
	{
		setDate(lastDateObj.getDate() - end);
	}
	
	
	var startDate = (startDateObj.getMonth() + 1) +'.'+ startDateObj.getDate() +'.'+ startDateObj.getFullYear();
	var endDate = (endDateObj.getMonth() + 1) +'.'+ endDateObj.getDate() +'.'+ endDateObj.getFullYear();
	
	document.getElementById('sliderdivtxt').innerHTML = startDate + ' - ' + endDate;
	document.getElementById('whenReminder').innerHTML = startDate + ' - ' + endDate;

	
	if(currWhenFilterStart == 6 - endSlider && currWhenFilterEnd == 6 - startSlider)
		return;
	
	currWhenFilterStart = 6 - endSlider;
	currWhenFilterEnd = 6 - startSlider;


	document.getElementById('loadingDiv').innerHTML = loadingMsgs[currLoadingMsg++ % loadingMsgs.length];
	document.getElementById('loadingDiv').style.left = GetWindowWidth() / 2;
	document.getElementById('loadingDiv').style.top = GetWindowHeight() / 2;
	document.getElementById('loadingDiv').style.display = 'block';

	setTimeout('showNews()', 50);
}


function initHints() {
	var d = document.createElement('div');
	d.style.display = 'none';
	d.style.position = 'absolute';
	d.style.zIndex = 15;
	//d.fontcolor = '#000';
	d.style.background = '#fffadc';
	d.style.border = '1px solid black';
	d.id = 'pushPinHint';
	d.style.width = '305px';
	document.body.appendChild(d);
}

function resetWhat() {
	document.getElementById('whatField').value = '';
	lastWhat = '';
}

function resetWhereField() {
	document.getElementById('whereField').value = '[Current map view]';
	document.getElementById('whereField').style.color = "#aaa";
}

function emptyWhereField()
{
	if(document.getElementById('whereField').value == '[Current map view]')
	{
		document.getElementById('whereField').value = '';
		document.getElementById('whereField').style.color = "#000";
	}
}

function initSlider()
{
	document.getElementById('sliderballL').style.top="-10px";
	document.getElementById('sliderballL').style.left="-36px";
	document.getElementById('sliderballR').style.top="-10px";
	document.getElementById('sliderballR').style.left="-236px";
	document.getElementById('slidergrayimg').width = "300"; 
	
	// ***************** saf versus ie & fire *******************
	document.getElementById('slidercolorimg').style.top = document.getElementById('slidergrayimg').offsetTop - 1 + 'px';
	document.getElementById('slidercolorimg').width = "0"; 

	moveSlider(45,'L'); 
	moveSlider(294,'R');
	
	updateTimePanel();
}


function MSNBC(container)
{
	map = new VEMap(container);
	map.LoadMap( new VELatLong(40,0),2,'h',false);
	map.HideDashboard();
	this.resize();
	this.init();
	return this;
}

MSNBC.prototype.setFullScreen = function() {
	return this.resize();
}

MSNBC.prototype.resize = function(width, height) {

	var m = $("map");
	width=width?width:Utils.GetWindowWidthHeight().width;

	height=height?height:Utils.GetWindowWidthHeight().height - $('header').offsetHeight;
	m.style.top = $('header').offsetHeight;
	m.style.width = width + "px";
	m.style.height = height+ "px";
	map.Resize(width, height);
	map.AttachEvent('onclick', function() {
		closeNewsHint();
	});
	map.AttachEvent('onstartzoom', function(e) {
		closeNewsHint();
		if(!newsFrameVisible)
			closeNews();
		closeMoreNews();
	});
	map.AttachEvent('onendzoom', function(e) {
		showNews();
	});
	map.AttachEvent('onstartcontinuouspan', function(e) {
		if(!newsFrameVisible)
			closeNews();
		if (newsToDisplay != -1)
			map.Clear();
	});
	map.AttachEvent('onendcontinuouspan',  function(e) {
		if (newsToDisplay != -1)
			displayNews_helper();
		else
			showNews();
	
		resetWhereField();
		setWhereReminder();
	});
	return this;
}

MSNBC.prototype.init = function() {
 ShowNewsPanel();
 initHints();
 resetWhen();
 resetNewsDept();
 resetWhat();
 resetWhereField();
 setReminders();
 loadNews();
 swapWhereField(true);
 swapNewsDeptField(true);
 swapWhenField(true);
}
 //map.AddPushpin('newsPin_'+llhash, newsItems[i][3], newsItems[i][4], 10, 10, 'newsPin', '<img onclick="displayNews('+newsItems[i][0]+');colorAsRead('+llhash+');" onMouseOver="showNewsHint(\''+llhash+'\')" onMouseOut="delayedHintClose()" src="'+ ((coloredAsRead[llhash])? 'images/mini-read.gif' : 'images/mini-off.gif') +'" />', 5);

function makePin() {
    var pinId=this.ID+"_"+this.m_vemap.GUID;
    var content="<div style:'cursor:hand; text-decoration:none;' id=numberPin onmouseover='showNewsHint(\""+this.llhash+"\");this.parentNode.style.zIndex=999;' onmouseout='delayedHintClose();this.parentNode.style.zIndex=2;'  onclick='displayNews("+this.newsItems+");colorAsRead(\""+this.llhash+"\");'><img class='"+this.IconStyle+"' src='"+this.Iconurl+"' id='"+pinId+"' ";
    content+=" /></div>";
    return content;
}

VEPushpin.prototype.GetContent=makePin;
