function Film() { var self = this; this.consts = {'ugc_url':'http://www.ugc.fr/', 'process_url':'index.php'}; this._attr = {}; this._anchor = {}; this._ban = {status:false, reason:''}; this._timetable = {}; this.$Main = $('main'); this.$Footer = $('footer'); this.ban = function(bStatus, sReason) { sReason = sReason || ''; if(!bStatus) return this._ban; else if(sReason!='') { this._ban.status = true; this._ban.reason = sReason; this.error('Hidding "'+this.name()+'". Ban reason: '+this.ban().reason); this.anchor().hide(); } 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) //Set { var sExt = sPoster.substr(sPoster.lastIndexOf('.')+1).toLowerCase(); if(sExt=='jpg') sExt = 'jpeg'; var sPoster = this.consts.process_url+'?a=get_poster&type='+sExt+'&data[id]='+this.id()+'&data[url]='+encodeURIComponent(sPoster); } return this.attr('poster', sPoster); }; 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.anchor = function() { if(Object.keys(this._anchor).length > 0) return this._anchor; else { //Init page this.onPageReady(); //Add film to DOM this._anchor = $('
', {'class':'film', 'id':'film_'+this.id()}) //.append($('', {'class':'bg', 'src':this.poster()})) .append($('', {'class':'poster', 'src':this.poster()})) .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 fa-icon 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 fa-icon fa-trailer'})) .append('Trailer'))) .append($('

', {'class':'timetable fa fa-fw fa-spinner fa-spin'}))) .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.onPageReady = function() { this.$Main.find('#buffer').hide(); this.$Footer.show(); }; this.renderTimetable = function(iCinemaId, asLang) { var sCinema = asCinemas[iCinemaId]; $.each(asLang, function(iKey, sLang) { if(sLang=='VF' && ('VOSTF' in self.timetable(iCinemaId))) self.error('Hiding VF version of "'+self.name()+'" @'+sCinema+' (VOSTF available)'); else if(sLang=='VFSTF') self.error('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 fa-icon fa-cinema'})) .append($('', {'class':'cinema_name'}).text(sCinema))) .append($('', {'class':'lang'}).text(sLang)) .appendTo(self.anchor().find('.timetable')); $.each(self.timetable(iCinemaId, sLang).sort(self.timeCompare), function(iKey, oTime){ $Timetable .append($('', {'class':'time', 'href':oTime.booking, 'target':'_blank'}).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.error = function(sMsg) { $('#feedback').show(); $('#feed_content').append($('

').text(sMsg)); }; } function Affiche(oDate) { var self = this; this.date = {}; this.date.now = oDate; this.date.today = new Date(this.date.now.getFullYear(), this.date.now.getMonth(), this.date.now.getDate()); this.date.timestamp = this.date.today / 1; this._films = {}; this.consts = { days:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], months:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]}; this.loadCinemas = function() { //Today timestamp this.setHeader(); $.each(asCinemas, function(iCinemaId, sCinemaName){ getUgcPage( 'filmsAjaxAction!getFilmsForPageCinema.action', {cinemaId:iCinemaId, cinemaCode:'', page:'7', filmId:'', filmId_widget:'', '_':Date.now()}, self.addCinema, 'html'); }); }; this.addCinema = function(hDom) { var $Page = $(hDom); var $Films = $Page.find('.FilmDiv'); $Films.each(function() { var $Film = $(this); var iFilmId = $Film.find('input[name="filmId"]').val(); var iCinemaId = $Film.find('input[name="cinemaId"]').val(); var oFilm = self.film(iFilmId); if(!oFilm) { oFilm = new Film(); //ID oFilm.id(iFilmId); //Edito var sEdito = $.trim($Film.find('.FilmEditorial').text()); oFilm.edito(sEdito); //Name oFilm.name($Film.find('.FilmTitle').text()); //Poster oFilm.poster($Film.find('.FilmThumbnail img').attr('src')); //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 Affiche self.film(iFilmId, oFilm); } //Timetable if(!oFilm.ban().status) { getUgcPage( 'filmsAfficheAction!loadDatesList.action', {filmId:oFilm.id(), cinemaId:iCinemaId, cinemaCode:'', day:''}, function(jData){ var sDate = jData.dates[self.date.timestamp]; if(!(self.date.timestamp in jData.dates)) { self.error('No times today for "'+oFilm.name()+'" @'+asCinemas[iCinemaId]+' (first date available: '+jData.dates[Object.keys(jData.dates)[0]]+')'); oFilm.anchor().find('.timetable').removeClass('fa fa-fw fa-spinner fa-spin'); } else { getUgcPage( 'filmsAfficheAction!reloadSeancesList.action', {filmId:jData.filmId, cinemaId:jData.cinemaId, cinemaCode:'', day:self.date.timestamp}, function(hData){ var sLang = ''; var asLangs = []; var $Timetable = $(hData); var oTimes = []; $Timetable.children().each(function(iKey, oDiv){ $Div = $(oDiv); if($Div.attr('class')=='Line') //New Lang { if(sLang!='') asLangs.push(sLang); 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(jData.cinemaId, sLang, oTime); }); } }); asLangs.push(sLang); oFilm.renderTimetable(iCinemaId, asLangs); oFilm.anchor().find('.timetable').removeClass('fa fa-fw fa-spinner fa-spin'); }, 'html'); } }, 'json'); } }); }; this.setHeader = function() { var iDay = this.date.today.getDate(); $('#date') .attr('datetime', this.date.today.getFullYear()+'-'+(("0" + (this.date.today.getMonth() + 1)).slice(-2))+'-'+(("0" + iDay).slice(-2))) .append(this.consts.days[this.date.today.getDay()]+', '+this.consts.months[this.date.today.getMonth()]+' '+iDay) .append($('').text((iDay%10==1)?'st':((iDay%10==2)?'nd':((iDay%10==3)?'rd':'th')))); } 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.error = function(sMsg) { $('#feedback').show(); $('#feed_content').append($('

').text(sMsg)); }; } function getUgcPage(sPath, asData, fOnSuccess, sType) { var asParams = {'a':'get_page', 'type':sType, 'data':{'path':sPath, 'vars':asData}}; $.get((new Film()).consts.process_url, asParams, fOnSuccess, sType); }