function Film(oSettings) { var self = this; this.consts = {'ugc_url':'http://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.feedback('Hidding movie "'+this.name()+'". Ban reason: '+this.ban().reason); this.anchor().addClass('banned'); } 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.poster = function(sPoster) { if(sPoster) sPoster = this.getPosterUrl(sPoster, 'small'); return this.attr('poster', sPoster); }; this.backgroundPoster = function(sPoster) { if(sPoster) sPoster = this.getPosterUrl(sPoster, 'medium'); return this.attr('poster_bg', sPoster); }; this.getPosterUrl = function(sUrl, sSize) { 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; }; 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.attr = function(sName, sValue) { if(!sValue) return this._attr[sName]; else { sValue = $.trim(sValue); if(sValue!='') this._attr[sName] = sValue; 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(sEdito=='Nouveau') iRank += 10000000; else if(sEdito.slice(-7)=='semaine') iRank += 100000*parseInt(sEdito.substr(0, sEdito.indexOf('è'))); 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':'film', 'id':'film_'+this.getRank()}) .data('rank', this.getRank()) .data('id', this.id()) .append($('', {'class':'bg', 'src':this.backgroundPoster()})) .append($('', {'class':'poster', 'src':this.backgroundPoster()})) .append($('
', {'class':'info'}) .append($('

', {'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()?' fa fa-edito':'')}).text(this.edito()?' '+this.edito():''))) .append($('

', {'class':'trailer'}) .append($('', {'target':'_blank', 'href':this.trailer()}) .append($('', {'class':'fa fa-fw inline fa-trailer'})) .append('Trailer'))) .append($('

', {'class':'timetable'}))) //.append($('
', {'class':'timetable fa fa-fw fa-spinner fa-spin'}))) .hide() .appendTo(this.$Main); } }; this.timetable = function(iCinemaId, sLang, oTimetable) { if(!iCinemaId) return this._timetable; else if(!sLang) return this._timetable[iCinemaId]; else if(!oTimetable) return this._timetable[iCinemaId][sLang]; else { if(!(iCinemaId in this._timetable)) this._timetable[iCinemaId] = {}; if(!(sLang in this._timetable[iCinemaId])) this._timetable[iCinemaId][sLang] = []; this._timetable[iCinemaId][sLang].push(oTimetable); } }; this.renderTimetable = function(iCinemaId) { var sCinema = self.settings.cinemas(iCinemaId); $.each(self.timetable(iCinemaId), function(sLang, asTimetable) { if(sLang=='VF' && ('VOSTF' in self.timetable(iCinemaId))) self.feedback('Hiding VF of "'+self.name()+'" @'+sCinema+' (VOSTF available)'); else if(sLang=='VFSTF') self.feedback('Hiding hearing-impaired version ('+sLang+') of "'+self.name()+'" @'+sCinema) else { var $Timetable = $('

') .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(self.anchor().find('.timetable')); $.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 }); } }); }; 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.$Header = $('header'); 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( 'filmsAjaxAction!getFilmsForPageCinema.action', {cinemaId:iCinemaId, cinemaCode:'', page:'7', filmId:'', filmId_widget:'', '_':Date.now()}, 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() { $Films = $('.film'); //Sort films $Films.sort(function(oFilm1, oFilm2){return ($(oFilm1).data('rank') < $(oFilm2).data('rank'))?1:-1;}).detach(); //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')); self.feedback('Hiding movie "'+oFilm.name()+'". No screening today'); $Film.addClass('banned'); } }); //Add films (except bans) $Films.appendTo(this.$Main); //remove buffer buffer(false); }; this.addCinema = function(iCinemaId, hDom) { var $Page = $(hDom); var $Films = $Page.find('.FilmDiv'); this.wip($Films.length); $Films.each(function() { var $Film = $(this); var iFilmId = $Film.find('input[name="filmId"]').val(); var oFilm = self.film(iFilmId); if(!oFilm) { oFilm = new Film(self.settings); //ID oFilm.id(iFilmId); //Edito var sEdito = $.trim($Film.find('.FilmEditorial').text()); oFilm.edito(sEdito); //Name oFilm.name($Film.find('.FilmTitle').text()); //Poster var sPosterUrl = $Film.find('.FilmThumbnail img').attr('source'); oFilm.poster(sPosterUrl); oFilm.backgroundPoster(sPosterUrl.replace('152x217/FFFFFF', '274x410/EEEEE8')); //Trailer oFilm.trailer($Film.find('.FilmIntroLink a').attr('href')); //Minimum info acquired: book place on DOM oFilm.anchor(); //Ban if wrong edito if(sEdito=='Avant-première' || sEdito=='UGC Culte' || sEdito=='Soirée Club') oFilm.ban(true, sEdito); //Append film to Ugc self.film(iFilmId, oFilm); } //Timetable if(!oFilm.ban().status) { getUgcPage( 'filmsAfficheAction!loadDatesList.action', {filmId:oFilm.id(), cinemaId:iCinemaId, cinemaCode:'', day:''}, function(jData){ if(!(self.settings.date('midnight_timestamp') in jData.dates)) self.wip(-1); else { getUgcPage( 'filmsAfficheAction!reloadSeancesList.action', {filmId:oFilm.id(), cinemaId:iCinemaId, cinemaCode:'', day:self.settings.date('midnight_timestamp')}, function(hData){ var sLang = ''; var $Timetable = $(hData); var oTimes = []; $Timetable.children().each(function(iKey, oDiv){ $Div = $(oDiv); if($Div.attr('class')=='Line') //New Lang { sLang = $.trim($Div.find('.FilmTitle').text()); } else { $Div.find('a').each(function(iKey, oLink){ var $Time = $(oLink); oTime = {'time':$.trim($Time.find('span').text()), 'booking':oFilm.consts.ugc_url+$Time.attr('href')}; oFilm.timetable(iCinemaId, sLang, oTime); }); } }); oFilm.renderTimetable(iCinemaId); self.wip(-1); }, function(){ self.wip(-1); self.error('Ajax Error detected on movie "'+oFilm.name()+'" @'+self.settings.cinemas(iCinemaId)+'.'); }, 'html'); } }, function(){ self.wip(-1); self.error('Ajax Error detected on movie "'+oFilm.name()+'" @'+self.settings.cinemas(iCinemaId)+'.'); }, 'json'); } else self.wip(-1); }); }; this.film = function(iFilmId, oFilm) { if(!iFilmId) return this._films; else if(!oFilm) return (iFilmId in this._films)?this._films[iFilmId]:false; else this._films[iFilmId] = oFilm; }; this.feedback = function(sMsg) { $('#feed_content').append($('

').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( 'headerReservationAction!reloadCinemasList.action', {'regionsAndCinemasBean.region':'', 'regionsAndCinemasBean.cinema':'', '_':this.date('timestamp')}, function(jData){ self.ugcCinemas(jData.cinemas); self.addUgcCinemasToDom(); }, function(){self.error('Error: Could not load cinema list');}, 'json'); }; this.ugcCinemas = function(asCinemas) { if(!asCinemas) return this._ugcCinemas; else if($.isNumeric(asCinemas)) return this._ugcCinemas[asCinemas]; //Get Cinema name else this._ugcCinemas = asCinemas; }; 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 '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(); 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 || iCount==0) { 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($('', {'class':'button no_bg inline day', 'id':'day_'+iTimestamp}).data('timestamp', iTimestamp).text(sDay)); oNextDay = new Date(this.timestamp(oNextDay) + 24*60*60*1000); iCount++; } //Selecting right value $Select.val(this.date('midnight_timestamp')); $List.find('#day_'+this.date('midnight_timestamp')).addClass('clicked'); //event $Select.change(function(){ Cookies.set('date', $(this).val(), {expires:6}); reload(); }); $List.find('.day').click(function(){ Cookies.set('date', $(this).data('timestamp'), {expires:6}); reload(); }); }; this.addUgcCinemasToDom = function() { //Hide buffer self.$Settings.find('#buffer_settings').hide(); //Add cinemas var $Cinemas = self.$Settings.find('.cinemas'); $.each(self.ugcCinemas(), function(iKey, sCinemaName){ var iCinemaId = $.trim(iKey); $Cinemas.append($('

  • ', {'class':'cinema'}) .attr('id', 'cinema_'+iCinemaId) .data('id', iCinemaId) .toggleClass('include', (iCinemaId in self.cinemas())) .click(function(){$(this).toggleClass('include')}) .text(sCinemaName)); }); //Event: Show / Hide panel $('#btn_settings').click(function(){self.toggleSettings(true);}); $('.background').click(function(){self.toggleSettings(false);}); $(window).keyup(function(e){if(e.keyCode == 27) self.toggleSettings(false);}); //Event: Validation of cinemas selection this.$Settings.find('#ok_settings').click(function(){ var asCines = {}; self.$Settings.find('.include').each(function(iKey, oCinema){ var $Cine = $(oCinema); asCines[$Cine.data('id')] = $Cine.text(); }); Cookies.set('cinemas', asCines); reload(); }); }; this.toggleSettings = function(bShow) { self.$Settings.add('.background').toggle((typeof bShow == 'undefined')?null:bShow); }; this.timestamp = function(oDate) { oDate = oDate || new Date(); return oDate.getTime(); } this.error = function(sMsg) { console.log('Settings Error: '+sMsg); }; } function getUgcPage(sPath, asData, fOnSuccess, fOnFail, sType) { var asParams = {'a':'get_page', 'type':sType, 'data':{'path':sPath, 'vars':asData}}; $.ajax({ url: (new Film()).consts.process_url, data: asParams, dataType: sType }) .done(function(oData){ if(sType=='html') { var asMatches = oData.match(/(.*?)<\/title>/); if(asMatches && asMatches[1] == 'Service Temporarily Unavailable') { console.log('UGC website Temporarily Unavailable. Reloading page'); console.log(asParams); reload(); } } fOnSuccess(oData); }) .fail(function(){ fOnFail(); console.log('UGC website Temporarily Unavailable. Reloading page'); console.log(asParams); reload(); }); } function buffer(bActive) { if(bActive) { $('.film').add('header').fadeTo(0, 0); } else { $('.film').not('.banned').add('header').fadeTo('slow', 1); } $('#buffer').toggle(bActive); $('footer').add('#feedback').toggle(!bActive); } function reload() { buffer(true); location.reload(); }