/** Cookies
 **/

var _cookies;
function _initCookies() {
  _cookies = {};
  var ca = document.cookie.split(';');
  var re = /^[\s]*([^\s]+?)$/i;
  for(var i = 0; i < ca.length; i++) {
    var c = ca[i].split("=");
    if(c.length == 2) {
     _cookies[c[0].match(re)[1]] = unescape(c[1].match(re) ? c[1].match(re)[1] : '');
    }
  }
}
function getCookie(name) {
  if(!_cookies) _initCookies();
  return _cookies[name];
}
function setCookie(name, value, days) {
  if(!_cookies) _initCookies();
  _cookies[name] = value;
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else var expires = "";
  var domain = location.host.match(/[^.]+\.[^.]+$/);
  document.cookie = name+"="+escape(value)+expires+"; path=/"+(domain ? '; domain=.'+domain : '');
}

/** Other stuff
 **/

function dispatchIntro(step, params) {
  if (typeof dispatchIntroEvent != 'undefined') {dispatchIntroEvent(step, params);}
}

var send_request_url = 'http://userapi.com/data?';

var qCur = 0, qOn = 0, sOn = 0, qfOn = 0, qd = 0, l = 0, qa = 0, qfCur = -1, newSearch = 0;
// var qArr is in langpack

reqs = []; res = [];
friends_l = [];
friends_arr = [];
floaded = false;

function doRequest(params, resultFunc) {
  var req = createRequest(params, resultFunc);
  sendRequest(req);
}

function createRequest(params, resultFunc) {
  var req = new Object();
  req.params = params;
  req.resultFunc = resultFunc;
  req.destroy = destroy;
  var rnum = Math.floor(Math.random()*1000);
  req.num = rnum;
  req.running = 1;
  reqs[rnum] = req;
  return req;
}

function getFriends() {
 doRequest('&id='+getCookie('remixmid')+'&act=friends&to=2500&w=50', gotFriends);
}

function gotFriends(result) {
 friends_arr = result;
 var l = friends_arr.length;
 for (var i = 0; i < l; i++) {
  friends_l[i] = friends_arr[i][1].toLowerCase();
 }
 floaded = true;
}

function friendNav(k) {
  if (k == 38) {
   if (qd) {if (qCur > 0) {qCur = qCur - 1} else {qCur = qArr.length-1}; genQDrop(); return true}
   if (qfCur > -1) {qfrOn(qfCur-1)} else {qfrOn(l-1)}
   return true;
  }
  if (k == 40) {
   if (qd) {if (qCur < qArr.length-1) {qCur = qCur + 1} else {qCur = 0}; genQDrop(); return true}
   if (qfCur < l - 1) {qfrOn(qfCur+1)} else {qfrOn(-1)}
   return true;
  }
  if (k == 27) {
    searchOut(ge('qinput'));
    return false;
  }
  if (k == 13) {
   if (qd) {hideQDrop(qCur); return true;}
   if (!parseInt(qCur) && qfCur > -1 && res.length && res[qfCur] && res[qfCur][0]) {
    window.location = base_domain+'id'+res[qfCur][0];
    return true;
   } else {
    if (!newSearch) {
     qDoSearch();
    } else {
     globalSearch();
    }
    return false;
   }
  }
  return true;
 }

function friendFilter(e) {
 var k = 0;
 if (e) {
  k = e.keyCode;
  if (!friendNav(k)) {
    return;
  }
 }

 if (parseInt((qArr[qCur]||[])[0])) {return;}

 res = [];
 if (!floaded) {
  qfCur = -1;
  getFriends();
  setTimeout(friendFilter, 700);
 }

 var st = 0, en = 0, img, cl, name, q_lat;
 var q = ge('qinput').value.toLowerCase();
 if (!q.length && k != 8) {
  return;
 }

// hideQDrop(qCur);

 q_lat = parseLatin(q);
 l = friends_l.length;
 for (var i = 0; i < l; i++) {
  if (q.length && friends_l[i].indexOf(q) != -1) {
   res.push(friends_arr[i]);
  } else if (q_lat && q_lat.length && friends_l[i].indexOf(q_lat) != -1) {
   res.push(friends_arr[i]);
  }
 }


 var str = '', onl = '';
 l = res.length;
 if (l > 10) {l = 10;}
 if (l) {
  for (var i = 0; i < l; i++) {
   name = res[i][1];
   if (qfCur == i) {cl = 'qfr_cell_on'} else if (qfCur > -1 && qfCur == i - 1) {cl = 'qfr_cell_un'} else {cl = 'qfr_cell'}
   pos = name.toLowerCase().indexOf(q);
   if (pos == -1 && q_lat && q_lat.length) {
    q = q_lat;
    pos = name.toLowerCase().indexOf(q);
   }
   if (pos != -1) {
    if (res[i][2].length > 1) {img = "<img src='"+res[i][2]+"'>";} else {img = "?";}
    if (res[i][3]) {onl = "<b class='qonl'>online</b>";} else {onl = "";}
    name = name.substr(0, pos) + "<span>" + name.substr(pos, q.length) + "</span>" + name.substr(pos+q.length);
   }
   var lnk = '<a href="'+base_domain+'mail.php?act=write&to='+res[i][0]+'" onclick="cancelEvent(event); return showBox(\'sendMsg\', \'mail.php\', {act: \'a_write_box\', to: '+res[i][0]+'}, true, true, {title: \''+(window['profile_newmsg_box_title'] || 'Новое сообщение')+'\', progress: \'sending_progress\', width: 450}, [\'css/mail2.css\', \'js/mail.js\']);" class="qfr_lnk">'+(window['global_write_msg'] || 'Написать сообщение')+'</a>';
   str += "<div id='qfr"+i+"' class='"+cl+"' onmousemove=\"qfrOn("+i+")\" onmouseout=\"qfrOff("+i+")\" onclick=\"window.location='"+base_domain+"id"+res[i][0]+"'\">"+lnk+"<table border=0><tr><td><div>"+img+"</div></td><td>"+name+onl+"</td></tr></table></div>";
  }
  show('qfriends');
  toggleFlash();
 } else {
  hide('qfriends');
  toggleFlash(true, 20);
 }
 ge('qfriends').innerHTML = str;
}

function qfrOn(i) {
 if (qfCur > -1) {qfrOff(qfCur);}
 qfOn = 1; qfCur = i;
 if (ge('qfr'+i)) ge('qfr'+i).className = 'qfr_cell_on';
 if (ge('qfr'+(i+1))) {ge('qfr'+(i+1)).className = 'qfr_cell_un';}
}

function qfrOff(i) {
 qfOn = 0;
 if (ge('qfr'+i)) ge('qfr'+i).className = 'qfr_cell';
 if (ge('qfr'+(i+1))) {ge('qfr'+(i+1)).className = 'qfr_cell';}
}

function sendRequest(req) {
 attachScript('req'+req.num, send_request_url+req.params+'&sid='+getCookie('remixsid')+'&back=reqs['+req.num+'].resultFunc');
}

function attachScript(id, c) {
 var i, new_id = c.substr(c.indexOf('/')+1, c.indexOf('.')-c.indexOf('/')+2).replace(/[\/\.]/g, '_');
 var newreqs = [];
 for (reqnum in reqs) {
  req = reqs[reqnum];
  if (req) {
   if (req.running == 0) {
    ge('req'+req.num).parentNode.removeChild(ge('req'+req.num));
    reqs[reqnum] = null;
   } else {
    newreqs[reqnum] = req;
   }
  }
 }
 reqs = newreqs;
 var element = document.createElement('script');
 element.type = 'text/javascript';
 element.src = ((!/^http:\/\//i.test(c) && !/^\//i.test(c)) ? base_domain : '') + c + (css_versions[new_id] ? ('?' + css_versions[new_id]) : '');
 element.id = id;
 document.getElementsByTagName('head')[0].appendChild(element);
}


function destroy() {
 if (reqs[this.num]) {
  reqs[this.num].running = 0;
 }
}


function addCss(c) {
  var new_id = c.substr(c.indexOf('/')+1, c.indexOf('.')-c.indexOf('/')-1)+'_css';
  if (!ge(new_id)) {
    var headID = document.getElementsByTagName("head")[0];
    var cssNode = document.createElement('link');
    cssNode.type = 'text/css';
    cssNode.rel = 'stylesheet';
    cssNode.href = base_domain + c + (css_versions[new_id] ? ('?' + css_versions[new_id]) : '');
    cssNode.id = new_id;
    cssNode.media = 'screen';
    headID.appendChild(cssNode);
  }
}

var rateBox;
function showRateVotesBox() {
  if (window.event && (window.event.which == 2 || window.event.button == 1)) {
    return true;
  }
  addCss('css/privacy.css');
  addCss('css/wiki.css');
  if (rateBox == undefined) {
    rateBox = new MessageBox(
     {title: getLang('global_rating_box_header'), bodyStyle: 'padding:0px', width: '480px', progress: 'rateProgress'}
    );
  }
  rateBox.removeButtons();
  rateBox.addButton({
    onClick: function() { rateBox.hide(200); },
    label: getLang('box_close')
  });
  rateBox.loadContent('rate.php', {'act':'a_get_rate_votes', 'full': 1}, true).show();
  return false;
}

function searchOn(obj) {
setTimeout(function() {  if (!qd) toggleFlash(true, 20);
  sOn = 1;
  var qq = ge('qquery');
  var ph = obj.getAttribute('placeholder');
  if (obj.value && obj.value != ph) {return;}
  hide('topNav');
  var pageOffset = ge('pageLayout').offsetWidth-791 + (browser.msie6 ? -15 : 0);
  qq.style.width = (browser.iphone) ? '238px': (618+pageOffset)+'px';
  obj.style.width = (browser.iphone) ? '68px': (448+pageOffset)+'px';
  ge('quickSearch').style.width = (browser.iphone) ? '245px': (625+pageOffset)+'px';
  obj.value = '';
  var qs = qd ? 'qdrop_on' : 'qdrop_off';
  ge('qchoose').innerHTML = "<div onclick=\"showQDrop()\" id='qdrop' class='"+qs+"' onmousemove=\"qOn = 1;if (!qd) {this.className='qdrop_over'}\" onmouseout=\"qOn = 0; if (!qd) {this.className='qdrop_off'}\">"+qArr[qCur][1]+"</div>";
  genQDrop();
  obj.style.color = '#000';
  if (!qa) showQDrop(); }, 0);
}

function searchOut(qi) {
 if (qOn || qfOn) {return;}
 hide('qfriends');
 sOn = 0;
// toggleFlash(true, 20);
 if (qd)
   hideQDrop(qCur);
 else
   toggleFlash(true, 20);
 qi.blur();
 qd = 0;
 var ph = qi.getAttribute('placeholder');
 if (qi.value && qi.value != ph) {
   return;
 }
 ge('qchoose').innerHTML = "";
 var qq = ge('qquery');
 qi.style.color = '#777';
 qi.style.width = '85px';
 qq.style.width = '105px';
 ge('quickSearch').style.width = '112px';
 show('topNav');
 qi.value = ph; qa = 0;
}

function genQDrop() {
 var str = '', qoff, qover, st = '', j;
 for (j = qArr.length - 1; j > -1; j--) {
  if (links_visibility & qArr[j][4] || !qArr[j][4]) {
   break;
  }
 }
 for (var i = 0; i < qArr.length; i++) {
  if (i != qCur) {qoff = 'qdiv_off', qover = 'qdiv_over'; if (!i) {qover='qdiv_over_top';}} else {qoff = 'qdiv_on', qover = 'qdiv_on';}
  if (i == j) {qoff += ' qdiv_bottom'; qover += ' qdiv_bottom';}
  if (links_visibility & qArr[i][4] || !qArr[i][4]) {
   str += '<div onclick="hideQDrop('+i+')" class="'+qoff+'" onmousemove="qOn = 1; if(qd) this.className=\''+qover+'\';" onmouseout="qon=0; this.className=\''+qoff+'\';" '+st+'>'+qArr[i][1]+'</div>';
  }
 }
 ge('qdropdown').innerHTML = str;
}

function startHide() {
 if (qOn) return;
 hideQDrop(qCur);
}

function showQDrop() {
 if (qd) {hideQDrop(qCur);return;}
// alert(ge('qdropdown').style.display);
//  hideQDrop(qCur);return;
 toggleFlash();
 hide('qfriends');
 genQDrop();
 qd = 1; qa = 1; qOn = 1;
 ge('qdrop').className = 'qdrop_on';
 show('qdropdown');
 dispatchIntro(2);
// ge('qinput').focus();
}

function hideQDrop(i) {
 if (!qd) return;
 qOn = 0; qCur = i; qd = 0;
 var qdrop = ge('qdrop');
 if (qdrop) {
  qdrop.innerHTML = qArr[i][1];
  qdrop.className = 'qdrop_off';
  hide('qdropdown');
 }
 toggleFlash(true, 20);
 if (sOn) ge('qinput').focus();
 dispatchIntro(3);
}

function qDoSearch() {
 var qi = ge('qinput');
 var names_only = "";
 var ph = qi.getAttribute('placeholder');
 if (!qi.value || qi.value == ph) {return;}
 if (!qCur && qi.value) {names_only = "&name=1";}
 window.location = base_domain+'gsearch.php?section='+qArr[qCur][3]+'&q='+qi.value+names_only;
}

function parseLatin(text, back){
  var outtext = text;
  var lat1 = ["yo","zh","kh","ts","ch","sch","shch","sh","eh","yu","ya","YO","ZH","KH","TS","CH","SCH","SHCH","SH","EH","YU","YA","'"];
  var rus1 = ["ё", "ж", "х", "ц", "ч", "щ",  "щ",   "ш", "э", "ю", "я", "Ё", "Ж", "Х", "Ц", "Ч", "Щ",  "Щ",   "Ш", "Э", "Ю", "Я", "ь"];
  for(var i=0;i<lat1.length;i++){
    if (back) { outtext = outtext.split(rus1[i]).join(lat1[i]); }
    else { outtext = outtext.split(lat1[i]).join(rus1[i]); }
  }
  var lat2 = "abvgdezijklmnoprstufhcyABVGDEZIJKLMNOPRSTUFHCY" + "ёЁ";
  var rus2 = "абвгдезийклмнопрстуфхцыАБВГДЕЗИЙКЛМНОПРСТУФХЦЫ" + "еЕ";
  for(var i=0;i<lat2.length;i++){
    if (back) { outtext = outtext.split(rus2.charAt(i)).join(lat2.charAt(i)); }
    else { outtext = outtext.split(lat2.charAt(i)).join(rus2.charAt(i)); }
  }
  return (outtext==text)?null:outtext;
}

function placeholderSetup(id) {
  var el = ge(id);
  if (!el) return;
  var ph = el.getAttribute("placeholder");
  if (!el['phevents'] && ph && ph != "") {
    el['active'] = 1;
    if (!el.value && !el.focused) {
      el.style.color = '#777';
      el.value = ph;
      el['active'] = 0;
    }
    addEvent(el, 'focus', function(){
      if (el['active']) return;
      el['active'] = 1;
      el.value = '';
      el.style.color = '#000';
    });
    addEvent(el, 'blur', function(){
      if( !el['active'] || !ph || el.value != "" ) return;
      el['active'] = 0;
      el.style.color = '#777';
      el.value = ph;
    });
    el['phevents'] = 1;
    el.getValue = function(){
      return el['active'] ? el.value : '';
    }
  }
}

function setSelRange(id, from, to) {
  var el = ge(id);
  if (!el || (el.type.toLowerCase() != 'text' && el.type.toLowerCase() != 'password' && el.tagName.toLowerCase() != 'textarea')) return;
  el.focus();
  if (el.createTextRange) {
    var range = el.createTextRange();
    range.collapse(true);
    range.moveEnd('character', from);
    range.moveStart('character', to);
    range.select();
  } else if (el.setSelectionRange) {
    el.setSelectionRange(from, to);
  }
}

function focusAtEnd(id) {
  var el = ge(id);
  if (!el || (el.type != 'text' && el.type != 'password' && el.tagName != 'textarea')) return;
  setSelRange(el, el.value.length, el.value.length);
}

/** Message box
 **/
var _message_box_guid = 0,
    _message_boxes = [],
    _message_box_shown = 0,
    _doc_block_timeout, _doc_blocked = false;
function MessageBox(options) {
  var defaults = {
    type: "MESSAGE", // "MESSAGE" || "POPUP"
    hideOnClick: true,
    title: "Alert",
    width: "410px",
    height: "auto",
    bodyStyle: "",
    closeButton: false, // AntanubiS - 'X' close button in the caption.
    fullPageLink: '', // If is set - 'box'-like button in the caption.
    progress: false, // AntanubiS - Progress bar.
    returnHidden: false // AntanubiS - When hide - return previously hidden box.
  };

  options = extend(defaults, options);

  var buttonsCount = 0, body = document.getElementsByTagName('body')[0],
      transparentBG, boxContainer, boxBG, boxContainer, boxLayout, boxTitle, boxBody, boxControls, boxProgress, buttonYes, buttonNo, boxCloseButton, boxFullPageLink,
      guid = (++_message_box_guid), isVisible = false, hiddenBox;

  transparentBG = ge('popupTransparentBG');
  if (!transparentBG) {
    transparentBG = document.createElement('div');
    transparentBG.id = 'popupTransparentBG';
    transparentBG.className = 'popup_transparent_bg';
    transparentBG.innerHTML = '<iframe class="box_frame"></iframe>';
    hide(transparentBG);
    transparentBG.style.height = getSize(document)[1] + 'px';
    addEvent(window, 'resize', function() {
      transparentBG.style.height = getSize(document)[1] + 'px';
    });
    onDomReady(function() {
      body.appendChild(transparentBG);
    });    
  }

  boxContainer = document.createElement('div');
  boxContainer.className = 'popup_box_container';
  hide(boxContainer);
  var x_button = options.closeButton ? '<div class="box_x_button"></div>' : '';
  var full_page_button = options.fullPageLink ? '<a onfocus="this.blur()" class="box_full_page_link" href="' + options.fullPageLink + '"></a>' : '';
  boxContainer.innerHTML = '<div class="box_layout"><div class="box_title_wrap">' + x_button + full_page_button + '<div class="box_title"></div></div><div class="box_body" style="'+options.bodyStyle+'"></div><div class="box_controls_wrap"><div class="box_controls"></div></div></div>';

  boxFrame = geByClass('box_frame', transparentBG)[0];
  boxLayout = geByClass('box_layout', boxContainer)[0];
  boxTitle = geByClass('box_title', boxContainer)[0];
  boxBody = geByClass('box_body', boxContainer)[0];
  boxControls = geByClass('box_controls', boxContainer)[0];
  boxCloseButton = options.closeButton ? geByClass('box_x_button', boxContainer)[0] : false;
  boxFullPageLink = options.fullPageLink ? geByClass('box_full_page_link', boxContainer)[0] : false;

  if (options.progress) {
    boxControls.innerHTML = '<img src="' + base_domain + 'images/upload.gif" id="' + options.progress + '" style="display: none" />';
    boxProgress = boxControls.firstChild;
  } else {
    boxProgress = null;
  }

  addEvent(document, 'keydown', function(e) {
    if (e.keyCode == 27) {
      hideBox();
    }
  });

  if (!_message_boxes.length) {
    addEvent(document, 'block unblock', function(e) {
      toggleFlash(e.type == 'unblock');
    });
  }

  onDomReady(function() {
    body.appendChild(boxContainer);
    refreshBox();
    refreshCoords();
  });

  // Refresh box position
  function refreshCoords() {
    var height = window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight);
    containerSize = getSize(boxContainer);
    boxFrame.style.top =
    boxContainer.style.top = Math.max(0, Math.max(document.documentElement.scrollTop,  body.scrollTop) + (height - containerSize[1]) / 3) + 'px';
    boxFrame.style.marginLeft =
    boxContainer.style.marginLeft =  - containerSize[0] / 2 + 'px';
    setStyle(boxFrame, 'width', containerSize[0]);
    setStyle(boxFrame, 'height', containerSize[1]);
  }

  // Add button
  function addButton(options) {
    buttonsCount++;
    if (typeof options != 'object') options = {};
    options = extend({
        label: 'Button' + buttonsCount,
        style: 'button_yes'
    }, options);

    var buttonWrap = document.createElement('div');
    buttonWrap.className = options.style;
    buttonWrap.innerHTML = '<div id="button' + guid + '_' + buttonsCount + '">' + options.label + '</div>';
    if (boxProgress) {
      boxControls.insertBefore(buttonWrap, boxProgress);
    } else {
      boxControls.appendChild(buttonWrap);
    }
    createButton(buttonWrap.firstChild, options.onClick);
    return buttonWrap;
  }
  // Add custom controls text
  function addControlsText(text) {
    var textWrap = document.createElement('div');
    textWrap.className = "controls_wrap";
    textWrap.innerHTML = text;
    boxControls.appendChild(textWrap);
    return textWrap;
  }

  // Remove buttons
  function removeButtons() {
    var buttons = [];
    buttonsCount = 0;
    each (boxControls.childNodes, function(i, x) {
      if (x && (!boxProgress || x != boxProgress)) {
        removeEvent(x);
        buttons.push(x);
      }
    });
    each(buttons, function(){boxControls.removeChild(this)});
   // boxControls.innerHTML = '';
  }

  // Refresh box properties
  function refreshBox() {
    // Set title
    boxTitle.innerHTML = options.title;

    // Set box dimensions
    boxContainer.style.width = typeof(options.width) == 'string' ? options.width : options.width + 'px';
    boxContainer.style.height = typeof(options.height) == 'string' ? options.height : options.height + 'px';

    // Switch box type
    removeClass(boxContainer, 'box_no_controls');
    removeClass(boxContainer, 'message_box');

    removeEvent(boxContainer, 'click');
    if (options.hideOnClick && options.type == 'POPUP') {
      addEvent(boxContainer, 'click', function(){
        hideBox();
      });
    }

    switch (options.type) {
      case 'POPUP':
        addClass(boxContainer, 'box_no_controls');
        if (options.hideOnClick) {
          addEvent(transparentBG, 'click', function(){
            hideBox();
          });
        }
      break;

      case 'MESSAGE':
        addClass(boxContainer, 'message_box');
        removeEvent(transparentBG, 'click');
      break;
    }
  }

  // Show box
  function showBox() {
    if (isVisible) return;
    isVisible = true;
    hiddenBox = 0;

    if (_message_box_shown && _message_boxes[_message_box_shown].isVisible) {
      var box = _message_boxes[_message_box_shown];
      if (options.returnHidden) {
        hiddenBox = _message_box_shown;
        box.hideContainer();
      } else {
        box.hide();
      }
    }
//  fadeIn(boxContainer, 200); // Video wall posting fails with fadeIn
    show(boxContainer);

    refreshCoords();
    if (!_message_box_shown) {
      show(transparentBG);
      clearTimeout(_doc_block_timeout);
      if (!_doc_blocked) {
        _doc_blocked = true;
        triggerEvent(document, 'block');
      }
    }

    _message_box_shown = guid;

    if (options.onShow)
      options.onShow();
  }
  // Hide box
  function hideBox(speed) {
    if (!isVisible) return;
    if (options.onHideAttempt && !options.onHideAttempt()) return;
    isVisible = false;

    var onHide = function () {
      hide(boxContainer);
      var showHidden = false;
      if (options.returnHidden && hiddenBox) {
        _message_boxes[hiddenBox].showContainer();
        _message_box_shown = hiddenBox;
        showHidden = true;
      }
      if (!showHidden) {
        _message_box_shown = 0;
        hide(transparentBG);
        clearTimeout(_doc_block_timeout);
        if (_doc_blocked) {
          _doc_block_timeout = setTimeout(function() {
            _doc_blocked = false;
            triggerEvent(document, 'unblock');
          }, 50);
        }
      }
      if (options.onHide) options.onHide();
    }
    if (speed > 0)
      fadeOut(boxContainer, speed, onHide);
    else
      onHide();
  }

  var fadeToColor = function(color) {
    return function() {
      animate(this, {backgroundColor: color}, 200);
    }
  }
  if (boxCloseButton) {
    addEvent(boxCloseButton, 'mouseover', fadeToColor('#ffffff'));
    addEvent(boxCloseButton, 'mouseout', fadeToColor('#9CB8D4'));
    addEvent(boxCloseButton, 'click', hideBox);
  }
  if (boxFullPageLink) {
    addEvent(boxFullPageLink, 'mouseover', fadeToColor('#ffffff'));
    addEvent(boxFullPageLink, 'mouseout', fadeToColor('#9CB8D4'));
  }

  function onLoadError(text) {
    boxBody.innerHTML = 'Error: ' + text;
    removeButtons();
    addButton({label: getLang('box_close'), onClick: hideBox});
    refreshCoords();
    if (isFunction(options.onLoadError)) options.onLoadError(text);
  }

  var retBox = {
    guid: guid,
    // Show box
    show: function(speed) {
      showBox(speed); return this;
    },

    // Hide box
    hide: function(speed) {
      hideBox(speed); return this;
    },

    isVisible: function() {
      return isVisible;
    },

    // Insert html content into the box
    content: function(html) {
      boxBody.innerHTML = html;
      refreshCoords();
      return this;
    },

    // Load html content from URL
    loadContent: function(url, params, evaluate, loader_style) {
      // Show loader
      var st = loader_style ? loader_style : '';
      boxBody.innerHTML = '<div class="box_loader" style="' + st + '"></div>';

      // Load remote html using get request
      if (typeof params != 'object') params = {};
      var self = this;
      Ajax.Send(url, params, {
       onSuccess: function(ajaxObj, responseText) {
        if (evaluate) {
          try {
           var result = eval('('+responseText+')');
           //alert(result.script);
           boxBody.innerHTML = result.html ? result.html : '';
           if (result.script)  window.execScript ? window.execScript(result.script) : eval.call(window, result.script);
          } catch (e) {return onLoadError(e.message);}
        } else {
          boxBody.innerHTML = responseText;
        }
        refreshCoords();
        if (isFunction(options.onLoad)) options.onLoad(responseText);
       },
       onFail: function(ajaxObj, responseText) {
        onLoadError('Request error occured.');
       }
      });

      return this;
    },

    // Add button
    addButton: function(options) {
      var btn = addButton(options);
      return (options.returnBtn) ? btn : this;
    },
    // Add
    addControlsText: function(text) {
      var el = addControlsText(text);
      return (options.returnBtn) ? el : this;
    },

    // Remove buttons
    removeButtons: function(options) {
      removeButtons();
      return this;
    },

    // Update box options
    setOptions: function(newOptions) {
      options = extend(options, newOptions);
      if ("bodyStyle" in newOptions) {
        var items = options.bodyStyle.split(';');
        for (var i = 0; i < items.length; ++i) {
          var name_value = items[i].split(':');
          if (name_value.length > 1 && name_value[0].length) {
            boxBody.style[trim(name_value[0])] = trim(name_value[1]);
          }
        }
      }
      if (options.fullPageLink && boxFullPageLink) {
        boxFullPageLink.href = options.fullPageLink;
      }
      refreshBox();
      refreshCoords();
      return this;
    },
    fixIE6: refreshBox,
    hideContainer: function() { isVisible = false; hide(boxContainer); },
    showContainer: function() { isVisible = true; show(boxContainer); },
    body: function() { return boxBody; }
  };
  _message_boxes[guid] = retBox;
  return retBox;
};

// Extends MessageBox
function AlertBox(title, text, callback, options) {
  var aBox = new MessageBox({title: title});
  if (typeof options == 'object') aBox.setOptions(options);
  else options = {};
  aBox.removeButtons();
  if (options.boxType == 'CONFIRM') {
   aBox.addButton({label:  options.no || getLang('box_no'), style: 'button_no', onClick: aBox.hide}).addButton({label: options.yes || getLang('box_yes'), onClick: function(){
    if (isFunction(callback) && callback() === false) return;
    aBox.hide();
   }});
  } else {
    aBox.addButton({label: options.no || getLang('box_close'), onClick: aBox.hide});
  }
  return aBox.content(text);
}

var button_anim = {duration: 200, transition: Fx.Transitions.halfSine};
var button_anims = {
  button_yes: {
    ''      : {p: ['#6D8FB3', '#7E9CBC', '#5C82AB', '#5C82AB', '#5C82AB'], o: button_anim},
    '_hover': {p: ['#84A1BF', '#92ACC7', '#7293B7', '#7293B7', '#7293B7'], o: button_anim},
    '_down' : {p: ['#6688AD', '#51779F', '#51779F', '#7495B8', '#51779F'], o: 0}
  }, button_no: {
    ''      : {p: ['#EAEAEA', '#FFFFFF', '#F4F4F4', '#DFDFDF', '#F4F4F4'], o: button_anim},
    '_hover': {p: ['#F7F7F7', '#FFFFFF', '#F4F4F4', '#DFDFDF', '#F4F4F4'], o: button_anim},
    '_down' : {p: ['#E4E4E4', '#CCCCCC', '#CBCBCB', '#E8E8E8', '#CBCBCB'], o: 0}
  }
}

/* 3-state button */
function createButton(el, onClick, classPrefix) {
  el = ge(el);
  if (!el) return;
  if (classPrefix == undefined) classPrefix = 'button';
  var upd = function(state) {
    if (!button_anims[el.parentNode.className]) {
     el.className = classPrefix + state;
    } else {
     var a = button_anims[el.parentNode.className][state];
     animate(el, {backgroundColor: a.p[0], borderTopColor: a.p[1], borderRightColor: a.p[2], borderBottomColor: a.p[3], borderLeftColor: a.p[4]}, a.o);
    }
  }
  var hover = false;
  addEvent(el, 'click mousedown mouseover mouseout', function(e) {
    var bc = getXY(el), bs = [el.offsetWidth, el.offsetHeight];
    switch (e.type) {
    case 'click':
      if (!hover) return;
      upd('_hover');
      if (isFunction(onClick)) onClick();
    break;
    case 'mousedown':
      upd('_down');
    break;
    case 'mouseover':
      upd('_hover');
      hover = true;
    break;
    case 'mouseout':
      upd('');
      hover = false;
    break;
    }
  });
}

var langBox;
function changeLang() {
 if (!langBox) {
  langBox = new MessageBox({title: (getLang('select_language')), width: 480});
  langBox.addButton({label:  getLang('box_close'), onClick: function(){langBox.hide(200)}});
 }
 langBox.loadContent('lang.php', {act:'lang_dialog'}, true).show();
 return false;
}
function doChangeLang(lang_id, hash) {
 Ajax.Send('lang.php', {act:'change_lang',lang_id: lang_id, hash:hash}, function(){
   setCookie('remixlang', lang_id);
   location.reload(true);
 });
 return false;
}

function nameTip(obj) {
 if ((qArr[qCur]||[])[0] || obj.value.length || qd) {return;}
 show('qfriends');
 ge('qfriends').innerHTML = "<div style='border-top: 1px solid #C6D0D9; padding: 4px 18px; background-color: #FAFAFA;'>"+top_search_tip+"</div>";
};

(function(){
  var lastLength = 0;
  window.checkTextLength = function(max_len, val, warn, nobr){
    if(lastLength==val.length)return;
    lastLength=val.length;
    var n_len = replaceChars(val, nobr).length;
    warn.style.display = (n_len > max_len - 100) ? "" : "none";
    if (n_len > max_len) {
      warn.innerHTML = getLang('text_exceeds_symbol_limit', n_len - max_len);
    } else if (n_len > max_len - 100) {
      warn.innerHTML = getLang('text_N_symbols_remain', max_len - n_len);
    } else {
      warn.innerHTML = '';
    }
  };

  window.replaceChars = function(text, nobr) {
    var res = "";
    for (var i = 0; i<text.length; i++) {
      var c = text.charCodeAt(i);
      switch(c) {
        case 0x26: res += "&amp;"; break;
        case 0x3C: res += "&lt;"; break;
        case 0x3E: res += "&gt;"; break;
        case 0x22: res += "&quot;"; break;
        case 0x0D: res += ""; break;
        case 0x0A: res += nobr?"\t":"<br>"; break;
        case 0x21: res += "&#33;"; break;
        case 0x27: res += "&#39;"; break;
        default:   res += ((c > 0x80 && c < 0xC0) || c > 0x500) ? "&#"+c+";" : text.charAt(i); break;
      }
    }
    return res;
  };
})();

var winBoxes = {};
function showBox(name, url, query, lnk, reload, params, files) {
  if (typeof lnk == 'object') {
    reload = lnk.reload;
    params = lnk.params;
    files = lnk.files;
    lnk = lnk.href;
  }
  if (lnk && window.event && (window.event.which == 2 || window.event.button == 1)) {
    return true;
  }
  params = extend({title: getLang('box_loading')}, params);
  if (!winBoxes[name]) {
    winBoxes[name] = new MessageBox(params);
    reload = true;
    if (files) {
      for (var i in files) {
        if (/\.css/i.test(files[i])) {
          addCss(files[i]);
        } else if (/\.js/i.test(files[i])) {
          attachScript('script'+i, files[i]);
        }
      }
    }
  } else if (reload) {
    winBoxes[name].setOptions(params);
  }
  if (reload) {
    winBoxes[name].removeButtons();
    winBoxes[name].addButton({label: getLang('global_close'), onClick: winBoxes[name].hide});
    winBoxes[name].loadContent(url, query, true);
  }
  hide('qfriends');
  hideQDrop(qCur);
  winBoxes[name].show();
  return false;
}

function notaBene(el, color) {
  el = ge(el);
  el.focus();
  var oldBack = data(el, 'back');
  if(!oldBack) oldBack = data(el, 'back', getStyle(el, 'backgroundColor'));
  var colors = {'notice':'#FFFFE0', 'warning':'#FAEAEA'};
  setStyle(el, 'backgroundColor', colors[color] || color || colors['warning']);
  setTimeout(function(){
    animate(el, {backgroundColor: oldBack}, 300);
  }, 400);
}

function im_popup(peer_id) {
  if (window.event && (window.event.which == 2 || window.event.button == 1)) {
    return true;
  }

  var params = 'scrollbars=0,resizable=1,menubar=0,location=0,width=610,height=469,toolbar=0,status=0';
  if (!window.loc_host) {
    window.loc_host = location.host;
  }
  var dom = window.loc_host.toString().match(/[a-zA-Z]*\.[a-zA-Z]*$/)[0];

  document.domain = dom;

  var url = 'http://' + (/^cs\d*/.test(window.loc_host) ? window.loc_host : dom) + '/im.php?act=a_box&popup=1';
  var js = 'window.im.activate_tab(0);';
  if (peer_id) {
    url += '&sel=' + peer_id;
    js = 'window.im.add_peers(' + peer_id + ', ' + peer_id + ')';
  }
    
  url = 'javascript: try { ' + js + ' } catch(e) { document.location = "' + url + '"; void(0); }';

  window.im_popup_window = window.open(url, 'im', params);

  try {
    if (!browser.chrome && !browser.msie && !browser.mozilla && !browser.safari && window.im_popup_window.im) {
      window.im_already_box = new MessageBox({title: (window.im_already_shown_title || 'Мгновенные сообщения')});
      im_already_box.content(window.im_already_shown || 'Окно Мгновенных сообщений уже запущено, Вам достаточно просто перейти на него.');
      im_already_box.addButton({label: getLang('box_close'), onClick: im_already_box.hide});
      setTimeout("im_already_box.hide(400)", 2000);
      im_already_box.show();
    }
  } catch (e) {}

  if (!browser.msie) {
    window.im_popup_window.blur();
  }
  window.im_popup_window.focus();

  try {
    document.domain = window.loc_host;
  } catch (e) {}

  return false;
}

function reportAd(aid){
  showBox('reportAd', base_domain+'reports.php', {act:'a_report_ad_box', aid:aid}, false, true, {width:350}, ['js/lib/ui_controls.js', 'css/ui_controls.css']);
}

window.sbWidth = function() {
  if (!window._sbWidth) {
    var test = document.createElement("div");
    with (test.style) {
      overflowY = "scroll";
      position = "absolute";
      height = "100px";
      width = "100px";
    }
    test.innerHTML = '<div style="height:200px;">1<br/>1<br/>1<br/>1<br/></div>';
    var body = document.getElementsByTagName('body')[0];
    body.appendChild(test);
    window._sbWidth = test.offsetWidth - test.getElementsByTagName('div')[0].offsetWidth - 1;
    body.removeChild(test);
    delete test;
  }
  return window._sbWidth;
}

function linkButton(elem, handler) {
  elem = ge(elem);
  addEvent(elem, 'mouseover', function() { this.className = 'linkover'; });
  addEvent(elem, 'mouseout', function() { this.className = 'link'; });
  addEvent(elem, 'click', handler);
}

var video_js_attached = 0;
function showVideoBoxCommon(vars, elem, description, to_comments_text, add_text, add_hash, thumb, player_available, allow_html5) {
  if (window.PLAYER_JS_ADDED){
    return showVideoBox(vars, elem, description, to_comments_text, add_text, add_hash, thumb, player_available, allow_html5);
  }
  if (!video_js_attached){
    //addCss('css/video.css');
    attachScript('player_js', '/js/player.js');
    video_js_attached = 1;
  }
  setTimeout(function() { 
    showVideoBoxCommon(vars, elem, description, to_comments_text, add_text, add_hash, thumb, player_available, allow_html5);
  }, 100);
  return false;
}

