/**
 * Common functions library
 *
 * Author: C. Neves <carlos@glencoesoftware.com>
 *
 * Copyright (c) 2007, 2008 Glencoe Software, Inc. All rights reserved.
 * 
 * This software is distributed under the terms described by the LICENCE file
 * you can find at the root of the distribution bundle, which states you are
 * free to use it only for non commercial purposes.
 * If the file is missing please request a copy by contacting
 * jason@glencoesoftware.com.
 *
 * @depends: gs_utils.js
 */

/**
 * global objects holder.
 */
var global = {cache: {}};

_gs_showResultLine = gs_showResultLine;


/**
 * Legend overlay dialog helper
 */
var details_popup_imghover = function (imgid, did) {
  return function () {
     if (global.onedit || $(this).is('.ts-focus')) {
       return;
     }
     if (imgid != null) {
       $('#details-name').html(global.cache['i'+did+':'+imgid].short_name);
       $('#details-legend').html(global.cache['i'+did+':'+imgid].short_legend);
       $('#details-popup').css({width: '300px', height: '140px'});
       $('#details-popup').get(0).placeAround(this, 0, -5);
       $('#details-popup .sdialog-content').css({overflow: 'hidden'});
     }
     if (!$('#details-popup').get(0).delayedShow(1000, function (elm) {
       $(elm).removeShadow().slideDown(function() {
         if ($('#details-popup').is(':visible')) {
           $('#details-popup').removeShadow();$(elm).dropShadow();
         }
       });
      })) {
       $('#details-popup').redrawShadow();
      }
  };
};
var details_popup_imghout = function (imgid) {
  return function () {
     if ($(this).is('.ts-focus')) {
       return;
     }
     $('#details-popup').get(0).delayedHide(1000, function (elm) {
       $(elm).slideUp(function() {$(elm).removeShadow();}).removeShadow();
      });
  };
};
var details_popup_close = function () {
  $('#details-popup').get(0).delayedHide(1, function (e) {
    $('#details-popup').removeShadow().slideUp('fast', function() {$('#details-popup').removeShadow();});
  });
};
var details_popup_prepare = function () {
  $('body').append('<div id="details-popup" class="sdialog">'+
                       '<h1 id="details-name">Image Name</h1>'+
                       '<div id="details-legend">Details Legend</div>'+
                     '</div>');
  $('#details-popup').sdialog();

};
var details_popup_feedcache = function (data, dsid, iid) {
  global.cache['i'+dsid+':'+iid] = data;
  global.cache['i'+dsid+':'+iid]['full_legend'] = data.legend.replace(/\n/g, '<br>')
  global.cache['i'+dsid+':'+iid]['short_legend'] = gs_text_trim (data.legend, 160, 5, false, ' ');
  global.cache['i'+dsid+':'+iid]['short_name'] = gs_text_trim (data.name, 20, 5, true);
}


/**
 * Search related stuff
 */ 
function jcb_getResultLineLinks (data, baseurl, renderurl) {
  var rv = gs_getResultLineLinks (data, baseurl, renderurl);
  if (rv != null) {
    rv.article = 'http://dx.doi.org/' + data.manuscript_doi;
  }
  return rv;
};
        
/**
 * Grabs details for a specific image and prepares add a DOM node and descendants for search results like l&f.
 */
function jcb_showResultLine (container, data, baseurl, renderurl) {
  if (data === null || data.dataset_id === null || data.project_id === null) {
    return null;
  }
  var result = $('<div class="search-result">').appendTo(container);
  var head = $('<div class="search-result-header">').appendTo(result);
  data['links'] = jcb_getResultLineLinks(data, baseurl, renderurl);
  head.append('<a href="'+data.links.figure+'">'+data.manuscript_title+'</a>');
  head.append('<div class="authors">'+data.authors+'</div>');
  head.append('<div class="detail">'+data.citation+'</div>');
  head.append('<div class="figure">(in '+data.figure_name+(data.part ? ': '+data.part : '')+')</div>');
  var detail = $('<div class="search-result-detail">').appendTo(result);
  detail.append('<a href="'+data.links.figure+'"><img src="'+data.links.thumb+'" /></a>');
  detail.append('<a href="'+data.links.figure+'" alt="Open complete figure">'+data.description+'</a>');
  detail.append('<div class="detail">'+data.legend+'</div>');
  var foot = $('<div class="search-result-footnotes"><span> [ </span></div>').appendTo(result);
  var fv = $('<a href="'+data.links.viewer+'" alt="Open Full Viewer">Full Viewer</a>').appendTo(foot);
  foot.append('&nbsp;<a href="'+data.links.article+'" alt="Article">Article</a>&nbsp;');
  fv.click(data.links.fv_click(data.dataset_id, data.image_id));
  foot.append('<a href="'+data.links.figure+'" alt="Figure">Figure</a>&nbsp;');
  foot.append('<span>]</span>');
  return result;
};

/**
 * Grabs details for a specific image list from the same project
 * and prepares add a DOM node and descendants for search results like l&f.
 */
function jcb_showCompoundResultLine (container, data, baseurl, renderurl) {
  if (data[0] === null || data[0].dataset_id === null || data[0].project_id === null) {
    return null;
  }
  var result = $('<div class="search-result">').appendTo(container);
  var head = $('<div class="search-result-header">').appendTo(result);
  data[0]['links'] = jcb_getResultLineLinks(data[0], baseurl, renderurl);
  head.append('<a href="'+data[0].links.paper+'">'+data[0].manuscript_title+'</a>');
  head.append('<div class="authors">'+data[0].authors+'</div>');
  for (e=0; e<Math.min(data.length,5); e++) {
    details_popup_feedcache(data[e], data[e].dataset_id, data[e].image_id);
    data[e]['links'] = jcb_getResultLineLinks(data[e], baseurl, renderurl);
    var detail = $('<div class="search-result-detail">').appendTo(result);
    var img = $('<img src="'+data[e].links.thumb+'" />');
    img.mouseover(details_popup_imghover(data[e].image_id, data[e].dataset_id));
    img.mouseout(details_popup_imghout(data[e].image_id));
    $('<a href="'+data[e].links.figure+'"></a>').appendTo(detail).append(img);
  }
  foot = $('<div class="search-result-header"></div>').appendTo(result);
  if (data[0].citation) {
    foot.append('<div class="detail">'+data[0].citation+' -- '+data.length+' images matched</div>');
  } else {
    foot.append('<div class="detail">'+data[0].manuscript_id+' -- '+data.length+' images matched</div>');
  }
  return Math.min(data.length,5);
};

gs_showResultLine = jcb_showResultLine

/**
 * Search images and fill in results.
 */
function jcb_searchImgs (text, baseurl, renderurl, result_cb) {
  if (text.length > 0) {
    $('#search-results-summary').removeClass('ajax-error').html('searching for "'+text+'"');
    $('#search-compound-results').html('<img src="/appmedia/weblitz_gateway/img/ajax-loader.gif" alt="loading..." />');
    if (renderurl == null) {
      renderurl = baseurl;
    }
    $.getJSON(baseurl+'search/', {text: text, ctx: 'imgs', grabData: true, key: 'meta'}, function(data) {
      var shown = 0;
      var total = 0;
      if (data.length) {
        $('#search-compound-results').html('');
        rv = [];
        ppos = {};
        for (e in data) {
          if (data[e] === null) {
            continue;
          }
          if (ppos[data[e].project_id] === undefined) {
            ppos[data[e].project_id] = rv.length;
            rv.push([]);
          }
          rv[ppos[data[e].project_id]].push(data[e]);
          result_cb && result_cb(data[e], elm);
          total++;
        }
        for (e in rv) {
          shown += jcb_showCompoundResultLine($('#search-compound-results'), rv[e], baseurl, renderurl);
        }
      }
      if (shown == 0) {
        $('#search-compound-results').html('no results');
        $('#search-results-summary').html('search images for "'+text+'": no results.');
      } else {
        $('#search-results-summary').html('search images for "'+text+'":<br /> Matched '+ total +' images in '+rv.length+' manuscripts.');
      }
    });
  }
}
              
gs_searchImgs = jcb_searchImgs
