/*
Модуль для работы с тегами (клиентская часть). 
Автор: Vitaly Grinko - perlaws@bitbybit.ru

*/

function tags() {}
tags.activeType = isset(essence_type) ? essence_type : 0;
tags.cloud = function() {}

$(document).ready(function() {
  tags.cloud.build();
  tags.cloud.process();
});

//////////////////////////////
/*         Класс Tags       */
//////////////////////////////
//Выводим теги для редактирования в контенте
tags.showTags = function(arrTags, strPath, glue, idEssence, type) {
  var sizeTags = arrTags.length;
  if(!sizeTags)
    return false;
  if (!type) type = null;
  var str = '<ul class="new_tags" id="new_tags_id_essence_'+idEssence+'"><li>Теги:</li>';
  for (var i = 1; i <= sizeTags; i++) {
    var arrTag = arrTags[i - 1];
      str += '<li><a href="' + strPath + 'tag/' + arrTag['tag_name'] + '/' + type + '">' + arrTag['tag_name'] + '</a>';
      if (!arrTag['deleted_status']) {
        str += '<a href="#" title="Удалить тег" class="removeTag" onclick="tags.askToRemoveTag(this, ' + idEssence + ', ' + type + ', \'' + arrTag['tag_name'] + '\');return false;"><img src="' + W_IMAGES + 'background/bg_new_tags.gif"></a>';
      }
      if (i != sizeTags)
        str += glue;
      str += "</li>";
  }
    str += '<li class="add_tag"><a title="Добавить тег" href="#TB_inline?height=80&amp;width=300&amp;inlineId=addTagForm'+idEssence+'" title="" class="thickbox" onclick="tags.initAddTag('+idEssence+');return false;">Добавить тег</a>&nbsp;</li>';
  str += '</ul>';
  return str;
}

tags.showTagsStatic = function(arrTags, glue, type) {
  var sizeTags = arrTags.length;
  if (!type) type = null;
  if(!sizeTags)
    return false;
    strPath = W_ABSPATH;
  var str = '<ul class="all_tags">';
  for (var i = 1; i <= sizeTags; i++) {
    var arrTag = arrTags[i - 1];
      str += '<li><a href="' + strPath + 'tag/' + arrTag + '/' + type + '">' + arrTag + '</a>';
      if (i != sizeTags)
        str += glue;
      str += "</li>";
  }
  str += '</ul>';
  return str;
}


//Запрос данным пользователем на удаление тега
tags.askToRemoveTag = function(objLink, idEssence, type, tagName) {
//  answers.addProgressStatus("#answers");
  $.ajax ({
    type: "POST",
		url: W_AJAX + "tags/askToDeleteTag.php",
		data: 'tagName=' + tagName + '&idEssence=' + idEssence + '&type=' + type,
		success: function (responseText) {
		  var arrResponse = (navigator.userAgent.indexOf ("Opera") != -1) ? eval('(' + responseText + ')') : JSON.parse(responseText);
      if (arrResponse['status'] == 1) { 
        alert('Ваш запрос на удаление тега успешно отправлен. \nПосле 3-х таких запросов тег будет удалён. \nСпасибо!');
        $(objLink).remove();
        $(".tags").html('Теги: [' + tags.showTags(arrResponse['tags'], W_ABSPATH, ', ', idEssence, type) + ']')
      } else if (arrResponse['status'] == 2) {
        alert('Ваш запрос на удаление тега убедил нас, что данный тег здесь является лишним. \nТег удалён. Спасибо!');
        $(objLink).parent().remove();
      }
      else {
        alert(arrResponse['error']);
      }
		}
  });
//  answers.removeProgressStatus();
}

//Запрос данным пользователем на удаление тега
tags.removeTagFromEssenceByAdmin = function(objLink, idEssence, type, tagName) {
//  answers.addProgressStatus("#answers");
  $.ajax ({
    type: "POST",
		url: W_AJAX + "tags/adminDeleteTag.php",
		data: 'tagName=' + tagName + '&idEssence=' + idEssence + '&type=' + type,
		success: function (responseText) {
		  var arrResponse = (navigator.userAgent.indexOf ("Opera") != -1) ? eval('(' + responseText + ')') : JSON.parse(responseText);
      if (arrResponse['status']) { 
        alert('Тег удалён из сущности');
        $(objLink).parent().parent().remove(); //удаляем строчку (tr)
      } else alert(arrResponse['error']);
		}
  });
//  answers.removeProgressStatus();
}

//Действия, выполнемые перед отображением формы с добавлением тегов
tags.initAddTag = function (idEssence) {
  $("#tagsToAdd").attr('value', '');
  
}

tags.submitAddAJAX = function(idEssence) {
  var addTags = $("#addTagFormContent"+idEssence+">form input[@name='tag[name]']").val();
  var idEssence = $("#addTagFormContent"+idEssence+">form input[@name='tag[idEssence]']").val();
  var essenceTypeNum = $("#addTagFormContent"+idEssence+">form input[@name='tag[essenceType]']").val();
//  alert();
  $.ajax ({
    type: "POST",
		url: W_AJAX + "tags/addTag.php",
		data: 'tag=' + addTags + '&idEssence=' + idEssence + '&essenceType=' + essenceTypeNum,
		success: function (responseText) {
      var arrResponse = (navigator.userAgent.indexOf ("Opera") != -1) ? eval('(' + responseText + ')') : JSON.parse(responseText);
      if (arrResponse['status']) {
        //Изменяем теги
        $('ul#new_tags_id_essence_'+idEssence).replaceWith(tags.showTags(arrResponse['tags'], W_ABSPATH, ', ', idEssence, essenceTypeNum));
        //заново инициализируем окошки
        thickBox_init();
      }
      else {
        alert(arrResponse['error']);
      }
		}
  });
  tb_remove(); //закрываем окошко
}

//кол-во тегов по уровням
tags.arrCounts = [0,0,0,0,0,0,0,0,0,0];

//получаем класс для ссылки с тегом по проценту употребимости в данной группе тегов
tags.parseCount = function(percent) {
    if ((percent >= 0) && (percent <=10))
      tags.arrCounts[0]++;
    else if ((percent > 10) && (percent <=20))
      tags.arrCounts[1]++;
    else if ((percent > 20) && (percent <=30))
      tags.arrCounts[2]++;
    else if ((percent > 30) && (percent <=40))
      tags.arrCounts[3]++;
    else if ((percent > 40) && (percent <=50))
      tags.arrCounts[4]++;
    else if ((percent > 50) && (percent <=60))
      tags.arrCounts[5]++;
    else if ((percent > 60) && (percent <=70))
      tags.arrCounts[6]++;
    else if ((percent > 70) && (percent <=80))
      tags.arrCounts[7]++;
    else if ((percent > 80) && (percent <=90))
      tags.arrCounts[8]++;
    else if ((percent > 90) && (percent <=100))
      tags.arrCounts[9]++;
    else {
      return percent;
    }  
}

tags.getClassName = function (percent, notEmptyCnts) {
    var nLevel = 0;
    if ((percent >= 0) && (percent <=10))
      nLevel = 1;
    else if ((percent > 10) && (percent <=20))
      nLevel = 2;
    else if ((percent > 20) && (percent <=30))
      nLevel = 3;
    else if ((percent > 30) && (percent <=40))
      nLevel = 4;
    else if ((percent > 40) && (percent <=50))
      nLevel = 5;
    else if ((percent > 50) && (percent <=60))
      nLevel = 6;
    else if ((percent > 60) && (percent <=70))
      nLevel = 7;
    else if ((percent > 70) && (percent <=80))
      nLevel = 8;
    else if ((percent > 80) && (percent <=90))
      nLevel = 9;
    else if ((percent > 90) && (percent <=100))
      nLevel = 10;         
    else {
      nLevel = 0;
    }
    if (nLevel) {
      if (nLevel > notEmptyCnts)
        nLevel -= (10 - notEmptyCnts);
    }
    return 'level-size' + nLevel;
}

//////////////////////////////
/*     Класс Tags.Cloud     */
//////////////////////////////
tags.cloud.build = function() {
  $("<div class='box_menu'></div>").appendTo("#commonCloud");
  tags.cloud.addEssenceTypesBookmarks();
  $("<div class='box_blue_tags'></div>").appendTo("#commonCloud");
  $("<div class='cloud_tag'></div>").appendTo(".box_blue_tags");
  $("<div class='cloud_tag_left_bottom'></div>" +
    "<div class='cloud_tag_right_bottom'></div>" +
    "<a href='#' onclick=\"minimizeBox('box_cloud_tag'); setUserVariable('tagsCloudMinimizedFlag', 1); return false;\" class='svernut'>svernut</a>").appendTo(".cloud_tag");
  $("<div class='box_for_cloud'></div>").appendTo(".cloud_tag");
  tags.cloud.buildAlphabetArea();
  $("<div id='tex_tag'></div>").appendTo(".box_for_cloud");
  tags.cloud.activateTypeGroup(tags.activeType);
}

tags.cloud.buildAlphabetArea = function() {
  $("<div class='cloud_bottom'></div>").prependTo(".box_for_cloud");
  $("<div class='box_boottom_menu'></div>").appendTo(".cloud_bottom");
  $("<div class='btn_form'></div>").appendTo(".cloud_bottom");
/*  $("<div id='alphabet'></div>").appendTo(".cloud_tag");
  $("<div id='cloud-img'></div>").appendTo(".cloud_tag");
  $("<div id='letters-groups'></div>").appendTo("#alphabet");
  $("#letters-groups").html("<div class='one'><div class='two'><div class='three'><div class='four' id='letters-groups-inner'></div></div></div></div>");*/
}

//Обработка событий
tags.cloud.process = function() {
  tags.cloud.listenLettersGroupsEvents();
  //Переход по разделам (закладкам) тегов (по типу сущности)
  $(".box_menu a").mouseover(function () {
      var thisNum = parseInt($(this).attr("typeNum"));
      //setTimeout("tags.cloud.activateTypeGroup(" + thisNum + ")", 500);
      eval("tags.cloud.activateTypeGroup(" + thisNum + ")");
      
  });
}

//Обработка щелчка по группе букв/цифр; обработка ввода символов (буквы/цифры)
tags.cloud.listenLettersGroupsEvents = function() {
  //удаляем все старые назначения событий
  $(".cloud_bottom a").unbind("click");
  $("#letter-enter").unbind("keyup");
  $("#letter-enter").unbind("keypress");
  //назначаем новые события
  $(".cloud_bottom a").bind("click", function () {
    var curGroupType = $(this).attr('groupType');
    var curGroupNum = $(this).attr("groupNum");
    tags.cloud.activateGroup(curGroupType, curGroupNum);
  });
  //Обработка ввода буквы/цифры
  var goodSymbols = "*0123456789abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщыэюя";
  $("#letter-enter").bind("keypress", function () { 
    $(this).attr("value", "");
  });
  $("#letter-enter").bind("keyup", function (e) {
//    alert(e.which);
    if ( (e.which != 8) && (e.which != 46) && (e.which != 0) && /*start add symb:б,ё,ж,х,э,ю*/(e.which != 188) && (e.which != 192) && 
         (e.which != 59) && (e.which != 219) &&  (e.which != 222) && (e.which != 190)/*end add symb*/ && 
         ((e.which < 65) || (e.which > 65 + 25)) && ((e.which < 48) || (e.which > 57)) && ((e.which < 97) || (e.which > 97 + 25)) )
      return false;
//    alert(1);
    var letter = $(this).val(); 
    if (goodSymbols.indexOf(letter) < 0)
      $(this).attr("value", "");
    var gottenGroup = tags.cloud.getGroupByLetter($(this).val());
    //alert(gottenGroup.groupNum);
    tags.cloud.activateGroup(gottenGroup.groupType, gottenGroup.groupNum);
//    alert(1);
  });
}

//Добавляем закладки по типам сущностей
tags.cloud.addEssenceTypesBookmarks = function() {
  var strTypes = "<li><a class='none' href='#' typeNum='0'><span class='top'></span> <span class='bootom'></span>Все разделы</a></li>";
  $(allEssences).each(function (i) {
    strTypes += "<li><a class='none' href='" + W_ABSPATH + allEssences[i][1] + "' typeNum='" + allEssences[i][0] +"'><span class='top'></span> <span class='bootom'></span>" + 
		            "" + allEssences[i][2] + "</a></li>";
//    alert(strTypes);
//    strTypes += "<a href='#' typeNum='" + allEssences[i][0] +"'>" + allEssences[i][2] + "</a> ";
  });
  $(".box_menu").html("<ul class='menu_tag'>" + strTypes + "</ul>");
}

//Активируем выбранную закладку (по типам сущностей)
tags.cloud.activateTypeGroup = function(curTypeNum) {
  $(".box_menu li.selected").attr("class", "");
  $(".box_menu a[typeNum='" + curTypeNum + "']").parent().attr("class", "selected");
  //$(".cloud_bottom").hide("slow");
//  $("#commonCloud .box_blue_tags").empty();
//  $(".cloud_bottom").replaceWith("<div class='cloud_bottom_disabled'></div>");
  if ((curTypeNum == 0) || !getEssenceTypeAdressById(curTypeNum)) { //Если все теги
    $(".cloud_bottom").remove();
    tags.cloud.buildAlphabetArea();
    tags.cloud.writeLettersGroups();
    tags.cloud.activateGroup("all", 0);
    tags.cloud.listenLettersGroupsEvents();
  }
  else {  //Если теги по типам сущностей
//    alert($(eval("allTags." + getEssenceTypeNameById(curTypeNum) + "[0]")).length);
    $(".cloud_bottom").remove();
    tags.cloud.buildAlphabetArea();
    tags.cloud.writeLettersGroups();
    tags.cloud.disableLettersGroups();
    tags.cloud.writeTags(eval("allTags." + getEssenceTypeAdressById(curTypeNum) + "[0]"));
  }
}

//Отключаем функционал выбора групп символов для типов сущностей
tags.cloud.disableLettersGroups = function() {
  $(".cloud_bottom").addClass("disabled");
  //удаляем все старые назначения событий
  $(".cloud_bottom a").unbind("click");
  $("#letter-enter").unbind("keyup");
  $("#letter-enter").unbind("keypress"); 
  $("#letter-enter").attr("value", "");
  $("#letter-enter").attr("disabled", "disabled");
}

//Получаем информацию о группе символов по символу
tags.cloud.getGroupByLetter = function(letter) {
  letter = letter.toLowerCase();
  if (letter.length > 0) {
    var lettersGroups = {
      "num": ["0123456789"],
      "en": ["abcdefg", "hij", "klm", "nop", "qrst", "uvwxyz"],
      "all_en": ["abcdefghijklmnopqrstuvwxyz"],
      "ru": ["абв", "гдеёж", "зийк", "лмн", "оп", "рс", "туф", "хцч", "шщыэюя"],
      "all_ru": ["абвгдеёжзийклмнопрстуфхцчшщыэюя"]
    };
    if (letter == '*')
      return {"groupType": "all", "groupNum": 0};
    if (lettersGroups.num[0].indexOf(letter) >= 0) {
      return {"groupType": "num", "groupNum": 0};
    }
    for (var i = 0; i < lettersGroups.en.length; i++)
      if (lettersGroups.en[i].indexOf(letter) >= 0) {
        return {"groupType": "en", "groupNum": i};
      }
    for (var i = 0; i < lettersGroups.ru.length; i++)
      if (lettersGroups.ru[i].indexOf(letter) >= 0) {
        return {"groupType": "ru", "groupNum": i};
      }
  }
  return {"groupType": "all", "groupNum": 0};
}

//Выводим теги по выбранной группе символов, активируем текущую группу символов
tags.cloud.activateGroup = function(curGroupType, curGroupNum) {
  var curLink = $(".box_boottom_menu a[groupNum='" + curGroupNum + "'][groupType='" + curGroupType + "']");
//  $("#letter-enter").attr("value", $(curLink).text());
  $(".box_boottom_menu a.active").removeClass("active");
  $(curLink).addClass("active");
  //$("#commonCloud .box_blue_tags").empty();
  tags.cloud.writeTags(eval("allTags." + curGroupType + "[" + curGroupNum + "]"));
}

//Выводим теги соответствующей группы
tags.cloud.writeTags = function(arrCurrTags, essenceType) {
  if (isset(arrCurrTags)) {
    var curType = $(".box_menu li.selected a").attr("typenum");
    curType = (curType == 0) ? '' : curType;
    var strTags = '';
    var percent = 0;
    tags.arrCounts = [0,0,0,0,0,0,0,0,0,0]; //обнуляем значения счётчиков
    var notEmptyCnts = 0;
    for (var i = 0; i < arrCurrTags.length; i++) {
      percent = arrCurrTags[i].amount * 100;
      tags.parseCount(percent);
    }
    for (var i = 0; i < tags.arrCounts.length; i++)
      if (tags.arrCounts[i]) notEmptyCnts++;
/*    alert(notEmptyCnts);*/
    for (var i = 0; i < arrCurrTags.length; i++) {
      //if ()
//      strTags += "<a href='" + W_ABSPATH + "tag/" + arrCurrTags[i].ID_tag + "/" + curType + "' class='" + getClassName(arrCurrTags[i].amount * 100) + "'>" + arrCurrTags[i].tag_name + "</a> ";
      percent = arrCurrTags[i].amount * 100;
      var isChromeOrOperaOrSafari = (navigator.userAgent.indexOf ("Chrome") != -1) || (navigator.userAgent.indexOf ("Opera") != -1) || (navigator.userAgent.indexOf ("Safari") != -1);
      if (isChromeOrOperaOrSafari)
        strTags += "<li><a href='" + W_ABSPATH + "tag/" + string_replace(string_replace(arrCurrTags[i].tag_name, "#", "%23"), "+", "%2B") + "/" + curType + "' class='" + tags.getClassName(percent, notEmptyCnts) + "'>" + arrCurrTags[i].tag_name + "</a></li>";
      else
      strTags += "<a href='" + W_ABSPATH + "tag/" + string_replace(string_replace(arrCurrTags[i].tag_name, "#", "%23"), "+", "%2B") + "/" + curType + "' class='" + tags.getClassName(percent, notEmptyCnts) + "'>" + string_replace(arrCurrTags[i].tag_name, " ", "&nbsp;") + "</a>&emsp;";
      //alert(arrCurrTags[i].amount);
    }
    if (isChromeOrOperaOrSafari)
      $("#tex_tag").html("<ul>" + strTags + "</ul>");
    else {
      $("#tex_tag").html(strTags).addClass("regBrowser");
    }
  }
}

//Выводим группы букв(letters)/цифр
tags.cloud.writeLettersGroups = function() {
  tags.cloud.writeAlphabetRu();
  tags.cloud.writeAlphabetEn();
  tags.cloud.writeNumbersAndAllRu();
 
  tags.cloud.writeAllGroup();
  //Добавлем поле для ввода
  $("<div class='all_form'><input type='text' value='a' id='letter-enter' maxlength='1' /></div>").appendTo(".btn_form");
  
}

//Выводим группу цифр
tags.cloud.writeAllGroup = function() {
  $("<a href='#' groupType='all' groupNum='0' class='all_letter' onclick='return false;'>ВСЕ БУКВЫ</a>").appendTo(".btn_form");
}

//Выводим группу цифр
tags.cloud.writeNumbersAndAllRu = function() {
  var groupObj = $("<ul class='russian'></ul>").appendTo(".box_boottom_menu");
  //Дополнительна кнопка "А-Я"
  $("<li><a href='#' groupType='all_ru' groupNum='0' onclick='return false;'>А-Я</a></li>").appendTo(groupObj);
  
  $("<li><a href='#' groupType='num' groupNum='0' onclick='return false;'>0-9</a></li>").appendTo(groupObj);

}

//Выводим группы букв английского алфавита
tags.cloud.writeAlphabetEn = function() {
  var groupObj = $("<ul></ul>").appendTo(".box_boottom_menu");
  var en = new Array('a-g', 'h-j', 'k-m', 'n-p', 'q-t', 'u-z');
  $(allTags.en).each(function (i) {
    $("<li><a href='#' groupType='en' groupNum='" + i + "' onclick='return false;'>" + en[i] + "</a></li>").appendTo(groupObj);
  });
  //Дополнительна кнопка "А-Я"
  $("<li><a href='#' groupType='all_en' groupNum='0' onclick='return false;'>A-Z</a></li>").appendTo(groupObj);
}

//Выводим группы букв русского алфавита
tags.cloud.writeAlphabetRu = function() {
  var russianGroupObj = $("<ul class='russian'></ul>").appendTo(".box_boottom_menu");
  var ru = new Array('а-в', 'г-ж', 'з-к', 'л-н', 'о-п', 'р-с', 'т-ф', 'х-ч', 'ш-я');
  $(allTags.ru).each(function (i) {
    $("<li><a href='#' groupType='ru' groupNum='" + i + "' onclick='return false;'>" + ru[i] + "</a></li>").appendTo(russianGroupObj);
  });
  $(russianGroupObj).find("li:even").addClass("selected");
}
