// **************************************************
// Project: SD Core (JS)
// Module: SD Standart
// Date create: August 2008 year
// Date last change: January 2009 year
// Author: Beglec
// **************************************************
// Функции подходящие для любого проекта
// **************************************************
// переход на указанную страницу
// _link - указанная страница / html ссылка
function goto(_link) { document.location=_link; }
// **************************************************
// объект в виде "+" и "-"
// _obj_show - имя объекта показывает, который требуется показать
// _obj_hide - имя объекта скрывает, который требуется скрыть
function show_hide(_obj_show,_obj_hide)
{
document.getElementById(_obj_show).style.display='block';// показываем нужный блок
document.getElementById(_obj_hide).style.display='none';// скрываем указанный блок
return false;// возвращение результата // false - не переходить по ссылке если что
}
// **************************************************
// эффект появления объекта
// _obj_name - назе объекта 
// _effect - споэффекта появления
// _time - время на весь эффект
function sd_effect(_obj_name,_effect,_time)
{
var count_step=10;// кол-во шагов
var effect=_effect||1;// способ эффекта
switch(effect)
{ case 1:// разрешено вводить все, что угодно
  { o=document.getElementById(_obj_name);
//    if (!o.style.opacity) { o.style.opacity=0; }
    var opacity=Array();
    opacity[_obj_name]=o.style.opacity*100;// узнаем текущую прозрачность
    opacity[_obj_name]=opacity[_obj_name]+(100/count_step);
    if (opacity[_obj_name]>100) { opacity[_obj_name]=100; }
    o.style.opacity=opacity[_obj_name]/100;
    o.style.filter='alpha(opacity='+opacity[_obj_name]+')';
    if (opacity[_obj_name]>=100) { return; }
    t=_time/count_step;
    setTimeout('sd_effect(\''+_obj_name+'\','+_effect+','+_time+')',t);
    break;
  }
}
return;
}

// **************************************************
// функция выводит email адрес с защитой от сканирования спамеров
// _mail - сам почтовый ящик, до разделителя @
// _server - сам mx почтовый сервер
// _name - название почтового ящика, то есть как будет отображаться
function f_email_show(_mail,_server,_name)
{
name=_name||'';
r=_mail+'@'+_server;// формируем правильный email
n=r;
if (name!='') { n=name; }// если указано как отобращать email? то так и будет отображать
document.write('<a href="mailto:'+r+'">'+n+'</a>');// выводим информацию
}
// правильно формирует и маскирует email но для картинки
// пример: email_image('<img src="images/contact.gif" alt="Контакт" align="absmiddle" title="Написать письмо" border="0">','sd_company','mail.ru',1));
function email_image(_image,_user,_mix,_f)
{
if (_f==0)// если используется напрямую
{ document.write('<a href="mailto:'+_user+'@'+_mix+'">'+_image+'</a>'); }
else // если используется в нутри скрипта
{ s='<a href="mailto:'+_user+'@'+_mix+'">'+_image+'</a>';
  return s;// возвращение результата
}
}

// **************************************************
// функция проверять значение объекта на корректность ввода email адреса
// _name - имя объекта input
function f_email_check(_name,_required)
{
required=_required||0;// требуется ли обязательный ввод, по умолчанию нет
r=true;// по умолчанию email введен корректно
value='';// значение по умолчанию.
i=document.getElementById(_name);// сократить вызов, для удобства
if (i!=null)// если такого объекта нет, то
{ if (i.value!='')// если в указанном поле, объекте что то введено
  { // проверка на корректность email адреса
    // не верно введен
   alert('Email введен');
   r=true;// или false
  }
}
if ((_required)&&(value==''))// если ввод email обязательно, и ничего не введено, то
{ r=false;// email введен не верно.
  alert();
}
return r;// возвращаем результатат
}
// **************************************************
// функция вывода информации, реализована для сокращения текта и быстроты написания кода, а также совместимость вызова с PHP
// _obj_name - название объекта
// _text - текст вывода
function echo(_obj_name,_text,_info)
{
info=_info||0;
o=document.getElementById(_obj_name);
if (o)
{ document.getElementById(_obj_name).innerHTML=_text;
}
else
{ if (info) { alert('Нет объекта '+_obj_name); }// Если требуется специальное информирование о том, что нет объекта
}
return;
// $(_obj_name).html(_text);// тоже самое на jquery
}
// **************************************************
// функция вывода информации, реализована для сокращения текта и быстроты написания кода, используется метод write
// а также для совмещения вызова с PHP
// _text - текст вывода
function echo1(_text)
{ document.write(_text); return;
}
// **************************************************
// функция переводит фукус на нужный объект
// _obj_name - название объекта ввода, на который требуется перевести фокус ввода, как правило объект input
var sd_backcolor='';
function f_focus(_obj_name,_vis)
{
var vis=_vis||0;
if (_vis==1)
{ document.getElementById(_obj_name).style.backgroundColor=sd_color_back;
  document.getElementById(_obj_name).focus();
  return;
}
sd_color_back=document.getElementById(_obj_name).style.backgroundColor;
document.getElementById(_obj_name).style.backgroundColor='#FF0000';
document.getElementById(_obj_name).focus();
text='f_focus(\''+_obj_name+'\',1)';
setTimeout(text,300);
return;
}
// **************************************************
// функция прописывающая заголовки на странице
// _name - название страницы, также заменяет тэг <title>
// _rem - дополнительный комментарий к заголовку
function f_title(_name,_rem)
{
name=_name||'Нет заголовка';// заголовок, либо значение по умолчанию
rem=_rem||'Нет комментария';// комментарий к заголовку, либо значение по умолчанию
document.title=name;// изменить загловок HTML страницы
i=document.getElementById("title_name");// находим тэг с указанным именем
if (i!=null) { i.innerHTML=name; }// если есть такой тэг, то изменяем заголовок страницы
i=document.getElementById("title_rem");// находим тэг с указанным именем
if (i!=null) { i.innerHTML=rem; }// если есть такой тэг, то изменяем комментарий страницы
return;// возвращение результата
}
// **************************************************
// функция подтверждения удаления на форме выделенных записей
// _form_name - название формы
function f_del(_form_name)
{
form=document.getElementById(_form_name);// находим указанный элемент
if (confirm('Вы действительно хотите удалить выделенные записи?'))// запросить подтверждение
{ form.submit();// вызвать метод submit на указанной форме
}
return false;// возвращаем false, чтобы на форме не сработал метод action
}
// **************************************************
function f_send_post(_action,_key,_value)
{
var form_new=document.createElement('form');
form_new.method='POST';
form_new.action=_action;
var input_new=document.createElement('input');
input_new.name=_key;
input_new.type='hidden';
input_new.value=_value;
form_new.appendChild(input_new);
document.getElementsByTagName('body')[0].appendChild(form_new);
// alert('key='+_key+' value='+_value);
form_new.submit();
return false;// возвразщаем всегда отрицательный ответ чтобы не переходить по ссылке
}
// **************************************************
/*function send(_form_name,_link)
{
with(document.getElementById(_form_name))
{ action=ptr_.href
      // Эмулируем нажатие кнопки submit в форме
      submit()
   }
}
function f_send_post(_form_name,_link)
{// Ищем указатель на форму 'send' по ее id
with(document.getElementById(_form_name))
{
      action=ptr_.href;// Устанавливаем куда будет переход, беря адрес из тега <a>
      // Эмулируем нажатие кнопки submit в форме
      submit()
   }
}*/
// **************************************************
// функция - отобращает кнопку удаления, так как надо, в едином стиле
// _form_name - название формы
function f_del_im(_form_name,_short,_path)
{
path=_path||'sd/images/buttons';
short_=_short||false;// true - сокращенный вариант, комментарий к кнопке удаления не будет показываться.
c=' onclick="f_del(\''+_form_name+'\')"';// сама js функция
echo1('<img src="'+path+'button_delete.png" alt="Удалить" title="Удалить выделенные записи" class="im_c"');// отобразить картинку
echo1(c+'>');// повесить соответствующий обработчик
if (!short_)// если показывается не короткий вариант
{ echo1(' <a href="javascript:void(0)" '+c+'>Удалить</a>');// отобразить картинку
}
}
// **************************************************
// функция подтверждения удаления на форме выделенных записей
// _form_name - название формы
function f_form_submit(_form_name)
{
form=document.getElementById(_form_name);// находим указанный элемент
form.submit();// вызвать метод submit на указанной форме
return false;// возвращаем false, чтобы на форме не сработал метод action
}
// **************************************************
// проверка полей на обязательный ввод
// _result - значение по умолчанию
// _obj_name - имя объекта для проверки
// _rem - комментарий в сообщении, чтобы было понятно что именно не введено
function required(_correct,_obj_name,_rem,_length)
{
var len=_length||0;// задается длина либо, по умолчанию свободно
if (!_correct) { return false; }// если форма уже не корректна, то дальнейшую проверку не имеет смысла проводить
i=document.getElementById(_obj_name).value.toString();// считываем данные с указанного объекта
if (i=='')// если нет значения в указанном поле
{ alert('Не указано поле для обязательного заполнения ['+_rem+']');// выдаем предупреждающее сообщение
  f_focus(_obj_name);// переключить фокус ввода, в нужное место, для удобства
  r=false;// возвращаем, что поле ввода не корректно
}
else// если значение указано
{ r=true;// возвращаем, что поле ввода корректно
}
// если ввод устраивает первоначальный критерий
if (r)
{ if (len!=0)// если требуется, проверка на длину ввода
  { if (i.length>len)// если текущая длина больше, чем разрешено
    { alert('Значение больше, чем положено. Максимум ['+len+'] символов');
      f_focus(_obj_name);// передаем туда фокус ввода
      r=false;// указываем что значение введено неверно
    }
  }
}
return r;// возвращение результата
}
// **************************************************
// ограничение ввода
// _event - событие
// _obj_name - название объекта
// _type - какой тип данных должен быть в поле
// ######## дополнительная информация по клавишам
// key8 - забой
// key9 - табуляция
// key46 - точка
// key - return / enter
// key - delete
// kry - обработка запятой
function f_check_field(_event,_obj_name,_type)
{ var k=_event.which;
// определяем совместимость так как в FF и IE разные объекты отвечают за клавиатуру
  key=k?_event.which:_event.keyCode;// определяем клавишу
  ret=true;// по умолчанию символ для ввода входит в заданные условия
  switch(_type)
  { case 1: { ret=true; break; }// разрешено вводить все, что угодно
    case 2: { ret=true; break; }// разрешено вводить все, что угодно
    case 3:// разрешено вводить, только цифры
    { ret=((key>=48)&&(key<=57)||(key==8)||(key==9)||(key==46)||((key>=35)&&(key<=40))||((key>=96)&&(key<=105)))?true:false;
      break;
    }
    case 30:// Ввод только цифры и точку
    { ret=((key>=48)&&(key<=57)||(key==8)||(key==9)||((key>=35)&&(key<=40)))?true:false;
      if (key==46)// если набрана точка
      { ret=true;// по умолчанию ввод корректен
        d=document.getElementById(_obj_name).value.toString();// считаем информацию из поля ввода
        t=d.indexOf(".");// ищем точку
        if (t>=0) { ret=false; }// если точка уже есть, то значит вторую выводить не стоит, значит ввод не корректен
      }
      break;
    }
    case 31:// Ввод только цифры и отрицательного числа
    { ret=((key>=48)&&(key<=57)||(key==8)||(key==9)||((key>=35)&&(key<=40)))?true:false;
      if (key==45)// если знак минус
      { d=document.getElementById(_obj_name).value.toString();// считаем информацию из поля ввода
        t=d.indexOf("-");// ищем минус
        if (t<0) { document.getElementById(_obj_name).value='-'+d; }// если знака нет, то ставим его в начало
        ret=false;// специально возвращаем не корректность, так как минус уже поставлен в начало строки
      }
      break;
    }
    case 32:// Ввод только цифры и отрицательного числа и точка
    { ret=((key>=48)&&(key<=57)||(key==45)||(key==8)||(key==9)||((key>=35)&&(key<=40)))?true:false;
      if (key==46)// если набрана точка
      { ret=true;// по умолчанию ввод корректен
        d=document.getElementById(_obj_name).value.toString();// считаем информацию из поля ввода
        t=d.indexOf(".");// ищем точку
        if (t>=0) { ret=false; }// если точка уже есть, то значит вторую выводить не стоит, значит ввод не корректен
      }
      if (key==45)// если знак минус
      { d=document.getElementById(_obj_name).value.toString();// считаем информацию из поля ввода
        t=d.indexOf("-");// ищем минус
        if (t<0) { document.getElementById(_obj_name).value='-'+d; }// если знака нет, то ставим его в начало
        ret=false;// специально возвращаем не корректность, так как минус уже поставлен в начало строки
      }
      break;
    }
  }
  return ret;
}
// **************************************************
// возвращает координаты указанного элемента r=get_pos(document.getElementById('name'))
// _obj_name - название объекта
function get_pos1(_obj_name)
{
var o=document.getElementById(_obj_name);
var left=o.offsetLeft;
var top=o.offsetTop;
var parent=o.offsetParent;
while(parent&&parent.tagName!="BODY")
{ left+=parent.offsetLeft;
  top+=parent.offsetTop;
  parent=parent.offsetParent;
}
var r=Array();
r.left=left;
r.top=top;
return r;
}
// **************************************************
// возвращает координаты указанного элемента r=get_pos(document.getElementById('name'))
// _obj_name - название объекта
function get_pos(_obj)
{
// o=document.getElementById(_obj_name);
var r={x: _obj.offsetLeft, y: _obj.offsetTop };// узнаем координаты, объекта
if (_obj.offsetParent)// если есть объект
{ var tmp=get_pos(_obj.offsetParent);// повторный запрос координат
  r.x+=tmp.x;// возвращаем координаты X
  r.y+=tmp.y;// возвращаем координаты Y
}
return r;// реально возвращаем координаты
/*
o=document.getElementById(_obj_name);
var left=o.offsetLeft;
var top=o.offsetTop;
for (var parent=o.offsetParent; parent; parent=parent.offsetParent)
{ left+=parent.offsetLeft-parent.scrollLeft;
  top+=parent.offsetTop-parent.scrollTop;
}
return {left: left, top:top, width:o.offsetWidth, height:o.offsetHeight};
*/
}
// **************************************************
// функция возвращает картинки и ссылки сразу же без тэгов <td>
// _name - название ссылки
// _link - ссылка
// _image - картинка
// _target - как открывать ссылку
// привести к единому формату совместно с php
function link_image(_name,_link,_image,_target,_short)
{
target=_target||'';// выставляем если что значение по умолчанию
short_=_short||false;// true - короткая ссылка
if (target!='') { target=' target="'+target+'"'; }// если способ открытия ссылки указан
var im='<img src="'+_image+'" alt="'+_name+'" title="'+_name+'" class="im_c">';
r=(_link!='')?'<a href="'+_link+'" '+target+'>'+im+'</a> ':im;
if (!short_) { r+='<a href="'+_link+'"'+target+'>'+_name+'</a>'; }
return r;// возвращаем результатат
}
// **************************************************
// срабатывает ссылка после подтверждения
function f_link_sq(_text,_link,_sq)
{
sq=_sq||0;// по умолчанию запроса дополнительного нет
if ((_text=='')&&(_link='')) { return false; }
if (sq)
{ if (confirm(_text))// запросить подтверждение
  { document.location.href=_link;// переходим по указанной ссылке
    return false;// если дошли до седова то переход по ссылке всегда запрещен
  }
}
else
{ // alert(_link);
  document.location=_link;// переходим по указанной ссылке
}
return false;// если дошли до седова то переход по ссылке всегда запрещен
}
// **************************************************
// функция подсветки объекта
// используется в основном на событиях типа onmouseover="f_td_active(this)" и onmouseout="f_td_deactive(this)"
// то есть при на веденеии на объект он изменяет цвет
// _obj_name - название объекта
// _color - цвет которые будет при наведении / выделении объекта
var sd_calc_color;
var sd_calc_color_bk;
function f_td_active(_obj_name,_color)
{
sd_calc_color_bk=_obj_name.style.backgroundColor;
sd_calc_color=_obj_name.style.color;
var col=_color||'FF0000';// задаем нужный цвет или по умолчанию
_obj_name.style.color=col;// изменяем у объекта цвет
_obj_name.style.backgroundColor='#FFFFFF';
}
// **************************************************
// деактивировать ячейки
// см выше f_td_active
// _obj_name - название объекта
// _color - цвет которые будет при потере фокуса ввода на объекта
function f_td_deactive(_obj_name)
{
_obj_name.style.color=sd_calc_color;// изменяем у объекта цвет
_obj_name.style.backgroundColor=sd_calc_color_bk;// задний фон
}
// **************************************************
// работаем со всеми check box на указанной форме
// _form_name - название формы
// _status - присвоить статус; 0 - все отменить. 1 - всем включить; 2 - поменять местами
function f_check_status(_form_name,_status)
{
var f=document.getElementById(_form_name);// делаем короткий объект для обращений к форме
for (i=1;i<=f.length;i++)// пройтись по всем элементам на HTML форме
{ if (f.elements[i-1].type=='checkbox')// если тип элемента checkbox, то
  { switch(_status)
    { case(0): { f.elements[i-1].checked=false; break; }// сбрасываем
      case(1): { f.elements[i-1].checked=true; break; }// устанавливаем
      case(2): { f.elements[i-1].checked=!f.elements[i-1].checked; break; }// меняемся местами
    }
  }
}
}
// **************************************************
// возащение пиксели к числу (75px=75)
// _value - значение 
function pix_to_int(_value)
{
var str=_value;// преобразовать к строке чтобы преобразовать
r=0;
if (typeof(str)=='number') { return parseInt(str); }
if (typeof(str)=='string')
{ str=str.replace('px','');// убрать текстовые символы, оставить только цифры
  str=str.replace('auto','0');// 
  r=parseInt(str);// парсируем в число
  return r;// возвраащаем результата
}
}
// аналог предыдущей версии, только в сокращенном виде
function pti(_value) { return pix_to_int(_value); }
// **************************************************
// возащение пиксели к числу (75px=75)
// _value - значение 
function f_mouse(e)
{
var r=Array();
if (!e) { e=window.event; }// совместимость с IE
r.x=e.clientX;
r.y=e.clientY;
return r;
}
// **************************************************
function random(_min,_max)
{
var min_=parseInt(_min)||0;
var max_=parseInt(_max)||1;
r=Math.floor(Math.random()*(max_-min_+1))+min_;
return r;
}
// **************************************************
// функция задает или перезаписывает свойства объекта A объекту B
function property_set(_obj_a,_obj_b)
{
for (var key in _obj_a)// пройтись по всем свойствам объекта
{ if (typeof(_obj_a[key])!='object')// если свойство не является объектом, то
  { _obj_b[key]=_obj_a[key];// присваиваем свойство объекту B
  }
  else// если свойство является дополнительным объектом
  { // в объекте B уже имеется такой объект, то корректировать его, иначе создаем новый экзепляр
    if (typeof(_obj_b[key])=='object') { vb=_obj_b[key]; } else { var vb={}; }
    property_set(_obj_a[key],vb);// рекрсивно вызываем сами себя прописываем все свойства 
    _obj_b[key]=vb;// возвращаем правильно прописанные функции.
    // такой оборот делает из-за изчесновения свойсв в случае если в объекте А они не указаны
  }
}
return;// заканчиваем процедуру корректно
}
// **************************************************
// служит для дебаг информации
// _text - текст отладочной информации
function debug(_text)
{
if (!$('#debug').length) { $('body').append('<div id="debug"></div>'); }
$('#debug').html(_text);
}
// **************************************************
// функция возвращает выделеный текст, если таковой имеется
// _obj_name - название объекта если что из которого брать выделение
function text_selected_get(_obj_name)
{
var s='';
// стандарт
if (window.getSelection)
{ s=window.getSelection();
  if (s=='')// если есть выделение, но выделение не на странице, где то в объекте ввода
  { var e=document.getElementById(_obj_name); s=e.value;// узнаем значение в объекте ввода
    if (s!='') { s=s.substring(e.selectionStart,e.selectionEnd); }// выбираем все что выделено в объекте ввода
  }
  return s;
}
// совместимость с IE
if (document.getSelection)
{ s=document.getSelection();
  return s;
}
// поддержка старых версий
if (document.selection)
{ s=document.selection.createRange().text;
  return s;// возвращаем результата
}
return s;// возвращаем результата
}
// **************************************************
function text_selected_insert(_obj_name,_text)
{
var area=document.getElementById(_obj_name);
if (document.selection)
{ document.selection.createRange().text=_text;
}
else
{ if (window.getSelection)
    area.value=area.value.substring(0,area.selectionStart)+_text+area.value.substring(area.selectionEnd,area.value.length);
  else
    area.value+=_text;
}
}
// **************************************************
// вставляет bb код в указанный объект
// _bb_code - bb код
// _obj_name - имя объекта (как правило input text) куда вставляет ии код
function tag_insert(_bb_code,_obj_name)
{
if (!$('#'+_obj_name).length) { alert('Object '+_obj_name+' of page not found'); return; }// если такого объекта не существует, то прекращаем работу функции
// $('#'+_obj_name).html('['+_bb_code+']'+text_selected_get(_obj_name)+'[/'+_bb_code+']');
text_selected_insert(_obj_name,'['+_bb_code+']'+text_selected_get(_obj_name)+'[/'+_bb_code+']');
}
// **************************************************
// отправка ajax запросов при помощи библиотеки jquery
// _link - ссылка для вызова запроса
// _params - параметры запроса
function sd_ajax(_link,_params)
{
var res;
$.ajax(
{ url: _link,
  type: 'POST',
  data: _params,
  dataType: 'json',
  async: false,
  success: function(data) { res=data; }
});
return res;
}
// **************************************************
// Формирует красивый заголовок для таблиц
// _title - текст заголовка
// _colspan - кол-во объеденяемых ячеек
// _height - явная высота заголовка
// _width_lr - ширрина изображения левого и правого
function fsd_th(_title)
{
echo1('<table style="width:100%;">');
echo1('<tr>');
echo1('<td class="bk_th_left"></td>');
echo1('<td class="bk_th_center" style="vertical-align:middle;">'+_title+'</td>');
echo1('<td class="bk_th_right"></td>');
echo1('</tr>');
echo1('</table>');
return;
}
// **************************************************
// Выводит в нужном формате, информацию о продуктах компании
// _name - название продукта
// _link - ссылка на подробное описание продукта
function products(_name,_link,_rem,_image)
{
var link_open, link_close;
var rem=_rem||'';
image=link_image(_name,_link,_image,'',1);
if (_link!='')
{ name='<a href="'+_link+'">'+_name+'</a>';
}
else
{ name='<b>'+_name+'</b>';
}
echo1('<tr>');
echo1('<td class="products_image">'+image+'</td>');
echo1('<td class="products_comment">'+name+'<br>'+rem+'</td>');
echo1('</tr>');
echo1('<tr class="pix"><td colspan="2"></td></tr>');
return;
}


