Files
ugc/script/film.js
2015-08-12 23:44:51 +02:00

277 lines
8.3 KiB
JavaScript
Executable File

function Film()
{
var self = this;
this.consts = {'ugc_url':'http://www.ugc.fr/'};
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)
{
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 = $('<div>', {'class':'film', 'id':'film_'+this.id()})
.append($('<img>', {'class':'poster', 'src':this.poster()}))
.append($('<div>', {'class':'info'})
.append($('<p>', {'class':'title'})
.append($('<a>', {'class':'name', 'target':'_blank', 'href':this.consts.ugc_url+'film.html?id='+this.id()})
.append($('<i>', {'class':'fa fa-fw fa-icon fa-film'}))
.append(this.name()))
.append($('<span>', {'class':'edito'}).text(this.edito()?' ['+this.edito()+']':'')))
.append($('<p>', {'class':'trailer'})
.append($('<a>', {'target':'_blank', 'href':this.trailer()})
.append($('<i>', {'class':'fa fa-fw fa-icon fa-trailer'}))
.append('Trailer')))
.append($('<div>', {'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)
{
$.each(asLang, function(iKey, sLang)
{
if(sLang=='VF' && ('VOSTF' in self.timetable(iCinemaId))) self.error('Hiding VF version of "'+self.name()+'" (VOSTF available)');
else
{
var $Timetable = $('<p>')
.append($('<a>', {'class':'cinema', 'target':'_blank', 'href':self.consts.ugc_url+'cinemaAction!execute.action?page=7&id='+iCinemaId})
.append($('<i>', {'class':'fa fa-fw fa-icon fa-cinema'}))
.append(asCinemas[iCinemaId]+' '+sLang))
.append(' : ')
.appendTo(self.anchor().find('.timetable').removeClass('fa fa-fw fa-spinner fa-spin'));
$.each(self.timetable(iCinemaId, sLang).sort(self.timeCompare), function(iKey, oTime){
$Timetable.append($('<a>', {'class':'time', 'href':oTime.booking, 'target':'_blank'}).text(oTime.time));
});
}
});
};
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').append($('<p>').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]]+')');
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);
},
'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($('<sup>').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').append($('<p>').text(sMsg));
};
}
function getUgcPage(sPath, asData, fOnSuccess, sType)
{
var asParams = {'a':'get_page', 'type':sType, 'data':{'path':sPath, 'vars':asData}};
$.get('index.php', asParams, fOnSuccess, sType);
}