/* @file: requesto.js */


/* Phases: 
 *      uninitialized, loading, loaded, interactive , complete 
 */

/* handlers: onstart, onend, onloading, onerror
   url: http://onet.pl
   params: { name: value, name2 : value2}
*/

RequestO = function(method, url, params, handlers){
	var xhttp = null;
	var error = 0;
	
	// errors text description
	var errorString = {
		"0": "No error",
		"-1": "Unable to create XMLHttpRequestObject",
		"-2": "Unsupported http method"
	};
	
	var stateString = ["uninitialized", "loading", "loaded", "interactive", "complete"];
	
	/* get xmlhttprequest object, browser dependent */
	if (window.XMLHttpRequest) {
		// mozilla safari opera ..
		xhttp = new XMLHttpRequest();
	}
	else {
		// Internet Explorer
		
		try {
			xhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (ex) {
			try {
				xhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch (ex) {
				error = -1;
				return;
			}
		}
		
	}
	
	/* build query string */
	var tmpArray = new Array();
	var index = 0;
	if (params) {
		for (var n in params) {
			tmpArray[index++] = encodeURIComponent(n) + "=" + encodeURIComponent(params[n]);
			//tmpArray[index++] = n + "=" + params[n];
		}
	}
	
	query = tmpArray.join("&");
	
	/* Prepare data for handler */
	var handlerParameters = {
		XMLHTTPRequest: xhttp,
		RequestO: this
	};
	
	/* build handler function */
    xhttp.onreadystatechange = 
        function() { 
           // var xhttp           = handlerParameters["XMLHTTPRequest"]; 
            var requesto       = handlerParameters["RequestO"];
            //var responseText    = xhttp.responseText; 

            switch (xhttp.readyState) {
                /* State Handler For:  << uninitialized >>
                 *  Params:
                 *   1 - xhttp      - xmlhttprequest object ref
                 *   2 - requesto  - requesto object ref
                 */
				
                case 0:
                    if ( handlers[stateString[0]]) {
						requesto.prevState = stateString[0]; 
                        handlers[stateString[0]](xhttp, requesto);
                    } 
                    break; 
                /* State Handler For:  << loading >>
                 *  Params:
                 *   1 - xhttp      - xmlhttprequest object ref
                 *   2 - requesto  - requesto object ref
                 */
                case 1: 
                    if ( handlers[stateString[1]] && requesto.prevState != stateString[1]) {
						requesto.prevState = stateString[1];
                        handlers[stateString[1]](xhttp, requesto);
                    }
                    break;
 
                /* State Handler For:  << loaded >> 
                 *  Params:
                 *   1 - xhttp      - xmlhttprequest object ref
                 *   2 - requesto  - requesto object ref
                 */
                case 2:                     
                    if ( handlers[stateString[2]] && requesto.prevState != stateString[2]) {
						requesto.prevState = stateString[2];
                        handlers[stateString[2]](xhttp, requesto);
                    }
                    break;                
                /* State Handler For:  << interactive >>
                 *  Params:
                 *   1 - xhttp      - xmlhttprequest object ref
                 *   2 - requesto  - requesto object ref
                 */
                case 3: 
                    /* Is there any piece of new data ? */
			//		var responseText = xhttp.responseText;
            //        if (responseText.length != RequestO.contentSize) {

                        /* yes the data has arrived */
            //            var increase = responseText.substring(RequestO.contentSize, responseText.length);
              //          RequestO.contentSize += increase.length;

              //          if ( handlers[stateString[3]] ) {
              //              handlers[stateString[3]](increase, xhttp, requesto);
              //          }
              //      }
                    break;
                /* State Handler For:  << complete >> 
                 *  Params:
                 *   1 - xhttp.responseText - response text 
                 *   2 - xhttp      - xmlhttprequest object ref
                 *   3 - requesto  - requesto object ref
                 */
                case 4: 
					var responseText = xhttp.responseText;
                    if ( handlers[stateString[4]] && requesto.prevState != stateString[4] ) {
						requesto.prevState = stateString[4];
                        handlers[stateString[4]](xhttp.responseText, xhttp, requesto);
                    }
                    break;               
            };
        }

    // save object parameters 
    this.xhttp = xhttp;
    this.contentSize = 0;
    this.error = error;
    this.handlers = handlers;
    this.stateString = stateString;
    this.errorString = errorString;

    // finally we can send request

    switch (method.toUpperCase()) { 
        case "POST" : 
            xhttp.open(method, url, true);
            xhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhttp.send(query);
			//xhttp.overrideMimeType('text/html; charset=UTF-8');
            break;
        case "GET" : 
            var fullUrl = url;

            if ( query.length > 0 ) {
                fullUrl += "?" + query;
            } 

            xhttp.open(method, fullUrl, true);
            xhttp.send(null);
            break;
        default : 
            error = -2;
            return;
    }
};
