/*
    // dimaninc general js functions

    // 2006/12/15
        * check_correct_email() added

    // 2006/03/28
        * getHTTPRequestObject() added
        * diXMLRequest.get() and .post() added

    // 2006/02/28
        * standard escape() rewritten

    // 2006/02/20
        * is_ie added

    // 2006/02/11
        * getLeft(), getTop() added
        * _px() improved

    // 2006/02/08
        * _add_event() added
        * _px() added

    // 2006/02/06
        * the first version of this shit
*/

var is_ie = (document.all) ? true : false;

var agt = navigator.userAgent.toLowerCase();
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);
var is_gecko = (agt.indexOf('gecko') != -1);
var is_ie4up = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1) && (is_major >= 4));
var is_opera = (agt.indexOf("opera") != -1);

if (is_ie4up)
{
  document.execCommand("BackgroundImageCache",false,true);
}

function isEmpty(str)
{
  if (str == null || str == "" || isNaN(str))
    return true;
  else
    return false;
}

function _ge(eid)
{
  return document.getElementById(eid);
}

function _sd(id, state)
{
  var e = _ge(id);

  if (e)
  {
    if (typeof state == 'undefined')
      var state = e.style.display != 'block' ? 1 : 0;

    e.style.display = state*1 ? 'block' : 'none';

    var date = new Date();
    date.setFullYear(date.getFullYear() + 1);
    setCookie('d_of_'+id+'', state, date, '/');
  }
}

function _sd_init(id)
{
  var state = getCookie('d_of_'+id+'');

  if (state === null)
    state = 1;

  _sd(id, state);
}

function _add_event(elem, evname, func)
{
  if (elem.attachEvent)
  {
    //elem.attachEvent("on" + evname, func);
    //alert("elem.on"+evname+"=func;");
    eval("elem.on"+evname+"=func;");
  }
  else
    elem.addEventListener(evname, func, false); //true
}

function delEvent(elem, evname, func)
{
  if (elem.attachEvent)
  {
    eval("elem.on"+evname+"=null;");
  }
  else
    elem.removeEventListener(evname, func, false); //true
}

function _px(px)
{
  var x = parseInt(px, 10);

  if (isNaN(x)) x = 0;

  return x;
}

function getLeft(o)
{
  var x = o.offsetLeft;
  while (o = o.offsetParent) x += o.offsetLeft;
  return x;
}

function getTop(o)
{
  var y = o.offsetTop;
  while (o = o.offsetParent) y += o.offsetTop;
  return y;
}

function _get_left(o)
{
  var x = o.offsetLeft;
  while (o = o.offsetParent) x += o.offsetLeft;
  return x;
}

function _get_top(o)
{
  var y = o.offsetTop;
  while (o = o.offsetParent) y += o.offsetTop;
  return y;
}

// escape function
var escape_trans = [];
for (var i = 0x410; i <= 0x44F; i++) escape_trans[i] = i - 0x350; // А-Яа-я
escape_trans[0x401] = 0xA8;    // Ё
escape_trans[0x451] = 0xB8;    // ё

var escapeOrig = window.escape;

window.escape = function(str)
{
  var ret = [];
  var str1 = str.toString();

  for (var i = 0; i < str1.length; i++)
  {
    var n = str1.charCodeAt(i);
    if (typeof escape_trans[n] != 'undefined') n = escape_trans[n];
    if (n <= 0xFF) ret.push(n);
  }
  return escapeOrig(String.fromCharCode.apply(null, ret)).replace('+','%2B');
}

function getHTTPRequestObject()
{
  var xmlHttpRequest = false;

  if (typeof ActiveXObject != 'undefined')
  {
    try {
      xmlHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
    } catch(e) {}

    if (!xmlHttpRequest) try {
      xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
    } catch(e) {}
  }
  else if (typeof XMLHttpRequest != 'undefined')
  {
    xmlHttpRequest = new XMLHttpRequest();
  } else
  {
    xmlHttpRequest = false;
  }

  return xmlHttpRequest;
}

var diXMLRequest =
{
  get : function (url, callback)
  {
    var _getter = getHTTPRequestObject();
    _getter.open("GET", url, true);

    _getter.onreadystatechange = function() {
      if (_getter.readyState == 4)
      {
        callback(_getter.responseXML);
      }
    }

    _getter.send(null)
  },

  post : function (url, form, callback)
  {
    var _poster = getHTTPRequestObject();

    _poster.open("POST", url, true);
    _poster.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    _poster.setRequestHeader('Connection', 'close');
    _poster.send(form);

    _poster.onreadystatechange = function() {
      if (_poster.readyState == 4)
      {
        callback(_poster.responseXML);
      }
    };

    //if (!is_ie) _poster.send(null);
  }
}

function MM_preloadImages()
{
  var d=document;
  if (d.images)
  {
    if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments;
    for (i in a)
      if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}
  }
}

var __correct_latin_symbols_regexp = new RegExp("^[a-z0-9-_.]+$", "i");
var __correct_digits_regexp = new RegExp("^[0-9.,]+$", "i");
var __correct_email_regexp = new RegExp('^[0-9a-z]([-_.]*[0-9a-z])*@[0-9a-z]([-._]*[0-9a-z])*[.]{1}[a-z]{2,4}$', 'i');

function check_correct_latin_symbols(s)
{
  return __correct_latin_symbols_regexp.test(s);
}

function check_correct_digits(s)
{
  return __correct_digits_regexp.test(s);
}

function check_correct_email(s)
{
  return __correct_email_regexp.test(s);
}

function mysprintf(num, afterdot)
{
  var d = Math.pow(10, afterdot);
  num = Math.round(num * d) / d;

  var a = num.toString().split('.');
  if (!a[1]) a[1] = '';

  while (a[1].length < afterdot) a[1] += '0';

  return a[0]+'.'+a[1];
}

function get_screen_dimensions(what)
{
  var viewportwidth;
  var viewportheight;

  if (typeof window.innerWidth != 'undefined')
  {
    viewportwidth = window.innerWidth;
    viewportheight = window.innerHeight;
  }
  else if (typeof document.documentElement != 'undefined'
           && typeof document.documentElement.clientWidth !=
           'undefined' && document.documentElement.clientWidth != 0)
  {
    viewportwidth = document.documentElement.clientWidth;
    viewportheight = document.documentElement.clientHeight;
  }
  else
  {
    viewportwidth = document.getElementsByTagName('body')[0].clientWidth;
    viewportheight = document.getElementsByTagName('body')[0].clientHeight;
  }

  switch (what)
  {
    case 'x':
    case 'w':
      return viewportwidth;

    case 'y':
    case 'h':
      return viewportheight;

    default:
      return [viewportwidth,viewportheight];
  }
}

function set_as_homepage(a)
{
  var homepage = window.location.href;

  if (a.style.behavior)
  {
    a.setHomePage(homepage);
  }

  return false;
}

function add_to_bookmarks(a)
{
  var url = window.document.location;
  var title = window.document.title;

  if (is_ie4up)
    window.external.AddFavorite(url, title);
  else if (is_opera)
  {
    a.href = url;
    a.rel = "sidebar";
    //a.title = url+','+title;
    a.title = title;
    return true;
  }
  else if (is_gecko)
    window.sidebar.addPanel(title, url, '');
  else
    alert('Нажмите CTRL-D, чтобы добавить страницу в закладки.');

  return false;
}

function lead0(x)
{
  x += '';

  return x.length == 1 ? '0'+x : x;
}

function str_cut_end(s, max_len)
{
  var trailer = arguments[2] || '...';

  if (s.length > max_len)
    s = s.substr(0, max_len - trailer.length)+trailer;

  return s;
}

function in_array(search_term, ar)
{
  var i = ar.length;

  if (i > 0)
  {
     do
     {
       if (ar[i] == search_term)
       {
         return true;
       }
     } while (i--);
  }

  return false;
}

function index_of(obj, ar)
{
  for(i in ar) if(ar[i]==obj) return i;

  return -1;
}

// type == false => all types
// id_mask - string/regexp
function _ge_inputs(/*type = false, parent = document, id_mask = false, checked_only = false*/)
{
  var type = typeof arguments[0] != 'undefined' && arguments[0] ? arguments[0] : false;
  var parent = typeof arguments[1] != 'undefined' && arguments[1] ? arguments[1] : document;
  var id_mask = typeof arguments[2] != 'undefined' && arguments[2] ? arguments[2] : false;
  var checked_only = typeof arguments[3] != 'undefined' && arguments[3] ? arguments[3] : false;
  var _input = parent.getElementsByTagName('input');
  var ar = [];

  for (var i = 0 ; i < _input.length; i++)
  {
    if (id_mask)
    {
      if (typeof id_mask == 'object' && !id_mask.test(_input[i].id))
        continue;
      else if (typeof id_mask == 'string' && _input[i].id.substr(0, id_mask.length) != id_mask)
        continue;
    }

    if ((!type || (type && _input[i].type == type)) && (!checked_only || (checked_only && _input[i].checked)))
      ar.push(_input[i]);
  }

  return ar;
}

function get_xml_text(e)
{
  var xxx = e.firstChild;

  if (typeof xxx == 'undefined' || !xxx)
    return false;

  if (typeof xxx.nodeValue != 'undefined' && xxx.nodeValue)
  {
    return xxx.nodeValue;
  }
  else if (typeof xxx.textContent != 'undefined' && xxx.textContent)
  {
    return xxx.textContent;
  }

  return '';
}

function di_xml2array(r)
{
  var e = r.firstChild;
  var ar = [];

  do
  {
    ar[e.nodeName] = get_xml_text(e);
  }
  while (e = e.nextSibling);

  return ar;
}

function divide3dig(s, divider)
{
  if (typeof divider == 'undefined') var divider = ',';

  s = s.toString();

  var x = s.indexOf('.');
  var s2 = x != -1 ? s.substr(x) : '';
  s = x != -1 ? s.substr(0, x) : s;

  var ss = '';
  var start = s.length - 3;
  var j = Math.ceil(s.length / 3);
  var len;

  for (var i = 0; i < j; i++)
  {
    len = 3;

    if (start < 0)
    {
      len += start;
      start = 0;
    }

    ss = s.substr(start, len)+divider+ss;

    start -= 3;
  }

  ss = ss.substr(0, ss.length - 1);

  return ss+s2;
}

function array_splice(arr, offst, lgth, replacement)
{
    // Removes the elements designated by offset and length and replace them with supplied array
    //
    // version: 1008.1718
    // discuss at: http://phpjs.org/functions/array_splice
    // +   original by: Brett Zamir (http://brett-zamir.me)
    // +   input by: Theriault
    // %        note 1: Order does get shifted in associative array input with numeric indices,
    // %        note 1: since PHP behavior doesn't preserve keys, but I understand order is
    // %        note 1: not reliable anyways
    // %        note 2: Note also that IE retains information about property position even
    // %        note 2: after being supposedly deleted, so use of this function may produce
    // %        note 2: unexpected results in IE if you later attempt to add back properties
    // %        note 2: with the same keys that had been deleted
    // -    depends on: is_int
    // *     example 1: input = {4: "red", 'abc': "green", 2: "blue", 'dud': "yellow"};
    // *     example 1: array_splice(input, 2);
    // *     returns 1: {0: "blue", 'dud': "yellow"}
    // *     results 1: input == {'abc':"green", 0:"red"}
    // *     example 2: input = ["red", "green", "blue", "yellow"];
    // *     example 2: array_splice(input, 3, 0, "purple");
    // *     returns 2: []
    // *     results 2: input == ["red", "green", "blue", "purple", "yellow"]
    // *     example 3: input = ["red", "green", "blue", "yellow"]
    // *     example 3: array_splice(input, -1, 1, ["black", "maroon"]);
    // *     returns 3: ["yellow"]
    // *     results 3: input == ["red", "green", "blue", "black", "maroon"]

    var _checkToUpIndices = function (arr, ct, key) {
        // Deal with situation, e.g., if encounter index 4 and try to set it to 0, but 0 exists later in loop (need to
        // increment all subsequent (skipping current key, since we need its value below) until find unused)
        if (arr[ct] !== undefined) {
            var tmp = ct;
            ct += 1;
            if (ct === key) {
                ct += 1;
            }
            ct = _checkToUpIndices(arr, ct, key);
            arr[ct] = arr[tmp];
            delete arr[tmp];
        }
        return ct;
    };

    if (replacement && typeof replacement !== 'object') {
        replacement = [replacement];
    }
    if (lgth === undefined) {
        lgth = offst >= 0 ? arr.length - offst : -offst;
    } else if (lgth < 0) {
        lgth = (offst >= 0 ? arr.length - offst : -offst)  + lgth;
    }

    if (!(arr instanceof Array)) {
        /*if (arr.length !== undefined) { // Deal with array-like objects as input
        delete arr.length;
        }*/
        var lgt = 0, ct = -1, rmvd = [], rmvdObj = {}, repl_ct=-1, int_ct=-1;
        var returnArr = true, rmvd_ct = 0, rmvd_lgth = 0, key = '';
        // rmvdObj.length = 0;
        for (key in arr) { // Can do arr.__count__ in some browsers
            lgt += 1;
        }
        offst = (offst >= 0) ? offst : lgt + offst;
        for (key in arr) {
            ct += 1;
            if (ct < offst) {
                if (this.is_int(key)) {
                    int_ct += 1;
                    if (parseInt(key, 10) === int_ct) { // Key is already numbered ok, so don't need to change key for value
                        continue;
                    }
                    _checkToUpIndices(arr, int_ct, key); // Deal with situation, e.g.,
                    // if encounter index 4 and try to set it to 0, but 0 exists later in loop
                    arr[int_ct] = arr[key];
                    delete arr[key];
                }
                continue;
            }
            if (returnArr && this.is_int(key)) {
                rmvd.push(arr[key]);
                rmvdObj[rmvd_ct++] = arr[key]; // PHP starts over here too
            } else {
                rmvdObj[key] = arr[key];
                returnArr    = false;
            }
            rmvd_lgth += 1;
            // rmvdObj.length += 1;

            if (replacement && replacement[++repl_ct]) {
                arr[key] = replacement[repl_ct];
            } else {
                delete arr[key];
            }
        }
        // arr.length = lgt - rmvd_lgth + (replacement ? replacement.length : 0); // Make (back) into an array-like object
        return returnArr ? rmvd : rmvdObj;
    }

    if (replacement) {
        replacement.unshift(offst, lgth);
        return Array.prototype.splice.apply(arr, replacement);
    }
    return arr.splice(offst, lgth);
}

function isleapyear(year)
{
  return year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? true : false;
}

function get_wd(date_obj)
{
  var x = date_obj.getDay();
  if (x == 0) x = 7;

  return x;
}

function get_yday(date_obj)
{
  return date_obj && typeof date_obj == 'object' ? Math.floor((date_obj - (new Date(date_obj.getFullYear(), 0, 1))) / 86400000) : 0;
}

function get_big_yday(y, yday)
{
  if (typeof yday == 'undefined')
  {
    if (!y || typeof y != 'object')
      return 0;

    var yday = get_yday(y);
    y = y.getFullYear();
  }

  yday += '';

  while (yday.length < 3)
    yday = '0'+yday;

  return (y+''+yday)*1;
}

function get_time(date_obj)
{
  return date_obj && typeof date_obj == 'object' ? Math.round(date_obj.getTime() / 1000) : 0;
}

