core.js
Summary
Mozile's core properties, methods, and classes.
Project Homepage: http://mozile.mozdev.org
Version: 0.8
$Id: overview-summary-core.js.html,v 1.15 2008/02/20 18:47:09 jameso Exp $
Author: James A. Overton
if(window.dojo) dojo.provide("mozile.src.core");
if(window.mozile && mozile.gui) mozile.gui.destroy();
if(!window.mozile) mozile = {};
if(!mozile.window) mozile.window = window;
if(!mozile.document) mozile.document = document;
if(!mozile.filesep) mozile.filesep = "/";
if(!mozile.linesep) mozile.linesep = "\n";
if(!mozile.locale) {
mozile.locale = "en-us";
if(navigator.language) mozile.locale = navigator.language;
if(navigator.userLanguage) mozile.locale = navigator.userLanguage;
}
if(!mozile.root) mozile.root = "";
mozile.version = {
major: "0",
minor: "8",
micro: "0",
flag: "a1",
toString: function() {
return this.major + "." + this.minor + "." + this.micro + this.flag;
}
}
mozile.about = "Mozile is a WYSIWYG inline edtior for XHTML and XML+CSS files.";
mozile.copyright = "Copyright 2006, The Mozile Team";
mozile.license = "MPL 1.1/GPL 2.0/LGPL 2.1, http://mozile.mozdev.org/0.8/LICENSE";
mozile.homepage = "http://mozile.mozdev.org";
mozile.credits = "James A. Overton, Conor Dowling, Max d'Ayala, Christian Stocker, Paul Everitt, David Palm, Richard Prescott, Lars Kiilerich, Kingsley Kerse, Tobias Minich, Andreas Schamberger, and others...";
mozile.acknowledgements = "Icons created by Mark James <http://www.famfamfam.com/lab/icons/silk/>";
mozile.precompiled = false;
mozile.deferRequirements = false;
mozile.help = ["doc", "html", "index.html"].join(mozile.filesep);
mozile.useDesignMode = false;
mozile.defaultNS = null;
mozile.emptyToken = "\u00A0";
mozile.alternateSpace = null;
mozile.updateInterval = 500;
mozile.load = function(uri) {
var XHR;
try{
if(mozile.window.XMLHttpRequest) {
XHR = new XMLHttpRequest();
XHR.open("GET", uri, false);
XHR.send(null);
}
else if(mozile.window.ActiveXObject) {
XHR = new ActiveXObject('Microsoft.XMLHTTP');
XHR.open("GET", uri, false);
XHR.send();
}
} catch(e) {
if(mozile.debug) mozile.debug.inform("mozile.load", "File load failed loading '"+ uri +"' with error message:\n"+ e);
return null;
}
if(XHR) {
if(XHR.status == 0 || XHR.status == 200) return XHR.responseText;
else {
if(mozile.debug) mozile.debug.inform("mozile.load", "File load failed with status '"+ XHR.status +"' and message:\n"+ XHR.responseText);
return null;
}
}
if(mozile.debug) mozile.debug.inform("mozile.load", "No XMLHttpRequest available when trying to load '"+ uri +"'.");
return null;
}
mozile.findRoot = function() {
if(mozile.window.mozileRoot != undefined) return mozileRoot;
var scripts = mozile.document.getElementsByTagName("script");
var matches = ["mozile.js", "mozile-src.js"];
var src, index, i, j;
for(i=0; i < scripts.length; i++) {
src = scripts[i].getAttribute("src");
if(!src) continue;
for(j=0; j < matches.length; j++) {
index = src.indexOf(matches[j]);
if(index > -1) return src.substring(0, index);
}
}
return "";
}
mozile.root = mozile.findRoot();
mozile.findModule = function(moduleName) {
var levels = moduleName.split(".");
var current = window;
for(var i=0; i < levels.length; i++) {
if(!current[levels[i]]) return null;
current = current[levels[i]];
}
return current;
}
mozile.loadModule = function(moduleName) {
if(!moduleName) return false;
var filepath = [mozile.root];
var levels = moduleName.split(".");
for(var i=0; i < levels.length; i++) {
if(levels[i] == "*") levels = levels.splice(i,1);
}
if(levels[0] && levels[0] == "mozile") {
levels.shift();
if(levels[0] && levels[0] == "test") {
levels.shift();
filepath.push("tests");
}
else filepath.push("src");
}
else return false;
if(levels.length == 0) return false;
while(levels.length > 1) {
filepath.push(levels.shift());
}
filepath.push(levels.pop() +".js");
var file = mozile.load(mozile.joinPaths(filepath));
if(!file && mozile.test && mozile.test.root) {
filepath.shift();
filepath.unshift(mozile.test.root);
file = mozile.load(mozile.joinPaths(filepath));
}
if(!file) {
var parent = moduleName.substring(0, moduleName.lastIndexOf("."));
return mozile.loadModule(parent);
}
try {
eval(file);
return true;
} catch(e) {
mozile.debug.inform("mozile.loadModule", "Error evaluating module '"+ moduleName +"' in file '"+ mozile.joinPaths(filepath) +"'.\n"+ mozile.dumpError(e));
return false;
}
}
mozile.deferrals = new Array();
mozile.require = function(moduleName) {
if(!mozile.findModule(moduleName)) {
if(mozile.deferRequirements) {
mozile.deferrals.push(moduleName);
return false;
}
return mozile.loadModule(moduleName);
}
else return false;
}
mozile.loadDeferred = function() {
while(mozile.deferrals.length) {
mozile.require(mozile.deferrals.shift());
}
}
mozile.provide = function() {
}
mozile.setTarget = function(win) {
if(mozile.save) {
win.onbeforeunload = mozile.save.onbeforeunload;
if(mozile.save.target = mozile.document)
mozile.save.target = win.document;
}
mozile.window = win;
mozile.document = win.document;
win.mozile = mozile;
}
mozile.getLocalization = function(moduleName, bundleName, locale) {
mozile.require("mozile.util");
if(!locale || typeof(locale) != "string") locale = mozile.locale;
if(!locale || typeof(locale) != "string") return {};
locale = locale.toLowerCase();
moduleName = moduleName.replace(/^mozile\./m, "src.");
var packagePath = moduleName.replace(/\./g, mozile.filesep);
var modulePath = mozile.joinPaths(mozile.root, packagePath, "nls");
mozile.debug.debug(packagePath);
var path = mozile.joinPaths(modulePath, bundleName + ".js");
var code = mozile.load(path);
var localization = {};
var extension;
if(code) localization = mozile.util.parseJSON(code);
var family = locale.split("-")[0];
path = mozile.joinPaths(modulePath, family, bundleName + ".js");
code = mozile.load(path);
if(code) {
extension = mozile.util.parseJSON(code);
localization = mozile._extendLocalization(localization, extension);
}
path = mozile.joinPaths(modulePath, locale, bundleName + ".js");
code = mozile.load(path);
if(code) {
extension = mozile.util.parseJSON(code);
localization = mozile._extendLocalization(localization, extension);
}
return localization;
}
mozile._extendLocalization = function(general, specific) {
if(!general || typeof(general) != "object") return {};
if(!specific || typeof(specific) != "object") return general;
var key, value;
for(key in specific) {
value = specific[key];
if(value instanceof Array) general[key] = value;
else if(typeof(value) == "object" &&
typeof(general[key]) == "object") {
mozile._extendLocalization(general[key], value);
}
else general[key] = value;
}
return general;
}
mozile.Module = function() {};
mozile.isPathAbsolute = function(path) {
if(!path) return false;
path = path.toString();
if(path.match(/^[a-zA-Z]+\:\/\
return false;
}
mozile.getPath = function(url) {
if(!url) return "";
url = url.toString();
if(url.indexOf("?") > -1) url = url.substring(0, url.indexOf("?"));
return url;
}
mozile.getDirectory = function(path) {
if(!path) return "";
path = path.toString();
path = mozile.getPath(path);
var partial;
if(path.indexOf(mozile.filesep) > -1) {
if(path.indexOf(":///") > -1) {
partial = path.substring(path.indexOf(":///")+4);
if(partial.indexOf(mozile.filesep) == -1) return path;
}
else if(path.indexOf("://") > -1) {
partial = path.substring(path.indexOf("://")+3);
if(partial.indexOf(mozile.filesep) == -1) return path;
}
return path.substring(0, path.lastIndexOf(mozile.filesep)+1);
}
return path;
}
mozile.getAbsolutePath = function(path, root) {
if(!path) return "";
path = path.toString();
if(mozile.isPathAbsolute(path)) return path;
if(!root) root = location;
root = mozile.getDirectory(root);
root = mozile.getAbsolutePath(root);
return mozile.joinPaths(root, path);
}
mozile.joinPaths = function() {
var path = "";
var args, part;
if(arguments.length == 0) return path;
else if(arguments.length == 1 && arguments[0] instanceof Array)
args = arguments[0];
else args = arguments;
for(var i=0; i < args.length; i++) {
part = args[i];
if(typeof(part) != "string") continue;
if(path) {
if(path.charAt(path.length - 1) == mozile.filesep) {
if(part.charAt(0) == mozile.filesep)
part = part.substring(1);
}
else {
if(part.charAt(0) != mozile.filesep)
part = mozile.filesep + part;
}
}
path += part;
}
return path;
}
mozile.prompt = function(title, message, value, fn, scope, multiline) {
if(!message || typeof(message) != "string") return false;
if(!fn || typeof(fn) != "function") return false;
if(mozile.gui && mozile.gui.factory && mozile.gui.factory.prompt &&
typeof(mozile.gui.factory.prompt) == "function") {
mozile.gui.factory.prompt(title, message, value, fn, scope, multiline);
}
else {
var result = prompt(message, value);
var status = "ok";
if(result === null) status = "cancel";
fn.call(scope || mozile.window, status, result);
}
return true;
}
mozile.debug = new Object();
mozile.debug.prototype = new mozile.Module;
mozile.debug.alertLevel = "suppress";
mozile.debug.logLevel = "warn";
mozile.debug.messages = new Array();
mozile.debug.window = null;
mozile.debug.isSelected = function(type, level) {
if(typeof(type) != "string") return false;
type = type.toLowerCase();
var checkLevel;
if(type == "alert") checkLevel = mozile.debug.alertLevel;
else if(type == "log") checkLevel = mozile.debug.logLevel;
else return false;
checkLevel = checkLevel.toLowerCase();
if(typeof(level) != "string") return false;
level = level.toLowerCase();
if(checkLevel == "suppress") return false;
if(checkLevel == "warn") {
if(level =="warn") return true;
else return false;
}
if(checkLevel == "inform") {
if(level == "warn" || level == "inform") return true;
else return false;
}
if(checkLevel == "debug") return true;
return false;
}
mozile.debug.warn = function(caller, message) {
var level = "warn";
var msg = "Mozile Warning ["+ caller +"] "+ message;
if(mozile.debug.isSelected("alert", level)) {
if(mozile.window.warn) warn(msg);
else mozile.alert(msg);
}
if(mozile.debug.isSelected("log", level)) {
mozile.debug.log(caller, level, message);
}
}
mozile.debug.inform = function(caller, message) {
var level = "inform";
var msg = "Mozile Information ["+ caller +"] "+ message;
if(mozile.debug.isSelected("alert", level)) {
if(mozile.window.inform) inform(msg);
else mozile.alert(msg);
}
if(mozile.debug.isSelected("log", level)) {
mozile.debug.log(caller, level, message);
}
}
mozile.debug.debug = function(caller, message) {
var level = "debug";
var msg = "Mozile Debugging ["+ caller +"] "+ message;
if(mozile.debug.isSelected("alert", level)) {
if(mozile.window.debug) debug(msg);
else mozile.alert(msg);
}
if(mozile.debug.isSelected("log", level)) {
mozile.debug.log(caller, level, message);
}
}
mozile.debug.log = function(caller, level, message) {
var date = new Date();
var msg = {
caller: caller,
level: level,
message: message,
date: date.toLocaleString(),
toString: function() {
return this.level.toUpperCase() +" ("+ this.date +") ["+ this.caller +"] "+ this.message;
}
};
mozile.debug.messages.push(msg);
if(mozile.debug.window && mozile.debug.window.document) {
mozile.debug.window.document.write(msg +"<br/>\n");
mozile.debug.window.scroll(0, document.body.clientHeight);
}
if(mozile.window.console) console.info(msg);
}
mozile.debug.show = function() {
if(!mozile.debug.window || !mozile.debug.window.document) {
mozile.debug.window = window.open("", "MozileDebugging", "");
mozile.debug.window.document.write("<h3>Mozile Debugging Messages</h3>");
mozile.debug.window.document.write(mozile.debug.messages.join("<br/>\n") + "<br/>\n");
}
else mozile.debug.window = mozile.window.open("", "MozileDebugging", "");
}
mozile.alert = function(message) {
alert(message);
}
mozile.dumpError = function(object) {
if(typeof(object) == "string") return object;
if(!mozile.browser.isIE) return object.toString();
var fields;
if(object && object.description) {
fields = [
"Name: "+ object.name,
"Number: "+ object.number,
"Message: "+ object.message,
"Description: "+ object.description,
];
return fields.join("\n");
}
if(!object) object = mozile.document;
if(!object.parseError) object = mozile.document;
if(!object.parseError) object = mozile.window;
if(!object.parseError) return "[No error to parse]";
fields = [
"Error Code: "+ object.parseError.errorCode,
"File Position: "+object.parseError.filepos,
"Line: "+object.parseError.line,
"Line Position: "+object.parseError.linepos,
"Reason: "+object.parseError.reason,
"Source Text: "+object.parseError.srcText,
"Url: "+object.parseError.url
];
return fields.join("\n");
}
mozile.editElement = function(elementOrId) {
var element;
if(typeof(elementOrId) == "string") {
if(mozile.document.documentElement.nodeName.toLowerCase() == "html") {
element = mozile.document.getElementById(elementOrId);
}
else {
mozile.require("mozile.dom");
var results = mozile.dom.getElements("id", elementOrId, null, true);
if(results.length) element = results[0];
else return false;
}
}
else if(elementOrId.nodeType &&
elementOrId.nodeType == mozile.dom.ELEMENT_NODE) {
element = elementOrId;
}
if(element) return mozile._markEditable(element, true);
return false;
}
mozile.editElements = function(listOrValue, name) {
var list;
if(typeof(listOrValue) == "string") {
mozile.require("mozile.dom");
list = mozile.dom.getElements(name, listOrValue);
}
else if(listOrValue.length) {
list = listOrValue;
}
if(list.length) {
for(var i=0; i < list.length; i++) {
if(list[i] && list[i].nodeType &&
list[i].nodeType == mozile.dom.ELEMENT_NODE) {
mozile.editElement(list[i]);
}
}
}
return undefined;
}
mozile.editDocument = function(doc) {
if(!doc) doc = mozile.document;
mozile.editElement(doc.documentElement);
}
mozile.protectElement = function(elementOrId) {
var element;
if(typeof(elementOrId) == "string") {
if(mozile.document.documentElement.nodeName.toLowerCase() == "html") {
element = mozile.document.getElementById(elementOrId);
}
else {
mozile.require("mozile.dom");
var results = mozile.dom.getElements("id", elementOrId, null, true);
if(results.length) element = results[0];
else return false;
}
}
else if(elementOrId.nodeType &&
elementOrId.nodeType == mozile.dom.ELEMENT_NODE) {
element = elementOrId;
}
if(element) return mozile._markEditable(element, false);
return false;
}
mozile.protectElements = function(listOrValue, name) {
var list;
if(typeof(listOrValue) == "string") {
mozile.require("mozile.dom");
list = mozile.dom.getElements(name, listOrValue);
}
else if(listOrValue.length) {
list = listOrValue;
}
if(list.length) {
for(var i=0; i < list.length; i++) {
if(list[i] && list[i].nodeType &&
list[i].nodeType == mozile.dom.ELEMENT_NODE) {
mozile.protectElement(list[i]);
}
}
}
return undefined;
}
mozile._markEditable = function(element, value) {
if(!element) return null;
mozile.require("mozile.edit");
if(value === true && mozile.edit.setMark(element, "editable") === false &&
mozile.edit.getContainer(element.parentNode)) {
mozile.edit.setMark(element, "editable", undefined);
if(mozile.edit.getMark(element, "contentEditable") == undefined) {
element.removeAttribute("contentEditable");
}
element.ondrop = null;
element.onpaste = null;
return value;
}
mozile.edit.setMark(element, "editable", value);
if(mozile.edit.getMark(element, "contentEditable") == undefined) {
switch(element.getAttribute("contentEditable")) {
case "true":
mozile.edit.setMark(element, "contentEditable", true);
break;
case "false":
mozile.edit.setMark(element, "contentEditable", false);
break;
}
}
element.setAttribute("contentEditable", String(value));
if(value) {
element.ondrop = mozile._nullFunction;
element.onbeforepaste = mozile.edit.paste._preExecute;
element.onpaste = mozile._nullFunction;
mozile.dom.addClass(element, "mozileEditorContainer");
}
else {
element.ondrop = null;
element.onbeforepaste = null;
element.onpaste = null;
mozile.dom.removeClass(element, "mozileEditorContainer");
}
return value;
}
mozile._nullFunction = function() {
mozile.window.event.returnValue = false;
mozile.window.event.cancelBubble = true;
return false;
}
mozile.enableEditing = function(rich) {
mozile.require("mozile.edit");
mozile.edit.defaults.addCommand(mozile.edit.navigateLeftRight);
mozile.edit.defaults.addCommand(mozile.edit.insertText);
mozile.edit.defaults.addCommand(mozile.edit.removeText);
if(rich) {
mozile.require("mozile.edit.rich");
mozile.edit.defaults.addCommand(mozile.edit.remove);
}
}
mozile.useSchema = function(target, localeBundle) {
try {
mozile.require("mozile.rng");
mozile.require("mozile.edit");
mozile.require("mozile.edit.rich");
mozile.edit.extendRNG();
mozile.schema = new mozile.rng.Schema();
var validation = mozile.schema.parse(target);
if(validation.isValid) {
if(!localeBundle) {
var match = target.match(/\/(\S+)\.(rng|xml)$/mi);
if(match) localeBundle = match[1];
}
var localization = mozile.getLocalization(
mozile.getDirectory(target), localeBundle);
mozile.edit.generateCommands(mozile.schema, localization);
mozile.schema.strings = localization;
return true;
}
else {
mozile.debug.inform("mozile.useSchema", "Schema validation failed.\n"+ validation.report(true));
return false;
}
} catch(e) {
mozile.debug.inform("mozile.useSchema", "Could not create schema for target '"+ target +"' because of an error:\n"+ mozile.dumpError(e));
return false;
}
}
mozile.os = new Object();
mozile.os.prototype = new mozile.Module;
mozile.os.isMac = false;
if(navigator.userAgent.match(/Macintosh/)) mozile.os.isMac = true;
mozile.browser = new Object();
mozile.browser.prototype = new mozile.Module;
mozile.browser.isMozilla = false;
mozile.browser.mozillaVersion = 0;
mozile.browser.mozillaVersion = navigator.userAgent.match(/rv\:(\d+\.\d+)/);
if(mozile.browser.mozillaVersion &&
Number(mozile.browser.mozillaVersion[1])) {
mozile.browser.isMozilla = true;
mozile.browser.mozillaVersion = Number(mozile.browser.mozillaVersion[1]);
}
mozile.browser.isIE = false;
if(navigator.userAgent.match(/MSIE/)) mozile.browser.isIE = true;
mozile.browser.isSafari = false;
if(navigator.userAgent.match(/Safari/)) mozile.browser.isSafari = true;
mozile.browser.safariVersion = 0;
mozile.browser.safariVersion = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
if(mozile.browser.safariVersion &&
Number(mozile.browser.safariVersion[1])) {
mozile.browser.safariVersion = Number(mozile.browser.safariVersion[1]);
}
mozile.browser.isOpera = false;
if(navigator.userAgent.match(/Opera/)) mozile.browser.isOpera = true;
if(mozile.browser.isMozilla) {
if(mozile.document.contentType && mozile.document.contentType == "text/html") {
mozile.defaultNS = null;
}
else {
mozile.defaultNS = "http://www.w3.org/1999/xhtml";
}
}
Documentation generated by
JSDoc on Wed Feb 20 13:25:28 2008