function microAjax(url, callbackFunction)

{

    this.getRequest = function() {

        if (window.ActiveXObject)

            return new ActiveXObject('Microsoft.XMLHTTP');

        else if (window.XMLHttpRequest)

            return new XMLHttpRequest();

        else

            return false;

    }



    if (arguments[2])

        this.postBody = arguments[2];

    else 

        this.postBody="";



    this.callbackFunction=callbackFunction;

    this.url=url;   

    this.request = this.getRequest();

	

    this.bindFunction = function (caller, object) {

        return function() {

            return caller.apply(object, new Array(object));

        }

    }



    this.stateChange = function (object) {

        if (this.request.readyState==4) {

            this.callbackFunction(this.request.responseText);

        }

    }



    if(this.request) {

        this.request.onreadystatechange = this.bindFunction(this.stateChange, this);



        if (this.postBody!="") {

			

			var xxx = save_form_details();

			

            this.request.open("POST", url, true);

            this.request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

			this.request.send("x=1");

            this.request.setRequestHeader('Connection', 'close');

			



        } else {

		//	var xxx = save_form_details();

			//alert(encodeBase64(xxx))

            this.request.open("GET", url, true);

			//alert("Y");

        }



        this.request.send(this.postBody);

    }

	

	//save_form_details();

	

}



function save_form_details()

{

	// save text fields and checkboxes

	var x = document.getElementsByTagName('input');

	var output = new Array();

	if(x.length > 0)

	{

		for(i = 0; i < x.length; i++)

		{

			output[i] = x[i].name + "=" +  x[i].value;

			//console.log(x[i].name);

		}

		

	}

	//console.log(output[2]);

	//var t = serialize(output);

	// save select fields

	

	

	var mypostrequest=new ajaxRequest()

	mypostrequest.onreadystatechange=function()

	{

		if (mypostrequest.readyState==4){

			if (mypostrequest.status==200 || window.location.href.indexOf("http")==-1){

				//document.getElementById("result").innerHTML=mypostrequest.responseText

			} else{

				alert("An error has occured making the request")

			}

		}

	}

	//var namevalue=encodeURIComponent(document.getElementById("name").value);

	//var agevalue=encodeURIComponent(document.getElementById("age").value);

	var parameters = output.join("&");

	//alert(parameters);

	mypostrequest.open("POST", "/inspectors/save-ajax", true);

	mypostrequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

	mypostrequest.send(parameters);

	

	//return t;

}







// ------------------------------------------------------------------------------------------- \\



function ajaxRequest(){

 var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] //activeX versions to check for in IE

 if (window.ActiveXObject){ //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)

  for (var i=0; i<activexmodes.length; i++){

   try{

    return new ActiveXObject(activexmodes[i])

   }

   catch(e){

    //suppress error

   }

  }

 }

 else if (window.XMLHttpRequest) // if Mozilla, Safari etc

  return new XMLHttpRequest()

 else

  return false

}











// ------------------------------------------------------------------------------------------- \\





function serialize( mixed_value ) {

    // http://kevin.vanzonneveld.net

    // +   original by: Arpad Ray (mailto:arpad@php.net)

    // +   improved by: Dino

    // +   bugfixed by: Andrej Pavlovic

    // +   bugfixed by: Garagoth

    // %          note: We feel the main purpose of this function should be to ease the transport of data between php & js

    // %          note: Aiming for PHP-compatibility, we have to translate objects to arrays

    // *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);

    // *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'

    // *     example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});

    // *     returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'

 

    var _getType = function( inp ) {

        var type = typeof inp, match;

        var key;

        if (type == 'object' && !inp) {

            return 'null';

        }

        if (type == "object") {

            if (!inp.constructor) {

                return 'object';

            }

            var cons = inp.constructor.toString();

            if (match = cons.match(/(\w+)\(/)) {

                cons = match[1].toLowerCase();

            }

            var types = ["boolean", "number", "string", "array"];

            for (key in types) {

                if (cons == types[key]) {

                    type = types[key];

                    break;

                }

            }

        }

        return type;

    };

    var type = _getType(mixed_value);

    var val, ktype = '';

    

    switch (type) {

        case "function": 

            val = ""; 

            break;

        case "undefined":

            val = "N";

            break;

        case "boolean":

            val = "b:" + (mixed_value ? "1" : "0");

            break;

        case "number":

            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;

            break;

        case "string":

            val = "s:" + mixed_value.length + ":\"" + mixed_value + "\"";

            break;

        case "array":

        case "object":

            val = "a";

            /*

            if (type == "object") {

                var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);

                if (objname == undefined) {

                    return;

                }

                objname[1] = serialize(objname[1]);

                val = "O" + objname[1].substring(1, objname[1].length - 1);

            }

            */

            var count = 0;

            var vals = "";

            var okey;

            var key;

            for (key in mixed_value) {

                ktype = _getType(mixed_value[key]);

                if (ktype == "function") { 

                    continue; 

                }

                

                okey = (key.match(/^[0-9]+$/) ? parseInt(key) : key);

                vals += serialize(okey) +

                        serialize(mixed_value[key]);

                count++;

            }

            val += ":" + count + ":{" + vals + "}";

            break;

    }

    if (type != "object" && type != "array") val += ";";

    return val;

}







// base 64



function urlDecode(str){

    str=str.replace(new RegExp('\\+','g'),' ');

    return unescape(str);

}

function urlEncode(str){

    str=escape(str);

    str=str.replace(new RegExp('\\+','g'),'%2B');

    return str.replace(new RegExp('%20','g'),'+');

}



var END_OF_INPUT = -1;



var base64Chars = new Array(

    'A','B','C','D','E','F','G','H',

    'I','J','K','L','M','N','O','P',

    'Q','R','S','T','U','V','W','X',

    'Y','Z','a','b','c','d','e','f',

    'g','h','i','j','k','l','m','n',

    'o','p','q','r','s','t','u','v',

    'w','x','y','z','0','1','2','3',

    '4','5','6','7','8','9','+','/'

);



var reverseBase64Chars = new Array();

for (var i=0; i < base64Chars.length; i++){

    reverseBase64Chars[base64Chars[i]] = i;

}



var base64Str;

var base64Count;

function setBase64Str(str){

    base64Str = str;

    base64Count = 0;

}

function readBase64(){    

    if (!base64Str) return END_OF_INPUT;

    if (base64Count >= base64Str.length) return END_OF_INPUT;

    var c = base64Str.charCodeAt(base64Count) & 0xff;

    base64Count++;

    return c;

}

function encodeBase64(str){

    setBase64Str(str);

    var result = '';

    var inBuffer = new Array(3);

    var lineCount = 0;

    var done = false;

    while (!done && (inBuffer[0] = readBase64()) != END_OF_INPUT){

        inBuffer[1] = readBase64();

        inBuffer[2] = readBase64();

        result += (base64Chars[ inBuffer[0] >> 2 ]);

        if (inBuffer[1] != END_OF_INPUT){

            result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);

            if (inBuffer[2] != END_OF_INPUT){

                result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);

                result += (base64Chars [inBuffer[2] & 0x3F]);

            } else {

                result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]);

                result += ('=');

                done = true;

            }

        } else {

            result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);

            result += ('=');

            result += ('=');

            done = true;

        }

        lineCount += 4;

        if (lineCount >= 76){

            result += ('\n');

            lineCount = 0;

        }

    }

    return result;

}

function readReverseBase64(){   

    if (!base64Str) return END_OF_INPUT;

    while (true){      

        if (base64Count >= base64Str.length) return END_OF_INPUT;

        var nextCharacter = base64Str.charAt(base64Count);

        base64Count++;

        if (reverseBase64Chars[nextCharacter]){

            return reverseBase64Chars[nextCharacter];

        }

        if (nextCharacter == 'A') return 0;

    }

    return END_OF_INPUT;

}



function ntos(n){

    n=n.toString(16);

    if (n.length == 1) n="0"+n;

    n="%"+n;

    return unescape(n);

}



function decodeBase64(str){

    setBase64Str(str);

    var result = "";

    var inBuffer = new Array(4);

    var done = false;

    while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT

        && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT){

        inBuffer[2] = readReverseBase64();

        inBuffer[3] = readReverseBase64();

        result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));

        if (inBuffer[2] != END_OF_INPUT){

            result +=  ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));

            if (inBuffer[3] != END_OF_INPUT){

                result +=  ntos((((inBuffer[2] << 6)  & 0xff) | inBuffer[3]));

            } else {

                done = true;

            }

        } else {

            done = true;

        }

    }

    return result;

}



var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

function toHex(n){

    var result = ''

    var start = true;

    for (var i=32; i>0;){

        i-=4;

        var digit = (n>>i) & 0xf;

        if (!start || digit != 0){

            start = false;

            result += digitArray[digit];

        }

    }

    return (result==''?'0':result);

}



function pad(str, len, pad){

    var result = str;

    for (var i=str.length; i<len; i++){

        result = pad + result;

    }

    return result;

}



function encodeHex(str){

    var result = "";

    for (var i=0; i<str.length; i++){

        result += pad(toHex(str.charCodeAt(i)&0xff),2,'0');

    }

    return result;

}



var hexv = {

  "00":0,"01":1,"02":2,"03":3,"04":4,"05":5,"06":6,"07":7,"08":8,"09":9,"0A":10,"0B":11,"0C":12,"0D":13,"0E":14,"0F":15,

  "10":16,"11":17,"12":18,"13":19,"14":20,"15":21,"16":22,"17":23,"18":24,"19":25,"1A":26,"1B":27,"1C":28,"1D":29,"1E":30,"1F":31,

  "20":32,"21":33,"22":34,"23":35,"24":36,"25":37,"26":38,"27":39,"28":40,"29":41,"2A":42,"2B":43,"2C":44,"2D":45,"2E":46,"2F":47,

  "30":48,"31":49,"32":50,"33":51,"34":52,"35":53,"36":54,"37":55,"38":56,"39":57,"3A":58,"3B":59,"3C":60,"3D":61,"3E":62,"3F":63,

  "40":64,"41":65,"42":66,"43":67,"44":68,"45":69,"46":70,"47":71,"48":72,"49":73,"4A":74,"4B":75,"4C":76,"4D":77,"4E":78,"4F":79,

  "50":80,"51":81,"52":82,"53":83,"54":84,"55":85,"56":86,"57":87,"58":88,"59":89,"5A":90,"5B":91,"5C":92,"5D":93,"5E":94,"5F":95,

  "60":96,"61":97,"62":98,"63":99,"64":100,"65":101,"66":102,"67":103,"68":104,"69":105,"6A":106,"6B":107,"6C":108,"6D":109,"6E":110,"6F":111,

  "70":112,"71":113,"72":114,"73":115,"74":116,"75":117,"76":118,"77":119,"78":120,"79":121,"7A":122,"7B":123,"7C":124,"7D":125,"7E":126,"7F":127,

  "80":128,"81":129,"82":130,"83":131,"84":132,"85":133,"86":134,"87":135,"88":136,"89":137,"8A":138,"8B":139,"8C":140,"8D":141,"8E":142,"8F":143,

  "90":144,"91":145,"92":146,"93":147,"94":148,"95":149,"96":150,"97":151,"98":152,"99":153,"9A":154,"9B":155,"9C":156,"9D":157,"9E":158,"9F":159,

  "A0":160,"A1":161,"A2":162,"A3":163,"A4":164,"A5":165,"A6":166,"A7":167,"A8":168,"A9":169,"AA":170,"AB":171,"AC":172,"AD":173,"AE":174,"AF":175,

  "B0":176,"B1":177,"B2":178,"B3":179,"B4":180,"B5":181,"B6":182,"B7":183,"B8":184,"B9":185,"BA":186,"BB":187,"BC":188,"BD":189,"BE":190,"BF":191,

  "C0":192,"C1":193,"C2":194,"C3":195,"C4":196,"C5":197,"C6":198,"C7":199,"C8":200,"C9":201,"CA":202,"CB":203,"CC":204,"CD":205,"CE":206,"CF":207,

  "D0":208,"D1":209,"D2":210,"D3":211,"D4":212,"D5":213,"D6":214,"D7":215,"D8":216,"D9":217,"DA":218,"DB":219,"DC":220,"DD":221,"DE":222,"DF":223,

  "E0":224,"E1":225,"E2":226,"E3":227,"E4":228,"E5":229,"E6":230,"E7":231,"E8":232,"E9":233,"EA":234,"EB":235,"EC":236,"ED":237,"EE":238,"EF":239,

  "F0":240,"F1":241,"F2":242,"F3":243,"F4":244,"F5":245,"F6":246,"F7":247,"F8":248,"F9":249,"FA":250,"FB":251,"FC":252,"FD":253,"FE":254,"FF":255

};



function decodeHex(str){

    str = str.toUpperCase().replace(new RegExp("s/[^0-9A-Z]//g"));

    var result = "";

    var nextchar = "";

    for (var i=0; i<str.length; i++){

        nextchar += str.charAt(i);

        if (nextchar.length == 2){

            result += ntos(hexv[nextchar]);

            nextchar = "";

        }

    }

    return result;

    

}


