pandora.ui.infoView = function(data) { var listWidth = 144 + Ox.UI.SCROLLBAR_SIZE, margin = 8, posterRatio = data.poster.width / data.poster.height, posterWidth = posterRatio > 1 ? 256 : Math.round(256 * posterRatio), posterHeight = posterRatio < 1 ? 256 : Math.round(256 / posterRatio), posterLeft = Math.floor((256 - posterWidth) / 2), editPoster = false, that = Ox.Element(), $list, $info = $('
') .css({ position: 'absolute', left: pandora.user.level == 'admin' ? -listWidth + 'px' : 0, top: 0, right: 0, }) .appendTo(that.$element), $data = Ox.Container() .css({ position: 'absolute', left: (pandora.user.level == 'admin' ? listWidth : 0) + 'px', top: 0, right: 0, height: pandora.$ui.contentPanel.size(1) + 'px' }) .appendTo($info), $poster = $('') .attr({ src: '/' + data.id + '/poster.jpg' }) .css({ position: 'absolute', left: margin + posterLeft + 'px', top: margin + 'px', width: posterWidth + 'px', height: posterHeight + 'px', cursor: pandora.user.level == 'admin' ? 'pointer' : 'default' }) .appendTo($data.$element), $reflection = $('
') .css({ display: 'block', position: 'absolute', left: margin + 'px', top: margin + posterHeight + 'px', width: '256px', height: '128px', overflow: 'hidden' }) .appendTo($data.$element), $reflectionPoster = $('') .attr({ src: '/' + data.id + '/poster.jpg' }) .css({ position: 'absolute', left: posterLeft + 'px', width: posterWidth + 'px', height: posterHeight + 'px', MozTransform: 'scaleY(-1)', WebkitTransform: 'scaleY(-1)' }) .appendTo($reflection), $reflectionGradient = $('
') .css({ display: 'block', position: 'absolute', left: margin + 'px', width: '256px', height: '128px' }) .css('background', '-moz-linear-gradient(top, rgba(16, 16, 16, 0.75), rgba(16, 16, 16, 1))') .css('background', '-webkit-linear-gradient(top, rgba(16, 16, 16, 0.75), rgba(16, 16, 16, 1))') .appendTo($reflection), $text = $('
') .css({ position: 'absolute', left: margin + 256 + margin + 'px', top: margin + 'px', right: margin + 'px' }) .appendTo($data.$element); Ox.print('DATA', data); ['title', 'director'].forEach(function(key) { $('
') .css({ marginTop: key == 'title' ? '-2px' : '2px', fontWeight: 'bold', fontSize: '13px', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .html(formatValue(data[key], key == 'director' ? 'director' : null)) .appendTo($text); }); var $div = $('
') .css({ marginTop: '4px', textAlign: 'justify' }) .appendTo($text); ['country', 'year', 'language', 'runtime'].forEach(function(key) { data[key] && $('') .html( formatKey(key) + (key == 'runtime' ? Math.round(data[key] / 60) + ' min' : formatValue(data[key], key == 'runtime' ? null : key)) + '  ' ) .appendTo($div); }); // fixme: should be camelCase! data.alternative_titles && $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .html( formatKey('Alternative Titles') + data.alternative_titles.map(function(value) { return value[0] + ( value[1] ? ' (' + value[1] + ')' : '' ); }).join(', ') ) .appendTo($text); $div = $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .appendTo($text); ['writer', 'producer', 'cinematographer', 'editor'].forEach(function(key) { data[key] && $('') .html( formatKey(key) + formatValue(data[key], 'name') + '  ' ) .appendTo($div); }); ['cast', 'genre', 'keyword'].forEach(function(key) { data[key] && $('
') .css({ marginTop: '4px', textAlign: 'justify' }) .html( formatKey(key == 'keyword' ? 'keywords' : key) + (key == 'cast' ? data[key].map(function(value) { value.character = value.character.replace('(uncredited)', '').trim(); return formatValue(value.actor, 'name') + ( value.character ? ' (' + formatValue(value.character, 'name') + ')' : '' ); }).join(', ') : formatValue(data[key], key == 'cast' ? 'name' : key)) ) .appendTo($text); }); data.summary && $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .html( formatKey('summary') + data.summary ) .appendTo($text); data.trivia && data.trivia.forEach(function(value) { $('
') .css({ display: 'table-row' }) .append( $('
') .css({ //display: 'inline', display: 'table-cell', //float: 'left', width: '12px', marginTop: '4px', paddingBottom: '4px' }) .html('') ) .append( $('
') .css({ //clear: 'both', display: 'table-cell', //float: 'left', //width: '100px', paddingTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .html(value) ) .append( $('
').css({clear: 'both'}) ) .appendTo($text); }); data.filming_locations && $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .html( formatKey('Filming Locations') + data.filming_locations.join('; ') ) .appendTo($text); data.releasedate && $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .html( formatKey('Release Date') + Ox.formatDate(data.releasedate, '%A, %B %e, %Y') ) .appendTo($text); if (data.budget || data.gross || data.profit) { $div = $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .appendTo($text); ['budget', 'gross', 'profit'].forEach(function(key) { data[key] && $('') .html( formatKey(key) + data[key] + '  ' ) .appendTo($div); }); } if (data.rating || data.votes) { $div = $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .appendTo($text); ['rating', 'votes'].forEach(function(key) { data[key] && $('') .html( formatKey(key) + Ox.formatNumber(data[key]) + '  ' ) .appendTo($div); }); } if (data.connections) { $div = $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .appendTo($text); Ox.forEach(data.connections, function(movies, key) { $('') .html( formatKey(key) + formatValue(movies) + '  ' ) .appendTo($div); }); } data.reviews && $('
') .css({ marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }) .html( formatKey('reviews') + data.reviews.map(function(review) { return '' + review.source + '' }).join(', ') ) .appendTo($text); $('
').css({height: '8px'}).appendTo($text); if (pandora.user.level == 'admin') { var icon = 'posters', selectedImage = {}; $poster.bind({ click: function() { if (!editPoster) { $info.animate({ left: 0 }, 250); editPoster = true; } else { $info.animate({ left: -listWidth + 'px' }, 250); editPoster = false; } } }); pandora.api.get({ id: data.id, keys: [icon] }, function(result) { Ox.print('RESULT', result.data) var images = result.data[icon]; selectedImage = images.filter(function(image) { return image.selected; })[0]; $list = Ox.IconList({ item: function(data, sort, size) { var ratio = data.width / data.height; size = size || 128; return { height: ratio <= 1 ? size : size / ratio, id: data['id'], info: data.width + ' x ' + data.height + ' px', title: icon == 'posters' ? data.source : Ox.formatDuration(data.position), url: data.url, width: ratio >= 1 ? size : size * ratio } }, items: images, keys: icon == 'posters' ? ['index', 'source', 'width', 'height', 'url'] : ['index', 'position', 'width', 'height', 'url'], max: 1, min: 1, orientation: 'vertical', selected: [selectedImage['index']], size: 128, sort: [{key: 'index', operator: '+'}], unique: 'index' }) .css({ display: 'block', position: 'absolute', left: 0, top: 0, width: listWidth + 'px', height: pandora.$ui.contentPanel.size(1) + 'px' }) .bindEvent({ select: function(event) { var index = event.ids[0]; selectedImage = images.filter(function(image) { return image.index == index; })[0]; //renderPreview(selectedImage); pandora.api[icon == 'posters' ? 'setPoster' : 'setPosterFrame'](Ox.extend({ id: data.id }, icon == 'posters' ? { source: selectedImage.source } : { position: selectedImage.index // fixme: api slightly inconsistent }), function(result) { var imageRatio = selectedImage.width / selectedImage.height; $('img[src*="/' + item + '/poster"]').each(function() { var $this = $(this), size = Math.max($this.width(), $this.height()), src = $this.attr('src').split('?')[0] + '?' + Ox.uid(); $('') .attr({src: src}) .load(function() { $this.attr({src: src}); icon == 'posters' && $this.css(imageRatio < 1 ? { width: Math.round(size * imageRatio) + 'px', height: size + 'px' } : { width: size + 'px', height: Math.round(size / imageRatio) + 'px' }); }); }); }); } }) .appendTo($info); }); } function formatKey(key) { return '' + Ox.toTitleCase(key) + ': '; } function formatValue(value, key) { return (Ox.isArray(value) ? value : [value]).map(function(value) { return key ? '' + value + '' : value; }).join(', '); } that.resize = function() { var height = pandora.$ui.contentPanel.size(1); $list && $list.css({height: height + 'px'}); $data.css({height: height + 'px'}); }; return that; }