var
  centerColumnBottom = -1,
  lastCenterBlock = null,
  
  leftColumn = null,
  leftBlocks = [],

  rightColumn = null,
  rightBlocks = [],
  
  bottomColumn = null,
  bottomBlocks = [];

var
  UPDATE_TIMEOUT = 500;

function initKolonker() {
  var centerColumn = $('content-block');
  if (centerColumn) {
    lastCenterBlock = centerColumn.lastChild;
    while (lastCenterBlock) {
      var t = (lastCenterBlock.tagName ? lastCenterBlock.tagName.toLowerCase() : '');
      if (t && (t == 'table' || t == 'div' || t == 'form') && lastCenterBlock.offsetHeight > 0) break;
      lastCenterBlock = lastCenterBlock.previousSibling;
    }
    rightColumn = $('blocks-right');
    leftColumn = $('blocks-left');
  }
  bottomColumn = $('blocks-bottom');
  setupBodyEvent('load', doUpdateColumns);
  setupBodyEvent('resize', doUpdateSideColumns);
}


var
  lastVisSideIdx = {left: -1, right: -1},
  lastLoadingBlocks = {left: null, right: null};

function updateLeftColumn(reason) {
  if (leftColumn && window.leftColBlocks) updateSideColumn(reason, 'left');
}

function updateRightColumn(reason) {
  if (rightColumn && window.rightColBlocks) updateSideColumn(reason, 'right');
}

function updateSideColumn(reason, side) {
  if (!lastCenterBlock) return;
  var isRight = (side == 'right');
  var a1 = getAbsTop(lastCenterBlock);
  var a2 = lastCenterBlock.offsetHeight;
  centerColumnBottom = a1 + a2;
  var lastVisIdx = lastVisSideIdx[side];
  var blocks = (isRight ? rightBlocks : leftBlocks);
  var column = (isRight ? rightColumn : leftColumn);
  var bot, cls, height, lastBlock, lastIdx, firstTime, html, container, div, script, afterHide = false;
  do {
    
    lastIdx = lastVisIdx;
    bot = 0;
    if (lastVisIdx >= 0) {
      lastBlock = blocks[lastVisIdx];
      bot = getAbsTop(lastBlock) + lastBlock.offsetHeight;
    }
    if (bot < centerColumnBottom) {
      if (afterHide) break;
      
      if (lastVisIdx == blocks.length-1) {
        var block = getNextSideBlock(column, side);
        if (!block) break; // no more blocks
        blocks.push(block);
      }

      lastBlock = blocks[lastVisIdx+1];
      if (lastBlock == lastLoadingBlocks[side]) {
        height = lastBlock.offsetHeight;
        if (height > 30) clearLoadingSideBlockUpdate(side);
      } else {
        lastBlock.style.visibility = 'hidden';
        lastBlock.style.display = 'block';
        setLoadingSideBlockUpdate(lastBlock, side);
        break;
//      height = lastBlock.offsetHeight;
      }
      
      if (bot+height <= centerColumnBottom) {
        if (lastBlock.hasIframe && height <= 30) {
          setLoadingSideBlockUpdate(lastBlock, side);
          break;
        }
        lastBlock.style.visibility = '';
        lastVisIdx++;
        setTimeout('updateSideColumn("timeout", "' + side + '")', UPDATE_TIMEOUT);
        break;
      } else {
        lastBlock.style.display = 'none';
        lastBlock.style.visibility = '';
        clearLoadingSideBlockUpdate(side);
      }
    } else if (bot > centerColumnBottom) {
//    прячем последний блок
      var lastLoadingBlock = lastLoadingBlocks[side];
      if (lastLoadingBlock) {
        lastLoadingBlock.style.display = 'none';
        lastLoadingBlock.style.visibility = '';
        clearLoadingSideBlockUpdate(side);
      }
      lastBlock.style.display = 'none';
      lastVisIdx--;
      afterHide = true;
    }
  } while (lastIdx != lastVisIdx);
  lastVisSideIdx[side] = lastVisIdx;
}

function processJsBlocks(block) {
  var html = block.innerHTML;
  var scripts = html.match(/<script(.|\s)*?>(.|\s)*?<\/script>/ig);
  if (!scripts) return false;
  for (var i = 0, l = scripts.length; i < l; i++) {
    var s, scr = scripts[i];
    if (scr.match(/^<script(.|\s)*?>((.|\s)*?)<\/script>$/i) && (s = trim(RegExp.$2))) {

      if (window.execScript) 
        window.execScript(s);
      else
        eval.call(window, s);
    }
  }
  return true;
}

function processBegunBlock(block) {
  var divs = block.getElementsByTagName('DIV');
  for (var i = 0, l = divs.length; i < l; i++) {
    var div = divs[i];
    if (div.className == 'begun_block') {
      var container = $('begun_container');
      if (container) {
        var s = container.innerHTML;
        if (trim(s) != '') {
          div.innerHTML = s;
          return true;
        }
      }
      return 'empty'; 
    }
  }
  return false;
}

var
  loadingBlockUpdateIntervalIds = {left: null, right: null};

function setLoadingSideBlockUpdate(block, side) {
  lastLoadingBlocks[side] = block;
  if (loadingBlockUpdateIntervalIds[side] == null) {
    loadingBlockUpdateIntervalIds[side] = setInterval('updateSideColumn("interval", "' + side + '")', UPDATE_TIMEOUT);
  }
}

function clearLoadingSideBlockUpdate(side) {
  lastLoadingBlocks[side] = null;
  if (loadingBlockUpdateIntervalIds[side] != null) {
    clearInterval(loadingBlockUpdateIntervalIds[side]);
    loadingBlockUpdateIntervalIds[side] = null;
  }
}

var
  lastBlockNum = {left: -1, right: -1};

function getNextSideBlockHtml(side) {
  var blocks = (side == 'right' ? window.rightColBlocks : window.leftColBlocks);
  if (!blocks) return null;
  if (lastBlockNum[side]+1 >= blocks.length) return null;
  while (lastBlockNum[side] < blocks.length-1) {
    var html = blocks[++lastBlockNum[side]];
    if (html) return html;
  }
  return null;
}

function getNextSideBlock(column, side) {
  var html = getNextSideBlockHtml(side);
  if (!html) return null;
  var block = document.createElement('DIV');
  block.innerHTML = html;
  block.hasIframe = (html.toLowerCase().indexOf('iframe') >= 0);
  block.style.visibility = 'hidden'; 
  column.appendChild(block);
  if (!processJsBlocks(block) && processBegunBlock(block) == 'empty') {
    column.removeChild(block); // if begun block is empty
    block = getNextSideBlock(column, side);
  }
  return block;
}

function updateBottomColumn() {
  if (!bottomColumn || !window.bottomColBlocks) return;
  var s = '';
  for (var i = 0, l = bottomColBlocks.length; i < l; i++) {
    s += bottomColBlocks[i];
  }
  bottomColumn.innerHTML = s;
}

initKolonker();
