hl_ = 'en';

opt_args_ = {};

cobrand_id_ = '';

customURLs_ = new Array();

DEFAULT_POPUP_PREVIEW_WIDTH_ = 600;

DEFAULT_POPUP_PREVIEW_HEIGHT_ = 475;

function setLanguage(language_code) {
  hl_ = language_code || 'en';
}

function setViewerOptions(optional_arguments) {
  opt_args_ = optional_arguments || {};
}

function setCobrandName(name) {
  cobrand_id_ = name || '';
}

function getBookSignature_(bookid)
{
  var cleaned = bookid.replace(/[\?:/&#=-]/g, '_');
  return '__goog_gbs_button_' + cleaned;
}

function isPreviewable_(bookInfo) {
  var b = bookInfo;
  return b && (b.preview == 'full' || b.preview == 'partial');
}

function isEmbeddable_(bookInfo) {
  var b = bookInfo;
  return isPreviewable_(b)
    && (typeof(b.embeddable) == 'undefined' || b.embeddable != false);
}

function bookNotFound_() {
  _launching_elem.style.display = 'none';
}

function booksLoaded_() {
  _launching_elem.style.display = '';
  var viewer = new google.books.DefaultViewer(_launching_elem, opt_args_);
  viewer.load(_launching_vid, bookNotFound_);
}


function loadBooks_() {
  google.load('books', '0', {'language' : hl_, 'callback' : booksLoaded_});
}

function showPreviewInElement_(bookid, element) {
  _launching_elem = element;
  _launching_vid = bookid;

  if (typeof(google) === 'undefined' || !google) {
    var script = document.createElement('script');
    script.src = 'http://www.google.com/jsapi?callback=loadBooks_';
    script.type = 'text/javascript';
    document.getElementsByTagName('head')[0].appendChild(script);
  } else {
    loadBooks_();
  }
}

function showPreviewPopup_(bookid) {
  var previewWidth = DEFAULT_POPUP_PREVIEW_WIDTH_;
  var previewHeight = DEFAULT_POPUP_PREVIEW_HEIGHT_;
  var contentDiv = openModalDialog_(previewWidth, previewHeight);
  var tableElem = document.createElement('table');
  tableElem.style.width = previewWidth + 'px';
  tableElem.style.height = previewHeight + 'px';
  var row = tableElem.insertRow(-1);
  var cell = row.insertCell(0);
  cell.style.cssText = 'font-family: Arial, sans-serif; font-size: 13px; '
    + 'vertical-align: middle; text-align: center ';
  cell.appendChild(document.createTextNode(LOADING_MESSAGE_(hl_)));
  contentDiv.appendChild(tableElem);
  showPreviewInElement_(bookid, contentDiv);
}

function processResponse_(booksInfo, showInPopup)
{
  var buttonImg = 'http://books.google.com/intl/'
    + hl_ + '/googlebooks/images/gbs_preview_button1.gif';

  for (id in booksInfo) {
    var b = booksInfo[id];
    if ((showInPopup && isEmbeddable_(b)) ||
        (!showInPopup && isPreviewable_(b))) {
        var url = (showInPopup) ? constructPopupUrl_(b) : constructLinkUrl_(b);
        var bh = '<a href="' + url + '">'
          + '<img src="' + buttonImg + '" border="0" style="border:0;" '
          + 'alt="' + PREVIEW_MESSAGE_(hl_) + '"/><\/a>';
      var bElemName = getBookSignature_(id);
      var bElem = document.getElementById(bElemName);
      if (bElem) {
        bElem.innerHTML = bh;
        bElem.style.display = '';
        break;
      }
    }
  }
}

function constructPopupUrl_(bookInfo) {
  return 'javascript:showPreviewPopup_(\'' + bookInfo.bib_key+ '\')';
}

function constructLinkUrl_(bookInfo) {
  var sig = getBookSignature_(id);
  var curl = customURLs_[sig];
  if (curl != null && curl.length > 0) {
    return curl;
  }
  var gbsLinkUrl = bookInfo.preview_url;
  if (hl_.length > 0 && hl_ != 'en') {
    gbsLinkUrl += '&hl=' + hl_;
  }
  return gbsLinkUrl;
}

function processResponseForPopup_(booksInfo) {
  processResponse_(booksInfo, true);
}

function processResponseForLink_(booksInfo) {
  processResponse_(booksInfo, false);
}

function maybeShowButton_(bookids, showInPopup, width, height) {
  for (var i = 0; i < bookids.length; i++) {
    var sig = getBookSignature_(bookids[i]);
    document.write('<span id="' + sig + '" style="display:none"></span>');
  }
  // call processResponse to render the actual button
  var cobrandPath = (cobrand_id_.length > 0) ? '/p/' + cobrand_id_ : '';
  var callback = (showInPopup) ? 'processResponseForPopup_'
                               : 'processResponseForLink_';
  var script = document.createElement('script');
  script.src = 'http://books.google.com/books' + cobrandPath
    + '?jscmd=viewapi' + '&bibkeys=' + bookids.join()
    + '&callback=' + callback;
  script.type = 'text/javascript';
  document.getElementsByTagName('head')[0].appendChild(script);
}

function insertPreviewButtonToPopup(bookids) {
  maybeShowButton_(toArray_(bookids), true);
}

function insertPreviewButtonToPage(bookids, customURL) {
  var ids = toArray_(bookids);
  if (customURL) {
    for (var i = 0; i < ids.length; i++) {
      var sig = getBookSignature_(ids[i]);
      if (customURL != null && customURL.length > 0) {
        customURLs_[sig] = customURL;
      }
    }
  }

  maybeShowButton_(ids, false);
}

function insertEmbeddedPreview(bookid, width, height) {
  // with indication of success/failure. Maybe it even returns
  document.write('<div id="goog_viewport" style="display: none; width:'
                 + width + 'px; height:' + height + 'px"></div>');
  var vp = document.getElementById('goog_viewport');
  showPreviewInElement_(bookid, vp);
}

function openModalDialog_(width, height)
{
  // or at least object-orient this popup
  modalDialogWidth_ = width + 28;
  modalDialogHeight_ = height + 51;
  modalMask_ = document.createElement('div');
  modalMask_.style.cssText = 'overflow: hidden; position: absolute; ' 
    + 'left: 0px; top: 0px; z-index:200; '
    + 'opacity: 0.5; filter: alpha(opacity=70); -moz-user-select: none; '
    + 'background-color: #000';
  getBody_().appendChild(modalMask_);
  modalDialog_ = document.createElement('div');
  modalDialog_.style.width =  modalDialogWidth_ + 'px';
  modalDialog_.style.height = modalDialogHeight_ + 'px';
  modalDialog_.style.position = 'absolute';
  modalDialog_.style.zIndex = 201;
  getBody_().appendChild(modalDialog_);
  var winShadow = document.createElement('div');
  winShadow.style.cssText = 'background-color: #000; opacity: 0.3; '
    + 'filter: alpha(opacity=30); position: absolute; left: 3px; top: 3px; '
    + 'width: ' + modalDialogWidth_ + 'px; '
	+ 'height: ' + modalDialogHeight_ + 'px';
  modalDialog_.appendChild(winShadow);
  var winContentsWrapper = document.createElement('div');
  winContentsWrapper.style.cssText = 'position: absolute; ' 
    + 'left: 0px; top: 0px;';
  modalDialog_.appendChild(winContentsWrapper);
  var winContents = document.createElement('div');
  winContentsWrapper.appendChild(winContents);
  winContents.style.cssText = 'border: none; padding: 8px; '
    + 'background-color: #ffffff;'
  var titlePaneWrap = document.createElement('div');
  titlePaneWrap.style.height = 23 + 'px';
  winContents.appendChild(titlePaneWrap);
  var titlePane = document.createElement('div'); 
  titlePane.style.cssText = 'padding: 3px; background-color: #ffffff;' 
    + 'font-weight: bold; -moz-user-select: none; '
    + 'font-size: 15px; font-family: Arial, sans-serif';
  titlePane.appendChild(document.createTextNode(PREVIEW_MESSAGE_(hl_)));
  titlePaneWrap.appendChild(titlePane);
  var clientContent = document.createElement('div');
  clientContent.style.width = width + 'px';
  clientContent.style.height = height + 'px';
  var contentPane = document.createElement('div');
  contentPane.style.cssText = 'padding: 5px; background-color: #f2f2f2';
  contentPane.appendChild(clientContent);
  winContents.appendChild(contentPane);
  var closeButton = document.createElement('img');
  closeButton.src = 'http://books.google.com/googlebooks/images/dialog_close_x.gif';
  closeButton.style.position = 'absolute';
  closeButton.style.top = '13px';
  closeButton.style.right = '13px';
  closeButton.style.cursor = 'pointer';
  closeButton.style.width = '15px';
  closeButton.style.height = '15px';
  closeButton.style.display = 'block';
  addEvent(closeButton, "click", closeModalDialog_);
  modalDialog_.appendChild(closeButton);
  // they'll stay that way upon resize or scrolling
  positionModalElements_();
  addEvent(window, "resize", positionModalElements_);
  addEvent(window, "scroll", positionModalElements_);
  return clientContent;
}

function closeModalDialog_() {
  removeEvent(window, "resize", positionModalElements_);
  removeEvent(window, "scroll", positionModalElements_);

  getBody_().removeChild(modalDialog_);
  modalDialog_ = null;

  getBody_().removeChild(modalMask_);
  modalMask_ = null;
}

function positionModalElements_() {
  var screenLeftOffset = Math.max(0, 
    (getClientWidth_() - modalDialogWidth_) / 2);
  modalDialog_.style.left = getScrollLeft_() + screenLeftOffset + 'px';

  var screenTopOffset = Math.max(0, 
    (getClientHeight_() - modalDialogHeight_) / 2);
  modalDialog_.style.top = getScrollTop_() + screenTopOffset + 'px';

  adjustModalMask_();
}

function adjustModalMask_() {
  if (modalMask_ == null) return;
  getBody_().removeChild(modalMask_);
  var maskWidth = Math.max(getClientWidth_(), document.body.scrollWidth);
  modalMask_.style.left = '0px';
  modalMask_.style.width = maskWidth + 'px';

  var maskHeight = Math.max(getClientHeight_(), document.body.scrollHeight);
  modalMask_.style.top = '0px';
  modalMask_.style.height = maskHeight + 'px';
  getBody_().insertBefore(modalMask_,modalDialog_);
}

function getClientWidth_() {
  if (document.compatMode=='CSS1Compat') 
    return document.documentElement.clientWidth;
  if (document.body) return document.body.clientWidth;
  if (window.innerWidth != window.undefined) return window.innerWidth; 
  return window.undefined;
}

function getClientHeight_() {
  if (document.compatMode=='CSS1Compat')
    return document.documentElement.clientHeight;
  if (document.body) return document.body.clientHeight; 
  if (window.innerHeight != window.undefined) return window.innerHeight;
  return window.undefined; 
}

function getScrollTop_() {
  if (self.pageYOffset) // all except Explorer
    return self.pageYOffset;
  else if (document.documentElement && document.documentElement.scrollTop)
    return document.documentElement.scrollTop;
  else if (document.body) // all other Explorers
    return document.body.scrollTop;
}

function getScrollLeft_() {
  if (self.pageXOffset) // all except Explorer
    return self.pageXOffset;
  else if (document.documentElement && document.documentElement.scrollLeft)
    return document.documentElement.scrollLeft;
  else if (document.body) // all other Explorers
    return document.body.scrollLeft;
}

function toArray_(object) {
  if (isArray_(object)) {
    return object;
  } else {
    var arr = new Array();
    arr.push(object);
    return arr;
  }
}

function isArray_(o) {
    return o && !(o.propertyIsEnumerable('length'))
             && typeof o === 'object'
             && typeof o.length === 'number';
}

function getBody_()
{
	return document.getElementsByTagName("BODY")[0];
}

function addEvent(obj, evType, fn){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    return false;
  }
}

function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    return false;
  }
}

function PREVIEW_MESSAGE_(lang) {
  return "Book Preview";
}

function LOADING_MESSAGE_(lang) {
  return "Loading...";
}
