'use strict';
oml.ui.infoView = function(externalData, isMixed) {
isMixed = isMixed || {};
var ui = oml.user.ui,
arrayKeys = ['author', 'place', 'publisher', 'language', 'categories'],
iconSize = externalData ? 256 : ui.iconSize,
isMultiple = arguments.length == 2,
separator = '; ',
css = getCSS(iconSize, oml.config.iconRatio),
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
&& data.value[0] != ui.item
) {
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: !isMultiple ? css.info.left : '16px',
right: !externalData && !isMultiple
? '176px' : 16 + Ox.UI.SCROLLBAR_SIZE + 'px',
top: '16px'
})
[iconSize == 512 ? 'hide' : 'show']()
.appendTo(that),
$data,
$image, $reflection, $reflectionImage;
if (!externalData) {
$data = Ox.Element()
.addClass('OxSelectable')
.css({
position: 'absolute',
right: '16px',
top: '16px',
width: '128px'
})
.appendTo(that);
}
function formatLight(string) {
return '' + string + '';
}
function formatKey(key) {
return ''
+ Ox._(Ox.getObjectById(oml.config.itemKeys, key).title)
+ ': ';
}
function formatValue(value, key) {
var isEditor = key == 'author' && (value || []).some(function(value) {
return Ox.endsWith(value, ' (Ed.)');
});
return value ? (Ox.isArray(value) ? value : [value]).map(function(value) {
if (key == 'date' && value) {
value = value.slice(0, 4);
}
return (
key && !externalData ? '' : ''
) + (
key == 'author' ? value.replace(/ \(Ed\.\)$/, '') : value
) + (
key && !externalData ? '' : ''
);
}).join(separator) + (isEditor ? ' (Ed.)' : '') : '';
}
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 renderIdentifyButton(data) {
return Ox.Button({
disabled: data.mediastate != 'available',
style: 'squared',
title: Ox._('Identify Book...'),
width: 128
})
.css({marginTop: '8px'})
.bindEvent({
click: function() {
oml.$ui.identifyDialog = oml.ui.identifyDialog(data).open();
}
});
}
function renderMediaButton(data) {
function getListItems() {
var items = [];
if (ui._lists) {
items = ui._lists.filter(function(list) {
return list.user === ''
&& list.type != 'smart';
}).map(function(list) {
return {
id: list.id,
title: Ox._('Download to {0}', [
Ox.encodeHTMLEntities(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({
style: 'squared',
title: Ox._('Download Book'),
width: 112
})
.bindEvent({
click: function() {
data.mediastate = 'transferring';
that.updateElement(data, $data);
oml.api.addListItems({
items: [ui.item],
list: ':'
}, function(result) {
// ...
});
}
}),
Ox.MenuButton({
disabled: !ui._lists,
items: getListItems(),
overlap: 'left',
style: 'squared',
title: 'select',
tooltip: Ox._('Download Book to a List'),
type: 'image'
})
.bindEvent({
click: function(data_) {
data.mediastate = 'transferring';
that.updateElement(data, $data);
oml.api.addListItems({
items: [ui.item],
list: data_.id
}, function(result) {
// ...
});
}
})
],
float: 'right'
})
: data.mediastate == 'transferring'
? Ox.FormElementGroup({
elements: [
Ox.Button({
style: 'squared',
title: Ox._('Transferring...'),
width: 112
})
.bindEvent({
click: function() {
oml.UI.set({page: 'transfers'});
}
}),
Ox.Button({
overlap: 'left',
style: 'squared',
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.FormElementGroup({
elements: [
Ox.Button({
style: 'squared',
title: Ox._('Read Book'),
width: 112
})
.bindEvent({
click: function() {
oml.UI.set({itemView: 'book'});
}
}),
Ox.MenuButton({
items: [
{id: 'read', title: Ox._('Read in Open Media Libary')},
{id: 'open', title: Ox._('Open in External Reader')},
{},
{id: 'show', title: Ox._('Show File')}
],
overlap: 'left',
style: 'squared',
title: 'select',
tooltip: Ox._('Download Book to a List'),
type: 'image'
})
.bindEvent({
click: function(data_) {
if (data_.id == 'read') {
oml.UI.set({itemView: 'book'});
} else if (data_.id == 'open') {
oml.api.openFile({id: oml.user.ui.item});
} else {
oml.api.openFolder({id: oml.user.ui.item});
}
}
})
],
float: 'right'
});
return $element;
}
function renderShareButton(data) {
return Ox.Checkbox({
style: 'squared',
title: Ox._('Share Metadata'),
value: data.sharemetadata,
width: 128,
})
.css({marginTop: '8px'})
.bindEvent({
change: function(changeData) {
oml.api.edit({
id: data.id,
sharemetadata: changeData.value
}, function(result) {
if (!changeData.value) {
that.updateElement(result.data, [$icon, $info, $data]);
}
});
}
});
}
function splitValue(value, key) {
var isEditor = key == 'author'
&& Ox.decodeHTMLEntities(value).split(separator).some(function(value) {
return Ox.endsWith(value, ' (Ed.)');
});
return value ? Ox.unique(
Ox.decodeHTMLEntities(value).split(separator).map(function(value) {
value = Ox.encodeHTMLEntities(value);
return isEditor
? value.replace(/ \(Ed\.\)$/, '') + ' (Ed.)'
: value;
})
) : [];
}
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.updateCover = function(url) {
Ox.Request.clearCache('get');
that.updateElement(ui.item, $icon);
};
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 (!externalData && id && id != ui.item) {
return;
}
if (result) {
data = result.data;
}
Ox.print('BOOK DATA', data)
var $div,
isEditable = isMultiple || (
data.mediastate == 'available' && !externalData
),
src = !externalData
? '/' + data.id + '/' + ui.icons + '512.jpg?' + data.modified
: data.cover,
ratio = (
ui.icons == 'cover' || externalData
? 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: isEditable
? Ox._('Doubleclick to edit')
: ''
})
.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 (isEditable) {
oml.$ui.coverDialog = oml.ui.coverDialog(
id, data.cover
).open();
}
},
singleclick: function() {
if (!externalData) {
toggleCoverSize(ratio);
}
}
})
.appendTo($icon);
$reflection = $('