// Форматирование строк ( format('Да здравствует %what%!', {what: 'Зиметрикс'}) -> 'Да здравствует Зиметрикс!' )
String.prototype.format = (function() {
  var s = '%';  // разделитель
  var replaceExpr = new RegExp( ['(', s, '(.+?)', s, ')'].join(''), 'g' );

  return function(replaceObj) {
    return this.replace(replaceExpr, function(subStr, fullExpr, expr) {
      return ( expr in replaceObj ) ? replaceObj[expr] : fullExpr;
    });
  }
})();

// Функция безопасной перезагрузки страницы (без повторной отправки формы)
window.reload = function() {
  var l = this.location;
  l.replace( l.href.replace(/#.*/, '') );
};

function recheckLangs() {
  $('#lang_ru').show();
  $('#lang_en').show();
  $('#lang_fr').show();
  $('#lang_zh').show();
  $('#lang_de').show();
  $('#lang_ar').show();
  $('#lang_' + $('#nativeLanguage').val()).hide();
}

function popup(html, color, modal) {
  ModalPopup = modal || false;
  $("#popupMessage>.cont").html(html);
  var c;
  switch (color) {
    case POPUP_ERROR: c = "alarm"; break;
    case POPUP_INFO: c = "warning"; break;
    case POPUP_SUCCESS: c = "notice"; break;
    case POPUP_QUESTION: c = "question"; break;
    default: c = "notice";
  }

  $("#popupMessage").attr({'class': "forum_" + c}).animate({opacity: "show"});
}

function popup2(input, html, position) {
  position = position || "top";
  if (!input || !input.length) return;
  if (!html || !$.trim(html)) return;
  var left;
  var top;

  switch (position) {
    case "top":
      left = input.offset().left - 1;
      top = input.offset().top - $("#popupMessage2").height() - 5;
      $("#downer").show();
      $("#lefter").hide();
      break;

    case "right":
      left = input.offset().left + input.width() + 18;
      top = input.offset().top - 17 + 11;
      $("#lefter").show();
      $("#downer").hide().css({display: "none"});//todo wtf???
      break;

    default:
      left = input.offset().left - 1;
      top = input.offset().top - $("#popupMessage2").height() - 5;
      $("#downer").show();
      $("#lefter").hide();
  }
  $("#popupMessage2")
  .stop()
  .css({
    position: "absolute",
    left: left,
    top : top,
    display : "block",
    opacity : 1
  })
  .find(".popupContent").html(html);
}
$(document).mousedown(function () {
  if (!ModalPopup && $("#popupMessage").css("opacity") == 1) hpopup();
});

function hpopup() {
  $("#popupMessage").animate({opacity: "hide"});
  $("#popupMessage2").animate({opacity: "hide"});
}

function capitalize(element) {
  var value = $(element).val();

  if (value.length > 0) {
    value = value.substr(0, 1).toUpperCase() + value.substr(1);
    $(element).val(value);
  }
}

function submitForm(name) {
  if (!window.form) {
    window.form = {run : 0, firstIsSet : false};
  } else {
    window.form.firstIsSet = false;
  }

  var f = document.forms[name];
  if (f && (!f.onsubmit || f.onsubmit()))  {
    f.submit();
    return true;
  }
  return false;
}

var transliterate = {
  apply : function(value) {
    var result = '';
    for (var i = 0; i < String(value).length; i++) {
      var chr = value.substr(i, 1);
      if (this.map[chr]) {
        result += this.map[chr];
      } else if (chr.match(this.re)) {
        result += chr;
      }
    }
    return result;
  },
  re : /[\s\' 0-9a-zA-Z_-]/gi,
  re2 : /[^\s\' 0-9a-zA-Z_-]/gi,
  map : {
    'а': 'a',
    'б': 'b',
    'в': 'v',
    'г': 'g',
    'д': 'd',
    'е': 'e',
    'ё': 'ye',
    'ж': 'zh',
    'з': 'z',
    'и': 'i',
    'й': 'y',
    'к': 'k',
    'л': 'l',
    'м': 'm',
    'н': 'n',
    'о': 'o',
    'п': 'p',
    'р': 'r',
    'с': 's',
    'т': 't',
    'у': 'u',
    'ф': 'f',
    'х': 'kh',
    'ц': 'ts',
    'ч': 'ch',
    'ш': 'sh',
    'щ': 'shch',
    'ъ': '\'\'',
    'ы': 'y',
    'ь': '\'',
    'э': 'e',
    'ю': 'yu',
    'я': 'ya',

    'А': 'A',
    'Б': 'B',
    'В': 'V',
    'Г': 'G',
    'Д': 'D',
    'Е': 'E',
    'Ё': 'Ye',
    'Ж': 'Zh',
    'З': 'Z',
    'И': 'I',
    'Й': 'Y',
    'К': 'K',
    'Л': 'L',
    'М': 'M',
    'Н': 'N',
    'О': 'O',
    'П': 'P',
    'Р': 'R',
    'С': 'S',
    'Т': 'T',
    'У': 'U',
    'Ф': 'F',
    'Х': 'Kh',
    'Ц': 'Ts',
    'Ч': 'Ch',
    'Ш': 'Sh',
    'Щ': 'Shch',
    'Ъ': '\'\'',
    'Ы': 'Y',
    'Ь': '\'',
    'Э': 'E',
    'Ю': 'Yu',
    'Я': 'Ya'
  }
};

function xcloneWithImage(elt, onUnclone, onClone, insertBefore) {
  var button = elt;
  do {
    if (elt.xelement && 'group' == elt.xelement.getDataType()) {
      var root = elt;
      break;
    }
  } while (elt = elt.parentNode);

  if (root) {
    $(button).attr('button', 'yes');

    var newroot = root.cloneNode(true);
    var mult    = $('*[button=yes]', $(newroot)).get(0);
    mult.id     = '';
    mult.innerHTML = '<ins></ins>';
    mult.setAttribute('onclick', 'xunclone(this);' + (onUnclone ? onUnclone + ';' : ''));
    mult.onclick = new Function('xunclone(this);' + (onUnclone ? onUnclone + ';' : ''));
    $(mult).removeClass("btn24_orange").addClass("btn24_gray").children().addClass('btn24_del');
    mult.root = newroot;

    if (onClone) {
      try {
        onClone(newroot);
      } catch(e) {
      }
    }

    xFormParser.onClone(root, newroot);
    if (insertBefore) {
      insertBefore.parentNode.insertBefore(newroot, insertBefore);
    } else {
      DOMUtl.appendAfter(newroot, root);
    }
  }
}

function xforms_error(element) {
  var offset = $(element).position();
  $(element).get(0).onblur = function() {
    $('#formPopup').animate({ opacity: "hide" }, 100);
  };
  $('#formPopup').css({position : 'absolute', top : offset.top - 23, left : offset.left + 20}).show();
}

function xunclone(elt) {
  DOMUtl.removeNode(elt.root);
}

function xclone(elt, onUnclone, onClone, insertBefore, newBtnTitle) {
  newBtnTitle = newBtnTitle || null;

  var button = elt;

  do {
    if (elt.xelement && 'group' == elt.xelement.getDataType()) {
      var root = elt;
      break;
    }
  } while (elt = elt.parentNode);

  if (root) {
    $(button).attr('button', 'yes');

    var newroot = root.cloneNode(true);
    var mult    = $('*[button=yes]', $(newroot)).get(0);
    $(mult).addClass('btn24_gray').removeClass('btn24_orange');
    mult.id   = '';
    if (newBtnTitle !== null) {
      mult.title = newBtnTitle;
    }
    mult.root = newroot;
    mult.innerHTML = '<i class="btn24_del"></i>';
    mult.setAttribute('onclick', 'xunclone(this);' + (onUnclone ? onUnclone + ';' : ''));
    mult.onclick = new Function('xunclone(this);' + (onUnclone ? onUnclone + ';' : '') + ';return false;');

    if (onClone) {
      try {
        onClone(newroot);
      } catch(e) {
      }
    }

    xFormParser.onClone(root, newroot);
    if (insertBefore) {
      insertBefore.parentNode.insertBefore(newroot, insertBefore);
    } else {
      DOMUtl.appendAfter(newroot, root);
    }
  }
}

function xclone2(elt, onUnclone, onClone, insertBefore) {
  var button = elt;
  do {
    if (elt.xelement && 'group' == elt.xelement.getDataType()) {
      var root = elt;
      break;
    }
  } while (elt = elt.parentNode);

  if (root) {
    $(button).attr('button', 'yes');

    var newroot = root.cloneNode(true);
    var mult    = $('*[button=yes]', $(newroot)).get(0);
    $(mult).addClass('btn24_gray').removeClass('btn24_orange');
    mult.id     = '';
    mult.innerHTML = '<i class="btn24_del"></i>';
    mult.setAttribute('onclick', 'xunclone(this);' + (onUnclone ? onUnclone + ';' : ''));
    mult.onclick = new Function('xunclone(this);' + (onUnclone ? onUnclone + ';' : ''));
    mult.root = newroot;

    if (onClone) {
      try {
        onClone(newroot);
      } catch(e) {
      }
    }

    xFormParser.onClone(root, newroot);
    if (insertBefore) {
      insertBefore.parentNode.insertBefore(newroot, insertBefore);
    } else {
      DOMUtl.appendAfter(newroot, root);
    }
  }
}

var POPUP_ERROR = 0;
var POPUP_INFO = 1;
var POPUP_SUCCESS = 2;
var POPUP_QUESTION = 3;
var ModalPopup = false;
var errorMess = l10n.zCommon.requestError;

function twoPos(num){
  num = num.toString().substr(0, 2);
  num = parseInt(num, 10);
  return (num < 10) ? '0' + num : num;
}

function styleFile(fileElement, nameElement) {
  $(fileElement).change(function() {
    $(fileElement).each(function() {
      var name = this.value;
      reWin = /.*\\(.*)/;
      var fileTitle = name.replace(reWin, "$1");
      reUnix = /.*\/(.*)/;
      fileTitle = fileTitle.replace(reUnix, "$1");
      $(nameElement).html(fileTitle);
	});
  })
}

function changeMapScrollType( checkboxElem, url, state ) {
  state = state ? 1 : 0;
  url += '?id=' + state;
  $.get( url, function() {
    checkboxElem.checked = (state ? true : false);
  });
}

$.fn.inputHint = function( /*text=input.value, activeClass='normal_text'*/ ) {
  var text = arguments.length ? arguments[0] : null;
  var activeClass = arguments.length > 1 ? arguments[1] : 'normal_text';
  var $elems = this.filter('input, textarea').each( function() {
    var self = this;
    var $elem = $(self);
    var classAdded = false;
    function toggleClass( toggle ) {
      if( classAdded !== toggle ) {
        classAdded = toggle;
        $elem.toggleClass( activeClass );
      }
    }
    self.defaultValue = self.value = ( text === null ? self.value : text );
    $elem.focus( function() {
      if( this.value == this.defaultValue ) {
        $elem.change();
      }
    }).blur( function() {
      if( this.value == '' ) {
        $elem.change();
      }
    }).change( function() {
      if( this.value === this.defaultValue ) {
        $elem.val('');
      } else if( this.value == '' ) {
        $elem.val( this.defaultValue );
      }
      toggleClass( this.value !== this.defaultValue );
    }).keydown(function(){
      if( this.value === this.defaultValue ) {
        $elem.val('');
      }
    });
  });
  return this;
};

$.fn.hasValue = function() {
  var $elem = this.filter( 'input, textarea' ).eq( 0 );
  if( !$elem.length ) {
    return false;
  }
  var val = $elem.val();
  var trimmed = $.trim( val );
  return 'defaultValue' in $elem[0] ? trimmed.length && val !== $elem[0].defaultValue : !!trimmed.length;
};

// Функция для установки/получения значений чекбоксов и радио-кнопок
$.fn.zValue = function(val,opt){
  var _self = $(this).filter('input:radio, input:checkbox');
  if (_self.length > 0){
    if (typeof(val) !== 'undefined' && val !== null){
      if (typeof(opt)!='object'|| opt === null){
        opt = {}
      }
      if(!opt.append){
        _self.removeAttr('checked');
      }
      if (typeof(val) == 'object'){
        for (var key in val){// val = [1,2,3]
          _self.filter('[value="'+val[key]+'"]').attr('checked','checked')
        }
      }else{
        _self.filter('[value="'+val+'"]').attr('checked','checked')
      }
    }else{
      var result = {};
      var count = 0;
      var name;
      _self.each(function(){
        var _self = $(this);
        var _val = this.value;
        if (_self.filter('[value]:checked').length > 0){
          name = _self.attr('name');
          if (name == ''){
            name = 'default'
          }
          if (!result[name]){
            result[name] = [_val];
            count ++;
          }else if( $.inArray(_val,result[name]) == -1){
            result[name].push(_val);
          }

        }
      });
      return (count > 1? result : result[name]);
    }
  }else{
    return $(this).val(val);
  }
};

var Cookie = {
  create : function (name, value, days, path) {
    if (days) {
      var date = new Date();
      date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
      var expires = "; expires=" + date.toGMTString();
    }
    else var expires = "";
    if (path) {
      expires += "; path=" + path;
    }
    document.cookie = name + "=" + encodeURI(value) + expires + ";";
  },
  read : function (name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
      var c = ca[i];
      while (c.charAt(0) == ' ') c = c.substring(1, c.length);
      if (c.indexOf(nameEQ) == 0) return decodeURI(c.substring(nameEQ.length, c.length));
    }
    return null;
  },
  erase : function (name) {
    Cookie.create(name, "", -1);
  }
};

// словарик //

var W_FILE      = 4;
var W_INVITE    = 5;
var W_INTERES   = 7;
var W_BRANCHES  = 8;
var W_POSITION  = 9;
var W_FOLDER    = 10;
var W_OBJ       = 11;
var W_DAY_GENITIVE = 12;
var W_OKOPF = 13;


function dict(word, num) {
  word = parseInt(word);
  num = parseInt(num);
  var words = {
      "ru" : [
          ["день", "дня", "дней", "день"],
          ["неделя", "недели", "недель", "неделю"],
          ["месяц", "месяца", "месяцев", "месяц"],
          ["год", "года", "лет", "год"],
          ["файл", "файла", "файлов", "файл"],
          ["приглашения", "приглашений", "приглашений", "приглашение"],
          ["символ", "символа", "символов", "символ"],
          ["интерес", "интереса", "интересов", "интерес"],
          ["отрасль", "отрасли", "отраслей", "отрасль"],
          ["должность", "должности", "должностей", "должность"],
          ["папку", "папки", "папок", "папку"],
          ["объект", "объекта", "объектов", "объект"],
          ["дня", "дней", "дней", "день"],
          ["тип предприятия", "типа предприятия", "типов предприятия", "день"]
      ],
      "en" : [
          ["day", "day", "days", "day"],
          ["week", "weeks", "weeks", "week"],
          ["month", "month", "months", "month"],
          ["year", "year", "years", "year"],
          ["file", "file", "files", "file"],
          ["invites", "invites", "invites", "invite"],
          ["symbol", "symbol", "symbols", "symbol"],
          ["interest", "interest", "interests", "interest"],
          ["activity", "activities", "activities", "activity"],
          ["position", "positions", "positions", "position"],
          ["folder", "folders", "folders", "folder"],
          ["object", "object", "objects", "object"],
          ["day", "days", "days", "day"],
          ["company type", "company type", "company types", "day"]
      ]
  };

  if (num == -1) return words[word][3];
  if (num % 10 == 1 && num % 100 != 11) return words[l10n.lang][word][0];
  if (num % 10 >= 2 && num % 10 <= 4 && num % 100 != 12 && num % 100 != 13 && num % 100 != 14) return words[l10n.lang][word][1];
  return words[l10n.lang][word][2];
}

function textFilter ( el, reg, replace, message ) {
  replace = replace || "";
  message = message || "";
  $(el).keyup(function ( e ) {
    var v = this.value;
    v = v.replace(reg, replace);
    if ( v != this.value ) {
      this.value = v;
      if ( message ) popup2( $(this), message, "right" );
    } else hpopup();
  }).blur(hpopup);
}

String.prototype.htmlSpecialChars = function () {
  return this.replace(/&/g, "&amp;").replace(/</g,"&lt;").replace(/>/g, "&gt;").replace(/'/g, "&#039;").replace(/"/g, "&quot;");
};

/*
 * вернет число на которое приходится день первой недели месяца текущей даты
 * Int weekDay [1..7]
 */
Date.prototype.getDayOfFirstWeek = function (weekFirstDay) {
  var firstDay = new Date(this);
  firstDay.setDate(1);
  var weekDay = firstDay.getDay();
  if (weekDay == 0) weekDay = 7;
  weekDay = (weekFirstDay - weekDay + 8) % 7;
  return !weekDay ? 7 : weekDay;
};

Date.prototype.getWeekInMonth = function () {
  var firstSunday = this.getDayOfFirstWeek(7);
  var date = this.getDate();
  return Math.floor((date - firstSunday - 1) / 7) + 2;
};

Date.prototype.getGlobalWeekNumber = function () {
  var firstMonday = 345600000;  // 345600000 = 4 дня
  return Math.floor((this.getTime() + firstMonday) / (604800000)) + 1;  // 604800000 = 1 неделя
};

Date.prototype.getGlobalMonthNumber = function () {
  return ( this.getFullYear() - 1970 ) * 12 + this.getMonth() + 1;
};

/*
 * вернет порядковый номер употребления дня недели в меяце
 *
 * пример: если число приходится на третий вториник в месяце, вернет 3
 */
Date.prototype.getWeekDayNumberInMounth = function () {
  return Math.ceil(this.getDate() / 7);
};

var monthDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

Date.prototype.getWeekQuantity = function () {
  var tempDate = new Date(this);
  tempDate.setDate(monthDays[ this.getMonth() ]);
  return tempDate.getWeekInMonth();
};

Date.prototype.inDay = function (date) {
  return this.getFullYear() == date.getFullYear() && this.getMonth() == date.getMonth() && this.getDate() == date.getDate();
};

/*
 * функция для задания дня недели
 */
Date.prototype.setDay = function (day) {
  this.setDate(this.getDate() - (this.getDay() + 6) % 7);
};

/*
 * вернет число первого дня недели в этом месяце
 * принимает день искомый день недели [0..6]
 */
Date.prototype.getDateOfFirstWeekDay = function (weekDay) {
  var tempDate = new Date(this);
  tempDate.setDate(1);
  var day = tempDate.getDay();
  return (weekDay - day + 8) % 7;
};

Date.prototype.setDateOfFirstWeekDay = function (weekDay) {
  this.setDate(this.getDateOfFirstWeekDay(weekDay));
};

Date.prototype.getDateOfWeekdayAtWeek = function (weekDay, weekNumber) {
  var dateOfFirstWeekDay = this.getDateOfFirstWeekDay(weekDay);
  var tempDate = new Date(this);
  tempDate.setDate(dateOfFirstWeekDay);
  var tdWeekNumber = tempDate.getWeekInMonth();
  return tempDate.getDate() + (weekNumber - tdWeekNumber) * 7;
};

Date.prototype.setDateOfWeekdayAtWeek = function (weekDay, weekNumber) {
  this.setDate(this.getDateOfWeekdayAtWeek(weekDay, weekNumber));
};

Date.prototype.inMonth = function (date) {
  return this.getFullYear() == date.getFullYear() && this.getMonth() == date.getMonth();
};

var preventSelectionFlag = false;

function removeSelection () {
  if( preventSelectionFlag ) {
    return;
  }
  if (window.getSelection) {
    window.getSelection().removeAllRanges();
  } else if (document.selection && document.selection.empty) {
    document.selection.empty();
  }
}

function preventSelection(element){
  $(element)
    .mousemove( removeSelection )
    .mouseup( removeSelection )
    .mousedown( function ( event ) {
      var sender = event.target || event.srcElement;
      preventSelectionFlag = /input|textarea/i.test( sender.tagName );
  }).keydown( function ( event ) {
      var sender = event.target || event.srcElement;
      preventSelectionFlag = /input|textarea/i.test( sender.tagName );
      if ( !preventSelectionFlag ){
        removeSelection();
      }
    });
  element.onselectstart = function (){ return false };
}

function unpreventSelection ( element ) {
  $(element)
    .unbind('mousemove', removeSelection)
    .unbind('mouseup',   removeSelection);
  element.onselectstart = null;
  preventSelectionFlag = false;
}

function uploadProgressBar ( form ) {
  $("#processDescription").text( l10n.zCommon.fileUploadMessage );
  $("#uploadFile").hide();
  $('#uploadProgress').show();

  /*var uuid = "";
  if (/chrome/i.test(window.navigator.userAgent) ||
      ($.browser.mozilla && (parseFloat($.browser.version) < 1.9))) {
    return;
  }
  $("#progress").show();
  $("#progressbar").width(0);

  for (var i = 0; i < 32; i++) {
    uuid += Math.floor(Math.random() * 16).toString(16);
  }
  form.action += "?X-Progress-ID=" + uuid;
  var interval = setInterval( function () {
    $.ajax({
      type: "GET",
      url: "/uploadprogress",
      dataType: "json",
      beforeSend : function(req) {
        req.setRequestHeader("X-Progress-ID", uuid);
      },
      success: function(upload) {
        if (upload.state == 'done' || upload.state == 'uploading')
          $("#progressbar").stop().animate( {width : 500 * upload.received / upload.size + "px" }, 500 );
        if (upload.state == 'done' || upload.received == upload.size) {
          clearTimeout(interval);
          $("#processDescription").text("Подождите, идет обработка файла")
        }
      },
      complete: function ( req ) {}
    });
  }, 500 );*/
}

var Z = {
  setMainEmail : function (url, obj, type) {
    $.post(
    url,
    {}, function (data) {
      if (data.errorId) {
        popup(data.message, POPUP_ERROR);
      } else {
        switch (type) {
          case "edit":
            $(".baseOpt").hide();
            $(".confirmedOpt").show();
            $(obj).parent().parent().parent()
              .find(".baseOpt").show().end()
              .find(".confirmedOpt").hide();
            break;

          case "view":
            $(".confirmedOpt").show();
            $(obj).parent().parent().hide();
            var allEmailBlock = $(obj).parent().parent().parent().parent();
            allEmailBlock.find("span").css({paddingBottom: 0, fontWeight: "normal"});
            allEmailBlock.find(".mainEmail").hide();
            var nowEmailBlock = $(obj).parent().parent().parent();
            nowEmailBlock.find("span").css({paddingBottom: 5, fontWeight: "bolder"});
            nowEmailBlock.find(".mainEmail").show();
            allEmailBlock.prepend(nowEmailBlock);
            break;
        }
        var email = /([^\/])+$/.exec(url);
        if (email == null) return;
        //email = email[0];
        popup(data.message);
        //popup("Вы изменили основной Email. Ваш новый логин "+email);
      }
    }, "json"
            );
  },

  blocksSort : function (cl, classDown, classUp, sortToStart) {

    var blocksQueue;
    var blocksSort = $("." + cl);
    sortToStart = (sortToStart == undefined) ? true : sortToStart;

    var sort = function () {
      blocksQueue.reverse();
      for (var b in blocksQueue) {
        parent.prepend($("#" + blocksQueue[b] + "." + cl));
      }
    };

    var writeCookie = function () {
      blocksSort = $("." + cl);
      var bs = [];
      blocksSort.each(function () {
        bs.push($(this).attr('id'))
      });
      Cookie.create("blocksQueue", bs.join("|"), 365);
    };

    var updateManageElements = function () {
      $("." + classUp + ", ." + classDown).show();
      $("." + classUp + ":first, ." + classDown + ":last").hide();
    };

    var parent = blocksSort.parent();
    blocksQueue = Cookie.read("blocksQueue");
    if (blocksQueue == null || !sortToStart) writeCookie();
    else  {
      blocksQueue = blocksQueue.split("|");
      sort();
    }
    updateManageElements();

    blocksSort.each(function () {
      var self = this;
      $(this).find("."+classUp).click(function () {
        $(self).insertBefore($(self).prev());
        writeCookie();
        updateManageElements();
      });
      $(this).find("."+classDown).click(function () {
        $(self).insertAfter($(self).next());
        writeCookie();
        updateManageElements();
      });
    });

   $("." + classUp + ", ." + classDown).hover(
      function () { $(this).addClass("hover"); },
      function () { $(this).removeClass("hover"); }
    );
  },

  cityAutoComlete : function ( url, cityInput, cityIdInput, counrySelect ) {
    var $cityInput = $( cityInput );
    var $cityIdInput = $( cityIdInput );
    var $counrySelect = $( counrySelect );
    if ($cityInput.length > 0 ){
      $cityInput[0].oldValue = $cityInput.val();
      $cityInput.bind( 'keyup', function (e) {
        if( this.oldValue != this.value && e.keyCode != 13 && e.keyCode != 9 ) {
          $cityIdInput.val('').change();
        }
        this.oldValue = this.value;
      }).autocomplete( url, {
        selectFirst   : true,
        mustMatch     : true,
        autoFill      : false,
        matchContains : true,
        minChars      : 2,
        max           : 25,
        scrollHeight  : 80,
        extraParams   : {
          country: function() { return $counrySelect.val(); }
        },
        formatItem: function( data, i, total ) {
          if( total == 1 && $cityInput.val() == data.title ) {
            $cityIdInput.val( data.id ).change();
          }
          return data ? data.title : false;
        },
        parse : function( data ) {
          var d = eval( data );
          var result = [];
          for( var i = 0; i < d.length - 1; i++)  {
            result[i] = {
              data  : d[i],
              result: d[i].title,
              value : new String( d[i].title )
            };
          }
          return result;
        }
      }).result( function( event, data ) {
        if( data ) {
          $cityIdInput.val( data.id ).change();
        }
      }).bind( 'blur', function () {
        $cityInput.search();
      });
    }

    if($counrySelect.length>0){
      $counrySelect.change( function() {
        $cityInput.val('')[0].oldValue = '';
        $cityIdInput.val('').change();
      });
    }
  },

  loadIndexInfo: function( url, indexInput, cityInput, citiesSelect, cityIdInput, countrySelect ) {
    function toggleView( manyCities ) {
      $citiesSelect.toggle( manyCities );
      $cityInput.toggle( !manyCities );
      return manyCities;
    }

    var $indexInput = $( indexInput );
    if ($indexInput.length == 0){return;}
    if( $indexInput.val() == 0 ) {
      $indexInput.val('');
    }
    var $cityInput = $( cityInput );
    var $citiesSelect = $( citiesSelect );
    var $cityIdInput = $( cityIdInput );
    var $countrySelect = $( countrySelect );

    $countrySelect.change( function() {
      $indexInput.val('')[0].oldValue = '';
      prevViewWasManyCities = toggleView( false );
    });

    var prevViewWasManyCities = false;
    $citiesSelect.change( function() {
      $cityInput.val( $citiesSelect[0].options[$citiesSelect[0].selectedIndex].text );
      $cityIdInput.val( $citiesSelect.val() );
    });

    $indexInput[0].oldValue = $indexInput.val();
    $indexInput.bind( 'keyup', function() {
      toggleView( false );
    }).bind( 'blur', function() {
      var indexNode = this;
      var val = $indexInput.val();
      if( val == this.oldValue ) {
        toggleView( prevViewWasManyCities );
        return false;
      }
      this.oldValue = val;
      if( val.length <= 4 ) {
        prevViewWasManyCities = false;
        return false;
      }
      $.get( url, {
        id: val,
        country: $countrySelect.val()
      }, function( data, status, request) {
        if( !(data && data.cities) ) {
          return false;
        }
        var cities = data.cities;
        if( cities[cities.length-1] === false ) {
          cities = cities.slice(0, -1);
        }
        if( cities.length == 1 ) {
          $cityIdInput.val( cities[0].id );
          $cityInput.val( cities[0].title );
          prevViewWasManyCities = toggleView( false );
        } else {
          $citiesSelect.empty();
          var selectedIndex = 0;
          for( var i = 0; i < cities.length; i++ ) {
            var newOption = $('<option/>').val( cities[i].id ).text( cities[i].title );
            if( cities[i].id == $cityIdInput.val() ) {
              selectedIndex = i;
            }
            $citiesSelect.append( newOption );
          }
          $citiesSelect[0].selectedIndex = selectedIndex;
          $citiesSelect.change();
          prevViewWasManyCities = toggleView( true );
        }
      }, 'json' );
    });
  },

  countryAutoComlete : function ( url, inputId, hiddenId ) {
    $(inputId).bind( 'keyup', function (e) {
      this.oldValue = this.oldValue || this.value;
      if( this.oldValue != this.value && e.keyCode != 13 && e.keyCode != 9 ) {
        $(hiddenId).val('').change();
      }
      this.oldValue = this.value;
    });

    $(inputId).autocomplete(url, {
      selectFirst   : true,
      mustMatch     : true,
      autoFill      : false,
      matchContains: true,
      minChars      : 2,
      max           : 25,
      scrollHeight  : 80,
      formatItem: function( data, i, total ) {
        if ( total == 1 && $(inputId).val() == data.title )  {
          $(hiddenId).val(data.code).change();
        }
        if (data) {
          return data.title;
        } else{
          return false;
        }
      },
      parse : function( data ) {
        var d = eval( data );
        var result = [];
        for (var i = 0; i < d.length - 1; i++) {
          result[i] = {
            'data'  : d[i],
            'result': d[i].title,
            'value' : new String(d[i].title)
          };
        }
        return result;
      }
    })
    .result( function ( event, data ) {
      if( data ) {
        $(hiddenId).val(data.code).change();
      }
    });
  },

  autoCompleteByArray : function ( inputId, hiddenId, suggestArray ) {
    $( inputId ).bind( 'keypress', function (e) {
        $( hiddenId ).val('');
    });

    $(inputId).autocomplete( suggestArray, {
      selectFirst   : true,
      mustMatch     : true,
      autoFill      : false,
      matchContains: true,
      max           : 25,
      scrollHeight  : 80,

      formatItem: function( data, i, max ) {
        return data.title;
      },
      formatMatch: function( data, i, max ) {
        return data.title;
      },
      formatResult: function( data ) {
        return data.title;
      }
    }).result( function ( event, data ) {
      if( data ) {
        $( hiddenId ).val( data.id );
      }
    });

    $(inputId).bind( 'blur', function (e) {
        $(this).search();
    });
  },

  addAuthorToFavorites : function (url, reload) {
    reload = reload || false;
    var numAuthors;
    var authros = [];
    var authorsCheckboxes = $("[id^=authorCheckbox]");//$(".all_authors li input:checked");

    if (!( numAuthors = authorsCheckboxes.length)) return popup( l10n.zCommon.noAuthorsError, POPUP_ERROR );
    var countAuthor = 0;
    authorsCheckboxes.each( function () {
      this.checked = false;
      authros[countAuthor] = $(this).val();
      countAuthor++;
    });
    var replacedurl = url;//url.replace("0", this.value);
    $.get(replacedurl, {author : authros}, function () {
      if (countAuthor == numAuthors && reload) window.location.reload(); }
    );
    popup( l10n.zCommon.authorsAdded );
  },

  removeFavoriteAuthor : function ( url, id ) {
    $.post(
      url, {},
      function () {
        //$("#authorBookmark"+id).remove();
        window.location.reload();
      }
    );
  },

  removeFavoriteRecord : function ( url, id ) {
    $.post(
      url, {},
      function () {
        window.location.reload();
      }
    );
  }
};