/**********************
 *	RASPtableZoom.js  *
 **********************/
 

		/* 
		 * Global Variables
		 */

		var region = "ITALIA";

		var desc = [];
		var day_xmlhttp;
		var par_xmlhttp;
                
		var Server = "http://www.ilpulcino.org/rasp/blipmapper.php?";

 
		var tipstate = "frozen";
		var basetip = "Click sinistro: ora successiva<br/>Shift-CTRL-Click sin.: ora precedente<br/>rotellina: zoom in-out"

		var oldDayIndex;
		var Loaded;
		var Pics;
		var canZoom = true;

		var Zoom = 1.0;			// Image Zoom factor
		var	oldZoom = 1.0;
		var oldleft = 0.0;
		var oldtop = 0.0;
		var	mouseDownPos = {
			X: 0,
			Y: 0
		};
		var	initialMousePos = {
			X: 0,
			Y: 0
		};

		var ffversion;

		var fullSet;

		// var ref;
		var oldParam;
		var oldDay;
		var times;
		var oldRegion;

		var paramWindow;
		var origTblHt;
		var imgHt;
		var	imgSiz;

		var enabletip=false;
		var tipobj;
		var pointerobj;
		var	mapObj;
    var	map_headerObj;
    var	map_footerObj;
    var map_headerDiv;
    var map_footerDiv;
    var iframeObj;
    
		var offsetfromcursorX=1;		 	//Customize x offset of tooltip
		var offsetfromcursorY=1;		 	//Customize y offset of tooltip

		var offsetdivfrompointerX=00;	//Customize x offset of tooltip DIV relative to pointer image
		var offsetdivfrompointerY=14;	//Customize y offset of tooltip DIV relative to pointer image. Tip: Set it to (height_of_pointer_image-1).

		var w2times = [ 
                    ["10:00","1000"], 
                    ["11:00", "1100"],
                    ["12:00", "1200"],
                    ["13:00", "1300"],
                    ["14:00", "1400"],
                    ["15:00", "1500"],
                    ["16:00", "1600"],
                    ["17:00", "1700"],
                    ["18:00", "1800"],
                    ["19:00", "1900"],
                    ["20:00", "2000"]

                  ];
    var dayList = [];


 /***********************
 * initIt()             *
 *                      *
 * Initialise Variables *
 * Build Menus, etc     *
 ***********************/
function initIt()
{
    var localobj;
		// ref = document.forms[0];	// shorthand
		oldDayIndex = document.getElementById("Day").options.selectedIndex;
		Loaded = new Array();
		Pics = new Array();

		oldParam = document.getElementById("Param").options.value;
		oldDay = document.getElementById("Day").value;
    oldRegion = document.getElementById("region").value;

		paramWindow = "" ;

		/* There is a bug in FF 1.5 & 2 with DOMMouseScroll - look for ffversion below */
		if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
			ffversion=new Number(RegExp.$1) // capture x.x portion and store as a number
		}

switch(document.getElementById("region").value)
{
case "ITALIA_NE":
  // alert("A causa di un problema tecnico sono saltati gli aggiornamenti per il NORD EST per il 10 (oggi) e 11 (domani). ALCUNE Blipmap ed TUTTI i windgram del NE sono quelli generati ieri. Controllate la pagina Stato Elaborazioni per i dettagli!");
  break;

default:
  
}

		/**********************/
		/* Build the Day Menu */
		/**********************/
		var Now = new Date().getTime();	// Time now - in milliSec(!)
		var mS_Day = 24 * 60 * 60 * 1000;	// mS in a day
		var T = new Date();			// Instantiate a Date object
		var dayName   = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
		var monthName = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

    // fill available days for selected region
    RequestDays(document.getElementById("region").value);
 

		/***********************/
		/* Set Default Options */
		/***********************/

		document.getElementById("theMap").onload = setSize;
		document.getElementById("theMap").onerror = badImage;
		document.getElementById("theBlipspot").onerror = badBlipspot;


		// Clear skewT option & install callback
		document.getElementById("skewT").checked = false;
		document.getElementById("skewT").onmousedown = toggleSkewT;



		// Parameters
		RequestParameters(document.getElementById("region").value)
    
		document.getElementById("Param").onchange = doChange;	// Install handler
		document.getElementById("Day").onchange = doChange;	// Install handler
		document.getElementById("Time").onchange = doChange;	// Install handler
		document.getElementById("region").onchange = doChange;	// Install handler

		document.getElementById("archiveDay").onchange = doChange;	// Install handler
		document.getElementById("archiveMonth").onchange = doChange;	// Install handler
		document.getElementById("archiveYear").onchange = doChange;	// Install handler


		// Install Time options
		times = w2times;
		for (var i = 0; i < times.length; i++) {
			document.getElementById("Time").options[i] = new Option(times[i][0], times[i][1]);
			if(times[i][0] == "12:00")
				document.getElementById("Time").options[i].selected = true;
		}

		
		/* Sort out Archive year(s), at least, to handle 6 months 

		T.setTime(Now - 182 * mS_Day);
		document.getElementById("archiveYear").options[1] = new Option(T.getFullYear(), T.getFullYear());
		T.setTime(Now);
		if(T.getFullYear() != document.getElementById("archiveYear").options[1].value){
			document.getElementById("archiveYear").options[2] = new Option(T.getFullYear(), T.getFullYear());
		}
		**/
		
		for (i = 0; i < document.getElementById("Time").options.length; i++){
			Pics[i] = new Image();
			Loaded[i] = false;
		}
		


		whichBrowser();	// Determine punter's Browser


		mapObj = document.getElementById("theMap");
		map_headerObj = document.getElementById("theMap_header");
		map_footerObj = document.getElementById("theMap_footer");
		map_headerDiv = document.getElementById("map_header");
		map_footerDiv = document.getElementById("map_footer");
		iframeObj = document.getElementById("theBlipspot");
		localobj=mapObj;
		setSize();

		//loadImage(1);	// Assume forwards

		// Save the original Selector Table Height
		origTblHt = document.getElementById("selectors").offsetHeight;




		/********************* Material below adapted from *************************************
		* Cool DHTML tooltip script II- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
		* This notice MUST stay intact for legal use
		* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
		****************************************************************************************/


		document.write('<div id="dhtmltooltip" style="align: left;" onload="ddrivetip(\'Click successivo</br>Shift-Click precedente\')" ></div>') //write out tooltip DIV
		document.write('<img id="dhtmlpointer" src="arrow2.gif" >') //write out pointer image


		if (ie){
			tipobj		 = document.all["dhtmltooltip"];
			pointerobj = document.all["dhtmlpointer"];
		}
		else{
			tipobj		 = document.getElementById("dhtmltooltip") ;
			pointerobj = document.getElementById("dhtmlpointer") ;
		}


		unfreezetip(basetip);

		mapObj.onmousemove = positiontip;
		mapObj.onmouseout	= obscuretip;
		mapObj.onmouseover	= revealtip;
		pointerobj.onmouseover = positiontip;
		tipobj.onmouseover = positiontip;
		

		mapObj.onmousedown = getPos;
		mapObj.onmouseup   = doclick;


		/* Mouse Wheel Initialization code */
		// Note that order is important: Chrome has both onmousewheel and addEventListener

    if(typeof(mapObj.onmousewheel) != 'undefined' )
		  mapObj.onmousewheel = wheel;
	  else if(mapObj.addEventListener)
	    mapObj.addEventListener('DOMMouseScroll', wheel, false);
	  else
	    alert("No mouse wheel interface");
}



/****************************************
 *      END OF INITIALISATION STUFF     *
 *      Start of functions              *
 ****************************************/

/**********************************
* Get Mouse Position on mousedown *
**********************************/
function getPos(E)
{
			if(!E)
				E = window.event;

			initialMousePos.X = mouseDownPos.X = E.clientX;
			initialMousePos.Y = mouseDownPos.Y = E.clientY;
			if(Zoom != 1){
				if(window.addEventListener){
					mapObj.removeEventListener('mousemove', positiontip, false);
					mapObj.addEventListener('mousemove', dragIt, false);
				}
				else{
					mapObj.detachEvent('onmousemove', positiontip);
					mapObj.attachEvent('onmousemove', dragIt);
				}
				if (E.preventDefault)
					E.preventDefault();
				E.returnValue = false;
			}
}


function dragIt(E)
{
			if(!E)
				E = window.event;

			var coords = {
				X: E.clientX,
				Y: E.clientY
			};

			if(ie)
				mapObj.releaseCapture();
			positiontip(E);
			oldleft = oldleft + coords.X - initialMousePos.X;

			oldleft = (oldleft > 0 ? 0 : oldleft); 	// Prevent moving Img too far Right
			
			/*
			theSiz = document.getElementById("theMap").style.height;
			l = theSiz.length - 2;
			theSiz = theSiz.substr(0,l);
			*/
			theSiz = Number(document.getElementById("theMap").style.height.replace(/px/, ""));
			
			if(theSiz < (imgHt - oldleft)){					// Prevent moving Img too far Left
				oldleft = imgHt - theSiz ;
			}
			
			oldtop  = oldtop  + coords.Y - initialMousePos.Y;
			oldtop = (oldtop > 0 ? 0 : oldtop);			// Prevent moving Img too far Down

			if(theSiz < (imgHt - oldtop)){					// Prevent moving Img too far Left
				oldtop = imgHt - theSiz ;
			}
			
			initialMousePos.X = coords.X;
			initialMousePos.Y = coords.Y;
			mapObj.style.left = oldleft + "px";
			mapObj.style.top  = oldtop + "px";
			if (E.preventDefault)
				E.preventDefault();
			E.returnValue = false;
}



function popup(mylink, windowname, wid, ht)
{
			if (! window.focus)return true;
			var href;
			if (typeof(mylink) == 'string')
				href=mylink;
			else
				href=mylink.href;
			args = 'width=' + wid + ',height=' + ht + ',scrollbars=yes';
			// window.open(href, windowname, args);
			window.open(href, '', args);	// IE objects to a window name
			return false;
}

function ietruebody()
{
			return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
}


function ddrivetip(thetext, thewidth, thecolor)
{
			if (typeof thewidth != "undefined")
				tipobj.style.width = thewidth+"px"
			if (typeof thecolor != "undefined" && thecolor != "")
				tipobj.style.backgroundColor = thecolor
			tipobj.innerHTML = thetext
			enabletip = true
			return false
}

function positiontip(e)
{
			if(tipstate === "frozen")
				return;
			if (enabletip){
				var nondefaultpos=false
				var curX=(ns) ? e.pageX : event.clientX+ietruebody().scrollLeft;
				var curY=(ns) ? e.pageY : event.clientY+ietruebody().scrollTop;

				//Find out how close the mouse is to the corner of the window
				var winwidth  = ie && !window.opera ? ietruebody().clientWidth : window.innerWidth-20
				var winheight = ie && !window.opera ? ietruebody().clientHeight : window.innerHeight-20

				var rightedge = ie &&!window.opera ? winwidth  - event.clientX - offsetfromcursorX : winwidth - e.clientX - offsetfromcursorX
				var bottomedge= ie &&!window.opera ? winheight - event.clientY - offsetfromcursorY : winheight - e.clientY - offsetfromcursorY

				var leftedge=(offsetfromcursorX<0) ? offsetfromcursorX*(-1) : -1000

				//if the horizontal distance isn't enough to accomodate the width of the context menu
				if (rightedge < tipobj.offsetWidth){
					//move the horizontal position of the menu to the left by it's width
					tipobj.style.left = curX - tipobj.offsetWidth + "px"
					nondefaultpos = true
				}
				else if (curX < leftedge)
					tipobj.style.left = "5px"
				else{
					//position the horizontal position of the menu where the mouse is positioned
					tipobj.style.left = curX + offsetfromcursorX - offsetdivfrompointerX + "px"
					pointerobj.style.left = curX + offsetfromcursorX + "px"
				}

				//same concept with the vertical position
				if (bottomedge<tipobj.offsetHeight){
					tipobj.style.top = curY - tipobj.offsetHeight - offsetfromcursorY + "px"
					nondefaultpos = true
				}
				else{
					tipobj.style.top = curY + offsetfromcursorY + offsetdivfrompointerY + "px"
					pointerobj.style.top = curY + offsetfromcursorY + "px"
				}
				tipobj.style.visibility = "visible"
				if (!nondefaultpos)
					pointerobj.style.visibility = "hidden"
			}
}

function removePopup()
{
			// Remove popup window
			try {
				if(paramWindow != "" ){
					paramWindow.close();
					paramWindow = "" ;
				}
			}
			catch(err) {
				; // error irrelevant
			}
}




function obscuretip()
{
			if(tipstate != "frozen")
				hidetip();
}

function unfreezetip(Str)
{
			return;
      removePopup();
			revealtip();
			tipobj.innerHTML = Str;
			tipobj.onmouseover  = positiontip;
			pointerobj.onmouseover  = positiontip;
			mapObj.onmousemove = positiontip;
			tipstate = "";
}

function freezetip()
{
			if(window.addEventListener){
				mapObj.removeEventListener("mousemove", positiontip, false);
				mapObj.removeEventListener("mouseout", obscuretip, false);
			}
			else{
				mapObj.detachEvent("onmousemove", positiontip);
				mapObj.detachEvent("onmouseout", obscuretip);
			}
			pointerobj.onmouseover = "";
			tipobj.onmouseover = "";
			tipstate = "frozen";
}

function revealtip()
{
			enabletip=true
			tipobj.style.visibility="visible"
			pointerobj.style.visibility="hidden"
}

function hidetip()
{
			enabletip=false
			tipobj.style.visibility="hidden"
			pointerobj.style.visibility="hidden"
}



/*****************************/
/* Get image click Coords    */
/*****************************/ 
function getPageCoords (element)
{
			var coords = {x : 0, y : 0};
			while (element) {
				coords.x += element.offsetLeft;
				coords.y += element.offsetTop;
				element = element.offsetParent;
			}
			return coords;
}


/*****************************/
/* Get image click Posn info */
/*****************************/ 
function getOffsets(evt)
{
			if( ie ) {		// Internet Exploder
				target = event.srcElement;
				if (typeof target.offsetLeft == 'undefined') {
					target = target.parentNode;
				}
				var pageCoords = getPageCoords(target);
				var eventCoords = {
					x: window.pageXOffset + event.clientX,
					y: window.pageYOffset + event.clientY
				}
			}
			else {		// NS etc
				var target = evt.target;
				if (typeof target.offsetLeft == 'undefined') {
					target = target.parentNode;
				}
				var pageCoords =getPageCoords(target);
				var	eventCoords = {
						x: window.pageXOffset + evt.clientX,
						y: window.pageYOffset + evt.clientY
				};

			}
			var offsets = {
				offsetX: eventCoords.x - pageCoords.x,
				offsetY: eventCoords.y - pageCoords.y
			}
			return offsets;
}


/********************************/
/* CallBack for onclick (image) */
/********************************/
function doclick(E)
{
			var buttn;
			var dirn = 1; // forwards
			var pos = {	// current mouse posn
				X: 0,
				Y: 0
			};
      // if TOPO or WINDGRAM DO NOTHING!
      if(document.getElementById("Param").value.match("topo") ||
         document.getElementById("Param").value.match("windgram")
      ) return;
      
			if(window.addEventListener){
				mapObj.removeEventListener('mousemove',   dragIt,   false);
				mapObj.removeEventListener('mousemove',     positiontip,  false);
			}
			else{
				mapObj.detachEvent('onmousemove', dragIt);
				mapObj.detachEvent('onmousemove', positiontip);

			}

			// Catch a stupid selection
			if (document.getElementById("Param").value === "nope1") {
				return false;
			}

			if(!E)	// IE stupidity
				E = window.event;

			// Grab mouse posn immediately
			pos.X = E.clientX;
			pos.Y = E.clientY;

			/*	buttn	IE		NS (etc?)
			 *  L			1			1
			 *  M			4			2
			 *  R			2			3
			 */
			var LEFT 	= 1;
			var MID  	= 2;
			var RIGHT	= 3;
			if ( ie ) {
				shiftPressed	= event.shiftKey;
				ctrlPressed		= event.ctrlKey;
				altPressed		= event.altKey;
				switch(event.button){
				case 1:	buttn = LEFT;  break;
				case 2: buttn = RIGHT; break;
				case 3:	buttn = MID; 	 break;
				case 4:	buttn = MID;	 break;
				default:
					alert("I don't understand which butoon you pressed!\nButton # = " + event.button);
					break;
				}
			}
			else if (ns || ko || op ) {
				shiftPressed	= E.shiftKey;
				ctrlPressed		= E.ctrlKey;
				altPressed		= E.altKey;
				switch(E.which){
				case 1:	buttn = LEFT; 	break;
				case 2:	buttn = MID;		break;
				case 3: buttn = RIGHT;	break;
				default:	alert("Which button was that?\nE.which = " + E.which); break;
				}				
			}
			else {
				alert("Which Button?\nE.which = " + E.which);
			}
			
			
      //alert("shift="+shiftPressed+" CTRL="+ctrlPressed+" ALT="+altPressed);

			switch (buttn) {
			case 1:
				/**** ORDINARY CLICK -> NEXT TIME IN DAY / DRAG ****/
				if(!shiftPressed && !ctrlPressed){
					// This is a bit kludgy: movement < 5 px == No Movement!
					if( (Zoom == 1) || (Math.abs(mouseDownPos.X - pos.X) < 5 && Math.abs(mouseDownPos.Y - pos.Y) < 5)){
						// No movmt -> NextTimeInDay
						var i = document.getElementById("Time").selectedIndex;
						i = (i + 1) % times.length;
						document.getElementById("Time").options[i].selected   = true;
					}
					unfreezetip("ore "+document.getElementById("Time").value+"<br/>"+basetip);
				}

				/**** CTRL-SHIFT -> PREVIOUS TIME IN DAY ****/
				else if(shiftPressed && ctrlPressed){
					var i = document.getElementById("Time").selectedIndex;
					if (--i < 0) {
						i = (times.length - 1);
					}
					document.getElementById("Time").options[i].selected   = true;
					dirn = -1; // backwards;
					unfreezetip("ore "+document.getElementById("Time").value+"<br/>"+basetip);
					//alert(i);
				}


				break; // Case 1: -> LEFT BUTTON

			
			case 2:	// MID - was Previous time in day: Now Reset Zoom
			Zoom = 1.0;
			setSize();
			break;


			/* NOT NEEDED
			case 3:	// RIGHT - was BLIPspot
			alert("Use Ctrl-LeftClick for Parameter Value\nShift-LeftClick for PopUp");
			break;
			*/

			/* NO default: - We are not interested in any other Buttons! */

			}

			loadImage(dirn);

			if (E.preventDefault)
				E.preventDefault();
			E.returnValue = false;
			return false;		// Defeat normal contextmenu for Firefox
}

var txtPlace = "tip";

function writePopup()
{
			paramWindow = window.open('', "_blank", "resizable=yes,height=200,titlebar=no,scrollbars=yes" );
			paramWindow.focus();
			paramWindow.document.write("<html><head></head><body><pre>" + req.responseText + "</pre></body></html>");
}


/******************************************************
 * Check if param is implemented
 *
 * Returns true if not in list of unimplemented params
 ******************************************************/
function checkParam()
{
			var badParams = new Array();
			badParams[0]  = "";
			badParams[1]  = "press850";
			badParams[2]  = "press700";
			badParams[3]  = "press500";
			badParams[4]  = "boxwmax";
			badParams[5]  = "sounding1";
			badParams[6]  = "sounding2";
			badParams[7]  = "sounding3";
			badParams[8]  = "sounding4";
			badParams[9]  = "sounding5";
			badParams[10] = "sounding6";
			badParams[11] = "sounding7";
			badParams[12] = "sounding8";
			badParams[13] = "sounding9";
			badParams[14] = "sounding10";
			badParams[15] = "sounding11";
			badParams[16] = "sounding12";
			badParams[17] = "sounding13";
			badParams[18] = "sounding14";
			badParams[19] = "sounding15";
			badParams[20] = "topo" ;
			badParams[21] = "zblclmask" ;
			badParams[22] = "zsfclclmask" ;
			badParams[23]  = "press1000";
			badParams[24]  = "press950";

			for( i = 0; i < badParams.length; i++) 
				if( document.getElementById("Param").value === badParams[i])
					return "" ;

			var newParams = new Array();
			newParams[0]  = "wstar_bsratio";
			newParams[1] = "sfcwind" ;
			newParams[2] = "blwind" ;
			newParams[3] = "bltopwind" ;

			/* Identify the Vector Params */
			for( i = 0; i < newParams.length; i++){
				if( document.getElementById("Param").value === newParams[i]){
					if(document.getElementById("Param").value === "wstar_bsratio")
						return("wstar bsratio");
					if(document.getElementById("Param").value === "sfcwind")
						return("sfcwindspd sfcwinddir");
					if(document.getElementById("Param").value === "blwind")
						return("blwindspd blwinddir");
					if(document.getElementById("Param").value === "bltopwind")
						return("bltopwindspd bltopwinddir");
				}
			}
			return document.getElementById("Param").value ;
}

			
var req = false;
var responseText;

function doCallback(url, data)
{
			/************************************************/
			/* This stuff needed if running from file://... */
			/* DELETE THIS LINE TO INCLUDE
			try {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
			} catch (e) {
				alert("Permission UniversalBrowserRead denied.");
			}
			AND THIS */
			// End This stuff needed
			/************************************************/

			if (window.XMLHttpRequest) {
				try {
					req = new XMLHttpRequest();
				}
				catch (e) {
					req = false;
				}
			}
			else if (window.ActiveXObject) {
				// For Internet Explorer on Windows
				try {
					req = new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch (e) {
					try {
						req = new ActiveXObject("Microsoft.XMLHTTP");
					}
					catch (e) {
						req = false;
					}
				}
			}

			if (req) {
				req.onreadystatechange = processReqChange;
				try {
					req.open('POST', url, true);
				}
				catch (E){
					alert(E);
				}
				req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				req.send(data);
			}
			else  {
				document.println("Failed");
			}
}

function processReqChange()
{
			if (req.readyState == 4) { // only if req shows 'loaded'
				if (req.status == 200) { // only if 'OK'
					// alert("Response = \"" + req.responseText + "\"");
					if(txtPlace === "tip"){
						tipobj.innerHTML = req.responseText;
						// A rather horrible hack for 2-line responses
						if(req.responseText.lastIndexOf('\n') - req.responseText.indexOf('\n') > 1){
							tipobj.innerHTML = req.responseText.replace(/\n/, (document.getElementById("Param").value === "wstar_bsratio" ? " BS: ": " Dirn: ")); 
						}
						// alert("Tip text = " + tipobj.innerHTML);
					}
					else
						writePopup();
				}
				else {
					alert('There was a problem retrieving the XML data: ' + req.responseText);
				}
			}
}


/******************/
/* Which Browser? */
/******************/
var ns;
var ko;
var ie;
var op;

function whichBrowser()
{
			// alert("Browser = " + navigator.appName);
			ns = navigator.appName === 'Netscape' ;
			ie = navigator.appName === 'Microsoft Internet Explorer' ;
			ko = navigator.appName === 'Konqueror' ;
			op = navigator.appName === 'Opera' ;
			//alert (navigator.appName);
}


/** Event handler for mouse wheel event */
function wheel(event)
{
			
      var delta = 0;
      
      if (!canZoom) return; // do not zoom un-zoomable maps

			if (!event) /* For IE. */
				event = window.event;
			if (event.wheelDelta) { /* IE/Opera. */
				delta = event.wheelDelta/120;
				//alert("ie case. delta = " + delta);
				/** In Opera 9, delta differs in sign as compared to IE */
				if (window.opera)
					delta = -delta;
			} else if (event.detail) { /** Mozilla case. */
				/*
				 * In Mozilla, sign of delta is different than in IE.
				 * Also, delta is multiple of 3.
				 */
				delta = -event.detail/3;
        //alert("mozilla case. delta = " + delta);
			}
				
			/* Bug in FF < 3
			 * Correct values for clientX appear as screenX 
			 * See http://extjs.com/forum/showthread.php?t=20298
			 */
			if(ns && ffversion < 3){
				var eventCoords = {
					X: event.screenX,
					Y: event.screenY
				};
				//alert("ff version <3 "+event.screenX+" "+event.screenY);
			}
			else if(event.clientX){
				var eventCoords = {
					X: event.clientX,
					Y: event.clientY
				};
				//alert("event.clientX "+event.clientX+" "+event.clientY);
			}

			/* If delta is nonzero, handle it.
			 * delta > 0 if wheel was scrolled up,
			 * delta < 0 if wheel was scrolled down.
			 */

			if (delta) {
				oldZoom = Zoom;
				if (delta < 0){
					Zoom /= 1.05;
				if(Zoom < 1)
					Zoom = 1.0;
				}
				else{
					Zoom *= 1.05;
				}
				//alert("X="+eventCoords.X+" Y="+eventCoords.Y);
        zoomIt(eventCoords);				
			}

			/* Prevent default actions caused by mouse wheel */
			if (event.preventDefault)
				event.preventDefault();
			event.returnValue = false;
}


function zoomIt(coords)
{
			var	mapDiv;
			var	X, Y;
			

			unfreezetip(basetip);

			imgSiz = Number(document.getElementById("imgBox").style.height.replace(/px/, ""));
			imagesize = Number(mapObj.style.width.replace(/px/, ""));
			oldleft = oldleft - 830*(Zoom - oldZoom)/2;
			oldtop = oldtop - 830*(Zoom - oldZoom)/2;
			
/**      
			X = coords.X;
			Y = coords.Y;
			oldleft = Zoom * (oldleft - X) / oldZoom + X;
			oldtop  = Zoom * (oldtop  - Y) / oldZoom + Y;
			//alert("Zoom="+Zoom+"imgSiz="+imgSiz+" X="+X+" Y="+Y+" oldleft="+oldleft+" oldtop="+oldtop);

/*
			oldleft = (oldtop > 0 ? 0 : oldleft);			// Prevent moving Img too far L / R
			if(imgSiz < (imgHt - oldleft)){
				oldleft = imgHt - imgSiz ;
			}
			
			oldtop = (oldtop > 0 ? 0 : oldtop);			// Prevent moving Img too far U / D
			if(imgSiz < (imgHt - oldtop)){
				oldtop = imgHt - imgSiz ;
			}
*/
			
			if(Zoom == 1){	// Reset to centre posn;
				oldleft = 0;
				oldtop  = 0;
			}
			mapObj.style.left = oldleft + "px";
			mapObj.style.top  = oldtop + "px";
      mapObj.style.height   = Zoom * 830 + "px";
      mapObj.style.width    = Zoom * 830 + "px";
			//alert("W = " + mapObj.style.width + " " + Zoom + " * " + imgSiz);

}


/***************************/
/* Set Initial Image Size  */
/***************************/
function setSize()
{
			var newMap;
			var mapBox;
			var mapDiv;
//alert( "setsize");
			if (Zoom != 1.0)
				return;		// Don't mess with it if zoomed

/**
			// Deal with the Padding round the image
			if(ie){
				imgHt = document.body.offsetHeight - 44 ;
			}
			else {
				imgHt = window.innerHeight - 22;
			}
**/
      imgHt = 830;
      
			oldleft = 0;
			oldtop  = 0;

			mapBox = document.getElementById("imgBox");
			mapBox.style.left     = 0  + "px" ;
			mapBox.style.top      = 0  + "px";
			mapBox.style.height   = imgHt + "px";
			mapBox.style.width    = imgHt + "px";
			mapBox.style.overflow = "hidden" ;

			mapObj.style.height = imgHt + "px";
			mapObj.style.width  = imgHt + "px";
			mapObj.style.left   = 0  + "px";
			mapObj.style.top    = 0  + "px";
			mapObj.style.position = "absolute";


			/* Now do the Selectors */
/**
			tblHt = document.getElementById("selectors").offsetHeight;
			
			if( tblHt > imgHt ){
				document.getElementById("Param").size = 1;	// Set the number of Parameters visible
				document.getElementById("Time").size = 1;	// Set the number of Times visible
				document.getElementById("Day").size = 1;	// Set the number of Days visible
			}

			if( imgHt > origTblHt ){		// The big Tables will fit
				document.getElementById("Param").size = 15;	// Set the number of Parameters visible
				document.getElementById("Time").size = 8;	// Set the number of Times visible
				document.getElementById("Day").size = 8;	// Set the number of Days visible
			}
**/			

}


/********************/
/* Check if Archive */
/* 0 => normal      */
/* 1 => archive     */
/********************/
var archiveMode = 0;
var oldArchive = 0;
var oldArchiveDay;
var oldArchiveMonth;
var oldArchiveYear;
var oldDayIndex;

function isArchive()
{
			if((document.getElementById("archiveDay").value === "nope1")
				|| (document.getElementById("archiveMonth").value === "nope1")
				|| (document.getElementById("archiveYear").value === "nope1")){
				archiveMode = 0;
			}
			else
				archiveMode = 1;
}


function resetArchive()
{
			document.getElementById("archiveDay").options[0].selected = true;
			document.getElementById("archiveMonth").options[0].selected = true;
			document.getElementById("archiveYear").options[0].selected = true;
			doChange();
}



/*******************************/
/* CallBack from the selectors */
/*******************************/
function doChange()
{
      var donotload = false;

			if(document.getElementById("Param").value === "nope1" ) {
				return 0;		// Catch a stupid selection
			}

			/*  Descriptions */

			(document.getElementById("desc")).innerHTML = desc[document.getElementById("Param").selectedIndex] ;


			isArchive();
			unfreezetip(basetip);

			if( oldArchive == 0 && archiveMode == 1){	// Change to Archive mode
				oldDayIndex =  document.getElementById("Day").options.selectedIndex;
				document.getElementById("Day").options[document.getElementById("Day").options.selectedIndex].selected = false;
				document.getElementById("Day").disabled = true;
			}
			else if (oldArchive == 1 && archiveMode == 0){ // Change to Normal mode
				document.getElementById("Day").disabled = false;
				document.getElementById("Day").options[oldDayIndex].selected = true;
			}


			/* Clear saved images
			 * if changing to / from archiveMode,
			 * or Param or Day changes
			 */
			if(  (oldParam !== document.getElementById("Param").value)
				|| (oldDay !== document.getElementById("Day").value)
        || (oldRegion !== document.getElementById("region").value)
				|| (oldArchive !== archiveMode)
				|| (archiveMode
						&& (		oldArchiveDay 	!= document.getElementById("archiveDay").value
								||	oldArchiveMonth != document.getElementById("archiveMonth").value
								||	oldArchiveYear  != document.getElementById("archiveYear").value
							 )
					 )
				){
				for(i = 0; i < document.getElementById("Time").options.length; i++){
					Loaded[i] = false;
				}
			}
	      	  		// Set divs for zoom
          setDivs();
      		
			/* Reload Parm List if changed region*/

			if (oldRegion !== document.getElementById("region").value) {
			   
			   // reload par list
	      	RequestParameters(document.getElementById("region").value)
      
  	  		/* Reload Day List if changed region*/
  	  		RequestDays(document.getElementById("region").value);
  	  		
  	  		donotload = true;
  	  		



      }
    						

			/* Save current values, so can detect change */
			oldParam = document.getElementById("Param").value;
			oldDay = document.getElementById("Day").value;
      oldRegion = document.getElementById("region").value;
			oldArchive = archiveMode;
			oldArchiveDay = document.getElementById("archiveDay").value;
			oldArchiveMonth = document.getElementById("archiveMonth").value;
			oldArchiveYear  = document.getElementById("archiveYear").value;
			
			if (document.getElementById("Param").value.substr(0,8) == "sounding" ||
          document.getElementById("Param").value == "boxwmax" ||
          document.getElementById("Param").value.match("windgram")) {
        //canZoom = false;
        //reset zoom
        Zoom=1;
  			oldleft = 0;
  			oldtop  = 0;
  			mapObj.style.left = oldleft + "px";
  			mapObj.style.top  = oldtop + "px";
        mapObj.style.height   = Zoom * 830 + "px";
        mapObj.style.width    = Zoom * 830 + "px";
        //map_headerDiv.style.display = "none";
        map_footerDiv.style.display = "none";
      } else {
        canZoom = true;
        map_headerDiv.style.display = "inline";
        map_footerDiv.style.display = "inline";          
      }

			/* Load images */
			if(document.getElementById("Param").value.match("topo") ||
         document.getElementById("Param").value.match("windgram")
      ) {
				loadImage(0);
			}
			else {
			  if (!donotload)
 			  	loadImage(1); // forwards
			}
}

/************************************/
/* Load the Image, and the next one */
/************************************/

function loadImage(dirn)
{
			// Load image and next, depending on direction
			// -1 => backwards
			//  0 => neither
			//  1 => forwards

			var tIdx = document.getElementById("Time").selectedIndex;
			var tValue;
			var	imgURL;
			var	blipspotURL = "";


			var T = new Date();			// Instantiate a Date object; initialised to "Now"
			var str;

			tValue = document.getElementById("Time").options[tIdx].value;
			
			if(archiveMode){
				str = location.href.split("?")[0]
				+ "?" + "date="
				+ document.getElementById("archiveYear").value
				+ document.getElementById("archiveMonth").value
				+ document.getElementById("archiveDay").value
				+ ",param=" + document.getElementById("Param").value
				+ ",time=" + tValue; 
			}
			else {
				offset = document.getElementById("Day").selectedIndex;
				if(offset > 1){
					T.setDate(T.getDate() + offset - 1);
				}
				month = T.getMonth() + 1;
				if(month < 10)
					month = "0" + month;
				rasp_date = T.getDate();
				if(rasp_date < 10)
					rasp_date = "0" + rasp_date;
				year = T.getFullYear();
				// alert(date + "/" + month + "/" + year);
				str = location.href.split("?")[0]
				+ "?"
				+ "date=" + year + month + rasp_date
				+ ",param=" + document.getElementById("Param").value
				+ ",time=" + tValue; 
			}
			str = "<a href=" + str + ">" + "Page URL" + "</a>";
			//document.getElementById("Url").innerHTML = str;

			for( i = 0; i < 2; i++){
				if (Loaded[tIdx]) {
					tIdx = (tIdx + dirn) % times.length;
					if (tIdx < 0)
						tIdx = times.length - 1;
					continue;
				}
				tValue = document.getElementById("Time").options[tIdx].value;

				if(document.getElementById("Param").value === "topo"){
					imgURL = Server
						+ "type=UNDEFINEDcolor_topo.g2.png"
						;
				} else if (document.getElementById("Param").value.match("windgram")) {
					  imgURL =  Server 
							+ "type=WINDGRAMS"
							+ "&par="+document.getElementById("Param").value
							+ "&day="+document.getElementById("Day").value
							+ "&dummy="+(new Date()).getTime() //Cache Buster
              ;
							//alert(imgURL);
						blipspotURL = imgURL.replace("windgram", "blipspot");
						blipspotURL = blipspotURL.replace("WINDGRAMS", "BLIPSPOTS");
						//blipspotURL = blipspotURL.replace("png", "html");
						//alert(blipspotURL);
					
					} else {
					if(archiveMode == 1){
						imgURL = Server + "ARCHIVE/"
							+ "UK+0/"
							+ document.getElementById("archiveYear").value
							+ "/"
							+ document.getElementById("archiveYear").value
							+ document.getElementById("archiveMonth").value
							+ document.getElementById("archiveDay").value
							+ "/"
							;
							/*
							alert("archiveDate = " + document.getElementById("archiveYear").value + " "
							+ document.getElementById("archiveMonth").value + " " + document.getElementById("archiveDay").value);
							*/
					}
					else {
					
						imgURL =  Server 
							+ "FCST/"
							;
					}
					imgURL = Server
					    + "type=FCST"
							+ "&par="+document.getElementById("Param").value
							+ "&day="+document.getElementById("Day").value
							+ "&time="+tValue // + "lst.w2"
							+ "&region="+document.getElementById("region").value
							+ "&dummy="+(new Date()).getTime() //Cache Buster
              ;
							//alert(imgURL)
				}

				Pics[tIdx].src = imgURL;
				Loaded[tIdx] = true;
				
				if (dirn === 0)
					break;

				tIdx = (tIdx + dirn) % times.length;
				if (tIdx < 0)
					tIdx = times.length - 1;
			}
			//alert( "imgURL = " + Pics[document.getElementById("Time").selectedIndex].src);
			
     //alert("theMap.src = " + mapObj.src);
			//document.getElementById("theMap").src = imgURL;
			//document.getElementById("theMap").src = Pics[document.getElementById("Time").selectedIndex].src;
			mapObj.src = Pics[document.getElementById("Time").selectedIndex].src;
			map_headerObj.src = Pics[document.getElementById("Time").selectedIndex].src;
			map_footerObj.src = Pics[document.getElementById("Time").selectedIndex].src;
			if (blipspotURL == "") {
         iframeObj.style.display = "none";
      } else {
         iframeObj.src = blipspotURL;
         iframeObj.style.display = "inline";
      }
			
}

/**************************
 * badimage()             *
 * Put up a warning image *
 * if image not found etc *
 **************************/
function badImage()
{
			if(archiveMode)
				//document.getElementById("theMap").src = Server + "noArchive.png";
				alert("No Archive!");
			else
				//document.getElementById("theMap").src = Server + "noImage.png";
				alert("No Image!");
}

function badBlipspot()
{
  alert("noblipspot!");
	iframeObj.style.display = "none";
}



var skewTpopup = false;

function toggleSkewT()
{
			if(archiveMode){
				alert("SkewT PopUps not available for Archive!");
				return;
			}
			if(skewTpopup == false){
				document.getElementById("skewT").innerHTML = "Press for Parameter PopUp";
				skewTpopup = true;
			}
			else {
				document.getElementById("skewT").innerHTML = "Press for SkewT PopUp";
				skewTpopup = false;
			}
}
			

function RequestParameters(region)
  {
  par_xmlhttp=GetXmlHttpObject();
  if (par_xmlhttp==null)
    {
    alert ("Your browser does not support XML HTTP Request");
    return;
    }
  var url="http://www.ilpulcino.org/php/ajax.php?type=paras&region="+region+"&dummy="+(new Date()).getTime();
  par_xmlhttp.onreadystatechange=fillParameters;
  par_xmlhttp.open("GET",url,true);
  par_xmlhttp.send(null);
  }

function fillParameters()
  {
  if (par_xmlhttp.readyState==4)
    {
      // First insert parameters
  		fullSet = false;

  		var parsize = 0;

      soundingList=JSON.parse(par_xmlhttp.responseText);
      
      if (null == soundingList) return;
   
  		for (var i = 0; i < soundingList.length; i++) {
    			document.getElementById("Param").options[parsize] = new Option(soundingList[i][2], soundingList[i][1]);
    			document.getElementById("Param").options[parsize].className = soundingList[i][0];
    			desc[parsize] = soundingList[i][3];
    			
    			if (soundingList[i][1]=="hbl")
  			  document.getElementById("Param").options[parsize].selected  = true;	
    			
    			parsize++;
  		}
      if(document.getElementById("Param").options.length > parsize){
				for(i = parsize; i < document.getElementById("Param").length; i++){
					document.getElementById("Param").options[i] = null;
				}
			}
  		document.getElementById("Param").options.length = parsize;
      document.getElementById("Param").size = parsize;
      document.getElementById("desc").innerHTML = desc[document.getElementById("Param").selectedIndex] ;
      
			oldParam = document.getElementById("Param").value;


      setTimeout("loadImage(1)", 1000);      
      
    }
  }


function RequestDays(region)
  {
  day_xmlhttp=GetXmlHttpObject();
  if (day_xmlhttp==null)
    {
    alert ("Your browser does not support XML HTTP Request");
    return;
    }
  var url="http://www.ilpulcino.org/php/ajax.php?type=days&region="+region+"&dummy="+(new Date()).getTime();
  day_xmlhttp.onreadystatechange=fillDays;
  day_xmlhttp.open("GET",url,true);
  day_xmlhttp.send(null);
  }

function fillDays()
  {
  if (day_xmlhttp.readyState==4)
    {
    dayList=JSON.parse(day_xmlhttp.responseText);
    if (null == dayList) return;
    
    var day = document.getElementById("Day");	// save typing
		var parsize = 0;
		var selected = false;
		
		for (var i = 0; i < dayList.length; i++) {
		    day.options[parsize] = new Option(dayList[i][1], dayList[i][0]);
		    if (dayList[i][0] < 0) {
          day.options[parsize].className = "optionArchive";
        }
  			if (dayList[i][0] == 0) {
  			  day.options[parsize].selected    = true;	
  			  selected = true;
  			}
  			parsize++;
		}
		if (!selected)
		   day.options[parsize-1].selected    = true;
		   
    if(day.options.length > parsize){
			for(i = parsize; i < day.length; i++){
				day.options[i] = null;
			}
		}
		day.options.length = parsize;

		oldDay = document.getElementById("Day").value;
		
		// Set divs for zoom
    setDivs();

    }
  }

function GetXmlHttpObject()
{
if (window.XMLHttpRequest)
  {
  // code for IE7+, Firefox, Chrome, Opera, Safari
  return new XMLHttpRequest();
  }
if (window.ActiveXObject)
  {
  // code for IE6, IE5
  return new ActiveXObject("Microsoft.XMLHTTP");
  }
return null;
} 

function setDivs()
{
    var header;
    var footer;
    var index;
    /**
    switch(region)
    {
      case "ITALIA":
        header = 95;
        footer = 65;
        break;
      case "ITALIA_CN":
        header = 188;
        footer = 154;
        break;
      default:
        // Default values for square grid
        header = 68;
        footer = 53;
    }
    **/
    
    index = document.getElementById("Day").selectedIndex;
    header = dayList[index][2];
    footer = dayList[index][3];
    
    document.getElementById("map_header").style.height = header + "px";
    document.getElementById("map_footer").style.height = footer + "px";
    document.getElementById("map_footer").style.top = 830-footer + "px";
    document.getElementById("theMap_footer").style.top = -(830-footer) + "px";

}
