function bookmark(title, url) {
     // если название страницы не было чётко указано, возьмём заголовок текущей страницы
     if (title == undefined)
          title = document.title;

     // то же самое и с URL-ом
     if (url == undefined)
          url = top.location.href;

     if (window.sidebar) {
          // Firefox
          window.sidebar.addPanel(title, url, '');
     } else if (window.opera && window.print) {
 // Opera
          var t = document.createElement('a');
          t.setAttribute('rel', 'sidebar');
          t.setAttribute('href', url);
          t.setAttribute('title', title);
          t.click();
     } else {
          // IE
          window.external.AddFavorite(url, title);
     }
     return false;
}

function SetHomepage(obj) {
if (document.all) {
obj.style.behavior='url(#default#homepage)';
obj.setHomePage('http://www.krozilo.com');
return false;
} else if(!document.layers) {
    alert(Locale['MsgUseBrowserSettingsForHomePage']);
return false;
}
return true;
}

/* Отладочные функции -- из релиза убрать */
function echo(object) {
    if (typeof console == 'undefined') {
        alert(object);
        return;
    }
    var type = typeof object == 'object' || typeof object == 'array' ? 'dir' : 'info';
    console[type](object);
}

function DefineClass(source) {
    var NewClass = Class.create();
    Object.extend(NewClass.prototype, source);
    return(NewClass);
}

/* Создание элемента */
function ce(tagName, parent, options, style) {
    var element = document.createElement(tagName);
    if (options) Object.extend(element, options);
    $(element).setStyle(style);
    if (parent) {
        parent = $(parent);
        parent.appendChild(element);
    }
    return(element);
}

function getBounds1(element)
{
  var left = element.offsetLeft;
  var top = element.offsetTop;
  for (var parent = element.offsetParent; parent; parent = parent.offsetParent)
  {
    left += parent.offsetLeft - parent.scrollLeft;
    top += parent.offsetTop - parent.scrollTop
  }
  return {left: left, top: top, width: element.offsetWidth, height: element.offsetHeight};
}


function pInt(value) {
    if (value == 'medium') value = 0;
    return(parseInt(value));
}

Element.addMethods({

    applyStyle: function(element, style) {
	element = $(element);
        for (var property in style) {
	    element.style[property] = /(left|right|top|bottom|width|height)/.test(property) ? ((style[property]<0) ? 0 : style[property]) + 'px' : style[property];
        }
	return(element);
    },

    getCSSProperty: function(element, name) {
        element = $(element);
        var value = element.style[name];
        if (!value) {
            var css = document.defaultView.getComputedStyle(element, null);
            value = css ? css[name] : null;
        }
        value = value.replace(/px/g, '');
        return(value == 'auto' ? null : value);
    },

    getOuterWidth: function(element) {
        element = $(element);
        var value = pInt(element.getStyle('borderLeftWidth')) + pInt(element.getStyle('borderRightWidth'));
        value+= pInt(element.getStyle('paddingLeft')) + pInt(element.getStyle('paddingRight'));
        value+= pInt(element.getStyle('marginLeft')) + pInt(element.getStyle('marginRight'));
        return(value);
    },

    getOuterHeight: function(element) {
        element = $(element);
        var value = pInt(element.getStyle('borderTopWidth')) + pInt(element.getStyle('borderBottomWidth'));
        value+= pInt(element.getStyle('paddingTop')) + pInt(element.getStyle('paddingBottom'));
        value+= pInt(element.getStyle('marginTop')) + pInt(element.getStyle('marginBottom'));
        return(value);
     }


})

function sizeof(object)
{
    if(!object) return 0;
    if(object instanceof Array) return object.length;

    var size = 0;
    for (i in object) size++;
    return(size);
}

function isEmpty(obj)
{
    if(!obj) return true;
    if(obj instanceof Array)
        if(obj.length==0) return true
        else return false;
    else
        for(var i in obj)
        {
            return false;
        }
    return true;
}

function htmlspecialchars(str) {	
	str = str.replace(/</igm, '&lt;');
	str = str.replace(/>/igm, '&gt;');
	str = str.replace(/\"/igm, '&quot;');
	return str;
}

function de(obj) {
    if(obj) obj.parentNode.removeChild(obj);
}

function ge(id) {
    return document.getElementById(id);
}

function cloneObject(what) {
    for (var i in what) {
            if(typeof(what[i]) == 'object') {
	                this[i] = new cloneObject(what[i]);
			        }
				        else
					            this[i] = what[i];
						        }
							}


//Аналог PHP-функции array_search.
//Ищет первое вхождение элемента value в obj.
//Возвращает найденный ключ или false в случае неудачи
//Необязательный параметр property используется для поиска по полю элементов массива, являющихся объектами
function arraySearch(obj, value, property)
{
    if(obj instanceof Array)
    {
        for(var i=0; i<obj.length; i++)
            if((property && obj[i][property] == value) || obj[i] == value)
                return i;
    }
    else
    {   //это объект
        for(var i in obj)
            if((property && obj[i][property] == value) || obj[i] == value)
                return i;
    }
    return false;   //мы сюда можем дойти только в случае неудачного поиска
}

function addZero(n)
{
	if(n<10) return '0'+n;
	else return n;
}

function AddZero(str) {
    return(addZero(str));
}

//Спрягает слово по числу. Принимает число, и набор слов (фрагментов слов) в следующем порядке:
// минута (21 минута, 21 час), минуты (23 минуты, 23 часа), минут (18 минут, 18 часов)
function declineByNum(num, word1, word2, word3)
{
//    if(!num) return;
    num = Math.abs(num);
    num = num+'';
    if(num.length == 1)
        num = num-0;
    else
    {
        num = num.substr(num.length-2, 2)-0;
        if(num < 11 || num>19)
            num %= 10;
        else
            return word3;
    }
    if(num==1) return word1;
    if(num>0 && num<=4) return word2;
    return word3;
}

function getFullDate(timestamp) {
    var date = new Date(timestamp);
    var time = AddZero(date.getDate())+'.'+AddZero(date.getMonth()+1)+'.'+date.getFullYear()+', '+AddZero(date.getHours())+':'+AddZero(date.getMinutes());
    return(time);
}

//Получает номер дня в году
function numOfDay(day, month, year)
{
	var mdays = [];
	var j = 0;
	for(var i in gVars.Months.MaxDays)
	{
		mdays[j++] = gVars.Months.MaxDays[i];
	}
	if (!((year%4==0) && (year%100!=0) || (year%400==0)))
		mdays[1] = 28;
	var n = day;
	for(var i=1; i<month; i++)
		n += mdays[i-1];
	return n;
}

//Возвращает номер дня года, раскладывая строку формата гггг-мм-дд (традиционную для SQL)
function numOfDayFromStr(s)
{
    return numOfDay((s.substr(8,2)-0), (s.substr(5,2)-0), (s.substr(0,4)-0));
}

//Немного грубо (погрешность до нескольких секунд) сверяет часы клиента с серверными и возвращает разницу в секундах
function checkUserClock(serverTstamp)
{
    var drift = 1;  //грубая погрешность в секундах между моментом генерации серверного штампа и выполнением данного участка скрипта на клиенте
	var cdate = new Date();
	var userTstamp = Math.round(cdate.getTime()/1000 + cdate.getTimezoneOffset()*60);	//Получаем таймстэмп юзера по UTC в секундах
    return (userTstamp - (serverTstamp + drift));
}

//Автоматический ресайзинг блока в сторону уменьшения по контенту
function resizeBlockByContent(oDiv, minH, maxH)
{
    if(!oDiv.style.height) oDiv.style.height = minH+'px';   //если по умолчанию высота не задана
	if(oDiv.scrollHeight > parseInt(oDiv.style.height))
	{
		if(oDiv.scrollHeight > maxH)
			oDiv.style.height = maxH+'px';
		else
			oDiv.style.height = oDiv.scrollHeight+'px';
	}
	else
	{	//уменьшение
		for(var h=parseInt(oDiv.style.height); h>=minH; h-=5)
		{
			oDiv.style.height = h+'px';
			if(h < oDiv.scrollHeight)
			{
				oDiv.style.height = oDiv.scrollHeight+'px';
				break;
			}
		}
	}
}
/*
function uPrompt(question, defAnswer, f, maxLen)
{
    if(!maxLength) maxLength = 255;
    oDiv = ce('DIV', document.body, null, {position: 'absolute', zIndex: 10000, width: '100%', height: '100%', backgroundColor: '#C2C2C2'});
	var oForm = ce('FORM', oDiv, null, {position: 'absolute', left: '100px', top: '100px', width: '200px', height: '400px', border: '2px solid #992222', backgroundColor: '#EEEEEE', overflow: 'scroll', padding: '5px'});
    var oInput = ce('INPUT', oForm, {type: 'text', maxLength: maxLength}, {width: '200px'});
    oInput.focus();
    ce('INPUT', oForm, {type: 'submit', value: 'Ok'});
    oForm.onsubmit = function()
    {
        f(oInput.value);
        de(oDiv);
        return false;
    }
}
*/