function str_replace ( search, replace, subject ) {    // Replace all occurrences of the search string with the replacement string
    if(!(replace instanceof Array)){
        replace=new Array(replace);
        if(search instanceof Array){
            while(search.length>replace.length){
                replace[replace.length]=replace[0];
            }
        }
    }
 
    if(!(search instanceof Array))search=new Array(search);
    while(search.length>replace.length){
        replace[replace.length]='';
    }
 
    if(subject instanceof Array){
        for(k in subject){
            subject[k]=str_replace(search,replace,subject[k]);
        }
        return subject;
    }
 
    for(var k=0; k<search.length; k++){
        var i = subject.indexOf(search[k]);
        while(i>-1){
            subject = subject.replace(search[k], replace[k]);
            i = subject.indexOf(search[k],i);
        }
    }
 
    return subject;
}

function createElementEx(name, attrs, style, text)
{
  var e = document.createElement(name);
  if (attrs)
    for (key in attrs)
      if (attrs[key]) 
        switch (key)
        {
          case 'onclick': e.onclick = attrs[key]; break;
          case 'class': e.className = attrs[key]; break;
          case 'id': e.id = attrs[key]; break;
          default: e.setAttribute(key, attrs[key]);
        }
  if (style)
    for (key in style)
      if (style[key])
          e.style[key] = style[key];
  if (text) e.appendChild(document.createTextNode(text));
  return e;
}
function createSelect(options,params)
{
  var k, select = document.createElement('select')
  if (params && params['blank']) select.options[0] = new Option('---',-1)
  if (params && params['names'])
  {
    for (k in options)
      select.options[select.options.length] = new Option(params['names'][options[k]],options[k])
  } else
  {
    for (k in options)
      select.options[select.options.length] = new Option(options[k],k)
  }
  if (params && params['onchange']) select.onchange = params['onchange']
  if (params && params['id']) select.id = params['id']
  if (params && params['name']) select.name = params['name']
  if (params && params['value']) select.value = params['value']
  return select
}
function sortOptions(list) 
{
  var compareOptionText = function (a,b) { return a.text!=b.text ? a.text<b.text ? -1 : 1 : 0; }
  var items = list.options.length, value = list.value;
  var tmpArray = new Array(items);
  for ( i=0; i<items; i++ ) tmpArray[i] = new Option(list.options[i].text,list.options[i].value);
  tmpArray.sort(compareOptionText);
  for ( i=0; i<items; i++ ) list.options[i] = new Option(tmpArray[i].text,tmpArray[i].value);
  list.value = value
}
function objectItemsCount(obj)
{
  var k, i = 0
  for (k in obj) i++
  return i  
}
String.prototype.padStr = function (num, fill)
{
  var str = this
  if (!num) num = 8
  if (!fill) fill = ' '
  num = num - str.length;
  for (var i=0; i<num; i++) str = ''+fill+str
  return str;
}
String.prototype.toInt = function()
{
  var str = this
  while (str.charAt(0)=='0')
    str = str.substring(1,str.length)
  return parseInt(str)
}
String.prototype.trim = function()
{
  return this.replace(/(^\s+)|(\s+$)/g, "")
}

String.prototype.escapeQuotes = function()
{
  var str = this//.replace(/'/g, "&apos;")
  return str.replace(/\"/g, "&quot;")
}

String.prototype.unescapeQuotes = function()
{
  var str = this//.replace(/&apos;/g, "'")
  return str.replace(/&quot;/g, '"')
}

Array.prototype.contains = function(value)
{
  for (var i=0; i<this.length; i++)
    if (this[i]==value) return true
  return false;
}

function outVar(x, params, place)
{
  if (place && !place.tagName) place = document.getElementById(place)
  if (!place) place = document.getElementById('output')
  if (params && params['clear']) place.innerHTML = ''
  if (params && params['before']) place.innerHTML += params['before']
  if (params && params['pre']) place.innerHTML += '<pre>'
  if (typeof(x) == 'object')
    for (var k in x) place.innerHTML += k+'='+x[k]+'<br>'
    else  place.innerHTML += x+'<br>'
  if (params && params['pre']) place.innerHTML += '</pre>'
  if (params && params['after']) place.innerHTML += params['after']
}

function randomNumber (a, b)
{
  if (!a) a = 99; else a = parseInt(a)
  if (!b) {b = a; a = 0;} else b = parseInt(b)
  return Math.floor( Math.random() * (b - a + 1) ) + a
}
function createRandomPassword(num, template) 
{
  var chars, hchars, nums, data, pass
  if (!num) num = 8
  chars = "abcdefghijklmnopqrstuvwxyz"
  hchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  nums = "0123456789"
  /*if ((boolean)trim($template))
  {
    if (ereg("[a-z]", $template)) {$data = $chars; $template = ereg_replace("[a-z]", '', $template);}
    if (ereg("[A-Z]", $template)) {$data .= $hchars; $template = ereg_replace("[A-Z]", '', $template);}
    if (ereg("[0-9]", $template)) {$data .= $nums; $template = ereg_replace("[0-9]", '', $template);}
    $data .= $template;
  } else $data = $chars.$nums;*/
  data = chars+hchars+nums
  pass = ''
  for(var i=0; i<num; i++) pass += data.substr(randomNumber(data.length), 1)
  return pass
}
function transliterate(str, caseInsensitive, addSymbols, addSymbolsTrans, delimiter)
{
  var cyrillic, translit, caseMode = 'g'
  cyrillic = "А-Б-В-Г-Д-Е-Ё-Ж-З-И-Й-К-Л-М-Н-О-П-Р-С-Т-У-Ф-Х-Ц-Ч-Ш-Щ-Ъ-Ы-Ь-Э-Ю-Я"
  translit = "A-B-V-G-D-E-E-Zh-Z-I-J-K-L-M-N-O-P-R-S-T-U-F-H-Ts-Ch-Sh-Shch--Y--E-Yu-Ya"
  cyrillic = cyrillic+'-'+cyrillic.toLowerCase()
  if (caseInsensitive)
  {
    cyrillic = cyrillic.toLowerCase()
    translit = translit.toLowerCase()
    caseMode = 'gi'
  } else
  {
    cyrillic = cyrillic+'-'+cyrillic.toLowerCase()
    translit = translit+'-'+translit.toLowerCase()
  }
  cyrillic = cyrillic.split('-')
  translit = translit.split('-')
  for (var i=0; i<cyrillic.length; i++)
  {
    str1 = str
    str = str.replace(new RegExp(cyrillic[i],caseMode),translit[i])
  }
  if (addSymbols && addSymbolsTrans)
  {
    if (!delimiter) delimiter = '-'
    addSymbols = addSymbols.split(delimiter)
    addSymbolsTrans = addSymbolsTrans.split(delimiter)
    for (var i=0; i<addSymbols.length; i++)
      str = str.replace(new RegExp(addSymbols[i],caseMode),addSymbolsTrans[i])
  }
  return str
}

/* Проверка email-адреса на корректность
 *  email - электронный адрес для проверки
 *  strict - пробелы до и после адреса считаются ошибкой 
 */
function isValidEmail (email, strict)
{
 if (!strict) email = email.replace(/^\s+|\s+$/g, '');
 return (/^([a-z0-9а-я_\-]+\.)*[a-z0-9а-я_\-]+@([a-z0-9а-я][a-z0-9а-я\-]*[a-z0-9а-я]\.)+[a-z0-9рф\-]{2,8}$/i).test(email);
}

/* Подстановка корректного окончания существительного в зависимости от количества */
function numEnding(numeric, one, two, many)
{
  numeric = Math.abs(parseInt(numeric))
  if ( numeric % 100 == 1 || (numeric % 100 > 20) && ( numeric % 10 == 1 ) ) return one
  if ( numeric % 100 == 2 || (numeric % 100 > 20) && ( numeric % 10 == 2 ) ) return two
  if ( numeric % 100 == 3 || (numeric % 100 > 20) && ( numeric % 10 == 3 ) ) return two
  if ( numeric % 100 == 4 || (numeric % 100 > 20) && ( numeric % 10 == 4 ) ) return two
  if (many) return many; else return two
}

/* Установка cookie */
function setCookie (name, value, expires, path, domain, secure)
{
  document.cookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

/* Получение cookie */
function getCookie(name)
{
  var cookie = " " + document.cookie;
  var search = " " + name + "=";
  var setStr = null;
  var offset = 0;
  var end = 0;
  if (cookie.length > 0)
  {
    offset = cookie.indexOf(search);
    if (offset != -1)
    {
      offset += search.length;
      end = cookie.indexOf(";", offset)
      if (end == -1) end = cookie.length;
      setStr = unescape(cookie.substring(offset, end));
    }
  }
  return(setStr);
}

/* Меняет местами порядок расположения элементов даты: год.месяц.дата <=> дата.месяц.год 
 * Второй параметр задает разделитель. Если не задан, используется '-' 
 */
function flipDate(d, s)
{
  if (d)
  {
    if (!s) s = '-'
    d = d.split(' ')[0].replace(/\./g,'-')
    d = d.split('-')
    return d[2]+s+d[1]+s+d[0]
  } else return ''
}

/* Клонирует объект - создает копию */
function clone(o) {
  if (!o || 'object' !== typeof o) return o;
  var c = 'function' === typeof o.pop ? [] : {};
  var p, v;
  for (p in o) {
     if (o.hasOwnProperty(p)) {
       v = o[p];
       if (v && 'object' === typeof v) c[p] = clone(v);
         else c[p] = v;
     }
  }
  return c;
}
