var currentGPOffset = 0;
var currentSessionOffset = 0;
var previousGPOffset = 0;
var clockMode = 0;
var now,nowfudge;
var SEASON_ENDED = false;

function QueryString(key) {
	var value = null;
	for (var i=0;i<QueryString.keys.length;i++) {
		if (QueryString.keys[i] == key) {
			value = QueryString.values[i];
			break;
		}
	}
	return value;
}

//
QueryString.keys = new Array();
QueryString.values = new Array();

function QueryString_Parse() {
	var query = window.location.search.substring(1);
	var pairs = query.split("&");
	for (var i=0;i<pairs.length;i++) {
		var pos = pairs[i].indexOf('=');
		if (pos >= 0) {
			var argname = pairs[i].substring(0,pos);
			var value = pairs[i].substring(pos+1);
			QueryString.keys[QueryString.keys.length] = argname;
			QueryString.values[QueryString.values.length] = value;
		}
	}
}

//
QueryString_Parse();	

function getNow() {
	now = new Date();
	if (QueryString("CURRENT_DATE") != null) {
		var querystring_current_date = unescape(QueryString("CURRENT_DATE").replace(/-/g, "/").replace(/\+/g," ")) + " GMT";
		if (nowfudge == null) {
			setInterval( "window.status = now.toUTCString()", 1000 );
			nowfudge = now - new Date(querystring_current_date);
		}
		now.setTime(now.getTime() - nowfudge );
		now.setTime(now.getTime() + ((0 * 24 + 0) * 60 + 0) * 60 * 1000);
	}	
}		


function GPArrayItem(id, t, ci, co, d) {
	this.sessions = new Array();
	this.urls = new Array();
	this.id = id;
	this.offset = t;
	this.circuitname = ci;
	this.countryname = co;
	this.daterange = d;
	return this;
}

function GPSArrayItem(s, d, l, bGP, c) {
	this.session = s;
	this.start = new Date(d);
	this.end = new Date;
	this.end.setTime(this.start.getTime() + l * 60 * 1000);
	this.countdown = new Date(0);
	this.scountdown = new Date(0);
	this.inProgress = false;
	this.isComplete = c;
	this.isGP = bGP;
	return this;
}

function GPCurrent() {
	return new findGPCurrent();
}

function findGPCurrent() {
	var gp,s,gps,ss;
	var ret = this;
	
	gp = grand_prix[currentGPOffset]
	gps = gp.sessions;
	ss = gps[gps.length-1];
	previousGPOffset = currentGPOffset;
	currentSessionOffset = 0;

	ret.isComplete = false;
	
    for (; currentSessionOffset < gps.length; currentSessionOffset++) {
    	s = gps[currentSessionOffset];
        if (s.start > now) {
	        ret.inProgress = false;
	        ret.afterRace = false;
	        break;
        }
        else if (s.end >= now) {
			ret.isComplete = s.isComplete;
			ret.inProgress = true;
	        ret.afterRace = false;
	        break;
        }
        else if (s.isGP == true) {
			ret.isComplete = true;
	        ret.inProgress = false;
	        ret.afterRace = true;
	        //console.log("Is After Race");
	        break;
       }
    }

    ret.id = gp.id;
	ret.offset = gp.offset;
	ret.session = s.session;
	ret.start = s.start;
	ret.end = s.end
	ret.isGP = s.isGP;
	ret.countdown = new Date(ss.start - now);
	ret.scountdown = new Date(s.start - now);
	ret.circuitname = gp.circuitname;
	ret.countryname = gp.countryname;
	ret.daterange = gp.daterange;
	return this;
}


function getElement(o) {
	return MM_findObj(o);
	if (document.getElementById)
		return document.getElementById(o);
	else if (document.all)
		return document.all[o];
}

function setVisibility(o,b) {
	v = getElement(o);
	if (v == null) return;
	v = v.style
	var s = (b)?"":"none";
	if (v.display != s)
		v.display = s;
}

function SetTime(sID, iTime) {
	if (sID == 'days' && iTime < 100) {
		SetHTML(sID, '0' + iTime);
	} else if (iTime < 10) {
		SetHTML(sID, '0' + iTime);
	} else {
		SetHTML(sID, iTime);
	}
}

function SetHTML(sID, sText) {
	if ($(sID)) {
		$(sID).innerHTML = sText;
	}
}

function ApplyLinks(liID, ahrefID, sURL){
    if ($(liID) && $(ahrefID)){
        $(liID).style.display="";       
        $(ahrefID).href=sURL;
    }   
}

function updateClock() {
	getNow();
	
    $("clockCurrentRace").setStyle('display', '');
    //$("clockSubItem").setStyle('display', '');
    
	if (SEASON_ENDED) {	
		// stop countdown at end of season
		$("clockCurrentRace").setStyle('display', 'none');
		setVisibility("raceon", false);
		setVisibility("endseason", true);
		setVisibility("countdown", false);
		clockMode = 3;
	} else {
	    var gp = GPCurrent();	
		if (gp)	{
			do {
				y = gp.scountdown.getUTCSeconds();
				SetTime('seconds', y);
				n = Math.floor(y / 10);
				if ( n != 5 && clockMode == 1 ) break;					
				
				y = gp.scountdown.getUTCMinutes();
				SetTime('minutes', y);
				n = Math.floor(y / 10);
				if ( n != 5 && clockMode == 1 ) break;

				y = gp.scountdown.getUTCHours();
				SetTime('hours', y);

				y = Math.floor(gp.scountdown.getTime() / (24*3600000));
				SetTime('days', y);
			} while(0);

			$('session_name').innerHTML = gp.session.toUpperCase() + "";
			
			if (gp.inProgress && !gp.isComplete) {
				if (clockMode != 2) {
					setVisibility("raceon", true);
					setVisibility("endseason", false);
					setVisibility("countdown", false);
					setVisibility("sessionNameHolder", false);
					setVisibility("sleeping", false);
					setVisibility("raceonlink", true);
					setVisibility("weather", false);
					setVisibility("clockSubItem", false);
					clockMode = 2;
				}
			} else if ((gp.afterRace) || (gp.inProgress && gp.isComplete)) {
				if (clockMode != 4) {
					setVisibility("raceon", false);
					setVisibility("endseason", false);
					setVisibility("countdown", false);
					setVisibility("sessionNameHolder", false);
					setVisibility("sleeping", true);
					setVisibility("raceonlink", false);
					setVisibility("weather", false);
					setVisibility("clockSubItem", false);
					clockMode = 4;
				}
			} else {
				if (clockMode != 2) {
					setVisibility("raceon", true);
					setVisibility("endseason", false);
					setVisibility("countdown", false);
					setVisibility("sessionNameHolder", false);
					setVisibility("sleeping", false);
					setVisibility("raceonlink", true);
					setVisibility("weather", false);
					setVisibility("clockSubItem", false);
					clockMode = 2;
				}
				var x, y, n;
				if (clockMode != 1) {
					setVisibility("raceon", false);
					setVisibility("endseason", false);
					setVisibility("countdown", true);
					setVisibility("sessionNameHolder", true);
					setVisibility("sleeping", false);
					setVisibility("raceonlink", false);
					setVisibility("weather", true);
					setVisibility("clockSubItem", true);
				}
				clockMode = 1;
			}
		} else {	
			if (clockMode != 3) {
				setVisibility("raceon", false);
				setVisibility("endseason", true);
				setVisibility("countdown", false);
				setVisibility("sessionNameHolder", false);
				setVisibility("sleeping", false);
				setVisibility("raceonlink", false);
				setVisibility("weather", false);
				setVisibility("clockSubItem", false);
			}
			clockMode = 3;
		}
	}

	setTimeout("updateClock()", 1001 - (new Date()).getMilliseconds());
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function EndOfTheDay(d)
{
	return new Date(Date.UTC(2000 + (d.getYear()%100), d.getMonth(), d.getDate()+1))
}

window.addEvent('load', getNow);
window.addEvent('load', updateClock);
