/*******************************************************************************
	Filename		: ajax.js

	Created			: 21 October 2006
	Created by		: Las Vegas

	Last Updated	: 5 September 2007
	Updated by		: Las Vegas

	Comments		: Version 4.0  
*******************************************************************************/	
function ajax(url, postData, successFn, errorFn, isJson) 
{
    var http_request = false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
            // See note below about this line
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

    if (!http_request) {
    	if (errorFn) {
    		errorFn(null);
		}
        return false;
    }
    http_request.onreadystatechange = function () {
		if (http_request.readyState == 4) 
			if (http_request.status == 200) {
				var data;
				if (isJson) {
					data = JSON.decode(http_request.responseText);
				} else {
					data = http_request.responseText;
				} 
          		successFn(data);
          	}
      		else
			if (errorFn) {
				errorFn(http_request);
			}
	}
    if (url=='')
			url = window.location.protocol + '//' + window.location.hostname + window.location.pathname;

		if (postData)
    {
			if (typeof(postData)=='object')
			{
				postUrl = '';
      	for (var postKey in postData)
      		postUrl+=postKey+'='+encodeURIComponent(postData[postKey])+'&';
      	
				if (postUrl.length)
					postUrl = postUrl.slice(0, -1);
      } else
      	postUrl = postData;
      	
			http_request.open('POST', url);
      http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
      http_request.setRequestHeader("X-Requested-With", 'XMLHttpRequest');

      http_request.send(postUrl);
    } else
    {
	  http_request.open('GET', url);
	  http_request.setRequestHeader("X-Requested-With", 'XMLHttpRequest');
      http_request.send(null);
    }
}

JSON = new function(){
    var useHasOwn = {}.hasOwnProperty ? true : false;
    
    // crashes Safari in some instances
    //var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
    
    var pad = function(n) {
        return n < 10 ? '0' + n : n;
    };
    
    var m = {
        '\b': '\\b',
        '\t': '\\t',
        '\n': '\\n',
        '\f': '\\f',
        '\r': '\\r',
        '"' : '\\"',
        '\\': '\\\\'
    };

    var encodeString = function(s){
        if (/["\\\x00-\x1f]/.test(s)) {
            return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
                var c = m[b];
                if(c){
                    return c;
                }
                c = b.charCodeAt();
                return '\\u00' +
                    Math.floor(c / 16).toString(16) +
                    (c % 16).toString(16);
            }) + '"';
        }
        return '"' + s + '"';
    };
    
    var encodeArray = function(o){
        var a = ['['], b, i, l = o.length, v;
            for (i = 0; i < l; i += 1) {
                v = o[i];
                switch (typeof v) {
                    case 'undefined':
                    case 'function':
                    case 'unknown':
                        break;
                    default:
                        if (b) {
                            a.push(',');
                        }
                        a.push(v === null ? "null" : JSON.encode(v));
                        b = true;
                }
            }
            a.push(']');
            return a.join('');
    };
    
    var encodeDate = function(o){
        return '"' + o.getFullYear() + '-' +
                pad(o.getMonth() + 1) + '-' +
                pad(o.getDate()) + 'T' +
                pad(o.getHours()) + ':' +
                pad(o.getMinutes()) + ':' +
                pad(o.getSeconds()) + '"';
    };
    
    /**
     * Encodes an Object, Array or other value
     * @param {Mixed} o The variable to encode
     * @return {String} The JSON string
     */
    this.encode = function(o){
        if(typeof o == 'undefined' || o === null){
            return 'null';
        }else if(o instanceof Array){
            return encodeArray(o);
        }else if(o instanceof Date){
            return encodeDate(o);
        }else if(typeof o == 'string'){
            return encodeString(o);
        }else if(typeof o == 'number'){
            return isFinite(o) ? String(o) : "null";
        }else if(typeof o == 'boolean'){
            return String(o);
        }else {
            var a = ['{'], b, i, v;
            for (var i in o) {
                if(!useHasOwn || o.hasOwnProperty(i)) {
                    v = o[i];
                    switch (typeof v) {
                    case 'undefined':
                    case 'function':
                    case 'unknown':
                        break;
                    default:
                        if(b){
                            a.push(',');
                        }
                        a.push(this.encode(i), ':',
                                v === null ? "null" : this.encode(v));
                        b = true;
                    }
                }
            }
            a.push('}');
            return a.join('');
        }
    };
    
    /**
     * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.
     * @param {String} json The JSON string
     * @return {Object} The resulting object
     */
    this.decode = function(json){
        // although crockford had a good idea, this line crashes safari in some instances
        //try{
            //if(validRE.test(json)) {
                return eval('(' + json + ')');
           // }
       // }catch(e){
       // }
       // throw new SyntaxError("parseJSON");
    };
}();
