function Film(oSettings) { var self = this; this.consts = {'ugc_url':'https://www.ugc.fr/', 'process_url':'index.php'}; this.settings = oSettings; this._attr = {}; this._anchor = {}; this._ban = {status:false, reason:''}; this._timetable = {}; this.$Main = $('main'); this.ban = function(bStatus, sReason) { sReason = sReason || ''; if(!bStatus) return this._ban; else if(sReason!='') { this._ban.status = true; this._ban.reason = sReason; this.anchor().addClass('banned'); this.feedback('Hidding movie "'+this.name()+'": '+this.ban().reason); } else this.error('Setting ban status with no reason'); } this.id = function(iFilmId) { return this.attr('id', iFilmId); } this.name = function(sName) { sName = sName?(sName + '').toLowerCase().replace(/^([a-z\u00E0-\u00FC])|\s+([a-z\u00E0-\u00FC])/g, function($1) {return $1.toUpperCase();}):''; return this.attr('name', sName); }; this.safe = function(sName) { var sSafeName = sName?removeDiacritics(sName):''; return this.attr('safe', sSafeName); }; this.poster = function(sPoster) { if(sPoster) sPoster = this.getPosterUrl(sPoster, 'small'); return this.attr('poster', sPoster); }; this.backgroundPoster = function(sPoster, bForce) { bForce = bForce || false; if(sPoster) sPoster = this.getPosterUrl(sPoster, 'large', bForce); return this.attr('poster_bg', sPoster); }; this.getPosterUrl = function(sUrl, sSize, bForce) { bForce = bForce || false; var sExt = sUrl.substr(sUrl.lastIndexOf('.')+1).toLowerCase(); if(sExt=='jpg') sExt = 'jpeg'; return this.consts.process_url+'?a=get_poster&type='+sExt+'&data[id]='+this.id()+'&data[url]='+encodeURIComponent(sUrl)+'&data[size]='+sSize+'&data[force]='+(bForce?'1':'0'); }; this.edito = function(sEdito) { return this.attr('edito', sEdito); }; this.trailer = function(sTrailer) { sTrailer = sTrailer?self.consts.ugc_url+sTrailer:''; return this.attr('trailer', sTrailer); }; this.director = function(sDirector) { return this.attr('director', sDirector); }; this.attr = function(sName, sValue) { if(!sValue) return this._attr[sName]; else { sValue = $.trim(sValue); if(sValue!='') { this._attr[sName] = sValue; return this._attr[sName]; } else this.error('Trying to set an empty film attribute: '+sName); } }; /* this.removeSpinner = function() { this.anchor().find('.timetable').removeClass('fa fa-fw fa-spinner fa-spin'); } */ this.getRank = function() { var sEdito = this.edito() || ''; var iRank = 0; if(this.ban().status) iRank -= 1000000000; //Banned movies else if(sEdito=='Avant-Première') iRank += 1000000000; //Special event else if(sEdito=='Nouveau') iRank += 10000000; //New releases else if(sEdito.slice(-7)=='semaine')iRank += 100000 * parseInt(sEdito.substr(0, sEdito.indexOf('è'))); //Popular movies else if(sEdito=='Dernières Séances')iRank += 100000; //Adding movie ID (newer movies have greater IDs) iRank += parseInt(this.id(), 10); return iRank; }; this.anchor = function() { if(Object.keys(this._anchor).length > 0) return this._anchor; else { //Add film to DOM this._anchor = $('
', {'class':'title'})
.append($('', {'class':'name', 'target':'_blank', 'href':this.consts.ugc_url+'film.html?id='+this.id()})
.append($('', {'class':'fa fa-fw inline fa-film'}))
.append(this.name())))
.append($(' ', {'class':'edito'+(!this.edito()?' hide':'')})
.append($('', {'class':'fa fa-fw inline fa-edito'}))
.append($('').text(this.edito())))
/*.append($(' ', {'class':'trailer'})
.append($('', {'target':'_blank', 'href':this.trailer()})
.append($('', {'class':'fa fa-fw inline fa-trailer'}))
.append('Trailer')))*/
.append($(' ', {'class':'director'})
.append($('', {'class':'fa fa-fw inline fa-director'}))
.append(this.director()))
.append($(' ', {'class':'cinema_lang'})
.append($('', {'class':'cinema', 'target':'_blank', 'href':self.consts.ugc_url+'cinemaAction!execute.action?page=7&id='+iCinemaId})
.append($('', {'class':'fa fa-fw inline fa-cinema'}))
.append($('', {'class':'cinema_name'}).text(sCinema)))
.append($('', {'class':'lang'}).text(sLang))
.appendTo($CinemaBox);
var $Timetable = $(' ', {'class':'screening'});
$.each(asTimetable.sort(self.timeCompare), function(iKey, oTime){
$Timetable
.append($('', {'class':'button', 'href':oTime.booking, 'target':'_blank', 'title':'Book screening'}).text(oTime.time))
.append(' '); //for line break
});
self.anchor().find('.timetable').append($CinemaBox.append($Timetable));
}
});
};
this.timeCompare = function(sTime1, sTime2)
{
return (Date.parse('01/01/1970 '+sTime1.time+':00') > Date.parse('01/01/1970 '+sTime2.time+':00'));
};
this.feedback = function(sMsg)
{
$('#feed_content').append($(' ').text(sMsg));
};
this.error = function(sMsg)
{
console.log('Film Error: '+sMsg);
};
}
function Ugc()
{
var self = this;
this.settings = new Settings();
this._films = {};
this._wip = 0;
this.hash_sep = '-';
this.$Header = $('header');
this.$Nav = $('nav');
this.$Main = $('main');
this.$Footer = $('footer');
this.$Feedback = $('#feedback');
this.loadCinemas = function()
{
//Display buffer while loading
buffer(true);
//Load Settings
this.settings.init();
//Set Header
$('#date')
.attr('datetime', this.settings.date('html'))
.append(this.settings.date('formal'))
.append($('').text(this.settings.date('abbr')));
//Load cinemas
$.each(this.settings.cinemas(), function(iCinemaId, sCinemaName){
getUgcPage( 'showingsCinemaAjaxAction!getShowingsForCinemaPage.action',
{cinemaId:iCinemaId, date:self.settings.date('french'), page:'10007', sort:'ugc', searchFilmKey:''},
function(hDom){self.addCinema(iCinemaId, hDom)},
function(){},
'html');
});
};
this.wip = function(iProgress)
{
if(!iProgress) return this._wip;
else
{
this._wip += iProgress;
if(this._wip==0) this.onPostLoad();
}
};
this.onPostLoad = function()
{
var $Films = $('.film');
//Remove movies with no screening
$Films.not('.banned').each(function(iKey, hFilm){
var $Film = $(hFilm);
if($Film.find('.timetable').is(':empty'))
{
var oFilm = self.film($Film.data('id'));
oFilm.ban(true, 'No screening today');
}
});
//Sort films
$Films.sort(function(oFilm1, oFilm2){
return (self.film($(oFilm1).data('id')).getRank() < self.film($(oFilm2).data('id')).getRank())?1:-1;
}).detach();
//Add films (except bans)
$Films.appendTo(this.$Main);
//remove buffer
buffer(false);
//Build Search
this.initSearch();
};
this.addCineNav = function(iCinemaId)
{
var sCinema = self.settings.cinemas(iCinemaId);
var sFirstLetter = sCinema/*.replace(/^L(e|a|es)\s/g, '').charAt(0)*/;
this.$Nav.append($('', {title:'Show / Hide '+sCinema+' screenings'})
.data('id', iCinemaId)
.click(function(){
var $This = $(this);
$('.cinema_timetable_'+$This.data('id')).slideToggle();
$This.toggleClass('hidden');
})
.text(sFirstLetter));
};
this.initSearch = function()
{
var $SearchInput = $("#search");
$SearchInput
.attr('placeholder', 'Search...')
.on("change paste keyup", function(){
var sValue = $(this).val();
self.hash('search', sValue);
if(sValue=='') $('.film').not('.banned').show();
})
.autocomplete(
{
autoFocus: true,
delay: 0,
source: function(oRequest, fResponse) //search engine
{
var sTerm = removeDiacritics(oRequest.term);
var rMatcher = new RegExp($.ui.autocomplete.escapeRegex(sTerm), 'i');
//Remove all films
$('.film').not('.banned').hide();
$.each(oUgc.film(), function(iFilmId, oFilm)
{
if(!oFilm.ban().status)
{
var oMatch = oFilm.safe().match(rMatcher);
if(oMatch)
{
oFilm.anchor().show();
}
}
});
}
});
var asHash = self.hash();
var sDefaultSearch = asHash.items[0] || '';
if(asHash.page=='search' && sDefaultSearch!='')
{
$SearchInput.focus().val(sDefaultSearch).putCursorAtEnd().autocomplete("search", sDefaultSearch);
}
};
this.hash = function(sPage, asItems)
{
sPage = sPage || '';
asItems = asItems || [];
if(sPage=='')
{
var sHash = decodeURIComponent(window.location.hash.slice(1));
var asHash = sHash.split(self.hash_sep);
sPage = asHash.shift() || '';
return {hash:sHash, page:sPage, items:asHash};
}
else
{
if(typeof asItems == 'string') asItems = [asItems];
var sItems = (asItems.length > 0)?self.hash_sep+asItems.join(self.hash_sep):'';
if(sItems=='') sPage = '';
window.location.hash = '#'+encodeURIComponent(sPage+sItems);
}
};
this.addCinema = function(iCinemaId, hDom)
{
var $Films = $(' ').text(sMsg));
};
this.error = function(sMsg)
{
console.log('Ugc Error: '+sMsg);
};
}
function Settings()
{
var self = this;
this._ugcCinemas = {};
this._cinemas = {};
//this._ugcDates = [];
this._date = null;
this.$Settings = $('#settings');
this.$Header = $('header');
this.$Main = $('main');
this.consts = { days:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
months:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]};
this.init = function()
{
//Default date
var iCookieTimestamp = parseInt(Cookies.get('date'));
var oDate;
if(isNaN(iCookieTimestamp) || iCookieTimestamp < this.timestamp()) // no cookie or in the past
{
oDate = new Date();
if(oDate.getHours()==23) oDate = new Date(this.timestamp(oDate) + 24*60*60*1000); //Tomorrow
}
else oDate = new Date(iCookieTimestamp);
this.date(oDate);
//UGC dates
this.addUgcDatesToDom();
//Default cinemas
var asCookieCinemas = Cookies.getJSON('cinemas');
this.cinemas(asCookieCinemas?asCookieCinemas:{'10':'Les Halles', '12':'Bercy', '20':'La Défense'});
//UGC cinemas
getUgcPage( 'resaExpressAction!getCinemaList.action',
{region:'', cinema:'', film:'', date:'', seance:'', '_':this.date('timestamp')},
function(jData){
self.ugcCinemas(jData.cinemas);
self.addUgcCinemasToDom();
},
function(){self.error('Error: Could not load cinema list');},
'json');
//Avant-Première switch
var bCookiePremiere = Cookies.getJSON('premiere');
this.premiere(bCookiePremiere==null?false:bCookiePremiere);
$('.switches').click(function(){self.premiere(!self.premiere());});
};
this.premiere = function(bActive)
{
var $Premiere = $('#premiere');
if(bActive==null) return $Premiere.hasClass('fa-on');
else $Premiere.removeClass('fa-on fa-off').addClass(bActive?'fa-on':'fa-off');
};
this.ugcCinemas = function(asCinemas)
{
if(!asCinemas) return this._ugcCinemas;
else if($.isNumeric(asCinemas)) return this._ugcCinemas[asCinemas]; //Get Cinema name
else
{
$.each(asCinemas, function(iCinemaId, sCinema){
self._ugcCinemas[iCinemaId] = $.trim(sCinema.replace(/UGC( Ciné Cité|)/i, ''));
});
}
};
this.cinemas = function(asCinemas)
{
if(!asCinemas) return this._cinemas;
else if($.isNumeric(asCinemas)) return this._cinemas[asCinemas]; //Get Cinema name
else this._cinemas = asCinemas;
};
this.date = function(oDate)
{
if(!oDate) return this._date;
else if($.type(oDate)=='string')
{
switch(oDate)
{
case 'timestamp':
return this.timestamp(this._date);
case 'today':
return new Date(this._date.getFullYear(), this._date.getMonth(), this._date.getDate());
case 'midnight_timestamp':
return this.timestamp(this.date('today'));
case 'day':
return this._date.getDate();
case 'weekday':
return this._date.getDay();
case 'month':
return this._date.getMonth();
case 'year':
return this._date.getFullYear();
case 'html':
return this.date('year')+'-'+(("0" + (this.date('month') + 1)).slice(-2))+'-'+(("0" + this.date('day')).slice(-2));
case 'french':
return (("0" + this.date('day')).slice(-2))+'/'+(("0" + (this.date('month') + 1)).slice(-2))+'/'+this.date('year');
case 'formal':
return this.consts.days[this.date('weekday')]+', '+this.consts.months[this.date('month')]+' '+this.date('day');
case 'abbr':
return (this.date('day')%10==1)?'st':((this.date('day')%10==2)?'nd':((this.date('day')%10==3)?'rd':'th'));
default:
return this._date;
}
}
else this._date = oDate;
};
this.addUgcDatesToDom = function()
{
//Build today at midnight
var oNextDay = new Date();
var bTuesdayNight = (oNextDay.getDay()==2 && oNextDay.getHours()==23);
oNextDay = new Date(oNextDay.getFullYear(), oNextDay.getMonth(), oNextDay.getDate());
//Build available dates
var $Select = $('#ugc_dates').find('select');
var $List = $('#ugc_days');
var iCount = 0;
while(oNextDay.getDay()!=3 || (oNextDay.getDay()==3 && bTuesdayNight) || iCount==0)
{
//Display this day
var iTimestamp = this.timestamp(oNextDay);
switch(iCount)
{
case 0: sDay = 'Today'; break;
case 1: sDay = 'Tomorrow'; break;
default: sDay = this.consts.days[oNextDay.getDay()];
}
$Select.append($('