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,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";
}