var JSON = {};
(function ($) {
    var m = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        s = {
            'array': function (x) {
                var a = ['['], b, f, i, l = x.length, v;
                for (i = 0; i < l; i += 1) {
                    v = x[i];
                    f = s[typeof v];
                    if (f) {
                        v = f(v);
                        if (typeof v == 'string') {
                            if (b) {
                                a[a.length] = ',';
                            }
                            a[a.length] = v;
                            b = true;
                        }
                    }
                }
                a[a.length] = ']';
                return a.join('');
            },
            'boolean': function (x) {
                return String(x);
            },
            'null': function (x) {
                return "null";
            },
            'number': function (x) {
                return isFinite(x) ? String(x) : 'null';
            },
            'object': function (x) {
                if (x) {
                    if (x instanceof Array) {
                        return s.array(x);
                    }
                    var a = ['{'], b, f, i, v;
                    for (i in x) {
                        v = x[i];
                        f = s[typeof v];
                        if (f) {
                            v = f(v);
                            if (typeof v == 'string') {
                                if (b) {
                                    a[a.length] = ',';
                                }
                                a.push(s.string(i), ':', v);
                                b = true;
                            }
                        }
                    }
                    a[a.length] = '}';
                    return a.join('');
                }
                return 'null';
            },
            'string': function (x) {
                if (/["\\\x00-\x1f]/.test(x)) {
                    x = x.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 '"' + x + '"';
            }
        };

	$.toJSON = function(v) {
		var f = isNaN(v) ? s[typeof v] : s['number'];
		if (f) { return f(v); }
	};
	
	$.parseJSON = function(v, safe) {
		if (safe === undefined) { safe = $.parseJSON.safe; }
		if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v)) {
			return undefined;
		}
		return eval('('+v+')');
	};
	
	$.parseJSON.safe = true;

})(JSON);



function getXMLHTTP(){
	var A=null;
	try{
		A=new ActiveXObject("Msxml2.XMLHTTP");
	}catch(e){
		try{
			A=new ActiveXObject("Microsoft.XMLHTTP");
		} catch(oc){
			A=null;
		}
	}
	if(!A && typeof XMLHttpRequest != "undefined") {
		A=new XMLHttpRequest();
	}

	return A;
}



function callMethod( object, func ) { 
	var request = getXMLHTTP();
	var url;
	
	request.onreadystatechange = function() {
		handleMethodResponse( request, func );
	};
	
	url = "index.php?objectID=" + escape( object );

	url += "&_call[]=" + escape( arguments[1] );
	
	for ( var i = 2; i < arguments.length; i++ ) {
		url += "&_call[]=[" + escape( JSON.toJSON(arguments[i]) ) + "]";
	}

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

	request.send( "" );
}

function callCMS( object, obj, callback, func ) { 
	var request = getXMLHTTP();
	var url;
	
	request.onreadystatechange = function() {
		handleMethodResponseCallback( request, obj, callback, func );
	};
	
	url = "index.php?objectID=" + escape( object );

	url += "&_call[]=" + escape( arguments[3] );
	
	for ( var i = 4; i < arguments.length; i++ ) {
		url += "&_call[]=[" + escape( JSON.toJSON(arguments[i]) ) + "]";
	}

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

	request.send( "" );
}

function callStatic( klass, obj, callback, func ) { 
	var request = getXMLHTTP();
	var url;
	
	request.onreadystatechange = function() {
		handleMethodResponseCallback( request, obj, callback, func );
	};
	
	url = "index.php?class=" + escape( klass );

	url += "&_call[]=" + escape( arguments[3] );
	
	for ( var i = 4; i < arguments.length; i++ ) {
		url += "&_call[]=[" + escape( JSON.toJSON(arguments[i]) ) + "]";
	}

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

	request.send( "" );
}



function handleMethodResponse( request, func ) {
    try {
		if ( request && request.readyState == 4 ) {

    		try {
				if ( request.status == 200 ) {
					var jsonData = false;
					
					try {
						jsonData = JSON.parseJSON(request.responseText);
					} catch ( e ) {
						alert('Error parsing JSON data: '+request.responseText);	
					}

					try {
						eval('_' + func)( jsonData[0] );
					} catch( e ) {
						alert('Error calling JSON callback function _' + func + '. JSON Data was: ' + request.responseText );
					}
				}
			} catch( e ) {
				alert("JSON status Error: " + e.name + ". (" + e.message + ")");
			}
		
			request = null;
		}
	} catch( e ) {
		alert("JSON readyState Error: " + e.name + ". (" + e.message + ")");
	}
}


function handleMethodResponseCallback( request, obj, callback, func ) {
    try {
		if ( request && request.readyState == 4 ) {

    		try {
				if ( request.status == 200 ) {
					var jsonData = false;
					
					try {
						jsonData = JSON.parseJSON(request.responseText);
					} catch ( e ) {
						alert('Error parsing JSON data: '+request.responseText);	
					}

					try {
						callback.call( obj, jsonData[0] );
					} catch( e ) {
						//alert('Error calling JSON callback function ' + func + '. JSON Data was: ' + request.responseText );
					}
				}
			} catch( e ) {
				alert("JSON status Error: " + e.name + ". (" + e.message + ")");
			}
		
			request = null;
		}
	} catch( e ) {
		alert("JSON readyState Error: " + e.name + ". (" + e.message + ")");
	}
}
