function trim(s) {

    if ( !s ) s = '';
	var s2 = s.replace(/^\s*/, "");
    return s2.replace(/\s*$/, "");

}

function rtrim(s,exmpSymbs) {

	if ( !exmpSymbs ) exmpSymbs = '\s';
    var r = new RegExp("[" + exmpSymbs + "]*$");
	if ( !s ) s = '';
    return s.replace(r, "");

}

function isEmail(str)
{
	// Функция возвращает true, если адрес правильный, и false - в противном случае.
	// http://javascripts.boom.ru/faq/faq8.htm

    var supported = 0;
    if ( window.RegExp ) {
        var tempStr = "a";
        var tempReg = new RegExp(tempStr);
        if ( tempReg.test(tempStr) ) {
            supported = 1;
        }; // if
    }; // if

    if ( ! supported ) {
        return ( str.indexOf(".") > 2 ) && ( str.indexOf("@") > 0 );
    }; // if

    var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
    var r2 = new RegExp(
        "^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"
    );
    return ( ! r1.test(str) && r2.test(str) );

}

function isURL(str)
{
	// Функция возвращает true, если URL правильный, и false - в противном случае.

    var r = new RegExp("^(https?://)?([a-zA-Z0-9-])+(\.([a-zA-Z0-9-])+)*(\.([a-zA-Z0-9~\/])+)+[^\s]*$","i");
    return r.test(str);

}

function fncLooksLikeNotValidZIP(strZIP) {
/*
    Version:                2004-08-03
    Original programmer:    © Sergey Bres aka tserbis
                            Ukraine
                            E-mail: tserbis@yandex.ru

    Usage in <form>:        onSubmit="
                                if ( strErrMsg = fncLooksLikeNotValidZIP(this.zip.value) ) {
                                    alert(strErrMsg);
                                    return false;
                                } // if
                            "
*/
    var lenZIP = strZIP.length;

    var bln_10 = 10 == lenZIP;

    if ( 5 != lenZIP && ! bln_10 ) {
        return 'Incorrect ZIP code length.';
    }; // if

    var digitsReg = /^\d+$/;

    if (
        ! digitsReg.test(strZIP.substr(0, 5)) ||
        ( bln_10 && ! digitsReg.test(strZIP.substr(6)) )
    ) {
        return 'Invalid character in ZIP code.';
    }; // if

    if ( bln_10 && '-' != strZIP.charAt(5) ) {
        return 'Incorrect format for 5-4 digit ZIP code.';
    }; // if

    return false;

} // function fncLooksLikeNotValidZIP

//------------------------
// Window open functions

function openWin(url,name,geom_vals, sets)
{
	var win_nm = name || url;
	var geom = geom_vals || {};
	var w,h,x,y;
	w = geom.w || 800;
	h = geom.h || 630;
	if ( geom.center )
	{
		x = geom.x || (screen.width ? Math.round((screen.width - w)/2) : 100);
		y = geom.y || (screen.height ? Math.round((screen.height - h)/2) : 100);
	}
	else // default positions
	{
		x = geom.x || screen.width - w * 1.02;
		y = geom.y || (screen.height * 0.85 - h)/2;
	}
	var settsDef = ',menubar=yes,scrollbars=yes,titlebar=yes,scrollbars=yes,resizable=yes';
	var settings = (sets ? ('string' == typeof(sets) && '@' == sets[0] ? settsDef + ',' + sets.substr(1) : ',' + sets) : false) || settsDef;
	return window.open(url,win_nm,'width='+w+',height='+h+',left='+x+',screenX='+x+',top='+y+',screenY='+y + settings);
}

// Window open functions
//------------------------

function addHandler(object, event, handler)
{
  if (typeof object.addEventListener != 'undefined')
    object.addEventListener(event, handler, false);
  else if (typeof object.attachEvent != 'undefined')
    object.attachEvent('on' + event, handler);
  else
    throw "Incompatible browser";
}

function removeHandler(object, event, handler)
{
  if (typeof object.removeEventListener != 'undefined')
    object.removeEventListener(event, handler, false);
  else if (typeof object.detachEvent != 'undefined')
    object.detachEvent('on' + event, handler);
  else
    throw "Incompatible browser";
}

// -------------------------

function errorInput(inp, content, tipopts)
{
	if ( 'undefined' == typeof $ ) return false;

	$(inp).addClass('err');
	$(inp)[0].oldval = $(inp).val();

	var opts = {
		width: 230,
		arrows: true,
		content: content,
		activation: 'focus',
		vOffset: 0,
		hOffset: 15,
		show: {method: 'fadeIn', speed: 'fast'},
		hide: {method: 'fadeOut', speed: 'fast'}
	};
	opts = $.extend(opts, tipopts || {});
	$(inp).amtip(opts); // set tip

	if ( !$(inp).parents('form').find(':input.focused').length )
	{
		$(inp).addClass('focused');
		$(inp).focus();
	}

	$(inp).change(function()
	{
		$(this).removeClass('err').removeClass('focused').amtipClose().amtipUnassign();
	})
	.keyup(function()
	{
		if ( $(this).val() && $(this).val() != $(this)[0].oldval ) $(this).trigger('change');
	})
	.click(function(){ $(this).trigger('keyup'); })
	.blur(function(){ $(this).removeClass('focused'); });
}

function unerrorInput(inp)
{
	if ( 'undefined' == typeof $ ) return false;
	if ( ! $(inp).is('.err') ) return false;
	$(inp).removeClass('err').removeClass('focused');
}

if ( 'undefined' != typeof(jQuery) )
{
	$(document).ready(function()
	{
		$('img.hov').each(function()
		{
			var rr = /^(.+)\.([^.]+)$/.exec($(this).attr('src'));
			if ( !rr ) return;
			var sNoExt = rr[1];
			var sExt = rr[2];

			var img = new Image();
			img.src = sNoExt +'_clrd.'+ sExt;

			$(this).hover(function()
			{
				if ( !$(this).attr('nohover') ) $(this).attr('src', sNoExt +'_clrd.'+ sExt);
			},
			function()
			{
				$(this).attr('src', sNoExt +'.'+ sExt);
			});
		});
	});
}