//ajouter un H au value des select et le retirer dans le js
//utiliser splice dans eraseElem
//un clique sur allversion est considérer comme un clique sur un autre checkbox du fieldset. id est ajouter à ClassOfHiddenElement;
//créer variable class pour la valeur MasterCheck

var classForHidding = "notInTimeSelection";
var classForContainer = "Film_Schedules_Container";
var ClassOfHiddenElement = new Array();
var iStartTime = 4;
var iEndTime = 24;

addLoadEvent(titleClick);
addLoadEvent(initScedulesForm);
addLoadEvent(anchorManagement);
addLoadEvent(schedulesLoading);
addLoadEvent(goToAnchor);

function schedulesLoading() {
	$("schedules_theatre_list_container").replaceChild($("schedules_theatre_list"),$("loadingMessage"));
}

/*function getCookieVal(offset)
{
var endstr=document.cookie.indexOf (";", offset);
if (endstr==-1) endstr=document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}
function LireCookie(nom)
{
var arg=nom+"=";
var alen=arg.length;
var clen=document.cookie.length;
var i=0;
while (i<clen)
{
var j=i+alen;
if (document.cookie.substring(i, j)==arg) return getCookieVal(j);
i=document.cookie.indexOf(" ",i)+1;
if (i==0) break;

}
return null;
}

window.onunload= function () {
	var date=new Date;
	date.setMonth(date.getMonth()+1);
	document.cookie="scheduleSelection="+escape(ClassOfHiddenElement.join("|"))+";expires="+date.toGMTString();
	alert( LireCookie("scheduleSelection"));
}*/

Array.prototype.indexOf = function(val) {
	for(var i = 0; i < this.length; ++i) {
		if(this[i] == val){
			return i;
		}
	}
	return -1;
}

Array.prototype.reverseElem = function(index1, index2) {
	this.push(this[index2]);
	this[index2]=this[index1];
	this[index1]=this[this.length-1];
	this.pop();
}

Array.prototype.eraseElem = function(index) {
	if (index != this.lenght-1) {
		this.reverseElem(index, this.length-1);
	}
	this.pop()
}

function parentNodeWithTag(HTMLelem, NameOfTag) {
	while (HTMLelem != null && HTMLelem.tagName != NameOfTag) {
		HTMLelem = HTMLelem.parentNode;
	}
	return HTMLelem;
}

function HiddeElem(HTMLelem) {
	HTMLelem.style.display="none";
}

function restoreDisplayOfElem(HTMLelem) {
	HTMLelem.style.display="";
}

/*
* Si flag différent de 0, coche les checkbox contenues dans l'élément formElem
* et retire les horaires correspondants à la case de la liste des horaires non visibles.
* Si flag égal 0, décoche les checkbox contenues dans l'élément formElem 
* et ajoute les horaires correspondants à la case dans la liste des horaires non visibles.
*/
function unckeckOrCheckAll(formElem, flag) {
	var inputs = formElem.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; ++i) {
		if (inputs[i].type=="checkbox") {
			inputs[i].checked = flag;
			if(!new RegExp("MasterCheck", "i").test(inputs[i].className)){
				showOrHide(inputs[i]);
			}
		}
	}
}

/*
* Décoche la checkbox avec une class "MasterCheck" de l'élément FormElem
*/
function unckeckMaster(formElem) {
	var inputs = formElem.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; ++i) {
		if (inputs[i].className=="MasterCheck" && inputs[i].type=="checkbox") {
			inputs[i].checked = 0;
			return;
		}
	}
}

/*
* Coche la checkbox avec une class "MasterCheck" de l'élément FormElem
* si toutes les autres checkbox sont cochées
*/
function CheckMaster(formElem) {
	var flag=1;
	var inputs = formElem.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; ++i) {
		if (inputs[i].type=="checkbox"){
			if (inputs[i].className=="MasterCheck") {
				var indexOfMaster = i;
			} else {
				if (!inputs[i].checked){
					flag=0;
				}
			}
		}
	}
	if (flag) {
		inputs[indexOfMaster].checked=flag;
	}
}


/*
* Si inputElem est coché, coche tous les checkbox contenues dans le fieldset que inputElem
* sinon décoche tous les checkbox contenues dans le même fieldset que inputElem
*/
function checkAllGestion(inputElem) {
	if (inputElem.type=="checkbox") {
		if (!inputElem.checked) {
			unckeckOrCheckAll(parentNodeWithTag(inputElem,"FIELDSET"),0);	
		} else {
			unckeckOrCheckAll(parentNodeWithTag(inputElem,"FIELDSET"),1);
		}
	}
}

function allElemAreHidden(arrayOfElem){
	for (var i = 0; i < arrayOfElem.length; ++i) {
		if ( (arrayOfElem[i].style.display=="") &&  !(new RegExp("notInTimeSelection", "i").test(arrayOfElem[i].className))) {
			return false
		}	
	}
	return true;
}

function showOrHideContainer(){
	var arrayOfContainer = getElementsByClassName($("schedules_theatre_list"), "div", classForContainer);
	for (var i = 0; i < arrayOfContainer.length; ++i) {
		var tbody = arrayOfContainer[i].getElementsByTagName("tbody");
		var arrayOfTR = tbody[0].getElementsByTagName("tr");
		if (allElemAreHidden(arrayOfTR)) {
			arrayOfContainer[i].style.display="none";
		} else {
			arrayOfContainer[i].style.display="";
		}
	}
}

function areaShowOrHideContainer(){
	var arrayOfContainer = getElementsByClassName($("schedules_theatre_list"), "div", "areaBlock");
	for (var i = 0; i < arrayOfContainer.length; ++i) {
		var theatresInArea = getElementsByClassName(arrayOfContainer[i], "div", "Film_Schedules_Container");
		if (allElemAreHidden(theatresInArea)) {
			arrayOfContainer[i].style.display="none";
		} else {
			arrayOfContainer[i].style.display="";
		}
	}
}

function showOrHide(inputElem) {
	if (inputElem.type=="checkbox") {
		var all_TR = getElementsByClassName($("schedules_theatre_list"), "tr", inputElem.id);
		if (!inputElem.checked) {
			unckeckMaster(parentNodeWithTag(inputElem,"FIELDSET"));
			ClassOfHiddenElement.push(inputElem.id);
			for (var i = 0; i < all_TR.length; ++i) {
 				HiddeElem(all_TR[i]);
 			}
		} else {
			CheckMaster(parentNodeWithTag(inputElem,"FIELDSET"));
			var index = ClassOfHiddenElement.indexOf(inputElem.id);
			if (index > -1){
				ClassOfHiddenElement.eraseElem(index);
				// Réaffichage du tr si aucune classe de celui-ci n'est encore présente dans ClassOfHiddenElement
				for (var i = 0; i < all_TR.length; ++i) {
					var stayHidden = false;
					for (var j = 0; (!stayHidden && j < ClassOfHiddenElement.length); ++j) {
						if ((all_TR[i].className.search(ClassOfHiddenElement[j]) > -1)) {
							stayHidden = true;
						}
					}
 					if (!stayHidden) {
 						restoreDisplayOfElem(all_TR[i]);
 					}
				}
			}
		}
		showOrHideContainer();
		areaShowOrHideContainer();
	}
}

/*
* If any class of ArrayOfClass is in the className of elem, remove  classForHidding in the className.
* else add  classForHidding in the className
*/
function addOrRemoveClassForHidding(elem, ArrayOfClass, classForHidding){
	for (var j = 0; j < ArrayOfClass.length; ++j){
		//if ArrayOfClass[j] is a class of elem
		if(new RegExp(ArrayOfClass[j], "i").test(elem.className)){
			removeClassName(elem,classForHidding);
			return elem.className;
		}
	}
	addClassName(elem,classForHidding);
	return elem.className;
}

/*
* Manage displaying of each elem of ArrayOfElem:
* If any class of ArrayOfClass is in the className of the current element of ArrayOfElem, remove  classForHidding in the className.
* else add  classForHidding in the className
*/
function displayingManagement(ArrayOfElem, ArrayOfClass, classForHidding){
	for (var i = 0; i < ArrayOfElem.length; ++i){
		ArrayOfElem[i].className = addOrRemoveClassForHidding(ArrayOfElem[i], ArrayOfClass, classForHidding);
		
	}
}

/*
* Manage displaying of schedules according to the values of :
*/
function timeSelection() {
	var startTime = "H"+$("startTime").value;
	var endTime = "H"+$("endTime").value;
	var allTime = new Array("H4","H5","H6","H7","H8","H9","H10","H11","H12","H13","H14","H15","H16","H17","H18","H19","H20","H21","H22","H23","H24");
	var selectedHours = allTime.slice(allTime.indexOf(startTime),allTime.indexOf(endTime));
	if(endTime=="H24")
		selectedHours.push("H24");
	var all_tbody= $("schedules_theatre_list").getElementsByTagName("tbody");
	for (var i = 0; i < all_tbody.length; ++i){
		var all_TR = all_tbody[i].getElementsByTagName("tr");
		displayingManagement(all_TR, selectedHours, classForHidding);
	}
	showOrHideContainer();
	areaShowOrHideContainer();
}

function initCheckbox(fieldsetID) {
	if (!$(fieldsetID)) return;
	var inputs = $(fieldsetID).getElementsByTagName("input");
	for (var i=0; i < inputs.length; ++i) {
		if(!new RegExp("MasterCheck", "i").test(inputs[i].className)){
			showOrHide(inputs[i]);
		}
	}
}

function initSelect() {
	if ($("startTime") && $("endTime")) {
		timeSelection();
	}
}

function initScedulesForm(){
	initCheckbox("Versions");
	initCheckbox("Dates");
	initSelect();
}