Page.Wanted = new Class({ Extends: PageBase, name: 'wanted', title: 'Gimmy gimmy gimmy!', movies: [], indexAction: function(param){ var self = this; self.get() }, list: function(){ var self = this; if(!self.movie_container) self.movie_container = new Element('div.movies').inject(self.el); self.movie_container.empty(); Object.each(self.movies, function(info){ var m = new Movie(self, {}, info); $(m).inject(self.movie_container); m.fireEvent('injected'); }); self.movie_container.addEvents({ 'mouseenter:relay(.movie)': function(e, el){ el.addClass('hover') }, 'mouseleave:relay(.movie)': function(e, el){ el.removeClass('hover') } }) }, get: function(status, onComplete){ var self = this if(self.movies.length == 0) Api.request('movie.list', { 'data': {}, 'onComplete': function(json){ self.store(json.movies); self.list(); } }) else self.list() }, store: function(movies){ var self = this; self.movies = movies; } }); var Movie = new Class({ Extends: BlockBase, initialize: function(self, options, data){ var self = this; self.data = data; self.profile = Quality.getProfile(data.profile_id); self.parent(self, options); self.addEvent('injected', self.afterInject.bind(self)) }, create: function(){ var self = this; self.el = new Element('div.movie').adopt( self.data_container = new Element('div.data', { 'tween': { duration: 400, transition: 'quint:in:out' } }).adopt( self.thumbnail = File.Select.single('poster', self.data.library.files), self.info_container = new Element('div.info').adopt( self.title = new Element('div.title', { 'text': self.getTitle() }), self.year = new Element('div.year', { 'text': self.data.library.year || 'Unknown' }), self.rating = new Element('div.rating', { 'text': self.data.library.rating }), self.description = new Element('div.description', { 'text': self.data.library.plot }), self.quality = new Element('div.quality', { 'text': self.profile.get('label') }) ), self.actions = new Element('div.actions').adopt( self.action_imdb = new Movie.Action.IMDB(self), self.action_edit = new Movie.Action.Edit(self), self.action_refresh = new Movie.Action.Refresh(self), self.action_delete = new Movie.Action.Delete(self) ) ) ); if(!self.data.library.rating) self.rating.hide(); }, afterInject: function(){ var self = this; var height = self.getHeight(); self.el.setStyle('height', height); }, getTitle: function(){ var self = this; var titles = self.data.library.titles; var title = titles.filter(function(title){ return title['default'] }).pop() if(title) return title.title else if(titles.length > 0) return titles[0].title return 'Unknown movie' }, slide: function(direction){ var self = this; if(direction == 'in'){ self.el.addEvent('outerClick', self.slide.bind(self, 'out')) self.data_container.tween('left', 0, self.getWidth()); } else { self.el.removeEvents('outerClick') self.data_container.tween('left', self.getWidth(), 0); } }, getHeight: function(){ var self = this; if(!self.height) self.height = self.data_container.getCoordinates().height; return self.height; }, getWidth: function(){ var self = this; if(!self.width) self.width = self.data_container.getCoordinates().width; return self.width; }, get: function(attr){ return this.data[attr] || this.data.library[attr] } }); var MovieAction = new Class({ class_name: 'action', initialize: function(movie){ var self = this; self.movie = movie; self.create(); self.el.addClass(self.class_name) }, create: function(){}, disable: function(){ this.el.addClass('disable') }, enable: function(){ this.el.removeClass('disable') }, toElement: function(){ return this.el } }) Movie.Action = {} Movie.Action.Edit = new Class({ Extends: MovieAction, create: function(){ var self = this; self.el = new Element('a.edit', { 'title': 'Refresh the movie info and do a forced search', 'events': { 'click': self.editMovie.bind(self) } }); }, editMovie: function(e){ var self = this; (e).stop(); if(!self.options_container){ self.options_container = new Element('div.options').adopt( $(self.movie.thumbnail).clone(), new Element('div.form').adopt( self.title_select = new Element('select', { 'name': 'title' }), self.profile_select = new Element('select', { 'name': 'profile' }), new Element('a.button.edit', { 'text': 'Save', 'events': { 'click': self.save.bind(self) } }) ) ).inject(self.movie, 'top'); } self.movie.slide('in'); }, save: function(){ var self = this; Api.request('movie.edit', { 'data': { 'default_title': self.title_select.get('value'), 'profile_id': self.profile_select.get('value') }, 'useSpinner': true, 'spinnerTarget': self.movie }) } }) Movie.Action.IMDB = new Class({ Extends: MovieAction, id: null, create: function(){ var self = this; self.id = self.movie.get('identifier'); self.el = new Element('a.imdb', { 'title': 'Go to the IMDB page of ' + self.movie.getTitle(), 'events': { 'click': self.gotoIMDB.bind(self) } }); if(!self.id) self.disable(); }, gotoIMDB: function(e){ var self = this; (e).stop(); window.open('http://www.imdb.com/title/'+self.id+'/'); } }) Movie.Action.Refresh = new Class({ Extends: MovieAction, create: function(){ var self = this; self.el = new Element('a.refresh', { 'title': 'Refresh the movie info and do a forced search', 'events': { 'click': self.doSearch.bind(self) } }); }, doSearch: function(e){ var self = this; (e).stop(); Api.request('movie.refresh', { 'data': { 'id': self.movie.get('id') } }) } }) Movie.Action.Delete = new Class({ Extends: MovieAction, Implements: [Chain], create: function(){ var self = this; self.el = new Element('a.delete', { 'title': 'Remove the movie from your wanted list', 'events': { 'click': self.showConfirm.bind(self) } }); }, showConfirm: function(e){ var self = this; (e).stop(); if(!self.delete_container){ self.delete_container = new Element('div.delete_container', { 'styles': { 'line-height': self.movie.getHeight() } }).adopt( new Element('a.cancel', { 'text': 'Cancel', 'events': { 'click': self.hideConfirm.bind(self) } }), new Element('span.or', { 'text': 'or' }), new Element('a.button.delete', { 'text': 'Delete movie', 'events': { 'click': self.del.bind(self) } }) ).inject(self.movie, 'top') } self.movie.slide('in'); }, hideConfirm: function(e){ var self = this; (e).stop(); self.movie.slide('out'); }, del: function(e){ (e).stop() var self = this; var movie = $(self.movie); self.chain( function(){ $(movie).mask().addClass('loading') self.callChain(); }, function(){ Api.request('movie.delete', { 'data': { 'id': self.movie.get('id') }, 'onComplete': function(){ movie.set('tween', { 'onComplete': function(){ movie.destroy(); } }) movie.tween('height', 0) } }) } ); self.callChain(); } })