
var
  blankPage = '/z.html',  // http://www.flexum.ru/z.html
  defaultTitle = '',
  curAnchor = '',
  curIframeSrc = '';      // http://www.flexum.ru/z.html?theme=28

var
  logBlock = null,
  inRubricChkBox = null,
  inRubricLabel = null,
  rubricsContainer = null,
  iframeElement = null,
  iframeInnerElement = null;

function init() {
  logBlock = document.getElementById('log_block');
  inRubricChkBox = document.getElementById('in_rubric');
  inRubricLabel = document.getElementById('in_rubric_label');
  rubricsContainer = document.getElementById('rubrics');
  iframeElement = document.getElementById('h');
  if (document.frames) iframeInnerElement = document.frames['h'];
  defaultTitle = document.title;
  if (rubricsContainer) initRubrics();
  curRubric = parseAnchor();
  if (curRubric !== '') makeRubricSelected(curRubric, 'fast');
  if (rubricsContainer) rubricsContainer.style.visibility = 'visible';
  $('footer').style.visibility = 'visible';
  if (iframeElement) iframeElement.src = blankPage + '?theme='+curRubric;
  setInterval(chkAnchorChanged, 100);
  if (isIE) setInterval(chkIframeChanged, 100);
  var params = parseURL();
  if (params.siteURL != null) {
    if (userLogin) addSite(null, null, params.siteTitle, params.siteURL)
    else loginUser();
  }
}

function parseURL() {
  var res = { siteURL: null, siteTitle: null };
  s = location.search;
  if (s.charAt(0) == '?') s = s.substr(1);
  if (s != '') {
    var i, a = s.split('&');
    for (i = 0; i < a.length; i++) {
      if (a[i].match(/^(\w+)(=(.*))?$/)) {
        switch (RegExp.$1.toLowerCase()) {
          case 'addsite':
            res.siteURL = unescape(RegExp.$3);
            break;
          case 'title':
            res.siteTitle = unescape(RegExp.$3);
        }
      }
    }
  }
  return res;
}

function parseAnchor() {
  var s = location.hash;
  if (s) {
    var m = s.match(/^#r=(\d+)/);
    if (m) {
      return parseInt(m[1]);
    }
  }
  return '';
}

function parseIframeSrc(s) {
  s = s.substr(s.indexOf('?')+1);
  if (s.match(/^theme=(\d*)/)) {
    d = parseInt(RegExp.$1);
    if (isNaN(d)) d = '';
    return { rubric: d }
  } else
    return false;
}

function updateAnchor() {
  var s = '#r='+curRubric;
  if (s != location.hash && (curRubric !== '' || location.hash != '')) {
    location.hash = s;
  }
}

function chkAnchorChanged() {
  var newAnchor = location.hash;
  if (newAnchor != curAnchor) {
    curAnchor = newAnchor;
    var newRubric = parseAnchor();
    if (newRubric !== curRubric) {
//    log('new rubric: '+newRubric);
      makeRubricSelected(newRubric);
    }
  }
}

function chkIframeChanged() {
  var newIframeSrc = (iframeInnerElement ? 
    iframeInnerElement.location.href : 
    iframeElement.contentWindow.location.href);
//document.title = newIframeSrc;
  if (newIframeSrc != curIframeSrc) {
    var c2n = ' ['+curIframeSrc+'] -&gt; ['+newIframeSrc+']';
//  log(c2n);
    curIframeSrc = newIframeSrc;
    var r = parseIframeSrc(newIframeSrc);
    if (r && r.rubric !== curRubric) {
      makeRubricSelected(r.rubric);
    }
  }
}

function escapeQueryStr(s) {
  return s.replace(/&/g, '%26');
}


var xquery_id;

function xqueryClick(xq_id,xq_query)
{
var searchForm = $('search_form');
searchForm.query.value=xq_query;
xquery_id=xq_id;
submitSearchForm();
}

function submitSearchForm() {
  var s=location.search;
  var rubric;
  if (s.charAt(0) == '?') s = s.substr(1);
  if (s != '') {
    var i, a = s.split('&');
    for (i = 0; i < a.length; i++) {
      if (a[i].match(/^(\w+)(=(.*))?$/)) {
        switch (RegExp.$1.toLowerCase()) {
          case 'rubric':
            rubric = unescape(RegExp.$3);
            break;
        }
      }
    }
  }
  
  var searchForm = $('search_form');
  queryEscaped = escapeQueryStr(searchForm.query.value);
  if (rubric>0){
    location.assign('/?query='+queryEscaped+(xquery_id?"&xq="+xquery_id:'')+ '#'+
    (inRubricChkBox && inRubricChkBox.checked ? 'r='+rubric+';' : '')+'p=0');
  
  }
  else {
  location.assign('/?query='+queryEscaped+(xquery_id?"&xq="+xquery_id:'')+ '#'+
    (curRubric > 0 && inRubricChkBox && inRubricChkBox.checked ? 'r='+curRubric+';' : '')+'p=0');
 }
}

function getIframeURL(rubric) {
  return blankPage + '?theme='+rubric;
}

function getAnchorURL(rubric) {
  return '#r='+rubric;
}



var
  rubrics = [],
  leftCell = null,
  rightCell = null,
  sitesContainer = null;

function initRubrics() {
  rubrics.length = 0;
  leftCell = rubricsContainer.rows[0].cells[0];
  var divs = leftCell.getElementsByTagName('DIV');
  var i, d, a;
  for (i = 0; i < divs.length; i++) {
    d = divs[i];
    if (d.className != 'rubric_box') continue;
    a = d.getElementsByTagName('A')[0];
    d.link = a;
    a.rubric = parseInt(a.href.match(/\?theme=(\d+)/)[1]);
    a.rubricDiv = d;
    d.rubric = a.rubric;
    a.rubricName = trim(a.innerText || a.textContent);
    if (!isIE)   {
      a.href = getAnchorURL(a.rubric);
      a.target = '';
    }
    rubrics.push(d);
  }
}

/*function moveRubricsToCells() {
  var i, r;
  for (i = firstMoveRubric; i < rubrics.length; i++) {
    r = rubrics[i];
    rubricCols[0].removeChild(r);
    rubricCols[(i < lastColRubric ? 1 : 2)].appendChild(r);
  }
  rubricsDown = false;
}*/

var
  curRubric = '',
  selectedRubricLink = null,
  rubricsDown = false,
  movingRubrics = false,
  contentLoaded = false,
  contentHidden = true;

function rubricClicked(link) {
//setTimeout('makeRubricSelected('+link.rubric+')', 0);
  return true;
}

function makeRubricSelected(link, fast) {
//log('['+link+'] ('+typeof(link)+')');
  if (link === '') {
    link = null
//  log('link('+link+') == ""');
  } else if (typeof(link) == 'number') {
    var i, d, num = link;
    link = null;
    for (i = 0; i < rubrics.length; i++) {
      d = rubrics[i];
      if (d.rubric == num) {
        link = d.link;
//      log('link "'+link.rubricName+'" found.');
        break;
      }
    }
  }
  if (link == selectedRubricLink) return;
  if (selectedRubricLink) {
    selectedRubricLink.href = selectedRubricLink.saveHref;
    findParentNode(selectedRubricLink, 'div').className = '';
    if (selectedRubricLink.blur) selectedRubricLink.blur();
    else if (link) link.focus();
  }
  var moveDown = (link != null);
  document.title = defaultTitle + (moveDown ? ' - '+link.rubricName : '');
  curRubric = (moveDown ? link.rubric : '');
  updateAnchor();
  if (inRubricLabel) {
    if (curRubric > 0 && inRubricLabel.offsetHeight == 0) inRubricChkBox.checked = !(window.inRubricUncheckedDefault || false);
    inRubricLabel.style.display = (curRubric > 0 ? '' : 'none');
  }
  selectedRubricLink = link;
  if (moveDown) {
    link.saveHref = link.href;
    link.removeAttribute('href');
    findParentNode(link, 'div').className = 'selected';
    
    if (!rubricsDown) {
      if (!movingRubrics)
        startMovingRubrics(true, fast);
      else
        revertMovingRubrics();
    } else {
      addRightCell();
    }
    makeSelRubricVisible();
  } else {
    if (rubricsDown) {
      if (!movingRubrics)
        startMovingRubrics(false);
      else
        revertMovingRubrics();
    }
  }
//$('back_link').style.display = (moveDown ? '' : 'none');
  if (!contentHidden) {
    sitesContainer.afterZoom = zoomOutFinished;
    zoom(sitesContainer, '-');
  }

//if (loading) abortLoadingSites();
  if (rubricsDown) loadSites(0, '');
}

function zoomOutFinished() {
  contentHidden = true;
  if (rubricsDown && contentLoaded) {
    contentHidden = false;
    sitesContainer.innerHTML = sitesContentBuffer;
    sitesContainer.afterZoom = null;
    zoom(sitesContainer, '+');
    reposSites();
  }
}

function addRightCell() {
  if (rightCell == null) {
    leftCell.colSpan = 1;
    rightCell = document.createElement('TD');
    rightCell.vAlign = 'top';
    leftCell.parentNode.appendChild(rightCell);
    sitesContainer = document.createElement('DIV');
//  sitesContainer.style.border = '1px dashed blue';
    rightCell.appendChild(sitesContainer);
  }
}

function removeRightCell() {
  if (rightCell != null) {
    rightCell.removeChild(sitesContainer);
    sitesContainer = null;
    rightCell.parentNode.removeChild(rightCell);
    rightCell = null;
    leftCell.colSpan = 2;
    contentHidden = true;
  }
}

function reposSites() {
//var sT = document.body.scrollTop;
//var cT = getAbsPos(sitesContainer).top;
//var dif = sT - cT;
//document.title = 'scrollTop: '+sT+', top: '+cT+', dif: '+dif;
  var pos = Math.max(document.body.scrollTop - getAbsPos(sitesContainer).top, 0);
  sitesContainer.curTopPos = pos;
  sitesContainer.maxTopPos = pos;
  sitesContainer.style.paddingTop = pos+'px';
  if (loaderIcon) loaderIcon.style.paddingTop = pos+'px';
//startMovingSitesContainer(pos);
}

/*function startMovingSitesContainer(pos) {
  sitesContainer.newTopPos = Math.max(pos, 0);
  if (!('curTopPos' in sitesContainer)) sitesContainer.curTopPos = 0;
  if (sitesContainer.newTopPos != sitesContainer.curTopPos) {
    if (sitesContainer.moveIntervalId == null) {
      sitesContainer.moveIntervalId = setInterval(stepMovingSitesContainer, 50);
    }
  }
}

function stepMovingSitesContainer() {
  if (sitesContainer == null) return;
  var pos = Math.round((sitesContainer.curTopPos + sitesContainer.newTopPos)/2);
  if (Math.abs(pos - sitesContainer.newTopPos) <= 1) pos = sitesContainer.newTopPos;
  sitesContainer.curTopPos = pos;
  sitesContainer.style.paddingTop = pos+'px';
  if (pos == sitesContainer.newTopPos) {
    clearInterval(sitesContainer.moveIntervalId);
    sitesContainer.moveIntervalId = null;
  }
}*/


var
  moveRubricsInfo = {
    fullTime: 500,    // время полного перемещения (мсек.)
    steps: 10,        // число шагов перемещения
//  curStep: 0,
//  rowNum: 0,
//  colNum: 0,
    firstTime: true,
//  minColHeight: 0,
    maxColHeight: 0,
    intervalId: null
  };

function startMovingRubrics(down, fast) {
  rubricsDown = down;
  movingRubrics = !fast;

//[calcPositionsAndHeight]
  var i, r, b;
  if (moveRubricsInfo.firstTime) {
    if (!down) alert('first time move can be down only') 
    var p = getAbsPos(rubrics[0]);
    var x = p.left, y = p.top;
    var h, q, ha = 0, steps = moveRubricsInfo.steps;
    for (i = 0; i < rubrics.length; i++) {
      r = rubrics[i];
      h = r.offsetHeight;
      ha += h;
      p = getAbsPos(r);
      r.curLeft = p.left;
      r.curTop  = p.top;
      if (down) {
        r.upLeft = p.left;
        r.upTop  = p.top;
        r.dnLeft = x;
        r.dnTop  = y;
        r.deltaX = (r.dnLeft - r.upLeft)/steps;
        r.deltaY = (r.dnTop - r.upTop)/steps;
      } else {
/*      r.dnLeft = p.left;
        r.dnTop  = p.top;
        if (r.rowNum == 0) {
          x = rubricCols[r.colNum].origLeft;
          y = rubricCols[r.colNum].origTop;
        }
        r.upLeft = x;
        r.upTop  = y; */
        r.deltaX = (r.upLeft - r.dnLeft)/steps;
        r.deltaY = (r.upTop - r.dnTop)/steps;
      }
      if (isMozilla) b = getElementBorders(r);
      r.blockWidth  = r.offsetWidth  - (b ? b.horiz : 0);
      r.blockHeight = r.offsetHeight - (b ? b.vert  : 0);
//    if (i > 0 && i % 4 == 0) log('');
//    log(i+'. w: '+r.blockWidth);
      y += h;
    }
//  moveRubricsInfo.minColHeight = rubricCols[0].offsetHeight;
    moveRubricsInfo.maxColHeight = ha;
//  log('Col[1]Height: '+h1);
//  log('minColHeight: '+moveRubricsInfo.minColHeight);
//  log('maxColHeight: '+moveRubricsInfo.maxColHeight);
    moveRubricsInfo.firstTime = false;
  }

//[setHeight]
  if (!fast)
    leftCell.style.height = moveRubricsInfo.maxColHeight+'px';

//[setRubricsMoveStyle]
  var w, h;
  for (i = 0; i < rubrics.length; i++) {
    r = rubrics[i];
    if (fast) {
//    r.style.float = (rubricsDown ? 'none' : 'left');
      r.className = (rubricsDown ? 'rubric_box_left' : 'rubric_box');
    } else {
      if (i == 0) continue;
      r.style.width = r.blockWidth+'px';
      r.style.height = r.blockHeight+'px';
      if (down) {
        r.sourLeft = r.upLeft;  r.sourTop = r.upTop;
        r.destLeft = r.dnLeft;  r.destTop = r.dnTop;
      } else {
        r.sourLeft = r.dnLeft;  r.sourTop = r.dnTop;
        r.destLeft = r.upLeft;  r.destTop = r.upTop;
      }
      len = Math.sqrt(sqr(r.destLeft - r.sourLeft) + sqr(r.destTop - r.sourTop));
      r.incSpeedCnt = Math.round(Math.log(len)/Math.log(2)) - 2;  // число шагов увеличения скорости
      r.factor = Math.exp(-r.incSpeedCnt*Math.log(2));
      r.moveStarted = false;

      r.style.left = r.curLeft+'px';
      r.style.top = r.curTop+'px';
      r.style.position = 'absolute';
//    r.parentNode.removeChild(r);
//    document.body.appendChild(r);
    }
  }

  if (!fast) {
//  [calcMoveParams]
//  moveRubricsInfo.curStep = 0;

    with (moveRubricsInfo) {
      intervalId = setInterval(stepMovingRubrics, 50); // fullTime/steps
    }
    stepMovingRubrics();
  }

//[merge cells]
  if (rubricsDown) addRightCell();
}

function stepMovingRubrics() {
  var i, k, n = 0;
  for (i = 1; i < rubrics.length; i++) {
    r = rubrics[i];
    if (!r.moveStarted) {
//    k = moveRubricsInfo.curStep/2-(r.colNum == moveRubricsInfo.colNum ? 0 : 1);
//    if (Math.abs(moveRubricsInfo.rowNum-r.rowNum) == k) r.moveStarted = true;
      r.moveStarted = true;
    }
    if (r.moveStarted && (r.curLeft != r.destLeft || r.curTop != r.destTop)) {
      if (r.incSpeedCnt > 0) {
        r.curLeft = r.sourLeft + (r.destLeft - r.sourLeft)*r.factor;
        r.curTop = r.sourTop + (r.destTop - r.sourTop)*r.factor;
        r.factor *= 2;
        r.incSpeedCnt--;
      } else {
        if (Math.abs(r.destLeft - r.curLeft) > 1)
          r.curLeft = Math.round((r.destLeft + r.curLeft)/2);
        else
          r.curLeft = r.destLeft;
//      if (r.curLeft < r.destLeft) r.curLeft += 1; else if (r.curLeft > r.destLeft) r.curLeft -= 1;
        if (Math.abs(r.destTop - r.curTop) > 1)
          r.curTop = Math.round((r.destTop + r.curTop)/2);
        else
          r.curTop = r.destTop;
//      if (r.curTop < r.destTop) r.curTop += 1; else if (r.curTop > r.destTop) r.curTop -= 1;
      }
      r.style.left = r.curLeft+'px';
      r.style.top  = r.curTop+'px';
      n++;
    }
  }
//moveRubricsInfo.curStep++;
  if (n == 0) {
    with (moveRubricsInfo) {
      clearInterval(intervalId);
      intervalId = null;
    }
    movingRubrics = false;

    if (!rubricsDown) {
//    [stopZooming]
      if (sitesContainer.zoomIntervalId) {
        clearInterval(sitesContainer.zoomIntervalId);
        sitesContainer.zoomIntervalId = null;
      }
//    [unmerge cells]
      removeRightCell();
    }

//  [move blocks to dest container]
//  var dest;
    for (i = 0; i < rubrics.length; i++) {
      r = rubrics[i];
      if (i > 0) {
//      r.parentNode.removeChild(r);
//      dest = rubricCols[(rubricsDown ? 0 : (i < lastColRubric ? 1 : 2))];
//      dest.appendChild(r);
        r.style.left = '';
        r.style.top = '';
        r.style.position = '';
//      r.style.float = (rubricsDown ? 'none' : 'left');
        r.style.width = '';
        r.style.height = '';
      }
      r.className = (rubricsDown ? 'rubric_box_left' : 'rubric_box');
//    log('r['+r.rubric+'].float = "'+r.style.float+'"');
    }

//  [reset cell divs styles]
    leftCell.style.height = '';
  }
}

function revertMovingRubrics() {
//rubricsDown = !rubricsDown;
//recalcMoveParams();
}

var
  bodyScrollTopNew = null,
  bodyScrollIntervalId = null;

function makeSelRubricVisible() {
  var r = selectedRubricLink.rubricDiv;
  var rT = r.dnTop;
  var rB = rT + r.blockHeight;
  var sT = document.body.scrollTop;
  var sB = sT + document.body.clientHeight;
  if (rT < sT) var delta = rT - sT - 16
  else if (rB > sB) var delta = rB - sB + 16
  else return;
  bodyScrollTopNew = Math.max(0, sT + delta);
  if (bodyScrollIntervalId == null)
    bodyScrollIntervalId = setInterval(stepScrollingBody, 50);
}

function stepScrollingBody() {
  var pos = Math.round((bodyScrollTopNew + document.body.scrollTop)/2);
  if (Math.abs(pos - bodyScrollTopNew) <= 1) pos = bodyScrollTopNew;
  document.body.scrollTop = pos;
  if (bodyScrollTopNew == pos) {
    clearInterval(bodyScrollIntervalId);
    bodyScrollIntervalId = null;
  }
}


//-- Load sites ---------------------------------------

var
  sitesLoader = null,
  sitesContentBuffer = '',
  subrubricsLoader = null;

/*function loadSitesByLetter(letter) {
  if (!contentHidden) {
    sitesContainer.afterZoom = zoomOutFinished;
    zoom(sitesContainer, '-');
  }
  loadSites('prefix', letter);
}

function loadLimitedSites() {
  if (!contentHidden) {
    sitesContainer.afterZoom = zoomOutFinished;
    zoom(sitesContainer, '-');
  }
  loadSites('order', 'limit&limit=50');
}*/

function loadSitesPage(page, order) {
  if (!contentHidden) {
    sitesContainer.afterZoom = zoomOutFinished;
    zoom(sitesContainer, '-');
  }
  loadSites(page, order);
}

function loadSites(page, order) {
  if (!sitesLoader) {
    sitesLoader = new RemoteFileLoader('sitesLoader');
//  sitesLoader.showRequestIndicator = true;
    sitesLoader.onCopyContent = sitesLoaded;
    sitesLoader.requestNum = 0;
//} else if (sitesLoader.isBusy) {
//  warn('sitesLoader is busy.');
//  return;
  }
//sitesLoader.isBusy = true;
  beginLoad();
  contentLoaded = false;
  var url = '/?theme='+curRubric + '&skip='+page +
            (order ? '&order='+order : '') + '&limit=0';
  sitesLoader.loadInto(url, 'sites_result_'+(++sitesLoader.requestNum));
}

function sitesLoaded(docDOM, docText, destId) {
//sitesLoader.isBusy = false;
  endLoad();
  if (!rubricsDown) return;
  contentLoaded = true;
  if (contentHidden) {
    contentHidden = false;
    sitesContainer.innerHTML = docText;
    sitesContainer.afterZoom = null;
    zoom(sitesContainer, '+');
    reposSites();
  } else {
    sitesContentBuffer = docText;
  }
  return true;
}

var
  loaderIcon = null;

function beginLoad() {
  if (loaderIcon && loaderIcon.parentNode) loaderIcon.parentNode.removeChild(loaderIcon);
  loaderIcon = $('loader_icon').cloneNode(true);
  rightCell.insertBefore(loaderIcon, rightCell.firstChild);
  loaderIcon.style.position = 'absolute';
  loaderIcon.style.display = 'block';
  reposSites();
}

function endLoad() {
  if (loaderIcon != null) {
    if (loaderIcon.parentNode) loaderIcon.parentNode.removeChild(loaderIcon);
    loaderIcon = null;
  }
}

//-- Site search ---------------------------------------

function toggleSiteSearch(el, siteId) {
  var container = findParentNode(el, 'LI');
  var form = findSubChild(container, 'FORM');
  if (form) {
    var block = form.parentNode;
  } else {
    block = document.createElement('DIV');
    block.style.display = 'none';
    block.innerHTML = '\
<form onSubmit="submitSiteSearch(this, event, \'' + siteId + '\')" style="padding: 0; margin: 0">\
 <div style="width: 100%">\
  <table width="100%" border="0" cellspacing="0" cellpadding="0"><tr valign="top">\
   <td width="90%"><input type="text" name="query" style="width: 100%" /></td>\
   <td width="10%"><input type="submit" value="Найти" style="margin-left: 0.5em" /></td>\
  </tr></table>\
 </div>\
</form>';
    var link = findSubChild(container, 'A');
    link.parentNode.insertBefore(block, link);
    form = findSubChild(block, 'FORM');
  }
  var show = (block.offsetHeight == 0 || block.zoomAction == '-');
  if (show) {
    var inp = findSubChild(form, 'INPUT');
    block.afterZoom = function() { inp.focus() };
  } else {
    block.afterZoom = null;
  }
  zoom(block, '', 10);
  if (show) inp.focus();
}

function submitSiteSearch(form, event, siteId) {
  cancelEvent(event);
  var inp = findSubChild(form, 'INPUT');
  inp.blur();
  location.href = '/?query=' + encodeURIComponent(inp.value) + '&site_id=' + siteId;
}

//-- Misc ----------------------------------------------

function log(s) {
  logBlock.innerHTML += s + '<br>';
}


//-- init() call ---------------------------------------

if (window.htmlLoaded) init(); else homeJsLoaded = true;


