// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
// Javascript file for project: SD Core (JS)
// Project URL: any URL / projects
// Module: «Core» - ядро, основные и универсальные функции SD Core
// Author: Zerohold
// Site author script: www.sd-company.su
// Date create: May 2009 year
// Date last change: July 2011 year
// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
// mini help
// && - AND (и)
// || - OR (или)
// ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ
// функции конвертации
// ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ
// _____________________________________________________________________________
function sdf_FTS(_number,_decimal,_separator)
// Выполняет: сокращение переводится как Float To String
// _number - число любое, целое или дробное не важно
// _decimal - число знаков после запятой
// _separator - разделитель разрядов
{
// определяем, количество знаков после точки, по умолчанию выставляется 2 знака
var decimal=(typeof(_decimal)!='undefined')?_decimal:2;

// определяем, какой будет сепаратор [он же разделитель] между разрядами
var separator=(typeof(_separator)!='undefined')?_separator:'';

// преобразовываем входящий параметр к дробному числу, на всяк случай, если вдруг
// входящий параметр будет не корректным
var r=parseFloat(_number)

// так как в javascript нет функции для фиксации дробной части после точки
// то выполняем своеобразный fix
var exp10=Math.pow(10,decimal);// приводим к правильному множителю
r=Math.round(r*exp10)/exp10;// округляем до необходимого числа знаков после запятой

// преобразуем к строгому, фиксированному формату, так как в случае вывода целого числа
// нули отбрасываются не корректно, то есть целое число должно 
// отображаться 1.00, а не 1
rr=Number(r).toFixed(decimal).toString().split('.');

// разделяем разряды в больших числах, если это необходимо
// то есть, 1000 превращаем 1 000
b=rr[0].replace(/(\d{1,3}(?=(\d{3})+(?:\.\d|\b)))/g,"\$1"+separator);
r=b+'.'+rr[1];
return r;// возвращаем результат
}// /sdf_FTS
// _____________________________________________________________________________
function sdf_ITM(_number)
// Выполняет: Integer To Megabyte (_number/1024)
// _number - число
{
var r='';
return r;
}// /sdf_ITM
// _____________________________________________________________________________
function sdf_DTS(_date,_format)
// Выполняет: конвертацию Date To String
// Возвращает: дату в заданном формате
// _date - дата в UNIX формате (целое число) или в формате TIMESTAMP
// _format - требуемый формат вывода
{
var r='';
return r;
}// /sdf_DTS
// _____________________________________________________________________________
function sdf_week_day(_date,_first)
// Выполняет: определение дня недели на основе даты
// Возвращает день недели в русской кодировке
// _date - дата в UNIX формате
// _first - 1(true) Первая буква будет большой
{
var r='';
return r;
}// /sdf_week_day
// _____________________________________________________________________________
function sdf_month(_month,_p,_first)
// Выполняет: определение месяца на основе даты
// Возвращает: на русском языке название месяца на основе даты
// _month - номер месяца
// _p - падеж. 1 - Именительный, >1 Винительный
// _first - 1(true) Первая буква будет большой
{
var r='';
return r;
}// /sdf_month
// ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ
// функции строковые
// ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ
// _____________________________________________________________________________
function sdf_str_length(_string)
// Выполняет: определение размера строки
// Возвращает: длину строки
// _string - строка
{
return _string.length;
}// /sdf_str_length
// _____________________________________________________________________________
function sdf_str_pos(_string,_mask)
// Выполняет: поиск ПОДстроки в строке на основе масок
// Возвращает: true если в строке _string есть искомые слова _mask
// _string - строка, где требуется производить поиск
// _mask - перечень слов требующие для поиска, разделителем является |
{
var s=_string;
var r=0;// по умолчанию _mask не найдена
var m=s.indexOf(_mask);
if (m>=0) { r=m+1; }
return r;
}// /sdf_str_pos
// _____________________________________________________________________________
function sdf_str_replace(_string,_search,_replace,_mode,_word)
// Выполняет: замену подстроки в строке
// _string - строка в которой будет что-то изменяться
// _search - строка поиска
// _replace - строка замены
// _mode - режимы поиска i,g (i - регистро независимость, g - глобально)
// _word - резать по словам
{
var mode=(typeof(_mode)!='undefined')?_mode:'gim';// какие ключи используются
var word=(typeof(_word)!='undefined')?'w':'';
var search_=(word=='w')?'\\b'+_search+'\\b':_search;// если требуется искать только по границам слов
var reg=new RegExp(search_,mode);
var r=_string;
r=r.replace(reg,_replace);
return r;
}// /sdf_str_replace
// _____________________________________________________________________________
function sdf_str_copy(_string,_index,_count)
// Выполняет: копирование строки _string с позиции _index, _count символов
// Возвращает: скопированную строчку
// _string - текст который требуется обрезать
// _index - с какой позиции строки / текста вырезать
// _count - кол-во вырезаемых символов
{
var r='';
return r;
}// /sdf_str_copy
// _____________________________________________________________________________
function sdf_str_trim(_string)
// Выполняет: обрезание пробелов как справа, так и слева
// Возвращает: обработанную строчку
// _string - обрабатываемая строка
{
var r=_string;
r=r.replace(/(^\s+)|(\s+$)/g,"");// убираем пробелы по краям
r=r.replace(' ','');// убираем сразу и двойные пробелы
return r;
}// /sdf_str_trim
// ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ
// функции разные
// ШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШШ
// _____________________________________________________________________________
function sdf_size_array(_array)
// Выполняет: подсчет кол-ва элементов в массиве
// Возвращает: кол-во элементов в массиве
// _array - массив данных
{
var r=0;
if (typeof(_array)=='array') { r=_array.length; }// если передаваемый параметр является массивом, то применяем стандартную функцию
if (typeof(_array)=='object')// если передаваемый параметр является объектом, то применяет цикл в пересчете свойств
{ for (var key in _array) { r++; }// пройтись по всем свойствам объекта и читать их
}
return r;
}// /sdf_size_array
// _____________________________________________________________________________
function sdf_random(_max,_min)
// Выполняет: генерация случайного числа между _max и min (включая их)
// Возвращает: случайное число 
// _max - максимальное значение
// _min - минимальное значение
{
var max_=(typeof(_max)!='undefined')?parseInt(_max):1;
var min_=(typeof(_min)!='undefined')?parseInt(_min):0;
r=Math.floor(Math.random()*(max_-min_+1))+min_;
return r;
}// /sdf_random
// _____________________________________________________________________________
function sdf_term(_count_sec)
// Выполняет: пересчет секунд в дни, часы, минуты. Как правило это (сейчас - какая либо дата/время)
// _count_sec - передаем количество секунд которые требуется преобразовать
{
var r=0;
return r;
}// /sdf_term
// _____________________________________________________________________________
function sdf_password_new(_length,_digital,_lchar,_rchar)
// Выполняет: генерация пароля
// _legnth - длина пароля
// _digital - 1 разрешена генерация цифр в пароле
// _lchar - 1 разрешена генерация латинских букв в пароле
// _rchar - 1 разрешена генерация русский букв в пароле
{
var r='';
return r;
}// /sdf_password_new
// _____________________________________________________________________________
function sdf_plural(_number,_form1,_form2,_form5)
// Выполняет: склонение существительных с числительными, пример использования 
// 'В Вашем почтовом ящике _number '+sdf_plural(_number, 'письмо', 'письма', 'писем');
// _number - любое число
// _form1 - первая форма склонения
// _form2 - вторая форма склонения
// _form5 - третья форма склонения
{
var r='';
return r;
}// /sdf_plural
// _____________________________________________________________________________
function sdf_ru_to_lat(_text)
// Выполняет: перевод русского текста в латиницу
// _text - текст который требуется перевести в латиницу
{
var result='';
return result;
}// /sdf_ru_to_lat
// _____________________________________________________________________________
function sdf_url_check(_url)
// Выполняет: проверку правильности написания сайта
// _url - ссылка на сайт
{
var rg=/^(?:(?:https?|ftp|telnet):\/\/(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|org|mil|edu|arpa|ru|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:\/[a-z0-9.,_@%&?+=\~\/-]*)?(?:#[^ \'\"&<>]*)?$/i;
var r=rg.test(_url);
return r;
}// /sdf_url_check
// _____________________________________________________________________________
function sdf_email_check(_email)
// Выполняет: проверяет email на правиьность
// Возвращает: откорректированный email или ошибку
// _email - входная строка с указанием email адреса
// _required - true (1) - обязательное заполнение email
{
var email=_email;
email=email.replace(/^\s+|\s+$/g,'');// убираем любые пробелы
// по умолчанию email введен корректно
var r=(/^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i).test(email);
return r;
}// /sdf_email_check
// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
// Javascript file for project: SD Core (JS)
// Project URL: any URL / projects
// Module: «SD Standart function for javascript» - стандартный набор javascript функций для SD Core
// Author: Zerohold
// Site author script: www.sd-company.su
// Date create: June 2009 year
// Date last change: November 2010 year
// WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
// _____________________________________________________________________________
function sdf_default(_value,_default)
// Выполняет: 
{
var r=(typeof(_value)!='undefined')?_value:_default;
return r;
}// /sdf_default
// _____________________________________________________________________________
function sdf_alert(_text)
// Выполняет: показывает сообщение с указанным текстом
// _text - текст сообщения
{
alert(_text);
}// /sdf_alert
// _____________________________________________________________________________
function sdf_confirm(_text)
// Выполняет: вызов сообщение с указанным текстом
// _text - текст сообщения
{
var r=0;
if (confirm(_text)) { r=1; }
return r;
}// /sdf_confirm
// _____________________________________________________________________________
function sdf_input(_text,_default)
// Выполняет: диалог с вводом значения
// _text - текст сообщения
// _default - значение по умолчанию
{
var default_=sdf_default(_default,'');
var r=prompt(_text,default_);
return r;
}// /sdf_input
// _____________________________________________________________________________
function sdf_pti(_value)
// преобразует пиксели к числу (75px к 75), то есть тупо убирает символы из числа
{
var str=_value;// преобразовать к строке чтобы преобразовать
if (typeof(str)=='number') { return parseInt(str); }
if (typeof(str)!='string') { return 0; }
str=str.replace('px','');// убрать текстовые символы, оставить только цифры
str=str.replace('auto','0');//
return parseInt(str);
}// /sdf_pti
// _____________________________________________________________________________
function sdf_goto(_url,_window_new)
// Выполняет: переход на указанную страницу
// _window_new - 1 - открывается в новом окне
{
var w=sdf_default(_window_new,0);
if (w==1)
{ var r=window.open(_url);
  if (r===false) { alert('В вашем браузере заблокированы всплывающие окона. Для работы нужно отключен всплывающие окна для этого сайта.'); }
  return;
}
document.location=_url;// _url - указанная страница / html ссылка
}// /sdf_goto
// _____________________________________________________________________________
function sdf_email_show(_mail,_server,_name)
// Выполняет: вывод email адрес с защитой от сканирования спамеров
// _mail - сам почтовый ящик, до разделителя @
// _server - сам mx почтовый сервер
// _name - название почтового ящика, то есть как будет отображаться
{
name=_name||'';
r=_mail+'@'+_server;// формируем правильный email
n=r;
if (name!='') { n=name; }// если указано как отобращать email? то так и будет отображать
document.write('<a href="mailto:'+r+'">'+n+'</a>');// выводим информацию
}// /sdf_email_show
// _____________________________________________________________________________
var sd_color_back='';
function sdf_focus(_obj_name,_vis)
// Выполняет: перевод фукуса ввода на нужный объект
// _obj_name - название объекта ввода, на который требуется перевести фокус ввода, как правило объект input
// _vis - 1 возвращение обратно на старый цвет
{
var obj=document.getElementsByName(_obj_name).item(0);
if (obj==null) { alert('Объект [name="'+_obj_name+'"] не обнаружен на форме'); return; }
var vis=sdf_default(_vis,0);
if (vis==1)
{ obj.style.backgroundColor=sd_color_back;
  obj.focus();
  return;
}
sd_color_back=obj.style.backgroundColor;
obj.style.backgroundColor='#FF0000';
obj.focus();
setTimeout('sdf_focus(\''+_obj_name+'\',1)',300);
}// /sdf_focus
// _____________________________________________________________________________
function sdf_mouse(e)
// Выполняет: определение координат курсора мышки
// Возвращает: координаты X и Y положения курсора мышки
// e - event с объекта body или другого по отношению к которому нужно выяснить положение курсора
{
var r=Array();
if (!e) { e=window.event; }// совместимость с IE
r.x=e.clientX;
r.y=e.clientY;
return r;
}// /sdf_mouse
// _____________________________________________________________________________
function sdf_property_set(_obj_a,_obj_b)
// Выполняет: перезаписывает свойства объекта A объекту B
{
var r=_obj_b;
for (var key in _obj_a)// пройтись по всем свойствам объекта
{ if (typeof(_obj_a[key])!='object')// если свойство не является объектом, то
  { r[key]=_obj_a[key];// присваиваем свойство объекту B
  }
  else// если свойство является дополнительным объектом
  { // в объекте B уже имеется такой объект, то корректировать его, иначе создаем новый экзепляр
    if (typeof(r[key])=='object') { vb=r[key]; } else { var vb={}; }
    sdf_property_set(_obj_a[key],vb);// рекурсивно вызываем сами себя прописываем все свойства 
    r[key]=vb;// возвращаем правильно прописанные функции.
    // такой оборот делает из-за изчезновения свойств в случае если в объекте А они не указаны
  }
}// /for
return r;
}// /sdf_property_set
// _____________________________________________________________________________
function sdf_print_r(_obj)
// Выполняет: возвращает строкой информацию об объекте
{
var r='{';
for (var key in _obj)// пройтись по всем свойствам объекта
{ // alert(_obj[key]);
  if (typeof(_obj[key])!='object')// если свойство не является объектом, то
  { r+='['+key+']="'+_obj[key]+'"'+"\n";// присваиваем свойство объекту B
  }
  else// если свойство является дополнительным объектом
  { // в объекте B уже имеется такой объект, то корректировать его, иначе создаем новый экзепляр
    if (typeof(_obj[key])=='object') { r+=sdf_print_r(_obj[key]); }
    // рекурсивно вызываем сами себя прописываем все свойства 
//    r[key]=vb;// возвращаем правильно прописанные функции.
    // такой оборот делает из-за изчезновения свойств в случае если в объекте А они не указаны
  }
}// /for
r+='}';
return r;
}// /sdf_print_r
// _____________________________________________________________________________
function sdf_text_selected_get(_obj_name)
// Выполняет: сбор выбеделнной области на странице
// Возвращает: выделеный текст, если таковой имеется
// _obj_name - название объекта если что из которого брать выделение
{
var r='';
// стандарт
if (window.getSelection)
{ r=window.getSelection();
  if (r=='')// если есть выделение, но выделение не на странице, где то в объекте ввода
  { var e=document.getElementById(_obj_name); r=e.value;// узнаем значение в объекте ввода
    if (r!='') { s=s.substring(e.selectionStart,e.selectionEnd); }// выбираем все что выделено в объекте ввода
  }
  return r;
}
// совместимость с IE
if (document.getSelection)
{ r=document.getSelection();
  return r;
}
// поддержка старых версий
if (document.selection)
{ r=document.selection.createRange().text;
  return r;// возвращаем результата
}
return r;// возвращаем результата
}// /sdf_text_selected_get
// _____________________________________________________________________________
function sdf_text_selected_insert(_obj_name,_text)
// Выполняет: 
{
var area=document.getElementById(_obj_name);
if (document.selection)
{ if (window.getSelection)
  { area.value=area.value.substring(0,area.selectionStart)+_text+area.value.substring(area.selectionEnd,area.value.length);
  }
  else
  { area.value+=_text;
  }
  return;
}
if (window.getSelection)
{ area.value=area.value.substring(0,area.selectionStart)+_text+area.value.substring(area.selectionEnd,area.value.length);
}
else
{ area.value+=_text;
}
}// /sdf_text_selected_insert
// _____________________________________________________________________________
function sdf_tag_insert(_obj_name, _tag_start, _tag_end)
// _obj_name - name объекта - как правило, textarea, но при желании можно сделать любой
// указываем именно NAME, так как согласно стандартам DOCTYPE HTML 4.01 strict и выше
// свойство ID у объектов ввода является не приемлемым и требуется обращаться только name
// _tag_start - что вставлять перед выделенным текстом
// _tag_end - что вставлять после выделенного текста
{
// берем объект
var area=document.getElementsByName(_obj_name).item(0);
if (document.getSelection)// если есть что-либо выделенное
{ // берем все что до выделения
  area.value=area.value.substring(0,area.selectionStart)+_tag_start+
  area.value.substring(area.selectionStart, area.selectionEnd)+_tag_end+
  area.value.substring(area.selectionEnd,area.value.length);
  return;
}
var selectedText=document.selection.createRange().text;// берем текст
if (selectedText!='')// если имеется какой-то выделенный текст
{ var newText=_tag_start+selectedText+_tag_end;// составляем новые текст
  document.selection.createRange().text=newText;// вставляем новый текст
}
}// /sdf_tag_insert
// _____________________________________________________________________________
function sdf_ajax(_url,_params)
// Выполняет: отправку ajax запросов при помощи библиотеки jquery
// _url - ссылка для вызова запроса
// _params - параметры запроса
{
var ress={};
$.ajax(
{ url: _url,
  type: 'post',
  global: true,
  async: false,
  data: _params,
  cache: false,
  dataType: 'json',
//  error: function (_XMLHttpRequest, _textStatus) { ress.error=1; alert(_XMLHttpRequest); },
  error: function (_XMLHttpRequest, _textStatus) { ress.error=1; },
  success: function(_data,_text) { ress=_data; ress.error=0; }
});
return ress;
}// /sdf_ajax
var global_result_ajax_a={};
// _____________________________________________________________________________
function sdf_ajax_a(_url,_params, _function_return)
// Выполняет: отправку ajax запросов при помощи библиотеки jquery
// _url - ссылка для вызова запроса
// _params - параметры запроса
{
var ress={};
$.ajax(
{ url: _url,
  type: 'post',
  global: true,
  async: true,
  data: _params,
  cache: false,
  dataType: 'json',
  error: function (_XMLHttpRequest, _textStatus)
  { if (typeof(_function_return)!='undefined')
    { global_result_ajax_a={};
      eval(_function_return);
    }
  },
  success: function(_data,_text)
  { if (typeof(_function_return)!='undefined')
    { global_result_ajax_a=_data;
      eval(_function_return);
    }
  }
});
}// /sdf_ajax
// _____________________________________________________________________________
function sdf_input_autoselect(_this)
// Выполняет: автоматическое выделение поля ввода
{
_this.focus();// переводим фокус ввода
_this.select();// выделяем весь текст
}// /sdf_input_autoselect
// _____________________________________________________________________________
function sdf_htmlspecialchars(_str)
// Выполняет: преобразование html кода как текста, чтобы браузер не интопретировал код
{
var st=sdf_default(_str,'');
var d=document.createElement('div');
d.appendChild(document.createTextNode(st));
return d.innerHTML;
}// /sdf_htmlspecialchars
// _____________________________________________________________________________
function sdf_escape_html(_str)
// Выполняет: экранирование от опасных символов
{
var r=_str;
r=r.replace(/&/gm, '&').replace(/</gm, '&lt;').replace(/>/gm, '>');
return r;
}// /sdf_escape_html
// _____________________________________________________________________________
function sdf_input_keypress_enter(_event,_function)
// Выполняет: обработку клавиши Enter при вводе данных в полях ввода
{
var k=_event.which;
// определяем совместимость так как в FF и IE разные объекты отвечают за клавиатуру
key=k?_event.which:_event.keyCode;// определяем клавишу
if (key==13) { eval(_function); }
return true;
}// /sdf_input_keypress_enter
// _____________________________________________________________________________
function sdo_image()
// Выполняет: возвращает/формирует изображение
{

this.image='';
this.title='';
this.link_='';
this.full=1;
this.script='';
this.class='';
var r='';
if (this.script!='') { this.script=' onclick="'+this.script+'"';}
if (this.link_!='')
{ r+='<a href="'+this.link_+'"><img src="'+this.image+'" alt="'+this.title+'" title="'+this.title+'"'+this.script+this.class+' /></a>';
  if (this.full) { r+=' <a href="'+this.link_+'" '+this.script+'>'+this.title+'</a>'; }// если изображение ссылка должны быть полной / размернутой, то
}
else
{ r+='<img src="'+this.image+'" alt="'+this.title+'" title="'+this.title+'" '+this.script+this.class+' />';
  if (this.full) { r+=' <a href="javascript:void(0);" '+this.script+'>'+this.title+'</a>'; }// если изображение ссылка должны быть полной / размернутой, то 
}
return r;
}// /sdo_image
// _____________________________________________________________________________
function sdf_script_loader(_script,_function_start)
// Выполняет: загрузку javascript скрипта
// _script - url скрипта
// _function_start - функция которая автоматически будет запущена после загрузки файла
{
var sd_script=sdf_default(_script,'');
if (sd_script=='') { sdf_alert('Не указан скрит для загрузки'); return; }
var sd_function_start=sdf_default(_function_start,'');
jQuery.ajax({'async': false, 'type': 'GET', 'url': sd_script, 'data': null, 'dataType': 'script' });// загружаем скрипт
if (sd_function_start!='') { eval(sd_function_start); }// если указана функция для запуска, то запускаем ее
}// /sdf_script_loader
// _____________________________________________________________________________
function sdf_file_loader(_file,_function_start)
// Выполняет: загрузку javascript скрипта
// _file - url скрипта
// _function_start - функция которая автоматически будет запущена после загрузки файла
{
var sd_file=sdf_default(_file,'');
if (sd_file=='') { sdf_alert('Не указан скрит для загрузки'); return; }
var sd_function_start=sdf_default(_function_start,'');
jQuery.ajax({'async': false, 'type': 'GET', 'url': sd_file, 'data': null, 'dataType': 'script' });// загружаем скрипт
if (sd_function_start!='') { eval(sd_function_start); }// если указана функция для запуска, то запускаем ее
}// /sdf_script_loader
// _____________________________________________________________________________
function clone(_params)
// Выполняет: клонирование/копирование javascript объекта
{
if(!_params|| 'object' !== typeof _params) { return _params; }
var c='function'===typeof _params.pop?[]:{};
var p, v;
for(p in _params)
{ if (_params.hasOwnProperty(p))
  { v=_params[p];
    if (v&&'object'===typeof v)
    { c[p]=clone(v); }
    else
    { c[p]=v; }
  }
}
return c;
}// /clone
