// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
// Javascript file for project: SD Core (JS)
// Project URL: any URL / projects
// Module: «Standart» - набор стандартных javascript функций для работы SD проектов
// Author: Zerohold
// Site author script: www.sd-company.su
// Date create: September 2010 year
// Date last change: August 2011 year
// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
// навешиваем jQuery клавишный перехватчик, данный блок прописывается у всех из-за jquery
// Переменная отвечающая за URL адрес с которым работают универсальные функции
var sdd_url_control='/';

var time_out=200;
var timer_close=0;
var ddmenuitem=0;
// _____________________________________________________________________________
function sdf_menu_open()
// Выполняет: открытие меню
{
sdf_menu_timer_cancel();
sdf_menu_close();
ddmenuitem = $(this).find('ul').css('visibility', 'visible');
}// /sdf_menu_open
// _____________________________________________________________________________
function sdf_menu_close()
// Выполняет: закрытие меню
{
if (ddmenuitem) { ddmenuitem.css('visibility','hidden'); }
}// /sdf_menu_close
// _____________________________________________________________________________
function sdf_menu_timer()
// Выполняет: закрытие меню по таймеру
{
timer_close = window.setTimeout(sdf_menu_close,time_out);
}// /sdf_menu_timer
// _____________________________________________________________________________
function sdf_menu_timer_cancel()
// Выполняет: закрытие меню по таймеру
{ if (timer_close)
  { window.clearTimeout(timer_close);
    timer_close = null;
  }
}
document.onclick=sdf_menu_close;
// _____________________________________________________________________________
function sdf_server_date_clock(_time,_minuteswest)
// Выполняет: вывод серверных часов
{
var d=new Date();
var bb=d.getTimezoneOffset();
var tt=parseInt(bb)-parseInt(_minuteswest);
d.setTime(_time*1000+(tt*60*1000));
// Дата
date_year=d.getFullYear();
date_month=d.getMonth()+1;
date_day=d.getDate();
date_wr=date_year+'.';
date_wr+=((date_month<10)?'0':'')+date_month+'.';
date_wr+=((date_day<10)?'0':'')+date_day;
// Время
time_hours=d.getHours();
time_min=d.getMinutes();
time_sec=d.getSeconds();
time_wr=((time_hours<10)?'0':'')+time_hours+':';
time_wr+=((time_min<10)?'0':'')+time_min+':';
time_wr+=((time_sec<10)?'0':'')+time_sec;
$('#sd_server_date').html(date_wr);
$('#sd_server_time').html(time_wr);
var kk=_time;
kk++;
setTimeout('sdf_server_date_clock('+kk+','+_minuteswest+')',1000);
}// /sdf_server_date_clock
// _____________________________________________________________________________
function sdf_jquery_keywords()
// Выполняет: название обработки клавиш
{
$.keyboard('ctrl+aright', { strict : true }, function (event) { sdf_keywords_eval(function_next); });// переход вправо CTRL →
$.keyboard('ctrl+aleft', { strict : true }, function (event) { sdf_keywords_eval(function_prev); });// переход влево ← CTRL
$.keyboard('ctrl+enter', { strict : true }, function (event) { sdf_keywords_eval(function_enter); });// переход влево
$.keyboard('insert', { strict : true }, function (event) { sdf_keywords_eval(function_insert); });// обработка клавиши Insert
$.keyboard('delete', { strict : true }, function (event) { sdf_keywords_eval(function_delete); });// обработка клавиши Delete
// $.keyboard('alt+x', { strict : true }, function (event) { sdf_keywords_eval(function_escape); });// ALT+x - выход из формы
$.keyboard('alt+n1', { strict : true }, function (event) { sdf_keywords_eval(function_alt_1); });// ALT+1 - жирный текст
$.keyboard('alt+n2', { strict : true }, function (event) { sdf_keywords_eval(function_alt_2); });// ALT+2 - наклонный текст
$.keyboard('alt+n3', { strict : true }, function (event) { sdf_keywords_eval(function_alt_3); });// ALT+3 - подчеркнутый текст
$.keyboard('alt+n4', { strict : true }, function (event) { sdf_keywords_eval(function_alt_4); });// ALT+4 - зачеркнутый текст
$.keyboard('alt+n5', { strict : true }, function (event) { sdf_keywords_eval(function_alt_5); });// ALT+5 - <sub> - текст в нижнем индексе
$.keyboard('alt+n6', { strict : true }, function (event) { sdf_keywords_eval(function_alt_6); });// ALT+6 - <sup> - текст в верхнем индексе
$.keyboard('alt+n7', { strict : true }, function (event) { sdf_keywords_eval(function_alt_7); });// ALT+7 - свободно
$.keyboard('alt+n8', { strict : true }, function (event) { sdf_keywords_eval(function_alt_8); });// ALT+8 - свободно
$.keyboard('alt+n9', { strict : true }, function (event) { sdf_keywords_eval(function_alt_9); });// ALT+9 - свободно
$.keyboard('alt+n0', { strict : true }, function (event) { sdf_keywords_eval(function_alt_0); });// ALT+0 - свободно
}// /sdf_jquery_keywords
// _____________________________________________________________________________
function sdf_keywords_clear()
// Выполняет: очистку от всех обработок клавиш
{
function_next='';// обнуление функции, которая вызывалась по CTRL →
function_prev='';// обнуление функции, которая вызывалась по ← Ctrl
function_insert='';// обнуление функции, которая вызывалась по Insert
function_enter='';// обнуление функции, которая вызывалась по CTRL+Enter
function_escape='';// обнуление функции, которая вызывалась по ALT+`
function_delete='';// обнуление функции, которая вызывалась по Delete
function_alt_1='';// обнуление функции, которая вызывалась по ALT+1
function_alt_2='';// обнуление функции, которая вызывалась по ALT+2
function_alt_3='';// обнуление функции, которая вызывалась по ALT+3
function_alt_4='';// обнуление функции, которая вызывалась по ALT+4
function_alt_5='';// обнуление функции, которая вызывалась по ALT+5
function_alt_6='';// обнуление функции, которая вызывалась по ALT+6
function_alt_7='';// обнуление функции, которая вызывалась по ALT+7
function_alt_8='';// обнуление функции, которая вызывалась по ALT+8
function_alt_9='';// обнуление функции, которая вызывалась по ALT+9
function_alt_0='';// обнуление функции, которая вызывалась по ALT+0
}// /sdf_keywords_clear
// _____________________________________________________________________________
function sdf_keywords_eval(_name)
// Выполняет: выполнение функций прописанных для комбинаций клавиш
{
if (_name!='') { eval(_name); }// если прописана какая то команда, то срабатывает
}// /sdf_keywords_eval
// _____________________________________________________________________________
function sdf_processing(_mode,_text)
// Выполняет: анимацию длительных, вычислительных процессов
// _mode - режим вывода. on - включить, off - выключить
// _text - сопроводительный текст
{
var text='';
if (_mode=='on')
{ text=sdf_default(_text,'Загрузка');
  $('#sd_processing_image').css({'display':'inline-block'});
}
else
{ text=sdf_default(_text,'Режим ожидания');
  $('#sd_processing_image').css({'display':'none'});
}
$('#sd_processing_text').html(text);
}// /sdf_processing
// _____________________________________________________________________________
function sdf_button(_function,_title,_comment)
// Выполняет: формирование кнопки на основе HTML кода
// Возвращает: готовый HTML код
{
var comment=sdf_default(_comment,'');
var r='<span class="sd_button" onclick="'+_function+'" title="'+comment+'"><span>'+_title+'</span></span>';
return r;
}// /sdf_button
// _____________________________________________________________________________
function sdf_module_name_last_set(_url,_module_name)
// Выполняет: сохранение в какой модуль последний раз входил пользователь, для повтороного открытия после
{
var url=sdf_default(_url,'/');
var p={};// p=params
p.mode='sd_module_name_last_set';
p.module_name_last=_module_name;
var i=sdf_ajax(url,p);// отправка ajax запроса
}// /sdf_module_name_last_set
// _____________________________________________________________________________
function sdf_module_config_load(_mode,_url)
// Выполняет: загрузку конфигурацию для любого модуля
{
var url=sdf_default(_url,'/');
var p={};// p=params
p.mode=_mode;
p.command='module_config_load';
var i=sdf_ajax(url,p);// отправка ajax запроса
if (i.access==0) { sdf_admin_exit_forced(); }
return i.data;
}// /sdf_module_config_load
// _____________________________________________________________________________
function sdf_user_correct(_name)
// Выполняет: корректировку пользователя на случай Copy+Paste или включенных CAPSLock
{
var name=sdf_default(_name,'logon_user');
var r=$('input[name="'+name+'"]').val();
r=r.toLowerCase();// преобразуем строку в нижний регистр
var txt=new RegExp('[^a-z0-9\_\-]','i');
r=r.replace(txt,'');// производим необходимые замены
$('input[name="'+name+'"]').val(r);// переписать значение
// нельзя цифры и нельзя пробелы и другие спец символы
}// /sdf_user_correct
// _____________________________________________________________________________
function sdf_email_correct(_name)
// Выполняет: корректировку введенного email
{
var name=sdf_default(_name,'email');
var r=$('input[name="'+name+'"]').val();
r=r.toLowerCase();// преобразуем строку в нижний регистр
var txt=new RegExp('[^a-z0-9@\.\_\-]','i');
r=r.replace(txt,'');// производим необходимые замены
$('input[name="'+name+'"]').val(r);// переписать значение
}// /sdf_email_correct
// _____________________________________________________________________________
function sdf_table_select()
// Выполняет: раскрашивание строк в таблицах
{
$('.sd_line_odd').hover(
function(){ $(this).addClass('sd_line_select');},// получение фокуса
function(){ $(this).removeClass('sd_line_select'); }// потеря фокуса
);
$('.sd_line_even').hover(
function(){ $(this).addClass('sd_line_select'); },// получение фокуса
function(){ $(this).removeClass('sd_line_select'); }// потеря фокуса
);
}// /sdf_table_select
// _____________________________________________________________________________
function sdf_record_load(_params)
// Выполняет: запрос на сервер по одной записи
// Возвращает: данные по одной записи, на основе введенных параметров
{
sdf_processing('on');
var command=sdf_default(_params.command,'record_load');// команда с который вызывается
var url=sdf_default(_params.url,'/');// где отображать текущий статус
var p={};// p=params
p.mode=_params.mode;
p.command=command;
p.record_id=_params.record_id;
var i=sdf_ajax(url,p);// отправка ajax запроса
if (i.access==0) { sdf_admin_exit_forced(); }
return i.data.row;
}// /sdf_record_load
// _____________________________________________________________________________
function sdf_checkbox_status_delete()
// Выполняет: изменение состояние checkbox с классом checkbox_delete на протиположное текущему
{
var elements=$('.checkbox_delete');// выбрать все элементы с классом checkbox_delete
var len=elements.size();// узнаем сколько элементов присутствует на странице
for (index=0;index<len;index++)// пройтись по всем элементам [checkbox]
{ elements.eq(index).prop('checked',!elements.eq(index).prop('checked'));// поменять состояние checkbox на противоположное
}// /for
}// /sdf_checkbox_status_delete
// _____________________________________________________________________________
function sdf_record_erase(_params)
// Выполняет: удаление записей на основе выделенных checkbox на формах
// Возвращает: true/false для обновления грида
// form_name - название формы
// checkbox_name - название checkbox
// url - ссылка которая обрабатыват запрос
// mode - режим с которым вызывается url
{
var params_del={};
params_del.checkbox_name='check_';// какой префикс имеют checkbox по умолчанию
params_del.command='record_erase';// посылаемая команда по умолчанию
params_del.text_confirm='Вы действительно хотите удалить выделенные записи?';
sdf_property_set(_params,params_del);// set default
var refresh_=0;// по умолчанию не требуется обновление грида
if (!sdf_confirm(params_del.text_confirm)) { return refresh_; }// запросить подтверждение
sdf_processing('on','Идет удаление записей');// показываем лог процесса
var elements=$('.checkbox_delete');// выбрать все элементы с классом checkbox_delete
var len=elements.size();// узнаем сколько элементов присутствует на странице
var index=0;
var id=0;
var p={};// p=params
p.mode=params_del.mode;
p.command=params_del.command;
for (index=0;index<len;index++)// пройтись по всем элементам [checkbox]
{ if (elements.eq(index).prop('checked')===false) { continue; }// если запись НЕ требуется удалять
  id=sdf_str_replace(elements.eq(index).prop('name'),params_del.checkbox_name,'');// выделяем ID из свойства name
  sdf_processing('on','Удаление записи id='+id);
  p.record_id=id;
  var i=sdf_ajax(params_del.url,p);// отправка ajax запроса
  if (i.access==0) { sdf_admin_exit_forced(); }
  refresh_=true;// требуется обновление данных
}// /for
sdf_processing('off','Удаление завершено');// отключаем процесс
if (refresh_==1)// если требуется, то обновить данные
{ var function_refresh=sdf_default(params_del.refresh_,'');
  if (function_refresh!='') { eval(function_refresh); }// если требуется, то обновить данные
}
return refresh_;
}// /sdf_record_erase
// _____________________________________________________________________________
function sdf_pages(_params)
// формирование страниц
// _params.record_count - кол-во всего записей
// _params.record_view - кол-во показываемых записей на одной стрнице 
// _params.page_current - текущая активная страница
// _params.function_page_prev
// _params.page_all_disabled
{
var r='';
// проверяем на всякий случай на вшивость
_params.record_count=parseInt(_params.record_count);
_params.record_view=parseInt(_params.record_view);
_params.page_current=parseInt(_params.page_current);
var page_all_disabled=sdf_default(_params.page_all_disabled,0);
if (_params.record_count==0) { return r; }
// вычисляем общее кол-во страниц
var page_count=Math.ceil(_params.record_count/_params.record_view);
if (page_count==1) { return r; }// если страница всего одна, ничего и не рисуем
if (_params.page_current>1)// если текущая страница больше 1, то можно вернуться на 1 страницу назад
{ r+='<span class="sdec bi_page_prev" title="Переход на предыдущую страницу [← Ctrl]" onclick="'+_params.function_page_prev+'"></span>';
}
else// иначе отключаем эту возможность, дабы лишний раз не дергать сервер
{ r+='<span class="sdec bi_page_prev_disabled ncu" title="Переход на предыдущую страницу - сейчас невозможен"></span>';
}
// показываем текущую страницу
r+=' <input name="sd_page_current" value="'+_params.page_current+'" class="sd_grid_page_current" onkeypress="if (event.keyCode==13) { '+_params.function_refresh+'; }" title="Текущий номер страницы" /> ';
// если есть смысл включать кнопку переключения на слеующую
if (_params.page_current<page_count)
{ r+='<span class="sdec bi_page_next" title="Переход на следующую страницу [Ctrl →]" onclick="'+_params.function_page_next+'"></span>';
}
else// иначе отключаем эту возможность, дабы лишний раз не дергать сервер
{ r+='<span class="sdec bi_page_next_disabled" title="Переход на следующую страницу - сейчас невозможен"></span>';
}
r+='<span class="sdec bi_refresh" title="Обновить страницу" onclick="'+_params.function_refresh+';"></span>';
if (page_all_disabled==0)
{ r+=' [Всего страниц: '+page_count+']';
}
return r;
}// /sdf_pages
// _____________________________________________________________________________
function sdf_grid_th_number()
// Выполняет: генерацию кода
// Возвращает: формирование столбика с изменением
{
var r='<th class="sdec_grid_control_th" title="Порядковый номер">№</th>';
return r;
}// /sdf_grid_th_number
// _____________________________________________________________________________
function sdf_grid_th_checkbox(_function)
// Выполняет: генерацию кода
// Возвращает: формирование столбика с изменением
{
var f=sdf_default(_function,'sdf_checkbox_status_delete();');
var r='<th class="sdec_grid_control_th" title="Выделить все" onclick="'+f+'"><span class="sdec bi_check"></span></th>';
return r;
}// /sdf_grid_th_checkbox
// _____________________________________________________________________________
function sdf_grid_th_disabled()
// Выполняет: генерацию кода
// Возвращает: формирование столбика с изменением
{
var r='<th class="sdec_grid_control_th"><span class="sdec bi_disabled" title="Отключена / включена обработка записей"></span></th>';
return r;
}// /sdf_grid_th_disabled
// _____________________________________________________________________________
function sdf_grid_th_rating()
// Выполняет: генерацию кода
// Возвращает: формирование столбика с рейтингом
{
var r='<th class="sdec_grid_control_th" title="Рейтинг, порядок важности"><span class="sdec bi_rating ncu"></span></th>';
return r;
}// /sdf_grid_th_rating
// _____________________________________________________________________________
function sdf_grid_th_edit()
// Выполняет: генерацию кода
// Возвращает: формирование столбика с изменением
{
var r='<th class="sdec_grid_control_th" title="Изменить, вызывается форма редактирования"><span class="sdec bi_edit ncu"></span></th>';
return r;
}// /sdf_grid_th_edit
// _____________________________________________________________________________
function sdf_grid_th_copy()
// Выполняет: генерацию кода
// Возвращает: формирование столбика для функии копирования
{
var r='<th class="sdec_grid_control_th" title="При нажатии создается дубликат записи"><span class="sdec bi_copy ncu"></span></th>';
return r;
}// /sdf_grid_th_copy
// _____________________________________________________________________________
function sdf_grid_number(_number)
// Выполняет: 
{
var r='<td class="sdec_grid_control sd_center" title="Порядковый номер">'+_number+'</td>';
return r;
}// /sdf_grid_number
// _____________________________________________________________________________
function sdf_grid_checkbox(_name)
// Выполняет: вывод checkbox в grid
{
var name_=sdf_default(_name,'');
if (name_=='') { alert('Ошибка при формировании checkbox [Не указано имя]. function sdf_grid_checkbox'); return; }
var r='<td class="sdec_grid_control"><input type="checkbox" name="'+name_+'" class="checkbox_delete" /></td>';
return r;
}// /sdf_grid_checkbox
// _____________________________________________________________________________
function sdf_grid_edit(_function)
// Выполняет: 
{
var r='<td class="sdec_grid_control" title="Изменить запись"><span class="sdec bi_edit" onclick="'+_function+'"></span></td>';
return r;
}// /sdf_grid_edit
// _____________________________________________________________________________
function sdf_grid_rating(_rating)
// Выполняет: генерацию кода
// Возвращает: формирование столбика с рейтингом
{
var r='<td class="sdec_grid_control" title="Рейтинг"><div class="sd_grid_rating">'+_rating+'</div></td>';
return r;
}// /sdf_grid_rating
// _____________________________________________________________________________
function sdf_grid_copy(_function)
// Выполняет: 
{
var r='<td class="sdec_grid_control" title="Копировать запись / создать клон"><span class="sdec bi_copy" onclick="'+_function+'"></span></td>';
return r;
}// /sdf_grid_copy
// _____________________________________________________________________________
function sdf_form_tab_panel(_params)
// Выполняет: 
{
var count_=sdf_size_array(_params);
var current='';
var r='';
r+='<div class="sd_tab_panel"><table><tr>';
for (it=0;it<count_;it++)
{ current='';
  if (it==0) { current=' class="current"'; }
  r+='<td onclick="'+_params[it]['func']+'"'+current+'>'+_params[it]['title']+'</td>';
}
r+='</tr></table></div>';
return r;
}// /sdf_form_tab_panel
// _____________________________________________________________________________
function sdf_form_tab_panel_add(_array,_func,_title)
// Выполняет: 
{
var r=sdf_default(_array,Array());
var count_=sdf_size_array(_array);
r[count_]=Array();
r[count_]['func']=_func;
r[count_]['title']=_title;
return r;
}// /sdf_form_tab_panel_add
// _____________________________________________________________________________
function sdf_form_tab_panel_active()
// Выполняет: выделение активной закладки
// Требуется выполнять только того как год сгенерирован
{
$('div.sd_tab_panel').each(function()
{ $(this).find('td').each(function()
  { $(this).click(function()
    { $(this).addClass('current').siblings().removeClass('current');
    });
  });
});
$('div.sd_tab_panel').each(function()
{ $(this).find('span').each(function()
  { $(this).click(function()
    { $(this).addClass('current').siblings().removeClass('current');
    });
  });
});
}// /sdf_form_tab_panel_active
// _____________________________________________________________________________
function sdf_form_checkbox(_name,_value,_title,_params)
// Выполняет: вывод checkbox на форме
{
var click_='';
var tr_id='';
if (typeof(_params)!='undefined')
{ var cl=sdf_default(_params.onclick,'');
  if (cl!='') { click_=' onclick="'+cl+'"'; }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
}
var value=sdf_default(_value,0);
var ch='';
if (value==1) { ch=' checked="checked"'; }
r='<tr'+tr_id+'><td class="sd_form_row_desc">'+_title+'</td><td class="sd_form_row_value" title="Галочка - функция включена"><input type="checkbox" name="'+_name+'"'+ch+click_+' /></td></tr>';
return r;
}// /sdf_form_checkbox
// _____________________________________________________________________________
function sdf_form_input_int(_name,_value,_description)
// Выполняет: вывод input на форме
{
var r='';
var value=sdf_default(_value,0);
r+='<tr><td class="sd_form_row_desc">'+_description+'</td><td class="sd_form_row_value"><input type="text" class="sd_input_int" name="'+_name+'" value="'+value+'" /></td></tr>';
return r;
}// /sdf_form_input_int
// _____________________________________________________________________________
function sdf_form_input_str(_name,_value,_description,_params)
// Выполняет: 
{
var onkeyup='';
var type_='text';
var cm='';// cm=control_mini
var tr_id='';
if (typeof(_params)!='undefined')// если есть дополнительные параметры
{ var password=sdf_default(_params.password,0);
  if (password==1) { type_='password'; }
  if (typeof(_params.control_mini)!='undefined')// если есть мини кнопки управления
  { count_=sdf_size_array(_params.control_mini);
    var it=0;
    var cmt='';
    while (it<count_)
    { cmt+='<span onclick="'+_params.control_mini[it]['onclick']+'" ';
      cmt+='title="'+_params.control_mini[it]['hint']+'">';
      cmt+=_params.control_mini[it]['title']+'</span>';
      it++;
    }
    if (cmt!='')
    { cm='<div class="sd_panel_button_mini">'+cmt+'</div>';
    }
  }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
  onkeyup=sdf_default(_params.onkeyup,'');
  if (onkeyup!='') { onkeyup=' onkeyup="'+onkeyup+'"'; }
}
var r='';
var value=sdf_default(_value,'');
r+='<tr'+tr_id+'><td class="sd_form_row_desc">'+_description+'</td><td class="sd_form_row_value"><input type="'+type_+'" class="sd_input_str" name="'+_name+'" value="'+value+'"'+onkeyup+' />'+cm+'</td></tr>';
return r;
}// /sdf_form_input_str
// _____________________________________________________________________________
function sdf_form_input_str_area(_name,_value,_description,_params)
// Выполняет: вывод textarea(input) на форме
{
var onkeyup='';
var tr_id='';
if (typeof(_params)!='undefined')
{ onkeyup=sdf_default(_params.onkeyup,'');
  if (onkeyup!='') { onkeyup=' onkeyup="'+onkeyup+'"'; }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
}
var r='';
var value=sdf_default(_value,'');
r+='<tr'+tr_id+'><td class="sd_form_row_desc">'+_description+'</td><td class="sd_form_row_value"><textarea name="'+_name+'" class="sd_input_str_area"'+onkeyup+'>'+value+'</textarea></td></tr>';
return r;
}// /sdf_form_input_str_area
// _____________________________________________________________________________
function sdf_form_input_str_area_big(_name,_value,_description,_params)
// Выполняет: вывод большого textarea на форме
{
var height=200;
var cm='';// cm=control_mini
var onkeyup='';
var tr_id='';
var readonly='';
var readonly_class='';
if (typeof(_params)!='undefined')
{ height=sdf_default(_params.height,200);
  if (typeof(_params.control_mini)!='undefined')// если есть мини кнопки управления
  { count_=sdf_size_array(_params.control_mini);
    var it=0;
    var cmt='';
    while (it<count_)
    { cmt+='<span onclick="'+_params.control_mini[it]['onclick']+'" ';
      cmt+='title="'+_params.control_mini[it]['hint']+'">';
      cmt+=_params.control_mini[it]['title']+'</span>';
      it++;
    }
    if (cmt!='')
    { cm='<div class="sd_panel_button_mini">'+cmt+'</div>';
    }
  }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
  onkeyup=sdf_default(_params.onkeyup,'');
  if (onkeyup!='') { onkeyup=' onkeyup="'+onkeyup+'"'; }
  if (typeof(_params.readonly)!='undefined')// если есть мини кнопки управления
  { if (_params.readonly==1)
    { readonly=' readonly="readonly"';
      readonly_class=' sd_readonly';
    }
  }
}
var r='';
var value=sdf_default(_value,'');
r+='<tr'+tr_id+'><td colspan="2">';
r+='<div class="sd_center"><strong>'+_description+'</strong></div>';
r+='<textarea name="'+_name+'" class="sd_textarea_str_area_big'+readonly_class+'" style="height:'+height+'px !important;"'+onkeyup+readonly+'>'+value+'</textarea>'+cm;
r+='</td></tr>';
return r;
}// /sdf_form_input_str_area_big
// _____________________________________________________________________________
function sdf_form_str_area_control(_obj_name)
// Выполняет: формирование панели управления для редактирования текста
{
r='';
r+='<div class="sd_form_str_area_control">';
r+='<span class="sdec bi_text_b" title="Жирный текст (ALT+1)" onclick="'+_obj_name+'.text_correct(1);"></span>';
r+='<span class="sdec bi_text_i" title="Наклонный текст (ALT+2)" onclick="'+_obj_name+'.text_correct(2);"></span>';
r+='<span class="sdec bi_text_u" title="Подчеркнутый текст (ALT+3)" onclick="'+_obj_name+'.text_correct(3);"></span>';
r+='<span class="sdec bi_text_s" title="Зачеркнутый текст (ALT+4)" onclick="'+_obj_name+'.text_correct(4);"></span>';
r+='<span class="sdec bi_text_sub" title="Нижний текст (ALT+5)" onclick="'+_obj_name+'.text_correct(5);"></span>';
r+='<span class="sdec bi_text_sup" title="Верхний текст (ALT+6)" onclick="'+_obj_name+'.text_correct(6);"></span>';
r+='</div>';
return r;
}// /sdf_form_str_area_control
// _____________________________________________________________________________
function sdf_form_info(_description,_value)
// Выполняет:
{
var r='';
r+='<tr><td class="sd_form_row_desc">'+_description+'</td><td class="sd_form_row_info">'+_value+'</td></tr>';
return r;
}// /sdf_form_info
// _____________________________________________________________________________
function sdf_form_select(_params)
// Выполняет: формирование select на основе входящих параметров
{
var onchange=sdf_default(_params.onchange,'');
if (onchange!='') { onchange=' onchange="'+onchange+'"'; }
var class_=sdf_default(_params.class_,'');
if (class_!='') { class_=' class="'+class_+'"'; }
var style_=sdf_default(_params.style_,'');
if (style_!='') { style_=' style_="'+style_+'"'; }
var default_=sdf_default(_params.default_,0);
var sel='';
var count_=sdf_size_array(_params.data);
var r='';
r+='<select name="'+_params.name_+'"'+onchange+class_+style_+'>';
if (count_==0) { r+='<option value="0" selected="selected">Нет значений</option>'; }
for(it=0;it<count_;it++)
{ sel='';
  value_=''
  if (typeof(_params.data[it].value)=='undefined')
  { alert('Не верное значение: data['+it+']=undefined');
    r+='<option value="">ERROR Value!</option>';
    continue;
  }
  else
  { value_=_params.data[it].value;
  }
  if (value_==default_)
  { sel=' selected="selected"';
  }
  r+='<option value="'+_params.data[it].value+'"'+sel+'>'+_params.data[it].title+'</option>';
}// /for
r+='</select>';
return r;
}// /sdf_form_select
// _____________________________________________________________________________
function sdf_form_edit_input_str(_name,_value,_description,_params)
// Выполняет: 
{
var type_='text';
var cm='';// cm=control_mini
var tr_id='';
if (typeof(_params)!='undefined')// если есть дополнительные параметры
{ var password=sdf_default(_params.password,0);
  if (password==1) { type_='password'; }
  if (typeof(_params.control_mini)!='undefined')// если есть мини кнопки управления
  { count_=sdf_size_array(_params.control_mini);
    var it=0;
    var cmt='';
    while (it<count_)
    { cmt+='<span onclick="'+_params.control_mini[it]['onclick']+'" ';
      cmt+='title="'+_params.control_mini[it]['hint']+'">';
      cmt+=_params.control_mini[it]['title']+'</span>';
      it++;
    }
    if (cmt!='')
    { cm='<div class="sd_panel_button_mini">'+cmt+'</div>';
    }
  }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
}
var r='';
var value=sdf_default(_value,'');
r+='<div class="sd_form_edit_line"'+tr_id+'>';
r+='<div class="sd_form_edit_title">'+_description+'</div>';
r+='<div class="sd_form_edit_value"><input type="'+type_+'" class="sd_input_str" name="'+_name+'" value="'+value+'" />'+cm+'</div>';
r+='</div>';
return r;
}// /sdf_form_edit_input_str
// _____________________________________________________________________________
function sdf_form_edit_input_str_area(_name,_value,_description,_params)
{
var onkeyup='';
var tr_id='';
if (typeof(_params)!='undefined')
{ onkeyup=sdf_default(_params.onkeyup,'');
  if (onkeyup!='') { onkeyup=' onkeyup="'+onkeyup+'"'; }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
}
var r='';
var value=sdf_default(_value,'');
r+='<div class="sd_form_edit_line"'+tr_id+'><div class="sd_form_edit_title">'+_description+'</div><div class="sd_form_edit_value"><textarea name="'+_name+'" class="sd_input_str_area1"'+onkeyup+'>'+value+'</textarea></div></div>';
return r;
}// /sdf_form_edit_input_str_area
// _____________________________________________________________________________
function sdf_form_edit_input_str_area_big(_name,_value,_description,_params)
// Выполняет: 
{
var height=200;
var cm='';// cm=control_mini
var onkeyup='';
var tr_id='';
var readonly='';
var readonly_class='';
if (typeof(_params)!='undefined')
{ height=sdf_default(_params.height,200);
  if (typeof(_params.control_mini)!='undefined')// если есть мини кнопки управления
  { count_=sdf_size_array(_params.control_mini);
    var it=0;
    var cmt='';
    while (it<count_)
    { cmt+='<span onclick="'+_params.control_mini[it]['onclick']+'" ';
      cmt+='title="'+_params.control_mini[it]['hint']+'">';
      cmt+=_params.control_mini[it]['title']+'</span>';
      it++;
    }
    if (cmt!='')
    { cm='<div class="sd_panel_button_mini">'+cmt+'</div>';
    }
  }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
  onkeyup=sdf_default(_params.onkeyup,'');
  if (onkeyup!='') { onkeyup=' onkeyup="'+onkeyup+'"'; }
  if (typeof(_params.readonly)!='undefined')// если есть мини кнопки управления
  { if (_params.readonly==1)
    { readonly=' readonly="readonly"';
      readonly_class=' sd_readonly';
    }
  }
}
var r='';
var value=sdf_default(_value,'');
r+='<div class="sd_form_edit_line"'+tr_id+'>';
r+='<div class="sd_center"><strong>'+_description+'</strong></div>';
r+='<textarea name="'+_name+'" class="sd_textarea_str_area_big1'+readonly_class+'" style="height:'+height+'px !important;"'+onkeyup+readonly+'>'+value+'</textarea>'+cm;
r+='</div>';
return r;
}// /sdf_form_edit_input_str_area_big
// _____________________________________________________________________________
function sdf_form_edit_input_int(_name,_value,_description,_params)
// Выполняет: выводит строку ввода для цифр
{
var tr_id='';
if (typeof(_params)!='undefined')
{ tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
}
var r='';
var value=sdf_default(_value,0);
r+='<div class="sd_form_edit_line"'+tr_id+'><div class="sd_form_edit_title">'+_description+'</div><div class="sd_form_edit_value"><input type="text" class="sd_input_int" name="'+_name+'" value="'+value+'" /></div></div>';
return r;
}// /sdf_form_input_int
// _____________________________________________________________________________
function sdf_form_edit_info_int(_description,_value)
// Выполняет:
{
var r='';
r+='<div class="sd_form_edit_line"><div class="sd_form_edit_title">'+_description+'</div><div class="sd_form_edit_value">'+_value+'</div></div>';
return r;
}// /sdf_form_edit_info_int
// _____________________________________________________________________________
function sdf_form_edit_checkbox(_name,_value,_title,_params)
{
var click_='';
var tr_id='';
if (typeof(_params)!='undefined')
{ var cl=sdf_default(_params.onclick,'');
  if (cl!='') { click_=' onclick="'+cl+'"'; }
  tr_id=sdf_default(_params.tr_id,'');
  if (tr_id!='') { tr_id=' id="'+tr_id+'"'; }
}
var value=sdf_default(_value,0);
var ch='';
if (value==1) { ch=' checked="checked"'; }
r='';
r+='<div class="sd_form_edit_line"'+tr_id+'>';
r+='<div class="sd_form_edit_title">'+_title+'</div>';
r+='<div class="sd_form_row_value" title="Галочка - функция включена"><input type="checkbox" name="'+_name+'"'+ch+click_+' /></div>';
r+='</div>';
return r;
}// /sdf_form_edit_checkbox
// _____________________________________________________________________________
function sdf_hurl_check(_params)
// Выполняет: преобразование строки в маленькие буквы и без пробелов, специально для ЧПУ
{
var ss='';
var p={};// p=params
p.obj_name='hurl';
var par=sdf_default(_params,0);
if (par!=0)
{ ss=sdf_default(_params.obj_name,'');
  if (ss!='') { p.obj_name=ss; }
}
var r=$('input[name="'+p.obj_name+'"]').val();
r=r.toLowerCase();// преобразуем строку в нижний регистр
r=r.replace(' ','_');// пробелы заменяем на системные пробелы
r=r.replace('__','_');// двойные системные пробелы заменяем на один системный пробел
$('input[name="'+p.obj_name+'"]').val(r);// переписать значение
}// /sdf_hurl_check
// _____________________________________________________________________________
function sdf_keywords_len_check(_params)
// Выполняет: отображение длину ключевых слов
// _params - параметры вызова функции
{
var ss='';
var p={};// p=params
p.obj_name='keywords';
var par=sdf_default(_params,0);
if (par!=0)
{ ss=sdf_default(_params.obj_name,'');
  if (ss!='') { p.obj_name=ss; }
}
var s=$('textarea[name="'+p.obj_name+'"]').val();
s=s.toLowerCase();// преобразуем строку в нижний регистр
$('textarea[name="'+p.obj_name+'"]').val(s);// переписать значение
var l=s.length;
var obj='#keywords_len';
$(obj).html('['+l+']');// показываем сколько
$(obj).removeClass();// убираем все классы у объекта
if (l<10) { $(obj).addClass('sd_len_stop'); }// если размер ключевых слов меньше минимума то показываем критический класс
if (l>=10) { $(obj).addClass('sd_len_normal'); }// то размер ключевиков приемлемый то и показываем соответственно
}// /sdf_keywords_len_check
// _____________________________________________________________________________
function sdf_description_len_check(_params)
// Выполняет: отображение описание статей
// _params - параметры вызова функции
{
var ss='';
var p={};// p=params
p.obj_name='description';
var par=sdf_default(_params,0);
if (par!=0)
{ ss=sdf_default(_params.obj_name,'');
  if (ss!='') { p.obj_name=ss; }
}
var s=$('textarea[name="'+p.obj_name+'"]').val();
var l=s.length;
var obj='#description_len';
$(obj).html('['+l+']');// показываем сколько
$(obj).removeClass();// убираем все классы у объекта
if (l<80) { $(obj).addClass('sd_len_warning'); }// если размер ключевых слов меньше минимума то показываем критический класс
if (l>=80) { $(obj).addClass('sd_len_normal'); }// то размер ключевиков приемлемый то и показываем соответственно
}// /sdf_description_len_check
// _____________________________________________________________________________
function sdf_text_len_check(_params)
// Выполняет: отображение  и проверяем длину основного текста
// _params - параметры вызова функции
{
var ss='';
var p={};// p=params
p.obj_name='text_';
var par=sdf_default(_params,0);
if (par!=0)
{ ss=sdf_default(_params.obj_name,'');
  if (ss!='') { p.obj_name=ss; }
}
var s=$('textarea[name="'+p.obj_name+'"]').val();
var l=s.length;
var obj='#text_len';
$(obj).html('['+l+']');// показываем сколько
$(obj).removeClass();// убираем все классы у объекта
if (l<1000) { $(obj).addClass('sd_len_stop'); }// если размер статьи меньше минимума то показываем критический класс
if ((l>=1000) && (l<5000)) { $(obj).addClass('sd_len_warning'); }// если размер статьи меньше рекомендуемого то информируем об этом
if ((l>=5000) && (l<=20000)) { $(obj).addClass('sd_len_normal'); }// показываем приемлемый размер
if (l>20000) { $(obj).addClass('sd_len_cool'); }// то размер статьи более чем достаточный то показываем КРУТО!
}// /sdf_text_len_check
// _____________________________________________________________________________
function sdf_control_log(_log,_div_processing_control)
// Выполняет: ведение лог при больших операциях
{
if (_log=='') { return; }
var div_processing_control=sdf_default(_div_processing_control,'sd_processing_control');

$('#'+div_processing_control).append('<div>'+_log+'</div>');
}// /sdf_control_log
// _____________________________________________________________________________
function sdf_help_form(_url,_keyword)
{
var r='';
var url=sdf_default(_url,'/');
r+='<div id="sd_help" onclick="sdf_help(\''+url+'\',\''+_keyword+'\');" title="Вызвать справку">';
r+='<h2>Справка</h2>';
r+='</div>';
return r;
}// /sdf_help_form
// _____________________________________________________________________________
function sdf_help(_url,_keyword)
// Выполняет: подгрузку help информации
{
var url=sdf_default(_url,'/');
var i=sdf_ajax(_url,{ 'mode':'sd_help', 'keyword_': _keyword });// отправка ajax запроса
var r='';
r+='<h2>Справка</h2>';
r+='<div class="sd_help_text">';
r+=i.data.help;
r+='</div>';
$('#sd_help').html(r);
// if (i.data.refresh_==1) { sdf_goto(url); }// если требуется обновление страницы, то делаем редирект на главную
}// /sdf_help
// _____________________________________________________________________________
function sdf_file_upload(_params)
// Выполняет: вызов диалогового окна
// url - 
// div_main - div основной, где все расположено
// div_control_id - div для управления
// register - реестр в который будет загружаться файл
// doc_id - id документа с которым работает скрипт / документ
// function_return - имя функции, которая вызывается по завершению процесса заливки
{
var func=(typeof(_params.function_return)!='undefined')?_params.function_return:'';
var url=(typeof(_params.url)!='undefined')?_params.url:'/';
var doc_id=(typeof(_params.doc_id)!='undefined')?_params.doc_id:0;
var r='';
//r+='<div id="sd_file_upload_'+_params.div_main+'" style="position:absolute; z-index:10000; display:block; top:0px; left:0px;">';
r+='<form target="sd_frame_file_upload_'+_params.div_main+'" id="sd_form_file_upload_'+_params.div_main+'" method="post" enctype="multipart/form-data" action="'+url+'">';
r+='<input type="hidden" name="sd_file_upload_mark" value="1" />';
r+='<input type="hidden" name="command" value="'+_params.command+'" />';
r+='<input type="hidden" name="doc_id" value="'+doc_id+'" />';
r+='<input type="file" name="file_name" style="cursor:pointer;" onchange="sdf_file_upload_change(\''+_params.div_main+'\',\''+func+'\');" />';
r+='<input type="submit" value="Загрузить"/>';
r+='</form>';
// r+='</div>';
r+='<iframe name="sd_frame_file_upload_'+_params.div_main+'" id="sd_frame_file_upload_'+_params.div_main+'" style="display:none;"></iframe>';
if ($('#'+_params.div_control_id).length) { $('#'+_params.div_control_id).html(r); } else { alert('Object load ['+_params.div_control_id+'] file not found'); return; };
$('#'+_params.div_control_id).css('opacity',0);
bX=-140; bY=-10;
// bX=0; bY=0;
var b=$.browser;
switch(b)
{ case('mozilla'): { }
  case('opera'): { }
}
var obj_width=$('#'+_params.div_main).width();
var obj_height=$('#'+_params.div_main).height();
var s='';
$('#'+_params.div_main).mousemove(function(e)
{ var obj_pos_main=$('#'+_params.div_main).offset();
  var x=e.pageX-obj_pos_main.left+bX;// текущие координаты - смещение + браузерное смещение
  if (x>obj_width) { x=obj_width; }
  var y=e.pageY-obj_pos_main.top+bY;// текущие координаты - смещение + браузерное смещение
  if (y>obj_height) { y=obj_height; }
  $('#'+_params.div_control_id).css('left',x);
  $('#'+_params.div_control_id).css('top',y);
});
}// /sdf_file_upload
// _____________________________________________________________________________
function sdf_file_upload_change(_div,_function)
// Выполняет: отправка данных
{
var func=(typeof(_function)!='undefined')?_function:'';
if (func!='')
{ timer_index=setInterval('sdf_file_upload_status(\''+_div+'\',\''+func+'\')',200);// опрашивать статус загрузки каждую 0.1 секунду
}
else
{ timer_index=setInterval('sdf_file_upload_status(\''+_div+'\')',200);// опрашивать статус загрузки каждую 0.1 секунду
}
document.getElementById('sd_form_file_upload_'+_div).submit();// находим указанный элемент
}// /sdf_file_upload_change
// _____________________________________________________________________________
function sdf_file_upload_status(_div,_function)
// Выполняет: отправка данных
{
var frames=document.getElementById('sd_frame_file_upload_'+_div);
if (frames==null) { return; }
if (frames.contentWindow.document.getElementById('error')!=null)
{ var error=frames.contentWindow.document.getElementById('error').innerHTML;
  var log_=frames.contentWindow.document.getElementById('log_').innerHTML;
  if (error!='0') { sdf_alert(log_); }
  clearInterval(timer_index);
//  alert(frames.contentWindow.document.body.innerHTML);
  frames.contentWindow.document.body.innerHTML='';
  var func=(typeof(_function)!='undefined')?_function:'';
  if (func!='') { setTimeout(func,0); }
}// /if
}// sdf_file_upload_status
// _____________________________________________________________________________
function sdf_liveinternet()
// Выполняет: сбор статистики liveinternet
{
document.write('<img src="http://counter.yadro.ru/hit?t14.11;r'+
escape(document.referrer)+((typeof(screen)=='undefined')?'':';s'+
screen.width+'*'+screen.height+'*'+(screen.colorDepth?screen.colorDepth:screen.pixelDepth))+';u'+
escape(document.URL)+';'+Math.random()+'" alt="" width="0" height="0" />');
}// /sdf_liveinternet
// _____________________________________________________________________________
function sdf_helper_input_in(_object,_params)
// Выполняет: Стираем подсказки с input и работает как обычный ввод
{
var password=sdf_default(_params.password,0);
if (_object.value!=_params.default_) { return; }
_object.value='';
if (password==1) { _object.type='password'; }
}// /sdf_helper_input_in
// _____________________________________________________________________________
function sdf_helper_input_out(_object,_params)
// Выполняет: при потере фокуса формирование необходимых значений в input
{
var password=sdf_default(_params.password,0);
if ((_object.value=='')||(_object.value==_params.default_))
{ _object.value=_params.default_;
  if (password==1) { _object.type='text'; }
}
return;
}// /sdf_helper_input_out
// _____________________________________________________________________________
function sdf_user_logon()
// Выполняет: Вход пользователя (вызов формы)
{
sdf_script_loader(sdd_url_control+'js/!sd/modules/user_logon_sdo.js');// загружаем скрипт
sd_logon=new sdo_user_logon();
sd_logon.form_path_images=sdd_url_control+'images/form/';
sd_logon.url_sender=sdd_url_control;
sd_logon.form_logon();
}// /sdf_user_logon
// _____________________________________________________________________________
function sdf_user_registration()
// Выполняет: Вход пользователя (вызов формы)
{
sdf_script_loader(sdd_url_control+'js/!sd/modules/user_registration_sdo.js');// загружаем скрипт
sd_registration=new sdo_user_registration();
sd_registration.form_path_images=sdd_url_control+'images/form/';
sd_registration.url_sender=sdd_url_control;
sd_registration.form_registration();
}// /sdf_user_registration
// _____________________________________________________________________________
function sdf_user_exit()
// Выполняет: выход из личного кабинета
{
if (!sdf_confirm('Вы действительно хотите выйти из приватной зоны')) { return; }// подтверждающий запрос
var i=sdf_ajax(sdd_url_control,{ 'mode':'exit' });// отправка ajax запроса
sdf_goto(sdd_url_control);
}// /sdf_user_exit
// _____________________________________________________________________________
function sdf_text_info_standart(_text,_value)
{
var r='';
r+='<div class="sd_line_text">';
r+='<div class="sd_line_text_info">'+_text+'</div>';
r+='<div class="sd_line_text_value">'+_value+'</div>';
r+='</div>';
return r;
}// sdf_text_info_stadart
// _____________________________________________________________________________
function sdf_even_tr(_number_line)
// Выполняет: возвращение класса для четкой и не четной строки
{
var r='sd_line_even';
if (_number_line%2!=0) { r='sd_line_odd'; }
return r;
}// /sdf_even_tr
// _____________________________________________________________________________
function sdf_feedback_ok()
// Выполняет: подтверждение сообщения для обратной связи
{
var theme=$('input[name="theme"]').val();
if (theme=='') { sdf_alert('Укажите обязательно тему для общения'); sdf_focus('theme'); return; }
var name_=$('input[name="name_"]').val();
if (name_=='') { sdf_alert('Укажите обязательно свое имя'); sdf_focus('name_'); return; }
var contacts=$('input[name="contacts"]').val();
if (contacts=='') { sdf_alert('Укажите обязательно хотя бы один контакт'); sdf_focus('contacts'); return; }
var text_=$('textarea[name="text_"]').val();
if (text_=='') { sdf_alert('А Хде текст заявки? О чем речь то?'); sdf_focus('text_'); return; }
var p={};// p=params
p.mode='sd_feedback';
p.theme=theme;
p.name_=name_;
p.contacts=contacts;
p.text_=text_;
var i=sdf_ajax('/',p);
if (i.correct==1)
{ sdf_alert('Ваша заявка принята к рассмотрению. В ближайшее время мы с вами свяжемся.')
  $('#sd_feedback').html('');
}
}// /sdf_feedback_ok
// _____________________________________________________________________________
function sdo_grid_disabled()
// Выполняет: 
{
this.disabled=0;// по умолчанию запись НЕ отключена
this.hint_enabled='Запись активна. Отключить?';// hint по умолчанию
this.hint_disabled='Запись выключена. Включить?';
this.class_enabled='bi_enabled';// применяемый класс по умолчанию
this.class_control='sdec_grid_control';//
this.object_name='';// объект по умолчанию
this.func='record_disabled';// вызываемая функция по умолчанию
this.record_id=0;// отключаемая запись по умолчанию
// _____________________________________________________________________________
this.control_disabled=function()
// Выполняет: вывод объекта
{
this.class_enabled='bi_enabled';// применяемый класс по умолчанию
var hint=this.hint_enabled;
if (this.disabled==1)// если запись отключена
{ this.class_enabled='bi_disabled';
  hint=this.hint_disabled;
}
return '<td class="'+this.class_control+'"><span class="sdec '+this.class_enabled+'" onclick="'+this.object_name+'.'+this.func+'('+this.record_id+')" title="'+hint+'"></span></td>';
}// /control_disable
// _____________________________________________________________________________
this.control_disabled_s=function(_id,_disabled)
// Выполняет: короткий вызов отключения
{
this.record_id=_id;
this.disabled=_disabled;
return this.control_disabled();
}// /control_disabled_s
}// /sdo_grid_disabled
