1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

r25051: Move SWAT back to the old-style form-submit modal.

The Web 2.0, async client tools were really interesting, but without
developer backing they remain impossible to support into a release.

The most interesting app was the LDB browser, and I intend to replace
this with phpLdapAdmin, preconfigured for Apache during provision.

This also removes the need to 'compile' SWAT on SVN checkouts.

Andrew Bartlett
(This used to be commit cda965e908)
This commit is contained in:
Andrew Bartlett 2007-09-10 03:44:47 +00:00 committed by Gerald (Jerry) Carter
parent 37de963f67
commit 15c1801a5c
1788 changed files with 70 additions and 191450 deletions

View File

@ -1,269 +0,0 @@
<%
/*
* Copyright:
* (C) 2006 by Derrell Lipman
* All rights reserved
*
* License:
* LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/
*/
/*
* This module provides a JSON encoder.
*/
/* escape a string as required by json */
function _escape(s)
{
var i;
var arr = new Array();
for (i = 0; i < strlen(s); i++)
{
var c = substr(s, i, 1);
if (c == '\x00')
{
arr[i] = '\\u0000';
}
if (Json._internal.convert[c] != undefined)
{
arr[i] = Json._internal.convert[c];
}
else
{
arr[i] = c;
}
}
if (arr.length == 0)
{
return "";
}
return join("", arr);
}
/* encode an arbitrary object. called recursively, for object and array */
function _encode(o)
{
var type = nativeTypeOf(o);
if (type == "undefined")
{
return "null"; /* you really shouldn't count on this! */
}
else if (type == "null")
{
return "null";
}
else if (type == "boolean")
{
if (o)
{
return "true";
}
else
{
return "false";
}
}
else if (type == "c_function" ||
type == "js_function" ||
type == "string_c_function")
{
/* no output */
}
else if (type == "float" ||
type == "integer" ||
type == "integer64")
{
return o + 0;
}
else if (type == "pointer")
{
var x = "" + o;
return '"' + substr(x, 16, strlen(x) - 16 - 1) + '"';
}
else if (type == "object")
{
var buf;
/* Is this an array or an ordinary object? */
if (o["length"] != undefined)
{
var i;
/* Assume it's an array if there's a length field */
buf = "[";
for (i = 0; i < o.length; i++)
{
/*
* NOTE: We don't support sparse arrays nor associative
* arrays. Should we later want to do either, we're supposed
* to send it as an object rather than as an array.
*/
if (i > 0)
{
buf = buf + ",";
}
buf = buf + this.encode(o[i]);
}
buf = buf + "]";
}
else if (o["__type"] == "_JSON_Date")
{
buf = "" + o.encoding();
}
else
{
/* No length field, so it must be an ordinary object */
var key;
var first = true;
buf = "{";
for (key in o)
{
if (! first)
{
buf = buf + ",";
}
buf = buf + '"' + key + '":' + this.encode(o[key]);
first = false;
}
buf = buf + "}";
}
return buf;
}
else if (type == "string")
{
return '"' + this._internal.escape(o) + '"';
}
else
{
return '{ "unknown_object":"' + type + '"}';
}
}
/* Allocate the public Json access object */
Json = new Object();
/* Json.encode(): encode an arbitrary object */
Json.encode = _encode;
_encode = null;
/* Json.decode(): decode a string into its object form */
Json.decode = literal_to_var;
/* Internal stuff, not for external access */
Json._internal = new Object();
Json._internal.escape = _escape;
_escape = null;
Json._internal.convert = new Object();
Json._internal.convert['\b'] = '\\b';
Json._internal.convert['\t'] = '\\t';
Json._internal.convert['\n'] = '\\n';
Json._internal.convert['\f'] = '\\f';
Json._internal.convert['\r'] = '\\r';
Json._internal.convert['"'] = '\\"';
Json._internal.convert['\\'] = '\\\\';
Json._internal.convert['\x01'] = '\\u0001';
Json._internal.convert['\x02'] = '\\u0002';
Json._internal.convert['\x03'] = '\\u0003';
Json._internal.convert['\x04'] = '\\u0004';
Json._internal.convert['\x05'] = '\\u0005';
Json._internal.convert['\x06'] = '\\u0006';
Json._internal.convert['\x07'] = '\\u0007';
Json._internal.convert['\x08'] = '\\u0008';
Json._internal.convert['\x09'] = '\\u0009';
Json._internal.convert['\x0a'] = '\\u000a';
Json._internal.convert['\x0b'] = '\\u000b';
Json._internal.convert['\x0c'] = '\\u000c';
Json._internal.convert['\x0d'] = '\\u000d';
Json._internal.convert['\x0e'] = '\\u000e';
Json._internal.convert['\x0f'] = '\\u000f';
Json._internal.convert['\x10'] = '\\u0010';
Json._internal.convert['\x11'] = '\\u0011';
Json._internal.convert['\x12'] = '\\u0012';
Json._internal.convert['\x13'] = '\\u0013';
Json._internal.convert['\x14'] = '\\u0014';
Json._internal.convert['\x15'] = '\\u0015';
Json._internal.convert['\x16'] = '\\u0016';
Json._internal.convert['\x17'] = '\\u0017';
Json._internal.convert['\x18'] = '\\u0018';
Json._internal.convert['\x19'] = '\\u0019';
Json._internal.convert['\x1a'] = '\\u001a';
Json._internal.convert['\x1b'] = '\\u001b';
Json._internal.convert['\x1c'] = '\\u001c';
Json._internal.convert['\x1d'] = '\\u001d';
Json._internal.convert['\x1e'] = '\\u001e';
Json._internal.convert['\x1f'] = '\\u001f';
/*
* At some point, we probably want to add \x80-\xff as well, and it's then
* probably more efficient to generate these strings dynamically. (Even now
* it may be, but this was the the way I started, and so it remains.)
*/
/* Test it */
/*
libinclude("base.js");
function testFormat()
{
var test = new Object();
test.int = 23;
test.str = "hello world";
test.float = 223.1;
test.bool = true;
test.array = new Array();
test.array[0] = "hello";
test.array[1] = "world";
test.obj = new Object();
test.obj.int = 1000;
test.obj.array = new Array();
test.obj.array[0] = 42;
test.obj.array[1] = 223;
printf("%s\n", Json.encode(test));
}
testFormat();
*/
/*
libinclude("base.js");
function testParse()
{
var s;
s = '{ "x" : 23 }';
obj = Json.decode(s);
printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
s = '{ "x" : [ 23, 42] }';
obj = Json.decode(s);
printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
s = '[ 13, 19, { "x" : [ 23, 42] }, 223 ]';
obj = Json.decode(s);
printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
s = '{ "x" : [ "hi" ] }';
obj = Json.decode(s);
printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
s = '[ 13, 19, { "x" : [ 23, 42, { "y":{"a":"hello", "b":"world", "c":[1,2,3]}}] }, 223 ]';
obj = Json.decode(s);
printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
}
testParse();
*/
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,73 +0,0 @@
<%
libinclude("auth.js");
/* Return true to allow access; false otherwise */
function json_authenticate(serviceComponents, method, scriptTransportId, error)
{
// Don't allow any access via ScriptTransport, for now. There are serious
// potential security exploits that will need to be protected against when
// we do want to allow use of ScriptTransport. -- djl
if (scriptTransportId != jsonrpc.Constant.ScriptTransport.NotInUse)
{
error.setError(jsonrpc.Constant.ServerError.PermissionDenied,
"Permission denied");
return false;
}
// Does the requested method require authentication?
if (! _authentication_required(serviceComponents, method))
{
// Nope. Let 'em in.
return true;
}
// Did our session expire?
if (request['SESSION_EXPIRED'] == "True")
{
// Yup.
error.setError(jsonrpc.Constant.ServerError.SessionExpired,
"Session expired");
error.setInfo(getDomainList());
return false;
}
// Are we authenticated?
if (! session.AUTHENTICATED)
{
// Nope.
error.setError(jsonrpc.Constant.ServerError.NotLoggedIn,
"Not logged in");
error.setInfo(getDomainList());
return false;
}
return true;
}
/*
* Return true if authentication is required for the specified method;
* false otherwise.
*/
function _authentication_required(serviceComponents, method)
{
var m = join(".", serviceComponents) + "." + method;
// See if this method requires authentication
if (m == "samba.system.login" ||
m == "samba.system.logout")
{
// Nope.
return false;
}
// Anything not listed above requires authentication
return true;
}
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,200 +0,0 @@
<%
/*
* Copyright:
* (C) 2006 by Derrell Lipman
* All rights reserved
*
* License:
* LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/
*/
/*
* Date class for JSON-RPC
*/
function _JSON_Date_create(secondsSinceEpoch)
{
var o = new Object();
o.__type = "_JSON_Date";
function _setUtcDateTimeFields(year, month, day, hour, minute, second, millisecond)
{
this.year = year + 0;
this.month = month + 0;
this.day = day + 0;
this.hour = hour + 0;
this.minute = minute + 0;
this.second = second + 0;
this.millisecond = millisecond + 0;
}
o.setUtcYear = _setUtcDateTimeFields;
function _setUtcYear(year)
{
this.year = year + 0;
}
o.setUtcYear = _setUtcYear;
function _setUtcMonth(month)
{
this.month = month + 0;
}
o.setUtcMonth = _setUtcMonth;
function _setUtcDay(day)
{
this.day = day + 0;
}
o.setUtcDay = _setUtcDay;
function _setUtcHour(hour)
{
this.hour = hour + 0;
}
o.setUtcHour = _setUtcHour;
function _setUtcMinute(minute)
{
this.minute = minute + 0;
}
o.setUtcMinute = _setUtcMinute;
function _setUtcSecond(second)
{
this.second = second + 0;
}
o.setUtcSecond = _setUtcSecond;
function _setUtcMillisecond(millisecond)
{
this.millisecond = millisecond + 0;
}
o.setUtcMillisecond = _setUtcMillisecond;
function _setEpochTime(secondsSinceEpoch)
{
var microseconds = 0;
if (typeof(secondsSinceEpoch) != "number")
{
var currentTime = gettimeofday();
secondsSinceEpoch = currentTime.sec;
microseconds = currentTime.usec;
}
var tm = gmtime(secondsSinceEpoch);
this.year = 1900 + tm.tm_year;
this.month = tm.tm_mon;
this.day = tm.tm_mday;
this.hour = tm.tm_hour;
this.minute = tm.tm_min;
this.second = tm.tm_sec;
this.millisecond = 0;
}
o.setEpochTime = _setEpochTime;
function _getUtcYear()
{
return this.year;
}
o.getUtcYear = _getUtcYear;
function _getUtcMonth()
{
return this.month;
}
o.getUtcMonth = _getUtcMonth;
function _getUtcDay()
{
return this.day;
}
o.getUtcDay = _getUtcDay;
function _getUtcHour()
{
return this.hour;
}
o.getUtcHour = _getUtcHour;
function _getUtcMinute()
{
return this.minute;
}
o.getUtcMinute = _getUtcMinute;
function _getUtcSecond()
{
return this.second;
}
o.getUtcSecond = _getUtcSecond;
function _getUtcMillisecond()
{
return this.millisecond;
}
o.getUtcMillisecond = _getUtcMillisecond;
function _getEpochTime()
{
var tm = new Object();
tm.tm_sec = this.second;
tm.tm_min = this.minute;
tm.tm_hour = this.hour;
tm.tm_mday = -1;
tm.tm_mon = this.month;
tm.tm_year = this.year;
tm.tm_wday = -1;
tm.tm_yday = -1;
tm.isdst = 0;
return gmmktime(tm);
}
o.getEpochTime = _getEpochTime;
function _encoding()
{
/* Encode the date in a well-documented fashion */
return sprintf("new Date(Date.UTC(%d,%d,%d,%d,%d,%d,%d))",
this.year,
this.month,
this.day,
this.hour,
this.minute,
this.second,
this.millisecond);
}
o.encoding = _encoding;
if (! secondsSinceEpoch)
{
var now = gettimeofday();
o.setEpochTime(now.sec);
}
else
{
o.setEpochTime(secondsSinceEpoch);
}
o.year = 0;
o.month = 0;
o.day = 0;
o.hour = 0;
o.minute = 0;
o.second = 0;
o.millisecond = 0;
return o;
}
JSON_Date = new Object();
JSON_Date.create = _JSON_Date_create;
_JSON_Date_create = null;
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,236 +0,0 @@
<%
/*
* Copyright:
* (C) 2006 by Derrell Lipman
* All rights reserved
*
* License:
* LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/
*/
/*
* This is the standard qooxdoo test class. There are tests for each of the
* primitive types here, along with standard named tests "echo", "sink" and
* "sleep".
*/
/**
* Echo the (one and only) parameter.
*
* @param params
* An array containing the parameters to this method
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: The object containing the result of the method;
* Failure: null
*/
function _echo(params, error)
{
if (params.length != 1)
{
error.setError(JsonRpcError_ParameterMismatch,
"Expected 1 parameter; got " + params.length);
return error;
}
return "Client said: [" + params[0] + "]";
}
jsonrpc.method.echo = _echo;
/**
* Sink all data and never return.
*
* @param params
* An array containing the parameters to this method (none expected)
*
* @param error
* An object of class JsonRpcError.
*
* @return
* "Never"
*/
function _sink(params, error)
{
/* We're never supposed to return. Just sleep for a very long time. */
sleep(240);
}
jsonrpc.method.sink = _sink;
/**
* Sleep for the number of seconds specified by the parameter.
*
* @param params
* An array containing the parameters to this method (one expected)
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: The object containing the result of the method;
* Failure: null
*/
function _sleep(params, error)
{
if (params.length != 1)
{
error.setError(JsonRpcError_ParameterMismatch,
"Expected 1 parameter; got " + params.length);
return error;
}
sleep(params[0]);
return params[0];
}
jsonrpc.method.sleep = _sleep;
/*************************************************************************/
/*
* The remainder of the functions test each individual primitive type, and
* test echoing arbitrary types. Hopefully the name is self-explanatory.
*/
function _getInteger(params, error)
{
return 1;
}
jsonrpc.method.getInteger = _getInteger;
function _getFloat(params, error)
{
return 1/3;
}
jsonrpc.method.getFloat = _getFloat;
function _getString(params, error)
{
return "Hello world";
}
jsonrpc.method.getString = _getString;
function _getBadString(params, error)
{
return "<!DOCTYPE HTML \"-//IETF//DTD HTML 2.0//EN\">";
}
jsonrpc.method.getBadString = _getBadString;
function _getArrayInteger(params, error)
{
return new Array(1, 2, 3, 4);
}
jsonrpc.method.getArrayInteger = _getArrayInteger;
function _getArrayString(params, error)
{
return new Array("one", "two", "three", "four");
}
jsonrpc.method.getArrayString = _getArrayString;
function _getObject(params, error)
{
o = new Object(); // some arbitrary object
o.something = 23;
o.garbage = 'lkasjdff;lajsdfkl;sadf';
return o;
}
jsonrpc.method.getObject = _getObject;
function _getTrue(params, error)
{
return true;
}
jsonrpc.method.getTrue = _getTrue;
function _getFalse(params, error)
{
return false;
}
jsonrpc.method.getFalse = _getFalse;
function _getNull(params, error)
{
return null;
}
jsonrpc.method.getNull = _getNull;
function _isInteger(params, error)
{
var type = nativeTypeOf(params[0]);
return type == "integer" || type == "integer64";
}
jsonrpc.method.isInteger = _isInteger;
function _isFloat(params, error)
{
return nativeTypeOf(params[0]) == "float";
}
jsonrpc.method.isFloat = _isFloat;
function _isString(params, error)
{
return nativeTypeOf(params[0]) == "string";
}
jsonrpc.method.isString = _isString;
function _isBoolean(params, error)
{
return nativeTypeOf(params[0]) == "boolean";
}
jsonrpc.method.isBoolean = _isBoolean;
function _isArray(params, error)
{
return nativeTypeOf(params[0]) == "object" && params.length != undefined;
}
jsonrpc.method.isArray = _isArray;
function _isObject(params, error)
{
return nativeTypeOf(params[0]) == "object";
}
jsonrpc.method.isObject = _isObject;
function _isNull(params, error)
{
return nativeTypeOf(params[0]) == "null";
}
jsonrpc.method.isNull = _isNull;
function _getParams(params, error)
{
return params;
}
jsonrpc.method.getParams = _getParams;
function _getParam(params, error)
{
return params[0];
}
jsonrpc.method.getParam = _getParam;
function _getCurrentTimestamp()
{
now = gettimeofday();
obj = new Object();
obj.now = now.sec;
obj.json = JSON_Date.create(now);
return obj;
}
jsonrpc.method.getCurrentTimestamp = _getCurrentTimestamp;
function _getError(params, error)
{
error.setError(23, "This is an application-provided error");
return error;
}
jsonrpc.method.getError = _getError;
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,540 +0,0 @@
<%
/*
* Copyright:
* (C) 2006 by Derrell Lipman
* All rights reserved
*
* License:
* LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/
*/
/*
* This is a simple JSON-RPC server.
*/
/* Bring in the json format/parse functions */
jsonrpc_include("json.esp");
/* Bring in the date class */
jsonrpc_include("jsondate.esp");
/* Load the authentication script */
jsonrpc_include("json_auth.esp");
/* bring the string functions into the global frame */
string_init(global);
/* Bring the system functions into the global frame */
sys_init(global);
/* Bring the session functions into the global frame */
system_session(global);
function printf()
{
print(vsprintf(arguments));
}
/*
* All of our manipulation of JSON RPC methods will be through this object.
* Each class of methods will assign to here, and all of the constants will
* also be in this object.
*/
jsonrpc = new Object();
jsonrpc.Constant = new Object();
jsonrpc.Constant.ErrorOrigin = new Object(); /* error origins */
jsonrpc.Constant.ServerError = new Object(); /* server-generated error codes */
jsonrpc.method = new Object(); /* methods available in requested class */
/*
* ScriptTransport constants
*/
jsonrpc.Constant.ScriptTransport = new Object();
jsonrpc.Constant.ScriptTransport.NotInUse = -1;
/*
* JSON-RPC error origin constants
*/
jsonrpc.Constant.ErrorOrigin.Server = 1;
jsonrpc.Constant.ErrorOrigin.Application = 2;
jsonrpc.Constant.ErrorOrigin.Transport = 3;
jsonrpc.Constant.ErrorOrigin.Client = 4;
/*
* JSON-RPC server-generated error code constants
*/
/**
* Error code, value 0: Unknown Error
*
* The default error code, used only when no specific error code is passed to
* the JsonRpcError constructor. This code should generally not be used.
*/
jsonrpc.Constant.ServerError.Unknown = 0;
/**
* Error code, value 1: Illegal Service
*
* The service name contains illegal characters or is otherwise deemed
* unacceptable to the JSON-RPC server.
*/
jsonrpc.Constant.ServerError.IllegalService = 1;
/**
* Error code, value 2: Service Not Found
*
* The requested service does not exist at the JSON-RPC server.
*/
jsonrpc.Constant.ServerError.ServiceNotFound = 2;
/**
* Error code, value 3: Class Not Found
*
* If the JSON-RPC server divides service methods into subsets (classes), this
* indicates that the specified class was not found. This is slightly more
* detailed than "Method Not Found", but that error would always also be legal
* (and true) whenever this one is returned. (Not used in this implementation)
*/
jsonrpc.Constant.ServerError.ClassNotFound = 3;
/**
* Error code, value 4: Method Not Found
*
* The method specified in the request is not found in the requested service.
*/
jsonrpc.Constant.ServerError.MethodNotFound = 4;
/*
* Error code, value 5: Parameter Mismatch
*
* If a method discovers that the parameters (arguments) provided to it do not
* match the requisite types for the method's parameters, it should return
* this error code to indicate so to the caller.
*
* This error is also used to indicate an illegal parameter value, in server
* scripts.
*/
jsonrpc.Constant.ServerError.ParameterMismatch = 5;
/**
* Error code, value 6: Permission Denied
*
* A JSON-RPC service provider can require authentication, and that
* authentication can be implemented such the method takes authentication
* parameters, or such that a method or class of methods requires prior
* authentication. If the caller has not properly authenticated to use the
* requested method, this error code is returned.
*/
jsonrpc.Constant.ServerError.PermissionDenied = 6;
/*** Errors generated by this server which are not qooxdoo-standard ***/
/*
* Error code, value 1000: Unexpected Output
*
* The called method illegally generated output to the browser, which would
* have preceeded the JSON-RPC data.
*/
jsonrpc.Constant.ServerError.UnexpectedOutput = 1000;
/*
* Error code, value 1001: Resource Error
*
* Too many resources were requested, a system limitation on the total number
* of resources has been reached, or a resource or resource id was misused.
*/
jsonrpc.Constant.ServerError.ResourceError = 1001;
/*
* Error code, value 1002: Not Logged In
*
* The user has logged out and must re-authenticate, or this is a brand new
* session and the user must log in.
*
*/
jsonrpc.Constant.ServerError.NotLoggedIn = 1002;
/*
* Error code, value 1003: Session Expired
*
* The session has expired and the user must re-authenticate.
*
*/
jsonrpc.Constant.ServerError.SessionExpired = 1003;
/*
* Error code, value 1004: Login Failed
*
* An attempt to log in failed.
*
*/
jsonrpc.Constant.ServerError.LoginFailed = 1004;
function sendReply(reply, scriptTransportId)
{
/* If not using ScriptTransport... */
if (scriptTransportId == jsonrpc.Constant.ScriptTransport.NotInUse)
{
/* ... then just output the reply. */
write(reply);
}
else
{
/* Otherwise, we need to add a call to a qooxdoo-specific function */
reply =
"qx.io.remote.ScriptTransport._requestFinished(" +
scriptTransportId + ", " + reply +
");";
write(reply);
}
}
function _jsonValidRequest(req)
{
if (req == undefined)
{
return false;
}
if (typeof(req) != "object")
{
return false;
}
if (req["id"] == undefined)
{
return false;
}
if (req["service"] == undefined)
{
return false;
}
if (req["method"] == undefined)
{
return false;
}
if (req["params"] == undefined)
{
return false;
}
return true;
}
jsonrpc.validRequest = _jsonValidRequest;
_jsonValidRequest = null;
/*
* class JsonRpcError
*
* This class allows service methods to easily provide error information for
* return via JSON-RPC.
*/
function _JsonRpcError_create(origin, code, message)
{
var o = new Object();
o.data = new Object();
o.data.origin = origin;
o.data.code = code;
o.data.message = message;
o.scriptTransportId = jsonrpc.Constant.ScriptTransport.NotInUse;
o.__type = "_JsonRpcError";
function _origin(origin)
{
this.data.origin = origin;
}
o.setOrigin = _origin;
function _setError(code, message)
{
this.data.code = code;
this.data.message = message;
}
o.setError = _setError;
function _setId(id)
{
this.id = id;
}
o.setId = _setId;
function _setScriptTransportId(id)
{
this.scriptTransportId = id;
}
o.setScriptTransportId = _setScriptTransportId;
function _setInfo(info)
{
// Add the info field only if info is actually provided.
// This is an extension to qooxdoo's normal Error return value.
this.data.info = info;
}
o.setInfo = _setInfo;
function _Send()
{
var error = this;
var id = this.id;
var ret = new Object();
ret.error = this.data;
ret.id = this.id;
sendReply(Json.encode(ret), this.scriptTransportId);
}
o.Send = _Send;
return o;
}
jsonrpc.createError = _JsonRpcError_create;
_JsonRpcError_create = null;
/*
* 'input' is the user-provided json-encoded request
* 'jsonInput' is that request, decoded into its object form
*/
var input;
var jsonInput = null;
/* Allocate a generic error object */
error = jsonrpc.createError(jsonrpc.Constant.ErrorOrigin.Server,
jsonrpc.Constant.ServerError.Unknown,
"Unknown error");
/* Assume (default) we're not using ScriptTransport */
scriptTransportId = jsonrpc.Constant.ScriptTransport.NotInUse;
/* What type of request did we receive? */
if (request["REQUEST_METHOD"] == "POST" &&
request["CONTENT_TYPE"] == "application/json")
{
/* We found literal POSTed json-rpc data (we hope) */
input = request["POST_DATA"];
jsonInput = Json.decode(input);
}
else if (request["REQUEST_METHOD"] == "GET" &&
form["_ScriptTransport_id"] != undefined &&
form["_ScriptTransport_id"] !=
jsonrpc.Constant.ScriptTransport.NotInUse &&
form["_ScriptTransport_data"] != undefined)
{
/* We have what looks like a valid ScriptTransport request */
scriptTransportId = form["_ScriptTransport_id"];
error.setScriptTransportId(scriptTransportId);
input = form["_ScriptTransport_data"];
jsonInput = Json.decode(input);
}
/* Ensure that this was a JSON-RPC service request */
if (! jsonrpc.validRequest(jsonInput))
{
/*
* This request was not issued with JSON-RPC so echo the error rather than
* issuing a JsonRpcError response.
*/
write("JSON-RPC request expected; service, method or params missing<br>");
return;
}
/*
* Ok, it looks like JSON-RPC, so we'll return an Error object if we encounter
* errors from here on out.
*/
error.setId(jsonInput.id);
/* Service and method names may contain these characters */
var nameChars =
"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
/* The first letter of service and method names must be a letter */
var nameFirstLetter =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/*
* Ensure the method name is kosher. A method name should be:
*
* - first character is in [a-zA-Z]
* - other characters are in [_a-zA-Z0-9]
*/
/* First check for legal characters */
if (strspn(jsonInput.method, nameChars) != strlen(jsonInput.method))
{
/* There's some illegal character in the service name */
error.setError(jsonrpc.Constant.ServerError.MethodNotFound,
"Illegal character found in method name.");
error.Send();
return;
}
/* Now ensure that it begins with a letter */
if (strspn(substr(jsonInput.method, 0, 1), nameFirstLetter) != 1)
{
error.setError(jsonrpc.Constant.ServerError.MethodNotFound,
"The method name does not begin with a letter");
error.Send();
return;
}
/*
* Ensure the requested service name is kosher. A service name should be:
*
* - a dot-separated sequences of strings; no adjacent dots
* - first character of each string is in [a-zA-Z]
* - other characters are in [_a-zA-Z0-9]
*/
/* First check for legal characters */
if (strspn(jsonInput.service, "." + nameChars) != strlen(jsonInput.service))
{
/* There's some illegal character in the service name */
error.setError(jsonrpc.Constant.ServerError.IllegalService,
"Illegal character found in service name.");
error.Send();
return;
}
/*
* Now ensure there are no double dots.
*
* Frustration with ejs. Result must be NULL, but we can't use the ===
* operator: strstr() === null so we have to use typeof. If the result isn't
* null, then it'll be a number and therefore not type "pointer".
*/
if (typeof(strstr(jsonInput.service, "..")) != "pointer")
{
error.setError(jsonrpc.Constant.ServerError.IllegalService,
"Illegal use of two consecutive dots in service name");
error.Send();
return;
}
/* Explode the service name into its dot-separated parts */
var serviceComponents = split(".", jsonInput.service);
/* Ensure that each component begins with a letter */
for (var i = 0; i < serviceComponents.length; i++)
{
if (strspn(substr(serviceComponents[i], 0, 1), nameFirstLetter) != 1)
{
error.setError(jsonrpc.Constant.ServerError.IllegalService,
"A service name component does not begin with a letter");
error.Send();
return;
}
}
/*
* Now replace all dots with slashes so we can locate the service script. We
* also retain the split components of the path, as the class name of the
* service is the last component of the path.
*/
var servicePath = join("/", serviceComponents) + ".esp";
/* Load the requested class */
if (jsonrpc_include(servicePath))
{
/* Couldn't find the requested service */
error.setError(jsonrpc.Constant.ServerError.ServiceNotFound,
"Service class `" + servicePath + "` does not exist.");
error.Send();
return;
}
/*
* Find the requested method.
*
* What we really want to do here, and could do in any reasonable language,
* is:
*
* method = jsonrpc.method[jsonInput.method];
* if (method && typeof(method) == "function") ...
*
* The following completely unreasonable sequence of commands is because:
*
* (a) ejs evaluates all OR'ed expressions even if an early one is false, and
* barfs on the typeof(method) call if method is undefined
*
* (b) ejs does not allow comparing against the string "function"!!! What
* the hell is special about that particular string???
*
* E-gad. What a mess.
*/
var method = jsonrpc.method[jsonInput.method];
var valid = (method != undefined);
if (valid)
{
var type = typeof(method);
if (substr(type, 0, 1) != 'f' || substr(type, 1) != "unction")
{
valid = false;
}
}
if (! valid)
{
error.setError(jsonrpc.Constant.ServerError.MethodNotFound,
"Method `" + jsonInput.method + "` not found.");
error.Send();
return;
}
/*
* Ensure the logged-in user is allowed to issue the requested method. We
* provide the scriptTransportId as one of the determining factors because
* accepting requests via ScriptTransport is dangerous. Only methods which
* one might allow when unauthenticated should be allowed via ScriptTransport
* as it is easy for a rogue site to trick a user into bypassing
* authentication.
*/
if (! json_authenticate(serviceComponents,
jsonInput.method,
scriptTransportId,
error))
{
error.Send();
return;
}
/* Most errors from here on out will be Application-generated */
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Application);
/* Call the requested method passing it the provided params */
var retval = method(jsonInput.params, error);
/* See if the result of the function was actually an error object */
if (retval["__type"] == "_JsonRpcError")
{
/* Yup, it was. Return the error */
retval.Send();
return;
}
/* Give 'em what they came for! */
var ret = new Object();
ret.result = retval;
ret.id = jsonInput.id;
sendReply(Json.encode(ret), scriptTransportId);
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,171 +0,0 @@
<%
/*
* Various JSON-RPC calls will want to maintain open resources within a
* session, across multiple calls. We'll provide a standardized way to
* maintain those open resources here, with some protection against rogue
* scripts.
*/
function _resourcesCreate()
{
/* The being-created resources object */
var o = new Object();
/*
* The maximum number of resources available to a single session. This
* should be more than is ever needed (even by reasonable recursive
* functions) but limits rogue scripts ability to generate DOS attacks.
*/
o.RESOURCE_LIMIT = 100;
/* List of current resources */
o.resourceList = new Object();
/* Resource id values will be constantly incrementing; never reset. */
o.resourceList.id = 0;
/* We'll maintain our own count of the number of open resources */
o.resourceList.count = 0;
/*
* Set a new saved resource.
*/
function _set(resource, type, error)
{
/* Do they already have the maximum number of resources allocated? */
if (this.resourceList.count >= this.RESOURCE_LIMIT)
{
/* Yup. */
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ResourceError,
"Session limit on resources (" +
RESOURCE_LIMIT +
") exceeded.");
return error;
}
/* Allocate an object to hold the new resource and its type */
var r = new Object();
/* Save the resource and its type */
r.resource = resource;
r.type = type;
r.id = this.resourceList.id;
/* Add this resource to the list */
this.resourceList[this.resourceList.id] = r;
/* There's a new resource in the list! */
this.resourceList.count++;
/*
* Return the index of the resource, its resource id, and advance to
* the next resource id for next time.
*/
var id = this.resourceList.id;
this.resourceList.id++;
return id;
}
o.set = _set;
/*
* Get a previously-saved resource
*/
function _get(resourceId, error)
{
/* Does the specified resource id exist? */
if (! this.resourceList[resourceId])
{
/* Nope. */
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ResourceError,
"Resource not found.");
return error;
}
/* Retrieve the resource */
var r = this.resourceList[resourceId];
/* Give 'em what they came for! */
return r.resource;
}
o.get = _get;
/*
* Find a previously-saved resource
*/
function _find(type, error)
{
/* Does the specified resource id exist? */
for (var resourceId in this.resourceList)
{
/* Retrieve the resource */
var r = this.resourceList[resourceId];
/* Ignore "id" and "count" integer fields */
if (typeof(r) == "object")
{
/* Is the specified resource the correct type? */
if (r.type == type)
{
/* Yup, this is the one they want. */
return r.id;
}
}
}
/* It wasn't found. */
return undefined;
}
o.find = _find;
/*
* Release a previously-saved resource, allowing it to be freed
*/
function _release(resourceId, error)
{
/* Does the specified resource id exist? */
if (! this.resourceList[resourceId])
{
/* Nope. */
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ResourceError,
"Resource not found.");
return error;
}
/* It exists. Delete it. */
delete this.resourceList[resourceId];
/* There's now one fewer resources in the list */
this.resourceList.count--;
}
o.release = _release;
/*
* Retrieve the list of resources (for debugging) */
*/
function _getList(error)
{
return this.resourceList;
}
o.getList = _getList;
return o;
}
/* singleton: create session resources list */
if (! session.resources)
{
session.resources = _resourcesCreate();
}
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,28 +0,0 @@
<%
jsonrpc_include("resources.esp");
libinclude("base.js");
libinclude("management.js");
function _echo(params, error) {
var echo_string = params[0];
return echo_string;
}
jsonrpc.method.echo = _echo;
function _nbt_packet_stats(params, error) {
var stats = nbtd_statistics();
stats.server_status = new Object();
stats.server_status = server_status("nbt");
return stats;
}
jsonrpc.method.NBTPacketStats = _nbt_packet_stats;
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,26 +0,0 @@
<%
/*
* Copyright (C) Rafal Szczesniak 2007
*/
/* Simple JSON-RPC access to the configuration parameters */
function _lp_get(params, error)
{
if (params.length < 1)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"no parameter specified");
return error;
}
var lp = loadparm_init();
var name = params[0];
var value = lp.get(name);
return value;
}
jsonrpc.method.lp_get = _lp_get;
%>

View File

@ -1,178 +0,0 @@
<%
/*
* Copyright (C) Rafal Szczesniak 2007
*/
/* JSON-RPC mappings to the libnet functions */
jsonrpc_include("resources.esp");
function _NetContext(params, error)
{
var hostName, credParams, credentials;
var resName = "netCtx";
credentials = session.authinfo.credentials;
if (params.length > 0)
{
/* first expected argument is host name that this context is going
to be attached to */
hostName = params[0];
if (typeof(hostName) != "string" || hostName == "")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"hostName parameter is expected to be a valid non zero-length string");
return error;
}
resName = "netCtx[" + hostName + "]";
/* check whether credentials are supplied as well */
if (params.length > 1)
{
/* create user specified credentials object */
credParams = params[1];
if (typeof(credParams) != "object")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"credentials parameter is expected to be an object");
return error;
}
if (typeof(credParams.domain) != "string")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"a valid string is expected in credentials.domain");
return error;
}
if (typeof(credParams.username) != "string")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"a valid string is expected in credentials.username");
return error;
}
if (typeof(credParams.username) != "string")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"a valid string is expected in credentials.password");
return error;
}
credentials = credentials_init();
credentials.set_domain(credParams.domain);
credentials.set_username(credParams.username);
credentials.set_password(credParams.password);
}
}
/* was this NetContext created yet ? */
var resId = session.resources.find(resName, error);
if (resId != undefined)
{
/* yes, return its resource id */
return resId;
}
/* no, create the new context and assign it a resource id */
var netCtx = NetContext(credentials);
resId = session.resources.set(netCtx, resName, error);
return resId;
}
jsonrpc.method.NetContext = _NetContext;
function _NetContextCreds(params, error)
{
if (params.length != 1)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"missing resource id parameter");
return error;
}
var resId = params[0];
if (typeof(resId) != "number")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"an integer parameter is required");
return error;
}
var netCtx = session.resources.get(resId, error);
if (typeof(netCtx) != "object")
{
return null;
}
var creds = netCtx.credentials;
var result = new Object();
result.username = creds.get_username();
result.domain = creds.get_domain();
return result;
}
jsonrpc.method.NetContextCreds = _NetContextCreds;
function _UserMgr(params, error)
{
var domainName = null, netCtxId;
var resId = -1;
var resName = "usrCtx";
var netCtx = undefined;
var usrCtx = undefined;
if (params.length == 0)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"NetContext parameter missing");
return error;
}
/* checking NetContext parameter */
netCtxId = params[0];
if (netCtxId == undefined || typeof(netCtxId) != "number")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"NetContext parameter is expected to be a number");
}
netCtx = session.resources.get(netCtxId, error);
if (netCtx == undefined || typeof(netCtx) != "object")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"Incorrect NetContext passed");
return error;
}
if (params.length > 1)
{
domainName = params[1];
if (domainName == undefined || typeof(domainName) != "string")
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"domainName parameter is expected to be a valid non zero-length string");
return error;
}
}
if (domainName == "")
{
usrCtx = netCtx.UserMgr();
}
else
{
usrCtx = netCtx.UserMgr(domainName);
}
resId = session.resources.set(usrCtx, resName, error);
return resId;
}
jsonrpc.method.UserMgr = _UserMgr;
%>

View File

@ -1,675 +0,0 @@
<%
/*
* Copyright:
* (C) 2006 by Derrell Lipman
* All rights reserved
*
* License:
* LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/
*/
/*
* JSON-RPC mappings to the ldb ejs functions
*/
/* We'll be saving resources in the session */
jsonrpc_include("resources.esp");
/**
* Local function to determine if the requested database is one which we allow
* access to.
*
* @param dbRequested
* Name of the database which is being requested to be opened
*
* @return
* true if access is allowed; false otherwise.
*/
function accessAllowed(dbRequested)
{
/* Databases allowed to connect to */
dbAllowed = new Array();
dbAllowed[dbAllowed.length] = "sam.ldb";
for (var i = 0; i < dbAllowed.length; i++)
{
if (dbRequested == dbAllowed[i])
{
return true;
}
}
return false;
}
/**
* Connect to a database
*
* @param params[0]
* Database name
*
* @param params[1..n]
* Option (e.g. "modules:modlist")
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: The resource id to be used for future access to the database
* Failure: error event
*
* @note
* Credentials or session_info may be set up first.
*/
function _connect(params, error)
{
if (params.length < 1)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <db_name> [<option> ...]");
return error;
}
/* First, see if this database was already opened */
var resourceId = session.resources.find("ldb:" + params[0], error);
if (resourceId != undefined)
{
/* It was. Give 'em the resource id */
return resourceId;
}
/* Ensure that the database name is one that is allowed to be opened */
if (! accessAllowed(params[0]))
{
error.setError(-1, "Invalid or disallowed database name");
return error;
}
/* Get access to loadparm functions */
var lp = loadparm_init();
/* Determine the private directory */
var private_dir = lp.get("private dir");
/* Database was not previously opened. Connect to it. */
ldb = ldb_init();
ldb.session_info = session.authinfo.session_info;
ldb.credentials = session.authinfo.credentials;
var ret = ldb.connect(private_dir + "/" + params[0]);
if (ret && ldb.db)
{
return session.resources.set(ldb, "ldb:" + params[0], error);
}
else
{
error.setError(-1, "ldb.connect failed");
return error;
}
}
jsonrpc.method.connect = _connect;
/**
* Close a database
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: Will only fail with invalid parameters, and throws an error
*/
function _close(params, error)
{
if (params.length != 1)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
var ret = ldb.close();
/* If close succeeded, release the stored resource */
if (ret)
{
session.resources.release(params[0], error);
}
return ret;
}
jsonrpc.method.close = _close;
/**
* Begin a transaction
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: False
*/
function _transaction_start(params, error)
{
if (params.length != 1)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
return ldb.transaction_start();
}
jsonrpc.method.transaction_start = _transaction_start;
/**
* Cancel a transaction
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: False
*/
function _transaction_cancel(params, error)
{
if (params.length != 1)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
return ldb.transaction_cancel();
}
jsonrpc.method.transaction_cancel = _transaction_cancel;
/**
* Commit a transaction
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: False
*/
function _transaction_commit(params, error)
{
if (params.length != 1)
{
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
return ldb.transaction_commit();
}
jsonrpc.method.transaction_commit = _transaction_commit;
/**
* Issue a Search request
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* Search expression
*
* @param params[2]
* Base DN
*
* @param params[3]
* Scope: "default", "base", "one" or "subtree"
*
* @param params[4]
* Attributes: an array object
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: found object
* Failure: `undefined`
*
* @note
* If params[4] is missing, assume no attributes
* If params[3..4] are missing, also assume "default" scope
* If params[2..4] are missing, also assume null base DN
*/
function _search(params, error)
{
if (params.length < 2 || params.length > 5)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: " +
"<resource_id> <expr> [<baseDN> [<scope> [<attrs>]]]");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
/* Retrieve parameters */
var expr = params[1];
var baseDN = params[2];
var scope = params[3];
var attrs = params[4];
/* Fill in optional parameters */
if (params.length < 3) baseDN = null;
if (params.length < 4) scope = "one";
if (params.length < 5) attrs = null;
/* Determine scope value */
if (scope == "base")
{
scope = ldb.SCOPE_BASE;
}
else if (scope == "one")
{
scope = ldb.SCOPE_ONE;
}
else if (scope == "subtree")
{
scope = ldb.SCOPE_SUBTREE;
}
else if (scope == "default")
{
scope = ldb.SCOPE_DEFAULT;
}
else
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"invalid scope: " + scope);
return error;
}
var res = ldb.search(expr, baseDN, scope, attrs);
if (res.error != 0) {
error.setError(res.error, res.errstr);
return error;
}
return res.msgs;
}
jsonrpc.method.search = _search;
/**
* Add data to the database
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* An LDIF string representing the data to be added
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: False
*/
function _add(params, error)
{
if (params.length != 2)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id> <ldif>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
var res = ldb.add(params[1]);
if (res.error != 0) {
error.setError(res.error, res.errstr);
return error;
}
return true;
}
jsonrpc.method.add = _add;
/**
* Modify data in the database
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* An LDIF string representing the data to be modified
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: False
*/
function _modify(params, error)
{
if (params.length != 2)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id> <ldif>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
var res = ldb.modify(params[1]);
if (res.error != 0) {
error.setError(res.error, res.errstr);
return error;
}
return true;
}
jsonrpc.method.modify = _modify;
/**
* Delete data from the database
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* The DN to be located and deleted
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: False
*/
function _del(params, error)
{
if (params.length != 2)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id> <dn>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
var res = ldb.del(params[1]);
if (res.error != 0) {
error.setError(res.error, res.errstr);
return error;
}
return true;
}
jsonrpc.method.del = _del;
/**
* Rename data in the database
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* The DN to be renamed
*
* @param params[2]
* The new name for the DN being renamed
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: True
* Failure: False
*/
function _rename(params, error)
{
if (params.length != 3)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id> <old_dn> <new_dn>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
var res = ldb.rename(params[1], params[2]);
if (res.error != 0) {
error.setError(res.error, res.errstr);
return error;
}
return true;
}
jsonrpc.method.rename = _rename;
/**
* Base64-encode a string
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* The string to be base64 encoded
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: encoded string
* Failure: `undefined`
*/
function _base64encode(params, error)
{
if (params.length != 2)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id> <string_to_be_encoded>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
return ldb.base64encode(params[1]);
}
jsonrpc.method.base64encode = _base64encode;
/**
* Base64-decode a string
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* The string to be base64 decoded
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: decoded string
* Failure: `undefined`
*/
function _base64decode(params, error)
{
if (params.length != 2)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id> <string_to_be_decoded>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
return ldb.base64decode(params[1]);
}
jsonrpc.method.base64decode = _base64decode;
/**
* escape a DN
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param params[1]
* The DN to be escaped
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: escaped string
* Failure: undefined
*/
function _base64decode(params, error)
{
if (params.length != 2)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id> <string_to_be_decoded>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
return ldb.base64decode(params[1]);
}
jsonrpc.method.base64decode = _base64decode;
/**
* Retrieve a description of the most recent error
*
* @param params[0]
* The resource id of the open database, previously returned by connect()
*
* @param error
* An object of class JsonRpcError.
*
* @return
* The most recent error string for the ldb specified by the resource id
*/
function _errstring(params, error)
{
if (params.length != 1)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.ParameterMismatch,
"usage: <resource_id>");
return error;
}
ldb = session.resources.get(params[0], error);
if (ldb["__type"] == "_JsonRpcError")
{
return ldb;
}
return ldb.errstring();
}
jsonrpc.method.errstring = _errstring;
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,184 +0,0 @@
<%
/*
* Copyright:
* (C) 2006 by Derrell Lipman
* All rights reserved
*
* License:
* LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/
*/
/*
* JSON-RPC mappings to management functions
*/
libinclude("base.js");
libinclude("management.js");
/**
* Get statistics from each of the servers
*
* @param params[0]
* Optional enum_smb_sessions flag, default false
*
* @param params[1]
* Optional enum_smb_tcons flag, default false
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: Object containing all of the statistics
* Failure: error event
*/
function _get_statistics(params, error)
{
var enum_smb_sessions = false;
var enum_smb_tcons = false;
if (params.length >= 1)
{
enum_smb_sessions = params[0];
}
if (params.length >= 2)
{
enum_smb_tcons = params[1];
}
var info = new Object();
info["nbt"] = new Object();
info["wins"] = new Object();
info["cldap"] = new Object();
info["kdc"] = new Object();
info["smb"] = new Object();
info["ldap"] = new Object();
info["rpc"] = new Object();
for (var service in info)
{
var irpc = irpc_init();
var status;
var obj = info[service];
obj.status = null;
if (!service_enabled(service))
{
obj.status = "DISABLED";
}
else
{
status = irpc.connect(service + "_server");
if (status.is_ok != true)
{
obj.status = "INACTIVE";
}
else
{
var io = irpcObj();
status = irpc.irpc_uptime(io);
if (status.is_ok != true)
{
obj.status = "NOT RESPONDING";
}
else
{
obj.status = "RUNNING";
if (service == "smb" ||
service == "ldap" ||
service == "rpc")
{
obj.connections = io.results.length;
}
if (service == "smb")
{
if (enum_smb_sessions)
{
var io = irpcObj();
io.input.level = irpc.SMBSRV_INFO_SESSIONS;
status = irpc.smbsrv_information(io);
obj.sessions = new Array(0);
if (status.is_ok == true)
{
/* gather the results into a single array */
var count = 0;
for (var i = 0; i < io.results.length; i++)
{
var sessions =
io.results[i].info.sessions.sessions;
for (var j = 0; j < sessions.length; j++)
{
obj.sessions[count] = sessions[j];
// convert NT times to unix epoch
obj.sessions[count].auth_time =
nttime2unix(obj.sessions[count].auth_time);
obj.sessions[count].last_use_time =
nttime2unix(obj.sessions[count].last_use_time);
obj.sessions[count].connect_time =
nttime2unix(obj.sessions[count].connect_time);
count++;
}
}
}
}
if (enum_smb_tcons)
{
var io = irpcObj();
io.input.level = irpc.SMBSRV_INFO_TCONS;
status = irpc.smbsrv_information(io);
obj.tcons = new Array(0);
if (status.is_ok == true)
{
/* gather the results into a single array */
var count=0;
for (var i = 0; i < io.results.length; i++)
{
var tcons = io.results[i].info.tcons.tcons;
for (var j = 0; j < tcons.length; j++)
{
obj.tcons[count] = tcons[j];
// convert NT times to unix epoch
obj.tcons[count].last_use_time =
nttime2unix(obj.tcons[count].last_use_time);
obj.tcons[count].connect_time =
nttime2unix(obj.tcons[count].connect_time);
count++;
}
}
}
}
}
else if (service == "nbt")
{
var io = irpcObj();
io.input.level = irpc.NBTD_INFO_STATISTICS;
status = irpc.nbtd_information(io);
if (status.is_ok == true)
{
obj.statistics = io.results[0].info.stats;
}
}
}
}
}
}
return info;
}
jsonrpc.method.get_statistics = _get_statistics;
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -1,118 +0,0 @@
<%
/*
* Copyright:
* (C) 2006 by Derrell Lipman
* All rights reserved
*
* License:
* LGPL 2.1: http://creativecommons.org/licenses/LGPL/2.1/
*/
/*
* JSON-RPC mappings to system facilities
*/
/* We'll be accessing session resources */
jsonrpc_include("resources.esp");
/**
* Authenticate and log in
*
* @param params[0]
* User name
*
* @param params[1]
* Password
*
* @param params[2]
* Domain
*
* @param error
* An object of class JsonRpcError.
*
* @return
* Success: "Logged in"
* Failure: error event, origin=Server, code=LoginFailed
*/
function _login(params, error)
{
var ret;
var creds = credentials_init();
creds.set_username(params[0]);
creds.set_password(params[1]);
creds.set_domain(params[2]);
creds.set_workstation(request['REMOTE_HOST']);
auth = userAuth(creds, request['REMOTE_SOCKET_ADDRESS']);
if (auth == undefined)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.LoginFailed,
"Invalid login.");
ret = error;
}
else if (auth.result)
{
session.AUTHENTICATED = true;
session.authinfo = new Object();
session.authinfo.username = auth.username;
session.authinfo.domain = auth.domain;
session.authinfo.credentials = creds;
session.authinfo.session_info = auth.session_info;
ret = "Logged in";
}
else if (auth.report == undefined)
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.LoginFailed,
"Login failed.");
ret = error;
}
else
{
error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server);
error.setError(jsonrpc.Constant.ServerError.LoginFailed,
"Login failed: " + auth.report);
ret = error;
}
return ret;
}
jsonrpc.method.login = _login;
/**
* Retrieve the list of open resources (for debugging)
*
* @return "Logged out"
*/
function _logout(params, error)
{
session.AUTHENTICATED = false;
return "Logged out";
}
jsonrpc.method.logout = _logout;
/**
* Retrieve the list of open resources (for debugging)
*/
function _get_open_resources(params, error)
{
return session.resources.getList(error);
}
jsonrpc.method.get_open_resources = _get_open_resources;
/*
* Local Variables:
* mode: c
* End:
*/
%>

View File

@ -63,11 +63,6 @@ $AUTOCONF $IPATHS || exit 1
rm -rf autom4te*.cache
if test x"${AUTOGEN_SKIP_SWAT}" != x"yes"; then
echo "$0: building Web Application Framework (SWAT)"
(cd ../webapps/swat && make distclean build || exit 1)
fi
echo "Now run ./configure and then make."
exit 0

View File

@ -88,8 +88,7 @@ MODULESDIR = $self->{config}->{modulesdir}
INCLUDEDIR = $self->{config}->{includedir}
CONFIGDIR = $self->{config}->{sysconfdir}
DATADIR = $self->{config}->{datadir}
WEBAPPSDIR = \$(DATADIR)/webapps
SERVICESDIR = \$(DATADIR)/services
SWATDIR = \$(DATADIR)/swat
JSDIR = \$(DATADIR)/js
SETUPDIR = \$(DATADIR)/setup
VARDIR = $self->{config}->{localstatedir}

View File

@ -73,11 +73,8 @@ _PUBLIC_ const char *dyn_PIDDIR = PIDDIR;
/** Private data directory; holds ldb files and the like */
_PUBLIC_ const char *dyn_PRIVATE_DIR = PRIVATE_DIR;
/** WEBAPPS directory */
_PUBLIC_ const char *dyn_WEBAPPSDIR = WEBAPPSDIR;
/** JSON-RPC Services script directory */
_PUBLIC_ const char *dyn_SERVICESDIR = SERVICESDIR;
/** SWAT directory */
_PUBLIC_ const char *dyn_SWATDIR = SWATDIR;
/** SETUP files (source files used by the provision) */
_PUBLIC_ const char *dyn_SETUPDIR = SETUPDIR;

View File

@ -34,8 +34,7 @@ extern const char *dyn_MODULESDIR;
extern const char *dyn_LOCKDIR;
extern const char *dyn_PIDDIR;
extern const char *dyn_PRIVATE_DIR;
extern const char *dyn_WEBAPPSDIR;
extern const char *dyn_SERVICESDIR;
extern const char *dyn_SWATDIR;
extern const char *dyn_JSDIR;
extern const char *dyn_SETUPDIR;
extern const char *dyn_WINBINDD_SOCKET_DIR;

View File

@ -13,7 +13,7 @@ PATH_FLAGS = -DCONFIGFILE=\"$(CONFIGFILE)\" \
-DLOCKDIR=\"$(LOCKDIR)\" -DPIDDIR=\"$(PIDDIR)\" -DDATADIR=\"$(DATADIR)\" \
-DLOGFILEBASE=\"$(LOGFILEBASE)\" \
-DCONFIGDIR=\"$(CONFIGDIR)\" -DNCALRPCDIR=\"$(NCALRPCDIR)\" \
-DWEBAPPSDIR=\"$(WEBAPPSDIR)\" -DSERVICESDIR=\"$(SERVICESDIR)\" \
-DSWATDIR=\"$(SWATDIR)\" \
-DPRIVATE_DIR=\"$(PRIVATEDIR)\" \
-DMODULESDIR=\"$(MODULESDIR)\" -DJSDIR=\"$(JSDIR)\" \
-DTORTUREDIR=\"$(TORTUREDIR)\" \

View File

@ -58,8 +58,7 @@ showlayout:
@echo ' logfilebase: $(LOGFILEBASE)'
@echo ' setupdir: $(SETUPDIR)'
@echo ' jsdir: $(JSDIR)'
@echo ' webappsdir: $(WEBAPPSDIR)'
@echo ' servicesdir: $(SERVICESDIR)'
@echo ' swatdir: $(SWATDIR)'
@echo ' mandir: $(MANDIR)'
@echo ' torturedir: $(TORTUREDIR)'
@echo ' datadir: $(DATADIR)'
@ -86,7 +85,7 @@ showflags:
# The permissions to give the executables
INSTALLPERMS = 0755
install: showlayout everything installbin installdat installwebapps installmisc installlib \
install: showlayout everything installbin installdat installswat installmisc installlib \
installheader installpc installplugins
# DESTDIR is used here to prevent packagers wasting their time
@ -147,9 +146,8 @@ installheader: headers installdirs
installdat: installdirs
@$(SHELL) $(srcdir)/script/installdat.sh $(DESTDIR)$(DATADIR) $(srcdir)
installwebapps: installdirs
@$(SHELL) $(srcdir)/script/installwebapps.sh $(DESTDIR)$(WEBAPPSDIR) $(srcdir)
@$(SHELL) $(srcdir)/script/installjsonrpc.sh $(DESTDIR)$(SERVICESDIR) $(srcdir)
installswat: installdirs
@$(SHELL) $(srcdir)/script/installswat.sh $(DESTDIR)$(SWATDIR) $(srcdir)
installman: manpages installdirs
@$(SHELL) $(srcdir)/script/installman.sh $(DESTDIR)$(MANDIR) $(MANPAGES)
@ -268,7 +266,6 @@ distclean: clean
-rm -f config.status
-rm -f config.log config.cache
-rm -f config.pm config.mk
-rm -rf ../webapps/qooxdoo-*-sdk/frontend/framework/.cache
-rm -f $(PC_FILES)
removebackup:

View File

@ -126,7 +126,7 @@ struct global
char *szTemplateShell;
char *szTemplateHomedir;
int bWinbindSealedPipes;
char *webapps_directory;
char *swat_directory;
int tls_enabled;
char *tls_keyfile;
char *tls_certfile;
@ -460,7 +460,7 @@ static struct parm_struct parm_table[] = {
{"tls cafile", P_STRING, P_GLOBAL, &loadparm.Globals.tls_cafile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"tls crlfile", P_STRING, P_GLOBAL, &loadparm.Globals.tls_crlfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"tls dh params file", P_STRING, P_GLOBAL, &loadparm.Globals.tls_dhpfile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"web application directory", P_STRING, P_GLOBAL, &loadparm.Globals.webapps_directory, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"swat directory", P_STRING, P_GLOBAL, &loadparm.Globals.swat_directory, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"large readwrite", P_BOOL, P_GLOBAL, &loadparm.Globals.bLargeReadwrite, NULL, NULL, FLAG_DEVELOPER},
{"server max protocol", P_ENUM, P_GLOBAL, &loadparm.Globals.srv_maxprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
{"server min protocol", P_ENUM, P_GLOBAL, &loadparm.Globals.srv_minprotocol, NULL, enum_protocol, FLAG_DEVELOPER},
@ -549,7 +549,6 @@ static struct parm_struct parm_table[] = {
{"modules dir", P_STRING, P_GLOBAL, &loadparm.Globals.szModulesDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"pid directory", P_STRING, P_GLOBAL, &loadparm.Globals.szPidDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"js include", P_LIST, P_GLOBAL, &loadparm.Globals.jsInclude, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"jsonrpc services directory", P_STRING, P_GLOBAL, &loadparm.Globals.jsonrpcServicesDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"setup directory", P_STRING, P_GLOBAL, &loadparm.Globals.szSetupDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"socket address", P_STRING, P_GLOBAL, &loadparm.Globals.szSocketAddress, NULL, NULL, FLAG_DEVELOPER},
@ -683,7 +682,7 @@ _PUBLIC_ FN_GLOBAL_INTEGER(lp_krb5_port, &loadparm.Globals.krb5_port)
_PUBLIC_ FN_GLOBAL_INTEGER(lp_kpasswd_port, &loadparm.Globals.kpasswd_port)
_PUBLIC_ FN_GLOBAL_INTEGER(lp_web_port, &loadparm.Globals.web_port)
_PUBLIC_ FN_GLOBAL_STRING(lp_dos_charset, &dos_charset)
_PUBLIC_ FN_GLOBAL_STRING(lp_webapps_directory, &loadparm.Globals.webapps_directory)
_PUBLIC_ FN_GLOBAL_STRING(lp_swat_directory, &loadparm.Globals.swat_directory)
_PUBLIC_ FN_GLOBAL_BOOL(lp_tls_enabled, &loadparm.Globals.tls_enabled)
_PUBLIC_ FN_GLOBAL_STRING(lp_tls_keyfile, &loadparm.Globals.tls_keyfile)
_PUBLIC_ FN_GLOBAL_STRING(lp_tls_certfile, &loadparm.Globals.tls_certfile)
@ -766,7 +765,6 @@ _PUBLIC_ FN_GLOBAL_INTEGER(lp_security, &loadparm.Globals.security)
_PUBLIC_ FN_GLOBAL_BOOL(lp_paranoid_server_security, &loadparm.Globals.paranoid_server_security)
_PUBLIC_ FN_GLOBAL_INTEGER(lp_announce_as, &loadparm.Globals.announce_as)
_PUBLIC_ FN_GLOBAL_LIST(lp_js_include, &loadparm.Globals.jsInclude)
_PUBLIC_ FN_GLOBAL_STRING(lp_jsonrpc_services_dir, &loadparm.Globals.jsonrpcServicesDir)
_PUBLIC_ FN_LOCAL_STRING(lp_servicename, szService)
_PUBLIC_ FN_LOCAL_CONST_STRING(lp_const_servicename, szService)
_PUBLIC_ FN_LOCAL_STRING(lp_pathname, szPath)
@ -2429,8 +2427,7 @@ bool loadparm_init(struct loadparm_context *lp_ctx)
lp_do_global_parameter(lp_ctx, "krb5 port", "88");
lp_do_global_parameter(lp_ctx, "kpasswd port", "464");
lp_do_global_parameter(lp_ctx, "web port", "901");
lp_do_global_parameter(lp_ctx, "web application directory", dyn_WEBAPPSDIR);
lp_do_global_parameter(lp_ctx, "jsonrpc services directory", dyn_SERVICESDIR);
lp_do_global_parameter(lp_ctx, "swat directory", dyn_SWATDIR);
lp_do_global_parameter(lp_ctx, "nt status support", "True");

View File

@ -1,32 +0,0 @@
#!/bin/sh
SERVICESDIR=$1
SRCDIR=$2
echo Installing JSON-RPC services in $SERVICESDIR
cd $SRCDIR/../services || exit 1
mkdir -p $SERVICESDIR || exit 1
installdir() {
for f in $*; do
dname=`dirname $f`
echo "Installing $f in $dname"
test -d $SERVICESDIR/$dname || mkdir -p $SERVICESDIR/$dname || exit 1
cp $f $SERVICESDIR/$dname/ || exit 1
chmod 0644 $SERVICESDIR/$f || exit 1
done
}
installdir `find . -name '*.esp'`
cat << EOF
======================================================================
The JSON-RPC services have been installed.
======================================================================
EOF
exit 0

37
source4/script/installswat.sh Executable file
View File

@ -0,0 +1,37 @@
#!/bin/sh
SWATDIR=$1
SRCDIR=$2
echo Installing swat files in $SWATDIR
cd $SRCDIR/../swat || exit 1
mkdir -p $SWATDIR || exit 1
installdir() {
for f in $*; do
dname=`dirname $f`
echo "Installing $f in $dname"
test -d $SWATDIR/$dname || mkdir -p $SWATDIR/$dname || exit 1
cp $f $SWATDIR/$dname/ || exit 1
chmod 0644 $SWATDIR/$f || exit 1
done
}
installdir `find . -name '*.js'`
installdir `find . -name '*.esp'`
installdir `find . -name '*.css'`
installdir `find . -name '*.png'`
installdir `find . -name '*.ico'`
installdir `find . -name '*.gif'`
installdir `find . -name '*.ejs'`
cat << EOF
======================================================================
The swat files have been installed.
======================================================================
EOF
exit 0

View File

@ -1,51 +0,0 @@
#!/bin/sh
WEBAPPSDIR=$1
SRCDIR=$2
echo Installing web application files in $WEBAPPSDIR
cd $SRCDIR/../webapps/swat || exit 1
# building the web application framework is now done by autogen.sh
#make build || exit 1
mkdir -p $WEBAPPSDIR || exit 1
installdir() {
for f in $*; do
dname=`dirname $f`
echo "Installing $f in $dname"
test -d $WEBAPPSDIR/$dname || mkdir -p $WEBAPPSDIR/$dname || exit 1
cp $f $WEBAPPSDIR/$dname/ || exit 1
chmod 0644 $WEBAPPSDIR/$f || exit 1
done
}
# install our web application
cd build || exit 1
installdir `find . -type f -print`
# install files from the 'scripting', 'style' and 'images' directories
cd ../.. || exit 1
installdir `find scripting -name '*.js'`
installdir `find scripting -name '*.esp'`
installdir `find style -name '*.css'`
installdir `find images -name '*.png'`
installdir `find images -name '*.gif'`
installdir `find images -name '*.ico'`
# install the old installation scripts, since there's no replacement yet
installdir `find install -name '*.esp'`
# install top-level scripts
installdir index.esp login.esp logout.esp menu.js
cat << EOF
======================================================================
The web application files have been installed.
======================================================================
EOF
exit 0

View File

@ -161,51 +161,6 @@ static int ejs_version(MprVarHandle eid, int argc, struct MprVar **argv)
}
/*
* jsonrpc_include() allows you to include jsonrpc files from a path based at
* "jsonrpc services directory =" in smb.conf.
*/
static int jsonrpc_include(int eid, int argc, char **argv)
{
int ret = -1;
char *path;
char *emsg;
const char *jsonrpc_services_dir = lp_jsonrpc_services_dir();
struct MprVar result;
if (jsonrpc_services_dir == NULL || jsonrpc_services_dir == NULL) {
ejsSetErrorMsg(eid, "'jsonrpc services directory' not set");
return -1;
}
if (argc != 1) {
mpr_Return(eid, mprCreateIntegerVar(-1));
return 0;
}
path = talloc_asprintf(mprMemCtx(), "%s/%s",
jsonrpc_services_dir,
argv[0]);
if (path == NULL) {
mpr_Return(eid, mprCreateIntegerVar(-1));
return 0;
}
if (file_exist(path)) {
ret = ejsEvalFile(eid, path, &result, &emsg);
if (ret < 0) {
ejsSetErrorMsg(eid, "Could not eval file");
printf("file found; ret=%d (%s)\n", ret, emsg);
}
}
mpr_Return(eid, mprCreateIntegerVar(ret));
talloc_free(path);
return 0;
}
static void (*ejs_exception_handler) (const char *) = NULL;
_PUBLIC_ void ejs_exception(const char *reason)
@ -240,6 +195,5 @@ void smb_setup_ejs_functions(void (*exception_handler)(const char *))
ejsDefineCFunction(-1, "nativeTypeOf", ejs_typeof_native, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineStringCFunction(-1, "libinclude", ejs_libinclude, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "version", ejs_version, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineStringCFunction(-1, "jsonrpc_include", jsonrpc_include, NULL, MPR_VAR_SCRIPT_HANDLE);
}

View File

@ -162,7 +162,6 @@ function ldb_erase(info, ldb)
/* delete the specials */
ldb.del("@INDEXLIST");
ldb.del("@ATTRIBUTES");
ldb.del("@SUBCLASSES");
ldb.del("@MODULES");
ldb.del("@PARTITION");
ldb.del("@KLUDGEACL");

View File

@ -36,8 +36,6 @@
#define SAMBA_SESSION_KEY "SambaSessionId"
#define HTTP_PREAUTH_URI "/scripting/preauth.esp"
#define JSONRPC_REQUEST "/services"
#define JSONRPC_SERVER "/request.esp"
/* state of the esp subsystem for a specific request */
struct esp_state {
@ -171,12 +169,12 @@ failed:
return -1;
}
static int http_readFileFromWebappsDir(EspHandle handle,
static int http_readFileFromSwatDir(EspHandle handle,
char **buf,
int *len,
const char *path)
{
return http_readFile(handle, buf, len, path, lp_webapps_directory());
return http_readFile(handle, buf, len, path, lp_swat_directory());
}
@ -390,7 +388,7 @@ static void http_simple_request(struct websrv_context *web)
const char *path;
struct stat st;
path = http_local_path(web, url, lp_webapps_directory());
path = http_local_path(web, url, lp_swat_directory());
if (path == NULL) goto invalid;
/* looks ok */
@ -472,7 +470,7 @@ static void http_setup_arrays(struct esp_state *esp)
talloc_asprintf(esp, "%u", socket_address->port));
}
SETVAR(ESP_SERVER_OBJ, "DOCUMENT_ROOT", lp_webapps_directory());
SETVAR(ESP_SERVER_OBJ, "DOCUMENT_ROOT", lp_swat_directory());
SETVAR(ESP_SERVER_OBJ, "SERVER_PROTOCOL", tls_enabled(web->conn->socket)?"https":"http");
SETVAR(ESP_SERVER_OBJ, "SERVER_SOFTWARE", "SAMBA");
SETVAR(ESP_SERVER_OBJ, "GATEWAY_INTERFACE", "CGI/1.1");
@ -517,7 +515,7 @@ static void esp_request(struct esp_state *esp, const char *url)
int res;
char *emsg = NULL, *buf;
if (http_readFile(web, &buf, &size, url, lp_webapps_directory()) != 0) {
if (http_readFile(web, &buf, &size, url, lp_swat_directory()) != 0) {
http_error_unix(web, url);
return;
}
@ -538,90 +536,18 @@ static void esp_request(struct esp_state *esp, const char *url)
talloc_free(buf);
}
/*
process a JSON RPC request
*/
static void jsonrpc_request(struct esp_state *esp)
{
struct websrv_context *web = esp->web;
const char *path = http_local_path(web,
JSONRPC_SERVER,
lp_jsonrpc_services_dir());
MprVar *global;
MprVar v;
MprVar temp;
int size;
int res;
char *emsg = NULL;
char *emsg2 = NULL;
char *buf;
char *error_script =
"error.setOrigin(jsonrpc.Constant.ErrorOrigin.Server); "
"error.setError(jsonrpc.Constant.ErrorCode.UnexpectedOutput, "
" global.errorString);"
"error.Send();";
/* Ensure we got a valid path. */
if (path == NULL) {
/* should never occur */
http_error(esp->web, 500, "Internal server error");
return;
}
/* Ensure that the JSON-RPC server request script exists */
if (!file_exist(path)) {
http_error_unix(esp->web, path);
return;
}
/* Call the server request script */
if (http_readFile(web, &buf, &size,
JSONRPC_SERVER, lp_jsonrpc_services_dir()) != 0) {
http_error_unix(web, JSONRPC_SERVER);
return;
}
#if HAVE_SETJMP_H
if (setjmp(ejs_exception_buf) != 0) {
http_error(web, 500, exception_reason);
return;
}
#endif
res = espProcessRequest(esp->req, JSONRPC_SERVER, buf, &emsg);
if (res != 0 && emsg) {
/* Save the error in a string accessible from javascript */
global = ejsGetGlobalObject(0);
v = mprString(emsg);
mprCreateProperty(global, "errorString", &v);
/* Create and send a JsonRpcError object */
if (ejsEvalScript(0,
error_script,
&temp,
&emsg2) != 0) {
http_writeBlock(web, "<pre>", 5);
http_writeBlock(web, emsg, strlen(emsg));
http_writeBlock(web, "</pre>", 6);
}
}
talloc_free(buf);
}
/*
perform pre-authentication on every page if /scripting/preauth.esp
exists. If this script generates any non-whitepace output at all,
then we don't run the requested URL.
note that the preauth is run even for static pages such as images, but not
for JSON-RPC service requests which do their own authentication via the
JSON-RPC server.
note that the preauth is run even for static pages such as images
*/
static BOOL http_preauth(struct esp_state *esp)
{
const char *path = http_local_path(esp->web,
HTTP_PREAUTH_URI,
lp_webapps_directory());
lp_swat_directory());
int i;
if (path == NULL) {
http_error(esp->web, 500, "Internal server error");
@ -834,7 +760,7 @@ static const struct Esp esp_control = {
.setHeader = http_setHeader,
.redirect = http_redirect,
.setResponseCode = http_setResponseCode,
.readFile = http_readFileFromWebappsDir,
.readFile = http_readFileFromSwatDir,
.mapToStorage = http_mapToStorage,
.setCookie = http_setCookie,
.createSession = http_createSession,
@ -858,8 +784,7 @@ void http_process_input(struct websrv_context *web)
const char *file_type = NULL;
enum page_type {
page_type_simple,
page_type_esp,
page_type_jsonrpc
page_type_esp
};
enum page_type page_type;
const struct {
@ -945,35 +870,21 @@ void http_process_input(struct websrv_context *web)
esp->req = espCreateRequest(web, web->input.url, esp->variables);
if (esp->req == NULL) goto internal_error;
/*
* Work out the mime type. First, we see if the request is a JSON-RPC
* service request. If not, we look at the extension.
*/
if (strncmp(web->input.url,
JSONRPC_REQUEST,
sizeof(JSONRPC_REQUEST) - 1) == 0 &&
(web->input.url[sizeof(JSONRPC_REQUEST) - 1] == '\0' ||
web->input.url[sizeof(JSONRPC_REQUEST) - 1] == '/')) {
page_type = page_type_jsonrpc;
file_type = "text/json";
} else {
p = strrchr(web->input.url, '.');
if (p == NULL) {
page_type = page_type_esp;
file_type = "text/html";
}
for (i=0;p && i<ARRAY_SIZE(mime_types);i++) {
p = strrchr(web->input.url, '.');
if (p == NULL) {
page_type = page_type_esp;
file_type = "text/html";
}
for (i=0;p && i<ARRAY_SIZE(mime_types);i++) {
if (strcmp(mime_types[i].extension, p+1) == 0) {
page_type = mime_types[i].page_type;
file_type = mime_types[i].mime_type;
page_type = mime_types[i].page_type;
file_type = mime_types[i].mime_type;
}
}
if (file_type == NULL) {
}
if (file_type == NULL) {
page_type = page_type_simple;
file_type = "text/html";
}
}
}
/* setup basic headers */
http_setResponseCode(web, 200);
@ -1002,10 +913,6 @@ void http_process_input(struct websrv_context *web)
esp_request(esp, web->input.url);
}
break;
case page_type_jsonrpc:
jsonrpc_request(esp);
break;
}
if (web->conn == NULL) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 456 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 B

View File

@ -1,30 +0,0 @@
<% page_header("columns", "Server Status", "main");
libinclude("base.js");
libinclude("management.js");
libinclude("provision.js");
if (install_ok(session.authinfo.session_info, session.authinfo.credentials) == false) {
redirect("/install/");
}
%>
<h1>Server Status</h1>
<%
var servers = new Array("nbt_server", "smb_server", "ldap_server", "cldap_server", "kdc_server");
var i;
var info = new Object();
info["NBT Server"] = server_status("nbt");
info["WINS Server"] = server_status("wins");
info["CLDAP Server"] = server_status("cldap");
info["Kerberos Server"] = server_status("kdc");
info["SMB Server"] = stream_server_status("smb");
info["LDAP Server"] = stream_server_status("ldap");
info["RPC Server"] = stream_server_status("rpc");
simple_table(info);
%>
<% page_footer(); %>

View File

@ -1,40 +0,0 @@
<% page_header("columns", "Server Installation", "install");
if (session.authinfo.user_class == "ADMINISTRATOR"
|| session.authinfo.user_class == "SYSTEM") {
%>
<h1>Installation</h1>
<p>Welcome to Samba4 installation. Before proceeding, you will need to
know: </p>
<ul>
<li>The domain name you will use
<li>The realm name you will use
</ul>
<p>After you have decided on those, choose the 'Provisioning' menu item
on the left, and fill in the form.</p>
<p><b>Warning!</b> When you provision, your existing user database is
wiped and replaced with a new one.</p>
<%
} else {
%>
<h1>Installation</h1>
<p>To install Samba4, you must have logged in as <b>root</b>, or administrator of the previously configured domain. </p>
<p><b>Warning!</b> When you provision, your existing user database is
wiped and replaced with a new one. </p>
<%
}
page_footer(); %>

View File

@ -1,50 +0,0 @@
<% page_header("columns", "Add a user", "install");
include("/scripting/forms.js");
libinclude("base.js");
libinclude("provision.js");
%>
<h1>Add a user</h1>
<%
var f = FormObj("newuser", 0, 2);
var i;
var rand = random_init();
f.add("USERNAME", "User Name");
f.add("UNIXNAME", "Unix Name");
f.add("PASSWORD", "Password", "password");
f.add("CONFIRM", "Confirm Password", "password");
f.submit[0] = "Add";
f.submit[1] = "Cancel";
if (form['submit'] == "Cancel") {
redirect("/");
}
if (form['submit'] == "Add" &&
form.USERNAME != undefined) {
var goodpass = (form.CONFIRM == form.PASSWORD);
if (!goodpass) {
write("<h3>Passwords don't match. Please try again.</h3>");
f.display();
} else {
if (form.UNIXNAME == undefined) {
form.UNIXNAME = form.USERNAME;
}
if (form.PASSWORD == undefined) {
form.PASSWORD = rand.randpass();
}
newuser(form.USERNAME, form.UNIXNAME, form.PASSWORD, writefln,
session.authinfo.session_info, session.authinfo.credentials);
}
} else {
f.display();
}
%>
<% page_footer(); %>

View File

@ -1,89 +0,0 @@
<% page_header("columns", "Provisioning", "install");
include("/scripting/forms.js");
libinclude("base.js");
libinclude("provision.js");
%>
<h1>Samba4 provisioning</h1>
<%
var f = FormObj("Provisioning", 0, 2);
var i;
var lp = loadparm_init();
if (session.authinfo.user_class == "ADMINISTRATOR"
|| session.authinfo.user_class == "SYSTEM") {
if (lp.get("realm") == "") {
lp.set("realm", lp.get("workgroup") + ".example.com");
}
var subobj = provision_guess();
/* Don't supply default password for web interface */
subobj.ADMINPASS = "";
f.add("REALM", "DNS Domain Name");
f.add("DOMAIN", "NetBIOS Domain Name");
f.add("HOSTNAME", "Hostname");
f.add("ADMINPASS", "Administrator Password", "password");
f.add("CONFIRM", "Confirm Password", "password");
f.add("DOMAINSID", "Domain SID");
f.add("HOSTIP", "Host IP");
f.add("DEFAULTSITE", "Default Site");
f.submit[0] = "Provision";
f.submit[1] = "Cancel";
if (form['submit'] == "Cancel") {
redirect("/");
}
if (form['submit'] == "Provision") {
for (r in form) {
subobj[r] = form[r];
}
}
for (i=0;i<f.element.length;i++) {
f.element[i].value = subobj[f.element[i].name];
}
if (form['submit'] == "Provision") {
/* overcome an initially blank smb.conf */
lp.set("realm", subobj.REALM);
lp.set("workgroup", subobj.DOMAIN);
lp.reload();
var goodpass = (subobj.CONFIRM == subobj.ADMINPASS);
if (!goodpass) {
write("<h3>Passwords don't match. Please try again.</h3>");
f.display();
} else if (subobj.ADMINPASS == "") {
write("<h3>You must choose an administrator password. Please try again.</h3>");
f.display();
} else if (!provision_validate(subobj, writefln)) {
f.display();
} else {
var paths = provision_default_paths(subobj);
if (!provision(subobj, writefln, false, paths,
session.authinfo.session_info, session.authinfo.credentials, false)) {
writefln("Provision failed!");
} else if (!provision_dns(subobj, writefln, paths,
session.authinfo.session_info, session.authinfo.credentials)) {
writefln("DNS Provision failed!");
} else {
writefln("Provision Complete!");
}
}
} else {
f.display();
}
} else {
redirect("/");
}
%>
<% page_footer(); %>

View File

@ -1,112 +0,0 @@
<% page_header("columns", "Upgrade", "install");
/* frontend to Samba3 upgrade.
Based on provision.esp
(C) Jelmer Vernooij 2005
Published under the GNU GPL
*/
include("/scripting/forms.js");
libinclude("base.js");
libinclude("provision.js");
libinclude("upgrade.js");
%>
<h1>Import from Samba3</h1>
<%
if (session.authinfo.user_class == "ADMINISTRATOR"
|| session.authinfo.user_class == "SYSTEM") {
if (form['submit'] == "Cancel") {
redirect("/");
}
function confirm_form()
{
var samba3 = samba3_read(form['LIBDIR'], form['SMBCONF']);
var subobj = upgrade_provision(samba3);
var f = FormObj("Import from Samba3", 0, 2);
subobj.ADMINPASS = "";
f.add("REALM", "Realm");
f.add("DOMAIN", "Domain Name");
f.add("HOSTNAME", "Hostname");
f.add("ADMINPASS", "Administrator Password", "password");
f.add("CONFIRM", "Confirm Password", "password");
f.add("DOMAINSID", "Domain SID");
f.add("HOSTGUID", "Host GUID");
f.add("HOSTIP", "Host IP");
f.add("DEFAULTSITE", "Default Site");
for (i=0;i<f.element.length;i++) {
f.element[i].value = subobj[f.element[i].name];
}
f.add("SMBCONF", "", "hidden", form['SMBCONF']);
f.add("LIBDIR", "", "hidden", form['LIBDIR']);
f.submit[0] = "Continue";
f.submit[1] = "Cancel";
f.display();
}
if (form['submit'] == "Import") {
confirm_form();
} else if (form['submit'] == "Continue") {
var samba3 = samba3_read(form['LIBDIR'], form['SMBCONF']);
assert(samba3 != undefined);
var subobj = upgrade_provision(samba3);
for (r in form) {
subobj[r] = form[r];
}
var goodpass = (subobj.CONFIRM == subobj.ADMINPASS);
if (!goodpass) {
write("<h3>Passwords don't match. Please try again.</h3>");
confirm_form();
} else if (subobj.ADMINPASS == "") {
write("<h3>You must choose an administrator password. Please try again.</h3>");
confirm_form();
} else {
var paths = provision_default_paths(subobj);
if (!provision(subobj, writefln, true, paths,
session.authinfo.session_info, session.authinfo.credentials)) {
writefln("Provision failed!");
} else {
var ret = upgrade(subobj,samba3,message,paths,
session.authinfo.session_info, session.authinfo.credentials);
if (ret > 0) {
writefln("Failed to import %d entries\n", ret);
} else {
if (!provision_dns(subobj, writefln, paths,
session.authinfo.session_info, session.authinfo.credentials)) {
writefln("DNS Provision failed!");
} else {
writefln("Reloading smb.conf\n");
var lp = loadparm_init();
lp.reload();
writefln("Upgrade Complete!");
}
}
}
}
} else {
var f = FormObj("Import from Samba3", 0, 2);
f.add("SMBCONF", "smb.conf file", "text", "/etc/samba/smb.conf");
f.add("LIBDIR", "Lib directory", "text", "/var/lib/samba");
f.submit[0] = "Import";
f.submit[1] = "Cancel";
write('<p>Warning: This will erase your current configuration!</p>');
f.display();
}
} else {
redirect("/");
}
%>
<% page_footer(); %>

View File

@ -1,129 +0,0 @@
<% page_header("columns", "Windows to Samba Migration", "install");
include("/scripting/forms.js");
libinclude("base.js");
libinclude("provision.js");
var misc = misc_init();
%>
<h1>Windows to Samba4 domain migration</h1>
<%
var f = FormObj("Provisioning", 0, 2);
var i;
var lp = loadparm_init();
if (session.authinfo.user_class == "ADMINISTRATOR"
|| session.authinfo.user_class == "SYSTEM") {
if (lp.get("realm") == "") {
lp.set("realm", lp.get("workgroup") + ".example.com");
}
var subobj = provision_guess();
/* Don't supply default password for web interface */
subobj.ADMINPASS = "";
f.add("REALM", "DNS Domain Name");
f.add("DOMAIN", "NetBIOS Domain Name");
f.add("ADMIN", "Administrator Username");
f.add("ADMINPASS", "Administrator Password", "password");
f.add("HOSTNAME", "My Hostname");
f.add("HOSTIP", "My Host's IP");
f.add("DEFAULTSITE", "Default Site");
f.submit[0] = "Migrate";
f.submit[1] = "Cancel";
if (form['submit'] == "Cancel") {
redirect("/");
}
if (form['submit'] == "Migrate") {
for (r in form) {
subobj[r] = form[r];
}
}
for (i=0;i<f.element.length;i++) {
f.element[i].value = subobj[f.element[i].name];
}
if (form['submit'] == "Migrate") {
/* overcome an initially blank smb.conf */
lp.set("realm", subobj.REALM);
lp.set("workgroup", subobj.DOMAIN);
lp.reload();
if (subobj.ADMINPASS == "") {
write("<h3>We need the administrator password for the " + subobj.DOMAIN + " domain to proceed. Please try again.</h3>");
f.display();
} else if (!provision_validate(subobj, writefln)) {
f.display();
} else if (strupper(lp.get("server role")) == "domain controller") {
writefln("You need to set 'server role' to 'member server' before starting the migration process");
} else {
var creds = credentials_init();
var samdb;
creds.set_username(form.ADMIN);
creds.set_password(form.ADMINPASS);
creds.set_domain(form.DOMAIN);
creds.set_realm(form.REALM);
var info = new Object();
var paths = provision_default_paths(subobj);
var session_info = session.authinfo.session_info;
var credentials = session.authinfo.credentials;
info.credentials = credentials;
info.session_info = session_info;
info.message = writefln;
info.subobj = subobj;
/* Setup a basic database structure, but don't setup any users */
if (!provision(subobj, writefln, true, paths,
session_info, credentials, false)) {
writefln("Provision failed!");
/* Join domain */
} else if (!join_domain(form.DOMAIN, form.HOSTNAME, misc.SEC_CHAN_BDC, creds, writefln)) {
writefln("Domain Join failed!");
/* Vampire */
} else if (!vampire(form.DOMAIN, session.authinfo.session_info,
session.authinfo.credentials, writefln)) {
writefln("Failed to syncronsise remote domain into local database!");
} else if (!provision_dns(subobj, writefln, paths,
session.authinfo.session_info, session.authinfo.credentials)) {
writefln("DNS Provision failed!");
} else if (!(samdb = open_ldb(info, paths.samdb, false))) {
writefln("Opening " + paths.samdb + " failed!");
info.samdb = samdb;
} else if (!setup_name_mappings(info, samdb)) {
writefln("Setup of name mappings failed!");
} else {
var zonepath = paths.dns;
%>
<h3>Database migrated!</h3>
You need to do the following to complete the process:
<ul>
<li>Install the <b>@@zonepath</b> zone file into your bind install, and restart bind
<li>Change your smb.conf to set "server role = domain controller"
<li>Shutdown your existing PDC and any other DCs
<li>Restart smbd
</ul>
<%
}
}
} else {
f.display();
}
} else {
redirect("/");
}
%>
<% page_footer(); %>

View File

@ -1,60 +0,0 @@
<% page_header("plain", "SWAT Login", "");
libinclude("auth.js");
include("/scripting/forms.js");
if (request['SESSION_EXPIRED'] == "True") {
write("<b>Your session has expired - please authenticate again<br /></b>\n");
}
var f = FormObj("login", 3, 1);
f.element[0].label = "Username";
f.element[0].value = form['Username'];
f.element[1].label = "Password";
f.element[1].value = form['Password'];
f.element[1].type = "password";
f.element[2].label = "Domain";
f.element[2].type = "select";
f.element[2].list = getDomainList();
f.submit[0] = "Login";
f.display();
%>
<%
if (request.REQUEST_METHOD == "POST") {
var creds = credentials_init();
creds.set_username(form.Username);
creds.set_password(form.Password);
creds.set_domain(form.Domain);
creds.set_workstation(request['REMOTE_HOST']);
auth = userAuth(creds, request['REMOTE_SOCKET_ADDRESS']);
if (auth == undefined) {
write("<b>Invalid login - please try again<br /></b>\n");
} else if (auth.result) {
session.AUTHENTICATED = true;
session.authinfo = new Object();
session.authinfo.username = auth.username;
session.authinfo.domain = auth.domain;
session.authinfo.credentials = creds;
session.authinfo.session_info = auth.session_info;
session.authinfo.user_class = auth.user_class;
/* if the user was asking for the login page, then now
redirect them to the main page. Otherwise just
redirect them to the current page, which will now
show its true content */
if (request.REQUEST_URI == "/login.esp") {
redirect(session_uri("/"));
} else {
redirect(session_uri(request.REQUEST_URI));
}
} else if (auth.report == undefined) {
write("<b>Login failed - please try again<br /></b>\n");
} else {
write("<b>Login failed: " + auth.report + " - please try again<br /></b>\n");
}
}
%>
<% page_footer(); %>

View File

@ -1,8 +0,0 @@
<%
page_header("plain", "Logging out", "");
session.AUTHENTICATED = false;
redirect("/login.esp");
page_footer();
%>

View File

@ -1,57 +0,0 @@
/*
the menu hierarchy for SWAT
*/
include("/scripting/menus.js");
swat_menus = new Object();
swat_menus.main = simple_menu(
"Main Menu",
"Installation", session_uri("/install/"),
"ESP Tests", session_uri("/esptest/"),
"Preview of new SWAT",session_uri("/index.html"));
swat_menus.esptest = simple_menu(
"ESP Tests",
"ldb database", session_uri("/esptest/ldb.esp"),
"samr calls", session_uri("/esptest/samr.esp"),
"html forms", session_uri("/esptest/formtest.esp"),
"esp includes", session_uri("/esptest/include.esp"),
"session variables", session_uri("/esptest/session.esp"),
"loadparm access", session_uri("/esptest/loadparm.esp"),
"exception handling", session_uri("/esptest/exception.esp"),
"environment variables", session_uri("/esptest/showvars.esp"),
"registry", session_uri("/esptest/registry.esp"));
swat_menus.json = simple_menu(
"JSON Tests",
"ldb browser", session_uri("/apps/samba/utils/ldbbrowse.html"),
"admin console", session_uri("/apps/samba/utils/admin_console.html"));
swat_menus.install = simple_menu(
"Installation",
"Provisioning", session_uri("/install/provision.esp"),
"New User", session_uri("/install/newuser.esp"),
"Import from Samba3", session_uri("/install/samba3.esp"),
"Import from Windows", session_uri("/install/vampire.esp"));
swat_menus.nbt_server = simple_menu(
"NBT Server",
"Statistics", session_uri("/nbt_server/index.esp"));
swat_menus.docs = simple_menu(
"Links",
"Samba4 development", "http://devel.samba.org/",
"Recent Checkins", "http://build.samba.org/?tree=samba4;function=Recent+Checkins",
"Recent Builds", "http://build.samba.org/?tree=samba4;function=Recent+Builds",
"EJS Information", "http://www.appwebserver.org/products/ejs/ejs.html",
"ESP Information", "http://www.appwebserver.org/products/esp/esp.html",
"XHTML Spec", "http://www.w3.org/TR/xhtml1/",
"JavaScript Spec", "http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf",
"CSS Specs", "http://www.w3.org/Style/CSS/#specs",
"CSS1/2 Reference", "http://www.w3schools.com/css/css_reference.asp");

View File

@ -1,2 +0,0 @@
Please point your browser to:
http://qooxdoo.org/about/developers

View File

@ -1,778 +0,0 @@
qooxdoo Licensing Information
=============================
qooxdoo may be used under the terms of either the
* GNU Lesser General Public License (LGPL)
http://www.gnu.org/licenses/lgpl.html
or the
* Eclipse Public License (EPL)
http://www.eclipse.org/org/documents/epl-v10.php
As a recipient of qooxdoo, you may choose which license to receive the code
under. Certain files or entire directories may not be covered by this
dual license, but are subject to licenses compatible to both LGPL and EPL.
License exceptions are explicitly declared in all relevant files or in a
LICENSE file in the relevant directories.
________________________________________________________________________________
Important Note For Projects That Need To Comply With EPL:
---------------------------------------------------------
The qooxdoo default icon theme ("Nuvola") is available only under the LGPL.
Therefore, you have to select another icon theme that is compatible to EPL.
You may do so by switching to another default icon theme:
in class qx.manager.object.ImageManager, which is declared in file
frontend/framework/source/class/qx/manager/object/ImageManager.js, change
the following line
qx.Settings.setDefault("iconTheme", "qx.theme.icon.Nuvola");
to either
qx.Settings.setDefault("iconTheme", "qx.theme.icon.NuoveXT");
or
qx.Settings.setDefault("iconTheme", "qx.theme.icon.VistaInspirate");
or to a custom icon theme that is license-compatible.
________________________________________________________________________________
The full text of the LGPL and EPL licenses is attached below.
********************************************************************************
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
********************************************************************************
Eclipse Public License - v 1.0
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial code and
documentation distributed under this Agreement, and
b) in the case of each subsequent Contributor:
i) changes to the Program, and
ii) additions to the Program;
where such changes and/or additions to the Program originate from and
are distributed by that particular Contributor. A Contribution
'originates' from a Contributor if it was added to the Program by such
Contributor itself or anyone acting on such Contributor's
behalf. Contributions do not include additions to the Program which:
(i) are separate modules of software distributed in conjunction with
the Program under their own license agreement, and (ii) are not
derivative works of the Program.
"Contributor" means any person or entity that distributes the Program.
"Licensed Patents " mean patent claims licensable by a Contributor
which are necessarily infringed by the use or sale of its Contribution
alone or when combined with the Program.
"Program" means the Contributions distributed in accordance with this
Agreement.
"Recipient" means anyone who receives the Program under this
Agreement, including all Contributors.
2. GRANT OF RIGHTS
a) Subject to the terms of this Agreement, each Contributor hereby
grants Recipient a non-exclusive, worldwide, royalty-free copyright
license to reproduce, prepare derivative works of, publicly display,
publicly perform, distribute and sublicense the Contribution of such
Contributor, if any, and such derivative works, in source code and
object code form.
b) Subject to the terms of this Agreement, each Contributor hereby
grants Recipient a non-exclusive, worldwide, royalty-free patent
license under Licensed Patents to make, use, sell, offer to sell,
import and otherwise transfer the Contribution of such Contributor, if
any, in source code and object code form. This patent license shall
apply to the combination of the Contribution and the Program if, at
the time the Contribution is added by the Contributor, such addition
of the Contribution causes such combination to be covered by the
Licensed Patents. The patent license shall not apply to any other
combinations which include the Contribution. No hardware per se is
licensed hereunder.
c) Recipient understands that although each Contributor grants the
licenses to its Contributions set forth herein, no assurances are
provided by any Contributor that the Program does not infringe the
patent or other intellectual property rights of any other entity. Each
Contributor disclaims any liability to Recipient for claims brought by
any other entity based on infringement of intellectual property rights
or otherwise. As a condition to exercising the rights and licenses
granted hereunder, each Recipient hereby assumes sole responsibility
to secure any other intellectual property rights needed, if any. For
example, if a third party patent license is required to allow
Recipient to distribute the Program, it is Recipient's responsibility
to acquire that license before distributing the Program.
d) Each Contributor represents that to its knowledge it has sufficient
copyright rights in its Contribution, if any, to grant the copyright
license set forth in this Agreement.
3. REQUIREMENTS
A Contributor may choose to distribute the Program in object code form
under its own license agreement, provided that:
a) it complies with the terms and conditions of this Agreement; and
b) its license agreement:
i) effectively disclaims on behalf of all Contributors all warranties
and conditions, express and implied, including warranties or
conditions of title and non-infringement, and implied warranties or
conditions of merchantability and fitness for a particular purpose;
ii) effectively excludes on behalf of all Contributors all liability
for damages, including direct, indirect, special, incidental and
consequential damages, such as lost profits;
iii) states that any provisions which differ from this Agreement are
offered by that Contributor alone and not by any other party; and
iv) states that source code for the Program is available from such
Contributor, and informs licensees how to obtain it in a reasonable
manner on or through a medium customarily used for software exchange.
When the Program is made available in source code form:
a) it must be made available under this Agreement; and
b) a copy of this Agreement must be included with each copy of the
Program.
Contributors may not remove or alter any copyright notices contained
within the Program.
Each Contributor must identify itself as the originator of its
Contribution, if any, in a manner that reasonably allows subsequent
Recipients to identify the originator of the Contribution.
4. COMMERCIAL DISTRIBUTION
Commercial distributors of software may accept certain
responsibilities with respect to end users, business partners and the
like. While this license is intended to facilitate the commercial use
of the Program, the Contributor who includes the Program in a
commercial product offering should do so in a manner which does not
create potential liability for other Contributors. Therefore, if a
Contributor includes the Program in a commercial product offering,
such Contributor ("Commercial Contributor") hereby agrees to defend
and indemnify every other Contributor ("Indemnified Contributor")
against any losses, damages and costs (collectively "Losses") arising
from claims, lawsuits and other legal actions brought by a third party
against the Indemnified Contributor to the extent caused by the acts
or omissions of such Commercial Contributor in connection with its
distribution of the Program in a commercial product offering. The
obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property
infringement. In order to qualify, an Indemnified Contributor must: a)
promptly notify the Commercial Contributor in writing of such claim,
and b) allow the Commercial Contributor to control, and cooperate with
the Commercial Contributor in, the defense and any related settlement
negotiations. The Indemnified Contributor may participate in any such
claim at its own expense.
For example, a Contributor might include the Program in a commercial
product offering, Product X. That Contributor is then a Commercial
Contributor. If that Commercial Contributor then makes performance
claims, or offers warranties related to Product X, those performance
claims and warranties are such Commercial Contributor's responsibility
alone. Under this section, the Commercial Contributor would have to
defend claims against the other Contributors related to those
performance claims and warranties, and if a court requires any other
Contributor to pay any damages as a result, the Commercial Contributor
must pay those damages.
5. NO WARRANTY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
responsible for determining the appropriateness of using and
distributing the Program and assumes all risks associated with its
exercise of rights under this Agreement , including but not limited to
the risks and costs of program errors, compliance with applicable
laws, damage to or loss of data, programs or equipment, and
unavailability or interruption of operations.
6. DISCLAIMER OF LIABILITY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
7. GENERAL
If any provision of this Agreement is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of
the remainder of the terms of this Agreement, and without further
action by the parties hereto, such provision shall be reformed to the
minimum extent necessary to make such provision valid and enforceable.
If Recipient institutes patent litigation against any entity
(including a cross-claim or counterclaim in a lawsuit) alleging that
the Program itself (excluding combinations of the Program with other
software or hardware) infringes such Recipient's patent(s), then such
Recipient's rights granted under Section 2(b) shall terminate as of
the date such litigation is filed.
All Recipient's rights under this Agreement shall terminate if it
fails to comply with any of the material terms or conditions of this
Agreement and does not cure such failure in a reasonable period of
time after becoming aware of such noncompliance. If all Recipient's
rights under this Agreement terminate, Recipient agrees to cease use
and distribution of the Program as soon as reasonably
practicable. However, Recipient's obligations under this Agreement and
any licenses granted by Recipient relating to the Program shall
continue and survive.
Everyone is permitted to copy and distribute copies of this Agreement,
but in order to avoid inconsistency the Agreement is copyrighted and
may only be modified in the following manner. The Agreement Steward
reserves the right to publish new versions (including revisions) of
this Agreement from time to time. No one other than the Agreement
Steward has the right to modify this Agreement. The Eclipse Foundation
is the initial Agreement Steward. The Eclipse Foundation may assign
the responsibility to serve as the Agreement Steward to a suitable
separate entity. Each new version of the Agreement will be given a
distinguishing version number. The Program (including Contributions)
may always be distributed subject to the version of the Agreement
under which it was received. In addition, after a new version of the
Agreement is published, Contributor may elect to distribute the
Program (including its Contributions) under the new version. Except as
expressly stated in Sections 2(a) and 2(b) above, Recipient receives
no rights or licenses to the intellectual property of any Contributor
under this Agreement, whether expressly, by implication, estoppel or
otherwise. All rights in the Program not expressly granted under this
Agreement are reserved.
This Agreement is governed by the laws of the State of New York and
the intellectual property laws of the United States of America. No
party to this Agreement will bring a legal action under this Agreement
more than one year after the cause of action arose. Each party waives
its rights to a jury trial in any resulting litigation.
********************************************************************************
END OF FILE

View File

@ -1,72 +0,0 @@
Welcome! :-)
qooxdoo is one of the most comprehensive and innovative Open Source AJAX
frameworks. It is a multipurpose framework that includes support for
professional JavaScript development, a state-of-the-art GUI toolkit and
high-level client-server communication.
License
qooxdoo may be used under the terms of either the GNU Lesser General Public
License (LGPL) or the Eclipse Public License (EPL). As a recipient of qooxdoo,
you may choose which license to receive the code under.
Please make sure you understand the dual license of qooxdoo and the rights and
obligations that come with it. See the top-level LICENSE file for more details.
Framework
qooxdoo is entirely class-based and tries to leverage the features of
object-oriented JavaScript. It is fully based on namespaces and does not
modify or extend native JavaScript types. Most modern browsers are
supported (e.g. Firefox, Internet Explorer and Opera; Safari soon) and it
is free of memory leaks. It comes with a comprehensive API reference, that
is auto-generated from Javadoc-like comments and from the syntax tree
representing the code. The fast and complete JavaScript parser not only
allows for doc generation, but is an integral part of the automatic build
process that makes optimizing, compressing, linking and deployment of
custom applications very user-friendly.
GUI Toolkit
Despite being a pure JavaScript framework, qooxdoo is quite on par with
GUI toolkits like Qt or SWT when it comes to advanced yet easy to implement
user interfaces. It offers a full-blown set of widgets that are hardly
distinguishable from elements of native desktop applications. Full built-in
support for keyboard navigation, focus and tab handling and drag & drop is
provided. Dimensions can be specified as static, auto-sizing, stretching,
percentage, weighted flex or min/max or even as combinations of those.
All widgets are based on powerful and flexible layout managers which are a
key to many of the advanced layout capabilities. Interface description is
done programmatically in JavaScript for maximum performance.
No HTML has to be used and augmented to define the interface. The qooxdoo
user does not even have to know CSS to style the interface. Clean and
easy-to-configure themes for appearance, colors or icons allow for a
full-fledged styling that even supports runtime switching.
AJAX
While being a client-side and server-agnostic solution, the qooxdoo project
does include complete implementations of RPC servers (currently Java and PHP)
to demonstrate some of its advanced client-server communcation. An abstract
transport layer supports queues, timeouts and implementations via
XMLHttpRequest, Iframes and Scripts. Like the rest of qooxdoo it fully
supports event-based programming which greatly simplifies asynchronous
communication.
Learn more
For further information about qooxdoo, please point your browser to
http://qooxdoo.org/about
For a step-by-step introduction to qooxdoo application development, please
see the instructions in the user manual at
http://qooxdoo.org/documentation/user_manual
Have fun! ;-)

View File

@ -1,2 +0,0 @@
Please point your browser to:
http://qooxdoo.org/about/release_notes

View File

@ -1,2 +0,0 @@
Please point your browser to:
http://qooxdoo.org/community/bugs

View File

@ -1 +0,0 @@
0.6.5

View File

@ -1,450 +0,0 @@
################################################################################
#
# qooxdoo - the new era of web development
#
# http://qooxdoo.org
#
# Copyright:
# 2006-2007 1&1 Internet AG, Germany, http://www.1and1.org
#
# License:
# LGPL: http://www.gnu.org/licenses/lgpl.html
# EPL: http://www.eclipse.org/org/documents/epl-v10.php
# See the LICENSE file in the project's top-level directory for details.
#
# Authors:
# * Sebastian Werner (wpbasti)
# * Andreas Ecker (ecker)
# * Fabian Jakobs (fjakobs)
#
################################################################################
################################################################################
# PUBLIC VARIABLES
################################################################################
QOOXDOO_PATH = ..
################################################################################
# INCLUDE CORE
################################################################################
include $(QOOXDOO_PATH)/frontend/framework/tool/make/framework.mk
################################################################################
# PRIVATE VARIABLES
################################################################################
RELEASE_BUILD_UNIX = release/temp/build/unix/qooxdoo-$(FRAMEWORK_VERSION)-build
RELEASE_BUILD_DOS = release/temp/build/dos/qooxdoo-$(FRAMEWORK_VERSION)-build
RELEASE_SDK_UNIX = release/temp/sdk/unix/qooxdoo-$(FRAMEWORK_VERSION)-sdk
RELEASE_SDK_DOS = release/temp/sdk/dos/qooxdoo-$(FRAMEWORK_VERSION)-sdk
APPLICATIONS = apiviewer feedreader sample showcase webmail
SDK_COPY = Makefile application/Makefile application/index.html
################################################################################
# COMMON TARGETS
################################################################################
source:
@$(MAKE) -s -C application source
build:
@$(MAKE) -s -C application build
api:
@$(MAKE) -s -C application api
all:
@$(MAKE) -s -C application all
locales:
@$(MAKE) -s -C application locales
pretty: framework-pretty
@$(MAKE) -s -C application pretty
fix: framework-fix
@$(MAKE) -s -C application fix
publish:
@$(MAKE) -s -C application publish
clean:
@$(MAKE) -s -C application clean
distclean:
@$(MAKE) -s -C application distclean
@$(MAKE) -s release-distclean
@$(MAKE) -s framework-distclean
################################################################################
# FRAMEWORK TARGETS
################################################################################
framework-distclean:
@echo
@echo "****************************************************************************"
@echo " CLEANING UP FRAMEWORK COMPLETELY"
@echo "****************************************************************************"
@echo " * Cleaning up..."
@$(CMD_REMOVE) $(FRAMEWORK_CACHE_PATH)
@$(CMD_REMOVE) $(FRAMEWORK_LOCALE_CLASS_PATH)
@$(CMD_REMOVE) $(FRAMEWORK_TRANSLATION_CLASS_PATH)
@$(CMD_REMOVE) application/skeleton.tar.gz
@$(CMD_REMOVE) application/skeleton.zip
@$(CMD_FIND) $(FRAMEWORK_PATH) $(FILES_TEMP) -exec $(CMD_REMOVE) {} \;
@$(CMD_REMOVE) $(FRAMEWORK_TOOL_PATH)/icon/temp
framework-pretty:
@echo
@echo "****************************************************************************"
@echo " PRETTIFYING FRAMEWORK CLASSES"
@echo "****************************************************************************"
@$(CMD_GENERATOR) \
--pretty-print \
--class-path $(FRAMEWORK_SOURCE_PATH)/$(FRAMEWORK_CLASS_FOLDERNAME)
framework-fix:
@echo
@echo "****************************************************************************"
@echo " FIXING FRAMEWORK CLASSES"
@echo "****************************************************************************"
@$(CMD_GENERATOR) \
--fix-source \
--class-path $(FRAMEWORK_SOURCE_PATH)/$(FRAMEWORK_CLASS_FOLDERNAME)
################################################################################
# MIGRATION TARGETS
################################################################################
checkout-migration:
@echo
@echo "****************************************************************************"
@echo " MIGRATE CHECKOUT"
@echo "****************************************************************************"
@if [ 1 ]; then \
migrate_options="--class-path framework/source/class --migration-input application/sample/source/html/"; \
for APPLICATION in $(APPLICATIONS); do \
if [ -d application/$$APPLICATION/source/class ]; then \
migrate_options="$${migrate_options} --class-path application/$$APPLICATION/source/class"; \
fi; \
done; \
$(CMD_GENERATOR) \
--migrate-source --migration-target `echo $(FRAMEWORK_VERSION) | cut -d'-' -f1` \
$${migrate_options}; \
fi;
################################################################################
# SKELETON TARGETS
################################################################################
SKELETON_TEMP_UNIX = temp-skeleton-unix
SKELETON_TEMP_DOS = temp-skeleton-dos
SKELETON_FILES = Makefile source/class source/resource source/index.html
info-skeleton-unix:
@echo
@echo "****************************************************************************"
@echo " GENERATING UNIX VERSION OF SKELETON"
@echo "****************************************************************************"
info-skeleton-dos:
@echo
@echo "****************************************************************************"
@echo " GENERATING DOS VERSION OF SKELETON"
@echo "****************************************************************************"
skeleton-unix: info-skeleton-unix exec-skeleton-unix exec-skeleton-unix-post exec-skeleton-unix-clean
skeleton-dos: info-skeleton-dos exec-skeleton-dos exec-skeleton-dos-post exec-skeleton-dos-clean
exec-skeleton-unix: exec-skeleton-unix-collect exec-skeleton-unix-archive
exec-skeleton-dos: exec-skeleton-dos-collect exec-skeleton-dos-archive
exec-skeleton-unix-collect:
@echo " * Collecting skeleton files..."
@for FILE in $(SKELETON_FILES); do \
echo " - $$FILE"; \
$(CMD_DIR) `dirname $(SKELETON_TEMP_UNIX)/skeleton/$$FILE`; \
$(CMD_SYNC_OFFLINE) application/skeleton/$$FILE `dirname $(SKELETON_TEMP_UNIX)/skeleton/$$FILE`; \
done
exec-skeleton-unix-archive:
@echo " * Cleaning up target folders..."
@$(CMD_FIND) $(SKELETON_TEMP_UNIX) $(FILES_TEMP) -exec $(CMD_REMOVE) {} \;
@echo " * Switching to Unix line endings..."
@$(CMD_FIND) $(SKELETON_TEMP_UNIX) $(FILES_TEXT) $(CMD_ANY2UNIX)
@echo " * Fixing executables..."
@$(CMD_FIND) $(SKELETON_TEMP_UNIX) $(FILES_EXEC) -exec $(CMD_MKEXEC) {} \;
@echo " * Building skeleton archive..."
@$(CMD_REMOVE) $(SKELETON_TEMP_UNIX)/skeleton.tar.gz
@cd $(SKELETON_TEMP_UNIX); $(CMD_TAR_CREATE) skeleton.tar.gz skeleton
@$(CMD_REMOVE) $(SKELETON_TEMP_UNIX)/skeleton
exec-skeleton-dos-collect:
@echo " * Collecting skeleton files..."
@for FILE in $(SKELETON_FILES); do \
echo " - $$FILE"; \
$(CMD_DIR) `dirname $(SKELETON_TEMP_DOS)/skeleton/$$FILE`; \
$(CMD_SYNC_OFFLINE) application/skeleton/$$FILE `dirname $(SKELETON_TEMP_DOS)/skeleton/$$FILE`; \
done
exec-skeleton-dos-archive:
@echo " * Cleaning up target folders..."
@$(CMD_FIND) $(SKELETON_TEMP_DOS) $(FILES_TEMP) -exec $(CMD_REMOVE) {} \;
@echo " * Switching to DOS line endings..."
@$(CMD_FIND) $(SKELETON_TEMP_DOS) $(FILES_TEXT) $(CMD_ANY2DOS)
@echo " * Fixing executables..."
@$(CMD_FIND) $(SKELETON_TEMP_DOS) $(FILES_EXEC) -exec $(CMD_MKEXEC) {} \;
@echo " * Building skeleton archive..."
@$(CMD_REMOVE) $(SKELETON_TEMP_DOS)/skeleton.zip
@cd $(SKELETON_TEMP_DOS); $(CMD_ZIP_CREATE) skeleton.zip skeleton
@$(CMD_REMOVE) $(SKELETON_TEMP_DOS)/skeleton
exec-skeleton-unix-post:
@$(CMD_SYNC_OFFLINE) $(SKELETON_TEMP_UNIX)/skeleton.tar.gz application/
@echo
@echo " * Created application/skeleton.tar.gz"
@echo " Please extract to a location outside this qooxdoo folder."
exec-skeleton-dos-post:
@$(CMD_SYNC_OFFLINE) $(SKELETON_TEMP_DOS)/skeleton.zip application/
@echo
@echo " * Created application/skeleton.zip"
@echo " Please extract to a location outside this qooxdoo folder."
exec-skeleton-unix-clean:
@$(CMD_REMOVE) $(SKELETON_TEMP_UNIX)
exec-skeleton-dos-clean:
@$(CMD_REMOVE) $(SKELETON_TEMP_DOS)
################################################################################
# RELEASE TARGETS
################################################################################
release-distclean:
@echo
@echo "****************************************************************************"
@echo " CLEANING UP RELEASE COMPLETELY"
@echo "****************************************************************************"
@echo " * Cleaning up..."
@$(CMD_REMOVE) release
release: release-sdk release-build
release-fast: release-build-fast release-sdk-fast
release-build: build release-build-fast
release-build-fast: release-build-info release-build-unix release-build-dos
release-build-info:
@echo
@echo "****************************************************************************"
@echo " GENERATING BUILD VERSION OF RELEASE $(FRAMEWORK_VERSION)"
@echo "****************************************************************************"
release-build-unix:
@echo
@echo " SYNCHRONISATION OF BUILD RELEASE (UNIX VERSION)"
@echo "----------------------------------------------------------------------------"
@echo " * Copying info files..."
@$(CMD_DIR) $(RELEASE_BUILD_UNIX)
@for FILE in `find ../ -maxdepth 1 -type f -name "[A-Z]*"`; do \
echo " - `basename $$FILE`"; \
cp -f $$FILE $(RELEASE_BUILD_UNIX); \
done
@echo " * Synchronizing applications..."
@for APPLICATION in $(APPLICATIONS); do \
echo " - $$APPLICATION"; \
$(CMD_DIR) $(RELEASE_BUILD_UNIX)/frontend/$$APPLICATION; \
if [ ! -r application/$$APPLICATION/build ]; then \
echo " - Missing build folder! Run $(MAKE) build first!"; \
exit 1; \
fi; \
$(CMD_SYNC_OFFLINE) application/$$APPLICATION/build/* $(RELEASE_BUILD_UNIX)/frontend/$$APPLICATION; \
done
@echo " * Generating index.html..."
@cat application/index.html | \
sed 's/class="source"/class="source hide"/g' | \
sed 's/class="build"//g' > $(RELEASE_BUILD_UNIX)/frontend/index.html
@echo " * Switching to Unix line endings..."
@$(CMD_FIND) $(RELEASE_BUILD_UNIX) $(FILES_TEXT) $(CMD_ANY2UNIX)
@echo " * Generating tar archive..."
@cd release/temp/build/unix; $(CMD_REMOVE) qooxdoo-$(FRAMEWORK_VERSION)-build.tar.gz; $(CMD_NICE) tar cfzp ../../../qooxdoo-$(FRAMEWORK_VERSION)-build.tar.gz qooxdoo-$(FRAMEWORK_VERSION)-build
release-build-dos:
@echo
@echo " SYNCHRONISATION OF BUILD RELEASE (DOS VERSION)"
@echo "----------------------------------------------------------------------------"
@echo " * Copying info files..."
@$(CMD_DIR) $(RELEASE_BUILD_DOS)
@for FILE in `find ../ -maxdepth 1 -type f -name "[A-Z]*"`; do \
echo " - `basename $$FILE`"; \
cp -f $$FILE $(RELEASE_BUILD_DOS); \
done
@echo " * Synchronizing applications..."
@for APPLICATION in $(APPLICATIONS); do \
echo " - $$APPLICATION"; \
$(CMD_DIR) $(RELEASE_BUILD_DOS)/frontend/$$APPLICATION; \
if [ ! -r application/$$APPLICATION/build ]; then \
echo " - Missing build folder! Run $(MAKE) build first!"; \
exit 1; \
fi; \
$(CMD_SYNC_OFFLINE) application/$$APPLICATION/build/* $(RELEASE_BUILD_DOS)/frontend/$$APPLICATION; \
done
@echo " * Generating index.html..."
@cat application/index.html | \
sed 's/class="source"/class="source hide"/g' | \
sed 's/class="build"//g' > $(RELEASE_BUILD_DOS)/frontend/index.html
@echo " * Switching to DOS line endings..."
@$(CMD_FIND) $(RELEASE_BUILD_DOS) $(FILES_TEXT) $(CMD_ANY2DOS)
@echo " * Generating zip archive..."
@cd release/temp/build/dos; $(CMD_REMOVE) qooxdoo-$(FRAMEWORK_VERSION)-build.zip; $(CMD_NICE) zip -rq ../../../qooxdoo-$(FRAMEWORK_VERSION)-build.zip qooxdoo-$(FRAMEWORK_VERSION)-build
release-sdk: distclean release-sdk-fast
release-sdk-fast: release-sdk-info release-sdk-unix release-sdk-dos
release-sdk-info:
@echo
@echo "****************************************************************************"
@echo " GENERATING SDK VERSION OF RELEASE $(FRAMEWORK_VERSION)"
@echo "****************************************************************************"
release-sdk-unix:
@echo
@echo " SYNCHRONISATION OF SDK RELEASE (UNIX VERSION)"
@echo "----------------------------------------------------------------------------"
@echo " * Copying info files..."
@$(CMD_DIR) $(RELEASE_SDK_UNIX)
@for FILE in `find ../ -maxdepth 1 -type f -name "[A-Z]*"`; do \
echo " - `basename $$FILE`"; \
cp -f $$FILE $(RELEASE_SDK_UNIX); \
done
@echo " * Synchronizing applications..."
@for APPLICATION in $(APPLICATIONS); do \
echo " - $$APPLICATION"; \
$(CMD_DIR) $(RELEASE_SDK_UNIX)/frontend/application/$$APPLICATION; \
$(CMD_SYNC_OFFLINE) --exclude script --exclude build --exclude publish application/$$APPLICATION/* $(RELEASE_SDK_UNIX)/frontend/application/$$APPLICATION; \
done
@echo " * Synchronizing framework..."
@$(CMD_DIR) $(RELEASE_SDK_UNIX)/frontend/framework
@$(CMD_SYNC_OFFLINE) --exclude .cache --exclude tool/icon/themes --exclude tool/icon/temp framework/* $(RELEASE_SDK_UNIX)/frontend/framework
@echo " * Copying remaining SDK files..."
@for ITEM in $(SDK_COPY); do \
cp -f $$ITEM $(RELEASE_SDK_UNIX)/frontend/$$ITEM; \
done
@$(MAKE) -s exec-skeleton-unix
@$(CMD_SYNC_OFFLINE) $(SKELETON_TEMP_UNIX)/skeleton.tar.gz $(RELEASE_SDK_UNIX)/frontend/application/
@$(MAKE) -s exec-skeleton-unix-clean
@echo " * Generating tar archive..."
@cd release/temp/sdk/unix; $(CMD_REMOVE) qooxdoo-$(FRAMEWORK_VERSION)-sdk.tar.gz; $(CMD_TAR_CREATE) ../../../qooxdoo-$(FRAMEWORK_VERSION)-sdk.tar.gz qooxdoo-$(FRAMEWORK_VERSION)-sdk
release-sdk-dos:
@echo
@echo " SYNCHRONISATION OF SDK RELEASE (DOS VERSION)"
@echo "----------------------------------------------------------------------------"
@echo " * Copying info files..."
@$(CMD_DIR) $(RELEASE_SDK_DOS)
@for FILE in `find ../ -maxdepth 1 -type f -name "[A-Z]*"`; do \
echo " - `basename $$FILE`"; \
cp -f $$FILE $(RELEASE_SDK_DOS); \
done
@echo " * Synchronizing applications..."
@for APPLICATION in $(APPLICATIONS); do \
echo " - $$APPLICATION"; \
$(CMD_DIR) $(RELEASE_SDK_DOS)/frontend/application/$$APPLICATION; \
$(CMD_SYNC_OFFLINE) --exclude script --exclude build --exclude publish application/$$APPLICATION/* $(RELEASE_SDK_DOS)/frontend/application/$$APPLICATION; \
done
@echo " * Synchronizing framework..."
@$(CMD_DIR) $(RELEASE_SDK_DOS)/frontend/framework
@$(CMD_SYNC_OFFLINE) --exclude .cache --exclude tool/icon/themes --exclude tool/icon/temp framework/* $(RELEASE_SDK_DOS)/frontend/framework
@echo " * Copying remaining SDK files..."
@for ITEM in $(SDK_COPY); do \
cp -f $$ITEM $(RELEASE_SDK_DOS)/frontend/$$ITEM; \
done
@$(MAKE) -s exec-skeleton-dos
@$(CMD_SYNC_OFFLINE) $(SKELETON_TEMP_DOS)/skeleton.zip $(RELEASE_SDK_DOS)/frontend/application/
@$(MAKE) -s exec-skeleton-dos-clean
@echo " * Generating zip archive..."
@cd release/temp/sdk/dos; $(CMD_REMOVE) qooxdoo-$(FRAMEWORK_VERSION)-sdk.zip; $(CMD_ZIP_CREATE) ../../../qooxdoo-$(FRAMEWORK_VERSION)-sdk.zip qooxdoo-$(FRAMEWORK_VERSION)-sdk

View File

@ -1,53 +0,0 @@
################################################################################
#
# qooxdoo - the new era of web development
#
# http://qooxdoo.org
#
# Copyright:
# 2006-2007 1&1 Internet AG, Germany, http://www.1and1.org
#
# License:
# LGPL: http://www.gnu.org/licenses/lgpl.html
# EPL: http://www.eclipse.org/org/documents/epl-v10.php
# See the LICENSE file in the project's top-level directory for details.
#
# Authors:
# * Sebastian Werner (wpbasti)
# * Andreas Ecker (ecker)
# * Fabian Jakobs (fjakobs)
#
################################################################################
APPLICATIONS = apiviewer feedreader sample showcase webmail
source:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION source || exit 1; done
build:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION build || exit 1; done
api:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION api || exit 1; done
all:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION all || exit 1; done
publish:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION publish || exit 1; done
fix:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION fix || exit 1; done
pretty:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION pretty || exit 1; done
clean:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION clean || exit 1; done
distclean:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION distclean || exit 1; done
locales:
@for APPLICATION in $(APPLICATIONS); do $(MAKE) -s -C $$APPLICATION locales || exit 1; done

View File

@ -1,120 +0,0 @@
################################################################################
#
# qooxdoo - the new era of web development
#
# http://qooxdoo.org
#
# Copyright:
# 2006-2007 1&1 Internet AG, Germany, http://www.1and1.org
#
# License:
# LGPL: http://www.gnu.org/licenses/lgpl.html
# EPL: http://www.eclipse.org/org/documents/epl-v10.php
# See the LICENSE file in the project's top-level directory for details.
#
# Authors:
# * Sebastian Werner (wpbasti)
# * Andreas Ecker (ecker)
# * Fabian Jakobs (fjakobs)
#
################################################################################
################################################################################
# BASIC SETTINGS
################################################################################
#
# Location of your qooxdoo distribution
# Could be relative from this location or absolute
#
QOOXDOO_PATH = ../../..
#
# The same as above, but from the webserver point of view
# Starting point is the application HTML file of the source folder.
# In most cases just add a "/.." compared to above
#
QOOXDOO_URI = ../../../..
#
# Namespace of your application e.g. custom
#
APPLICATION_NAMESPACE = apiviewer
#
# Titles used in your API viewer and during the build process
#
APPLICATION_MAKE_TITLE = APIVIEWER
APPLICATION_API_TITLE = ApiViewer
#
# Additional files (space separated list)
#
APPLICATION_FILES = index.html
################################################################################
# ADVANCED SETTINGS
################################################################################
#
# Enable resource filtering in API viewer
#
APPLICATION_RESOURCE_FILTER = true
#
# We don't need the full source code
#
APPLICATION_COMPLETE_SOURCE = false
#
# Disable line breaks
#
APPLICATION_LINEBREAKS_BUILD = false
APPLICATION_LINEBREAKS_SOURCE = false
#
# qooxdoo.org sync
#
APPLICATION_PUBLISH_PATH = root@qooxdoo.org:/var/www/qooxdoo/api/$(FRAMEWORK_VERSION)
################################################################################
# INCLUDE CORE
################################################################################
ifneq ($(QOOXDOO_PATH),PLEASE_DEFINE_QOOXDOO_PATH)
include $(QOOXDOO_PATH)/frontend/framework/tool/make/targets.mk
include $(QOOXDOO_PATH)/frontend/framework/tool/make/application.mk
endif
error:
@echo " * Please configure QOOXDOO_PATH"
################################################################################
# EXTENSIONS
################################################################################
source:
@$(CMD_GENERATOR) \
--generate-api-documentation \
--api-documentation-json-file $(APPLICATION_PATH)/source/script/apidata.js \
--class-path $(FRAMEWORK_SOURCE_PATH)/class
build:
@$(CMD_GENERATOR) \
--generate-api-documentation \
--api-documentation-json-file $(APPLICATION_PATH)/build/script/apidata.js \
--class-path $(FRAMEWORK_SOURCE_PATH)/class

View File

@ -1,75 +0,0 @@
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the LICENSE file in the project's top-level directory for details.
Authors:
* Til Schneider (til132)
* Sebastian Werner (wpbasti)
* Andreas Ecker (ecker)
* Fabian Jakobs (fjakobs)
************************************************************************ */
/* ************************************************************************
#module(apiviewer)
#resource(css:css)
#resource(image:image)
#embed(apiviewer.css/*)
************************************************************************ */
/**
* Your custom application
*/
qx.OO.defineClass("apiviewer.Application", qx.component.AbstractApplication,
function () {
qx.component.AbstractApplication.call(this);
});
qx.Settings.setDefault("resourceUri", "./resource");
/*
---------------------------------------------------------------------------
METHODS
---------------------------------------------------------------------------
*/
qx.Proto.initialize = function(e)
{
// Define alias for custom resource path
qx.manager.object.AliasManager.getInstance().add("api", qx.Settings.getValueOfClass("apiviewer.Application", "resourceUri"));
// Reduce log level
qx.log.Logger.ROOT_LOGGER.setMinLevel(qx.log.Logger.LEVEL_WARN);
// Include CSS file
qx.html.StyleSheet.includeFile(qx.manager.object.AliasManager.getInstance().resolvePath("api/css/apiviewer.css"));
};
qx.Proto.main = function(e)
{
// Initialize the viewer
this.viewer = new apiviewer.Viewer;
this.viewer.addToDocument();
};
qx.Proto.finalize = function(e)
{
// Finally load the data
this.viewer.load("script/apidata.js");
};

View File

@ -1,59 +0,0 @@
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the LICENSE file in the project's top-level directory for details.
Authors:
* Til Schneider (til132)
* Sebastian Werner (wpbasti)
* Andreas Ecker (ecker)
* Fabian Jakobs (fjakobs)
************************************************************************ */
/* ************************************************************************
#module(apiviewer)
************************************************************************ */
/**
* Shows the class details.
*/
qx.OO.defineClass("apiviewer.InfoViewer", qx.ui.embed.HtmlEmbed,
function() {
qx.ui.embed.HtmlEmbed.call(this);
this.setOverflow("auto");
this.setPadding(20);
this.setEdge(0);
this.setHtmlProperty("id", "InfoViewer");
this.setVisibility(false);
apiviewer.InfoViewer.instance = this;
});
qx.Proto.showInfo = function(classNode)
{
var vHtml = "";
// Title
vHtml += '<h1>';
vHtml += '<div class="pkgtitle">package</div>';
vHtml += classNode.attributes.fullName;
vHtml += '</h1>';
// TODO: Overview of classes in this package
// Apply HTML
this.setHtml(vHtml);
}

View File

@ -1,382 +0,0 @@
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the LICENSE file in the project's top-level directory for details.
Authors:
* Til Schneider (til132)
* Sebastian Werner (wpbasti)
* Andreas Ecker (ecker)
* Fabian Jakobs (fjakobs)
************************************************************************ */
/* ************************************************************************
#module(apiviewer)
#embed(apiviewer.image/*)
************************************************************************ */
/**
* A util class for handling the documentation tree.
*/
qx.OO.defineClass("apiviewer.TreeUtil", qx.core.Object,
function () {
qx.core.Object.call(this);
});
/**
* Gets the child of a doc node having a certain type.
*
* @param docNode {Map} the doc node to get the child of.
* @param childType {String} the type of the child to get.
* @return {Map} the wanted child or <code>null</code> if <code>docNode</code>
* is <code>null</code> or has no such child.
*/
qx.Class.getChild = function(docNode, childType) {
if (docNode != null && docNode.children != null) {
for (var i = 0; i < docNode.children.length; i++) {
if (docNode.children[i].type == childType) {
return docNode.children[i];
}
}
}
return null;
}
/**
* Gets the child of a doc node having a certain attribute value.
*
* @param docNode {Map} the doc node to get the child of.
* @param attributeName {String} the name of the attribute the wanted child must have.
* @param attributeValue {String} the value of the attribute the wanted child must have.
* @return {Map} the wanted child or <code>code</code> if there is no such child.
*/
qx.Class.getChildByAttribute = function(docNode, attributeName, attributeValue) {
if (docNode.children != null) {
for (var i = 0; i < docNode.children.length; i++) {
var node = docNode.children[i];
if (node.attributes && node.attributes[attributeName] == attributeValue) {
return node;
}
}
}
return null;
}
/**
* Searches the doc node of a item. Only use this method if you don't know the
* type of the item.
*
* @param classNode {Map} the class node the item belongs to.
* @param itemName {String} the name of the item to search.
* @return {Map} the doc node of the item or <code>null</code> if the class has
* no such item.
*/
qx.Class.getItemDocNode = function(classNode, itemName) {
var TreeUtil = apiviewer.TreeUtil;
// Go through the item lists and check whether one contains the wanted item
for (var i = 0; i < TreeUtil.ITEM_LIST_ARR.length; i++) {
var listNode = TreeUtil.getChild(classNode, TreeUtil.ITEM_LIST_ARR[i]);
if (listNode) {
var itemNode = TreeUtil.getChildByAttribute(listNode, "name", itemName);
if (itemNode) {
return itemNode;
}
}
}
// Nothing found
return null;
}
/**
* Gets the doc node of a class.
*
* @param docTree {Map} the documentation tree.
* @param className {String} the name of the class.
* @return {Map} the doc node of the class.
*/
qx.Class.getClassDocNode = function(docTree, className) {
var splits = className.split(".");
var currNode = docTree;
for (var i = 0; i < splits.length && currNode != null; i++) {
if (i < splits.length - 1) {
// The current name is a package name
var packages = this.getChild(currNode, "packages");
currNode = packages ? this.getChildByAttribute(packages, "name", splits[i]) : null;
} else {
// The current name is a class name
var classes = this.getChild(currNode, "classes");
currNode = classes ? this.getChildByAttribute(classes, "name", splits[i]) : null;
}
}
return currNode;
}
/**
* Gets the icon URL of a doc node.
*
* @param node {Map} the node to get the icon for.
* @param inherited {Boolean,false} whether the node was inherited.
* @return {var} the URL of the icon. May be a string or an array of string
* (in case of an overlay icon).
*/
qx.Class.getIconUrl = function(node, inherited, context) {
var constName;
switch (node.type) {
case "package":
constName = "ICON_PACKAGE";
break;
case "class":
constName = "ICON_CLASS";
if (node.attributes.isStatic) {
constName += "_STATIC";
} else if (node.attributes.isAbstract) {
constName += "_ABSTRACT";
}
break;
case "property":
constName = "ICON_PROPERTY";
break;
case "event":
constName = "ICON_EVENT";
break;
case "method":
var isCtor = node.attributes.name == null;
var isPublic = isCtor || (node.attributes.name.charAt(0) != "_");
constName = "ICON_METHOD" + (isPublic ? "_PUB" : "_PROT");
if (isCtor) {
constName += "_CTOR";
} else if (node.attributes.isStatic) {
constName += "_STATIC";
} else if (node.attributes.isAbstract) {
constName += "_ABSTRACT";
}
break;
case "constant":
constName = "ICON_CONSTANT";
break;
default: throw new Error("Unknown node type: " + node.type);
}
if (inherited) {
constName += "_INHERITED";
} else if (node.attributes.overriddenFrom) {
constName += "_OVERRIDDEN";
}
if (node.attributes.hasError) {
constName += "_ERROR";
} else if (node.attributes.hasWarning) {
constName += "_WARN";
}
var iconUrl = apiviewer.TreeUtil[constName];
if (iconUrl == null) {
throw new Error("Unknown img constant: " + constName);
}
return iconUrl;
}
/** {string[]} The names of lists containing items. */
qx.Class.ITEM_LIST_ARR = [ "constants", "properties", "methods-pub", "methods-pub",
"methods-static-prot", "methods-static-prot" ];
/** {string} The URL of the overlay "abstract". */
qx.Class.OVERLAY_ABSTRACT = "api/image/overlay_abstract18.gif";
/** {string} The URL of the overlay "error". */
qx.Class.OVERLAY_ERROR = "api/image/overlay_error18.gif";
/** {string} The URL of the overlay "inherited". */
qx.Class.OVERLAY_INHERITED = "api/image/overlay_inherited18.gif";
/** {string} The URL of the overlay "overridden". */
qx.Class.OVERLAY_OVERRIDDEN = "api/image/overlay_overridden18.gif";
/** {string} The URL of the overlay "static". */
qx.Class.OVERLAY_STATIC = "api/image/overlay_static18.gif";
/** {string} The URL of the overlay "warning". */
qx.Class.OVERLAY_WARN = "api/image/overlay_warning18.gif";
/** {string} The icon URL of a package. */
qx.Class.ICON_PACKAGE = "api/image/package18.gif";
/** {string} The icon URL of a package with warning. */
qx.Class.ICON_PACKAGE_WARN = "api/image/package_warning18.gif";
/** {string} The icon URL of a class. */
qx.Class.ICON_CLASS = "api/image/class18.gif";
/** {string} The icon URL of a class with warning. */
qx.Class.ICON_CLASS_WARN = "api/image/class_warning18.gif";
/** {string} The icon URL of a class with error. */
qx.Class.ICON_CLASS_ERROR = "api/image/class_warning18.gif";
/** {string} The icon URL of a static class. */
qx.Class.ICON_CLASS_STATIC = "api/image/class_static18.gif";
/** {string} The icon URL of a static class with warning. */
qx.Class.ICON_CLASS_STATIC_WARN = "api/image/class_static_warning18.gif";
/** {string} The icon URL of a static class with error. */
qx.Class.ICON_CLASS_STATIC_ERROR = "api/image/class_static_warning18.gif";
/** {string} The icon URL of an abstract class. */
qx.Class.ICON_CLASS_ABSTRACT = "api/image/class_abstract18.gif";
/** {string} The icon URL of an abstract class with warning. */
qx.Class.ICON_CLASS_ABSTRACT_WARN = "api/image/class_abstract_warning18.gif";
/** {string} The icon URL of an abstract class with error. */
qx.Class.ICON_CLASS_ABSTRACT_ERROR = "api/image/class_abstract_warning18.gif";
/** {string} The icon URL of a property. */
qx.Class.ICON_PROPERTY = "api/image/property18.gif";
/** {string[]} The icon URL of a property with warning. */
qx.Class.ICON_PROPERTY_WARN = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of a property with error. */
qx.Class.ICON_PROPERTY_ERROR = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an inherited property. */
qx.Class.ICON_PROPERTY_INHERITED = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_INHERITED ];
/** {string[]} The icon URL of an inherited property with warning. */
qx.Class.ICON_PROPERTY_INHERITED_WARN = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an inherited property with error. */
qx.Class.ICON_PROPERTY_INHERITED_ERROR = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an overridden property. */
qx.Class.ICON_PROPERTY_OVERRIDDEN = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_OVERRIDDEN ];
/** {string[]} The icon URL of an overridden property with warning. */
qx.Class.ICON_PROPERTY_OVERRIDDEN_WARN = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an overridden property with error. */
qx.Class.ICON_PROPERTY_OVERRIDDEN_ERROR = [ qx.Class.ICON_PROPERTY, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_ERROR ];
/** {string} The icon URL of an event. */
qx.Class.ICON_EVENT = "api/image/event18.gif";
/** {string[]} The icon URL of an inherited event. */
qx.Class.ICON_EVENT_INHERITED = [ qx.Class.ICON_EVENT, qx.Class.OVERLAY_INHERITED ];
/** {string} The icon URL of a public method. */
qx.Class.ICON_METHOD_PUB = "api/image/method_public18.gif";
/** {string[]} The icon URL of a public method with warning. */
qx.Class.ICON_METHOD_PUB_WARN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of a public method with error. */
qx.Class.ICON_METHOD_PUB_ERROR = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an inherited public method. */
qx.Class.ICON_METHOD_PUB_INHERITED = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_INHERITED ];
/** {string[]} The icon URL of an inherited public method with warning. */
qx.Class.ICON_METHOD_PUB_INHERITED_WARN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an inherited public method with error. */
qx.Class.ICON_METHOD_PUB_INHERITED_ERROR = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an overridden public method. */
qx.Class.ICON_METHOD_PUB_OVERRIDDEN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_OVERRIDDEN ];
/** {string[]} The icon URL of an overridden public method with warning. */
qx.Class.ICON_METHOD_PUB_OVERRIDDEN_WARN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an overridden public method with error. */
qx.Class.ICON_METHOD_PUB_OVERRIDDEN_ERROR = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of a public static method. */
qx.Class.ICON_METHOD_PUB_STATIC = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_STATIC ];
/** {string[]} The icon URL of a public static method with error. */
qx.Class.ICON_METHOD_PUB_STATIC_ERROR = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_STATIC, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of a public abstract method. */
qx.Class.ICON_METHOD_PUB_ABSTRACT = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT ];
/** {string[]} The icon URL of a public abstract method with warning. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_WARN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of a public abstract method with error. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_ERROR = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an overridden public abstract method. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_OVERRIDDEN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_OVERRIDDEN ];
/** {string[]} The icon URL of an overridden public abstract method with warning. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_OVERRIDDEN_WARN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an overridden public abstract method with error. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_OVERRIDDEN_ERROR = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an inherited public abstract method. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_INHERITED = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_INHERITED ];
/** {string[]} The icon URL of an inherited public abstract method with warning. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_INHERITED_WARN = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an inherited public abstract method with error. */
qx.Class.ICON_METHOD_PUB_ABSTRACT_INHERITED_ERROR = [ qx.Class.ICON_METHOD_PUB, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_ERROR ];
/** {string} The icon URL of a constructor. */
qx.Class.ICON_METHOD_PUB_CTOR = "api/image/constructor18.gif";
/** {string[]} The icon URL of a constructor with error. */
qx.Class.ICON_METHOD_PUB_CTOR_ERROR = [ qx.Class.ICON_METHOD_PUB_CTOR, qx.Class.OVERLAY_ERROR ];
/** {string} The icon URL of a protected method. */
qx.Class.ICON_METHOD_PROT = "api/image/method_protected18.gif";
/** {string[]} The icon URL of a protected method with warning. */
qx.Class.ICON_METHOD_PROT_WARN = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of a protected method with error. */
qx.Class.ICON_METHOD_PROT_ERROR = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an inherited protected method. */
qx.Class.ICON_METHOD_PROT_INHERITED = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_INHERITED ];
/** {string[]} The icon URL of an inherited protected method with warning. */
qx.Class.ICON_METHOD_PROT_INHERITED_WARN = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an inherited protected method with error. */
qx.Class.ICON_METHOD_PROT_INHERITED_ERROR = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an overridden protected method. */
qx.Class.ICON_METHOD_PROT_OVERRIDDEN = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_OVERRIDDEN ];
/** {string[]} The icon URL of an overridden protected method with warning. */
qx.Class.ICON_METHOD_PROT_OVERRIDDEN_WARN = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an overridden protected method with error. */
qx.Class.ICON_METHOD_PROT_OVERRIDDEN_ERROR = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_OVERRIDDEN, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of a protected static method. */
qx.Class.ICON_METHOD_PROT_STATIC = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_STATIC ];
/** {string[]} The icon URL of a protected static method with error. */
qx.Class.ICON_METHOD_PROT_STATIC_ERROR = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_STATIC, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an abstract protected method. */
qx.Class.ICON_METHOD_PROT_ABSTRACT = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ABSTRACT ];
/** {string[]} The icon URL of an abstract protected method with warning. */
qx.Class.ICON_METHOD_PROT_ABSTRACT_WARN = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an abstract protected method with error. */
qx.Class.ICON_METHOD_PROT_ABSTRACT_ERROR = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_ERROR ];
/** {string[]} The icon URL of an inherited abstract protected method. */
qx.Class.ICON_METHOD_PROT_ABSTRACT_INHERITED = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_INHERITED ];
/** {string[]} The icon URL of an inherited abstract protected method with warning. */
qx.Class.ICON_METHOD_PROT_ABSTRACT_INHERITED_WARN = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_WARN ];
/** {string[]} The icon URL of an inherited abstract protected method with error. */
qx.Class.ICON_METHOD_PROT_ABSTRACT_INHERITED_ERROR = [ qx.Class.ICON_METHOD_PROT, qx.Class.OVERLAY_ABSTRACT, qx.Class.OVERLAY_INHERITED, qx.Class.OVERLAY_ERROR ];
/** {string} The icon URL of a constant. */
qx.Class.ICON_CONSTANT = "api/image/constant18.gif";
/** {string[]} The icon URL of a constant with error. */
qx.Class.ICON_CONSTANT_ERROR = [ qx.Class.ICON_CONSTANT, qx.Class.OVERLAY_ERROR ];

View File

@ -1,433 +0,0 @@
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the LICENSE file in the project's top-level directory for details.
Authors:
* Til Schneider (til132)
* Sebastian Werner (wpbasti)
* Andreas Ecker (ecker)
* Fabian Jakobs (fjakobs)
************************************************************************ */
/* ************************************************************************
#module(apiviewer)
#resource(css:css)
#resource(image:image)
************************************************************************ */
/**
* The API viewer. Shows the API documentation.
*/
qx.OO.defineClass("apiviewer.Viewer", qx.ui.layout.DockLayout,
function () {
qx.ui.layout.DockLayout.call(this);
this.setEdge(0);
this._titlePrefix = this.getSetting("title") + " API Documentation";
document.title = this._titlePrefix;
// create header
var header = new qx.ui.embed.HtmlEmbed(
"<h1>" +
"<span>" + this.getSetting("title") + "</span>"+
" API Documentation"+
"</h1>" +
"<div id='qxversion'>qooxdoo " + qx.core.Version.toString() + "</div>"
);
header.setHtmlProperty("id", "header");
header.setStyleProperty("background", "#134275 url(" + qx.manager.object.AliasManager.getInstance().resolvePath("api/image/colorstrip.gif") + ") top left repeat-x");
header.setHeight(70);
this.addTop(header);
this._tree = new qx.ui.tree.Tree("API Documentation");
this._tree.set({
backgroundColor: "white",
overflow: "scroll",
width: "100%",
height: "100%",
border: qx.renderer.border.BorderPresets.getInstance().inset,
paddingLeft: 5,
paddingTop: 3
});
this._tree.getManager().addEventListener("changeSelection", this._onTreeSelectionChange, this);
this._detailFrame = new qx.ui.layout.CanvasLayout;
this._detailFrame.set({
width: "100%",
height: "100%",
backgroundColor: "white",
border: qx.renderer.border.BorderPresets.getInstance().inset
});
this._detailFrame.setHtmlProperty("id", "DetailFrame");
// create vertival splitter
var mainSplitPane = new qx.ui.splitpane.HorizontalSplitPane(250, "1*");
mainSplitPane.setLiveResize(true);
mainSplitPane.addLeft(this._tree);
mainSplitPane.addRight(this._detailFrame);
this.add(mainSplitPane);
this._detailLoader = new qx.ui.embed.HtmlEmbed('<h1><div class="please">please wait</div>Loading data...</h1>');
this._detailLoader.setHtmlProperty("id", "DetailLoader");
this._detailLoader.setMarginLeft(20);
this._detailLoader.setMarginTop(20);
this._detailFrame.add(this._detailLoader);
this._classViewer = new apiviewer.ClassViewer;
this._detailFrame.add(this._classViewer);
this._infoViewer = new apiviewer.InfoViewer;
this._detailFrame.add(this._infoViewer);
this._currentTreeType = apiviewer.Viewer.PACKAGE_TREE;
// Workaround: Since navigating in qx.ui.tree.Tree doesn't work, we've to
// maintain a hash that keeps the tree nodes for class names
this._classTreeNodeHash = {};
this._classTreeNodeHash[apiviewer.Viewer.PACKAGE_TREE] = {};
this._classTreeNodeHash[apiviewer.Viewer.INHERITENCE_TREE] = {};
apiviewer.Viewer.instance = this;
qx.client.History.getInstance().init();
qx.client.History.getInstance().addEventListener("request", this._onHistoryRequest, this);
});
/** The documentation tree to show. */
qx.OO.addProperty({ name:"docTree", type:"object" });
qx.Settings.setDefault("title", "qooxdoo");
qx.Settings.setDefault("initialTreeDepth", 1);
// property checker
qx.Proto._modifyDocTree = function(propValue, propOldValue, propData) {
this._updateTree(propValue);
return true;
}
/**
* Loads the API doc tree from a URL. The URL must point to a JSON encoded
* doc tree.
*
* @param url {String} the URL.
*/
qx.Proto.load = function(url)
{
var req = new qx.io.remote.Request(url);
req.setTimeout(180000);
req.addEventListener("completed", function(evt)
{
var content = evt.getData().getContent();
this.setDocTree(eval("(" + content + ")"));
qx.ui.core.Widget.flushGlobalQueues();
// Handle bookmarks
if (window.location.hash) {
var self = this;
window.setTimeout(function() {
self.selectItem(window.location.hash.substring(1));
}, 0);
}
this._detailLoader.setHtml('<h1><div class="please">' + this.getSetting("title") +
'</div>API Documentation</h1>');
}, this);
req.addEventListener("failed", function(evt)
{
this.error("Couldn't load file: " + url);
}, this);
req.send();
}
/**
* Updates the tree on the left.
*
* @param docTree {Map} the documentation tree to use for updating.
*/
qx.Proto._updateTree = function(docTree) {
var inheritenceNode = new qx.ui.tree.TreeFolder("Inheritence hierarchy");
var packagesNode = new qx.ui.tree.TreeFolder("Packages");
this._tree.removeAll();
this._tree.add(inheritenceNode, packagesNode);
// Fille the packages tree (and fill the _topLevelClassNodeArr)
this._topLevelClassNodeArr = [];
this._fillPackageNode(packagesNode, docTree, 0);
// Sort the _topLevelClassNodeArr
this._topLevelClassNodeArr.sort(function (node1, node2) {
return (node1.attributes.fullName < node2.attributes.fullName) ? -1 : 1;
});
// Fill the inheritence tree
for (var i = 0; i < this._topLevelClassNodeArr.length; i++) {
this._createInheritanceNode(inheritenceNode, this._topLevelClassNodeArr[i], docTree);
}
packagesNode.open();
if (this._wantedClassName) {
this.showClassByName(this._wantedClassName);
this._wantedClassName = null;
}
}
/**
* Fills a package tree node with tree nodes for the sub packages and classes.
*
* @param treeNode {qx.ui.tree.TreeFolder} the package tree node.
* @param docNode {Map} the documentation node of the package.
*/
qx.Proto._fillPackageNode = function(treeNode, docNode, depth) {
var ApiViewer = apiviewer.Viewer;
var TreeUtil = apiviewer.TreeUtil;
var packagesDocNode = TreeUtil.getChild(docNode, "packages");
if (packagesDocNode && packagesDocNode.children) {
for (var i = 0; i < packagesDocNode.children.length; i++) {
var packageDocNode = packagesDocNode.children[i];
var iconUrl = TreeUtil.getIconUrl(packageDocNode);
var packageTreeNode = new qx.ui.tree.TreeFolder(packageDocNode.attributes.name, iconUrl);
packageTreeNode.docNode = packageDocNode;
treeNode.add(packageTreeNode);
this._fillPackageNode(packageTreeNode, packageDocNode, depth+1);
// Open the package node if it has child packages
if (depth < this.getSetting("initialTreeDepth") && TreeUtil.getChild(packageDocNode, "packages")) {
packageTreeNode.open();
}
// Register the tree node
this._classTreeNodeHash[ApiViewer.PACKAGE_TREE][packageDocNode.attributes.fullName] = packageTreeNode;
}
}
var classesDocNode = TreeUtil.getChild(docNode, "classes");
if (classesDocNode && classesDocNode.children) {
for (var i = 0; i < classesDocNode.children.length; i++) {
var classDocNode = classesDocNode.children[i];
var iconUrl = TreeUtil.getIconUrl(classDocNode);
var classTreeNode = new qx.ui.tree.TreeFolder(classDocNode.attributes.name, iconUrl);
classTreeNode.docNode = classDocNode;
classTreeNode.treeType = ApiViewer.PACKAGE_TREE;
treeNode.add(classTreeNode);
// Register the tree node
this._classTreeNodeHash[ApiViewer.PACKAGE_TREE][classDocNode.attributes.fullName] = classTreeNode;
// Check whether this is a top-level-class
if (classDocNode.attributes.superClass == null) {
this._topLevelClassNodeArr.push(classDocNode);
}
}
}
}
/**
* Creates the tree node for a class containing class nodes for all its child
* classes.
*
* @param classDocNode {Map} the documentation node of the class.
* @param docTree {Map} the documentation tree.
*/
qx.Proto._createInheritanceNode = function(parentTreeNode, classDocNode, docTree) {
var ApiViewer = apiviewer.Viewer;
var TreeUtil = apiviewer.TreeUtil;
// Create the tree node
var iconUrl = TreeUtil.getIconUrl(classDocNode);
var classTreeNode = new qx.ui.tree.TreeFolder(classDocNode.attributes.fullName, iconUrl);
classTreeNode.docNode = classDocNode;
classTreeNode.treeType = ApiViewer.INHERITENCE_TREE;
parentTreeNode.add(classTreeNode);
// Register the tree node
this._classTreeNodeHash[ApiViewer.INHERITENCE_TREE][classDocNode.attributes.fullName] = classTreeNode;
// Add all child classes
var childClassNameCsv = classDocNode.attributes.childClasses;
if (childClassNameCsv) {
var childClassNameArr = childClassNameCsv.split(",");
for (var i = 0; i < childClassNameArr.length; i++) {
var childClassDocNode = TreeUtil.getClassDocNode(docTree, childClassNameArr[i]);
this._createInheritanceNode(classTreeNode, childClassDocNode, docTree);
}
}
}
/**
* Event handler. Called when the tree selection has changed.
*
* @param evt {Map} the event.
*/
qx.Proto._onTreeSelectionChange = function(evt)
{
var treeNode = evt.getData()[0];
if (treeNode && treeNode.docNode)
{
var newTitle = this._titlePrefix + " - class " + treeNode.docNode.attributes.fullName;
qx.client.History.getInstance().addToHistory(treeNode.docNode.attributes.fullName, newTitle);
this._currentTreeType = treeNode.treeType;
this._selectTreeNode(treeNode);
window.location.hash = "#" + treeNode.docNode.attributes.fullName;
}
}
qx.Proto._onHistoryRequest = function(evt)
{
this.showClassByName(evt.getData());
}
qx.Proto._selectTreeNode = function(vTreeNode)
{
if (!(vTreeNode && vTreeNode.docNode)) {
this.error("Invalid tree node: " + vTreeNode);
}
var vDoc = vTreeNode.docNode;
this._detailLoader.setVisibility(false);
if (vDoc.type == "class")
{
this._infoViewer.setVisibility(false);
this._classViewer.showClass(vDoc);
this._classViewer.setVisibility(true);
}
else
{
this._classViewer.setVisibility(false);
this._infoViewer.showInfo(vDoc);
this._infoViewer.setVisibility(true);
}
}
/**
* Selects an item (class, property, method or constant).
*
* @param fullItemName {String} the full name of the item to select.
* (e.g. "qx.mypackage.MyClass" or "qx.mypackage.MyClass#myProperty")
*/
qx.Proto.selectItem = function(fullItemName) {
var className = fullItemName;
var itemName = null;
var hashPos = fullItemName.indexOf("#");
if (hashPos != -1) {
className = fullItemName.substring(0, hashPos);
itemName = fullItemName.substring(hashPos + 1);
var parenPos = itemName.indexOf("(");
if (parenPos != -1) {
itemName = qx.lang.String.trim(itemName.substring(0, parenPos));
}
}
this.showClassByName(className);
if (itemName) {
this._classViewer.showItem(itemName);
}
}
/**
* Shows a certain class.
*
* @param className {String} the name of the class to show.
*/
qx.Proto.showClassByName = function(className) {
var treeNode = this._classTreeNodeHash[this._currentTreeType][className];
if (treeNode) {
treeNode.setSelected(true);
} else if (this.getDocTree() == null) {
// The doc tree has not been loaded yet
// -> Remeber the wanted class and show when loading is done
this._wantedClassName = className;
} else {
this.error("Unknown class: " + className);
}
}
qx.Class.PACKAGE_TREE = 1;
qx.Class.INHERITENCE_TREE = 2;
qx.Proto.dispose = function()
{
if (this.getDisposed()) {
return;
}
if (this._tree)
{
this._tree.dispose();
this._tree = null;
}
if (this._detailFrame)
{
this._detailFrame.dispose();
this._detailFrame = null;
}
if (this._detailLoader)
{
this._detailLoader.dispose();
this._detailLoader = null;
}
if (this._classViewer)
{
this._classViewer.dispose();
this._classViewer = null;
}
if (this._infoViewer)
{
this._infoViewer.dispose();
this._infoViewer = null;
}
this._classTreeNodeHash = null;
return qx.ui.layout.HorizontalBoxLayout.prototype.dispose.call(this);
}

View File

@ -1,15 +0,0 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>API Documentation</title>
<script type="text/javascript" src="script/apiviewer.js"></script>
</head>
<body>
<script type="text/javascript">
if (!qx.IS_SOURCE) {
qx.log.Logger.ROOT_LOGGER.setMinLevel(qx.log.Logger.LEVEL_ERROR);
}
qx.core.Init.getInstance().setApplication(apiviewer.Application);
</script>
</body>
</html>

View File

@ -1,320 +0,0 @@
#header {
margin: 0px;
padding: 0px;
background-color: #134275;
font-family: "Trebuchet MS", "Lucida Grande", Verdana, sans-serif;
}
#header h1 {
font-size: 18px;
font-weight: bold;
color: #DEFF83;
position: absolute;
top: 30px;
left: 20px;
margin: 0;
padding: 0;
}
#qxversion {
font-size: 11px;
text-transform: lowercase;
color: #F3FFD1;
margin-top: -14px;
letter-spacing: 1px;
word-spacing: 4px;
position: absolute;
bottom: 20px;
right: 20px;
margin: 0;
padding: 0;
}
#DetailFrame,
#DetailFrame td,
#DetailFrame th{
font-family: Verdana, "Lucida Grande", "Bitstream Vera Sans", Tahoma, "Lucida Sans Unicode", Arial, sans-serif;
font-size: 11px;
line-height: 150%;
}
#DetailFrame h1,
#DetailFrame h2,
#DetailFrame h3,
#DetailFrame h4,
#DetailFrame h5,
#DetailFrame h6{
font-family: "Trebuchet MS", "Lucida Grande", Verdana, sans-serif;
color: #134275;
}
#DetailFrame *{
margin-top: 0;
margin-bottom: 0;
padding-top: 0;
padding-bottom: 0;
}
#DetailFrame #ControlFrame{
position: absolute;
top: 20px;
right: 20px;
font-size: 10px;
background: #FBFFEF;
padding: 4px 6px;
border: 1px solid #ECECEC;
}
#DetailFrame h1 {
font-size: 24px;
margin-bottom: 20px;
}
#DetailFrame h2 {
font-size: 18px;
margin-bottom: 4px;
}
#DetailFrame h3 {
font-size: 14px;
}
#DetailFrame img {
border: 0 none;
vertical-align: middle;
}
#DetailFrame a:link,
#DetailFrame a:visited{
color: #134275;
}
#DetailFrame a:hover,
#DetailFrame a:active{
color: #134275;
text-decoration: underline;
}
#DetailFrame td{
vertical-align: top;
padding: 2px;
}
#DetailLoader div.please{
font-size: 14px;
font-weight: normal;
margin-bottom: 4px;
}
#InfoViewer div.pkgtitle{
font-size: 14px;
font-weight: normal;
margin-bottom: 4px;
}
#ClassViewer div.classDescription{
font-size: 12px;
background: #F3FFD1;
border: 1px solid #F3FFD1;
-moz-border-radius: 5px;
padding: 12px;
padding-top: 4px;
padding-bottom: 4px;
width: 650px;
overflow: auto;
}
#ClassViewer div.classDescription p{
margin-top: 5px;
margin-bottom: 5px;
}
#ClassViewer div.packageName{
font-size: 14px;
font-weight: normal;
margin-bottom: 4px;
}
#ClassViewer span.typeInfo{
color: #83B300;
font-weight: normal;
}
#ClassViewer div.infoPanel {
margin-top: 30px;
}
#ClassViewer div.infoPanel h2{
cursor: default;
}
#ClassViewer table.info {
table-layout: fixed;
}
#ClassViewer table.info tr {
background: #FBFFEF;
}
#ClassViewer table.info tr.marked {
background: #DEFF83;
}
#ClassViewer table.info tr td,
#ClassViewer div.empty-info-body {
border-top: 1px solid #ECECEC;
}
#ClassViewer table.info tr td{
overflow: hidden;
}
#ClassViewer table.info tr td td{
border-top: 0 none;
padding: 0;
}
#ClassViewer table.info td.icon{
text-align: center;
width: 20px;
}
#ClassViewer table.info td.type{
width: 100px;
font-size: 12px;
color: #83B300;
font-weight: bold;
}
#ClassViewer table.info td.toggle{
text-align: center;
width: 16px;
padding: 1px;
}
#ClassViewer table.info td.toggle img{
cursor: default;
}
#ClassViewer table.info td.text{
padding-right: 10px;
}
#ClassViewer table.info td.text h3{
cursor: default;
}
#ClassViewer table.info td.text table{
padding: 0;
}
#ClassViewer table.info td.text table td {
padding: 1px 3px;
}
#ClassViewer table.info td.text table th {
text-align: left;
color: #134275;
font-weight: normal;
padding: 1px 3px;
}
#ClassViewer span.methodSignature{
font-size: 12px;
color: #83B300;
}
#ClassViewer table.info td.type a,
#ClassViewer span.methodSignature a{
color: #83B300 !important;
}
#ClassViewer span.methodSignature span.parameterType{
font-style: italic;
}
#ClassViewer span.methodSignature span.separator{
color: #134275;
font-weight: bold;
}
#ClassViewer span.methodSignature span.parenthesis{
color: #134275;
font-weight: bold;
}
#ClassViewer div.item-detail-headline {
font-weight: bold;
color: #1D65B3;
}
#ClassViewer div.item-detail-text {
padding-left: 12px;
}
#ClassViewer div.item-detail-text p{
display: inline;
}
#ClassViewer div.item-detail-error {
font-weight: bold;
color: #D61F1C;
}
#ClassViewer span.item-detail-optional {
font-style: italic;
}
#ClassViewer code,
#ClassViewer pre,
#ClassViewer span.item-detail-param-name {
font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", monospace;
background: #FFF;
padding: 1px;
}
#ClassViewer pre{
overflow: auto;
padding: 4px 8px;
margin-top: 8px;
margin-bottom: 8px;
}
#ClassViewer span.caps{
color: #134275;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 590 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 B

View File

@ -1,104 +0,0 @@
################################################################################
#
# qooxdoo - the new era of web development
#
# http://qooxdoo.org
#
# Copyright:
# 2006-2007 1&1 Internet AG, Germany, http://www.1and1.org
#
# License:
# LGPL: http://www.gnu.org/licenses/lgpl.html
# EPL: http://www.eclipse.org/org/documents/epl-v10.php
# See the LICENSE file in the project's top-level directory for details.
#
# Authors:
# * Sebastian Werner (wpbasti)
# * Andreas Ecker (ecker)
# * Fabian Jakobs (fjakobs)
#
################################################################################
################################################################################
# BASIC SETTINGS
################################################################################
#
# Location of your qooxdoo distribution
# Could be relative from this location or absolute
#
QOOXDOO_PATH = ../../..
#
# The same as above, but from the webserver point of view
# Starting point is the application HTML file of the source folder.
# In most cases just add a "/.." compared to above
#
QOOXDOO_URI = ../../../..
#
# Namespace of your application e.g. custom
#
APPLICATION_NAMESPACE = feedreader
#
# Titles used in your API viewer and during the build process
#
APPLICATION_MAKE_TITLE = FEEDREADER
APPLICATION_API_TITLE = FeedReader
#
# Additional files (space separated list)
#
APPLICATION_FILES = index.html
#
# Locales to include
#
#APPLICATION_LOCALES = en de tr it es sv ru fr
APPLICATION_LOCALES = de es en
################################################################################
# ADVANCED SETTINGS
################################################################################
#
# Enable resource filtering in API viewer
#
APPLICATION_RESOURCE_FILTER = true
#
# We don't need the full source code
#
APPLICATION_COMPLETE_SOURCE = false
#
# Disable line breaks
#
APPLICATION_LINEBREAKS_BUILD = false
APPLICATION_LINEBREAKS_SOURCE = true
#
# qooxdoo.org sync
#
APPLICATION_PUBLISH_PATH = root@qooxdoo.org:/var/www/qooxdoo/demo/$(FRAMEWORK_VERSION)/$(APPLICATION_NAMESPACE)
################################################################################
# INCLUDE CORE
################################################################################
ifneq ($(QOOXDOO_PATH),PLEASE_DEFINE_QOOXDOO_PATH)
include $(QOOXDOO_PATH)/frontend/framework/tool/make/targets.mk
include $(QOOXDOO_PATH)/frontend/framework/tool/make/application.mk
endif
error:
@echo " * Please configure QOOXDOO_PATH"

View File

@ -1,410 +0,0 @@
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the LICENSE file in the project's top-level directory for details.
Authors:
* Fabian Jakobs (fjakobs)
************************************************************************ */
/* ************************************************************************
#resource(feeds:feeds)
#resource(css:css)
#resource(proxy:proxy)
#resource(images:images)
#embed(feedreader.proxy/*)
#embed(feedreader.feeds/*)
#embed(feedreader.css/*)
#embed(feedreader.images/*)
#embed(qx.icontheme/16/actions/dialog-ok.png)
#embed(qx.icontheme/16/actions/dialog-cancel.png)
#embed(qx.icontheme/16/actions/help-about.png)
#embed(qx.icontheme/16/actions/view-refresh.png)
************************************************************************ */
/**
* qooxdoo news reader Application class.
*/
qx.OO.defineClass("feedreader.Application", qx.component.AbstractApplication,
function () {
qx.component.AbstractApplication.call(this);
qx.manager.object.ImageManager.getInstance().setIconTheme(qx.theme.icon.VistaInspirate.getInstance());
//this.fetchFeedDesc();
this.setFeeds([]);
});
qx.OO.addProperty({name: "feeds"});
qx.OO.addProperty({name: "selectedFeed"});
qx.Settings.setDefault("resourceUri", "./resource");
/*
---------------------------------------------------------------------------
METHODS
---------------------------------------------------------------------------
*/
if (qx.core.Client.getInstance().getRunsLocally())
{
qx.Class._feedDesc = [
{
url: "feedreader/feeds/qooxdoo-news.xml",
name: "qooxdoo-blog"
},
{
url: "feedreader/feeds/qooxdoo-blog.xml",
name: "qooxdoo-news"
},
{
url: "feedreader/feeds/ajaxian.xml",
name: "ajaxian"
},
{
url: "feedreader/feeds/safari.xml",
name: "Surfin' Safari"
}
];
}
else
{
qx.Class._feedDesc = [
{
url: "feedreader/proxy/proxy.php?proxy=" + encodeURIComponent("http://feeds.feedburner.com/qooxdoo/blog/content"),
name: "qooxdoo-blog"
},
{
url: "feedreader/proxy/proxy.php?proxy=" + encodeURIComponent("http://feeds.feedburner.com/qooxdoo/news/content"),
name: "qooxdoo-news"
},
{
url: "feedreader/proxy/proxy.php?proxy=" + encodeURIComponent("http://feeds.feedburner.com/ajaxian"),
name: "ajaxian"
},
{
url: "feedreader/proxy/proxy.php?proxy=" + encodeURIComponent("http://webkit.org/blog/?feed=rss2"),
name: "Surfin' Safari"
}
];
}
qx.Proto.initialize = function(e)
{
// Define alias for custom resource path
qx.manager.object.AliasManager.getInstance().add("feedreader", qx.Settings.getValueOfClass("feedreader.Application", "resourceUri"));
// Include CSS file
qx.html.StyleSheet.includeFile(qx.manager.object.AliasManager.getInstance().resolvePath("feedreader/css/reader.css"));
};
qx.Proto.main = function(e)
{
// create main layout
var dockLayout = new qx.ui.layout.DockLayout();
dockLayout.set({
height: "100%",
width: "100%"
});
// create header
var header = new qx.ui.embed.HtmlEmbed("<h1><span>qooxdoo</span> reader</h1>");
header.setCssClassName("header");
header.setHeight(50);
dockLayout.addTop(header);
// define commands
var reload_cmd = new qx.client.Command("Control+R");
reload_cmd.addEventListener("execute", function(e) {
this.fetchFeeds();
this.debug(this.tr("reloading ...").toString());
}, this);
var about_cmd = new qx.client.Command("F1");
about_cmd.addEventListener("execute", function(e) {
alert(this.tr("qooxdoo feed reader."));
}, this);
// create toolbar
var toolBar = new qx.ui.toolbar.ToolBar();
toolBar.add(new qx.ui.toolbar.Button(this.trn("Add feed", "Add feeds", 2), "icon/16/actions/dialog-ok.png"));
toolBar.add(new qx.ui.toolbar.Button(this.tr("Remove feed"), "icon/16/actions/dialog-cancel.png"));
toolBar.add(new qx.ui.toolbar.Separator());
var reload_btn = new qx.ui.toolbar.Button(this.tr("Reload"), "icon/16/actions/view-refresh.png");
reload_btn.setCommand(reload_cmd);
reload_btn.setToolTip(new qx.ui.popup.ToolTip(this.tr("(%1) Reload the feeds.", reload_cmd.toString())));
toolBar.add(reload_btn);
toolBar.add(new qx.ui.basic.HorizontalSpacer());
// poulate languages menu and add it to the toolbar
var locales = {
en: this.tr("English"),
de: this.tr("German"),
en: this.tr("English"),
tr: this.tr("Turkish"),
it: this.tr("Italian"),
es: this.tr("Spanish"),
sv: this.tr("Swedish"),
ru: this.tr("Russian")
}
var availableLocales = qx.locale.Manager.getInstance().getAvailableLocales();
var locale = qx.locale.Manager.getInstance().getLocale();
var lang_menu = new qx.ui.menu.Menu();
var radioManager = new qx.manager.selection.RadioManager("lang");
for (var lang in locales) {
if (availableLocales.indexOf(lang) == -1) {
continue;
}
var menuButton = new qx.ui.menu.RadioButton(locales[lang], null, locale == lang);
menuButton.setUserData("locale", lang);
lang_menu.add(menuButton);
radioManager.add(menuButton);
}
radioManager.addEventListener("changeSelected", function(e) {
var lang = e.getData().getUserData("locale");
this.debug("lang:" + lang);
qx.locale.Manager.getInstance().setLocale(lang);
});
lang_menu.addToDocument();
toolBar.add(new qx.ui.toolbar.MenuButton("", lang_menu, "feedreader/images/locale.png"));
var about_btn = new qx.ui.toolbar.Button(this.tr("Help"), "icon/16/actions/help-about.png");
about_btn.setCommand(about_cmd);
about_btn.setToolTip(new qx.ui.popup.ToolTip("(" + about_cmd.toString() + ")"));
toolBar.add(about_btn);
dockLayout.addTop(toolBar);
// add tree
var tree = new qx.ui.tree.Tree(this.tr("News feeds"));
tree.set({height:"100%", width:"100%"});
tree.setOverflow("auto");
tree.setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
tree.setBackgroundColor("#EEEEEE");
var feedDesc = feedreader.Application._feedDesc;
for (var i=0; i<feedDesc.length; i++) {
var folder = new qx.ui.tree.TreeFolder(feedDesc[i].name);
tree.getManager().addEventListener("changeSelection", function(e) {
if (e.getData()[0] .getParentFolder()) {
this.displayFeed(e.getData()[0].getLabel());
}
}, this);
tree.add(folder);
}
// create table model
this._tableModel = new qx.ui.table.SimpleTableModel();
this._tableModel.setColumnIds(["title", "author", "date"]);
this._tableModel.setColumnNamesById({
title: this.tr("Subject"),
author: this.tr("Sender"),
date: this.tr("Date")
});
// add table
var table = new qx.ui.table.Table(this._tableModel);
table.setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
table.set({height:"100%", width:"100%"});
table.setStatusBarVisible(false);
table.getDataRowRenderer().setHighlightFocusRow(false);
table.getTableColumnModel().setColumnWidth(0, 350);
table.getTableColumnModel().setColumnWidth(1, 200);
table.getTableColumnModel().setColumnWidth(2, 200);
table.getSelectionModel().addEventListener("changeSelection", function(e) {
var selectedEntry = table.getSelectionModel().getAnchorSelectionIndex();
var item = this.getFeeds()[this.getSelectedFeed()].items[selectedEntry];
this.displayArticle(item);
}, this);
// hide row focus
var theme = qx.manager.object.AppearanceManager.getInstance().getAppearanceTheme();
theme.registerAppearance("table-focus-indicator", {
state : function(vTheme, vStates) {
return {
border: null
}
}
});
this._table = table;
// add blog entry
this._blogEntry = new feedreader.ArticleView();
this._blogEntry.set({height:"100%", width:"100%"});
this._blogEntry.setBorder(qx.renderer.border.BorderPresets.getInstance().inset);
// create splitpane for the right hand content area
var contentSplitPane = new qx.ui.splitpane.VerticalSplitPane("1*", "2*");
contentSplitPane.set({height:"100%", width:"100%"});
contentSplitPane.setLiveResize(true);
contentSplitPane.addTop(table);
contentSplitPane.addBottom(this._blogEntry);
// create vertival splitter
var mainSplitPane = new qx.ui.splitpane.HorizontalSplitPane(200, "1*");
mainSplitPane.setLiveResize(true);
mainSplitPane.addLeft(tree);
mainSplitPane.addRight(contentSplitPane);
dockLayout.add(mainSplitPane);
dockLayout.addToDocument();
// load and display feed data
this.setSelectedFeed(feedDesc[0].name);
this.fetchFeeds();
};
qx.Proto.fetchFeedDesc = function() {
var req = new qx.io.remote.Request(qx.manager.object.AliasManager.getInstance().resolvePath("feedreader/feeds/febo-feeds.opml.xml"), "GET", qx.util.Mime.XML);
feedreader.Application._feedDesc = [];
req.addEventListener("completed", function(e) {
var xml = e.getData().getContent();
var eItems = xml.getElementsByTagName("outline");
for(var i=0; i<eItems.length; i++) {
var eDesc = eItems[i];
feedreader.Application._feedDesc.push({
name: eDesc.getAttribute("title"),
url: qx.manager.object.AliasManager.getInstance().resolvePath("feedreader/proxy/proxy.php") + "?proxy=" + encodeURIComponent(eDesc.getAttribute("xmlUrl"))
});
}
}, this);
req.setAsynchronous(false);
req.send();
};
qx.Proto.fetchFeeds = function() {
qx.io.remote.RequestQueue.getInstance().setMaxConcurrentRequests(2);
var feedDesc = feedreader.Application._feedDesc;
var that = this;
var getCallback = function(feedName) {
return function(e) {
that.debug("loading " + feedName + " complete!");
that.parseXmlFeed(feedName, e.getData().getContent());
}
}
for (var i=0; i<feedDesc.length; i++) {
var req = new qx.io.remote.Request(qx.manager.object.AliasManager.getInstance().resolvePath(feedDesc[i].url), "GET", qx.util.Mime.XML);
req.addEventListener("completed", getCallback(feedDesc[i].name));
req.send();
}
};
qx.Proto.parseXmlFeed = function(feedName, xml) {
var items = [];
if (xml.documentElement.tagName == "rss") {
items = this.parseRSSFeed(xml);
} else if (xml.documentElement.tagName == "feed") {
items = this.parseAtomFeed(xml);
}
this.getFeeds()[feedName] = {
selected: 0,
items: items
};
if (feedName == this.getSelectedFeed()) {
this.displayFeed(feedName);
}
};
qx.Proto.parseAtomFeed = function(xml) {
var eItems = xml.getElementsByTagName("entry");
var empty = xml.createElement("empty");
var items = [];
for (var i=0; i<eItems.length; i++) {
var eItem = eItems[i];
var item = {}
item.title = qx.dom.Element.getTextContent(eItem.getElementsByTagName("title")[0]);
if (eItem.getElementsByTagName("author").length > 0) {
item.author = qx.dom.Element.getTextContent(eItem.getElementsByTagName("author")[0].getElementsByTagName("name")[0]);
} else {
item.author = ""
}
item.date = qx.dom.Element.getTextContent(
eItem.getElementsByTagName("created")[0] ||
eItem.getElementsByTagName("published")[0] ||
eItem.getElementsByTagName("updated")[0] ||
empty
);
item.content = qx.dom.Element.getTextContent(eItem.getElementsByTagName("content")[0] || empty);
item.link = eItem.getElementsByTagName("link")[0].getAttribute("href");
items.push(item);
}
return items;
}
qx.Proto.parseRSSFeed = function(xml) {
var eItems = xml.getElementsByTagName("item");
var empty = xml.createElement("empty");
var items = [];
for (var i=0; i<eItems.length; i++) {
var eItem = eItems[i];
var item = {}
item.title = qx.dom.Element.getTextContent(eItem.getElementsByTagName("title")[0]);
item.author = qx.dom.Element.getTextContent(qx.xml.Element.getElementsByTagNameNS(eItem, qx.xml.Namespace.DC, "creator")[0] || empty);
item.date = qx.dom.Element.getTextContent(eItem.getElementsByTagName("pubDate")[0]);
item.content = qx.dom.Element.getTextContent(qx.xml.Element.getElementsByTagNameNS(eItem, qx.xml.Namespace.RSS1, "encoded")[0] || empty);
item.link = qx.dom.Element.getTextContent(eItem.getElementsByTagName("link")[0]);
items.push(item);
}
return items;
};
qx.Proto.displayFeed = function(feedName) {
if (this.getSelectedFeed() != feedName) {
this.getFeeds()[this.getSelectedFeed()].selected = this._table.getSelectionModel().getAnchorSelectionIndex();
}
this.setSelectedFeed(feedName);
if (this.getFeeds()[feedName]) {
var items = this.getFeeds()[feedName].items;
var selection = this.getFeeds()[feedName].selected;
this._tableModel.setDataAsMapArray(items);
this._table.getSelectionModel().setSelectionInterval(selection, selection);
this._table.setFocusedCell(0, selection, true);
this.displayArticle(items[selection]);
}
};
qx.Proto.displayArticle = function(item) {
this._blogEntry.setArticle(item);
};
qx.Proto.finalize = function(e)
{
};
qx.Proto.close = function(e)
{
// prompt user
// e.returnValue = "[qooxdoo application: Do you really want to close the application?]";
};
qx.Proto.terminate = function(e)
{
// alert("terminated");
};

View File

@ -1,85 +0,0 @@
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
License:
LGPL: http://www.gnu.org/licenses/lgpl.html
EPL: http://www.eclipse.org/org/documents/epl-v10.php
See the LICENSE file in the project's top-level directory for details.
Authors:
* Fabian Jakobs (fjakobs)
************************************************************************ */
/* ************************************************************************
************************************************************************ */
qx.OO.defineClass("feedreader.ArticleView", qx.ui.basic.Terminator,
function(article) {
qx.ui.basic.Terminator.call(this);
this.setCssClassName("blogEntry");
this.setArticle(article);
});
qx.OO.addProperty({ name: "article"});
qx.Proto._modifyArticle = function(propValue, propOldValue, propData) {
if (this._isCreated) {
this._applyElementData();
}
return true;
};
qx.Proto._applyElementData = function() {
var element = this.getElement();
element.innerHTML = this.getHtml();
var links = element.getElementsByTagName("a");
for (var i=0; i<links.length; i++) {
links[i].target = "_blank";
};
};
qx.Proto.getHtml = function() {
var item = this.getArticle();
if (!item) {
return "";
}
var html = new qx.util.StringBuilder();
html.add("<div id='_blogEntry'>");
html.add("<h1 class='blog'>");
html.add(item.title);
html.add("</h1>");
html.add("<div class='date'>");
html.add(item.date);
html.add("</div>");
html.add("<div class='description'>");
html.add(item.content);
html.add("</div>");
html.add("<a target='_blank' href='");
html.add(item.link);
html.add("'>");
html.add(this.tr("read more ..."));
html.add("</a>");
html.add("</div>");
return html;
}

View File

@ -1,15 +0,0 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>qooxdoo &raquo; Demo &raquo; Feed Reader</title>
<script type="text/javascript" src="script/feedreader.js"></script>
</head>
<body>
<script type="text/javascript">
if (!qx.IS_SOURCE) {
qx.log.Logger.ROOT_LOGGER.setMinLevel(qx.log.Logger.LEVEL_ERROR);
}
qx.core.Init.getInstance().setApplication(feedreader.Application);
</script>
</body>
</html>

View File

@ -1,54 +0,0 @@
.header {
margin: 0px;
padding: 0px;
background-color: #134275;
}
.header h1 {
font-family: "Trebuchet MS", "Lucida Grande", Verdana, sans-serif;
font-size: 18px;
font-weight: bold;
color: #DEFF83;
padding: 12px 20px;
margin: 0px;
}
.blogEntry {
font-family: Verdana, "Lucida Grande", "Bitstream Vera Sans", Tahoma, "Lucida Sans Unicode", Arial, sans-serif;
font-size: 11px;
line-height: 150%;
padding: 5px;
background: #FBFFEF;
}
.blogEntry h1.blog {
font-family: "Trebuchet MS", "Lucida Grande", Verdana, sans-serif;
color: #134275;
line-height: 120%;
}
.blogEntry {
overflow: auto;
}
.blogEntry div.date {
font-weight: bold;
color: #1D65B3;
padding: 5px;
}
.blogEntry a:link,
.blogEntry a:visited{
color: #134275;
}
.blogEntry a:hover,
.blogEntry a:active{
color: #134275;
text-decoration: underline;
}
.blogEntry .description {
margin-top: 10px;
margin-bottom: 10px;
}

View File

@ -1,789 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><!-- generator="wordpress/1.5.2" --><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>Ajaxian</title>
<link>http://ajaxian.com</link>
<description>Cleaning up the web with Ajax</description>
<pubDate>Tue, 28 Nov 2006 14:55:53 +0000</pubDate>
<generator>http://wordpress.org/?v=1.5.2</generator>
<language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://ajaxian.com/index.xml" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
<title>Tasks added to Google Calendar by Milkers</title>
<link>http://ajaxian.com/archives/tasks-added-to-google-calendar-by-milkers</link>
<comments>http://ajaxian.com/archives/tasks-added-to-google-calendar-by-milkers#comments</comments>
<pubDate>Tue, 28 Nov 2006 14:55:53 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Showcase</category>
<category>Calendar</category>
<guid>http://ajaxian.com/archives/tasks-added-to-google-calendar-by-milkers</guid>
<description><![CDATA[ The Remember the Milk folks have added task management to Google Calendar (something many wish Google had added themselves).
We know that many of you are managing your tasks with Remember The Milk and your events with Google Calendar, and we thought it would be very cool if we could bring the two together. This new [...]]]></description>
<content:encoded><![CDATA[ <p>The Remember the Milk folks have added <a href="http://blog.rememberthemilk.com/2006/11/add-your-tasks-to-google-calendar.html">task management</a> to Google Calendar (something many wish Google had added themselves).</p>
<p>We know that many of you are managing your tasks with Remember The Milk and your events with Google Calendar, and we thought it would be very cool if we could bring the two together. This new feature adds a small task icon to the top of each day in Google Calendar &#8212; click on the icon to:</p>
<ul>
<li>Review your tasks for the day</li>
<li>Add new tasks and edit existing ones</li>
<li>Easily complete and postpone tasks</li>
<li>Review your overdue tasks</li>
<li>Optionally show tasks with no due date</li>
<li>See where your tasks are located on a map (Google Maps integration)</li>
</ul>
<p>This is really interesting. An outside group was able to add an important feature that we can not all use in a Google app itself.</p>
<p><a href="http://blog.rememberthemilk.com/2006/11/add-your-tasks-to-google-calendar.html"><img src="http://tech.cybernetnews.com/wp-content/uploads/2006/11/RememberMilkGC1.jpg" border="0" /></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=fbhz2iq1"><img src="http://feeds.feedburner.com/~f/ajaxian?i=fbhz2iq1" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=yMSQUquM"><img src="http://feeds.feedburner.com/~f/ajaxian?i=yMSQUquM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=eoFosWuU"><img src="http://feeds.feedburner.com/~f/ajaxian?i=eoFosWuU" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=pYIIcHPu"><img src="http://feeds.feedburner.com/~f/ajaxian?i=pYIIcHPu" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/tasks-added-to-google-calendar-by-milkers/feed/</wfw:commentRSS>
</item>
<item>
<title>YUI Resizable Component</title>
<link>http://ajaxian.com/archives/yui-resizable-component</link>
<comments>http://ajaxian.com/archives/yui-resizable-component#comments</comments>
<pubDate>Tue, 28 Nov 2006 13:38:06 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Examples</category>
<category>Yahoo!</category>
<guid>http://ajaxian.com/archives/yui-resizable-component</guid>
<description><![CDATA[ Jack Slocum keeps 'em coming with his detailed post on a reusable component for resizing elements.
Jack's YAHOO.ext.Resizable component does what it says on the tin, and he shows you:
Basic Resizable div
Wrapped elements (e.g. text area inside)
Preserve Ration (e.g. image resizing)
Transparent Handles
Customizable Handles
Snapping to increments
Animated Transitions
var animated = new YAHOO.ext.Resizable&#40;'animated', &#123;
&#160; &#160; width: 200,
&#160; &#160; height: [...]]]></description>
<content:encoded><![CDATA[ <p>Jack Slocum keeps 'em coming with his detailed post on <a href="http://www.jackslocum.com/blog/2006/11/24/resizable-reloaded/">a reusable component for resizing elements</a>.</p>
<p>Jack's YAHOO.ext.Resizable component does what it says on the tin, and he shows you:</p>
<ul>
<li>Basic Resizable div</li>
<li>Wrapped elements (e.g. text area inside)</li>
<li>Preserve Ration (e.g. image resizing)</li>
<li>Transparent Handles</li>
<li>Customizable Handles</li>
<li>Snapping to increments</li>
<li>Animated Transitions</li>
</ul>
<div class="syntax_hilite">
<div id="javascript-2">
<div class="javascript">
<span style="color: #003366; font-weight: bold;">var</span> animated = <span style="color: #003366; font-weight: bold;">new</span> YAHOO.<span style="color: #006600;">ext</span>.<span style="color: #006600;">Resizable</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">'animated'</span>, <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; width: <span style="color:#800000;">200</span>,<br />
&nbsp; &nbsp; height: <span style="color:#800000;">100</span>,<br />
&nbsp; &nbsp; minWidth:<span style="color:#800000;">100</span>,<br />
&nbsp; &nbsp; minHeight:<span style="color:#800000;">50</span>,<br />
&nbsp; &nbsp; animate:<span style="color: #003366; font-weight: bold;">true</span>,<br />
&nbsp; &nbsp; easing: YAHOO.<span style="color: #006600;">util</span>.<span style="color: #006600;">Easing</span>.<span style="color: #006600;">backIn</span>,<br />
&nbsp; &nbsp; duration:.<span style="color:#800000;">6</span><br />
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp;</div>
</div>
</div>
<p><a href="http://www.jackslocum.com/blog/2006/11/24/resizable-reloaded/"><img src="http://ajaxian.com/wp-content/images/yuiresizable.png" alt="YUI Resizable" border="0" width="208" height="108"/></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=JsRk5j9d"><img src="http://feeds.feedburner.com/~f/ajaxian?i=JsRk5j9d" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=8EjVkg8A"><img src="http://feeds.feedburner.com/~f/ajaxian?i=8EjVkg8A" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=h5DmJGoc"><img src="http://feeds.feedburner.com/~f/ajaxian?i=h5DmJGoc" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=dGR1OTXo"><img src="http://feeds.feedburner.com/~f/ajaxian?i=dGR1OTXo" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/yui-resizable-component/feed/</wfw:commentRSS>
</item>
<item>
<title>Mootools Primer</title>
<link>http://ajaxian.com/archives/mootools-primer</link>
<comments>http://ajaxian.com/archives/mootools-primer#comments</comments>
<pubDate>Mon, 27 Nov 2006 15:58:12 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Examples</category>
<guid>http://ajaxian.com/archives/mootools-primer</guid>
<description><![CDATA[ Aaron Newton has posted a Mootools Primer / Tutorial that includes "a how-to tutorial on the Mootools library. Most of the code examples will allow you execute them by clicking on the "execute this code" link above the example. Clicking this will echo out the code and the result in the Firebug debugging plugin for [...]]]></description>
<content:encoded><![CDATA[ <p>Aaron Newton has posted a <a href="http://clientside.cnet.com/examples/mootools-primer/">Mootools Primer / Tutorial</a> that includes "a how-to tutorial on the Mootools library. Most of the code examples will allow you execute them by clicking on the "execute this code" link above the example. Clicking this will echo out the code and the result in the Firebug debugging plugin for Firefox. You'll need that plugin installed to see any results of most of the code examples."</p>
<p>Currently the tabbed widget shows documentation for the core Moo.js, extensions of JavaScript objects and helpers, Addon libraries, and plugins.</p>
<p>It behaves a little weird for me with FF2 + Firebug 1.beta, but I can get to the meat of the matter.</p>
<p><a href="http://clientside.cnet.com/examples/mootools-primer/"><img src="http://ajaxian.com/wp-content/images/mootoolsprimer.png" alt="Mootools Primer" border="0" width="590" height="324"/></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=vfTLBHWH"><img src="http://feeds.feedburner.com/~f/ajaxian?i=vfTLBHWH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=RmZz7WHX"><img src="http://feeds.feedburner.com/~f/ajaxian?i=RmZz7WHX" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=nEOsta0N"><img src="http://feeds.feedburner.com/~f/ajaxian?i=nEOsta0N" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=zmZsFXoa"><img src="http://feeds.feedburner.com/~f/ajaxian?i=zmZsFXoa" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/mootools-primer/feed/</wfw:commentRSS>
</item>
<item>
<title>Google Docs and Spreadsheets Team: Web native matters</title>
<link>http://ajaxian.com/archives/google-docs-and-spreadsheets-team-web-native-matters</link>
<comments>http://ajaxian.com/archives/google-docs-and-spreadsheets-team-web-native-matters#comments</comments>
<pubDate>Mon, 27 Nov 2006 15:25:50 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Editorial</category>
<guid>http://ajaxian.com/archives/google-docs-and-spreadsheets-team-web-native-matters</guid>
<description><![CDATA[ Richard MacManus linked to a Gizbuzz interview of Jen Mazzon and Sam Schillace of the Google Docs and Spreadsheets team (both ex-Writely).
Nothing ground-breaking, but it is interesting to hear about their thoughts on Ajax:
Browser compatibility issues - like the early graphic Web
Next was a question about browser compatibility issues and how that affects D&#038;S - [...]]]></description>
<content:encoded><![CDATA[ <p>Richard MacManus <a href="http://www.readwriteweb.com/archives/google_docs_and_spreadsheets_interview.php">linked to</a> a <a href="http://gizbuzz.co.uk/2006/podcast-episode-3-google-docs-and-spreadsheets/">Gizbuzz interview of Jen Mazzon and Sam Schillace</a> of the Google Docs and Spreadsheets team (both ex-Writely).</p>
<p>Nothing ground-breaking, but it is interesting to hear about their thoughts on Ajax:</p>
<blockquote>
<h3>Browser compatibility issues - like the early graphic Web</h3>
<p>Next was a question about browser compatibility issues and how that affects D&#038;S - and indeed the future of rich web applications. Sam responded that "it is definitely an issue [...] these apps are all cutting edge - it kind of reminds me of the early days of the graphical web, when you couldn't count on the browsers to render tables correctly [...]".</p>
<p>But he thinks it's "just growing pains" and it'll take about a year to sort those issues out.</p>
<p>Also on the question of whether Ajax is better than Flash and Laszlo etc, Sam thinks that Ajax is currently more web native.</p>
<h3>It's about being Web native, not cloning desktop apps</h3>
<p>Later in the interview, Jen stresses that they're "not trying to clone desktop apps". They want to be familiar to people, "but we're trying to do something that's actually more native to the Internet, more usable on the Internet."</p>
<p>Sam says they've had a lot of feedback that people like the fact they're not trying to copy desktop apps. He said "copying the existing stuff just feels irrelevant to us - we're not trying to copy, we're trying to re-invent."</p>
<p>Both Jen and Sam re-affirmed that collaboration and sharing is their main focus with D&#038;S, as well as being web native - rather than trying to compete on features with desktop apps.
</p></blockquote>
<p>If you were asked "why is Ajax a better fit for some apps than Flash?" what would you say? Do you agree? Does the open web matter? What if Adobe fully opened up their format?
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=NCLw33w0"><img src="http://feeds.feedburner.com/~f/ajaxian?i=NCLw33w0" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=gjXowiT4"><img src="http://feeds.feedburner.com/~f/ajaxian?i=gjXowiT4" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=HeKJhsYv"><img src="http://feeds.feedburner.com/~f/ajaxian?i=HeKJhsYv" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=CWr8mgGL"><img src="http://feeds.feedburner.com/~f/ajaxian?i=CWr8mgGL" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/google-docs-and-spreadsheets-team-web-native-matters/feed/</wfw:commentRSS>
</item>
<item>
<title>Review of Pro Ajax and Java Frameworks</title>
<link>http://ajaxian.com/archives/review-of-pro-ajax-and-java-frameworks</link>
<comments>http://ajaxian.com/archives/review-of-pro-ajax-and-java-frameworks#comments</comments>
<pubDate>Mon, 27 Nov 2006 14:14:42 +0000</pubDate>
<dc:creator>Dietrich Kappe</dc:creator>
<category>Front Page</category>
<category>Book Reviews</category>
<guid>http://ajaxian.com/archives/review-of-pro-ajax-and-java-frameworks</guid>
<description><![CDATA[
This is a review of Pro Ajax and Java Frameworks by Nathaniel T. Schutta and Ryan Asleson. This book seeks to give the experienced developer of Java web applications the knowledge necessary to add Ajax to their webapps. This is another Ajax book that goes broad rather than deep. Instead of investigating one or two [...]]]></description>
<content:encoded><![CDATA[ <p><a href="http://ajaxian.com/wp-content/images/bcm.gif"><img src="http://ajaxian.com/wp-content/images/bcm_tn.jpg" style="DISPLAY: inline; FLOAT: left; WIDTH: 125px; HEIGHT: 164px" title="bcm.gif" height="164" width="125" alt="bcm.gif" border="0" id="bcm.gif"/></a></p>
<p>This is a review of <em>Pro Ajax and Java Frameworks</em> by Nathaniel T. Schutta and Ryan Asleson. This book seeks to give the experienced developer of Java web applications the knowledge necessary to add Ajax to their webapps. This is another Ajax book that goes broad rather than deep. Instead of investigating one or two frameworks, it delves into more than a half dozen, both Javascript and Java.</p>
<p>Quick summary: Chapters 2, 3 and 5 are the strongest in the book with useful information on tools, Javascript libraries and enhancing Struts applications with Ajax. The other chapters are not as strong and spend too much time covering old ground.</p>
<p>The book is divided into two parts. Part 1 is an introduction to a variety of Javascript and Java Ajax libraries and frameworks. Part 2 shows how to integrate those libraries and frameworks into existing Java web frameworks such as Struts and JSF. One place that this book differs from other Ajax books is that it doesn't have a chapter introducing the reader to the browser technologies that comprise Ajax. It doesn't dwell on the basics of Javascript, DOM and CSS. It expects you to have already read the Apress books on those topics. Instead, chapter 1 covers what I would call best practices and patterns -- autocomplete, partial page update, draggable DOM.</p>
<p>Read more of the review <a href="http://blogs.pathf.com/agileajax/2006/11/review_of_pro_a.html">here</a>.</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=5FIDIG43"><img src="http://feeds.feedburner.com/~f/ajaxian?i=5FIDIG43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=5aOiDdHp"><img src="http://feeds.feedburner.com/~f/ajaxian?i=5aOiDdHp" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=hunPILOJ"><img src="http://feeds.feedburner.com/~f/ajaxian?i=hunPILOJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=GTSOXqVS"><img src="http://feeds.feedburner.com/~f/ajaxian?i=GTSOXqVS" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/review-of-pro-ajax-and-java-frameworks/feed/</wfw:commentRSS>
</item>
<item>
<title>Minus(MO)R a.k.a. Let me write JavaScript but help me!</title>
<link>http://ajaxian.com/archives/minusmor-aka-let-me-write-javascript-but-help-me</link>
<comments>http://ajaxian.com/archives/minusmor-aka-let-me-write-javascript-but-help-me#comments</comments>
<pubDate>Mon, 27 Nov 2006 14:03:41 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Library</category>
<category>Rails</category>
<guid>http://ajaxian.com/archives/minusmor-aka-let-me-write-javascript-but-help-me</guid>
<description><![CDATA[ Dan Webb has created two Rails plugins to make RJS even better. He has realised that although for some cases RJS is a great thing, you often do want to just use JavaScript, and it looks really ugly to do this:
page &#38;lt;&#38;lt;'if (someClientSideVariable) {'
page['a'].replace_html :partial =&#38;gt; 'thing'
page &#38;lt;&#38;lt;'} else {'
page['b'].replace_html :partial =&#38;gt; 'thong'
page &#38;lt;&#38;lt;'}'
He first [...]]]></description>
<content:encoded><![CDATA[ <p>Dan Webb has created two Rails plugins to make RJS even better. He has realised that although for some cases RJS is a great thing, you often do want to just use JavaScript, and it looks really ugly to do this:</p>
<div class="syntax_hilite">
<div id="ruby-5">
<div>
page &amp;lt;&amp;lt;'if (someClientSideVariable) {'<br />
page['a'].replace_html :partial =&amp;gt; 'thing'<br />
page &amp;lt;&amp;lt;'} else {'<br />
page['b'].replace_html :partial =&amp;gt; 'thong'<br />
page &amp;lt;&amp;lt;'}'
</div>
</div>
</div>
<p>He first came out with <a href="http://svn.danwebb.net/external/rails/plugins/minus_r/trunk/">MinusR</a> which takes of your rjs files and lets you code in JS, but still call out to the ruby style. For example:</p>
<div class="syntax_hilite">
<div id="javascript-6">
<div class="javascript">
<span style="color: #000066; font-weight: bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span>someClientSideVariable<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; $<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">'a'</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color: #006600;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span>&amp;lt;%=js render<span style="color:#006600; font-weight:bold;">&#40;</span>:partial =&gt; <span style="color: #3366CC;">'thing'</span><span style="color:#006600; font-weight:bold;">&#41;</span> %&amp;gt;<span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; $<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">'b'</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color: #006600;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span>&amp;lt;%=js render<span style="color:#006600; font-weight:bold;">&#40;</span>:partial =&gt; <span style="color: #3366CC;">'thong'</span><span style="color:#006600; font-weight:bold;">&#41;</span> %&amp;gt;<span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp;</div>
</div>
</div>
<blockquote><p>
MinusR gives you the js helper that calls to_json on any value passed to it so you can drop nicely escaped and formatted data into your script as before. Everyones a winner. Well, not quite, I could be going out on a limb here but I really think this is the better way. Go on, give it a go. A bit of javaScript wont hurt you….
</p></blockquote>
<p>Then a bunch of people wanted this to be doable, but in a separate file, so Dan created <a href="http://www.danwebb.net/2006/11/24/minusmor-released">MinusMOR</a>, which let's you do the same thing in .ejs files.</p>
<p>It is great to be able to choice your poison, even on a case by case basis, and decide whether JS or Ruby is the ruler.
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=KzOPpBLk"><img src="http://feeds.feedburner.com/~f/ajaxian?i=KzOPpBLk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=tyZWuMpT"><img src="http://feeds.feedburner.com/~f/ajaxian?i=tyZWuMpT" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=cYtOaSvj"><img src="http://feeds.feedburner.com/~f/ajaxian?i=cYtOaSvj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=e2UryVSj"><img src="http://feeds.feedburner.com/~f/ajaxian?i=e2UryVSj" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/minusmor-aka-let-me-write-javascript-but-help-me/feed/</wfw:commentRSS>
</item>
<item>
<title>Zamzar: Online file conversion</title>
<link>http://ajaxian.com/archives/zamzar-online-file-conversion</link>
<comments>http://ajaxian.com/archives/zamzar-online-file-conversion#comments</comments>
<pubDate>Mon, 27 Nov 2006 13:23:12 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Showcase</category>
<guid>http://ajaxian.com/archives/zamzar-online-file-conversion</guid>
<description><![CDATA[ Zamzar is a simple, single page ajax application that lets you upload a file and convert it to something else. E.g.
Make your PDF documents editable by converting them to MS Word
Convert your ITunes (aac) files to mp3
Upload up to 5 files at a time to convert simultaneously
Take advantage of over 150 different conversion types
]]></description>
<content:encoded><![CDATA[ <p><a href="http://www.zamzar.com/">Zamzar</a> is a simple, single page ajax application that lets you upload a file and convert it to something else. E.g.</p>
<ul>
<li>Make your PDF documents editable by converting them to MS Word</li>
<li>Convert your ITunes (aac) files to mp3</li>
<li>Upload up to 5 files at a time to convert simultaneously</li>
<li>Take advantage of over 150 different conversion types</li>
</ul>
<p><a href="http://www.zamzar.com/"><img src="http://ajaxian.com/wp-content/images/zamzar.png" alt="ZamZar" border="0" width="778" height="549"/></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=2bVY3cIM"><img src="http://feeds.feedburner.com/~f/ajaxian?i=2bVY3cIM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=YNCLGcXg"><img src="http://feeds.feedburner.com/~f/ajaxian?i=YNCLGcXg" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=qgnycv1k"><img src="http://feeds.feedburner.com/~f/ajaxian?i=qgnycv1k" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=wnoUHPGJ"><img src="http://feeds.feedburner.com/~f/ajaxian?i=wnoUHPGJ" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/zamzar-online-file-conversion/feed/</wfw:commentRSS>
</item>
<item>
<title>CSS Evolution</title>
<link>http://ajaxian.com/archives/css-evolution</link>
<comments>http://ajaxian.com/archives/css-evolution#comments</comments>
<pubDate>Sat, 25 Nov 2006 17:12:26 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Fun</category>
<category>CSS</category>
<guid>http://ajaxian.com/archives/css-evolution</guid>
<description><![CDATA[
Evolution of the web in real-time. I hope you are having a good weekend (a Thanksgiving one for the US folk).
]]></description>
<content:encoded><![CDATA[ <p><img src="http://mboffin.com/stuff/designline-openair.gif" width="512" height="384" border="0" /></p>
<p>Evolution of the web in real-time. I hope you are having a good weekend (a Thanksgiving one for the US folk).
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=0Oe2jHNg"><img src="http://feeds.feedburner.com/~f/ajaxian?i=0Oe2jHNg" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=dnGk0cRj"><img src="http://feeds.feedburner.com/~f/ajaxian?i=dnGk0cRj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=Tt4f4R3d"><img src="http://feeds.feedburner.com/~f/ajaxian?i=Tt4f4R3d" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=G46q0PCO"><img src="http://feeds.feedburner.com/~f/ajaxian?i=G46q0PCO" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/css-evolution/feed/</wfw:commentRSS>
</item>
<item>
<title>Poly9s Polyvalent Javascript URL Parser</title>
<link>http://ajaxian.com/archives/poly9s-polyvalent-javascript-url-parser</link>
<comments>http://ajaxian.com/archives/poly9s-polyvalent-javascript-url-parser#comments</comments>
<pubDate>Sat, 25 Nov 2006 15:00:34 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Library</category>
<guid>http://ajaxian.com/archives/poly9s-polyvalent-javascript-url-parser</guid>
<description><![CDATA[ Denis Laprise and the Poly9 Group needed a robust URL parser in JavaScript, so they created the Polyvalent Javascript URL Parser.
var p = new Poly9.URLParser&#40;'http://user:password@poly9.com/pathname?arguments=1#fragment'&#41;;
p.getHost&#40;&#41; == 'poly9.com';
p.getProtocol&#40;&#41; == 'http';
p.getPathname&#40;&#41; == '/pathname';
p.getQuerystring&#40;&#41; == 'arguments=1';
p.getFragment&#40;&#41; == 'fragment';
p.getUsername&#40;&#41; == 'user';
p.getPassword&#40;&#41; == 'password';
p.setURL&#40;'another.url.com'&#41;;
p.getHost&#40;&#41; == 'another.url.com';
p.getProtocol&#40;&#41; == '';
p.setURL&#40;'dsdsad'&#41;; // throws an exception
&#160;
This smells like a Java group writing JavaScript to [...]]]></description>
<content:encoded><![CDATA[ <p>Denis Laprise and the Poly9 Group needed a robust URL parser in JavaScript, so they <a href="https://code.poly9.com/trac/wiki/URLParser">created the Polyvalent Javascript URL Parser</a>.</p>
<div class="syntax_hilite">
<div id="javascript-8">
<div class="javascript">
<span style="color: #003366; font-weight: bold;">var</span> p = <span style="color: #003366; font-weight: bold;">new</span> Poly9.<span style="color: #006600;">URLParser</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">'http://user:password@poly9.com/pathname?arguments=1#fragment'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
p.<span style="color: #006600;">getHost</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'poly9.com'</span>;<br />
p.<span style="color: #006600;">getProtocol</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'http'</span>;<br />
p.<span style="color: #006600;">getPathname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'/pathname'</span>;<br />
p.<span style="color: #006600;">getQuerystring</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'arguments=1'</span>;<br />
p.<span style="color: #006600;">getFragment</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'fragment'</span>;<br />
p.<span style="color: #006600;">getUsername</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'user'</span>;<br />
p.<span style="color: #006600;">getPassword</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'password'</span>;</p>
<p>p.<span style="color: #006600;">setURL</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">'another.url.com'</span><span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
p.<span style="color: #006600;">getHost</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">'another.url.com'</span>;<br />
p.<span style="color: #006600;">getProtocol</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> == <span style="color: #3366CC;">''</span>;</p>
<p>p.<span style="color: #006600;">setURL</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">'dsdsad'</span><span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color: #009900; font-style: italic;">// throws an exception</span><br />
&nbsp;</div>
</div>
</div>
<p>This smells like a Java group writing JavaScript to me with the camelCase and thus p.getUsername() instead of p.username.</p>
<p>You can check out <a href="https://code.poly9.com/trac/browser/urlparser/urlparser.js?format=txt">the implementation</a> and the <a href="https://code.poly9.com/files/urlparser-0.1.zip">test suite (zip)</a>.
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=ZVMtMQRn"><img src="http://feeds.feedburner.com/~f/ajaxian?i=ZVMtMQRn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=TTsAAACX"><img src="http://feeds.feedburner.com/~f/ajaxian?i=TTsAAACX" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=LDXEbvr2"><img src="http://feeds.feedburner.com/~f/ajaxian?i=LDXEbvr2" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=Uk6myWFs"><img src="http://feeds.feedburner.com/~f/ajaxian?i=Uk6myWFs" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/poly9s-polyvalent-javascript-url-parser/feed/</wfw:commentRSS>
</item>
<item>
<title>DOMContentLoaded.Next</title>
<link>http://ajaxian.com/archives/domcontentloadednext</link>
<comments>http://ajaxian.com/archives/domcontentloadednext#comments</comments>
<pubDate>Sat, 25 Nov 2006 14:29:00 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Tip</category>
<guid>http://ajaxian.com/archives/domcontentloadednext</guid>
<description><![CDATA[ Andrea Giammarchi has taken the work of Dean Edwards, Mark Wubben, and Paul Sowden to create his DOMContentLoaded Final Solution.
The work comes with a test page for http and https, and is documented in this function:
function onContent&#40;callback&#41;&#123; // (C) webreflection.blogspot.com
&#160; &#160; // [please note that this code doesn't work]
&#160;// private scope variable
&#160;var IEStringToWrite =&#160; // [...]]]></description>
<content:encoded><![CDATA[ <p>Andrea Giammarchi has taken the work of <a href="http://dean.edwards.name/weblog/2005/09/busted/">Dean</a> <a href="http://dean.edwards.name/weblog/2006/06/again/">Edwards</a>, <a href="http://novemberborn.net/colophon">Mark Wubben</a>, and <a href="http://delete.me.uk/">Paul Sowden</a> to create <a href="http://www.3site.eu/jstests/onContent/final.html">his DOMContentLoaded Final Solution</a>.</p>
<p>The work comes with a test page for <a href="http://www.3site.eu/jstests/onContent/final.html">http</a> and <a href="https://server3.phpsoft.it:8111/antrea/">https</a>, and is documented in this function:</p>
<div class="syntax_hilite">
<div id="javascript-10">
<div class="javascript">
<span style="color: #003366; font-weight: bold;">function</span> onContent<span style="color:#006600; font-weight:bold;">&#40;</span>callback<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color: #009900; font-style: italic;">// (C) webreflection.blogspot.com</span><br />
&nbsp; &nbsp; <span style="color: #009900; font-style: italic;">// [please note that this code doesn't work]</span></p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// private scope variable</span></p>
<p>&nbsp;<span style="color: #003366; font-weight: bold;">var</span> IEStringToWrite =&nbsp; <span style="color: #009900; font-style: italic;">// this is IE dedicated string</span></p>
<p>&nbsp; <span style="color: #3366CC;">"&lt;script defer src='//:' onreadystatechange='<br />
&nbsp; (function(element){<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;// if readystate is complete<br />
&nbsp; &nbsp;if(element.readyState === "</span>complete<span style="color: #3366CC;">")</p>
<p>&nbsp; &nbsp; // call the global variable<br />
&nbsp; &nbsp; window.__onContent__();<br />
&nbsp; })(this);<br />
&nbsp; '&gt;&lt;/script&gt;"</span>;</p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// the above string is necessary to use onreadystatechange property</span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// with an undefined page. In this way IE tell us the readyState</span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// of the current document</span></p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// to call callback function IE need a global scope variable</span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// this variable could call one or more callback</span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// then if it's already created we need to call the old callback</span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// then this new callback</span><br />
&nbsp;window.__onContent__ = <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span>oldCallback<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #009900; font-style: italic;">// returns a function that will delete __onContent__</span><br />
&nbsp; <span style="color: #009900; font-style: italic;">// to remove multiple callbacks with different </span><br />
&nbsp; <span style="color: #009900; font-style: italic;">// events and different ways for each browser</span></p>
<p>&nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #009900; font-style: italic;">// clear __onContent__ as generic function</span><br />
&nbsp; &nbsp;window.__onContent__ = <span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<br />
&nbsp; &nbsp;<span style="color: #009900; font-style: italic;">// checks if oldCallback isn't null or undefined</span><br />
&nbsp; &nbsp;<span style="color: #000066; font-weight: bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>oldCallback<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; oldCallback<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color: #009900; font-style: italic;">// call them to preserve the right order</span></p>
<p>&nbsp; &nbsp;callback<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;&nbsp; <span style="color: #009900; font-style: italic;">// call this scope callback function </span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900; font-style: italic;">// (sent calling onContent)</span><br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp; <br />
&nbsp;<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span>window.__onContent__<span style="color:#006600; font-weight:bold;">&#41;</span>; <span style="color: #009900; font-style: italic;">// undefined if is the first time we use __onContent__</span></p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// __onContent__ is my function to use as callback</span></p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// I need to add this function as event</span></p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// Opera 9 and FireFox both support DOMContentLoaded as well as </span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// addEventListener document method</span><br />
&nbsp;<span style="color: #000066; font-weight: bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>document.<span style="color: #006600;">addEventListener</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; document.<span style="color: #006600;">addEventListener</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">"DOMContentLoaded"</span>, __onContent__, <span style="color: #003366; font-weight: bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// if some browser supports addEventListener but doesn't support DOMContentLoaded </span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// event I don't need to care about that because this event will never be fired</span></p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// at the same time if Safari or KDE one day will support DOMContentLoaded </span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// I prefere use this dedicated in-core</span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// event instead of next trick that's quite horrible but works with Safari, </span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// KDE as Opera 8.5 and lower too</span></p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// that's why I don't use an else if but an if ... because the first time </span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// event will be fired __onContent__ </span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// became an empty function ... then calling them twice is not a problem</span></p>
<p>&nbsp;<span style="color: #000066; font-weight: bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span><br />
&nbsp; <span style="color: #009900; font-style: italic;">// Safari and KDE</span><br />
&nbsp; <span style="color: #0066FF;">/WebKit|Khtml/i</span>.<span style="color: #006600;">test</span><span style="color:#006600; font-weight:bold;">&#40;</span>navigator.<span style="color: #006600;">userAgent</span><span style="color:#006600; font-weight:bold;">&#41;</span> ||</p>
<p>&nbsp; <span style="color: #009900; font-style: italic;">// Opera less than 9</span><br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#40;</span>window.<span style="color: #006600;">opera</span> &amp;&amp; parseInt<span style="color:#006600; font-weight:bold;">&#40;</span>window.<span style="color: #006600;">opera</span>.<span style="color: #006600;">version</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>&amp;lt;<span style="color:#800000;">9</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp;<span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; <span style="color: #009900; font-style: italic;">// runtime anonymous function</span><br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span></p>
<p>&nbsp; &nbsp;<span style="color: #009900; font-style: italic;">// checks if document.readyState is loaded or complete</span><br />
&nbsp; &nbsp;<span style="color: #0066FF;">/loaded|complete/</span>.<span style="color: #006600;">test</span><span style="color:#006600; font-weight:bold;">&#40;</span>document.<span style="color: #006600;">readyState</span><span style="color:#006600; font-weight:bold;">&#41;</span> ?</p>
<p>&nbsp; &nbsp; <span style="color: #009900; font-style: italic;">// then call __onContent__ , stopping internal loop</span><br />
&nbsp; &nbsp; window.__onContent__<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span> :</p>
<p>&nbsp; &nbsp; <span style="color: #009900; font-style: italic;">// or loops itself with the faster timeout</span><br />
&nbsp; &nbsp; setTimeout<span style="color:#006600; font-weight:bold;">&#40;</span>arguments.<span style="color: #006600;">callee</span>, <span style="color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>; <br />
&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</p>
<p>&nbsp;<span style="color: #009900; font-style: italic;">// at this point I've setted the DOMContentLoaded event for every browser</span><br />
&nbsp;<span style="color: #009900; font-style: italic;">// but not for Inernet Explorer.</span><br />
&nbsp;<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #0066FF;">/MSIE/i</span>.<span style="color: #006600;">test</span><span style="color:#006600; font-weight:bold;">&#40;</span>navigator.<span style="color: #006600;">userAgent</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></p>
<p>&nbsp; <span style="color: #009900; font-style: italic;">// I can write dedicated string</span><br />
&nbsp; document.<span style="color: #006600;">write</span><span style="color:#006600; font-weight:bold;">&#40;</span>IEStringToWrite<span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
<span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
&nbsp;</div>
</div>
</div>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=luo1Gwyw"><img src="http://feeds.feedburner.com/~f/ajaxian?i=luo1Gwyw" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=aQvBKJJ3"><img src="http://feeds.feedburner.com/~f/ajaxian?i=aQvBKJJ3" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=TJtOXhwL"><img src="http://feeds.feedburner.com/~f/ajaxian?i=TJtOXhwL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=LNNtLH7H"><img src="http://feeds.feedburner.com/~f/ajaxian?i=LNNtLH7H" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/domcontentloadednext/feed/</wfw:commentRSS>
</item>
<item>
<title>Using the Eclipse AJAX Toolkit Framework (ATF) Webinar</title>
<link>http://ajaxian.com/archives/using-the-eclipse-ajax-toolkit-framework-atf-webinar</link>
<comments>http://ajaxian.com/archives/using-the-eclipse-ajax-toolkit-framework-atf-webinar#comments</comments>
<pubDate>Sat, 25 Nov 2006 04:04:00 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Presentation</category>
<guid>http://ajaxian.com/archives/using-the-eclipse-ajax-toolkit-framework-atf-webinar</guid>
<description><![CDATA[ We don't normally post webinars, but thought "what the hell it's Friday".
On November 30, the Eclipse foundation will be hosting a 1 hour webinar titled Using the Eclipse Ajax Toolkit Framework (ATF).
Eclipse ATF provides exemplary tools for creating and debugging Ajax applications. These tools include enhanced JavaScript editing features such as edit-time syntax checking, [...]]]></description>
<content:encoded><![CDATA[ <p>We don't normally post webinars, but thought "what the hell it's Friday".</p>
<p>On November 30, the Eclipse foundation will be hosting a 1 hour webinar titled <a href="http://www.eclipse.org/community/webinars2006.php">Using the Eclipse Ajax Toolkit Framework (ATF)</a>.</p>
<p>Eclipse ATF provides exemplary tools for creating and debugging Ajax applications. These tools include enhanced JavaScript editing features such as edit-time syntax checking, an embedded DOM browser, CSS Tools, JavaScript debugger, a JavaScript console, and an embedded Mozilla web browser. This webinar will demonstrate how to use ATF to create, debug, and deploy an Ajax application on both Apache and J2EE servers.</p>
<p>Register by emailing <a href="mailto:webinar-atf@eclipse.org">webinar-atf@eclipse.org</a></p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=Qh1EpBSt"><img src="http://feeds.feedburner.com/~f/ajaxian?i=Qh1EpBSt" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=SHKUMbcJ"><img src="http://feeds.feedburner.com/~f/ajaxian?i=SHKUMbcJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=xZxME2vY"><img src="http://feeds.feedburner.com/~f/ajaxian?i=xZxME2vY" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=ZLlrYLtO"><img src="http://feeds.feedburner.com/~f/ajaxian?i=ZLlrYLtO" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/using-the-eclipse-ajax-toolkit-framework-atf-webinar/feed/</wfw:commentRSS>
</item>
<item>
<title>Another trick to allow Array subclasses</title>
<link>http://ajaxian.com/archives/another-trick-to-allow-array-subclasses</link>
<comments>http://ajaxian.com/archives/another-trick-to-allow-array-subclasses#comments</comments>
<pubDate>Fri, 24 Nov 2006 15:59:15 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Tip</category>
<guid>http://ajaxian.com/archives/another-trick-to-allow-array-subclasses</guid>
<description><![CDATA[ Dean Edwards talked about his hack that got us the ability to subclass the Array object in JavaScript.
Hedger Wang has a new hack that uses window.createPopup instead of an iframe to for IE to fix some issues.
If you take a view source to see what is in there, you get the gem:
;&#40;function&#40;&#41;&#123;
&#160; &#160; &#160; &#160; [...]]]></description>
<content:encoded><![CDATA[ <p><a href="http://dean.edwards.name/weblog/2006/11/hooray/">Dean Edwards</a> talked about his hack that got us the ability to subclass the Array object in JavaScript.</p>
<p><a href="http://www.hedgerwow.com/360/dhtml/js-array2.html">Hedger Wang has a new hack</a> that uses <a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/createpopup.asp">window.createPopup</a> instead of an iframe to for IE to fix some issues.</p>
<p>If you take a view source to see what is in there, you get the gem:</p>
<div class="syntax_hilite">
<div id="javascript-12">
<div class="javascript">
;<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>!window.<span style="color: #006600;">createPopup</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color: #000066; font-weight: bold;">return</span><span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> fs = <span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066FF;">/==/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> Array2 = parent.<span style="color: #006600;">Array2</span> ;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> p1 = Array.<span style="color: #006600;">prototype</span> ;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> p2 = Array2.<span style="color: #006600;">prototype</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span><span style="color:#006600; font-weight:bold;">&#40;</span>i <span style="color: #000066; font-weight: bold;">in</span> p2 <span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p1<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> = p2<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent.<span style="color: #006600;">Array2</span> = Array;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parent.<span style="color: #006600;">document</span>.<span style="color: #006600;">title</span> = <span style="color: #3366CC;">'Array2 is ready'</span>;<span style="color: #009900; font-style: italic;">/*debug msg*/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066FF;">/==/</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; document.<span style="color: #006600;">title</span> = <span style="color: #3366CC;">'Prepare Array2'</span>;<span style="color: #009900; font-style: italic;">/*debug msg*/</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; fs = <span style="color:#006600; font-weight:bold;">&#40;</span>fs + <span style="color: #3366CC;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color: #006600;">split</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">'/==/'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; window.<span style="color: #006600;">createPopup</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color: #006600;">document</span>.<span style="color: #006600;">body</span>.<span style="color: #006600;">innerHTML</span> = <span style="color: #3366CC;">'&lt;img src=&quot;null&quot; onerror=&quot;'</span> +&nbsp; fs + <span style="color: #3366CC;">'&quot; /&gt;'</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</p>
<p><span style="color: #003366; font-weight: bold;">var</span> Array2 = <span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Array2.<span style="color: #006600;">prototype</span> = <span style="color: #003366; font-weight: bold;">new</span> Array;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Array2.<span style="color: #006600;">prototype</span>.<span style="color: #006600;">bar</span> = <span style="color: #003366; font-weight: bold;">function</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">alert</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #3366CC;">"this.bar() --&gt; This.Length="</span> + <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #006600;">length</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span><br />
&nbsp;</div>
</div>
</div>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=SCY03YAX"><img src="http://feeds.feedburner.com/~f/ajaxian?i=SCY03YAX" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=sBDwsM9P"><img src="http://feeds.feedburner.com/~f/ajaxian?i=sBDwsM9P" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=dlKtpJWr"><img src="http://feeds.feedburner.com/~f/ajaxian?i=dlKtpJWr" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=HXHKOiMI"><img src="http://feeds.feedburner.com/~f/ajaxian?i=HXHKOiMI" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/another-trick-to-allow-array-subclasses/feed/</wfw:commentRSS>
</item>
<item>
<title>Dropboks: File Storage on One Page</title>
<link>http://ajaxian.com/archives/dropboks-file-storage-on-one-page</link>
<comments>http://ajaxian.com/archives/dropboks-file-storage-on-one-page#comments</comments>
<pubDate>Fri, 24 Nov 2006 15:51:41 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Prototype</category>
<category>Showcase</category>
<guid>http://ajaxian.com/archives/dropboks-file-storage-on-one-page</guid>
<description><![CDATA[ Dropboks is a single page application build on Prototype and friends, that allows you to simply upload files for safe keeping.
The application is ad free, and survives on user donations. They do a good job at letting you use it pre-signup, and giving good info via tooltips.
]]></description>
<content:encoded><![CDATA[ <p><a href="http://www.dropboks.com/">Dropboks</a> is a single page application build on Prototype and friends, that allows you to simply upload files for safe keeping.</p>
<p>The application is ad free, and survives on user donations. They do a good job at letting you use it pre-signup, and giving good info via tooltips.</p>
<p><a href="http://www.dropboks.com/"><img src="http://ajaxian.com/wp-content/images/dropboks.png" alt="Dropboks" border="0" width="491" height="447"/></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=7bnp189c"><img src="http://feeds.feedburner.com/~f/ajaxian?i=7bnp189c" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=IvtaWoMQ"><img src="http://feeds.feedburner.com/~f/ajaxian?i=IvtaWoMQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=b96Y4b2A"><img src="http://feeds.feedburner.com/~f/ajaxian?i=b96Y4b2A" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=ZVgVpc8A"><img src="http://feeds.feedburner.com/~f/ajaxian?i=ZVgVpc8A" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/dropboks-file-storage-on-one-page/feed/</wfw:commentRSS>
</item>
<item>
<title>Spelling Cow: JS Spell Checker</title>
<link>http://ajaxian.com/archives/spelling-cow-js-spell-checker</link>
<comments>http://ajaxian.com/archives/spelling-cow-js-spell-checker#comments</comments>
<pubDate>Fri, 24 Nov 2006 15:46:11 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<guid>http://ajaxian.com/archives/spelling-cow-js-spell-checker</guid>
<description><![CDATA[ Spelling Cow allows you add a script tag, and spell check is enabled on your website. There are also some variables you can tweak too if advanced features are needed.
This means that you can add spell checking to your applications, but as the latest browsers have added inline spell check, is there use to it?
]]></description>
<content:encoded><![CDATA[ <p><a href="http://www.spellingcow.com/">Spelling Cow</a> allows you add a script tag, and spell check is enabled on your website. There are also some variables you can tweak too if advanced features are needed.</p>
<p>This means that you can add spell checking to your applications, but as the latest browsers have added inline spell check, is there use to it?</p>
<p><a href="http://www.spellingcow.com/"><img src="http://ajaxian.com/wp-content/images/spellingcow.png" alt="Spelling Cow" border="0" width="438" height="213"/></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=dBmR5JBn"><img src="http://feeds.feedburner.com/~f/ajaxian?i=dBmR5JBn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=GL67PTiz"><img src="http://feeds.feedburner.com/~f/ajaxian?i=GL67PTiz" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=PM8SsmlP"><img src="http://feeds.feedburner.com/~f/ajaxian?i=PM8SsmlP" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=038oiFok"><img src="http://feeds.feedburner.com/~f/ajaxian?i=038oiFok" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/spelling-cow-js-spell-checker/feed/</wfw:commentRSS>
</item>
<item>
<title>CSS Tab Designer</title>
<link>http://ajaxian.com/archives/css-tab-designer</link>
<comments>http://ajaxian.com/archives/css-tab-designer#comments</comments>
<pubDate>Fri, 24 Nov 2006 15:40:05 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>CSS</category>
<guid>http://ajaxian.com/archives/css-tab-designer</guid>
<description><![CDATA[ Now we are getting niche. A tool that lets you design CSS tabs:
With the CSS Tab Designer, you can:
Quickly design your list visually.
Choose from a variety of styles/colors (60+ different designs/colors supported).
Generate strict xhtml compliant code.
]]></description>
<content:encoded><![CDATA[ <p>Now we are getting niche. A tool that lets you <a href="http://www.highdots.com/css-tab-designer/">design CSS tabs</a>:</p>
<p>With the CSS Tab Designer, you can: </p>
<ul>
<li>Quickly design your list visually.</li>
<li>Choose from a variety of styles/colors (60+ different designs/colors supported).</li>
<li>Generate strict xhtml compliant code.</li>
</ul>
<p><a href="http://www.highdots.com/css-tab-designer/"><img src="http://www.highdots.com/static/css-list/images/vertical-tabs.png" border="0" /></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=J8dJMlWf"><img src="http://feeds.feedburner.com/~f/ajaxian?i=J8dJMlWf" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=3ahtUcPZ"><img src="http://feeds.feedburner.com/~f/ajaxian?i=3ahtUcPZ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=rLuj7mAO"><img src="http://feeds.feedburner.com/~f/ajaxian?i=rLuj7mAO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=S5YYTws3"><img src="http://feeds.feedburner.com/~f/ajaxian?i=S5YYTws3" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/css-tab-designer/feed/</wfw:commentRSS>
</item>
<item>
<title>Open-jACOB Draw2D</title>
<link>http://ajaxian.com/archives/open-jacob-draw2d</link>
<comments>http://ajaxian.com/archives/open-jacob-draw2d#comments</comments>
<pubDate>Thu, 23 Nov 2006 16:44:35 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Library</category>
<category>Showcase</category>
<guid>http://ajaxian.com/archives/open-jacob-draw2d</guid>
<description><![CDATA[ Open-jACOB Draw2D is a JavaScript library that allows you to create drawings and diagrams.
The User interface allows interactive drawing by using your standard browser.
No additional software; no third party plug ins. Just run it and use it.
Open-jACOB Draw2D is the graph component of the Open-jACOB online
Workflow editor. The purpose of this experiment is to see [...]]]></description>
<content:encoded><![CDATA[ <p><a href="http://www.openjacob.org/draw2d.html">Open-jACOB Draw2D</a> is a JavaScript library that allows you to create drawings and diagrams.</p>
<p>The User interface allows interactive drawing by using your standard browser.<br />
No additional software; no third party plug ins. Just run it and use it.</p>
<p>Open-jACOB Draw2D is the graph component of the Open-jACOB online<br />
Workflow editor. The purpose of this experiment is to see if a Visio-type workflow<br />
editor tool could be developed in a web browser - It is possible.</p>
<p>Check out an <a href="http://www.openjacob.org/draw2d/simple_interactive/index.html">interactive demo</a>.</p>
<p><a href="http://www.openjacob.org/draw2d.html"><img src="http://www.openjacob.org/images/draw2d/screen1.png" border="0" width="414" height="215" /></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=Yd5t6AMQ"><img src="http://feeds.feedburner.com/~f/ajaxian?i=Yd5t6AMQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=2P9Evaik"><img src="http://feeds.feedburner.com/~f/ajaxian?i=2P9Evaik" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=GexsRwE8"><img src="http://feeds.feedburner.com/~f/ajaxian?i=GexsRwE8" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=IySCRpjz"><img src="http://feeds.feedburner.com/~f/ajaxian?i=IySCRpjz" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/open-jacob-draw2d/feed/</wfw:commentRSS>
</item>
<item>
<title>Google Pages Adds Nice Image Editing</title>
<link>http://ajaxian.com/archives/google-pages-adds-nice-image-editing</link>
<comments>http://ajaxian.com/archives/google-pages-adds-nice-image-editing#comments</comments>
<pubDate>Thu, 23 Nov 2006 16:15:04 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Showcase</category>
<category>Google</category>
<category>UI</category>
<guid>http://ajaxian.com/archives/google-pages-adds-nice-image-editing</guid>
<description><![CDATA[ When I heard about JotSpot heading to the Googleplex I was excited to know that Abe Fettig (Jot) would be teaming up with the brains at Google Pages, and I can't wait to see what happens in the world of WYSIWYG editing tools.
Google Pages just released a few features, and one of them is an [...]]]></description>
<content:encoded><![CDATA[ <p>When I heard about JotSpot heading to the Googleplex I was excited to know that Abe Fettig (Jot) would be teaming up with the brains at Google Pages, and I can't wait to see what happens in the world of WYSIWYG editing tools.</p>
<p><a href="http://pages.google.com/">Google Pages</a> just released a few features, and one of them is an improved process for working with images.</p>
<p>Firstly, the way you get photos up is simple and clean, but when when you have an image, you can click on it and you are shown a bunch of tools that allow you to manipulate the image inline, right there on the page.</p>
<p><a href="http://pages.google.com/"><img src="http://ajaxian.com/wp-content/images/googlepagesimageedit.png" alt="Google Pages Image Editing" border="0" width="428" height="418"/></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=ixQAR1Dv"><img src="http://feeds.feedburner.com/~f/ajaxian?i=ixQAR1Dv" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=i8aOiI8S"><img src="http://feeds.feedburner.com/~f/ajaxian?i=i8aOiI8S" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=P5vv2xOQ"><img src="http://feeds.feedburner.com/~f/ajaxian?i=P5vv2xOQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=L0n3Kku6"><img src="http://feeds.feedburner.com/~f/ajaxian?i=L0n3Kku6" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/google-pages-adds-nice-image-editing/feed/</wfw:commentRSS>
</item>
<item>
<title>qooxdoo 0.6.2 Released</title>
<link>http://ajaxian.com/archives/qooxdoo-062-released</link>
<comments>http://ajaxian.com/archives/qooxdoo-062-released#comments</comments>
<pubDate>Thu, 23 Nov 2006 15:39:07 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Library</category>
<guid>http://ajaxian.com/archives/qooxdoo-062-released</guid>
<description><![CDATA[ qooxdoo has a new release that adds support for Webkit.
As mentioned above and already announced in our developer blog, qooxdoo now includes support for WebKit. We expect to fully support the next major version Safari 3.0 which will be based on the current development of WebKit. There is only limited support for Safari in its [...]]]></description>
<content:encoded><![CDATA[ <p><a href="http://news.qooxdoo.org/qooxdoo-062-released">qooxdoo has a new release that adds support for Webkit</a>.</p>
<blockquote><p>
As mentioned above and already announced in our developer blog, qooxdoo now includes support for WebKit. We expect to fully support the next major version Safari 3.0 which will be based on the current development of WebKit. There is only limited support for Safari in its current version 2.0.4, though. Reason is, that Safari 2.0 still has many bugs that can hardly be worked around. Luckily, many of those bugs are already fixed in the nightly builds of WebKit. Besides the various bugs, Safari 2.0's JavaScript engine and its execution speed is not competitive with respect to the latest versions of the other major browsers (Firefox 2.0, IE7, Opera 9). Good news is, that the current builds of WebKit are tremendeously faster than Safari 2.0, approximately by a factor of 7-8 for a typical qooxdoo demo.
</p></blockquote>
<p>Check out the <a href="http://qooxdoo.org/about/release_notes">release notes</a> for full details on changes in this release.</p>
<p>Some of them are:</p>
<ul>
<li>Made qooxdoo completely XHTML compatible. Replaced all uppercase tag names with their lowercase variant. </li>
<li>Improved NativeWindow to support the querying of the load state. Added events for “load” and “close”.</li>
<li>Modified XmlHttpRequest and related APIs to <a href="http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx">respect the latest suggestions from Microsoft.</a></li>
<li>Added IframeManager to manage visible iframes in order to protect the application events of the “surrounding” document from getting interrupted while switching document context (particularly drag &#038; drop over embedded iframes)</li>
<li>Added Resizer widget to allow of customization regarding the dimensions of any widget by the user.</li>
</ul>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=tfn0qIAh"><img src="http://feeds.feedburner.com/~f/ajaxian?i=tfn0qIAh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=QJRQS3cR"><img src="http://feeds.feedburner.com/~f/ajaxian?i=QJRQS3cR" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=HSSmg2P1"><img src="http://feeds.feedburner.com/~f/ajaxian?i=HSSmg2P1" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=uSZsJs68"><img src="http://feeds.feedburner.com/~f/ajaxian?i=uSZsJs68" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/qooxdoo-062-released/feed/</wfw:commentRSS>
</item>
<item>
<title>Lollygag: Latest non-Atlas .NET Framework</title>
<link>http://ajaxian.com/archives/lollygag-latest-non-atlas-net-framework</link>
<comments>http://ajaxian.com/archives/lollygag-latest-non-atlas-net-framework#comments</comments>
<pubDate>Thu, 23 Nov 2006 14:00:50 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>JavaScript</category>
<category>Library</category>
<category>Toolkit</category>
<category>.NET</category>
<guid>http://ajaxian.com/archives/lollygag-latest-non-atlas-net-framework</guid>
<description><![CDATA[ The Lollygag framework is a new Ajax framework for .NET.
As Steve the author put it:
We attended the first Ajax Experience conference in San Francisco and we got super excited about the potential for building Ajax applications. Since we have a Microsoft .NET background, we planned to start building Ajax applications using Microsofts Atlas framework. However, [...]]]></description>
<content:encoded><![CDATA[ <p>The <a href="http://lollygagframework.com/">Lollygag framework</a> is a new Ajax framework for .NET.</p>
<p>As Steve the author put it:</p>
<blockquote><p>
We attended the first Ajax Experience conference in San Francisco and we got super excited about the potential for building Ajax applications. Since we have a Microsoft .NET background, we planned to start building Ajax applications using Microsofts Atlas framework. However, we quickly encountered several serious issues with Atlas. Doing simple things in Atlas, such as database access and form validation, turned out to be really difficult. We were also disappointed to discover that Microsoft has no plans to support its client-side Atlas framework in the immediate future.</p>
<p>We built the Lollygag framework in order to build true Ajax applications in the .NET environment. We wanted to build single page Web applications that never perform postbacks. All updates are performed through Ajax calls to the web server.
</p></blockquote>
<p><b>Features</b></p>
<ul>
<li>Powerful Widget Framework: The Lollygag framework includes a rich set of client-side widgets that you can use to display database data, perform form validation, and create rich animations. You declare widgets in a page in exactly the same way as you declare HTML tags.</li>
<li>Autocomplete Support: When you declare Lollygag widgets in a page, you get full autocomplete support while you type. To get autocomplete support, you must use an XML aware development environment such as Microsoft Visual Studio .NET.</li>
<li>Declarative Database Access: Accessing database data with the Lollygag framework is easy. You can bind client-side widgets directly to data exposed by a database or you can bind widgets to data exposed by a business object.</li>
<li>Secure Form Validation: When taking advantage of the Lollygag framework, you specify how a form field is validated only once. The validation is automatically applied on both the server and the client. Unlike other frameworks that only provide validation on the client, the Lollygag framework prevents malicious users from bypassing client-side validation and submitting data directly to the server.</li>
<li>Rich Animation Framework: Lollygag includes an entire animation framework. You can take advantage of animations to create different effects such as fades and wipes.</li>
<li>Cross-Browser Support: The full Lollygag framework works on the latest versions of Internet Explorer, Firefox, Safari, and Opera.</li>
<li>Automatic JavaScript Compression: The Lollygag framework compresses all JavaScript sent to the browser automatically. Any custom JavaScript code that you write as a developer is also compressed automatically.</li>
<li>Powered by .NET: The server-side portion of Lollygag is built on the Microsoft .NET 2.0 Framework. You can build server-side business objects using standard .NET languages such as C# and VB.NET. Lollygag client-side widgets can consume data exposed through server-side objects.</li>
</ul>
<p><b>Hello World</b></p>
<div class="syntax_hilite">
<div id="xml-14">
<div class="xml">
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;</span>?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">"1.0"</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">"utf-8"</span> ?<span style="font-weight: bold; color: black;">&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;</span>?xml-stylesheet <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text/xsl"</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">"/lollygagSite/lollygagframework/0_1/lollygag.xsl"</span>?<span style="font-weight: bold; color: black;">&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;lolly</span> :application <span style="color: #000066;">title</span>=<span style="color: #ff0000;">"Hello World"</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">"http://www.w3.org/1999/xhtml"</span> xmlns:<span style="color: #000066;">lolly</span>=<span style="color: #ff0000;">"http://lollygagframework.com/core"</span><span style="font-weight: bold; color: black;">&gt;</span></span><br />
&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;lolly</span> :button <span style="color: #000066;">id</span>=<span style="color: #ff0000;">"btnSumit"</span> <span style="color: #000066;">label</span>=<span style="color: #ff0000;">"Click Here!"</span> <span style="color: #000066;">onClick</span>=<span style="color: #ff0000;">"alert('Hello!')"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span><br />
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/lolly<span style="font-weight: bold; color: black;">&gt;</span></span></span><br />
&nbsp;</div>
</div>
</div>
<p><b>Resources</b></p>
<p>How does it compare to Atlas? <a href="http://lollygagframework.com/Articles/LollygagVersusAtlas/Default.htm">Read their thoughts on the matter</a>.</p>
<p><a href="http://lollygagframework.com/Demos/default.htm">Demos</a></p>
<p><a href="http://lollygagframework.com/SampleApplications/Forums/forums.xml">Sample Application</a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=2QC8qukU"><img src="http://feeds.feedburner.com/~f/ajaxian?i=2QC8qukU" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=lsoztS0a"><img src="http://feeds.feedburner.com/~f/ajaxian?i=lsoztS0a" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=WuuxjGjM"><img src="http://feeds.feedburner.com/~f/ajaxian?i=WuuxjGjM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=M7Gaypk4"><img src="http://feeds.feedburner.com/~f/ajaxian?i=M7Gaypk4" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/lollygag-latest-non-atlas-net-framework/feed/</wfw:commentRSS>
</item>
<item>
<title>Google Book Search gets an Ajax upgrade</title>
<link>http://ajaxian.com/archives/google-book-search-gets-an-ajax-upgrade</link>
<comments>http://ajaxian.com/archives/google-book-search-gets-an-ajax-upgrade#comments</comments>
<pubDate>Thu, 23 Nov 2006 00:03:44 +0000</pubDate>
<dc:creator>Dion Almaer</dc:creator>
<category>Front Page</category>
<category>Showcase</category>
<category>Google</category>
<guid>http://ajaxian.com/archives/google-book-search-gets-an-ajax-upgrade</guid>
<description><![CDATA[ Nathan Naze and his team at Google have upgraded Google Books:
Zoom in on text and images. Here's a cool full-page sketch of a ship from an 1898 book on steam navigation. Looking for something less dated? Perhaps this colorful page of a room from a book on interior design. Want a better look? You can [...]]]></description>
<content:encoded><![CDATA[ <p>Nathan Naze and his team at Google have upgraded <a href="http://books.google.com/">Google Books</a>:</p>
<blockquote>
<ul>
<li><strong>Zoom in on text and images.</strong> Here's <a href="http://books.google.com/books?vid=HARVARD:32044020180790&#038;id=7X-I9105PAkC&#038;pg=PA109#PRA2-PA109,M1">a cool full-page sketch of a ship</a> from an 1898 book on <a href="http://books.google.com/books?vid=HARVARD:32044020180790&amp;id=7X-I9105PAkC">steam navigation</a>. Looking for something less dated? Perhaps this <a href="http://books.google.com/books?vid=ISBN1564969584&#038;id=F68COamQRH0C&#038;pg=PA25&#038;lpg=PA25&#038;sig=8k-utjCZ5wwUmWMPlMLIaDjJ4Ig#PPA25,M1">colorful page of a room</a> from <a href="http://books.google.com/books?vid=ISBN1564969584&#038;id=F68COamQRH0C">a book on interior design</a>. Want a better look? You can now zoom in and out &#8212; just click on the <img src="http://photos1.blogger.com/blogger/2855/3883/1600/plus.gif" style="padding: 0px; border: 0px" alt="zoom in" border="0" height="14" width="14"/> and <img alt="zoom out" src="http://photos1.blogger.com/blogger/2855/3883/1600/minus.gif" style="padding: 0px; border: 0px" border="0" height="14" width="14"/> buttons. Play with it until you find a size you like.</li>
<li><strong>One book, one web page.</strong> No more reloads! In one-page mode (just click the <img alt="one page" src="http://photos1.blogger.com/blogger/2855/3883/1600/onepage.gif" style="padding: 0px; border: 0px" border="0" height="14" width="9"/> button), pages appear one below the other, like a scroll of paper. For <a href="http://books.google.com/googlebooks/screenshots.html#fullview">full-view</a> books, there's also a two-page mode (<img alt="two page button" src="http://photos1.blogger.com/blogger/2855/3883/1600/twopage2.gif" style="padding: 0px; border: 0px" border="0" height="14" width="19"/>) in which pages appear side by side, just like in a physical book (perfect for <a href="http://books.google.com/books?vid=ISBN9064503125&#038;id=NkST-eA7uicC&#038;pg=RA12-PA110&#038;lpg=RA12-PA110&#038;sig=oP4PLDRpPGpbo6jBg1qpzOoksjc#PPA51,M2">two-page images</a>). In both modes, you'll be able to use <img src="http://books.google.com/googlebooks/page_nav_previous.gif" style="padding: 0px; border: 0px" alt="previous page button" border="0" height="19" width="19"/> and <img src="http://books.google.com/googlebooks/page_nav_next.gif" style="padding: 0px; border: 0px" alt="next page button" border="0" height="19" width="19"/> to turn pages.</li>
<li><strong>Scroll, scroll, scroll your book&#8230;</strong> using the scrollbar or your mouse wheel, or by dragging (in most browsers, you'll see a <img src="http://photos1.blogger.com/blogger/2855/3883/1600/hand2.gif" style="padding: 0px; border: 0px" border="0" height="16" width="17" alt="hand"/>). You can also use the keyboard (try the spacebar, page up, page down, and the arrow keys). Or you can click on a link in the table of contents or your search results to jump right to that page (like <a href="http://books.google.com/books?vid=OCLC01581436&amp;id=EM6nHWWQ3TIC&amp;pg=PP10">this photo</a> from the 1906 book <a href="http://books.google.com/books?vid=OCLC01581436&amp;id=EM6nHWWQ3TIC"><em>Geronimo's Story of His Life</em></a>).</li>
<li><strong>This page was made for reading.</strong> We've tried to tidy up the clutter to leave as much room as possible for what's important &#8212; the book. We've put all the information about the book in a scrollable side menu. Still not enough room? You can put the screen in fullscreen mode with <img src="http://books.google.com/googlebooks/images/fullscreen.gif" style="padding: 0px; border: 0px" alt="fullscreen button" border="0" height="15" width="17"/>, so you can use the whole window for browsing. Try it with a nice illustrated book of <a href="http://books.google.com/books?vid=NYPL:33433068198005&#038;id=MPDMpD2w_2gC&#038;pg=PA65#PPP18,M2">Celtic fairy tales</a> or, for some lighter reading, <a href="http://books.google.com/books?vid=ISBN3540212663&amp;id=5FZBS0JH9lkC&amp;pg=PP1&amp;lpg=PP1&amp;ots=uNqKSoMhkt&amp;&amp;sig=MjS0J55JV4LYrKN7z_RvUf-sEx4#PPA49,M1">electromagnetic wave theory</a>.</li>
</ul>
</blockquote>
<p>There are keystrokes here too, such as hitting space to scroll down (moving down smoothly). It is nice to see more and more unification to Google apps these days. When you use Reader it feels like Mail, etc.</p>
<p>One question is, where are the GWT apps? :)</p>
<p><a href="http://books.google.com/"><img src="http://ajaxian.com/wp-content/images/googlebooksearch.png" alt="Google Book Search" border="0" width="580" height="391"/></a>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/ajaxian?a=kpBF2m8t"><img src="http://feeds.feedburner.com/~f/ajaxian?i=kpBF2m8t" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=KWMuT6ZN"><img src="http://feeds.feedburner.com/~f/ajaxian?i=KWMuT6ZN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=5HzTTFHS"><img src="http://feeds.feedburner.com/~f/ajaxian?i=5HzTTFHS" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ajaxian?a=eLs8y2a1"><img src="http://feeds.feedburner.com/~f/ajaxian?i=eLs8y2a1" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRSS>http://ajaxian.com/archives/google-book-search-gets-an-ajax-upgrade/feed/</wfw:commentRSS>
</item>
</channel>
</rss>

View File

@ -1,29 +0,0 @@
<opml version="1.0">
<head>
<title>Thunderbird OPML-Export</title>
<dateCreated>Fri, 08 Dec 2006 12:00:29 GMT</dateCreated>
</head>
<body>
<outline title="AJAX Matters Blog" text="AJAX Matters Blog" type="rss" version="RSS" xmlUrl="http://www.ajaxmatters.com/blog/feed/atom/" htmlUrl="http://www.ajaxmatters.com/blog"/>
<outline title="Ajaxian" text="Ajaxian" type="rss" version="RSS" xmlUrl="http://feeds.feedburner.com/ajaxian" htmlUrl="http://ajaxian.com"/>
<outline title="Coding In Paradise" text="Coding In Paradise" type="rss" version="RSS" xmlUrl="http://www.codinginparadise.org/weblog/atom.xml" htmlUrl="http://codinginparadise.org/weblog/"/>
<outline title="dojo.foo" text="dojo.foo" type="rss" version="RSS" xmlUrl="http://blog.dojotoolkit.org/feed" htmlUrl="http://blog.dojotoolkit.org"/>
<outline title="Firebug" text="Firebug" type="rss" version="RSS" xmlUrl="http://www.getfirebug.com/blog/?feed=rss2" htmlUrl="http://www.getfirebug.com/blog"/>
<outline title="from __future__ import *" text="from __future__ import *" type="rss" version="RSS" xmlUrl="http://bob.pythonmac.org/feed/atom/" htmlUrl="http://bob.pythonmac.org"/>
<outline title="Google Web Toolkit Blog" text="Google Web Toolkit Blog" type="rss" version="RSS" xmlUrl="http://googlewebtoolkit.blogspot.com/atom.xml" htmlUrl="http://googlewebtoolkit.blogspot.com"/>
<outline title="Jack Slocum's Blog" text="Jack Slocum's Blog" type="rss" version="RSS" xmlUrl="http://www.jackslocum.com/blog/feed/" htmlUrl="http://www.jackslocum.com/blog"/>
<outline title="JSR 168, WSRP, Portlets &amp; Enterprise Portal" text="JSR 168, WSRP, Portlets &amp; Enterprise Portal" type="rss" version="RSS" xmlUrl="http://portlets.blogspot.com/atom.xml" htmlUrl="http://portlets.blogspot.com"/>
<outline title="Monologue" text="Monologue" type="rss" version="RSS" xmlUrl="http://www.go-mono.com/monologue/index.rss" htmlUrl="http://www.go-mono.com/monologue/"/>
<outline title="OSNews" text="OSNews" type="rss" version="RSS" xmlUrl="http://osnews.com/files/recent.rdf" htmlUrl="http://www.osnews.com/"/>
<outline title="qooxdoo" text="qooxdoo" type="rss" version="RSS" xmlUrl="http://feeds.feedburner.com/qooxdoo/blog/content" htmlUrl="http://blog.qooxdoo.org"/>
<outline title="qooxdoo" text="qooxdoo" type="rss" version="RSS" xmlUrl="http://feeds.feedburner.com/qooxdoo/news/content" htmlUrl="http://news.qooxdoo.org"/>
<outline title="subbu.org" text="subbu.org" type="rss" version="RSS" xmlUrl="http://feeds.feedburner.com/SubbuDotOrg" htmlUrl="http://www.subbu.org/"/>
<outline title="Surfin' Safari" text="Surfin' Safari" type="rss" version="RSS" xmlUrl="http://webkit.org/blog/?feed=rss2" htmlUrl="http://webkit.org/blog"/>
<outline title="Thomas Much's Weblog" text="Thomas Much's Weblog" type="rss" version="RSS" xmlUrl="http://www.snailshell.de/blog/rss.xml" htmlUrl="http://www.snailshell.de/blog/index.html"/>
<outline title="UXmatters" text="UXmatters" type="rss" version="RSS" xmlUrl="http://www.uxmatters.com/atom.xml" htmlUrl="http://dev.uxmatters.com/"/>
<outline title="WebKit" text="WebKit" type="rss" version="RSS" xmlUrl="http://cia.navi.cx/stats/project/WebKit/.rss" htmlUrl="http://webkit.org"/>
<outline title="webmagics" text="webmagics" type="rss" version="RSS" xmlUrl="http://feeds.feedburner.com/webmagics" htmlUrl="http://journal.webmagics.net/"/>
<outline title="Yahoo! User Interface Blog" text="Yahoo! User Interface Blog" type="rss" version="RSS" xmlUrl="http://feeds.yuiblog.com/YahooUserInterfaceBlog" htmlUrl="http://yuiblog.com/blog"/>
<outline title="Zimbra - Blog" text="Zimbra - Blog" type="rss" version="RSS" xmlUrl="http://www.zimbra.com/blog/atom.xml" htmlUrl="http://www.zimbra.com/blog/"/>
</body>
</opml>

View File

@ -1,278 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><!-- generator="wordpress/2.0.5" --><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>qooxdoo Blog</title>
<link>http://blog.qooxdoo.org</link>
<description>The blog of the qooxdoo developers</description>
<pubDate>Sun, 26 Nov 2006 15:53:14 +0000</pubDate>
<generator>http://wordpress.org/?v=2.0.5</generator>
<language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/qooxdoo/blog/content" type="application/rss+xml" /><feedburner:emailServiceId>384287</feedburner:emailServiceId><item>
<title>Safari support for qooxdoo coming</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/48836959/safari-support-for-qooxdoo-coming</link>
<comments>http://blog.qooxdoo.org/safari-support-for-qooxdoo-coming#comments</comments>
<pubDate>Mon, 13 Nov 2006 14:46:19 +0000</pubDate>
<dc:creator>Fabian Jakobs</dc:creator>
<category>Announcements</category>
<category>Safari</category>
<category>Technical</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/safari-support-for-qooxdoo-coming</guid>
<description><![CDATA[Safari support for qooxdoo is coming along nicely. qooxdoo support for the nightly build of WebKit is near to complete. Most demos and examples are working, including the API viewer . The screenshot shows the &#8220;At a Glance&#8221; example running in WebKit. Safari 2.0.4 shipped with the current OS X 10.4 is usable but still [...]]]></description>
<content:encoded><![CDATA[<p>Safari support for qooxdoo is coming along nicely. qooxdoo support for the nightly build of <a href="http://nightly.webkit.org" title="WebKit">WebKit</a> is near to complete. Most demos and examples are working, including the <a href="http://api.qooxdoo.org/">API viewer</a> . The screenshot shows the &ldquo;<a href="http://demo.qooxdoo.org/html/at-a-glance/index.html">At a Glance</a>&rdquo; example running in WebKit. Safari 2.0.4 shipped with the current OS X 10.4 is usable but still has some rendering issues.</p>
<div><a href="http://blog.qooxdoo.org/wp-content/uploads/2006/11/webkit-at_a_glance.jpg" title="WebKit - &quot;At a Glance&quot; example"><img src="http://blog.qooxdoo.org/wp-content/uploads/2006/11/webkit-at_a_glance.thumbnail.jpg" alt="WebKit - &quot;At a Glance&quot; example" /></a> <a href="http://blog.qooxdoo.org/wp-content/uploads/2006/11/webkit-api_viewer.jpg" title="WebKit - API viewer"><img src="http://blog.qooxdoo.org/wp-content/uploads/2006/11/webkit-api_viewer.thumbnail.jpg" alt="WebKit - API viewer" /></a></div>
<p>For the next qooxdoo release we plan to fully support WebKit, which hopefully builds the basis for the next major release of Safari shipped with the upcoming OS X 10.5. We decided to target WebKit because of its improved standard support and its dramatically faster JavaScript engine. Some qooxdoo examples are up to seven times faster using WebKit compared to Safari 2. Even if we would fully support Safari 2, it will never be a good platform for big JavaScript applications.</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=rgDIT7iC"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=rgDIT7iC" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=jZaVEgHu"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=jZaVEgHu" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=Kni66m1x"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=Kni66m1x" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=OdCjYPt3"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=OdCjYPt3" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=zlqmlozO"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=zlqmlozO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=3F9MjAuf"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=3F9MjAuf" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=LPVxsJLI"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=LPVxsJLI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=wCgbZ6gf"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=wCgbZ6gf" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/safari-support-for-qooxdoo-coming/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/safari-support-for-qooxdoo-coming</feedburner:origLink></item>
<item>
<title>Tamarin Follow-ups</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/46350978/tamarin-follow-ups</link>
<comments>http://blog.qooxdoo.org/tamarin-follow-ups#comments</comments>
<pubDate>Tue, 07 Nov 2006 21:53:17 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Firefox</category>
<category>Performance</category>
<category>Adobe</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/tamarin-follow-ups</guid>
<description><![CDATA[
I have just found some more interesting stuff regarding our Tamarin post today:&#160;
Inside Tamarin - Adobe&#8217;s Open Source Flash VM
JD on EP
Adobe press release
Mozilla press release
Digg frontpage
]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>I have just found some more interesting stuff regarding our Tamarin post today:&nbsp;</p>
<ul>
<li><a href="http://www.satine.org/archives/2006/11/06/inside-tamarin-adobes-open-source-flash-vm/">Inside Tamarin - Adobe&rsquo;s Open Source Flash VM</a></li>
<li><a href="http://weblogs.macromedia.com/jd/archives/2006/11/tamarin_project.cfm">JD on EP</a> </li>
<li><a href="http://www.mozilla.com/en-US/press/mozilla-2006-11-07.html">Adobe press release</a></li>
<li><a href="http://www.mozilla.com/en-US/press/mozilla-2006-11-07.html">Mozilla press release</a> </li>
<li><a href="http://digg.com/tech_news/Adobe_and_Mozilla_Foundation_to_Open_Source_Flash_Player_Scripting_Engine">Digg frontpage</a></li>
</ul>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=q9EAMSac"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=q9EAMSac" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=wzDEJbB5"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=wzDEJbB5" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=yiNGdYRa"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=yiNGdYRa" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=OhkFuOKM"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=OhkFuOKM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=B6t2zevO"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=B6t2zevO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=Q0RQVLHL"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=Q0RQVLHL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=FPcP7kjS"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=FPcP7kjS" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=ysJCQQQ4"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=ysJCQQQ4" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/tamarin-follow-ups/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/tamarin-follow-ups</feedburner:origLink></item>
<item>
<title>Project Tamarin to boost JavaScript</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/46219737/project-tamarin-to-boost-javascript</link>
<comments>http://blog.qooxdoo.org/project-tamarin-to-boost-javascript#comments</comments>
<pubDate>Tue, 07 Nov 2006 12:55:22 +0000</pubDate>
<dc:creator>Andreas Ecker</dc:creator>
<category>Firefox</category>
<category>Performance</category>
<category>Adobe</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/project-tamarin-to-boost-javascript</guid>
<description><![CDATA[
Good news, everyone!&#160;
Recently we have been puzzled by some statements of Brendan Eich, the creator of the JavaScript programming language.
In Brendan&#39;s blog he wrote &#34;For Mozilla 2, we will have a JIT-oriented JavaScript VM (details soon) that supports the forthcoming ECMAScript Edition 4 (&#34;JS2&#34;) language&#34; (October 13, 2006). [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>Good news, everyone!&nbsp;</p>
<p>Recently we have been puzzled by some statements of Brendan Eich, the creator of the JavaScript programming language.</p>
<p>In Brendan&#39;s blog he wrote &quot;For Mozilla 2, we will have a JIT-oriented JavaScript VM (details soon) that supports the forthcoming ECMAScript Edition 4 (&quot;JS2&quot;) language&quot; (<a href="http://weblogs.mozillazine.org/roadmap/archives/2006/10/mozilla_2.html">October 13, 2006</a>). Well, could hardly wait for any details. Another statement that made us curious was at The Ajax Experience this fall. In his slides about JavaScript 2.0 he mentioned&nbsp; &quot;Open source optimizing VMs coming soon. Look for an announcement in a few weeks&quot; (<a href="http://ajaxian.com/downloads/presentations/eich-ajax-experience-boston/">October 25, 2006</a>). Interestingly, this mysterious announcement was in a section he called &quot;JavaScript Fun Facts&quot;.</p>
<p>Well done Brendan, you are our Master of Suspense! Finally, as a revelation today came <a href="http://blog.qooxdoo.org/adobe-improves-javascript-performance">the announcement that is going to boost JavaScript</a>. Congratulations to Adobe for their decision of contributing the ActionScript Virtual Machine (AVM) as open source to the Mozilla project. And a warm open-source welcome to all the developers of the AVM! The code has <a href="http://weblogs.mozillazine.org/roadmap/archives/2006/11/project_tamarin.html">just been committed</a> into the Mozilla repository.</p>
<p>This is great news for qooxdoo being a client-side JavaScript framework. Performance has always been one of our major concerns, and we think we have pushed the limit for JavaScript based web applications, e.g. for qooxdoo&#39;s powerful browser-independent layout engine. Can&#39;t wait to tweak the last bit of performance out of any new Mozilla browser backed by the new JavaScript VM. This is going to change the future of browser-based applications. Cheers!</p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=USVMighM"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=USVMighM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=w54mM05O"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=w54mM05O" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=l0FOLc3Z"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=l0FOLc3Z" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=UjEK9OXh"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=UjEK9OXh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=hSi2ujP0"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=hSi2ujP0" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=huRmnKOf"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=huRmnKOf" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=aLB65Efe"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=aLB65Efe" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=RfSxRPZF"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=RfSxRPZF" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/project-tamarin-to-boost-javascript/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/project-tamarin-to-boost-javascript</feedburner:origLink></item>
<item>
<title>Adobe improves JavaScript performance</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/46178140/adobe-improves-javascript-performance</link>
<comments>http://blog.qooxdoo.org/adobe-improves-javascript-performance#comments</comments>
<pubDate>Tue, 07 Nov 2006 12:01:29 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Firefox</category>
<category>Flash</category>
<category>Adobe</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/adobe-improves-javascript-performance</guid>
<description><![CDATA[
In my opinion there was never a reason why JavaScript should be slower than other typical script languages e.g. Python, Perl, Ruby, &#8230; With the newest committment from Abobe to Mozilla we could reach a new level of performance in web applications.&#160;
As news.com reports &#34;Adobe will provide the [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>In my opinion there was never a reason why JavaScript should be slower than other typical script languages e.g. Python, Perl, Ruby, &#8230; With the newest committment from Abobe to Mozilla we could reach a new level of performance in web applications.&nbsp;</p>
<p>As news.com reports &quot;Adobe will provide the same software, called the ActionScript Virtual Machine, which it uses to run script code in the <a href="http://news.com.com/Adobe+updates+Flash+Player%2C+Flex+tool/2100-1012_3-6088705.html?tag=nl" title="Adobe updates Flash Player, Flex tool -- Tuesday, Jun 27, 2006">Adobe Flash Player 9</a>. This virtual machine is expected to be built into future versions of the Firefox browser by the first half of 2008, said <a href="http://www.hecker.org/info/bio?tag=nl">Frank Hecker</a>, the executive director of the <a href="http://www.mozilla.org/foundation/?tag=nl">Mozilla Foundation</a>.&quot; </p>
<p>Via <a href="http://news.com.com/2100-7344_3-6133052.html">news.com</a></p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=bVlh8s4Z"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=bVlh8s4Z" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=T4rDBMyi"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=T4rDBMyi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=IjP7zAmO"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=IjP7zAmO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=JuQT2l0H"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=JuQT2l0H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=SDqAETvO"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=SDqAETvO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=HCWVQRJl"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=HCWVQRJl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=bHmzAB8O"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=bHmzAB8O" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=iApj6TU3"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=iApj6TU3" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/adobe-improves-javascript-performance/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/adobe-improves-javascript-performance</feedburner:origLink></item>
<item>
<title>Keep yourself up-to-date</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/37261107/keep-yourself-up-to-date</link>
<comments>http://blog.qooxdoo.org/keep-yourself-up-to-date#comments</comments>
<pubDate>Sat, 14 Oct 2006 21:41:08 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Development</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/keep-yourself-up-to-date</guid>
<description><![CDATA[ There is a new feed available on our homepage. You can now easily follow the development in our SVN repository. Hope you like this. Especially interesting for users who want to be up-to-date. Also a nice alternative to our qooxdoo-commit mailing list.
]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>There is a <a href="http://feeds.feedburner.com/qooxdoo/svn/commits">new feed</a> available on <a href="http://qooxdoo.org">our homepage</a>. You can now easily follow the development in our SVN repository. Hope you like this. Especially interesting for users who want to be up-to-date. Also a nice alternative to our <a href="http://lists.sourceforge.net/mailman/listinfo/qooxdoo-commit">qooxdoo-commit mailing list</a>. </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=ufmev5Dk"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=ufmev5Dk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=4EgKz1gp"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=4EgKz1gp" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=SKoJto7H"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=SKoJto7H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=WTdFl3yy"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=WTdFl3yy" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=ZPm4BqBx"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=ZPm4BqBx" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=7dz9P0xU"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=7dz9P0xU" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=qABtQjRx"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=qABtQjRx" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=3FQ8FBbL"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=3FQ8FBbL" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/keep-yourself-up-to-date/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/keep-yourself-up-to-date</feedburner:origLink></item>
<item>
<title>Only five days to IE7</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/36678532/5-days-to-ie7</link>
<comments>http://blog.qooxdoo.org/5-days-to-ie7#comments</comments>
<pubDate>Fri, 13 Oct 2006 08:42:36 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Internet Explorer</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/5-days-to-ie7</guid>
<description><![CDATA[ Following a report of Microsoft Higher Education - Mid-Atlantic it seems that IE7 will be released on the 18th this month. In just 5 days. The most changes are only interesting for typical web developers (e.g. CSS fixes) while the latest improvements to the JavaScript engine [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>Following <a href="http://blogs.msdn.com/hied_mid-atlantic/archive/2006/10/10/Internet-Explorer-7-is-coming-this-month-_2E002E002E00_-Are-you-ready_3F00_.aspx">a report</a> of <a href="http://blogs.msdn.com/hied_mid-atlantic/default.aspx">Microsoft Higher Education - Mid-Atlantic</a> it seems that <a href="http://blogs.msdn.com/hied_mid-atlantic/archive/2006/10/10/Internet-Explorer-7-is-coming-this-month-_2E002E002E00_-Are-you-ready_3F00_.aspx">IE7 will be released on the 18th this month</a>. In just 5 days. The most changes are only interesting for typical web developers (e.g. CSS fixes) while the <a href="http://blog.qooxdoo.org/dramatically-improved-ie7-javascript-performance">latest improvements to the JavaScript engine</a> are also an interesting point for us and other big JavaScript frameworks. I hope we will see a market share of 50 percent after the first six months. </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=6KCHC8Qt"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=6KCHC8Qt" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=znn30SWW"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=znn30SWW" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=iDMgk0h2"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=iDMgk0h2" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=tH88lPZg"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=tH88lPZg" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=0u2q8HcY"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=0u2q8HcY" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=C8h6ZyP0"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=C8h6ZyP0" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=p7GgwlgK"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=p7GgwlgK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=8AEwoRbb"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=8AEwoRbb" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/5-days-to-ie7/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/5-days-to-ie7</feedburner:origLink></item>
<item>
<title>IE7 CSS changes</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/32468983/ie7-css-changes</link>
<comments>http://blog.qooxdoo.org/ie7-css-changes#comments</comments>
<pubDate>Wed, 04 Oct 2006 20:04:27 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Bookmark</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/ie7-css-changes</guid>
<description><![CDATA[ An interesting read for all web developers: Cascading Style Sheet Compatibility in Internet Explorer 7.
]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> An interesting read for all web developers: <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/cols/dnexpie/ie7_css_compat.asp?frame=true">Cascading Style Sheet Compatibility in Internet Explorer 7.</a><br /> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=l0NmonZB"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=l0NmonZB" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=R0iSOfdT"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=R0iSOfdT" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=oEqiKUKM"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=oEqiKUKM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=1VRsHJUp"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=1VRsHJUp" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=6TsnDDrP"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=6TsnDDrP" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=3JFLZ0Cf"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=3JFLZ0Cf" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=QuSZgCNp"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=QuSZgCNp" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=Y8oWww1z"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=Y8oWww1z" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/ie7-css-changes/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/ie7-css-changes</feedburner:origLink></item>
<item>
<title>Support for compression of local variables added</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/32241766/support-for-compression-of-local-variables-added</link>
<comments>http://blog.qooxdoo.org/support-for-compression-of-local-variables-added#comments</comments>
<pubDate>Wed, 04 Oct 2006 11:06:46 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Development</category>
<category>Technical</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/support-for-compression-of-local-variables-added</guid>
<description><![CDATA[
A few hours ago I&#39;ve committed a change which adds a variable name optimizer into the qooxdoo trunk. This optimizer replaces the names of local variables with shorter ones. The result is a size reduction of the compiled JavaScript file by 10%. This new behavior is enabled per [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>A few hours ago I&#39;ve committed a change which adds a variable name optimizer into the qooxdoo trunk. This optimizer replaces the names of local variables with shorter ones. The result is a size reduction of the compiled JavaScript file by 10%. This new behavior is enabled per default for all the included Makefiles. So after an SVN update you can build your (again) better optimized version of qooxdoo.</p>
<p>This can also been seen as a next step in bringing support for obfuscation another step forward. I have also updated the <a href="http://demo.qooxdoo.org">online demos</a> and the <a href="http://api.qooxdoo.org">API viewer</a> to use this new feature. I would like to invite you to give me feedback as soon as possible. Maybe you also find some bugs. If so, please report them immediately. Thank you.</p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=tppbJ4bc"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=tppbJ4bc" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=dbe1sxCT"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=dbe1sxCT" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=kuoqNS00"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=kuoqNS00" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=HlJ6f0Ls"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=HlJ6f0Ls" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=xbjmDWoL"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=xbjmDWoL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=V2cWssXw"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=V2cWssXw" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=C10aMNYQ"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=C10aMNYQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=F2ic6JR6"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=F2ic6JR6" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/support-for-compression-of-local-variables-added/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/support-for-compression-of-local-variables-added</feedburner:origLink></item>
<item>
<title>AJAX framework survey</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/26565493/ajax-framework-poll</link>
<comments>http://blog.qooxdoo.org/ajax-framework-poll#comments</comments>
<pubDate>Sun, 24 Sep 2006 09:04:41 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Discussion</category>
<category>Survey</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/ajax-framework-poll</guid>
<description><![CDATA[
The guys at ajaxian.com have reported about a current survey regarding the popularity of common AJAX frameworks. It is quite clear why prototype is the winner. It&#39;s well-known, small and easily embedable into existing pages. However I think it is interesting that Mochikit is less widely used, because [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>The guys at <a href="http://ajaxian.com">ajaxian.com</a> have reported about a current <a href="http://ajaxian.com/archives/ajaxiancom-2006-survey-results">survey regarding the popularity of common AJAX frameworks</a>. It is quite clear why prototype is the winner. It&#39;s well-known, small and easily embedable into existing pages. However I think it is interesting that Mochikit is less widely used, because the targets of these libraries are comparable in my opinion. And Mochikit does not depends on extensions of native objects (especially Object.prototype) which makes it the better choice.</p>
<p>I should mention that in my opinion the whole survey is quite problematic because of their comparison of different levels of so named &quot;AJAX frameworks&quot;. For a next survey I would suggest to divide the list into these groups:</p>
<p>AJAX wrappers &amp; DOM utilities:</p>
<ul>
<li>Prototype &amp; Scriptaclous &amp; Rico</li>
<li>Moo.fx</li>
<li>jQuery </li>
<li>Yahoo UI</li>
<li>Mochikit</li>
<li>XAJAX</li>
<li>DWR (includes backend code, too) </li>
</ul>
<p>Framework &amp; Toolkits:</p>
<ul>
<li>Dojo</li>
<li>Atlas</li>
<li>GWT</li>
<li>qooxdoo (seems to be missing <img src='http://blog.qooxdoo.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )&nbsp;</li>
</ul>
<p>I&#39;ve grouped together Scriptaclous and Rico because they both depend on Prototype which means they are more or less an extension of this library and not a real separate solution.</p>
<p>What do you think?&nbsp;</p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=zVG9wfIU"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=zVG9wfIU" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=FyUymhC2"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=FyUymhC2" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=SCV0WhJ4"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=SCV0WhJ4" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=BYHTg0aH"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=BYHTg0aH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=sYMapwTd"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=sYMapwTd" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=r7Dt6YTk"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=r7Dt6YTk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=fWqhBoBV"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=fWqhBoBV" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=bOeZDScE"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=bOeZDScE" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/ajax-framework-poll/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/ajax-framework-poll</feedburner:origLink></item>
<item>
<title>Dramatically improved IE7 JavaScript performance</title>
<link>http://feeds.feedburner.com/~r/qooxdoo/blog/content/~3/21793941/dramatically-improved-ie7-javascript-performance</link>
<comments>http://blog.qooxdoo.org/dramatically-improved-ie7-javascript-performance#comments</comments>
<pubDate>Wed, 13 Sep 2006 11:35:53 +0000</pubDate>
<dc:creator>Sebastian Werner</dc:creator>
<category>Internet Explorer</category>
<category>Technical</category>
<category>Performance</category>
<guid isPermaLink="false">http://blog.qooxdoo.org/dramatically-improved-ie7-javascript-performance</guid>
<description><![CDATA[
Really good news. My vocabulary may to be too limited to tell you how great the latest changes in IE7 RC1 are. Microsoft announced that they have &#34;recently made some great fixes to our engine to improve the garbage collection routine and to reduce unbounded memory growth.&#34; and [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>Really good news. My vocabulary may to be too limited to tell you how great the latest changes in <a href="http://www.microsoft.com/windows/ie/default.mspx">IE7 RC1</a> are. <a href="http://blogs.msdn.com/ie/archive/2006/08/28/728654.aspx">Microsoft announced</a> that they have &quot;recently made some great fixes to our engine to improve the garbage collection routine and to reduce unbounded memory growth.&quot; and that one &quot;should see noticeable improvements on AJAX sites in the Release Candidate we shipped last week&quot;. Yes indeed, we do see tremendeous improvements. <img src='http://blog.qooxdoo.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>In fact <a href="http://qooxdoo.org/demo">many demos</a> of <a href="http://qooxdoo.org">qooxdoo</a> run much faster now in IE7 compared to IE6. And they are even faster than in <a href="http://www.mozilla.com/firefox/">Firefox</a> 1.5 in many cases. This is a huge jump in performance. Microsoft did not tell about their exact modifications, of course. Anyway, they have fixed <em>the</em> major problem of large JavaScript-based web applications. This problem, despite having a catchy name, was mentioned many times before like <a href="http://demo.qooxdoo.org/html/performance/GlobalObject_2.html">here</a>, <a href="http://alex.dojotoolkit.org/?p=536">here</a> and <a href="http://groups.google.com/group/microsoft.public.inetsdk.programming.scripting.jscript/browse_thread/thread/d758f148f03cd2ed/cc6143cd1b0d1e38?lnk=st&amp;q=jscript+slow+performance+ie+firefox&amp;rnum=2#cc6143cd1b0d1e3">there</a>: If you have many objects created, which are simply accessible in the current scope, all methods and features of JavaScript slow down dramatically. Yeah, right, the entire execution speed drops significantly. No other browser besides IE shows such a strange behavior. It is quite interesting that IE6 really gets slower the larger the total number of (accessible) objects. Sure, it is logical that more instanciated objects need more memory, but it is not logical that at the same time this will dramatically reduce the performance of any code (that is not even accessing this data).</p>
<p>With the release candidate RC1 of their new browser version IE7, it seems that they have finally fixed this issue. You can test it yourself in <a href="http://demo.qooxdoo.org/html/performance/GlobalObject_2.html">this test case</a>, which has been available in <a href="http://qooxdoo.org">qooxdoo</a> for several months to analyze and measure the IE performance problems. Please look at status bar of your browser (maybe you need to enable the status bar in the IE7 security settings). It will display the execution time of each loop while a large number of objects exists. On my machine the IE6 needs ~1400ms, while IE7 needs ~30ms, which is roughly the time Firefox 1.5 needs. Definitely incredible! Bright future for modern web applications. <img src='http://blog.qooxdoo.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=27qjvIjz"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=27qjvIjz" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=0pcpSBXq"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=0pcpSBXq" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=Z4mzepLM"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=Z4mzepLM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=Cko7rv3A"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=Cko7rv3A" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=F2xJwTjG"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=F2xJwTjG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=xrRqiV8e"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=xrRqiV8e" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=nLBUMGef"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=nLBUMGef" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/blog/content?a=hUPfCg1N"><img src="http://feeds.feedburner.com/~f/qooxdoo/blog/content?i=hUPfCg1N" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://blog.qooxdoo.org/dramatically-improved-ie7-javascript-performance/feed/</wfw:commentRss>
<feedburner:origLink>http://blog.qooxdoo.org/dramatically-improved-ie7-javascript-performance</feedburner:origLink></item>
</channel>
</rss><!-- Dynamic Page Served (once) in 0.666 seconds --><!-- Cached page served by WP-Cache -->

View File

@ -1,284 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><!-- generator="wordpress/2.0.5" --><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<title>qooxdoo News</title>
<link>http://news.qooxdoo.org</link>
<description>The qooxdoo news section</description>
<pubDate>Sun, 26 Nov 2006 15:52:09 +0000</pubDate>
<generator>http://wordpress.org/?v=2.0.5</generator>
<language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/qooxdoo/news/content" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">390072</feedburner:emailServiceId><item>
<title>qooxdoo 0.6.2 released</title>
<link>http://news.qooxdoo.org/qooxdoo-062-released</link>
<comments>http://news.qooxdoo.org/qooxdoo-062-released#comments</comments>
<pubDate>Wed, 22 Nov 2006 14:13:38 +0000</pubDate>
<dc:creator>Andreas Ecker</dc:creator>
<category>Announcements</category>
<category>Release</category>
<guid isPermaLink="false">http://news.qooxdoo.org/qooxdoo-062-released</guid>
<description><![CDATA[Good news, everyone!
Despite of the minor change in version number, this release is again a major step in strengthening qooxdoo&#39;s position of being one of the most comprehensive and innovative AJAX frameworks. It now even includes support for WebKit and future versions of Safari!
It came as quite a surprise how many fixes, changes and additions [...]]]></description>
<content:encoded><![CDATA[<p>Good news, everyone!</p>
<p>Despite of the minor change in version number, this release is again a major step in strengthening qooxdoo&#39;s position of being one of the most comprehensive and innovative AJAX frameworks. It now even includes support for WebKit and future versions of Safari!</p>
<p>It came as quite a surprise how many fixes, changes and additions we were actually able to include in this fine little package. During the eight weeks after release 0.6.1, many people have made contributions. Thanks to all qooxdoo users, contributors, patch monsters and supporters for helping to make the framework more mature and feature-complete!</p>
<p>Targeted as a maintenance release it includes many bugfixes and only minor changes in functionality or API. We recommend to upgrade any applications based on qooxdoo 0.6.1. Of course, there is migration support available, even if it is hardly needed this time.</p>
<p>As mentioned above and already announced in our <a href="http://blog.qooxdoo.org/safari-support-for-qooxdoo-coming">developer blog</a>, qooxdoo now includes support for WebKit. We expect to fully support the next major version Safari 3.0 which will be based on the current development of WebKit. There is only limited support for Safari in its current version 2.0.4, though. Reason is, that Safari 2.0 still has many bugs that can hardly be worked around. Luckily, many of those bugs are already fixed in the <a href="http://nightly.webkit.org/">nightly builds of WebKit</a>. Besides the various bugs, Safari 2.0&#39;s JavaScript engine and its execution speed is not competitive with respect to the latest versions of the other major browsers (Firefox 2.0, IE7, Opera 9). Good news is, that the current builds of WebKit are tremendeously faster than Safari 2.0, approximately by a factor of 7-8 for a typical qooxdoo demo.</p>
<p>We think it is worth to either use WebKit for now or wait for Safari 3.0 due in early 2007. There is probably not much sense in devoting more time and effort for Safari 2.0 specific problems. There are still some known issues concerning WebKit support (particularly for widgets that use scrollbars). It would be great if Mac users could give qooxdoo 0.6.2 a try and report any problem in bugzilla. Please use the most recent nightly build of WebKit and include its version information in any bug report.</p>
<p>For more detailed information about qooxdoo 0.6.2 please consult the corresponding <a href="http://qooxdoo.org/about/release_notes">release notes</a>.</p>
<p>Enjoy!</p>
<ul>
<li><a href="http://qooxdoo.org/download">Download qooxdoo</a></li>
<li><a href="http://freshmeat.net/rate/53996/">Rate qooxdoo</a> </li>
</ul>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=rUMX2pdG"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=rUMX2pdG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=QSWyYmHE"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=QSWyYmHE" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=46nCAceV"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=46nCAceV" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=C67hJdDt"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=C67hJdDt" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=Xl7ySFg7"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=Xl7ySFg7" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=CERoEiZ0"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=CERoEiZ0" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=L5wV176y"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=L5wV176y" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=LcQsQi8c"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=LcQsQi8c" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/qooxdoo-062-released/feed/</wfw:commentRss>
</item>
<item>
<title>IE7 released, finally</title>
<link>http://news.qooxdoo.org/ie7-released-finally</link>
<comments>http://news.qooxdoo.org/ie7-released-finally#comments</comments>
<pubDate>Thu, 19 Oct 2006 12:26:18 +0000</pubDate>
<dc:creator>Andreas Ecker</dc:creator>
<category>Announcements</category>
<guid isPermaLink="false">http://news.qooxdoo.org/ie7-released-finally</guid>
<description><![CDATA[
Good news to every developer of modern web applications. After more than 5 years (IE6 was released in August 2001) we all hope to see IE7 fix some of the most severe problems and bugs of IE6. All qooxdoo-based applications are expected to benefit from IE7, particularly due [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>Good news to every developer of modern web applications. After more than 5 years (IE6 was released in August 2001) we all hope to see <a href="http://www.microsoft.com/ie">IE7</a> fix some of the most severe problems and bugs of IE6. All qooxdoo-based applications are expected to benefit from IE7, particularly due to the <a href="http://blog.qooxdoo.org/dramatically-improved-ie7-javascript-performance">dramatic JavaScript performance improvements</a> that we reported earlier.</p>
<p>qooxdoo fully supports IE7. It would be great if qooxdoo users and developers could continue to test and double-check their applications for IE7 compatibility. Please <a href="http://bugzilla.qooxdoo.org/enter_bug.cgi?product=frontend&amp;op_sys=Windows&amp;rep_platform=IE%207">report any IE7 issues in bugzilla</a> as soon as possible.</p>
<p>Enjoy &#8230; and good luck!&nbsp;</p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=s9WxPv0V"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=s9WxPv0V" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=SjIKFZaP"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=SjIKFZaP" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=bCMFN18x"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=bCMFN18x" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=mLQg7sg8"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=mLQg7sg8" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=vKYNENWZ"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=vKYNENWZ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=UVocqnql"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=UVocqnql" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=FurwESp0"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=FurwESp0" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=Xz06SbFC"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=Xz06SbFC" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/ie7-released-finally/feed/</wfw:commentRss>
</item>
<item>
<title>qooxdoo 0.6.1 released</title>
<link>http://news.qooxdoo.org/qooxdoo-061-released</link>
<comments>http://news.qooxdoo.org/qooxdoo-061-released#comments</comments>
<pubDate>Wed, 20 Sep 2006 18:49:16 +0000</pubDate>
<dc:creator>Andreas Ecker</dc:creator>
<category>Announcements</category>
<category>Release</category>
<guid isPermaLink="false">http://news.qooxdoo.org/qooxdoo-061-released</guid>
<description><![CDATA[
After only two weeks since the ground-breaking release of qooxdoo 0.6 quite a lot of progress has been made. We have received many contributions and bugfixes from the community. These patches as well as our own&#160; modifications have been integrated into the code base in the ongoing [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>After only two weeks since the ground-breaking release of <a href="http://news.qooxdoo.org/qooxdoo-06-released">qooxdoo 0.6</a> quite a lot of progress has been made. We have received many contributions and bugfixes from the community. These patches as well as our own&nbsp; modifications have been integrated into the code base in the ongoing effort to raise qooxdoo&#39;s stability.</p>
<p>As has been previously announced, we try to release often, now that some of the most challenging reconstructions like namespaces have been mastered. While API changes for this minor release are negligible, <a href="http://qooxdoo.org/documentation/user_manual/migration_support">migration scripts</a> are available to upgrade existing applications, of course. </p>
<p>Preliminary browser support for Safari has been introduced. It would be great if Safari users could help in identifying, analyzing and fixing the various layout problems. It is still not recommended to use qooxdoo applications in Safari-based production environments.</p>
<p>Besides bugfixes and stability improvements there are some interesting additions as well. Tabs may optionally include close buttons, the tree widget TreeFullControl now supports multiple root nodes. Iframes containing external documents now have built-in blocking support to not interrupt user actions like drag &amp; drop.</p>
<p>Application development is even faster than before: the easy-to-use make shell commands that generate optimized and <a href="http://qooxdoo.org/documentation/user_manual/custom_builds">tailor-made custom applications</a> run much faster. Users get a jump-start for their application development by using the <a href="http://qooxdoo.org/documentation/user_manual/skeleton">skeletons</a> included in the qooxdoo SDK.</p>
<p>We would like to thank all people involved in qooxdoo development for their help and contribution. Every user&#39;s <a href="http://qooxdoo.org/community/mailing_lists">feedback</a> is important to continuously improve qooxdoo as one of the most amazing JavaScript frameworks around. Enjoy!</p>
<ul>
<li><a href="http://qooxdoo.org/about/release_notes">Release Notes</a></li>
<li><a href="http://qooxdoo.org/download">Downloads of SDK or pre-build package</a></li>
</ul>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=Zk55ooUa"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=Zk55ooUa" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=BLxW0cEj"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=BLxW0cEj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=iaVRLUq8"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=iaVRLUq8" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=OFRBiERh"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=OFRBiERh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=qAiaGiVy"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=qAiaGiVy" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=kmVzh0Er"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=kmVzh0Er" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=bgbKIHHd"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=bgbKIHHd" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=wAtcF7sW"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=wAtcF7sW" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/qooxdoo-061-released/feed/</wfw:commentRss>
</item>
<item>
<title>qooxdoo 0.6 released</title>
<link>http://news.qooxdoo.org/qooxdoo-06-released</link>
<comments>http://news.qooxdoo.org/qooxdoo-06-released#comments</comments>
<pubDate>Thu, 07 Sep 2006 17:49:13 +0000</pubDate>
<dc:creator>Sebastian</dc:creator>
<category>Announcements</category>
<category>Release</category>
<guid isPermaLink="false">http://news.qooxdoo.org/qooxdoo-06-released</guid>
<description><![CDATA[
Here comes the most advanced qooxdoo version ever! qooxdoo 0.6 introduces namespaces as the most noticeable change. This step has been combined with a long thought-out and at the end well-structured directory layout.
Integrated is one of the most advanced build systems. This new system allows you to generate [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>Here comes the most advanced qooxdoo version ever! qooxdoo 0.6 introduces namespaces as the most noticeable change. This step has been combined with a long thought-out and at the end well-structured directory layout.</p>
<p>Integrated is one of the most advanced build systems. This new system allows you to generate tailor-made user applications linked against the qooxdoo framework. You can even include your own project classes and optimize them along with qooxdoo. Using this new build system you can generate blazingly fast and highly optimized qooxdoo builds.</p>
<p>A new ground-breaking qooxdoo-based API viewer was added to make software development with qooxdoo easier than ever before. Supposed to become every qooxdoo users&#39; number one resource, it shows all available packages, classes, properties and methods. All related information is connected by hyperlinks which gives you a highly convenient way to access the relevant information.</p>
<p>Of course there are also new widgets. A new advanced table widget has been introduced which is a virtual list view component that allows to handle many thousands of entries. Its features also make it possible to dynamically load the data from a remote server (using RPC for example). A splitpane - one of the long-awaited widgets - is now included. Full-blown logging capabilities featuring various appenders are available as well.</p>
<p>There are a lot more changes and enhancements. For details please take a look at <a href="http://qooxdoo.org/about/release_notes">the release notes</a>. Migration support simplifies the switch from the last qooxdoo release 0.5.3. <a href="http://qooxdoo.org/download">qooxdoo 0.6</a> is the perfect framework to build highly-interactive web applications. Why don&#39;t you start now? <a href="http://qooxdoo.org/download">Just download qooxdoo today!</a></p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=onwQzIon"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=onwQzIon" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=jYfYN2gj"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=jYfYN2gj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=0psukVw3"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=0psukVw3" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=eXdvErgL"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=eXdvErgL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=KM4zclIk"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=KM4zclIk" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=hfgM1jFS"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=hfgM1jFS" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=LGUxEmi5"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=LGUxEmi5" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=qz5zRqV5"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=qz5zRqV5" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/qooxdoo-06-released/feed/</wfw:commentRss>
</item>
<item>
<title>Introduce new tree compiler</title>
<link>http://news.qooxdoo.org/introduce-new-tree-compiler</link>
<comments>http://news.qooxdoo.org/introduce-new-tree-compiler#comments</comments>
<pubDate>Thu, 31 Aug 2006 16:02:27 +0000</pubDate>
<dc:creator>Sebastian</dc:creator>
<category>Announcements</category>
<category>Development</category>
<guid isPermaLink="false">http://news.qooxdoo.org/introduce-new-tree-compiler</guid>
<description><![CDATA[
Another step forward to highly optimized applications based on qooxdoo: I would like to introduce the tree &#34;compiler&#34;. The tree compiler is able to &#34;compile&#34; a syntax tree (generated by treegenerator.py which uses the tokenizer.py) back to optimized JavaScript code. Its feature set is comparable to the old [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>Another step forward to highly optimized applications based on qooxdoo: I would like to introduce the tree &quot;compiler&quot;. The tree compiler is able to &quot;compile&quot; a syntax tree (generated by treegenerator.py which uses the tokenizer.py) back to optimized JavaScript code. Its feature set is comparable to the old compiler, which was directly based on the result of the tokenizer.py script. It completely removes comments, whitespaces and other optional stuff from the original JavaScript code. </p>
<p>This tree compiler is an important step, because it will allow us to do the following awesome things in the future:</p>
<ul>
<li>Remove complete methods (debug statements, &#8230;)</li>
<li>Remove cross-browser constructions and generate a version for each browser/engine.</li>
<li>Compress variable names</li>
<li>Lay out strings and reduce usage of simple constants (like &quot;auto&quot;, &quot;100%&quot;, &#8230;) for considerable IE performance improvements</li>
<li>Obfuscate the whole application (variable, function and class names)</li>
</ul>
<p>etc.</p>
<p>Now the interesting part: The tree compiler is the default from now on. It is already available in SVN and will be in the final release of qooxdoo 0.6. The tree compiler was tested against qooxdoo and another big internal project so we think it&#39;s quite stable already. It may not be free of bugs however, but I&#39;m happy to fix bugs as fast as you can report them <img src='http://news.qooxdoo.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>If you have problems with this new compiler, you can use the old one using the &quot;&#8211;use-token-compiler&quot; argument (generator.py). Each Makefile which is included in qooxdoo, has a new variable (OLDCOMPILER) in the first lines of the file which lets you select the compiler (simply set it to &quot;true&quot;).</p>
<p>I hope you enjoy this new era of JavaScript optimization. Kudos to Til - without the treegenerator.py developed by him, qooxdoo would maybe not have seen such a tree-based optimizer.</p>
<p>You can immediately test the new compiler. Its results can also been seen online in <a href="http://qooxdoo.org/demo">the online demos</a> and <a href="http://api.qooxdoo.org">the API viewer</a>.</p>
<p>For all SDK/source version users: Please make sure to delete the directory &quot;.cache&quot;. A simple &quot;make distclean&quot; will do this for you.</p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=IY1PzpQT"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=IY1PzpQT" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=bQM4qh6n"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=bQM4qh6n" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=xNREhjUN"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=xNREhjUN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=WRp5C951"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=WRp5C951" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=1jl7qoQY"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=1jl7qoQY" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=PSL1b5Rt"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=PSL1b5Rt" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=mGL5WaXu"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=mGL5WaXu" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=e3rRUVoh"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=e3rRUVoh" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/introduce-new-tree-compiler/feed/</wfw:commentRss>
</item>
<item>
<title>qooxdoo 0.6 (Release Candidate 1) available</title>
<link>http://news.qooxdoo.org/qooxdoo-06-release-candidate-1-available</link>
<comments>http://news.qooxdoo.org/qooxdoo-06-release-candidate-1-available#comments</comments>
<pubDate>Sat, 19 Aug 2006 02:31:26 +0000</pubDate>
<dc:creator>Andreas Ecker</dc:creator>
<category>Release</category>
<guid isPermaLink="false">http://news.qooxdoo.org/qooxdoo-06-release-candidate-1-available</guid>
<description><![CDATA[
Many aspects of qooxdoo have been improved to make it an even more professional and complete JavaScript framework.
A lot of issues, that have been brought up and discussed on the mailing list before, have been addressed. Some of the most noticable additions include a qooxdoo-based viewer for the [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>Many aspects of qooxdoo have been improved to make it an even more professional and complete JavaScript framework.</p>
<p>A lot of issues, that have been brought up and discussed on the mailing list before, have been addressed. Some of the most <a href="http://qooxdoo.org/documentation/improvements_for_qooxdoo_0.6">noticable additions</a> include a qooxdoo-based viewer for the auto-generated API documentation, a more powerful virtual list view and a smart build process that makes optimizing, compressing, linking and deployment of custom applications a snap.</p>
<p>A Release Candidate 1 is now available for <a href="http://qooxdoo.org/download">easy download</a>. That way people can immediately start to get themselves familiar with the most important improvements. </p>
<p>We would like to thank all users, contributors and fellow developers for their ongoing help and support. Keep up the good work!</p>
<p><a href="http://demo.qooxdoo.org">Try online demos</a></p>
<p><a href="http://digg.com/software/qooxdoo_0_6_Release_Candidate_1_available">Digg this</a>&nbsp;</p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=jvtn1dh2"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=jvtn1dh2" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=9WhvLamK"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=9WhvLamK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=FpMP6QAZ"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=FpMP6QAZ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=HjpVjKW8"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=HjpVjKW8" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=vPJyRCRJ"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=vPJyRCRJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=5pCaV3g8"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=5pCaV3g8" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=R1Pi8XSF"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=R1Pi8XSF" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=s9FAqx6S"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=s9FAqx6S" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/qooxdoo-06-release-candidate-1-available/feed/</wfw:commentRss>
</item>
<item>
<title>Branch “namespaces” discontinued</title>
<link>http://news.qooxdoo.org/branch-namespaces-discontinued</link>
<comments>http://news.qooxdoo.org/branch-namespaces-discontinued#comments</comments>
<pubDate>Wed, 16 Aug 2006 21:38:12 +0000</pubDate>
<dc:creator>Andreas Ecker</dc:creator>
<category>Announcements</category>
<guid isPermaLink="false">http://news.qooxdoo.org/use-trunk-instead-of-namespaces-branch</guid>
<description><![CDATA[
IMPORTANT: Until recently the major development work towards the next release 0.6 has been done in a development branch named &#34;namespaces&#34;. This branch is now discontinued. Its content has been transfered into the SVN trunk.
Future development of qooxdoo will concentrate on changes made in the trunk. Anyone interested [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>IMPORTANT: Until recently the major development work towards the next release 0.6 has been done in a development branch named &quot;namespaces&quot;. This branch is now discontinued. Its content has been transfered into the SVN trunk.</p>
<p>Future development of qooxdoo will concentrate on changes made in the trunk. Anyone interested in an up-to-date version of the framework should simply <a href="http://qooxdoo.org/documentation/user/checkout_from_svn">checkout the latest revision of the SVN trunk</a> . Clearly, these snapshots are not expected to be stable enough for production use. They are not even supposed to be functional at all. It may happen that the trunk is broken for not only hours (delibaretely) but even days (rather by accident). Think of the trunk as a permanent work-in-progress that after potentially unstable phases finally leads to the next official release.</p>
<p>The content of the previous SVN trunk has been moved to a branch named &quot;legacy_0_5_x&quot;. This branch may see some changes, particularly bugfixes and backports of modifications made in the trunk. Please do not expect many substantial improvements in this 0.5 line of qooxdoo, though. There may be a release 0.5.4 sometime, but this clearly depends on user contribution for this now &quot;old&quot; line of qooxdoo.</p>
<p>Please note, that the existing documentation has still to be updated to reflect the switch from the &quot;namespaces&quot; branch to the trunk. Information formerly specific to the &quot;namespaces&quot; branch should now be valid for the trunk.</p>
<p>We are getting closer to qooxdoo 0.6&nbsp; <img src='http://news.qooxdoo.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=c2oS4gbi"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=c2oS4gbi" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=Didl6LAR"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=Didl6LAR" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=DiHnHveW"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=DiHnHveW" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=AUWodtyY"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=AUWodtyY" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=Aw6D7Zyp"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=Aw6D7Zyp" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=kUraOsvP"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=kUraOsvP" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=7H4Jc2VJ"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=7H4Jc2VJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=bWYU5yHV"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=bWYU5yHV" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/branch-namespaces-discontinued/feed/</wfw:commentRss>
</item>
<item>
<title>Planned Improvements for qooxdoo 0.6</title>
<link>http://news.qooxdoo.org/planned-improvements-for-qooxdoo-06</link>
<comments>http://news.qooxdoo.org/planned-improvements-for-qooxdoo-06#comments</comments>
<pubDate>Thu, 10 Aug 2006 09:05:40 +0000</pubDate>
<dc:creator>Andreas Ecker</dc:creator>
<category>Announcements</category>
<guid isPermaLink="false">http://news.qooxdoo.org/planned-improvements-for-qooxdoo-06</guid>
<description><![CDATA[
There is an extended update of an older post with respect to new features and modifications that are currently being implemented.
All interested qooxdoo users are welcome to bring themselves up-to-date and are invited to get involved in qooxdoo development. It takes not more than checking-out qooxdoo from [...]]]></description>
<content:encoded><![CDATA[<p><?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body>
<p>There is an <a href="http://qooxdoo.org/documentation/improvements_for_qooxdoo_0.6">extended update</a> of an older post with respect to new features and modifications that are currently being implemented.</p>
<p>All interested qooxdoo users are welcome to bring themselves up-to-date and are invited to get involved in qooxdoo development. It takes not more than checking-out qooxdoo from a subversion repository and doing a &quot;make&quot; on your shell afterwards. </p>
<p>A couple of significant differences that are being addressed are:</p>
<ul>
<li>Namespaces</li>
<li>Documentation</li>
<li>Building and Deployment</li>
<li>Table</li>
<li>Remote Procedure Calls&nbsp;</li>
</ul>
<p> </body> </html>
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=5v7NltR5"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=5v7NltR5" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=28Nxb6gr"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=28Nxb6gr" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=au1dDM3I"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=au1dDM3I" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=Qh1RG75B"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=Qh1RG75B" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=is6ZeKJd"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=is6ZeKJd" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=IEWlxTSe"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=IEWlxTSe" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=MZTcg2Kn"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=MZTcg2Kn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=0hWzprwr"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=0hWzprwr" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/planned-improvements-for-qooxdoo-06/feed/</wfw:commentRss>
</item>
<item>
<title>qooxdoo 0.5.3 released</title>
<link>http://news.qooxdoo.org/qooxdoo-053-released</link>
<comments>http://news.qooxdoo.org/qooxdoo-053-released#comments</comments>
<pubDate>Wed, 12 Jul 2006 09:09:27 +0000</pubDate>
<dc:creator>Sebastian</dc:creator>
<category>Announcements</category>
<category>Release</category>
<guid isPermaLink="false">http://news.qooxdoo.org/announcements/qooxdoo-053-released</guid>
<description><![CDATA[This is just a small release with some bugfixes for the users of any previous 0.5.x release. Also take a look at the release notes. Download the new version here at sourceforge.
]]></description>
<content:encoded><![CDATA[<p>This is just a small release with some bugfixes for the users of any previous 0.5.x release. Also take a look at the <a href="http://qooxdoo.org/documentation/user/release_notes">release notes</a>. Download the new version <a href="http://sourceforge.net/project/showfiles.php?group_id=129854&#038;package_id=151847">here at sourceforge</a>.
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=ou9mifFX"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=ou9mifFX" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=8ZEMUWxe"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=8ZEMUWxe" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=JSsN4MH7"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=JSsN4MH7" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=MIoFJanB"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=MIoFJanB" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=ObKHscCV"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=ObKHscCV" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=UbVce4qb"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=UbVce4qb" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=zAeLNyw2"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=zAeLNyw2" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=k50Tl2Qd"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=k50Tl2Qd" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/qooxdoo-053-released/feed/</wfw:commentRss>
</item>
<item>
<title>Bugzilla mailing list</title>
<link>http://news.qooxdoo.org/bugzilla-mailing-list</link>
<comments>http://news.qooxdoo.org/bugzilla-mailing-list#comments</comments>
<pubDate>Mon, 19 Jun 2006 09:24:26 +0000</pubDate>
<dc:creator>Sebastian</dc:creator>
<category>Bugs</category>
<category>Mailing lists</category>
<guid isPermaLink="false">http://news.qooxdoo.org/uncategorized/bugzilla-mailing-list</guid>
<description><![CDATA[I&#8217;ve just registered and configured a new mailing list, which is used to monitor the bug activity. Bugs in qooxdoo are also used to manage feature additions and enhancement wishes.
You can register yourself to always stay up-to-date with the further development of qooxdoo.
]]></description>
<content:encoded><![CDATA[<p>I&#8217;ve just registered and configured a new <a href="http://lists.sourceforge.net/lists/listinfo/qooxdoo-bugs">mailing list</a>, which is used to monitor the bug activity. Bugs in <a href="http://qooxdoo.org">qooxdoo</a> are also used to manage feature additions and enhancement wishes.</p>
<p>You can <a href="http://lists.sourceforge.net/lists/listinfo/qooxdoo-bugs">register yourself</a> to always stay up-to-date with the further development of qooxdoo.
</p>
<div class="feedflare"><a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=K0Py8qhO"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=K0Py8qhO" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=jS2WTLmd"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=jS2WTLmd" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=bEAB9eQG"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=bEAB9eQG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=RnriB89x"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=RnriB89x" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=XRTQ94fT"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=XRTQ94fT" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=TzV4EYJn"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=TzV4EYJn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=e6upeVfr"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=e6upeVfr" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/qooxdoo/news/content?a=kU4viCW8"><img src="http://feeds.feedburner.com/~f/qooxdoo/news/content?i=kU4viCW8" border="0"></img></a></div>]]></content:encoded>
<wfw:commentRss>http://news.qooxdoo.org/bugzilla-mailing-list/feed/</wfw:commentRss>
</item>
</channel>
</rss><!-- Dynamic Page Served (once) in 0.658 seconds -->

Some files were not shown because too many files have changed in this diff Show More