/* Функции аяха */
    var _lock = []
function ajax( ){

    var _destination = '/ajax.php'
    var _oRequest = null
    var _fuckMS = 'Microsoft.XMLHTTP'
    var _sTypeName = 'Content-Type'
    var _sTypeValue = 'application/x-www-form-urlencoded;'
    var _sMethod = 'post'
    var _timeout = 200
    var _httpTimeOut
    var _state = 4
    var _status = 200
    var _startJSTAG1 = '<script'
    var _startJSTAG2 = '>'
    var _endJSTAG = '</script>'
    var _script = []
    var _sReturn = ''
    var _evalNow = true
    var _callBack = null
    var _callBackParam = null


    init()
    function init(){
        try {
            _oRequest = new XMLHttpRequest( );
        }catch(oError){
            try {
                _oRequest = ActiveXObject( _fuckMS );
            }catch( oError ){
                alert ( 'Асинхронные функции отключены, так как не удалось создать асинхронный объект' );
                _oRequest = null
            }
        }
    }
    this.lock = function ( sCode ){
        _lock[ sCode ] = sCode
    }
    this.setPostEval = function(){
    	_evalNow = false
    }
    this.unlock = function ( sCode ){
        if ( isLock( sCode ) ){
            delete( _lock[ sCode ] )
        }
    }
    function isLock( sCode ){
        return e( _lock[ sCode ] )
    }
    function timeOutSet( ){
        timeOutClear( )
        _httpTimeOut = setTimeout( fromServer, _timeout )
    }
    function timeOutClear( ){
        if ( _httpTimeOut ) {
            clearTimeout( _httpTimeOut )
        }
    }
    function isReady( ){
	return ( _oRequest.readyState == _state && _oRequest.status == _status );
    }

    this.postEval = function( ){
		for (var iScript=0;  iScript < _script.length;  iScript++){
			try{
				eval( _script[ iScript ] )
			}catch( oError ){
			    alert( oError )
			}
		}
		_script = []
	}
    function evalJS( sHtml ){
        try{
            var iPosLeft1 	= 0
            var iPosLeft2 	= 0
            var iPosRight	= 0
            var sScript  	= ''
            //_script = []
            do {
                iPosLeft1 = sHtml.indexOf( _startJSTAG1, iPosLeft1 )
                if ( iPosLeft1 != -1 ) {
                    iPosLeft2 = sHtml.indexOf( _startJSTAG2 , iPosLeft1 )
                    if ( iPosLeft2 != -1 ) {
                        iPosRight = sHtml.indexOf( _endJSTAG, iPosLeft2 )
                        if ( iPosRight != -1 ) {
                            sScript = sHtml.substring( iPosLeft2 + 1, iPosRight )
                            sHtml = sHtml.substring( 0, iPosLeft1 ) + sHtml.substring( iPosRight + _endJSTAG.length )
                            //alert(i_aScript.length)
                            if ( _evalNow ){
                                try{
                                    if ( sScript.length > 0 ){
                                        eval( sScript )
                                    }
                                }catch( oError ){
                                    alert( oError )
                                }
                            }else{
                                _script[_script.length] = sScript
                            }
                        }
                    }
                }
            }while( iPosLeft1 != -1 )
        }
        catch(oError) {
            alert( oError )
        }
        finally {
            return sHtml
        }
    }
    this.command = function( sCommand, aParam, oCallBack, oCallBackParam, bLock, oForm, oForm2, bEvalNow ){
        if ( !isLock( sCommand )){
            if ( bLock ){
                this.lock( sCommand )
            }
            sPost = '_command=' + sCommand
            if ( e( aParam ) ){
                sPost  = sPost + '&'+ array2String(aParam, '_source' )
            }

            if ( e( oForm ) ){
                 sPost = sPost + '&' + form2String( oForm , '_data' )
            }
            if ( e( oForm2 ) ){
                 sPost = sPost + '&' + form2String( oForm2 , '_data' )
            }

            //+ '&'+array2String(oCallBackParam,'arg')
            //alert( sPost )
            if (!e( bEvalNow )){
            	bEvalNow = true
            }
			send( sPost, bEvalNow, oCallBack, oCallBackParam )
        }else{
             this.lockError( )
        }
    }
    this.lockError = function(){
    	alert('Операция выполняется, дождитесь завершения')
    }
    this.isLock = function( sCode ){
    	return isLock( sCode )
    }
    function send ( sString, bEvalNow, oCallBack, oCallBackParam ){
        if ( e( bEvalNow ) ){
           _evalNow = bEvalNow
        }
        if ( e( oCallBack ) ){
           _callBack = oCallBack
        }
        if ( e( oCallBackParam ) ){
           _callBackParam = oCallBackParam
        }

        _script = []
        _oRequest.abort( )
        _oRequest.open( _sMethod, _destination )
        _oRequest.setRequestHeader( _sTypeName, _sTypeValue )
        _oRequest.send( sString )
        timeOutSet( )
    }

    function fromServer( ){
        //alert( _lastCommand )
        if ( isReady( ) ){
            window.oReturn = true
            _sReturn = evalJS( _oRequest.responseText )
            //alert( window.oReturn )
            switch ( true ){
                case ( e( _callBack ) && e( _callBackParam ) ):
                    _callBack( _sReturn, _callBackParam, window.oReturn )
                break;
                case ( e( _callBack ) && !e( _callBackParam ) ):
                    _callBack( _sReturn, oReturn )
                break;
            }

        }else{
            timeOutSet( )
        }
    }

}
