/**
 * Проект:       TellMeDay.com
 * Файл:         $HeadURL: https://svn.gvp.gov.ru/svn/tellmeday/trunk/templates/js/functions_v1.js $
 * 
 * Назначение:   js функции проекта
 *
 * @автор        Мамонтов Андрей <andrvm@andrvm.ru>
 * @copyright    2008 Andrey Mamontov (andrvm)
 * 
 * @date		 $Date: 2010-09-16 23:17:48 +0400 (Чтв, 16 Сен 2010) $
 * @revision	 $Revision: 170 $
 * @changeby	 $Author: andrvm $
 * 
 */

/**
 * Универсальная ajax-функция
 *
 * @param value      - обрабатываемое значение(я) (String || Integer || Array)  
 * @param form       - индентификатор формы, для обрабтки формы (form.id)
 * @param r          - элемент (ы), в который необходимо вернуть результат (String || Array)
 * @param param      - имя вызываемого скрипта с параметрами вида script:param или script::param  (String)
 *
 */
function u_load(value, form, r, param){

     var req = new JsHttpRequest();
     
     req.onreadystatechange = function()
     {
          if (req.readyState == 4) {
             // показываем, что обработка в процессе	 
		     $('ajax_loader').hide();
		     $$('.mask').each(function(item){$(item).removeClassName('ajax');});
		     // если, пришла информация или ошибки	
		     if (req.responseJS.inf || req.responseJS.err) {
		     	if ($('error')) $('error').style.display = 'none';
		     	if ($('info'))  $('info').style.display  = 'none';
		     	document.getElementById('inf').style.display = 'block';
		        if (req.responseJS.inf) document.getElementById('inf').innerHTML = "<font style='color:green'>" + req.responseJS.inf + "</font>";
		        if (req.responseJS.err) document.getElementById('inf').innerHTML = "<font style='color:#ff5500'>" + req.responseJS.err + "</font>";
		        $('inf').scrollTo();
		     }
		     //elseif()
             else  document.getElementById('inf').style.display = 'none';
           
             // если ошибок нет, то выводим контент
             if (!req.responseJS.err) {
                // если есть данные для возврата (или массив данных)
		       	if (typeof(req.responseJS.data) == 'object' & typeof(r) == 'object') {
					 for (var k = 0; k<req.responseJS.data.length; k++) {
	   		             if (document.getElementById(r[k]) != null)
	   		              		document.getElementById(r[k]).innerHTML = req.responseJS.data[k];
    		         }
				}
				else {
					if (r.length > 0 & document.getElementById(r) != null)
						 document.getElementById(r).innerHTML = req.responseJS.data;
				}
				
				// если есть наборы данных (для графиков)
				if (req.responseJS.Dataset == true) {
					// параметры вывода графиков
					grafconfig       = eval(req.responseJS.grafconfig);
					// для всех
		  			DatasetAllBar    = eval(req.responseJS.DatasetAllBar);
		  			DatasetAllPie    = eval(req.responseJS.DatasetAllPie);
		  			// гистограмма с раскладкой м/ж по всем
		  			BarDatasetMFAll  = eval(req.responseJS.BarDatasetMFAll);
		  			// гистограмма (мужчины и женщины)
		  			BarDatasetMF     = eval(req.responseJS.BarDatasetMF);
		  			// пирог (мужчины и женщины)	
		  			PieDatasetMF     = eval(req.responseJS.PieDatasetMF);
		  			// гистограмма (мужчины)	
		  			BarDatasetMale   = eval(req.responseJS.BarDatasetMale);
		  			// гистограмма (женщины)	
		  			BarDatasetFemale = eval(req.responseJS.BarDatasetFemale);
		  		    // пирог (мужчины)	
		  			PieDatasetMale   = eval(req.responseJS.PieDatasetMale);
		  			// пирог (женщины)	
		  			PieDatasetFemale = eval(req.responseJS.PieDatasetFemale);
		  			// пирог с раскладкой м/ж по всем
		  			PieDatasetMFAll  = eval(req.responseJS.PieDatasetMFAll);
		  			// оси 
		  			ticksbar = eval(req.responseJS.ticksbar);
		  			tickspie = eval(req.responseJS.tickspie);
		
		  			// отрисовка
		  			for (var i = 0; i<grafconfig.length; i++){
           			   render_ext(grafconfig[i], ticksbar, tickspie, i);
	   				};
				}
				// если обрабатывали форму, то обнуляем форму
				if (form) $(form).reset();
				// перенаправление
				if (req.responseJS.ref == 'self') {
					if (form) 
				       document.location.replace(document.location.href);
				    else 
				       location.replace(location.href.substr(0, location.href.length - 2));
				    
				}
				if (typeof(req.responseJS.ref) != 'undefined' & req.responseJS.ref != 'no' &
				    req.responseJS.ref != 'self')
				      location.replace(req.responseJS.ref); 
				// если есть выполняемый js код, то выполняем
				//alert(req.responseJS.code);
				if (req.responseJS.code) eval(req.responseJS.code);   
             }

         }
		 // если еще не пришел ответ
	     else {
	     	$('ajax_loader').show();
	     	$$('.mask').each(function(item){$(item).addClassName('ajax');});
	     }	
	}
 // отправка данных на сервер
 //req.caching = false;
 req.open(null, '/ajax.php?param=' + param, 'post');
 req.send( { q: value } );
}

/**
 * Универсальная ajax-функция (уменьшенная версия)
 *
 * @param value      - обрабатываемое значение(я) (String || Integer || Array)  
 * @param r          - элемент (ы), в который необходимо вернуть результат (String || Array)
 * @param param      - имя вызываемого скрипта с параметрами вида script:param или script::param  (String)
 * @param e			 - элемент, который вызывает функцию
 *
 */
function su_load(value, r, param, e){

     var req = new JsHttpRequest();
   
     req.onreadystatechange = function()
     {
          if (req.readyState == 4) {
            
		     if (req.responseJS.inf || req.responseJS.err) {
		     	if ($('error')) document.getElementById('error').style.display = 'none';
		     	if ($('info'))  document.getElementById('info').style.display = 'none';
		     	document.getElementById('inf').style.display='block';
		        if (req.responseJS.inf){
		        	$('inf').style.Color = 'green';
		        	$('inf').update(req.responseJS.inf);
		        }	 
		        if (req.responseJS.err){
	             	$('inf').style.Color = '#ff5500'
		        	$('inf').update(req.responseJS.err);
		        }	 
	
		        $('inf').scrollTo();
		     }
             else  document.getElementById('inf').style.display = 'none';
            
             // если ошибок нет, то выводим контент
             if (!req.responseJS.err){
            
                if(r)
                	document.getElementById(r).innerHTML = req.responseJS.data;
			 	
				// если есть выполняемый js код, то выполняем
				if (req.responseJS.code) eval(req.responseJS.code);   
             }
             //$(e).stopWaiting();
           }
         //else
        // $(e).startWaiting();
	}
 // отправка данных на сервер
 req.open(null, '/sajax.php?param=' + param, 'post');
 req.send( { q: value } );
}

// проверка года
function year_validate(y) {
  var reg = /^[0-9]{1,4}$/;
  //if (reg.test(y)==false) alert('Неправильный формат даты!');
  return reg.test(y); 
}

// выделение ячейки таблицы
function tableSelect(t1, t2, d) {

	var tr = $(t1).getElementsByTagName('tr');
	for (var k = 0; k < tr.length; k++) {
		if (k < tr.length - 1)
				$('n' + k).checked = false;
		tr[k].className = '';
	}
	$(t2).className = 'selected';
	$(d).checked    = 'checked';
}

/**
 *   Установка cookie
 *   @param	name    -  имя            (String)
 *   @param	value   -  значение       (String)
 *   @param	expires -  срок действия  (Date)
 *   @param	path    -  путь           (String)
 *   @param	domain  -  домен          (String)
 *   @param  secure  -  признак https (Boolean)
    
 *   Example:
 *   setCookie('CookieName', 'CookieValue', null, '/');
 */
function setCookie(name, value, expires, path, domain, secure){
	
	document.cookie = name + '=' + escape(value) +
	((expires) ? '; expires =' + expires.toUTCString() : '') +
	((path)    ? '; path =' + path : '') +
	((domain)  ? '; domain =' + domain : '') +
	((secure)  ? '; secure' : '');
	
}

/**
 *   Удаление cookie
 *   @param	name    -  имя   (String)
 *   @param	path    -  путь  (String)
 *   @param	domain  -  домен (String)
 *   
 *   Example:
 *   delCookie('CookieName');
 */
function delCookie(name, path, domain){
	
 if(getCookie(name)) {
 	document.cookie = name + '=' +
	((path)    ? '; path =' + path : '') +
	((domain)  ? '; domain =' + domain : '') +
	'; expires = Thu, 01-Jan-70 00:00:01 GMT';
 }
}

/**
 *   Получение cookie по его имени
 *   @param	name    -  имя  (String)
 *   
 *   Example:
 *   getCookie('CookieName');
 */

function getCookie(name) {
  var prefix = name + "=";
  var cookieStartIndex = document.cookie.indexOf(prefix);
  if (cookieStartIndex == -1)
         return null;
  var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
  if (cookieEndIndex == -1)
         cookieEndIndex = document.cookie.length;
  return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex));
}

// установка позиционирования (для прокрутки)
function setPosToScroll (elname) {
	setCookie('pos', elname, null, '/');
}

// прокрутка
function ScrollTo () {
	var el = getCookie('pos');
	($(el)) ? $(el).scrollTo() : delCookie('pos', '/');
}

// определение поддержки flash
function ar_flver(){
  
   var d, n = navigator, m, f = 'Shockwave Flash';
   
   if((m = n.mimeTypes) && (m = m["application/x-shockwave-flash"]) && m.enabledPlugin && (n = n.plugins) && n[f]){
	   d = n[f].description
   }
   else if (window.ActiveXObject){
	   try { 
		   d = (new ActiveXObject((f+'.'+f).replace(/ /g,''))).GetVariable('$version');
	   } catch (e){}
   } 
   return d ? d.replace(/\D+/,'').split(/\D+/) : [0,0];
}

/**
 * Показ информационной панели 
 * в случае недоступности flash, js или установки блядского IE6 
 * @param	l -  язык выводимых сообщений (String)           
 * @param	t -  тип панели  (String)
 */
function show_ipanel(l, t){
	
	var mess = divElement = spanElement = '';
	
	if(t == 'f'){
		switch(l){
			case 'ru':
				  mess = 'У Вас отсутствует поддержка флеш или Вы используете старую версию плагина, графики будут не доступны.'; break;
			case 'de':
				  mess = ''; break;
			case 'fr':
				  mess = ''; break;
			case 'es':
				  mess = ''; break;
			default:
				  mess = 'Flash support is not enabled or you flash plugin is old. Charts will are not be available!';
		}
    }
    if(t == 'j'){
		switch(l){
			case 'ru':
				  mess = 'Внимание! У Вас отключена поддержка JavaScript. Некоторые разделы сайта могут быть недоступны или не работать!'; break;
			case 'de':
				  mess = ''; break;
			case 'fr':
				  mess = ''; break;
			case 'es':
				  mess = ''; break;
			default:
				  mess = "Attention! JavaScript is not enabled. Some of the website's  sections will not be able to work.";
		}
    }
    
    if(t == 'i'){
		switch(l){
			case 'ru':
				  mess = 'Вы используете устаревший и небезопасный браузер! Дальнейшая корректная работа невозможна.'; break;
			case 'de':
				  mess = ''; break;
			case 'fr':
				  mess = ''; break;
			case 'es':
				  mess = ''; break;
			default:
				  mess = 'You are using an outdated and unsafe version of your internet browser! You will not be able to continue browsing the website correctly';
		}
    }
    
    spanElement = document.createElement('span');
	$(spanElement).addClassName('close_error');
	spanElement.onclick = function(){$('ipanel').hide();}; 
		
	divElement = document.createElement('div');
	divElement.setAttribute('id', 'ipanel');
	divElement.innerHTML = mess;
	divElement.appendChild(spanElement);

	divElement.appendChild(spanElement);
	divElement.appendChild(spanElement);
	
	document.body.appendChild(divElement);
	window.scrollTo(0,0);
	
}

// функция получения данных для отрисовки флэш графиков
// Open Flash Chart


/**
 *   Cоздание области рисования для Plotr
 *   @param	parent -  родитель              (DOM Element)           
 *   @param	id     -  ид                    (String)
 *   @param	wd     -  ширина                (String)
 *   @param	h      -  высота                (String)
 *   @param	ttl    -  заголовок для графика (String)
 *   @param  c     -  класс для заголовка   (String)
 */
function createCanvas(parent, id, wd, h, ttl, c){
	
   	// получаем родительский элемент
   	var pElement = $(parent);
  	// создаем div
    var divElement = document.createElement('div');
    // создаем canvas для рисования
    var cnv = document.createElement('canvas');
    // задаем уникальный id для canvas
    cnv.setAttribute('id', id);
     // задаем ширину области рисования
    cnv.setAttribute('width', wd);
    // задаем высоту области рисования
    cnv.setAttribute('height', h);
    // если установлен стиль, то назначаем стиль для  div
    if (typeof(ttl) != 'undefined') {
    	 var h_ = document.createElement('span');
    	 $(h_).addClassName(c);
    	 h_.innerHTML = ttl;
    	 divElement.appendChild(h_);
     }	 	 
    // 'прицепляем' canvas к div      	 
    divElement.appendChild(cnv);
    // 'прицепляем' div к родительскому элементу

    pElement.appendChild(divElement);

}

// замер времени на JS
function getMicrotime(){

	var t = new Date();
	return t.getTime();
	
}


/**
 * Переключатель (статический, контент уходит в статический блок)
 *
 * @param img     - элемент, который выполняет функцию переключателя  
 * @param param   - имя вызываемого скрипта с параметрами вида script:param или script::param  (String)
 * @param l 	  - язык показываемых собщений
 * @param t 	  - область переключений
 * @param r 	  - куда возвращаем элемент
 *
 */
function _toggle(img, param, l, t, r) {
	
	 var ajax = new JsHttpRequest();
	 // куда возвращаем результат
	 if(!r)
	 	var r = $(img).id.substr(0, $(img).id.lastIndexOf('_'));
	
	 // ид (для кеша)
	 var id = $(img).id.substr($(img).id.lastIndexOf('_') + 1, $(img).id.length);

	 // если реализовано на img
	 if(typeof(img.src) != 'undefined'){
	 	
	 	 // статус переключателя
	     var state = $(img).alt == '+' ? true : false;

	 	 // закрываем все открытые переключатели
	 	 $$('#' + t + ' img.toggle').each(function(item){
	 	 	item.setAttribute('alt', '+');
	 	 	item.setAttribute('src', '/templates/images/plus.png');
	 	 });
	 
 		 // смена атрибутов на текущем элементе
		 state ? $(img).setAttribute('alt', '-') : $(img).setAttribute('alt', '+');
	 	 state ? $(img).setAttribute('src', '/templates/images/minus.png') : $(img).setAttribute('src', '/templates/images/plus.png');
	 	 
	 	 // сообщения
		 if(state) {
	   		if (l == 'ru') $(img).setAttribute('title', 'Закрыть');
	   		if (l == 'en') $(img).setAttribute('title', 'Close');
	 	}
	 	else {
	   		if (l == 'ru') $(img).setAttribute('title', 'Раскрыть');
	   		if (l == 'en') $(img).setAttribute('title', 'Open');
	 	}  
	 }
	 // если на других элементах (через lang)
	 else if(typeof(img.lang) != 'undefined'){
	 	    // статус переключателя
	        var state = $(img).lang == '1' ? true : false;
	        
	        // закрываем все открытые переключатели
	 	    $$('#' + t + ' span.toggle').each(function(item){
	 	    	item.setAttribute('lang', '1');
	 	    });
	 		
	 		state ? $(img).setAttribute('lang', '0') : $(img).setAttribute('lang', '1');
	 	
	 }

	 // если задан param, то отсылаем на сервер
	 if(param){
	 	// если переключатель открывается, то выполняем код
	 	if(state){
	 	  if(!Cache.clubs[id]){
     	 		ajax.onreadystatechange = function(){
         			if (ajax.readyState == 4) {
               			if (!ajax.responseJS.err){
                 			// кэшируем
                 			Cache.clubs[id] = ajax.responseJS.data;
                			$(r).innerHTML  = ajax.responseJS.data;
                			// кэшируем и выполняем js code
                			if(ajax.responseJS.code){
                				
                			     Cache.clubs['js_'+id] = ajax.responseJS.code;	
                				 eval(ajax.responseJS.code);
                			}		 
                   			$(r).stopWaiting();
                   	    } 	
           	   		}
           	   		else{
           	   	 	   // показываем загрузку
           	   	 	   $(r).startWaiting('bigBlackWaiting');
           	    	}
       		   }
       		   ajax.open(null, '/ajax.php?param=' + param, 'post');
 	   		   ajax.send({v: ''});
	 	    }
	 	    else {

     		  $(r).innerHTML = Cache.clubs[id];
     		  Cache.clubs['js_' + id] ?  eval(Cache.clubs['js_' + id]) : '';
     		  
	 	    }
	    }
	    else {
	  	   if(r == 'club-cart'){
	  	 	 if(l == 'ru') $(r).innerHTML = '<p class="noclub">Не выбран клуб</p>';
	  	 	 if(l == 'en') $(r).innerHTML = '<p class="noclub">No club selected</p>';
	  	  }
	  	  if(r == 'polls'){
	  	 	 $(r).innerHTML = '';
	  	 }
	  	 if(r == 'demo-content'){
	  	 	 $(r).innerHTML = '';
	  	 }		  
	   }
	 }	  
}

/**
 * Переключатель (табличный, контент уходит в ячейку таблицы)
 *
 * @param img     - элемент, который выполняет функцию переключателя  
 * @param param   - имя вызываемого скрипта с параметрами вида script:param или script::param  (String)
 * @param l 	  - язык показываемых собщений
 * @param t 	  - переключаемая ячейка
 *
 */
function _toggle_td(img, param, l, t) {
	 
	 // куда возвращаем результат
	 var r = $(img).id.substr(0, $(img).id.lastIndexOf('_'));
	 
	 // min height for view ajax's loader
	 //if(r!='club-cart') $(r).setStyle({height:'100px'});
	 
	 // получаем таблицу, где произошло переключение
	 var tb = $(t).offsetParent ? $(t).offsetParent : null;

	 // выбираем все ячейки таблицы и обрабатываем
	 $$('table#'+tb.id+' tr').each(function(item){

	 	// удаляем класс "selected" у всех ячеек, кроме той на которую нажали и той в которую возвращаем
	 	if(item.hasClassName('selected') & item.id!=t/* & item.id!=r*/) {
	 	 		item.removeClassName('selected');
	 	}
	 	
	 	// скрываем все не нужные ячейки, кроме одной (нужной)
	  	if(item.className == 'tr' & item.id != r)	item.hide();
	 	
	 	
	 });

	 //	выделяем ячейку  
	 $(t).toggleClassName('selected');

	 // переключаем элемент
	 if(r != 'club-cart')	 $(r).toggle();	
	 
	 // обрабатываем переключатель, выполняем запрос 
	  _toggle(img, param, l, tb.id, r + 'div');
}

/* ================= TODO SECTION ==================== */

/**
 * Листалка календаря
 *
 * @param d       - направление листания (g || b)
 *
 */
function todolist(d) {
	 
	 //длина календаря в часах
	 //var l    = 7;
	 var ceil = todo = row = td1 = td2 = h = null;
	 
	 todo = $('todo');
	 //$$('div[align="center"]').invoke('hide');
	 
	 //var row_count = 0
	 
	 //alert(todo.rows.item(4));
	 
	 // получение характеристики предпоследней ячейки
	 /*h = $($(todo.rows.item(todo.rows.length - 1))).cells.item(0);
	 //alert(parseInt(h.innerHTML));
	 
	 // добавление ячейки	 
	 row = todo.insertRow(todo.rows.length);
	 row.addClassName('goodday');
	 td1 = row.insertCell(0);
	 td1.addClassName('h');
	 td2 = row.insertCell(1);
	 td1.innerHTML = (parseInt(h.innerHTML)+1) + ':00';
	 
	 todo.rows.item(0).hide();
	 
	 //$('t'+)*/
	 alert(todo.rows.length);
	 
	 // если вперед
	 if(d == 'g'){
	 	
	 	// последнюю показываем, первую скрываем
	 	$($(todo.rows.item(todo.rows.length - 1))).show();
	 	
	 }	 
}

/**
 * Показ блока todo
 * 
 * tb - блок-дляформа для добавления комментария
 */
function todoshow(td) {
	 	 
	 // записываем время в заголовок todo
	 $$('#todo_edit span.h')[0].innerHTML = $$('tr#' + $(td).id + ' .h')[0].innerHTML;
	 // формируем ид
	 $$('#todo_edit textarea')[0].setAttribute('id', $(td).id);
	 // если есть todo, то показываем ее
	 if( $$('tr#' + $(td).id + ' td.event div.inner_td')[0].innerHTML )
	 	 $$('#todo_edit textarea')[0].value = $$('tr#' + $(td).id + ' td.event div.inner_td')[0].innerHTML;
	 // показываем 
	 $('todo_edit').show();	 
}	 


/**
 * Запись todo в ячейку таблицы
 */
function todosave() {
	
	 var id = $$('#todo_edit textarea')[0].id;
	
	 if(id != 'undefined'){	 	
	 	$$('tr#' + id + ' td.event div.inner_td')[0].update( $$('#todo_edit textarea')[0].value );
	 	$$('#todo_edit textarea')[0].value = '';
	 }	
	 else
	    alert('Id is not exist!');
	    
	$('todo_edit').hide();  	
}


/**
 * Очистка блока todo
 */
function todoclear() {
	
	 $$('#todo_edit textarea')[0].value = "";	
}

/* ================= END TODO SECTION ==================== */

/**
 * Добавление новых полей для ввода ответов
 *
 * @param p       - место возврата полей 
 * @param cl      - код языка интерфейса 
 *
 */
 function addNewAnswersInput(p, cl, lc){
 	
 	// получаем родительский элемент
   	var pElement = $(p);
   	// input, p
   	var iElement = i1Element = null;
   	var span = null;
   	// id для оболочек
    var id = $(p).childElements().length + 1;
    
    // проверяем наличие введенных данных
   	if(!$('answer').value){
   		var mess = cl == 1 ? ' Введите хоть что то! ' : ' Enter anybody! ';
   		alert(mess);
   		return;
   	}
   
   	// создаем оболочку для input-ов
   	i1Element = document.createElement('p');
   	$(i1Element).addClassName('answer');
   	i1Element.setAttribute('id', 'p' + id);
     	
   	iElement = document.createElement('input');
   		
    // задаем аттрибуты элемента
    iElement.setAttribute('type', 'text');
    $(iElement).addClassName('input');
    iElement.setAttribute('name', 'answers[' + id + '][' + cl + ']');
    iElement.setAttribute('id', 'answer_' + id);
    iElement.setAttribute('readonly', 'readonly');
    iElement.setAttribute('autocomplete', 'off');
             	
    i1Element.appendChild(iElement);
   		
   	// добавляем еще один input и кнопку удаления эелементов
   	// текст
   	span = document.createElement('span');
   	span.innerHTML = cl == 1 ? ' балл ' : ' score '; //' {ru:балл|en:score|de:grad|fr:grade|es:grado}';
   	// поле для ввода баллов
   	iElement = document.createElement('input');
   	iElement.setAttribute('type', 'text');
   	$(iElement).addClassName('input score');
   	iElement.setAttribute('name', 'score[' + id + ']');
   	iElement.setAttribute('id', 'score_' + id);
   	iElement.setAttribute('value', $('score').value);
   	//iElement.setAttribute('readonly', 'readonly');
   	iElement.setAttribute('autocomplete', 'off');
   	iElement.setAttribute('maxlength', '4');
   			
   	i1Element.appendChild(span);
   	i1Element.appendChild(iElement);
   			
   	// кнопка удаления
   	iElement = document.createElement('input');
   	iElement.setAttribute('type', 'button');
   	$(iElement).addClassName('but_del');
   	iElement.setAttribute('name', 'delansws');
   	iElement.onclick=function(){$('p' + id).remove();};
    			
   	i1Element.appendChild(iElement);
    	  	   			
   	pElement.appendChild(i1Element);
   	// передаем введенные переменные
   	$('answer_' + id).value = $('answer').value;
   	$('answer').value = '';
   	$('score_' + id).value = $('score').value;
   	$('score').value = '0';

}

/**
 *  Добавление комментариев
 * 
 *  @param   idc (String)  - ид элемента, после которого вставляем блок с комментарием
 *  @param   ida (Integer) - ид комментируемой статьи
 *  @param   idp (Integer) - ид родителя (для вставки)
 *  @param   lk  (Integer) - левый ключ (для вставки)
 *  @param   rk  (Integer) - правый ключ (для вставки)
 * 
 *  cmb - блок-форма для добавления комментария
 *  
 */
function addComment(idc, ida, idp, lk, rk){
		
	var node = $(idc).parentNode;
	
	// скрываем форму редактирование
	if($('edd-comment'))
		$('edd-comment').hide();
	
	// перемещаем форму
	node.insertBefore(cmb, $(idc).nextSibling);
	
	// очищаем форму
	$('faddc').reset();
	
	// обновляем капчу
	if ($('kcaptcha'))
		$('kcaptcha').src = $('kcaptcha').src + '?' + Math.round(Math.random(0) * 1000);
		
	// добавляем данные
	$('idparent').value  = idp;
	$('lkey').value		 = lk;
	$('rkey').value		 = rk;
	$('idarticle').value = ida;
	  
	$(cmb.id).show();   				 	
}

/**
 *  Редактирование комментариев
 * 
 *  @param   idc (String)  - ид элемента, после которого вставляем блок с комментарием
 *  @param   id  (Integer) - ид комментария
 *  @param   c   (String)  - текст комментария
 *  @param   t   (String)  - тема комментария
 * 
 *  cmbe - блок-форма для редактирования комментария
 *  
 */
function eddComment(idc, id){
		
	var node = $(idc).parentNode;
	
	// скрываем форму добавления
	$('add-comment').hide();
		
	// перемещаем форму
	node.insertBefore(cmbe, $(idc).nextSibling);
	// очищаем форму
	$('feddc').reset();
		
	// добавляем данные
	$('idcode').value    = id;
    $('comment_e').value = $('c' + id).innerHTML;
    if($('t' + id)) 
    	$('theme_e').value 	 =  $('t' + id).innerHTML;
    
	$(cmbe.id).show();   				 	
}

/**
 *  Функция отрисовки графиков
 *  @param   cfg      - параметры отрисовки                       (Object)
 *  @param   i        - ключ для массивов (для отрисовки в цикле) (Integer)
 *  @param   tb       - оси для гистограмм                        (Object)
 *  @param   tp       - оси для пирогов                           (Object)
 *  
 *  Параметры cfg  
 *  cfg.type                  - тип графика Pie, Bar, Histogram
 *  cfg.src                   - где рисуем
 *  cfg.Width                 - ширина области рисования
 *  cfg.Height, cfg.HeightAll - высота области рисования, cfg.HeightAll - высота первого графика
 *  cfg.background            - фон графика
 *  cfg.colorAll              - цветовая схема для всех
 *  cfg.coloMale              - цветовая схема для мужчин
 *  cfg.colorLabel            - цвет осей (String)
 *  cfg.colorFemale           - цветовая схема для женщин
 *  cfg.txt                   - подпись к графику (Array)
 *  cfg.style                 - стиль для заголовка графика (Array)
 *  cfg.pieRadius             - радиус для пирогов (Array)
 *   
 */
function render_ext (cfg, tb, tp, i){
   
   	// область рисования
	cfg.type = cfg.type.indexOf('bar') > 0 ? 'bar' : (cfg.type.indexOf('pie') > 0 ? 'pie' : null);
	var draw_area = cfg.src + '-' + cfg.type;
   
   	// настройки отрисовки графиков
	var optionsAll = {
    // ориентация
  	barOrientation: 'horizontal',
  	// цветовая схема графика - зеленоватый
  	colorScheme: cfg.colorAll,
  	// отступы канзаса
  	padding: {left:30, right: 5, top: 25, bottom: 10},
  	// фон графика
  	background: {color: '#e6ebf6', lineColor:'#ffffff', lineWidth:1},
  	// метки			
  	axis: {labelColor: '#333', x: {ticks: []}},
	// координаты для легенды
	legend: {opacity: 0.6, borderColor:	'#000000', style: {},
			 hide: true, position:{top: '20px', left: '40px'}}
	};
	//legend: {position:{left: '370px', top:'15px'}, opacity: 0.6}, //hide:true
	
	// устанавливаем фон для графиков, отличные от "по умолчанию"
    if (cfg.background_all!=null)
        optionsAll.background.color=cfg.background_all;
    
    // подготавливаем области для рисования
 	$(draw_area).show();
 	$(draw_area).innerHTML = '';
    // отключаем все области рисования
 	$$('div#' + cfg.src+' div[id^=' + cfg.src + ']').each(function(item){
 		item.innerHTML = '';
 		item.hide();
 	});

 	
    // отрисовка гистограмм
    if (cfg.type == 'bar') {
    			   
	    // график по умолчанию
	    if (typeof(DatasetAllBar[i]) != 'undefined') {
	    	// включаем область рисования для bar
	    	$(cfg.src + '-bar').show();
	       	// создаем область для рисования графика (самого первого - общего)
     		createCanvas(draw_area, draw_area + '-b_all', cfg.Width, cfg.HeightAll, cfg.txt[0], cfg.style[0]);
        	// цепляем оси
      		optionsAll.axis.x.ticks = tb[i];
      		// фон
      		/*if(cfg.background_all!=null) 
      			optionsAll.background.color=cfg.background_all;*/
      		
      		// рисуем график для всех (по умолчанию)
        	var chart_bar = new Plotr.BarChart(draw_area + '-b_all', optionsAll);
       		chart_bar.addDataset(DatasetAllBar[i]);
    		chart_bar.render();
  	   }
    	// график для мужчин и женщин (общий без раскладки)
        if (typeof(BarDatasetMFAll[i]) != 'undefined'){
        	// включаем область рисования для bar-mf
	    	$(cfg.src + '-bar-mf').show();
        	// создание области рисования
            createCanvas(draw_area + '-mf', draw_area + '-b_MF_all', cfg.Width, cfg.Height, cfg.txt[1], cfg.style[1]);
     	
        	var chart_bar_mf_all = new Plotr.BarChart(draw_area + '-b_MF_all', optionsAll);
        	// сохраним старые оси
           	var tmpticks = optionsAll.axis.x.ticks;
        	optionsAll.axis.x.ticks = [{v:1, label:' '}, {v:2, label:' '}];
        	optionsAll.colorScheme = {'1': cfg.colorMale, '2': cfg.colorFemale};
        	chart_bar_mf_all.addDataset(BarDatasetMFAll[i]);
        	chart_bar_mf_all.render(draw_area + '-b_MF_all', optionsAll);
        }
        
        // график для мужчин и женщин (общий, с раскладкой по категориям)
        /*if (typeof(BarDatasetMF[i])!='undefined'){ // ОТКЛЮЧЕНО
        	// создание области рисования для раскладки по м/ж
        	createCanvas(draw_area+'-mf', draw_area+'-b_MF', cfg.Width, cfg.Height, cfg.txt[2], cfg.style[2]);
           	var chart_bar_mf = new Plotr.BarChart(draw_area+'-b_MF', optionsAll);
           	// оси
           	optionsAll.axis.x.ticks=tmpticks;
           	optionsAll.colorScheme={'М': cfg.colorMale, 'Ж': cfg.colorFemale};
        	chart_bar_mf.addDataset(BarDatasetMF[i]);
        	chart_bar_mf.render(draw_area+'-b_MF', optionsAll);
        }*/
        
        // график для мужчин
        if (typeof(BarDatasetMale[i]) != 'undefined'){
        	// включаем область рисования для bar-male
	    	$(cfg.src + '-bar-male').show();
        	// создание области рисования
        	createCanvas(draw_area + '-male', draw_area + '-b_male', cfg.Width, cfg.Height, cfg.txt[3], cfg.style[3]);
           	var chart_bar_male = new Plotr.BarChart(draw_area + '-b_male', optionsAll);
           	// оси
           	optionsAll.axis.x.ticks = tb[i];
           	// фон
           	if(cfg.background_m != null) 
      			optionsAll.background.color = cfg.background_m;
           	
      		optionsAll.colorScheme = cfg.colorMale;
        	chart_bar_male.addDataset(BarDatasetMale[i]);
        	chart_bar_male.render(draw_area + '-b_male', optionsAll);
        }
        // график для женщин
        if (typeof(BarDatasetFemale[i]) != 'undefined'){
        	// включаем область рисования для bar-female
	    	$(cfg.src + '-bar-female').show();
        	// создание области рисования
        	createCanvas(draw_area + '-female', draw_area + '-b_female', cfg.Width, cfg.Height, cfg.txt[4], cfg.style[4]);
           	var chart_bar_female = new Plotr.BarChart(draw_area + '-b_female', optionsAll);
           	// оси
           	optionsAll.axis.x.ticks = tb[i];
           	// фон
        	if(cfg.background_f != null) 
      			optionsAll.background.color = cfg.background_f;
        	
           	optionsAll.colorScheme = cfg.colorFemale;
        	chart_bar_female.addDataset(BarDatasetFemale[i]);
        	chart_bar_female.render(draw_area + '-b_female', optionsAll);
        }
    }
    // отрисовка пирогов
    if (cfg.type == 'pie') {
        	   
	    // график по умолчанию
	    if (typeof(DatasetAllPie[i]) != 'undefined') {
	    	// включаем область рисования для pie
	    	$(cfg.src + '-pie').show();
    		// создаем область для рисования графика (самого первого - общего)
     		createCanvas(draw_area, draw_area + '-p_all', cfg.Width, cfg.HeightAll, cfg.txt[0], cfg.style[0]);
     		// фон
     		/*if(cfg.background_all!=null) 
      			optionsAll.background.color=cfg.background_all;*/
    		// пирог для мужчин и женщин (общий, с раскладкой по категориям)
        	optionsAll.pieRadius = cfg.pieRadius[0];
        	optionsAll.axis.x.ticks = tp[i]; 
        	var tmpticks = optionsAll.axis.x.ticks;   	
    		var chart_pie = new Plotr.PieChart(draw_area + '-p_all', optionsAll);
    		chart_pie.addDataset(DatasetAllPie[i]);
        	chart_pie.render();
	    }
	    // пирог для мужчин и женщин (общий без раскладки)
        if (typeof(PieDatasetMFAll[i]) != 'undefined'){
        	// включаем область рисования для pie
	    	$(cfg.src + '-pie-mf').show();
        	createCanvas(draw_area + '-mf', draw_area + '-p_mf', cfg.Width, cfg.Height, cfg.txt[1], cfg.style[1]);
        	
        	if (typeof(cfg.colorLabel))
        	    optionsAll.axis.labelColor = cfg.colorLabel;
        	    
        	optionsAll.pieRadius = cfg.pieRadius[1];
    		optionsAll.colorScheme = {'1': cfg.colorMale, '2': cfg.colorFemale};
    		optionsAll.axis.x.ticks = [{v:0, label:' '}, {v:1, label:' '}];
    		var chart_pie_mfa = new Plotr.PieChart(draw_area + '-p_mf', optionsAll);
    		chart_pie_mfa.addDataset(PieDatasetMFAll[i]);
    		chart_pie_mfa.render(draw_area + '-p_mf', optionsAll);
          }
        
        // пирог для всех мужчин
        if (typeof(PieDatasetMale[i]) != 'undefined') {
        	// включаем область рисования для pie
	    	$(cfg.src+'-pie-male').show();
		   	createCanvas(draw_area + '-male', draw_area + '-p_male', cfg.Width, cfg.Height, cfg.txt[3], cfg.style[3]);
		   	// фон
			if(cfg.background_m != null) 
      			optionsAll.background.color = cfg.background_m;
			
		   	optionsAll.pieRadius = cfg.pieRadius[3];
        	optionsAll.colorScheme = cfg.colorMale;
        	optionsAll.axis.x.ticks = tmpticks;
        	var chart_pie_male = new Plotr.PieChart(draw_area + '-p_male', optionsAll);
        	chart_pie_male.addDataset(PieDatasetMale[i]);
    		chart_pie_male.render(draw_area + '-p_male', optionsAll);
        }
        // пирог для всех женщин
        if (typeof(PieDatasetFemale[i]) != 'undefined') {
        	// включаем область рисования для pie
	    	$(cfg.src + '-pie-female').show();
        	createCanvas(draw_area + '-female', draw_area + '-p_female', cfg.Width, cfg.Height, cfg.txt[4], cfg.style[4]);
        	// фон
        	if(cfg.background_f != null) 
      			optionsAll.background.color = cfg.background_f;
        	
        	optionsAll.pieRadius = cfg.pieRadius[4];
        	optionsAll.colorScheme = cfg.colorFemale;
        	optionsAll.axis.x.ticks = tmpticks;
        	var chart_pie_female = new Plotr.PieChart(draw_area + '-p_female', optionsAll);
        	chart_pie_female.addDataset(PieDatasetFemale[i]);
    		chart_pie_female.render(draw_area + '-p_female', optionsAll);
        }
   }
}

/**
 *  Функция отрисовки одного типа графика
 *  в разных местах
 *  @param   cfg      - параметры отрисовки                       (Object)
 *  @param   i        - ключ для массивов (для отрисовки в цикле) (Integer)
 *  @param   t        - оси для гистограмм                        (Object)
 *  @param   src      - места для отрисовки                       (Object)
 *  @param  dataset   - данные для отрисовки                      (Object)
 *  
 *  Параметры cfg  
 *  cfg.Width                 - ширина области рисования
 *  cfg.Height,               - высота области рисования, cfg.HeightAll - высота первого графика
 *  cfg.background            - фон графика
 *  cfg.colorAll              - цветовая схема для всех
 *  cfg.coloMale              - цветовая схема для мужчин
 *  cfg.colorLabel            - цвет осей (String)
 *  cfg.colorFemale           - цветовая схема для женщин
 *  cfg.txt                   - подпись к графику (String)
 *  cfg.style                 - стиль для заголовка графика (String)
 *  cfg.pieRadius             - радиус для пирогов (String)
 *   
 */
function render_graf (cfg, src, t, dataset, i){
	// настройки отрисовки графиков
	var optionsAll = {
    // ориентация
  	barOrientation: 'horizontal',
  	// цветовая схема графика - зеленоватый
  	colorScheme: cfg.colorAll,
  	// отступы канзаса
  	padding: {left:30, right: 10, top: 25, bottom: 20},
  	// фон графика
  	background: {color: '#ededed', lineColor:'#ffffff', lineWidth:1},
  	// метки			
  	axis: {labelColor: '#333', x: {ticks: []}},
	// координаты для легенды
	legend: {opacity: 0.6, borderColor:	'#000000', style: {},
			 hide: true, position:{top: '20px', left: '40px'}}
	};

	// устанавливаем фон для графиков, отличные от "по умолчанию"
    if (cfg.background != null)
      optionsAll.background.color = cfg.background;
    
    // подключаем оси
    optionsAll.axis.x.ticks = t;
    
    // подготавливаем области для рисования
 	$(src).show();
 	$(src).innerHTML = '';
 	 	
    // отрисовка
    if (typeof(dataset) != 'undefined'){
        	
        	createCanvas(src, src + '-p_mf', cfg.Width, cfg.Height, cfg.txt, cfg.style);
        	
        	if (typeof(cfg.colorLabel))
        	    optionsAll.axis.labelColor = cfg.colorLabel;
        	 
        	optionsAll.pieRadius = cfg.pieRadius;
      		optionsAll.axis.x.ticks = [{v:0, label:' '}, {v:1, label:' '}];
    		optionsAll.colorScheme = {'1': cfg.colorMale, '2': cfg.colorFemale};
    		var chart_p = new Plotr.PieChart(src + '-p_mf', optionsAll);
    		chart_p.addDataset(dataset);
    		chart_p.render(src + '-p_mf', optionsAll);
    }
}

/**
 * Suggest (common)
 * @author andrvm
 */
 
var Suggest = {

 	// message language
 	lang:	'en',
 	// for returned html
 	src: 	false,
 	// for returned result (array)
 	res:	[],
 	// counter
 	c:		1,
 	// param for ajax script
 	param:	'',
 	// cache
 	cache:	[],
 	// input value
 	value:	'',
 	// curent letter (first)
 	cl:		'',
    // highlight
	h: 		-1,
	// height suggest
	maxlimit: 5,
	// suggets current id (for different suggets on a page)
	id:		'',
	// element where event occurred
	e:		'',
	// type (place || standart || numeric)
	//type:	''
	// up down key press counter
	udpos:	0,
 	
 	// Initialization
	Init: function(l, s){
			  	
		// default language	
	  	this.lang = l;
	  	// default src
	  	if(typeof(s) == 'undefined') Suggest.src = 'suggest';
	  	// find all elements with a "suggest" class and  
	  	// set keyup handler
	  	$$('input.suggest').each(function(item){
		  	item.observe('keyup', Suggest.getSuggest.bind(this));
			item.observe('keydown', Suggest._onKeyDown.bind(this));
	  	})
	},
	
	// Suggest processing
	getSuggest: function(evt){
        
        // element where the event occurred
		var e = Suggest.e = (evt.target ? evt.target : evt.srcElement);
	    // clear cache flag
	    var clcfg =  (Suggest.cl != Suggest.value[0] || Suggest.id != $(e).id) ? true : false;
	    // user value
	    Suggest.value = $(e).value;
	    // for returned result
	    Suggest.src = Suggest.src ? Suggest.src : $(e).id + '_p';
		    
	    /*
	     * evt.keyCode == 8   - backspace key
	     * evt.keyCode == 46  - delete key
	     * evt.keyCode >  48  - letter && number keys
	     * 
	     */
	    
	    if(evt.keyCode >= 48 || (evt.keyCode == 8 || evt.keyCode == 46)){
	   	
	   	  // clear cache or no?
	   	  Suggest.cache = Suggest.cache.length > 0 & clcfg ? [] : Suggest.cache;
	   	  // reset up down counter
	   	  Suggest.udpos = 0;
	   	  // get search result
	   	  Suggest.res   = Suggest._cacheSearch();
	   	  	   		   	  
	   	  // if exist a cache
	   	  if(Suggest.res.length > 0){
	       		Suggest.fillSuggest();
				Suggest.posSuggest();
          }
          // else: get data from server and fill the cache
          else{
         		if(evt.keyCode >= 48 & Suggest.c == 2 ){
           			setTimeout('Suggest._serverSearch()', 10);
         		}
        	}
         }		
        
     	 // counter
	 	 Suggest.c = $(e).length == 0 ? 1 : Suggest.c;
	  
	 	 if(evt.keyCode >= 48)
	  	    Suggest.c = Suggest.c >= 2 ? 1 : Suggest.c + 1;
	 	 if(evt.keyCode == 8 || evt.keyCode == 46)
	  		Suggest.c = Suggest.c <= 1 ? 1 : Suggest.c - 1;
	    	  	
	},
	
    // Filling suggest
	fillSuggest: function(){
	    
	    // for a suggest content
		var html = str_ = '';
		// suggest length limit
		var limit = (Suggest.res.length < Suggest.maxlimit) ? Suggest.res.length : Suggest.maxlimit;
		// correction fo up down button
		limit = Suggest.udpos ? Suggest.udpos + limit : limit;
			    
	    if(Suggest.res.length == 0) {
	    	html = (Suggest.lang == 'ru') ? 'Соответствий не найдено. Нажмите <strong>Esc</strong> для возврата.' : 'Matches not found. Press <strong>Esc</strong> for return.' ;
	       	$(Suggest.src).update('<span><i class="aligncenter">' + html + '</i></span>');
	    	$(Suggest.src).show();
			return;
	    }	 
	 
		// clear
		$(Suggest.src).update();
		
		for (var i = (Suggest.udpos ? Suggest.udpos : 0); i < limit; i++) {
			str_ = Suggest.res[i][0].replace(new RegExp('(' + Suggest.value + ')','gi'), "<b>$1</b>");
			str_ += '<i>' + Suggest.res[i][1] + '</i>';
			html += '<span>' + str_ + '</span>';
  	    }	   		
     
		// add button "Close" to suggest
		//html+='<p><em onclick="$(Suggest.src).hide()">[ x ]</em></p>';
		
		// add 'up' 'down' button
		if(Suggest.res.length > limit || Suggest.udpos){			
			if(Suggest.res.length > limit)
				html += '<em id="up"></em>';
			if(Suggest.udpos != 0)
				html += '<em id="down"></em>';				
		}	
		
	  	$(Suggest.src).update(html);
	  	
		// show  		
	    $(Suggest.src).show();
	    // add onclick handler
		$$('#' + Suggest.src + ' span').each(function(item){
		  	item.observe('click', Suggest._onClick.bind(this, Suggest.e, item));
	    });
	    
		// add 'up' 'down' button handler
		if ($('up'))  $('up').observe('click', Suggest._onMove.bind(this, Suggest.e, 'up'));
	    if ($('down')) $('down').observe('click', Suggest._onMove.bind(this, Suggest.e, 'down'));
	           
	},
	
	// suggest targeting
	posSuggest: function(){
	  
	   var obj = e = Suggest.e;
	   var x = y = 0;
	 
	   // get x & y coordinates
       while(obj) { 
      	    x 	+= obj.offsetLeft; 
            y 	+= obj.offsetTop; 
            obj  = obj.offsetParent; 
       }

       // correction
       x = x + Math.round(parseFloat($(e).getStyle('border-left-width'), 10));
       y = y + parseInt($(e).getHeight(), 10) + Math.round(parseFloat($(e).getStyle('border-top-width'), 10));
      
	   // opera correction
       if(navigator.userAgent.indexOf('Opera') >= 0){
      		x = x - 1;
      		y = y - 2;
       }

       // targeting suggest
       $(Suggest.src).setStyle({left: x + 'px'});
       $(Suggest.src).setStyle({top:  y + 'px'});
       // set suggest width 
  	   $(Suggest.src).style.width = parseInt($(e).getStyle('width'), 10) + parseInt($(e).getStyle('padding-left', 10)) + parseInt($(e).getStyle('padding-right', 10)) + 'px';
        
	},
	
	// search in cache
	_cacheSearch: function(){
		
		var _res = [];
      	
        if (Suggest.cache.length == 0) return _res;
    	
    	for(var i = 0; i < Suggest.cache.length ; i++){  
    		if(Suggest.cache[i][0].toLowerCase().indexOf(Suggest.value.toLowerCase()) > -1)
    		    _res.push(Suggest.cache[i]);
      	};
	       
	    return _res;
    },
	
	// search in server
	_serverSearch: function(){
       
        var e = Suggest.e; 
    	// get param for ajax script ("field" - for table and "lang" for language)
	  	var param = '&field=' + $(e).lang.substr(0, $(e).lang.indexOf('-')) + '&sl1=' + $(e).lang.substr($(e).lang.indexOf('-') + 1, $(e).lang.length);
	  	
	  	// for place suggest
	  	if(/*$(e).id=='area' || */$(e).id == 'place'){
	  		var _c = a_ = mess = '';
	  		if($('country').value.length == 0){
	  			mess = (Suggest.lang == 'ru') ? 'Введите страну!' : 'Enter a country name!';
	  			$(e).value = '';
	  			alert(mess);
	  			return;
	  		}
	  		else{
	  		  _c = $('country').value;//.substring($('country').value.indexOf('/')+2, $('country').value.length);
	  		  //_a = $('area').value.substring($('area').value.indexOf('/')+2, $('area').value.length);
	  		}
	   		
	   		param += "&co='" + _c + "'";
	  	}	
	  	// get action
	    var action = ($(e).id.indexOf('_') >= 0) ? $(e).id.substr($(e).id.indexOf('_') + 1, $(e).id.length) : $(e).id;
	    // url for ajax
	    var url = '/suggest.php';
	 	
	    new Ajax.Request(url, {
	    	
	 		method: 	'get',
	 		parameters: 'action=' + action + '&sl=' + Suggest.lang + param + '&v=' + Suggest.value,
	 		
	 		onSuccess: function(transport) {
                  // get result
	    	      var  responseJS = eval( "(" + transport.responseText + ")" );
	    	      Suggest.res 	  = responseJS.data ? eval(responseJS.data) : [];
	    	      // add to cache
	    	      if(Suggest.cache.length > 0 & Suggest.res.length > 0)
            			Suggest.cache_merge(Suggest.res);
                  else
                       Suggest.cache =  Suggest.res.length > 0 ? Suggest.res : Suggest.cache;
                       
                  Suggest.cl = Suggest.value[0];
       	 		  Suggest.id = $(e).id;
       	              	 		
       	 		  if(Suggest.cache.length > 0)
       	 				Suggest.res = Suggest._cacheSearch();
       	 		
       	 		  // fill suggest
       	 		  Suggest.fillSuggest();
       	 		  // targeting
       	 		  Suggest.posSuggest();       	 
	 	    }
	 	}); 
   },
   
   // merge the cache and result from ajax
   // special thanks to Ivanov Pavel
   cache_merge: function(varray){
       
       var cache_str = cache_str_1 = value_str = '';
	   // cache length
	   var cache_len = Suggest.cache.length;
	   // cache flag and cycle's variable
	   var fg = j = 0;
	  	   
	   for(var i = 0; i < varray.length; i++){		   
		   // nulled
		   fg = true;
		   // concat array[0] with array[1] (input value)
		   value_str = varray[i][0] + varray[i][1];
		   // compare with cache		   
		   while ((j < cache_len) & (fg)){
		       // concat array[0] with array[1] (cache value)
			   cache_str   = Suggest.cache[j][0] + Suggest.cache[j][1];
			   // need change flag?
			   fg = (cache_str.indexOf(value_str) != -1) ? false : true;		
	           //
			   j++;
		   }
		   j = 0;
		   // add to cache
		   if (fg) Suggest.cache.push(varray[i]);	
	   }	
    },
    
    /**
     * Event handlers
     */
	
   // suggest's element (span) onclick event
   _onClick: function(){
      
       // span element
	   var e = $A(arguments)[1];
	
	   var area =  ($A(arguments)[0].id == 'place') ? Suggest.setArea(e) : '';
	   $A(arguments)[0].value = area ? $(e).innerHTML.replace(area, ' / ' + area).stripTags() : $(e).innerHTML.stripTags(); 
	   $(Suggest.src).hide();
   },

   // suggest's element (span) onkeydown event
   _onKeyDown: function(evt){
   	
   	  // Enter key or Escape key
	  if(evt.keyCode == 13 || evt.keyCode == 27)  $(Suggest.src).hide();
   	
	  // element where the event occurred
	  var e = evt.target ? evt.target : evt.srcElement;
      
	  var list = $$('#' + Suggest.src + ' span');
	  
	  if(list.length == 0) return;
	      
	  Suggest.h = evt.keyCode == 38 ? Suggest.h - 1 : (evt.keyCode == 40 ? Suggest.h + 1 : Suggest.h);
 	  Suggest.h = Suggest.h < 0 ? list.length - 1 : (Suggest.h > list.length - 1 ? 0 : Suggest.h);
	
	  if(evt.keyCode == 38 || evt.keyCode == 40){
		  var area = $(e).id == 'place' ? Suggest.setArea(list[Suggest.h]) : '';
	  	  list.invoke('removeClassName', 'selected');
		  $(list[Suggest.h]).addClassName('selected');
		  $(e).value = area ? $(list[Suggest.h]).innerHTML.replace(area, ' / ' + area).stripTags() : $(list[Suggest.h]).innerHTML.stripTags(); 
		
	   }
   },
   
   // move (up or down) on suggest
   _onMove: function(evt, type){
	  
	   // counter
	   Suggest.udpos = (type == 'up') ? Suggest.udpos + 1 : Suggest.udpos - 1;
	   Suggest.udpos = (Suggest.udpos < 0) ? 0 : Suggest.udpos;
	   // fill
	   Suggest.fillSuggest(Suggest.udpos);
		   
   },
   
   
   // suggest's element (span) onblur event
   _onBlur: function(evt){
   	  $(Suggest.src).hide();
   },
   
   // set area (for place suggest)
   setArea: function(e){
	   
	   var area = '';
	
	   area = $(e).innerHTML.match(new RegExp('<i>(.+?)</i>','gi'))+'';
	   if(area.length > 0 & $('area') != null){
	   		   	$('area').value = area.stripTags();
	   }	  	   
	   return area;
   }	   
}
 
 /**
 * Poll onclick panel
 */
 
var PHover = {
 	
    // user's country id
    uc: 0,
    // user's Id_Sign
    uh: 0,
    // site lang const
    l: 'en',
    // STAT_POROG_VIEW
    p: 9999,
    
 	// инициализация
	Init: function(uc, uh, p, l){
	  
	  this.lang = l;
	  
	  this.uc = uc;
	  
	  this.uh = uh;
	  
	  this.p = p;
	  
      // находим все элементы с классом suggest и навешиваем
      // им свой обрабочтик события keyup
	  $$('#objects .voted').each(function(item){
		item.observe('click', PHover.viewPanel.bind(this));
	  })
	  

	},
	
	// get & view panel
	viewPanel: function(evt){
	  // element
	  var e = evt.target ? evt.target : evt.srcElement;
	  // ajax object
	  var sd = new JsHttpRequest();
	  // query url
	  var url = '/sajax.php?param=polls:'+'getstatpanel'+':&sl='+PHover.lang;
	  // values of sending
	  var tmp = $(e).id.substr(1);
	  var id  = tmp.substr($(e).id.lastIndexOf('-'), $(e).id.length-$(e).id.lastIndexOf('-')-1);
	  var cat = tmp.substr(0, $(e).id.indexOf('-')-1);
	  var k   = tmp.substr($(e).id.indexOf('-'), $(e).id.lastIndexOf('-')-$(e).id.indexOf('-')-1);
		  
	  sd.onreadystatechange = function(){
        	if (sd.readyState == 4) {
               	if (!sd.responseJS.err){
               		 // remove old '.selected'
               		/*if(typeof($$('span.voted.selected')[0])!='undefined')
               		 	$$('span.voted.selected')[0].removeClassName('selected');
               		 // toggle classname
               		 $(e).toggleClassName('selected');*/

           	 		 // fill panel
           	 		 PHover.fillPanel(e, sd.responseJS.data);
             	 	 // ajax show off
             	 	 $(e).setStyle({backgroundImage: 'none'});
                } 	
           	}
           	else{
           	// ajax show on
           	 $(e).setStyle({backgroundImage: 'url(/templates/images/ajax_load_16.gif)', backgroundRepeat: 'no-repeat', backgroundPosition: 'right center'});
           	}
       }
             
       sd.open(null, url, 'get');
       // v - poll id, cat - category code, k - kind code, c - country code, h - sign code
       // p - STAT_POROG_VIEW
 	   sd.send({v: id, cat: cat, k: k,  c: PHover.uc, h: PHover.uh, p:PHover.p});
  		
	},
	
	// fill and position panel
	fillPanel: function(e, d){
      
      // fill
	  $('phover').update(d);
	  
	  // get x and y
	  var x = y = 0;
	  var obj = e;
      while(obj.id!='objects-list') { 
       	    x += obj.offsetLeft; 
            y += obj.offsetTop; 
            obj  = obj.offsetParent; 
      }
      // correction
      x = x + Math.round(parseFloat($(e).getStyle('border-left-width'),10));
      y = y+ parseInt($(e).getHeight(),10)+Math.round(parseFloat($(e).getStyle('border-top-width'),10));
  
      // position
      $('phover').setStyle({left: x+'px'});
      $('phover').setStyle({top: (y+2)+'px'});
      // show
	  $('phover').show();

	}	

}
