var cad; // array which holds all date ranges for all regions (c_rd objects)
var cd; // array which holds all dates to display, each with an availablilty setting (c_date objects)
var cr = -1; //region
var cm = -1; //month
var cy = -1; //year
var cmin = -1; //min date
var cmax = -1; //max date
var cby = 0; //year addition
var cbdi = "block"; // display type
var cbh = "pointer";
var firstSelect = true;

//region dates (region,startdate,enddate,days,flexi)
function c_rd (r,s,e,d,f) {
	this.r = r;
	this.s = new Date(parseInt("20" + s.substr(4,2)),s.substr(2,2)-1,s.substr(0,2));
	this.e = new Date(parseInt("20" + e.substr(4,2)),e.substr(2,2)-1,e.substr(0,2));
	this.d = d;
	this.f = f;
}

//split region data
function c_srd () {
	if (navigator.appName == "Netscape") {
		cby = 1900;
		cbdi = "hello";
	}
	cad = new Array();
	for (var i = 0; i < ((cfeed.length) / 16); i++) {
		var ctmp = cfeed.substr((i * 16),16);
		cad[cad.length] = new c_rd(ctmp.substr(0,2),ctmp.substr(2,6),ctmp.substr(8,6),ctmp.substr(14,1),ctmp.substr(15,1));
	}
	
	//works out the complete date range
	var cnow = new Date();
	if ((cmin == -1) && (cmax == -1)) {
		cmin = 1;
		cmax = 1;
		for (var i = 0; i < cad.length; i++) {
			if (cmin == 1) {
				cmin = new Date((cad[i].s.getYear() + cby),cad[i].s.getMonth(),cad[i].s.getDate());
			}
			else if (cmin > cad[i].s) {
				cmin = new Date((cad[i].s.getYear() + cby),cad[i].s.getMonth(),cad[i].s.getDate());
			}
			
			if (cmax == 1) {
				cmax = new Date((cad[i].e.getYear() + cby),cad[i].e.getMonth(),cad[i].e.getDate());
			}
			else if (cmax < cad[i].e) {
				cmax = new Date((cad[i].e.getYear() + cby),cad[i].e.getMonth(),cad[i].e.getDate());
			}
		}
		
		//restricts to only future dates
		if (cmin < cnow) {
			cmin = cnow;
		}
	}
	
	c_g();
}

//date object (date, available - 0=unavailabe, 1=available, flex/nightly - 1=true)
function c_date (d,a,f) {
	this.d = d;
	this.a = a;
	this.f = f;	
}


// find first available month
function c_first(r) {
	var cdate = new Date();
	for (var i=0;i<24;i++) {
		if (i != 0) cdate.setMonth(cdate.getMonth() + 1);
		if (c_l (r, cdate.getMonth()+1, cdate.getFullYear())) {
			cm = cdate.getMonth()+1;
			cy = cdate.getFullYear();
			c_r(r);
			break;
		}
	}
}

//load calendar data (region id)
function c_l (r, m, y) {
	
	var cnow = new Date();
	//get date ranges for current region(s)
	var crd = new Array();
	r = "," + r + ",";
	for (var i = 0; i < cad.length; i++){
		if (r.indexOf("," + cad[i].r + ",") > -1 || r == ",-1," || r == ",-01," || r == ",-2," || r == ",-02," || r == ",-3," || r == ",-03," || r == ",-4," || r == ",-04," || r == ",-5," || r == ",-05,") {
			crd[crd.length] = cad[i];
		}
	}
	
	//creates array of all dates in current month
	cd = new Array();
	for (var i = 1; i < ((32 - (new Date(y,(m-1),32)).getDate()) + 1); i++) {
		cd[cd.length] = new c_date(new Date(y,(m-1),i),0,0);
	}
	
	var seld = document.getElementById('dep_date').value;		// Selected
	var selavail = monthavail = false;

	//iterate through date ranges to apply availablity
	for (var i = 0; i < cd.length; i++) {
		//restricts to not past dates
		for (var j = 0; j < crd.length; j++) {
			if ((cd[i].d <= crd[j].e) && (cd[i].d >= crd[j].s) && cd[i].d > cnow && cd[i].d <= cend) {
				if (crd[j].d == cd[i].d.getDay()) {
					cd[i].a = 1;
					monthavail = true;
					cd[i].f = crd[j].f;
					if (seld.split("/").length == 3 && cd[i].d.getDate() == seld.split("/")[0] && cd[i].d.getMonth() == (seld.split("/")[1]-1) && cd[i].d.getFullYear() == seld.split("/")[2]) {
						selavail = true;
					}					
				}
			}
		}
	}

	if (!selavail && document.getElementById('dep_date').value != "") {
		document.getElementById('dep_date').value = "";
		document.getElementById('cc').style.display = "none";
		showHideCal("show");
	}
	
	return monthavail;
	
}


//reloads the calendar (for a specific region
function c_r (r) {
	//if no date is set, loads for today
	if (cm == -1) {
		var cnow = new Date();
		cm = cnow.getMonth() + 1;
		//cy = (cnow.getYear() + cby);
		cy = cnow.getFullYear();
	}
	c_l(r,cm,cy);
	c_u(r,cm,cy);
	cr = r;
}

//calendar update (region, month, year)
function c_u (r,m,y) {
	
	var cselmy = document.getElementById('cselmy');
	
	if (cd.length == 0) {
		window.alert("no dates found");
	}
	else {
		// cd contains objects of type cd (date, active)

		cm = m;
		cy = y;
		var seld = document.getElementById('dep_date').value;		// Selected

		//clear all cells
		for (var i = 1; i < 7; i++) {
			for (var j = 0; j < 7; j++) {
				document.getElementById("c" + i + j).innerHTML = " ";
			}
		}
		
		//blanks out spaces that are not dates (at the start)
		for (var i = 0; i < 7; i++) {
			document.getElementById("c1" + i).innerHTML = '<div class="csnd">&nbsp;</div>'; 
		}

		//loop over dates for month
		var cw = 1;
		for (var i = 0; i < cd.length; i++) {
			//increment week counter if its sunday
			if ((cd[i].d.getDay() == 0) && (i > 0)) {
				cw++;
			}
			
			//create date event
			var ce;
			
			// Today
			var cnow = new Date();
			var cstd = '';
			if (cd[i].d.getDate() == cnow.getDate() && cd[i].d.getMonth() == cnow.getMonth() && cd[i].d.getYear() == cnow.getYear()) {
				cstd = ' cstd';
			}
			
			if (seld.split("/").length == 3 && cd[i].d.getDate() == seld.split("/")[0] && cd[i].d.getMonth() == (seld.split("/")[1]-1) && cd[i].d.getYear() == seld.split("/")[2]) {
				cstd = ' cssel';
			}

			if (cd[i].a == 1) {
				//avaliable
					ce = ' class="csa' + cstd + '" onMouseOver="this.style.cursor=\'' + cbh + '\';" onClick="c_s(' + i + ')"';
			}
			else {
				//unavailable
				ce = ' class="csu' + cstd + '" onMouseOver="this.style.cursor=\'default\'"';
			}
			//display day
			document.getElementById("c" + cw + cd[i].d.getDay()).innerHTML = '<div' + ce + '>' + cd[i].d.getDate() + '</div>';
		}

		//display all week rows - incompatible with Opera
		//for (var i = 0; i < 6; i++) {
		//	document.getElementById("c" + (i + 1)).style.display = cbdi;
		//}

		//hides unused rows
		//for (var i = cw; i < 6; i++) {
		//	document.getElementById("c" + (i + 1)).style.display = "none";
		//}

		//blanks out extra days in row
		for (var i = (cd[cd.length-1].d.getDay() + 1); i < 7; i++) {
			document.getElementById("c" + cw + i).innerHTML = '<div class="csnd">&nbsp;</div>'; 
		}

		var cpm = (cm - 1);
		var cpy = cy;
		if (m == 1) {
			cpm = 12;
			cpy = cy - 1;
		}
	
		var cnm = (cm + 1);
		var cny = cy;
		if (m == 12) {
			cnm = 1;
			cny = cy + 1;
		}
	
		document.getElementById('cselmy').value = cpad(m) + "_" + y;

		var cpme = ' class="cshd" style="padding-top:4px;height:17px" onMouseOver="this.style.cursor=\'default\'"';

		if (cselmy.selectedIndex != 0) {
			cpme = ' class="csc" onMouseOver="this.style.cursor=\'' + cbh + '\'" onClick="c_pm();"';
		}
		
		var cnme = ' class="cshd" style="padding-top:4px;height:17px" onMouseOver="this.style.cursor=\'default\'"';

		if (cselmy.selectedIndex+1 < cselmy.options.length) {
			cnme = ' class="csc" onMouseOver="this.style.cursor=\'' + cbh + '\'" onClick="c_nm();"';
		}

		document.getElementById("cprevmonth").innerHTML = '<div' + cpme + '>&lt;</div>';
		document.getElementById("cnextmonth").innerHTML = '<div' + cnme + '>&gt;</div>';
	}
}


//display title items

function c_pm () {
	var cpm = (cm - 1);
	var cpy = cy;
	if (cm == 1) {
		cpm = 12;
		cpy = cy - 1;
	}
	c_l(cr,cpm,cpy);
	c_u(cr,cpm,cpy);
}


function c_nm () {
	var cnm = (cm + 1);
	var cny = cy;
	if (cm == 12) {
		cnm = 1;
		cny = cy + 1;
	}
	c_l(cr,cnm,cny);
	c_u(cr,cnm,cny);
}

function c_smy() {
	cselmy = document.getElementById('cselmy');
	var my = cselmy.options[cselmy.selectedIndex].value;
	var m = parseFloat(my.split("_")[0]);
	var y = parseFloat(my.split("_")[1]);
	c_l(cr,m,y);
	c_u(cr,m,y);
}

//calendar select
function c_s (i) {
	document.getElementById('dep_date').value = cpad(cd[i].d.getDate()) + "/" + cpad(cd[i].d.getMonth() + 1) + "/" + cd[i].d.getFullYear();
	qsGetDuration(cr, cd[i].d, cd[i].f); // populate duration
	showHideCal('hide');
	c_u (cr,cm,cy);
}

function cpad(n) {
	if (n < 10 && (n+'').length == 1) return "0" + n; else return n;
}

//calendar go
function c_g () {
	document.getElementById("cmon").innerHTML = cdays[0];
	document.getElementById("ctue").innerHTML = cdays[1];
	document.getElementById("cwed").innerHTML = cdays[2];
	document.getElementById("cthu").innerHTML = cdays[3];
	document.getElementById("cfri").innerHTML = cdays[4];
	document.getElementById("csat").innerHTML = cdays[5];
	document.getElementById("csun").innerHTML = cdays[6];
} 