'use strict'; oml.ui.infoView = function(identifyData) { var ui = oml.user.ui, arrayKeys = ['author', 'place', 'publisher', 'language'], iconSize = identifyData ? 256 : ui.iconSize, css = getCSS(iconSize, oml.config.iconRatio), ids = [ {key: 'isbn', url: 'https://google.com/search?q=ISBN+{0}'}, {key: 'asin', url: 'http://www.amazon.com/dp/{0}'}, {key: 'lccn', url: 'http://lccn.loc.gov/{0}'}, {key: 'oclc', url: 'https://www.worldcat.org/oclc/{0}'}, {key: 'olid', url: 'https://openlibrary.org/books/{0}'} ], that = Ox.Element() .addClass('OxTextPage') .css({overflowY: 'auto'}) .bindEvent({ oml_icons: function() { that.updateElement(ui.item, [$icon]) }, oml_item: function() { if (ui.item) { that.updateElement(ui.item); } }, oml_listselection: function(data) { if (data.value && data.value.length) { that.updateElement(data.value[0]); } } }), $icon = Ox.Element() .css({ position: 'absolute', left: '16px', top: '16px', width: css.icon.width }) .appendTo(that), $info = Ox.Element() .addClass('OxSelectable') .css({ position: 'absolute', left: css.info.left, right: !identifyData ? '176px' : 16 + Ox.UI.SCROLLBAR_SIZE + 'px', top: '16px' }) [iconSize == 512 ? 'hide' : 'show']() .appendTo(that), $data, $image, $reflection, $reflectionImage; if (!identifyData) { $data = Ox.Element() .addClass('OxSelectable') .css({ position: 'absolute', right: '16px', top: '16px', width: '128px' }) .appendTo(that); } function getCSS(size, ratio) { var width = Math.round(ratio >= 1 ? size : size * ratio), height = Math.round(ratio <= 1 ? size : size / ratio), left = size == 256 ? Math.floor((size - width) / 2) : 0; return { icon: { width: size + 'px' }, info: { left: (size == 256 ? size + 32 : width + 48) + 'px' }, image: { left: left + 'px', width: width + 'px', height: height + 'px' }, reflection: { top: height + 'px' } }; } function getIconTooltip() { return !identifyData ? 'Click to see ' + (ui.iconSize == 256 ? 'large' : 'small') + ' ' + ui.icons + ', doubleclick to see ' + (ui.icons == 'cover' ? 'preview' : 'cover') : ''; } function formatLight(string) { return '' + string + ''; } function formatKey(key) { var item = Ox.getObjectById(oml.config.itemKeys, key); return '' + Ox._(Ox.toTitleCase(key)) + ': '; } function formatValue(value, key) { return value ? (Ox.isArray(value) ? value : [value]).map(function(value) { value = Ox.encodeHTMLEntities(value); if (key == 'date' && value) { value = value.slice(0, 4); } return key && !identifyData ? '' + value + '' : value; }).join('; ') : ''; } function identify(data) { oml.$ui.identifyDialog = oml.ui.identifyDialog(data).open(); } function renderIdentifyButton(data) { return Ox.FormElementGroup({ elements: [ Ox.Button({ disabled: data.mediastate != 'available', title: Ox._('Identify Book...'), width: 112 }) .bindEvent({ click: function() { identify(data); } }), data.mediastate == 'available' && data.primaryid ? Ox.Select({ items: Ox.flatten(ids.map(function(id) { return (data[id.key] || []).map(function(value) { return { id: id.key + ':' + value, title: '' + Ox.getObjectById( oml.config.itemKeys, id.key ).title + ': ' + value }; }); })).concat([ {id: '', title: 'No ID'} ]), max: 1, min: 1, overlap: 'left', title: 'select', tooltip: Ox._('Set Primary ID'), type: 'image', value: data.primaryid.join(':') }) .bindEvent({ click: function(data) { // ... }, change: function(data) { oml.api.edit({ id: ui.item, primaryid: data.value ? data.value.split(':') : '' }, function(result) { that.updateElement(result.data, [$info, $data]); }); } }) : Ox.Button({ disabled: true, overlap: 'left', title: 'select', type: 'image' }) ], float: 'right' }) .css({marginTop: '16px'}); } function renderOpenButton(data) { return data.mediastate == 'available' ? Ox.Button({ title: Ox._('Open Folder'), width: 128 }) .css({marginTop: '16px'}) .bindEvent({ click: function() { oml.api.openFolder({id: oml.user.ui.item}); } }) : Ox.Element(); } function renderMediaButton(data) { function getListItems() { var items = []; if (ui._lists) { items = ui._lists.filter(function(list) { return list.user == oml.user.preferences.username && list.type != 'smart'; }).map(function(list) { return { id: list.id, title: Ox._('Download to {0}', [list.name]) }; }); items.splice(1, 0, [{}]); } return items; } function setListItems() { if ($element && ui._lists) { $element.options({ disabled: false }).options('elements')[1].options({ items: getListItems() }); } else { setTimeout(setListItems, 100); } } if (data.mediastate == 'unavailable' && !ui._lists) { setListItems(); } var $element = (data.mediastate == 'unavailable' || Ox.isUndefined(data.mediastate)) ? Ox.FormElementGroup({ elements: [ Ox.Button({ title: Ox._('Download Book'), width: 112 }) .bindEvent({ click: function() { data.mediastate = 'transferring'; that.updateElement(data, $data); oml.api.download({id: ui.item}, function(result) { // ... }); } }), Ox.MenuButton({ disabled: !ui._lists, items: getListItems(), overlap: 'left', title: 'select', tooltip: Ox._('Download Book to a List'), type: 'image' }) .bindEvent({ click: function(data) { data.mediastate = 'transferring'; that.updateElement(data, $data); oml.api.download(Ox.extend({ id: ui.item, }, data.id == ':' ? {} : { list: data.id.slice(1) }), function(result) { // ... }); } }) ], float: 'right' }) : data.mediastate == 'transferring' ? Ox.FormElementGroup({ elements: [ Ox.Button({ title: Ox._('Transferring...'), width: 112 }) .bindEvent({ click: function() { oml.UI.set({page: 'transfers'}); } }), Ox.Button({ overlap: 'left', title: 'close', tooltip: Ox._('Cancel Transfer'), type: 'image' }) .bindEvent({ click: function() { data.mediastate = 'unavailable'; that.updateElement(data, $data); oml.api.cancelDownloads({ids: [ui.item]}, function() { that.updateElement(ui.item, $data); }); } }) ], float: 'right' }) : Ox.Button({ title: Ox._('Read Book'), width: 128 }) .bindEvent({ click: function() { oml.UI.set({itemView: 'book'}); } }); return $element; } function toggleCoverSize(ratio) { var css; iconSize = iconSize == 256 ? 512 : 256, css = getCSS(iconSize, ratio); //$icon.animate(css.icon, 250); $info.animate(css.info, 250); $image.animate(css.image, 250); $reflectionImage.animate(css.image, 250); $reflection.animate(css.reflection, 250); oml.UI.set({iconSize: iconSize}); } function updateCover(ratio) { var css = getCSS(iconSize, ratio); $image.css(css.image).show(); $reflectionImage.css(css.image); $reflection.css(css.reflection).show(); } that.updateElement = function(idOrData, $elements) { var data = Ox.isObject(idOrData) ? idOrData : null, id = data ? null : idOrData, $elements = $elements ? Ox.makeArray($elements) : [$icon, $info, $data]; (data ? Ox.noop : oml.api.get)({ id: id, keys: [] }, function(result) { if (!identifyData && id && id != ui.item) { return; } if (result) { data = result.data; } Ox.print('BOOK DATA', data) var $div, isEditable = data.mediastate == 'available' && !identifyData, src = !identifyData ? '/' + data.id + '/' + ui.icons + '512.jpg?' + data.modified : data.cover, ratio = ( ui.icons == 'cover' || identifyData ? data.coverRatio : data.previewRatio ) || oml.config.iconRatio, size = iconSize, reflectionSize = Math.round(size / 2); $elements.forEach(function($element) { $element.empty(); if ($element == $icon) { $image = Ox.Element({ element: '', tooltip: getIconTooltip() }) .on({ error: function() { if (size == 512) { $info.show(); } }, load: function() { ratio = $image[0].width / $image[0].height; updateCover(ratio); if (size == 512) { $info.css({ left: getCSS(512, ratio).info.left }).show(); } } }) .attr({src: src}) .css({ position: 'absolute' }) .hide() .bindEvent({ doubleclick: function() { if (!identifyData) { oml.UI.set({ icons: ui.icons == 'cover' ? 'preview' : 'cover' }); } }, singleclick: function() { if (!identifyData) { toggleCoverSize(ratio); } } }) .appendTo($icon); $reflection = $('