}
};
+ var curLocation = (new java.io.File("./")).toURL();
+
window.__defineSetter__("location", function(url){
- window.document = new DOMDocument(
- new Packages.org.xml.sax.InputSource(
- new java.io.InputStreamReader(
- new java.io.FileInputStream(url))));
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", url);
+ xhr.onreadystatechange = function(){
+ curLocation = new java.net.URL( curLocation, url );
+ window.document = xhr.responseXML;
+
+ var event = document.createEvent();
+ event.initEvent("load");
+ window.dispatchEvent( event );
+ };
+ xhr.send();
});
window.__defineGetter__("location", function(url){
return {
get protocol(){
- return "file:";
+ return curLocation.getProtocol() + ":";
+ },
+ get href(){
+ return curLocation.toString();
+ },
+ toString: function(){
+ return this.href;
}
};
});
};
// Window Events
+
+ var events = [{}];
- window.addEventListener = function(){};
- window.removeEventListener = function(){};
+ window.addEventListener = function(type, fn){
+ if ( !this.uuid || this == window ) {
+ this.uuid = events.length;
+ events[this.uuid] = {};
+ }
+
+ if ( !events[this.uuid][type] )
+ events[this.uuid][type] = [];
+
+ if ( events[this.uuid][type].indexOf( fn ) < 0 )
+ events[this.uuid][type].push( fn );
+ };
+
+ window.removeEventListener = function(type, fn){
+ if ( !this.uuid || this == window ) {
+ this.uuid = events.length;
+ events[this.uuid] = {};
+ }
+
+ if ( !events[this.uuid][type] )
+ events[this.uuid][type] = [];
+
+ events[this.uuid][type] =
+ events[this.uuid][type].filter(function(f){
+ return f != fn;
+ });
+ };
+
+ window.dispatchEvent = function(event){
+ if ( event.type ) {
+ if ( this.uuid && events[this.uuid][event.type] ) {
+ var self = this;
+
+ events[this.uuid][event.type].forEach(function(fn){
+ fn.call( self, event );
+ });
+ }
+
+ if ( this["on" + event.type] )
+ this["on" + event.type].call( self, event );
+ }
+ };
// DOM Document
get ownerDocument(){
return null;
},
- addEventListener: function(){},
- removeEventListener: function(){},
+ addEventListener: window.addEventListener,
+ removeEventListener: window.removeEventListener,
+ dispatchEvent: window.dispatchEvent,
get nodeName() {
return "#document";
},
};
}
};
+ },
+
+ createEvent: function(){
+ return {
+ type: "",
+ initEvent: function(type){
+ this.type = type;
+ }
+ };
}
};
},
getElementsByTagName: DOMDocument.prototype.getElementsByTagName,
- addEventListener: function(){},
- removeEventListener: function(){},
- click: function(){},
- submit: function(){},
- focus: function(){},
- blur: function(){},
+
+ addEventListener: window.addEventListener,
+ removeEventListener: window.removeEventListener,
+ dispatchEvent: window.dispatchEvent,
+
+ click: function(){
+ var event = document.createEvent();
+ event.initEvent("click");
+ this.dispatchEvent(event);
+ },
+ submit: function(){
+ var event = document.createEvent();
+ event.initEvent("submit");
+ this.dispatchEvent(event);
+ },
+ focus: function(){
+ var event = document.createEvent();
+ event.initEvent("focus");
+ this.dispatchEvent(event);
+ },
+ blur: function(){
+ var event = document.createEvent();
+ event.initEvent("blur");
+ this.dispatchEvent(event);
+ },
get elements(){
return this.getElementsByTagName("*");
},
}
// XMLHttpRequest
+ // Originally implemented by Yehuda Katz
window.XMLHttpRequest = function(){
- this.headers = {};
- this.responseHeaders = {};
+ this.headers = {};
+ this.responseHeaders = {};
};
XMLHttpRequest.prototype = {
open: function(method, url, async, user, password){
- this.readyState = 1;
- if(async) this.async = true;
- this.method = method || "GET";
- this.url = url;
- this.onreadystatechange();
+ this.readyState = 1;
+ if (async)
+ this.async = true;
+ this.method = method || "GET";
+ this.url = url;
+ this.onreadystatechange();
},
setRequestHeader: function(header, value){
- this.headers[header] = value;
+ this.headers[header] = value;
},
getResponseHeader: function(header){ },
send: function(data){
- var makeRequest = function() {
- var url = new java.net.URL(this.url);
- var connection = url.openConnection();
- // Add headers to Java connection
- for(header in this.headers) connection.addRequestProperty(header, this.headers[header]);
- connection.connect();
- // Stick the response headers into responseHeaders
- for(i=0;;i++) {
- headerName = connection.getHeaderFieldKey(i);
- headerValue = connection.getHeaderField(i);
- if(!headerName && !headerValue) break;
- if(headerName) this.responseHeaders[headerName] = headerValue;
- }
- this.readyState = 4;
- this.status = parseInt(connection.responseCode);
- this.statusText = connection.responseMessage;
- var stream = new java.io.InputStreamReader(connection.getInputStream());
- var buffer = new java.io.BufferedReader(stream);
- var line;
- while((line = buffer.readLine()) != null) this.responseText += line;
- try {
- this.responseXML = new DOMDocument(this.responseText);
- } catch(e) {
- this.responseXML = null;
- }
- this.onreadystatechange();
- };
- if(this.async) {
- var requestThread = (new java.lang.Thread(new java.lang.Runnable({
- run: makeRequest
- })));
- requestThread.start();
- }
- else makeRequest();
- },
- abort: function(){ },
- onreadystatechange: function(){ },
- getResponseHeader: function(header) {
- if(this.readyState < 3) throw new Error("INVALID_STATE_ERR");
- else {
- var returnedHeaders = [];
- for(rHeader in this.responseHeaders) {
- if(rHeader.match(new Regexp(header, "i"))) returnedHeaders.push(this.responseHeaders[rHeader]);
- }
- if(returnedHeaders != []) return returnedHeaders.join(", ");
- }
- return null;
- },
- getAllResponseHeaders: function(header) {
- if(this.readyState < 3) throw new Error("INVALID_STATE_ERR");
- else {
- returnedHeaders = [];
- for(var header in this.responseHeaders) {
- returnedHeaders += (header + ": " + this.responseHeaders[header]);
- }
- return returnedHeaders.join("\r\n");
- }
+ var self = this;
+
+ function makeRequest(){
+ var url = new java.net.URL(curLocation, self.url),
+ connection = url.openConnection();
+
+ // Add headers to Java connection
+ for (var header in self.headers)
+ connection.addRequestProperty(header, self.headers[header]);
+
+ connection.connect();
+
+ // Stick the response headers into responseHeaders
+ for (var i=0; ; i++) {
+ var headerName = connection.getHeaderFieldKey(i);
+ var headerValue = connection.getHeaderField(i);
+ if (!headerName && !headerValue) break;
+ if (headerName)
+ self.responseHeaders[headerName] = headerValue;
+ }
+
+ self.readyState = 4;
+ self.status = parseInt(connection.responseCode);
+ self.statusText = connection.responseMessage;
+
+ var stream = new java.io.InputStreamReader(
+ connection.getInputStream()),
+ buffer = new java.io.BufferedReader(stream),
+ line;
+
+ while ((line = buffer.readLine()) != null)
+ self.responseText += line;
+
+ self.responseXML = null;
+
+ if ( self.responseText.match(/^\s*</) ) {
+ try {
+ self.responseXML = new DOMDocument(
+ new java.io.ByteArrayInputStream(
+ (new java.lang.String(
+ self.responseText)).getBytes("UTF8")));
+ } catch(e) {}
+ }
+
+ self.onreadystatechange();
+ }
+
+ if (this.async)
+ (new java.lang.Thread(new java.lang.Runnable({
+ run: makeRequest
+ }))).start();
+ else
+ makeRequest();
+ },
+ abort: function(){},
+ onreadystatechange: function(){},
+ getResponseHeader: function(header){
+ if (this.readyState < 3)
+ throw new Error("INVALID_STATE_ERR");
+ else {
+ var returnedHeaders = [];
+ for (var rHeader in this.responseHeaders) {
+ if (rHeader.match(new Regexp(header, "i")))
+ returnedHeaders.push(this.responseHeaders[rHeader]);
+ }
+
+ if (returnedHeaders.length)
+ return returnedHeaders.join(", ");
+ }
+
+ return null;
+ },
+ getAllResponseHeaders: function(header){
+ if (this.readyState < 3)
+ throw new Error("INVALID_STATE_ERR");
+ else {
+ var returnedHeaders = [];
+
+ for (var header in this.responseHeaders)
+ returnedHeaders.push( header + ": " + this.responseHeaders[header] );
+
+ return returnedHeaders.join("\r\n");
+ }
},
async: true,
readyState: 0,