function getHTTPRequest()
  {
  http_request = false;
  
  if (window.XMLHttpRequest)
    http_request = new XMLHttpRequest();
  else if (window.ActiveXObject)
    {
    try
      {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
      }
    catch (e)
      {
      try
        {
        http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }
      catch (e) {}
      }
    }
 return http_request;
 }

var RequestCnt = 0;

/*
url			- id of template container
type			- 'raw', 'list'
data			- 'raw':id of target element & eval code /  'list':callback object & callback function for list data
*/
function Request(url, type, data1, data2)
  {
  this.url = url;
  this.type = type;
  this.data1 = data1;
  this.data2 = data2;
  this.get = '';
  this.post = '';
  this.prevent_blocking = false;
  var self = this;
  
  this.addGet = function(k, v)
    {
    if (this.get.length) this.get += '&';
    this.get += encodeURI(k)+'='+encodeURI(v);
    }

  this.addRawGet = function(v)
    {
    if (this.get.length) this.get += '&';
    this.get += v;
    }
  
  this.addPost = function(k, v)
    {
    if (this.post.length) this.post += '&';
    this.post += encodeURI(k)+'='+encodeURI(v);
    }

  this.addRawPost = function(v)
    {
    if (this.post.length) this.post += '&';
    this.post += v;
    }

  this.send = function()
    {
    var ureq = getHTTPRequest();
    ureq.open("POST", this.url+"?"+this.get, true);
    ureq.onreadystatechange = function()
      {
      if (ureq.readyState == 4)
        {
        if (!self.prevent_blocking) RequestCnt--;
        if (ureq.status == 200)
          self.result(ureq.responseText);
        else
          setTimeout(function(){self.send();}, 5000);
        }
      }
    ureq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    ureq.send(this.post);
    if (!this.prevent_blocking) RequestCnt++;
    }
  
  this.result = function(msg)
    {
    this.get = '';
    this.post = '';

    if (this.type == 'raw')
      {
      if (this.data1) document.getElementById(this.data1).innerHTML = msg;
      if (this.data2) eval(this.data2);
      }
    else if (this.type == 'list')
      {
      var params = new Object;
      var start = 0;
      while (start < msg.length)
        {
        var p = msg.indexOf(',', start);
        if (p <= 0)
          {
          LogError("Invalid AJAX message a("+msg.length+") "+start+":"+msg);
          break;
          }
        var k = msg.substring(start, p);
        if (k.indexOf(' ', 0) >= 0)
          {
          LogError("Invalid AJAX message b("+msg.length+") "+start+":"+msg);
          break;
          }
        start = p+1;
        p = msg.indexOf(',', start);
        if (p <= 0)
          {
          LogError("Invalid AJAX message c("+msg.length+") "+start+":"+msg);
          break;
          }
        var len = parseInt(msg.substring(start, p));
        if (len < 0)
          {
          LogError("Invalid AJAX message d("+msg.length+") "+start+":"+msg);
          break;
          }
        start = p+1;
        var v = msg.substring(start, start+len);
        start += len;
        params[k] = v;
        }
      if (this.data1) eval('this.data1.'+this.data2+'(params)');
      else if (this.data2) eval(this.data2+'(params)');
      }
    else alert('Request.send: Invalid type='+this.type);
    }
  }

function update(callback, params, callback0)
    {
    var req = new Request('data.php', 'list', callback0, callback);
    req.prevent_blocking = this.prevent_blocking;
    if (params) req.addRawGet(params);
    req.send();
    }

var operation = 'none';
var now = null;
var prev = null;
var next = null;
var prev_cached = 0;
var next_cached = 0;

var curpage = 0;
var currentbook = 0;
var bookcount = 1;
var totalbooks = 0;

var ScrollElement = null;
var ScrollEnd = 0;
var ScrollStep;
var ScrollTimer = null;

var catid = -1;
var img_id = 1;

function ShelfLoaded(params)
  {
  switch (operation)
    {
    case 'center':
      operation = 'none';
      now = params;
      next_cached = 0;
      prev_cached = 0;
      ScrollEnd = 0;

      document.getElementById('Content_now').innerHTML = now['content'];
      document.getElementById('Container').scrollTop = 560;
      if (!LoadData(now)) return;
      if (currentbook + bookcount < totalbooks)
        {
        operation = 'cache_next';
        update('ShelfLoaded', Query()+"&from="+(currentbook + bookcount)+"&curpage="+curpage);
        }
      break;
    case 'cache_next':
      operation = 'none';
      next = params;
      next_cached = 1;
      document.getElementById('Content_next').innerHTML = next['content'];
      break;
    case 'cache_prev':
      operation = 'none';
      prev = params;
      prev_cached = 1;
      document.getElementById('Content_prev').innerHTML = prev['content'];
      break;
    default: alert('Invalid opearation'); return;
    }
  }

function LoadData(params)
  {
  if (params['empty'])
    {
    bookcount = 0;
    currentbook = 0;
    totalbooks = 0;
    curpage = 0;
    return false;
    }

  //Texts
//  document.getElementById('BrCover_cat_name').innerHTML = params['cat_name'];
//  document.getElementById('BrCover_Shelf_Count').innerHTML = params['bookcount'];
//  document.getElementById('BrCover_PageInfo').innerHTML = parseInt(params['curpage'])+1;

  //Paging info
  bookcount =  parseInt(params['bookcount']);
  currentbook = parseInt(params['currentbook']);
  totalbooks = parseInt(params['totalbooks']);
  curpage = parseInt(params['curpage']);

  document.getElementById('tot_books').innerHTML = totalbooks;
  UpdateButtons();
  return true;
  }

function Satrt()
  {
  document.getElementById('searchq').onkeyup = Keypress;
  
  if (document.getElementById('searchq').value.length) Search();
  else
    {
    operation = 'center';
    update('ShelfLoaded', Query());
    }
  }

function Query()
  {
  var q = document.getElementById('searchq').value;
  if (!q.length) q = '-';
  return 'q='+encodeURI(q)+'&id='+catid;
  }

function Search()
  {
  document.getElementById('catimg_'+img_id).src = 'images/cat'+img_id+'_off.jpg';
  catid = -1;
  img_id = 1;

  operation = 'center';
  update('ShelfLoaded', Query());
  }

function Keypress(e)
  {
  var key = (window.event) ? window.event.keyCode : e.keyCode;
  if (key == 13)
    {
    Search();
    return false;
    }
  return true;
  }

function SelectCat(id, title, img)
  {
  document.getElementById('searchq').value = '';
  document.getElementById('catimg_'+img_id).src = 'images/cat'+img_id+'_off.jpg';
  catid = id;
  img_id = img;
  document.getElementById('catimg_'+img_id).src = 'images/cat'+img_id+'_on.jpg';
  document.getElementById('cat_title').innerHTML = title;

  operation = 'center';
  update('ShelfLoaded', Query());
  }

function UpdateButtons()
  {
  document.getElementById('scroll-u').style.display = currentbook != 0 ? 'block' : 'none';
  document.getElementById('scroll-d').style.display = currentbook + bookcount < totalbooks ? 'block' : 'none';
  }

function PrevShelf()
  {
  if (currentbook == 0) return;
  if (operation != 'none' || ScrollTimer) return;
  if (prev_cached)
    {
    next = now;
    document.getElementById('Content_next').innerHTML = next['content'];
    next_cached = 1;
    LoadData(prev);
    ShelfScrollPrev('Container', 0);
    }
  else alert('No next cache');
  }

function NextShelf()
  {
  var cur = currentbook + bookcount;
  if (cur >= totalbooks) return;
  if (operation != 'none' || ScrollTimer) return;
  if (next_cached)
    {
    prev = now;
    document.getElementById('Content_prev').innerHTML = prev['content'];
    next_cached = 0;
    LoadData(next);
    ShelfScrollNext('Container', 560*2);
    }
  else alert('No next cache');
  }

function ShelfScrollPrev(obj, shift)
  {
  ScrollElement = document.getElementById(obj);
  ScrollEnd = shift;
  ScrollStep = Math.round(Math.abs(ScrollElement.scrollTop - ScrollEnd) * 0.15)+1;
  if (ScrollTimer) clearInterval(ScrollTimer);
  ScrollTimer = setInterval("MakeScrollPrev()", 15);
  }

function MakeScrollPrev()
  {
  var old = ScrollElement.scrollTop;
  if (ScrollEnd > old) ScrollElement.scrollTop += ScrollStep;
  else ScrollElement.scrollTop -= ScrollStep;
  ScrollStep = Math.round(ScrollStep*0.855);
  if (ScrollStep < 3) ScrollStep = 3;
  if (ScrollElement.scrollTop == old || Math.abs(ScrollElement.scrollTop - ScrollEnd) <= 3)
    {
    clearInterval(ScrollTimer);
    ScrollTimer = null;
    
    now = prev;
    document.getElementById('Content_now').innerHTML = now['content'];
    prev_cached = 0;
    document.getElementById('Container').scrollTop = 560;
    document.getElementById('Content_prev').innerHTML = '';
    if (currentbook != 0)
      {
      operation = 'cache_prev';
      update('ShelfLoaded', Query()+"&prev&curpage="+curpage);
      }
    }
  }

function ShelfScrollNext(obj, shift)
  {
  ScrollElement = document.getElementById(obj);
  ScrollEnd = shift;
  ScrollStep = Math.round(Math.abs(ScrollElement.scrollTop - ScrollEnd) * 0.15)+1;
  if (ScrollTimer) clearInterval(ScrollTimer);
  ScrollTimer = setInterval("MakeScrollNext()", 15);
  }

function MakeScrollNext()
  {
  var old = ScrollElement.scrollTop;
  if (ScrollEnd > old) ScrollElement.scrollTop += ScrollStep;
  else ScrollElement.scrollTop -= ScrollStep;
  ScrollStep = Math.round(ScrollStep*0.855);
  if (ScrollStep < 3) ScrollStep = 3;
  if (ScrollElement.scrollTop == old || Math.abs(ScrollElement.scrollTop - ScrollEnd) <= 3)
    {
    clearInterval(ScrollTimer);
    ScrollTimer = null;
    
    now = next;
    document.getElementById('Content_now').innerHTML = now['content'];
    prev_cached = 1;
    document.getElementById('Container').scrollTop = 560;
    document.getElementById('Content_next').innerHTML = '';
    if (currentbook + bookcount < totalbooks)
      {
      operation = 'cache_next';
      update('ShelfLoaded', Query()+"&from="+(currentbook + bookcount)+"&curpage="+curpage);
      }
    }
  }

function OpenBook(url, title)
  {
  document.getElementById('title_here').innerHTML = title;
  document.getElementById('link_here').href = url;
  document.getElementById('content_here').src =  url; 
  document.getElementById('widget').style.visibility = 'visible';
  }

function CloseBook()
  {
  document.getElementById('widget').style.visibility = 'hidden';
  }
