home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Narzedzia / Calibre / calibre-0.8.18.msi / file_305 < prev    next >
Text File  |  2010-10-28  |  12KB  |  350 lines

  1. /* COLUMNS */
  2. var cmap = ['title', 'authors', 'rating', 'date', 'series'];
  3. /* COLUMNS END */
  4. var column_titles = {
  5.     'title'    : 'Title',
  6.     'authors'  : 'Author(s)',
  7.     'rating'   : 'Rating',
  8.     'date'     : 'Date',
  9.     'tags'     : 'Tags',
  10.     'series'   : 'Series'
  11. };
  12.  
  13. String.prototype.format = function() {
  14.     var pattern = /\{\d+\}/g;
  15.     var args = arguments;
  16.     return this.replace(pattern, function(capture){ return args[capture.match(/\d+/)]; });
  17. }
  18.  
  19. var last_search = '';
  20. var last_sort = null;
  21. var last_sort_order = null;
  22. var last_start = 0;
  23. var last_num = 20;
  24. var total = 0;
  25. var current_library_request = null;
  26.  
  27. ////////////////////////////// GET BOOK LIST //////////////////////////////
  28.  
  29. var LIBRARY_FETCH_TIMEOUT = 5*60000; // milliseconds
  30.  
  31. function create_table_headers() {
  32.     var thead = $('table#book_list thead tr');
  33.     var titles = '';
  34.     for (i = 0; i < cmap.length; i++) {
  35.         titles += '<td>{0} <span class="sort_indicator" id="{1}_sort">Γåæ</span></td>'
  36.             .format(column_titles[cmap[i]], cmap[i]);
  37.     }
  38.     thead.html(titles);
  39. }
  40.  
  41.  
  42. function format_url(format, id, title) {
  43.     return url_prefix + '/get/'+format.toLowerCase() + '/'+encodeURIComponent(title) + '_' + id+'.'+format.toLowerCase();
  44. }
  45.  
  46. function render_book(book) {
  47.     // Render title cell
  48.     var title = '<i>{0}</i>'.format(book.attr("title")) + '<br /><span class="subtitle">';
  49.     var id    = book.attr("id");
  50.     var comments = $.trim(book.text()).replace(/\n\n/, '<br/>');
  51.     var formats = new Array();
  52.     var size = (parseFloat(book.attr('size'))/(1024*1024)).toFixed(1);
  53.     var tags = book.attr('tags')
  54.     formats = book.attr("formats").split(",");
  55.     if (formats.length > 0) {
  56.         for (i=0; i < formats.length; i++) {
  57.             title += '<a title="Download in '+formats[i]+' format" class="format" href="'+format_url(formats[i], id, book.attr("safe_title"))+'">'+formats[i]+'</a>, ';
  58.         }
  59.         title = title.slice(0, title.length-2);
  60.         title += ' ({0} MB) '.format(size);
  61.     }
  62.     title += '<span class="tagdata_short" style="display:all">'
  63.     if (tags) {
  64.         t = tags.split(':&:', 2);
  65.         m = parseInt(t[0]);
  66.         tall = t[1].split(',');
  67.         t = t[1].split(',', m);
  68.         if (tall.length > m) t[m] = '...'
  69.         title += 'Tags=[{0}] '.format(t.join(','));
  70.     }
  71.     custcols = book.attr("custcols").split(',')
  72.     for ( i = 0; i < custcols.length; i++) {
  73.         if (custcols[i].length > 0) {
  74.             vals = book.attr(custcols[i]).split(':#:', 2);
  75.             if (vals[0].indexOf('#T#') == 0) { //startswith
  76.                 vals[0] = vals[0].substr(3, vals[0].length)
  77.                 t = vals[1].split(':&:', 2);
  78.                 m = parseInt(t[0]);
  79.                 t = t[1].split(',', m);
  80.                 if (t.length == m) t[m] = '...';
  81.                 vals[1] = t.join(',');
  82.             }
  83.             title += '{0}=[{1}] '.format(vals[0], vals[1]);
  84.         }
  85.     }
  86.     title += '</span>'
  87.     title += '<span class="tagdata_long" style="display:none">'
  88.     if (tags) {
  89.         t = tags.split(':&:', 2);
  90.         title += 'Tags=[{0}] '.format(t[1]);
  91.     }
  92.     custcols = book.attr("custcols").split(',')
  93.     for ( i = 0; i < custcols.length; i++) {
  94.         if (custcols[i].length > 0) {
  95.             vals = book.attr(custcols[i]).split(':#:', 2);
  96.             if (vals[0].indexOf('#T#') == 0) { //startswith
  97.                 vals[0] = vals[0].substr(3, vals[0].length)
  98.                 vals[1] = (vals[1].split(':&:', 2))[1];
  99.             }
  100.             title += '{0}=[{1}] '.format(vals[0], vals[1]);
  101.         }
  102.     }
  103.     title += '</span>'
  104.     title += '<img style="display:none" alt="" src="{1}/get/cover/{0}" /></span>'.format(id, url_prefix);
  105.     title += '<div class="comments">{0}</div>'.format(comments)
  106.     // Render authors cell
  107.     var _authors = new Array();
  108.     var authors = '';
  109.     _authors = book.attr('authors').split('|');
  110.     for (i = 0; i < _authors.length; i++) {
  111.         authors += jQuery.trim(_authors[i]).replace(/ /g, ' ')+'<br />';
  112.     }
  113.     if (authors) { authors = authors.slice(0, authors.length-6); }
  114.  
  115.     // Render rating cell
  116.     var _rating = parseFloat(book.attr('rating'))/2.;
  117.     var rating = '';
  118.     for (i = 0; i < _rating; i++) { rating += '★'}
  119.  
  120.     // Render date cell
  121.     var _date = Date.parseExact(book.attr('timestamp'), 'yyyy/MM/dd HH:mm:ss');
  122.     var date = _date.toString('d MMM yyyy').replace(/ /g, ' ');
  123.  
  124.     // Render series cell
  125.     var series = book.attr("series")
  126.     if (series) {
  127.         series += ' [{0}]'.format(book.attr('series_index'));
  128.     }
  129.  
  130.     var cells = {
  131.         'title'   : title,
  132.         'authors' : authors,
  133.         'rating'  : rating,
  134.         'date'    : date,
  135.         'series'  : series
  136.     };
  137.  
  138.     var row = '';
  139.     for (i = 0; i < cmap.length; i++) {
  140.         row += '<td class="{0}">{1}</td>'.format(cmap[i], cells[cmap[i]]);
  141.     }
  142.     return '<tr id="{0}">{1}</tr>'.format(id, row);
  143. }
  144.  
  145. function fetch_library_books(start, num, timeout, sort, order, search) {
  146.     // null, 0, false are False
  147.     data = {"start":start+'', "num":num+''};
  148.     if (sort)   { data["sort"] = sort; }
  149.     if (search) { data["search"] = search; }
  150.     if (order)  { data['order'] = order; }
  151.     last_num = num;
  152.     last_start = start;
  153.     last_search = search;
  154.     last_sort = sort;
  155.     last_sort_order = order;
  156.  
  157.     if (current_library_request != null) {
  158.         current_library_request.abort();
  159.         current_library_request = null;
  160.     }
  161.  
  162.     $('#cover_pane').css('visibility', 'hidden');
  163.     $('#loading').css('visibility', 'visible');
  164.  
  165.     current_library_request = $.ajax({
  166.       type: "GET",
  167.       url: "xml",
  168.       data: data,
  169.       cache: false,
  170.       timeout: timeout, //milliseconds
  171.       dataType: "xml",
  172.  
  173.       error : function(XMLHttpRequest, textStatus, errorThrown) {
  174.           alert('Error: '+textStatus+'\n\n'+errorThrown);
  175.       },
  176.  
  177.       success : function(xml, textStatus) {
  178.           var library = $(xml).find('library');
  179.           total = parseInt(library.attr('total'));
  180.           var num   = parseInt(library.attr('num'));
  181.           var start = parseInt(library.attr('start'));
  182.           update_count_bar(start, num, total);
  183.           var display = '';
  184.           library.find('book').each( function() {
  185.               var book = $(this);
  186.               var row = render_book(book);
  187.               display += row+'\n\n';
  188.           });
  189.           $("#book_list tbody").html(display);
  190.           $("#book_list tbody tr").bind('mouseenter', function() {
  191.               var row = $(this);
  192.               $('#book_list tbody tr:even').css('background-color', '#eeeeee');
  193.               $('#book_list tbody tr:odd').css('background-color', 'white');
  194.  
  195.               row.css('background-color', "#fff2a8");
  196.               row.bind('mouseleave', function(){
  197.                   row.css('background-color', "white");
  198.                   $('#book_list tbody tr:even').css('background-color', '#eeeeee');
  199.                   row.unbind('mouseleave');
  200.               });
  201.           });
  202.           $("#book_list tbody tr").click(function(){
  203.               var row = $(this);
  204.               var cover = row.find('img').attr('src');
  205.               var collapsed = row.find('.comments').css('display') == 'none';
  206.               $("#book_list tbody tr * .comments").css('display', 'none');
  207.               $("#book_list tbody tr * .tagdata_short").css('display', 'inherit');
  208.               $("#book_list tbody tr * .tagdata_long").css('display', 'none');
  209.               $('#cover_pane').css('visibility', 'hidden');
  210.               if (collapsed) {
  211.                   row.find('.comments').css('display', 'inherit');
  212.                   $('#cover_pane img').attr('src', cover);
  213.                   $('#cover_pane').css('visibility', 'visible');
  214.                 row.find(".tagdata_short").css('display', 'none');
  215.                 row.find(".tagdata_long").css('display', 'inherit');
  216.               }
  217.           });
  218.  
  219.  
  220.           layout();
  221.           $('#book_list tbody tr:even').css('background-color', '#eeeeee');
  222.       },
  223.  
  224.       complete : function(XMLHttpRequest, textStatus) {
  225.           current_library_request = null;
  226.           document.getElementById('main').scrollTop = 0;
  227.           $('#loading').css('visibility', 'hidden');
  228.       }
  229.  
  230.     });
  231.  
  232. }
  233.  
  234.  
  235. ////////////////////////////// COUNT BAR //////////////////////////////
  236.  
  237. function update_count_bar(start, num, total) {
  238.     var cb = $('#count_bar');
  239.     cb.find('#count').html('Books {0} to {1} of {2}'.format(start+1, start+num, total));
  240.     var left = cb.find('#left');
  241.     left.css('opacity', (start <= 0) ? 0.3 : 1);
  242.     var right = cb.find('#right');
  243.     right.css('opacity', (start + num >= total) ? 0.3 : 1);
  244.  
  245. }
  246.  
  247. function setup_count_bar() {
  248.     $('#count_bar * img:eq(0)').click(function(){
  249.         if (last_start > 0) {
  250.             fetch_library_books(0, last_num, LIBRARY_FETCH_TIMEOUT, last_sort, last_sort_order, last_search);
  251.         }
  252.     });
  253.  
  254.     $('#count_bar * img:eq(1)').click(function(){
  255.         if (last_start > 0) {
  256.             var new_start = last_start - last_num;
  257.             if (new_start < 0) {
  258.                 new_start = 0;
  259.             }
  260.             fetch_library_books(new_start, last_num, LIBRARY_FETCH_TIMEOUT, last_sort, last_sort_order, last_search);
  261.         }
  262.     });
  263.  
  264.     $('#count_bar * img:eq(2)').click(function(){
  265.         if (last_start + last_num < total) {
  266.             var new_start = last_start + last_num;
  267.             fetch_library_books(new_start, last_num, LIBRARY_FETCH_TIMEOUT, last_sort, last_sort_order, last_search);
  268.         }
  269.     });
  270.  
  271.     $('#count_bar * img:eq(3)').click(function(){
  272.         if (total - last_num > 0) {
  273.             fetch_library_books(total - last_num, last_num, LIBRARY_FETCH_TIMEOUT, last_sort, last_sort_order, last_search);
  274.         }
  275.     });
  276. }
  277.  
  278. ////////////////////////////// SEARCH /////////////////////////////////////////
  279.  
  280. function search() {
  281.     var search = $.trim($('#search_box * #s').val());
  282.     fetch_library_books(0, last_num, LIBRARY_FETCH_TIMEOUT,
  283.                         last_sort, last_sort_order, search);
  284. }
  285.  
  286.  
  287. /////////////////////////// SORTING /////////////////////////////////////
  288.  
  289. function setup_sorting() {
  290.     $('table#book_list  thead tr td').mouseover(function() {
  291.         this.style.backgroundColor = "#fff2a8";
  292.     });
  293.  
  294.     $('table#book_list  thead tr td').mouseout(function() {
  295.         this.style.backgroundColor = "transparent";
  296.     });
  297.  
  298.     for (i = 0; i < cmap.length; i++) {
  299.         $('table#book_list span#{0}_sort'.format(cmap[i])).parent().click(function() {
  300.             var sort_indicator = $($(this).find('span'));
  301.             var cell = $(sort_indicator.parent());
  302.             var id = sort_indicator.attr("id");
  303.             var col = id.slice(0, id.indexOf("_"));
  304.             var order = 'ascending';
  305.             var html = 'Γåæ';
  306.  
  307.             if (sort_indicator.html() == 'Γåæ') {
  308.                 order = 'descending'; html = 'Γåô';
  309.             }
  310.  
  311.             sort_indicator.html(html);
  312.             $('#book_list * .sort_indicator').css('visibility', 'hidden');
  313.             sort_indicator.css('visibility', 'visible');
  314.             fetch_library_books(last_start, last_num, LIBRARY_FETCH_TIMEOUT, col, order, last_search);
  315.         });
  316.     }
  317. }
  318.  
  319. ///////////////////////// STARTUP ////////////////////////////////////////
  320.  
  321. function layout() {
  322.     var main = $('#main'); var cb = $('#count_bar');
  323.     main.css('height', ($(window).height() - main.offset().top - 20)+'px')
  324.     main.css('width', ($(window).width() - main.offset().left - 15)+'px')
  325.     cb.css('right', '20px');
  326.     cb.css('top', (main.offset().top - cb.height()-5)+'px');
  327.     $('#loading').css('height', ($(window).height()-20)+'px');
  328.     $('#loading').css('width', ($(window).width()-20)+'px');
  329.     var cover = $('#cover_pane');
  330.     var title = $('#book_list thead tr td')
  331.     cover.css('width', (main.width()-title.offset().left - title.width()-15)+'px')
  332.     cover.css('height', main.height()+'px')
  333.     cover.css('left', (title.offset().left+title.width())+'px');
  334.     cover.css('top', main.offset().top+'px');
  335. }
  336.  
  337. $(function() {
  338.     // document is ready
  339.     create_table_headers();
  340.  
  341.     // Setup widgets
  342.     setup_sorting();
  343.     setup_count_bar();
  344.     $('#search_box * #s').val('');
  345.     $(window).resize(layout);
  346.  
  347.     $($('#book_list * span#date_sort').parent()).click();
  348.  
  349. });
  350.