function getClassName(obj) {
	if (typeof obj != "object" || obj === null) return false;
	try{
		return /(\w+)\(/.exec(obj.constructor.toString())[1];
	} catch(e) {
		return null;
	}
}

(function($){
	
	$.objectToXml = function(dat, el, dataName, xml){
		var cname = getClassName(dat);
		if(cname == "Array"){
			for(var i = 0; i < dat.length; i++){
				var nel = xml.createElement(dataName);
				$.objectToXml(dat[i], nel, dataName, xml); 
				el.appendChild(nel);
			}
		} else if(cname == "Object"){
			for(var i in dat){
				$.objectToXml(dat[i], el, i, xml); 
			}
		}	else {
			var nel = xml.createElement(dataName);
			var txt = xml.createTextNode("" + dat);
			nel.appendChild(txt);
			el.appendChild(nel);
		}	
	};
	
	$.styleUiButtons = function(s, imgMode){
		if(!imgMode) $(s).addClass("ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only");
		else $(s).addClass("ui-button ui-widget ui-state-default ui-corner-all");
		$(s).hover( 
			function(){ $(this).addClass("ui-state-hover"); }, 
			function(){ $(this).removeClass("ui-state-hover");}
		)
	};
	
	$.extendScriptToObject = function(o, s){
		var toEv = "var tmp = {" + s + "}";
		eval(toEv);
		var ret = $.extend(o, tmp);
		return ret;
	};
	
	$.createXMLDom = function(xmlString){
		var doc;
		if(document.implementation.createDocument) {
        var parser = new DOMParser()
        doc = parser.parseFromString(xmlString, "text/xml")
    // MSIE
    } else if (window.ActiveXObject) {
        doc = new ActiveXObject("Microsoft.XMLDOM")
        doc.async="false"
        doc.loadXML(xmlString)
    }
    return doc;
		
	};
	
	$.log = function(message) {
		//$('#logdiv').html('<div>' + message + '</div>' + $('#logdiv').html());
	  if(window.console) {
	  	if(console.log) {
	  		console.log(message);
	  		return;
	  	}
	  	if(console.debug) {
	  		console.debug(message);
	  		return;
	  	}
	  	if(console.info) {
	  		console.info(message);
	  		return;
	  	}
	  } else {
	     //alert(message);
	  }
	};

	$.isDef = function(v){
		return (!(typeof(v) == 'undefined'))
	};
		
	$.jartXMLFile = {
		postURL: "bin/save-xml.jart?file=",
		save: function(xdata, fn, cb){
			//var data = [{name: "file", value: fn}].concat(xdata);
			$.ajax({ 
				processData: false,
				contentType: "text/xml",
				url: this.postURL + fn, 
				dataType: "xml",
				type: "POST", 
				data: xdata, 
				success: cb
			});
		},
		/*open: function(fn, cb, cb2){
			var f = "bin/load-xml.jart?file=" + fn;
			//var f = fn.indexOf("?") > -1 ? fn + "&dummy=" + $.uid() : fn + "?dummy=" + $.uid();
			//if(f.substr(0,1) == "/") f = "/jart" + f;
			$.log(f);
			$.ajax({ 
				//url: f, 
				url: f, 
				dataType: "xml",
				type: "GET", 
				success: cb,
				error: cb2,
			});*/
		open: function(fn, cb, cb2){
			var f = fn.indexOf("?") > -1 ? fn + "&dummy=" + $.uid() : fn + "?dummy=" + $.uid();
			if(f.substr(0,1) == "/") f = "/jart" + f;
			$.ajax({ 
				url: f, 
				dataType: "xml",
				type: "GET", 
				success: cb,
				error: cb2
			});			
		}
	};
	
	$.jartJSonFile = {
		postURL: "bin/save-json.jart",
		save: function(obj, fn, cb){
			var data = [{name: "data", value: JSON.stringify(obj)}, {name: "file", value: fn}];
			$.ajax({ 
				url: this.postURL, 
				dataType: "xml",
				type: "POST", 
				data: data, 
				success: cb
			});
		},
		open: function(fn, cb, ce){
			var f = fn.indexOf("?") > -1 ? fn + "&dummy=" + $.uid() : fn + "?dummy=" + $.uid();
			if(f.substr(0,1) == "/") f = "/jart" + f;
			$.ajax({ 
				url: f, 
				dataType: "json",
				type: "GET", 
				success: cb,
				error: ce
			});			
		}
	};
	
	
	$.uid = function(){
		return "R" + (((1+Math.random())*0x10000000)|0).toString(16).substring(1) + 'X' + (((1+Math.random())*0x10000000)|0).toString(16).substring(1);
	}; 
	
	$.xmlAttToProperty = function(o1, o2) {
		var ret = o2;
		if(!ret) ret = new Object();
		for(var i = 0; i <  o1.attributes.length; i++){
			var newName = o1.attributes[i].name.split("-").join("_");
			ret[newName] = o1.attributes[i].value;
		}
		return ret;
	};
	
	String.prototype.template = function (o) {
		return this.replace(/{([^{}]*)}/g,
	  function (a, b) {
	  		var r = o[b];
	    	return typeof r === 'string' || typeof r === 'number' ? r : a;
	    }
	  );
	};
	
	
	String.prototype.replaceMultiple = function (f, to) {
		var ret = this;
		for(var i = 0; i < f.length; i++){
			var t = "";
			if(to && to[0]){
				t = to[i] ? to[i] : to[0];
			}
			ret = ret.replace(RegExp(f[i], "g"), t);
		}
		return ret;
	};
	
	Array.prototype.each = function (fnc) {
		for(var i = 0; i < this.length; i++){
			fnc(this[i], i);
		}
	};
	
	
	$.queryToObject = function(n){
		var ret = {};
		var b = window.location.href.split("?");
		if(b.length > 1){
			var p = b[1].split("&");
			for(var i = 0; i < p.length; i++){
				var c = p[i].split("=");
				ret[c[0]] = c[1];
			}
		}
		return ret;
	};
	
})(jQuery);

