// vim: et:ts=4:sw=4:sts=4:ft=javascript pandora.ui.list = function(view) { // fixme: remove view argument var that, $map, preview = false; //Ox.print('constructList', view); if (view == 'list') { /* keys = Ox.unique($.merge( $.map(pandora.user.ui.lists[pandora.user.ui.list].columns, function(id) { return Ox.getObjectById(pandora.site.sortKeys, id); }), pandora.site.sortKeys )); Ox.print('$$$$', keys) */ that = Ox.TextList({ columns: $.map(pandora.site.sortKeys, function(key, i) { var position = pandora.user.ui.lists[pandora.user.ui.list].columns.indexOf(key.id); return { align: ['string', 'text'].indexOf( Ox.isArray(key.type) ? key.type[0]: key.type ) > -1 ? 'left' : 'right', defaultWidth: key.columnWidth, format: key.format, id: key.id, operator: pandora.getSortOperator(key.id), position: position, removable: !key.columnRequired, title: key.title, type: key.type, unique: key.id == 'id', visible: position > -1, width: pandora.user.ui.lists[pandora.user.ui.list].columnWidth[key.id] || key.columnWidth }; }), columnsMovable: true, columnsRemovable: true, columnsResizable: true, columnsVisible: true, id: 'list', items: function(data, callback) { //Ox.print('data, pandora.Query.toObject', data, pandora.Query.toObject()) pandora.api.find($.extend(data, { query: pandora.Query.toObject() }), callback); }, scrollbarVisible: true, sort: pandora.user.ui.lists[pandora.user.ui.list].sort }) .bindEvent({ columnchange: function(event, data) { var columnWidth = {}; pandora.UI.set(['lists', pandora.user.ui.list, 'columns'].join('|'), data.ids); /* data.ids.forEach(function(id) { columnWidth[id] = pandora.user.ui.lists[pandora.user.ui.list].columnWidth[id] || Ox.getObjectById(pandora.site.sortKeys, id).width }); pandora.UI.set(['lists', pandora.user.ui.list, 'columnWidth'].join('|'), columnWidth); */ }, columnresize: function(event, data) { pandora.UI.set(['lists', pandora.user.ui.list, 'columnWidth', data.id].join('|'), data.width); }, resize: function(event, data) { // this is the resize event of the split panel that.size(); }, sort: function(event, data) { pandora.UI.set(['lists', pandora.user.ui.list, 'sort'].join('|'), [data]); } }); } else if (view == 'icons') { that = Ox.IconList({ defaultRatio: pandora.user.ui.icons == 'posters' ? 5/8 : 1, id: 'list', item: function(data, sort, size) { var icons = pandora.user.ui.icons, ratio = icons == 'posters' ? data.poster.width / data.poster.height : 1; size = size || 128; return { height: ratio <= 1 ? size : size / ratio, id: data.id, info: data[['title', 'director'].indexOf(sort[0].key) > -1 ? 'year' : sort[0].key], title: data.title + (data.director.length ? ' (' + data.director.join(', ') + ')' : ''), url: icons == 'posters' ? '/' + data.id + '/poster' + size + '.jpg' : '/' + data.id + '/icon' + size + '.jpg', width: ratio >= 1 ? size : size * ratio }; }, items: function(data, callback) { //Ox.print('data, pandora.Query.toObject', data, pandora.Query.toObject()) pandora.api.find($.extend(data, { query: pandora.Query.toObject() }), callback); }, keys: ['director', 'id', 'poster', 'title', 'year'], size: 128, sort: pandora.user.ui.lists[pandora.user.ui.list].sort, unique: 'id' }); } else if (view == 'info') { that = Ox.Element().css({margin: '16px'}).html(view + ' results view still missing.'); } else if (view == 'clips') { that = Ox.Element().css({margin: '16px'}).html(view + ' results view still missing.'); } else if (view == 'timelines') { that = Ox.Element().css({margin: '16px'}).html(view + ' results view still missing.'); } else if (view == 'maps') { that = Ox.Element().css({margin: '16px'}).html(view + ' results view still missing.'); } else if (view == 'calendars') { that = Ox.Element().css({margin: '16px'}).html(view + ' results view still missing.'); } else if (view == 'clip') { var fixedRatio = 16/9; that = Ox.IconList({ fixedRatio: fixedRatio, item: function(data, sort, size) { size = size || 128; var ratio = data.aspectRatio, width = ratio > fixedRatio ? size : Math.round(size * ratio / fixedRatio), height = Math.round(width / ratio), url = '/' + data.item + '/' + height + 'p' + data['in'] + '.jpg'; return { height: height, id: data['id'], info: Ox.formatDuration(data['in'], 'short') + ' - ' + Ox.formatDuration(data['out'], 'short'), title: data.value, url: url, width: width }; }, items: function(data, callback) { var itemQuery = pandora.Query.toObject(), query = {conditions:[]}; //fixme: can this be in pandora.Query? dont just check for subtitles itemQuery.conditions.forEach(function(q) { if (q.key == 'subtitles') { query.conditions.push({key: 'value', value: q.value, operator: q.operator}); } }); pandora.api.findAnnotations($.extend(data, { query: query, itemQuery: itemQuery }), callback); }, keys: ['id', 'value', 'in', 'out', 'aspectRatio', 'item'], size: 128, sort: pandora.user.ui.lists[pandora.user.ui.list].sort, unique: 'id' }).bindEvent({ open: function(event, data) { var id = data.ids[0], item = that.value(id, 'item'), position = that.value(id, 'in'); pandora.UI.set('videoPosition|' + item, position); pandora.URL.set(item + '/timeline'); } }); } else if (view == 'map') { var fixedRatio = 16/9; that = Ox.SplitPanel({ elements: [ { element: pandora.$ui.map = Ox.Map({ height: window.innerHeight - pandora.user.ui.showGroups * pandora.user.ui.groupsSize - 61, places: function(data, callback) { var itemQuery = pandora.Query.toObject(), query = {conditions:[]}; return pandora.api.findPlaces($.extend(data, { itemQuery: itemQuery, query: query }), callback); }, showTypes: true, toolbar: true, width: window.innerWidth - pandora.user.ui.showSidebar * pandora.user.ui.sidebarSize - 2 - 144 - Ox.UI.SCROLLBAR_SIZE, }).bindEvent({ selectplace: function(event, place) { if(place && place.id[0] != '_') { pandora.$ui.clips.options({ items: function(data, callback) { return pandora.api.findAnnotations($.extend(data, { query: { conditions:[{key: 'place', value: place.id, operator:'='}] }, itemQuery: pandora.Query.toObject() }), callback); } }); } else { pandora.$ui.clips.options({ items: [] }); } } }) }, { element: pandora.$ui.clips = Ox.IconList({ fixedRatio: fixedRatio, item: function(data, sort, size) { Ox.print('RATIO', data.aspectRatio); size = size || 128; var width = data.aspectRatio < fixedRatio ? size : size * data.aspectRatio / fixedRatio, height = width / data.aspectRatio, url = '/' + data.item + '/' + width + '/' + data['in'] + '.jpg'; return { height: height, id: data.id, info: Ox.formatDuration(data['in'], 'short') + ' - ' + Ox.formatDuration(data['out'], 'short'), title: data.value, url: url, width: width }; }, items: [], keys: ['id', 'value', 'in', 'out', 'aspectRatio', 'item'], size: 128, sort: pandora.user.ui.lists[pandora.user.ui.list].sort, unique: 'id' }).bindEvent({ open: function(event, data) { var id = data.ids[0], item = pandora.$ui.clips.value(id, 'item'), position = pandora.$ui.clips.value(id, 'in'); pandora.UI.set('videoPosition|' + item, position); pandora.URL.set(item + '/timeline'); } }), id: 'place', size: 144 + Ox.UI.SCROLLBAR_SIZE } ], orientation: 'horizontal' }) .bindEvent('resize', function() { pandora.$ui.map.resizeMap(); }); } else if (view == 'calendar') { that = Ox.SplitPanel({ elements: [ { element: pandora.$ui.calendar = Ox.Calendar({ date: new Date(0), events: [ {name: 'Thirty Years\' War', start: '1618', end: '1648', type: 'other'}, {name: 'American Civil War', start: '1861-04-12', end: '1865-04-09', type: 'other'}, {name: 'Franco-Prussian War', start: '1870-07-19', end: '1871-05-10', type: 'other'}, {name: 'World War One', start: '1914-07-28', end: '1918-11-11', type: 'other'}, {name: 'World War Two', start: '1939-09-01', end: '1945-09-02', type: 'other'}, {name: 'Cold War', start: '1947', end: '1991', type: 'other'}, {name: 'Korean War', start: '1950-06-25', end: '1953-07-27', type: 'other'}, {name: 'Algerian War', start: '1954-11-01', end: '1962-03-19', type: 'other'}, {name: 'Vietnam War', start: '1955-11-01', end: '1975-04-30', type: 'other'}, {name: 'Six-Day War', start: '1967-06-05', end: '1967-06-11', type: 'other'}, {name: 'Iran-Iraq War', start: '1980-09-22', end: '1988-08-20', type: 'other'}, {name: 'Gulf War', start: '1990-08-02', end: '1991-02-28', type: 'other'} ], height: window.innerHeight - pandora.user.ui.showGroups * pandora.user.ui.groupsSize - 61, range: [-5000, 5000], width: window.innerWidth - pandora.user.ui.showSidebar * pandora.user.ui.sidebarSize - 2 - 144 - Ox.UI.SCROLLBAR_SIZE, zoom: 4 }) }, { element: Ox.Element(), id: 'place', size: 144 + Ox.UI.SCROLLBAR_SIZE } ], orientation: 'horizontal' }) .bindEvent('resize', function() { }); } else { $list = Ox.Element('