/* <dtml-var "enableHTTPCompression(request=REQUEST, debug=1, js=1)"> (this is for http compression) */

/*
<dtml-let last_modified="_.DateTime()-14"
expires="_.DateTime()+7" >
<dtml-call "REQUEST.RESPONSE.setHeader( 'Content-Type', 'text/javascript' )">
<dtml-call "REQUEST.RESPONSE.setHeader( 'Last-Modified', last_modified.toZone('GMT').rfc822() )">
<dtml-call "REQUEST.RESPONSE.setHeader( 'Cache-Control', 'max-age=36000, must-revalidate' )">
<dtml-call "REQUEST.RESPONSE.setHeader( 'Expires', expires.toZone('GMT').rfc822() )" >
</dtml-let>
*/

function $(id) { return document.getElementById(id); }

function getXmlHttpRequest() {
    var ajaxobject = null;
    if ( window.XMLHttpRequest ) {
        // Objet XmlHttpRequest pour les moteurs GECKO
	ajaxobject = new XMLHttpRequest();   
    } else if ( window.ActiveXObject ) {
        // Objet XmlHttpRequest pour Internet Explorer
	ajaxobject = new ActiveXObject( 'Microsoft.XMLHTTP' );   
    } else {
        // Navigateur non-compatible
        ajaxobject = null;
    }
    return ajaxobject
}
var xhReq = getXmlHttpRequest();

function showPeriodicityResult(url, alt_url, target_id, form_id, waiting_text) {
    ajaxobject = getXmlHttpRequest();
    
    form = document.getElementById(form_id);
    periodicity_type = getPeriodicityType(form);
    periodicity_end_date = form['periodicity_end_date'].value;
    periodicity_variable = form['periodicity2_x'].value;

    query = getPeriodicityQuery(periodicity_type, periodicity_end_date, periodicity_variable);
    url = url + query + "&d=" + (new Date()).getTime();
    alt_url = alt_url + query;

    // Opera does not support ajax
    if (ajaxobject == null) {
        window.location = alt_url;
    } else {
        var node = document.getElementById(target_id);
        node.innerHTML = waiting_text;
        ajaxobject.open('GET', url, true);
        ajaxobject.onreadystatechange = function() {CallBackGenerateAjaxHTML(ajaxobject, target_id);}
        ajaxobject.send(null);
    }
}

function getPeriodicityQuery(periodicity_type, periodicity_end_date, periodicity_variable) {
    query = '&periodicity_type=' + periodicity_type_value + '&periodicity_end_date=' + periodicity_end_date
    if (periodicity_variable != null) {
        query = query + '&periodicity_variable=' + periodicity_variable;
    }
    return query
}

function getPeriodicityType(form) {
    periodicity_type = form['periodicity_type'];
    periodicity_type_value = null;
    for (i = 0; i < periodicity_type.length; i++) {
        obj = periodicity_type[i];
        if (obj.checked == true) {
            periodicity_type_value = obj.value;
        }
    }
    return periodicity_type;
}

function CallBackGenerateAjaxHTML(ajaxobject, target_id) {
    if (ajaxobject.readyState == 4) {
        if (ajaxobject.status > 299 || ajaxobject.status < 200) {
            return;
        }
        elem = document.getElementById(target_id);
        elem.innerHTML = ajaxobject.responseText;
    }
}


function gotoBookingUrl(base_url, ts, dmode, dview, btype, bcategory) {
		var url = base_url + '?ts=' + ts + '&dmode=' + dmode + '&dview=' + dview;
		
		if (btype) {
			url += '&btype=' + btype;	
		}
		
		if (bcategory) {
			url += '&bcategory=' + bcategory;
		}
		
    window.location = url;
}


/* Create bookings one by one from the periodicity results and display a progress bar  */	    
function createThoseBookings(url) {
	var progressBar = document.getElementById("bookingProgressbar");		
	var lstBookings = document.getElementById("lstBookings");
	var bookings = lstBookings.getElementsByTagName("input");
	var createBookings = document.getElementById("createBookings");
	lstBookings.style.display = "none";
	createBookings.style.display = "none";
	progressBar.parentNode.style.display = "block";
	document.location.href = document.URL.split('#')[0] + "#secondStep";
	
	var xhReq; var index = 0; var nbBooked = 0; var nbAlreadyBooked = 0;
	var getResponse = function () {
		if (xhReq.readyState != 4)
			return null;
		if (xhReq.responseText == "OK")
    			++nbBooked;
    		if (xhReq.responseText == "NOK")
    			++nbAlreadyBooked;
		var percentage = Math.round(100 * ++index / bookings.length) + "%";
		progressBar.firstChild.style.width = percentage;
		progressBar.lastChild.firstChild.data = percentage;
			if (index == bookings.length) {
				var doneButton = document.getElementById("goto-booking");
				var bookingsDone = document.getElementById("bookingsDone");
				var txt = bookingsDone.firstChild.data;
				txt = txt.replace('%created%', nbBooked);
				txt = txt.replace('%already_booked%', (nbAlreadyBooked));
				txt = txt.replace('%errors%', (bookings.length - (nbBooked + nbAlreadyBooked)))
				bookingsDone.firstChild.data = txt;
				bookingsDone.style.display = "block";
				doneButton.style.display = "block";				
				return null;
			}
		sendRequest(index);
	}
	var sendRequest = function() {
		var ts = bookings[index].value.split("_");
		var parameters = "start_ts=" + ts[0] + "&end_ts=" + ts[1] + "&d=" + (new Date()).getTime();
		xhReq = getXmlHttpRequest();
    		xhReq.open('GET', url + "?" + parameters , true);    		
    		xhReq.onreadystatechange = getResponse;
		xhReq.send(null);
	}
	sendRequest();
}


function modifyStatusOnThoseBookings(container_url, here_id, action, all) {
	var progressBar = document.getElementById("bookingProgressbar");		
	var lstBookings = document.getElementById("lstBookings");
	var bookings = lstBookings.getElementsByTagName("input");
	lstBookings.parentNode.parentNode.style.display = "none";
	progressBar.parentNode.style.display = "block";
	document.location.href = document.URL.split('#')[0] + "#progressBarAnchor";
	
	// Get booking ids 
	var booking_ids = new Array();
	for (var i=0; i < bookings.length; i++) 
		if (bookings[i].name == 'ids:list') {
			booking_id = bookings[i].value;
			booking_checked = bookings[i].checked ? true : false;
			
			if (all || booking_checked) {
				booking_ids.push(booking_id);
			}
	}
	
	if (all) {
		booking_ids.push(here_id);
	}
	
	var xhReq; 
	var index = 0; 
	var nbProcessed = 0;
	var nbTotal = booking_ids.length;

	var getResponse = function () {
		if (xhReq.readyState != 4)
			return null;
		if (xhReq.status == 200)
    		++nbProcessed;
		var percentage = Math.round(100 * ++index / nbTotal) + "%";
		progressBar.firstChild.style.width = percentage;
		progressBar.lastChild.firstChild.data = percentage;
		if (index == nbTotal) {
	    		var doneButton = document.getElementById("goto-booking");
	    		if (all && action == 'cancel') {
	    			doneButton = document.getElementById("goto-bookableobject");
	    		}
			var bookingsDone = document.getElementById("bookings-done");
			var txt = bookingsDone.firstChild.data;
			txt = txt.replace('%processed%', nbProcessed);
			txt = txt.replace('%errors%', (nbTotal - nbProcessed));
			bookingsDone.firstChild.data = txt;
			bookingsDone.style.display = "block";
			doneButton.style.display = "block";
			return null;
		}
		sendRequest(index);
	}
	var sendRequest = function() {
		var booking_id = booking_ids[index];
		var parameters = "?d=" + (new Date()).getTime();
		xhReq = getXmlHttpRequest();
    		xhReq.open('GET', container_url + "/" + booking_id + "/content_status_modify?workflow_action=" + action, true);
    		xhReq.setRequestHeader("raiseError", "False");
    		xhReq.onreadystatechange = getResponse;
		xhReq.send(null);
	}
	sendRequest();	
}


function sendAjaxRequest(query, func) {
	if (	isSendingRequest) {
		xhReq.onreadystatechange = function () {}
	 	xhReq.abort();		 	
	}
	isSendingRequest = true;	
	xhReq.open('GET', query, true);
	xhReq.setRequestHeader("raiseError", "False");
	xhReq.onreadystatechange = function() {
		if (xhReq.readyState != 4) return null;		
		func();
		xhReq.onreadystatechange = function () {}
	 	xhReq.abort();
	 	isSendingRequest = false;
	};
	xhReq.send(null);
}

/* 
	Info Popup when mouse is over a booking cell in the calendar view 
*/
var isSendingRequest = false;


/*
	Ajax function to retract this booking
*/
function deleteBooking(booking_url) {
	query = booking_url + '/content_status_modify?workflow_action=cancel';
	sendAjaxRequest(query,
		function() {
			if (xhReq.readyState != 4) return null;		
			applyToBooking(booking_url, function(itm) {
				cell = itm.parentNode;
				if (itm.className == 'BookingThumb' || cell.nodeName == 'SPAN') {
					cell.parentNode.removeChild(cell);
					cell = null;
				} else 
					cell.removeChild(itm);
				if (cell && !cell.getElementsByTagName('A').length) {
					var currentPath = document.location.href.match(/.*\//)[0];
					ts = cell.getElementsByTagName('INPUT')[0].value.split(':');
					link = document.createElement('A');
					link.innerHTML = '+';
					link.href = currentPath + 'plonebooking_add_form?start_ts='+ts[0]+'&end_ts='+ts[1];
					cell.appendChild(link);
				}
			});
		}
	);
	closeBookingPopup();
}

/*
	ajax function to validate booking
*/
function validateBooking(booking_url) {
	query = booking_url + '/content_status_modify?workflow_action=book';
	sendAjaxRequest(query,	
		function() {
			if (xhReq.readyState != 4) return null;
			applyToBooking(booking_url, function(itm) { itm.className = 'booking-booked'; });
		}
	);
	closeBookingPopup();
}

/*
	apply the same function on every booking cell in the calendar view
*/
function applyToBooking(booking_url, func) {
	var calendar_node = $('bookingCalendar');
	if (!calendar_node) return;
	var expected_url = 'javascript:popupBooking(\'' + booking_url + '\')';
	var a_nodes = calendar_node.getElementsByTagName('a');
	for (var i=0; i<a_nodes.length; i++) {
		var a_node = a_nodes[i];
		if (a_node.href == expected_url) {
			func(a_node);
		}
	}
}

/*
	Modify booking link : Use javascript if possible
*/

function initializeBookingCalendarView() {
	var calendar_node = $('bookingCalendar');
	if (!calendar_node) return;
	var a_nodes = calendar_node.getElementsByTagName('a');

	for (var i=0; i<a_nodes.length; i++) {
		var a_node = a_nodes[i];
		if (a_node.className == 'booking-pending'
			|| a_node.className == 'booking-booked'
			|| a_node.className == 'BookingThumb') {
			var new_url = 'javascript:popupBooking(\'' + a_node.href + '\')';
			a_node.href = new_url;
		}
	}
	
	// Initialize popup
	/*
	var booking_popup_node = $('booking-popup');
	
	if (!booking_popup_node) {
		var booking_popup_node = document.createElement('div');
		booking_popup_node.id = 'booking-popup';
		calendar_node.appendChild(booking_popup_node);
	}*/
}

/*
	Show popup information on booking
*/
function popupBooking(booking_url) {
	var booking_popup_node = $('booking-popup');
	if (!booking_popup_node) return;
	booking_popup_node.style.display = 'block';
	sendAjaxRequest(booking_url + '/booking_info_popup',
		function() {
			booking_popup_node.style.top = document.documentElement.scrollTop
					+ (document.documentElement.clientHeight / 2)
					- booking_popup_node.offsetHeight + 'px';
			booking_popup_node.innerHTML = xhReq.responseText;
		}
	);
}

/*
	Close booking popup
*/
function closeBookingPopup() {
	var booking_popup_node = $('booking-popup');
	booking_popup_node.style.display = 'none';
}