App-XUL

 view release on metacpan or  search on metacpan

misc/AppXUL.js  view on Meta::CPAN

	        .createInstance(Components.interfaces.nsIDOMParser);
	         
	    var systemPrincipal = 
	    	Components.classes["@mozilla.org/systemprincipal;1"]
          .createInstance(Components.interfaces.nsIPrincipal);

	    //parser.init(systemPrincipal, null, null);
	                 
	    string = 
	    	//'<?xml version="1.0"?>'+"\n"+
	    	'<html:div xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" '+
					'xmlns:html="http://www.w3.org/1999/xhtml">'+string+'</html:div>';
			//dbg(string);

			var doc = parser.parseFromString(string, 'text/xml');
			if (doc.documentElement.namespaceURI === 'http://www.mozilla.org/newlayout/xml/parsererror.xml' &&
					doc.documentElement.tagName === 'parsererror') {
				//var errorDescription = doc.documentElement.firstChild.nodeValue;
				//dbg(errorDescription);
				return null;
			} else {
				doc = doc.childNodes[0];
				var elems = [];
				for (var i = 0; i < doc.childNodes.length; i++) {
					elems.push(doc.childNodes[i]);
				}
				//doc.setAttribute("xmlns","http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
				//doc.setAttribute("xmlns:html","http://www.w3.org/1999/xhtml");
				return elems;
			}
		},
		
	xml2string: function (xml) {
	
			var serializer = Components.classes["@mozilla.org/xmlextras/xmlserializer;1"].createInstance(Components.interfaces.nsIDOMSerializer);
 			var string = serializer.serializeToString(xml);
 			return string;
		},

	// sends an ajax request
	ajax: function (url, string, onsuccess, onfailure, onwait) {	

			var xhr = new XMLHttpRequest();
			var success_cb = onsuccess;
			var failure_cb = onfailure;
			var wait_cb    = onwait;
			
			xhr.onreadystatechange = function () {
				if (wait_cb)
					wait_cb();
				if (xhr.readyState == 4) {
					if (xhr.status == 200) { 
						if (success_cb) 
							success_cb(xhr.responseText);
					} else {
						if (failure_cb)
							failure_cb(xhr.status, xhr.statusText);
					} 
				}
			};
			xhr.open("GET", url+"?data="+escape(string), true);
			xhr.send(null);
		},
	
	// updates the DOM based on a change description
	update: function (description) {
		if (description.action == 'update') {
			if ($(description.id)) {
				// update attributes
				for (var attr in description.attributes) {
					//dbg(description.id+"."+attr+" = '"+description.attributes[attr]+"'");
					$(description.id).setAttribute(attr, description.attributes[attr]);
				}
			}
		}
		else if (description.action == 'create') {
			if ($(description.parent)) {
				//dbg(description.content);
				var elems = AppXUL.string2xml(description.content);
				if (elems) {
					for (var i = 0; i < elems.length; i++) {
						try {
							$(description.parent).appendChild(elems[i]);
						} catch (err) {
							//dbg("err: "+err.name+" / "+err.message);
						}
					}
				}
				//dbg(AppXUL.xml2string($(description.parent)));
			}
		}
		else if (description.action == 'remove') {
			if ($(description.id)) {
				var parent = $(description.id).parentNode;
				parent.removeChild($(description.id));
			}
		}
		
		// perform sub-actions
		if (description.subactions) {
			for (var i = 0; i < description.subactions.length; i++) {
				AppXUL.update(description.subactions[i]);
			}
		}
	},
	
	// sends an event to the server
	send: function (eventType, elementId) {
	
			// send event to server	
			AppXUL.ajax(
				"http://localhost:3000/",
				'{"event":"'+eventType+'"'+(elementId ? ', "id":"'+elementId+'"' : '')+'}',
				function (responseText) { // success
					//dbg("Received:"+responseText);
					// integrate answer
					AppXUL.update(eval("("+responseText+')'));
				},
				function (status, statusText) { // failure
					dbg("Error: returned status code "+status+" "+statusText); 
				},
				function () { // wait
					//dbg("Waiting for server...");   
				}
			);
		},
		
	// processess an async message sent from a server
	async: function (string) {
			
			string = string.split(/\r?\n\r?/)[0];
			string = unescape(string.replace(/^GET \/\?data\=(.*) HTTP.*$/, '$1'));
			//dbg("async: "+string);
			
			var result = '{"content":""}';
			try {
				var action;
				eval("action = "+string);
				
				// perform action
				if (action.action == 'child') {
					if (action.id && (""+action.number).match(/^\d+$/)) {
						//dbg("num children "+$(action.id).childNodes.length);
						result = '{"content":"'+$(action.id).childNodes[action.number].id+'"}';
					}
				}
				else if (action.action == 'numchildren') {
					if (action.id) {
						result = '{"content":"'+$(action.id).childNodes.length+'"}';
					}
				}
				else if (action.action == 'insert') {
					if (action.id && action.position && action.content) {
						//dbg("insert xml "+action.content);
						var elems = AppXUL.string2xml(action.content);
						if (elems) {
							for (var i = 0; i < elems.length; i++) {
								try {
									$(action.id).appendChild(elems[i]);
								} catch (err) {
									//dbg("err: "+err.name+" / "+err.message);
								}
							}
						}
						//$(action.id).appendChild(AppXUL.string2xml(action.content));
					}				
				}
				else if (action.action == 'update') {
					if (action.id && action.content) {
						// remove child nodes
						while ($(action.id).childNodes.length > 0) {
							$(action.id).removeChild($(action.id).childNodes[0]);
						}
						// add new child node(s)
						var elems = AppXUL.string2xml(action.content);
						if (elems) {
							for (var i = 0; i < elems.length; i++) {
								try {
									$(action.id).appendChild(elems[i]);
								} catch (err) {
									//dbg("err: "+err.name+" / "+err.message);
								}
							}
						}
					}
				}
				else if (action.action == 'remove') {
					if (action.id && $(action.id).parentNode) {
						$(action.id).parentNode.removeChild($(action.id));
					}
				}
				else if (action.action == 'trigger') {



( run in 0.570 second using v1.01-cache-2.11-cpan-5735350b133 )