window.addEvent("domready",function(){
	setVvttttDates();
	enableCalendars();
	initTabs();
});

function initTabs() {
	var h;
	if(window.ie){
		h = "1500px";
	}else{
		h = "auto";
	}
	var vtabs = new mootabs('navTab', {
		height: h,
		width: "600px",
		changeTransition: "none"
	});
	
	var l = $("navTab").getElement(".prices");
	l.removeEvents("click");
	l.addEvent("click", function(){
		var url = "#TB_inline?height=500&width=600&inlineId=Vvtttt_div_Prices";
		TB_show("",url,false);
	});
}

function enableCalendars(){
	$E(".VvttttDate").getElements(".btn").each(function(el){
		var calID = parseInt(el.id.substr(4+el.id.lastIndexOf("_ctl")));
		showCalendar(el,cYear,cYear+1,aMinDate[calID],"Vvtttt_txtDate");  // <--
		var ddList = $E(".VvttttOption");
		if (calID==ddList.selectedIndex) {el.style.display="inline";} else {el.style.display="none";};
	});
	$E(".VvttttOption").addEvent("change", function(){
		var ddList = $E(".VvttttOption");
		$E(".VvttttDate").getElements(".yahooCalendarActive").each(function(el){
			var calID = parseInt(el.id.substr(4+el.id.lastIndexOf("_ctl")));
			if (calID==ddList.selectedIndex) {el.style.display="inline";} else {el.style.display="none";};
			// hide calendar if open:
			el.getNext().style.display = "none";
		});
		$("Vvtttt_txtDate").value = "";
	});
}

var aDateRange;
var aOption;
var aDayhash;
var aOptionDay;
var aBlockOut;
var aDaysInAdvance;
var aMinDate = new Array();
var cYear = (new Date()).getFullYear();
//var DRInvalid = new Array();
var aRangeHash;

function setVvttttDates(){
	aDateRange = $("Vvtttt_lblDateRanges").innerHTML.split("|");
	aDayhash = $("Vvtttt_lblDayhashes").innerHTML.split("|");
	aOptionDay = $("Vvtttt_lblOptionDays").innerHTML.split("|");
	aOption = $("Vvtttt_lblOptionText").innerHTML.split("|");
	aBlockOut = $("Vvtttt_lblBlockOut").innerHTML.split("|");
	aDaysInAdvance = $("Vvtttt_lblDaysInAdvance").innerHTML.split("|");
	aRangeHash = $("Vvtttt_lblRangeHash").innerHTML.split("|");
	invertRanges();
	setInvalidDOWs();
	setBlockOuts();
	setMinDates();
}
function invertRanges(){
	var tmpRange;
	var jT;
	var dStart;
	var dEnd;
	var tmpInvalid;
	var invalidDates;
	var t;
	var jR
	for(var iO=0;iO<aOption.length;iO++){
		invalidDates = "";
		tmpRange = new Array();
		jT = 0;
		for(var jH=0;jH<aRangeHash.length;jH+=2){
			if(aOptionDay[iO+jH*aOption.length/2]!=""){
				jR = 2 * aRangeHash[jH+1];
				tmpRange[jT++] = aDateRange[jR] + " " + aDateRange[jR+1];
			}
		}
		tmpRange.sort();
		dStart = cYear + "-01-01"; // next invalid date
		dEnd = (2+cYear) + "-12-31"; // last invalid date
		tmpInvalid = new Array();
		jT = 0;
		for(var jV=0;jV<tmpRange.length;jV++){
			if(dStart<tmpRange[jV].substr(0,10)) {
				tmpInvalid[jT++] = dStart + " " + addDays(-1,tmpRange[jV].substr(0,10));
			}
			if(dStart<=tmpRange[jV].substr(11,10)) {
				dStart = addDays(1,tmpRange[jV].substr(11,10));
			}
		}
		if(dStart<=dEnd){
				tmpInvalid[jT++] = dStart + " " + dEnd;
		}
		for(var jI=0;jI<tmpInvalid.length;jI++){
			t = tmpInvalid[jI];
			// convert ymd to mdy
			invalidDates += "|" + t.substr(5,2) + t.substr(8,2) + t.substr(0,4) + 
				"-" + t.substr(16,2) + t.substr(19,2) + t.substr(11,4);
		}
		DRInvalid[iO] = invalidDates;
	}
}
function setInvalidDOWs(){
	var invalidDates;
	var tmpDate;
	var hasValidDays;
	var tmpInvalid;
	var tmpValid;
	var iV;
	var iN;
	var iD;
	var jR;
	for /*each Option*/ (var iO=0;iO<aOption.length;iO++) {
		for /*each Day of Week*/(var mD=0;mD<7;mD++){
			invalidDates = "";
			hasValidDays = false;
			tmpInvalid = new Array();
			iN = 0;
			tmpValid = new Array();
			iV = 0;
			tmpDate = new Array();
			iD = 0;
			for /*each RangeHash*/(var jH=0;jH<aRangeHash.length;jH+=2){
				/*accumulate invalid days from available dateranges*/
				if(aOptionDay[iO+aOption.length*jH/2]!=""){
					jR = 2 * aRangeHash[jH+1]; 
					if/*day of week is valid*/(aDayhash[aRangeHash[jH]].substr(mD,1)!='.'){
						/*range of valid*/
						tmpValid[iV++] = aDateRange[jR] + " " + aDateRange[jR+1]; // - remove
						hasValidDays = true;
						tmpDate[iD++] = addDays(-1,aDateRange[jR]) + "A";
						tmpDate[iD++] = addDays(1,aDateRange[jR+1]) + "B";
					} else {
						/*range of invalid*/
						tmpInvalid[iN++] = aDateRange[jR] + " " + aDateRange[jR+1]; // - remove
						tmpDate[iD++] = aDateRange[jR] + "X";
						tmpDate[iD++] = aDateRange[jR+1] + "U";
					}
				}
			}
			if(!hasValidDays){
				/*set DOWInvalid[iO]*/
				if(!DOWInvalid[iO]) DOWInvalid[iO] = "";
				DOWInvalid[iO] += mD + "|";
			} else {
				/*set DRInvalid[iO]*/
				disableDates(iO,mD);
			}
		}
	}
	function /*internal*/ disableDates(iOption,iDayOfWeek){
		var nI = 0; // invalid intervals nesting level
		var nV = 0; // valid...
		var lastDate;
		var tmpItem;
		var itemType;
		tmpDate.sort();
		for/*each interval*/(var i=0;i<tmpDate.length;i++){
			tmpItem = tmpDate[i];
			itemType = tmpItem.substr(10,1);
			/*update counters*/
			if(itemType=="A") nV++;
			if(itemType=="B") nV--;
			if(itemType=="X") nI++;
			if(itemType=="U") nI--;
			/*if closed last valid or opened first invalid - store date*/
			if((itemType=="B" && nV==0 && nI>0)
			|| (itemType=="X" && nV==0 && nI==1)){
				lastDate = tmpItem.substr(0,10);
			}
			/*if closed last nested invelid or opened first valid - process interval*/
			if((itemType=="U" && nI==0 && nV==0)
			|| (itemType=="A" && nI>0 && nV==1)){
				createDRInvalid(iOption,iDayOfWeek,lastDate,tmpItem.substr(0,10));
			}
		}
	}
	function /**/ createDRInvalid(iOption,iDay,startDate,endDate){
		var InvalidDates = "";
		var tmpDate;
		var d = startDate;
		var t = endDate;
		var sD = new Date(d.substr(0,4),d.substr(5,2)-1,d.substr(8,2));
		var eD = new Date(t.substr(0,4),t.substr(5,2)-1,t.substr(8,2));
		var s = sD.valueOf();
		var e = eD.valueOf();
		var w = sD.getDay();
		var m = 86400000;
		var h = 3600000; /* 1 hour to fix date change at DST */
		var dh = aDayhash[aOptionDay[iO+jR*aOption.length/2]];
		var iW = iDay;
		var k = iW-w;
		if (k<0) k += 7;
		for /*each 7th day in Range*/(var jW=k*m+s+h;jW<=e+h;jW+=m*7){
			// condition can by improved by considering minDate, maxDate
			var x = new Date(jW);
			tmpDate = 100000000 + (x.getMonth()+1)*1000000 + x.getDate()*10000 + x.getFullYear();
			// to range of mdy
			invalidDates += "|" + tmpDate.toString().substr(1,8) + "-" + tmpDate.toString().substr(1,8);
		}
		DRInvalid[iO] += invalidDates;
	}
}
function setBlockOuts(){
	var invalidDates;
	var tmpDate;
	var t;
	for /*each Option*/ (var iO=0;iO<aOption.length;iO++) {
		invalidDates = "";
		for /*each Blockout*/(var jB=0;jB<aBlockOut.length;jB++) {
			//if/*between Min and Max dates*/(){
				t = aBlockOut[jB];
				if(t.length>=10){
					tmpDate = t.substr(5,2) + t.substr(8,2) + t.substr(0,4);
					invalidDates += "|" + t.substr(5,2) + t.substr(8,2) + t.substr(0,4) + 
						"-" + t.substr(16,2) + t.substr(19,2) + t.substr(11,4);
				}
			//}
		}
		DRInvalid[iO] += invalidDates;
	}
}
function setMinDates(){
	var invalidDates;
	var tmpDate = new Date();
	var t;
	var m = 86400000;
	for /*each Option*/ (var iO=0;iO<aOption.length;iO++) {
		t = new Date(tmpDate.valueOf() + m * aDaysInAdvance[iO]);
		aMinDate[iO] = (101+t.getMonth()).toString().substr(1,2) + "/" + (101+t.getDate()).toString().substr(1,2) + "/" + t.getFullYear();
	}
}

function addDays(n,d){
	var f = 86400000;
	var t = new Date(d.substr(0,4),d.substr(5,2)-1,d.substr(8,2));
	var k = new Date(t.valueOf()+f*n);
	var s = (k.getFullYear()*10000+(k.getMonth()+1)*100+k.getDate()).toString();
	return s.substr(0,4) + "-" + s.substr(4,2) + "-" + s.substr(6,2);
}

/*
2009-04-28: Traveler Names and Ages for Vvtttt Order
*/
var VvttttNames;
var VvttttAges;
var VvttttButton;
function buildVvttttNames(){
	VvttttNames = $E(".VvttttNames");
	VvttttAges = $E(".VvttttAges");
		var nContainer = VvttttNames.getPrevious();
		if(nContainer){
			if(nContainer.getTag()=="div"){
				nContainer.remove();
			}
		}
		nContainer = new Element("div");
		nContainer.addClass("names");
		nContainer.injectBefore(VvttttNames);
		VvttttButton = new Element("span");
		VvttttButton.addClass("i");
		VvttttButton.innerHTML = "&nbsp;"; // ie6 bug
		VvttttButton.injectInside(nContainer);
		var TravelerNames = VvttttNames.value.split("\t");
		var TravelerAges = VvttttAges.value.split("\t");
		var tmpAge;
		for (var jN = 0 ; jN < TravelerNames.length ; jN++ ){
			if(TravelerNames[jN].trim()!=""){
				tmpAge = "";
				if(TravelerAges[jN]) {
					tmpAge=TravelerAges[jN].trim();
				}
				createTraveler(TravelerNames[jN],tmpAge,"Delete");
			}
		}
		createTraveler("","","Add"); //,txtNames.hasClass('redborder'));
}
function createTraveler(sN,sA,sB) {
		var insertPoint = VvttttButton;
		var newName = new Element("input");
		newName.type = "text";
		newName.addClass("n");
		newName.value = sN;
		newName.addEvent("change",updateVvttttNames);
		var newAge = new Element("input");
		newAge.type = "text";
		newAge.addClass("a");
		newAge.value = sA;
		newAge.addEvent("change",updateVvttttNames);
		var newDelete = new Element("span");
		newDelete.addClass("x");
		newDelete.addEvent("click",removeVvttttName);
		newDelete.innerHTML = "&nbsp;"
		newName.injectBefore(insertPoint);
		newAge.injectBefore(insertPoint);
		newDelete.injectBefore(insertPoint);
		if (sB == "Add") {
			newDelete.setStyle("display","none");
		}
}
function updateVvttttNames(){
		var cbx = this;
		var isnumber = /^[0-9]+$/;
		if(cbx.value.trim()==""){
			alert("need name/age");
			cbx.addClass("alert");
		} else if(cbx.hasClass("a")&& !isnumber.test(cbx.value.trim())){
			alert("age shold be a number");
			cbx.addClass("alert");
		} else {
			cbx.removeClass("alert");
			cbx.removeClass("warning");
			// add new field if necessary
			var namefield;
			var agefield;
			if(cbx.hasClass("a")){
				agefield = cbx;
				namefield = cbx.getPrevious();
			} else {
				agefield = cbx.getNext();
				namefield = cbx;
			}
			var nextname = agefield.getNext().getNext();
			if(nextname.getTag()!="input" && agefield.value.trim()!=="" && namefield.value.trim()!=""){
				nextname.getPrevious().setStyle("display","inline");
				createTraveler("","","Add");
			} else if(agefield.value.trim()==""){
				agefield.addClass("warning");
			} else if(namefield.value.trim()==""){
				namefield.addClass("warning");
			}
			// need to rebuild names;
			refreshVvttttNames();
			// problem: if invalid names entered, old value not restored, so
			// invalid value CAN later be stored by editing some other field
		}
}
function removeVvttttName(){
		var cbx = this;
		var ta = cbx.getPrevious();
		var tn = ta.getPrevious();
		tn.remove();
		ta.remove();
		cbx.remove();
		// need to rebuild all names;
		refreshVvttttNames();
}
function refreshVvttttNames(){
	var Names = new Array();
	var Ages = new Array();
	var jC = 0;
	var ct = VvttttButton.getParent().getFirst();
	while(ct.getTag()=="input"){
		Names[jC] = ct.value.trim();
		ct = ct.getNext();
		Ages[jC++] = ct.value.trim();
		ct = ct.getNext().getNext();
	}
	VvttttNames.value = Names.join("\t");
	VvttttAges.value = Ages.join("\t");
}
window.addEvent('domready',function(){
	buildVvttttNames();	
});

