
function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}


(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 + '"';
            }
        };

    Object.prototype.toJSONString = function () {
        return s.object(this);
    };

    Array.prototype.toJSONString = function () {
        return s.array(this);
    };
})();

function Jax()
{
	
	var loadingTimeout = 400;
	
	this.loadingFunction = function(){};
	this.doneLoadingFunction = function(){};
	
	/**
	 * Get XMLHttpObject
	 */	 	
	this.getRequestObject = function()
	{
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
		   http_request = new XMLHttpRequest();
		} else if (window.ActiveXObject) { // IE
		    var msxmlhttp = new Array(
					'Msxml2.XMLHTTP.4.0',
					'Msxml2.XMLHTTP.3.0',
					'Msxml2.XMLHTTP',
					'Microsoft.XMLHTTP');
		    
		    for (var i = 0; i < msxmlhttp.length; i++) {
				try {
					http_request = new ActiveXObject(msxmlhttp[i]);
				} catch (e) {
					http_request = null;
				}
			}
		}
		
		if (!http_request) {
		   alert('Unfortunatelly you browser doesn\'t support this feature.');
		   return false;
		}
		
		return http_request;
	}

	/**
	 * xajax.$() is shorthand for document.getElementById()
	 */
	this.$ = function(sId)
	{
		if (!sId) {
			return null;
		}
		var returnObj = document.getElementById(sId);
		if (!returnObj && document.all) {
			returnObj = document.all[sId];
		}
		
		return returnObj;
	}
	
	/**
	 * Sumbit ajax task
	 */
	this.submitTask = function(func, postData, responseFunc){
	
	    var xmlhttp =  this.getRequestObject();
	    var targetUrl = jax_live_site;
	    
	    /*
	    if(targetUrl.substr(-1, 1) == "/"){
	        targetUrl += "index.php";
	    } else {
	        targetUrl += "/index.php";
	    }
	    */
	    
	
	    xmlhttp.open('POST', targetUrl, true);
	    xmlhttp.onreadystatechange = function() {
	        if (xmlhttp.readyState == 4) {
	            if (xmlhttp.status == 200){
	            	jax.doneLoadingFunction();
	            	jax.processResponse(xmlhttp.responseText);
	            }else {
	                // warning ajax fails
	            }
	        }
	    }
	    
	    var id = 1;
	    var com = "jomcomment";
	    var xmlReq = '';
	    xmlReq += '&option='+ com;
	    xmlReq += '&no_html=1';
	    xmlReq += '&task=jax';
	    xmlReq += '&func=' + func; 
	    if(postData){
	        xmlReq += "&" + postData;
	    }
		
		this.loadingFunction();
	    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	    xmlhttp.send(xmlReq);
	}
	
	/**
	 * Process the json string
	 */	 	
	this.processResponse = function(responseTxt){
		// clean up any previous error 
		responseTxt = responseTxt.substring(responseTxt.indexOf("{"));
		var result = eval("(" + responseTxt + ")");
		
		// we now have an array, that contains an array.
		for(var i=0; i<result.length;i++){
		
			var cmd 		= result[i][0];
			var id			= result[i][1];
			var property 	= result[i][2];
			var data 		= result[i][3];

			var objElement = this.$(id);
			switch(cmd){
				case 'as': 	// assign or clear
					
					if(objElement){
						data = data.replace(/"/g, "\\\"");
						eval("objElement."+property+"=\""+ data + "\";");
					}
						
					break;
					
				case 'al':	// alert
					if(data)
						alert(data);
					break;
					
				case 'cs':	// call script
					var scr = id + '(';
					if(this.isArray(data)){
						scr += 'data[0]';
						for (var l=1; l<data.length; l++) {
							scr += ',data['+l+']';
						}
					} else {
						scr += 'data';
					}
					scr += ');';
					eval(scr);
					break;
			}
		}
		
		delete responseTxt;
	}
	
	/**
	 *
	 */	 	
	
	this.isArray =  function(obj) { // this works
		if(obj)
			return obj.constructor == Array;
		return false;
	}
	
	/**
	 * Function call to PHP function
	 */
	this.call = function(sFunction){
		
		var arg = "";
		if(arguments.length > 1){
			for(var i=1; i < arguments.length; i++){
				var a = arguments[i];
				
				if(this.isArray(a)){
					arg += "arg" + i + "=" + a.toJSONString() + "&";
				}else if(typeof a =="string"){
					a = a.replace(/"/g, "&quot;");
					var t = new Array('_d_', encodeURIComponent(a));
					arg += "arg" + i + "=" + t.toJSONString() + "&";
				} else {
					var t = new Array('_d_', encodeURIComponent(a));
					arg += "arg" + i + "=" + t.toJSONString() + "&";
				}
			}
		}
		
		this.submitTask(sFunction, arg);
	}
	
	/**
	 * Return an array of data within the form object
	 */	 	
	this.getFormValues = function(frm){
		var objForm;
		objForm = this.$(frm);

		var postData = new Array();
		if (objForm && objForm.tagName == 'FORM'){
			var formElements = objForm.elements;
			for( var i=0; i < formElements.length; i++){
				if (!formElements[i].name)
					continue;
				if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false)
					continue;
				var name = formElements[i].name;
				if (name){
					if(formElements[i].type=='select-multiple'){
						postData[i] = new Array();
						for (var j = 0; j < formElements[i].length; j++){
							if (formElements[i].options[j].selected == true){
								var value = formElements[i].options[j].value;
								value = value.replace(/"/g, "&quot;");
								postData[i][j] = new Array(name, encodeURIComponent(value));
							
							}
						}
					} else {
						var value = formElements[i].value;
						value = value.replace(/"/g, "&quot;");
						postData[i] = new Array(name, encodeURIComponent(value));
					}
				} 
			}
		}
		
		return postData;
	}	
}

var jax = new Jax();
