
var BR = '<br />';

var	SITEMENU =
	{ calendar:
		{	dayLim: 28
		, days: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ]
		, months: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]
		, popup:
			{ yOffset: 30
			}
		}
	, frameWidth: 
		{ orig: top.document.body.cols
		, wide: 263
		}
	};

var tracking = true;



function  comingSoon
(
	feature
)
		{
		alert( ( feature  ?  feature + '\n\nComing soon.'  :  'Coming soon.'  ) );
		}	// End method; comingSoon



function calDay
(
	td
)
		{
		if ( !tracking )	return;

		for ( var lc = 999;  td  &&  !td.calInfo  &&  lc > 0;  lc-- )	// when this is called by click event rather than mouseover/out
			td = ( td.parentElement  ?  td.parentElement  :  td.parentNode ); // move up through tree until you reach the <td> node

		if ( !td  ||  !td.calInfo )	return;
		var info = td.calInfo;
		var popup = document.getElementById( 'calInfo' );

// MUST CHECK for MSIE here:
// MUST CHECK for MSIE here:
// MUST CHECK for MSIE here:
		if ( navigator.appName.indexOf( 'Microsoft' ) > -1  ||  !info.popup )
// MUST CHECK for MSIE here:
// MUST CHECK for MSIE here:
// MUST CHECK for MSIE here:
			{
			var h = '<div style="font-weight: bold;"><div style="float: right;">' + SITEMENU.calendar.months[info.dd.getMonth()] + '&nbsp;' + info.dd.getDate() + ',&nbsp;' + info.dd.getFullYear() + '</div>' + SITEMENU.calendar.days[info.dd.getDay()] + '</div>';
		
			if ( info.weather.day != null )
				{
				var day = info.weather.day;
				var parts = day.getElementsByTagName( 'part' );
				var ppcp = nv( parts[info.weather.dayPart], 'ppcp' );
				var t = nv( parts[info.weather.dayPart], 't' );
				
				h += '<div class="calWDC">'
						 + '<img src="/assets/media/weather.com/61x61/' + nv( parts[info.weather.dayPart], 'icon' ) + '.png" height="61" width="61" />'
						 + ( info.weather.dayPart > 0  ?  'Overnight: '  :  '' )
						 + ( t == WEATHER.COM.NOT_AVAILABLE  ?  'No report available'  :  t  ) + BR
						 + ifNNA( nv( day, 'hi' ), 'hi: |&nbsp;&nbsp;&nbsp;' ) 
						 + ifNNA( nv( day, 'low' ), 'low: |' )
						 + ifNNA( nv( day, 'hmid' ), BR + 'humidity: |%' );
	
				if ( ppcp > '0'  &&  ppcp != WEATHER.COM.NOT_AVAILABLE )	h += BR + 'chance of precip: ' + ppcp + '%';
				h += '</div>&nbsp;';
				}
			popup.innerHTML = h;
			info.popup = new Array(popup.childNodes.length);
			for ( var c = 0;  c < popup.childNodes.length;  c++ )
				info.popup[c] = popup.childNodes[c];
			}
		else
// MSIE attempting to execute appendChild() crashes the FPOS (fucking piece of shit) BROWSER
// MSIE attempting to execute appendChild() crashes the FPOS (fucking piece of shit) BROWSER
// MSIE attempting to execute appendChild() crashes the FPOS (fucking piece of shit) BROWSER
			{
			for ( ; popup.hasChildNodes();  )
				popup.removeChild( popup.firstChild );

			for ( var c = 0;  c < info.popup.length;  c++ )
				popup.appendChild( info.popup[c] );
			}
// MSIE attempting to execute appendChild() crashes the FPOS (fucking piece of shit) BROWSER
// MSIE attempting to execute appendChild() crashes the FPOS (fucking piece of shit) BROWSER
// MSIE attempting to execute appendChild() crashes the FPOS (fucking piece of shit) BROWSER


		}	// End method; calDay


function calLock
(
	evt
)
		{
		if ( tracking = !tracking )		// yes, I don't mean ==; toggle the boolean and if the result is true, return
			{
			calTrack( evt );
			if ( !evt ) evt = window.event;
			if ( evt.target )
				calDay( evt.target );
			else if ( evt.srcElement )
				calDay( evt.srcElement );

			return;	
			}

		var cal = document.getElementById( 'calContainer' );
/*		var attr = '';
		for ( var a in cal )
			if ( a.indexOf( 'top' ) > -1 || a.indexOf( 'scroll' ) > -1 || a.indexOf( 'y' ) > -1 
			|| !isNaN( parseInt( cal[a] ) )
			) attr += '\n' + a + ': ' + cal[a];
			
alert( attr );
*/
		document.getElementById( 'calPopup' ).style.top = cal.offsetTop + cal.scrollHeight + 5 + 'px';
		}	// End method; calLock


function calPopup
(
	overOut
)
		{
		if ( !tracking )	return;
		document.getElementById( 'calPopup' ).style.display = ( overOut  ?  'block'  :  'none' );
		}	// End method; calShowPopup()


function calTrack
(
	evt
)
		{
		if ( !tracking )	return;

		var y;
		if ( evt )
			y = evt.pageY;
		else
			y = window.event.y

		document.getElementById( 'calPopup' ).style.top = y + SITEMENU.calendar.popup.yOffset + 'px';
		}	// End method; calTrack



function createCalendar()
		{
		var tbl = document.getElementById( 'upcomingCal' );
		if ( tbl == null )	return;
		var tr, td, cls;

		var days = ( window.top.xWeather && window.top.xWeather.dayf && (typeof window.top.xWeather.dayf.getElementsByTagName) != 'undefined' 
		           ?  window.top.xWeather.dayf.getElementsByTagName( 'dayf' )[0].getElementsByTagName( 'day' )  
							 :  null );

		var parts, p, wd;

		var now = new Date();
		var today = new Date( now.getFullYear(), now.getMonth(), now.getDate() );
		var dd = new Date( now.getFullYear(), now.getMonth(), now.getDate() - now.getDay() );
		var mm = dd.getMonth();

		for ( var d = 0;  d < SITEMENU.calendar.dayLim;  d++ )
			{
			if ( (d % 7) == 0 )
				{
				tr = tbl.insertRow( tbl.rows.length );
				tr.vAlign = 'middle';
				tr.align = 'center';
				}


			td = tr.insertCell( (d%7) );
			cls = 'calMM' + (dd.getMonth() - mm);
			if ( dd.getTime() < today.getTime() )
				{
				wd = -1;
				cls += ' calDDPst';
				}
			else 
				{
				wd = findDay( days, WEATHER.COM.Mmm[dd.getMonth()] + ' ' + dd.getDate() );
				cls += ( dd.getTime() != today.getTime()  ?  ' calDDNxt'  :  ( now.getHours() < 18  ?  ' calDDTdy'  :  ' calDDNt' ) );
				}

			if ( wd >= 0 )
				{
				parts = days[wd].getElementsByTagName( 'part' );
				p = ( nv( parts[0], 't' ) == WEATHER.COM.NOT_AVAILABLE   ?  1  :  0 );
				cls += ' ' + WEATHER.COM.css.icons.x31 + nv( parts[p], 'icon' );
				}
			else
				p = 0;

			td.innerHTML = '<div class="' + cls + '">' + dd.getDate() + '</div>';

			td.calInfo = 
				{ dd: new Date( dd.getFullYear(), dd.getMonth(), dd.getDate() )
				, popup: null
				, weather:
					{ day: ( wd >= 0  ?  days[wd]  :  null )
					, dayPart: p
					}
				}	// End; calInfo object


			td.onclick = calLock;
			td.onmouseover = function ()
					{
					calDay( this );
					}
//			td.onmouseout = calWipe;


			dd.setDate( dd.getDate() + 1 );
			}	// End for; span of days,


		tbl.onmousemove = calTrack;
		}	// End method; createCalendar



function  findDay
(
  days
, dayDate
)
		{
		if ( !days  ||  !days.length )	return		-1;

		for ( var d = 0;  d < days.length;  d++ )
			if ( days[d].getAttribute( 'dt' ) == dayDate )	return d;

		return	 -1;
		}	// End method; findDay


function ifNNA
(
	datum
, txt
, repl
)
		{
		repl = ( repl  ?  new RegExp( repl, 'g' )  :  /\|/g  );
		if ( datum == WEATHER.COM.NOT_AVAILABLE )	return '';

		return	txt.replace( repl, datum );
		}	// End method; ifNNA



function loadWeatherLinks()
		{
		if ( !window.top.xWeather  ||  !window.top.xWeather.lnks  ||  (typeof window.top.xWeather.lnks.getElementsByTagName) == 'undefined' )	return false;

		var lnks = window.top.xWeather.lnks.getElementsByTagName( 'lnks' )[0].getElementsByTagName( 'link' );
		var h = '';
		
		for ( var i = 0;  i < lnks.length;  i++ )
			{
			var lnk = nv( lnks[i], 'l' );
			h += '<a href="' + lnk + '&par=' + WEATHER.COM.parID + ( lnk.indexOf( '&locID' ) < 0  ?  '&locID=02760' : '' ) + '" style="margin-top: 5px; line-height: 95%;" target="_blank">' + nv( lnks[i], 't' ) + '</a>'
			}

		if ( h.length > 0 )	document.getElementById( 'linksWDC' ).innerHTML = h;

		return	h.length > 0;
		}	// End method; loadWeatherLinks



function loadDivs
(
	node
, aStack
)
		{
		if ( node.nodeType != 1 )		return;
		var d;
		
		if ( node.nodeName.toLowerCase() == 'a' )
			{
			if ( (typeof node.href) == 'undefined'  ||  node.href.length < 1  )
				aStack.push( node );
			else if ( (typeof node.target) == 'undefined'  ||  node.target.length < 1 )
				node.target = 'siteBody';
			}
		else if ( node.nodeName.toLowerCase() == 'div'  &&  node.className == 'menu' )	 
			{
			node.style.display = 'none';	// redundant, but need to force initialize, can't assume class will help
			new Div( node.id );

			var a = aStack.pop();
			a.linkedDiv = node.id;
			a.onclick = function( ) 
					{  
					this.blur(); 
					Div[this.linkedDiv].peek(); 
					};
			a.href = '#';	// this is required for fucking IE to trigger the a:hover CSS styles
			a.target = '_self';
			}

		for ( var c = 0;  c < node.childNodes.length;  c++ )
			loadDivs( node.childNodes[c], aStack );

		return;
		}	// End method; loadDivs



function nv
(
  node
, tag
)
		{
		return	node.getElementsByTagName( tag )[0].childNodes[0].nodeValue;
		}	// End method; nv
		


function toggleWidth
(
	anch
)
		{
		if ( Div[anch.linkedDiv].div.style.display == 'none' )
			{
			top.document.body.cols = SITEMENU.frameWidth.wide + ',*';
			Div[anch.linkedDiv].peek( true );
			}
		else
			{
			Div[anch.linkedDiv].peek( false );
			top.document.body.cols = SITEMENU.frameWidth.orig;
			}

		anch.blur();
		}	// End method; toggleWidth
			







function bodyOnLoad()
		{
		var menuItems = document.getElementById( 'menuItems' );
		
		var aStack = new Array();
		loadDivs( menuItems, aStack );

		while ( aStack.length > 0 )
			{
			var a = aStack.pop();
			a.onclick = function () 
					{  
					this.blur();
					comingSoon( this.title );
					};
			}	// End while; stack not fully popped

		try {
				delete xWTemp;
				}
		catch ( ex )
				{}

/*
		createCalendar();
		var p = document.getElementById( 'calPopup' ).style
		p.width = Math.round( SITEMENU.frameWidth.wide * 0.90 ) + 'px';
		p.left = Math.round( SITEMENU.frameWidth.wide * 0.05 ) + 'px';

		document.getElementById( 'upcomingMenuLink' ).onclick = function() 
				{  
				tracking = true;
				calPopup( false );
				toggleWidth( this );
				};

		if ( loadWeatherLinks() ) document.getElementById( 'wdcFeatures' ).onclick = function()
			{
			toggleWidth( this );
			};
*/
		}	// End method; bodyOnLoad()

