1 /**
  2  * Namespace for entire Xquared classes
  3  */
  4 var xq = {
  5 	majorVersion: '0.1',
  6 	minorVersion: '2007119'
  7 };
  8 
  9 /**
 10  * Make given object as event source
 11  *
 12  * @param {Object} object target object
 13  * @param {String} prefix prefix for generated functions
 14  * @param {Array} events array of string which contains name of events
 15  */
 16 xq.asEventSource = function(object, prefix, events) {
 17 	object._listeners = []
 18 	object._registerEventFirer = function(prefix, name) {
 19 		this["_fireOn" + name] = function() {
 20 			for(var i = 0; i < this._listeners.length; i++) {
 21 				var listener = this._listeners[i];
 22 				var func = listener["on" + prefix + name];
 23 				if(func) func.apply(listener, $A(arguments));
 24 			}
 25 		}
 26 	}
 27 	object.addListener = function(l) {
 28 		this._listeners.push(l);
 29 	}
 30 	
 31 	for(var i = 0; i < events.length; i++) {
 32 		object._registerEventFirer(prefix, events[i]);
 33 	}
 34 }
 35 
 36 /**
 37  * Returns the index of given element
 38  *
 39  * @returns {Number} index or -1
 40  */
 41 Array.prototype.indexOf = function(n) {
 42 	for(var i = 0; i < this.length; i++) {
 43 		if(this[i] == n) return i;
 44 	}
 45 	
 46 	return -1;
 47 }
 48 
 49 Date.preset = null;
 50 Date.pass = function(msec) {
 51 	if(Date.preset == null) return;
 52 	Date.preset = new Date(Date.preset.getTime() + msec);
 53 }
 54 Date.get = function() {
 55 	return Date.preset == null ? new Date() : Date.preset;
 56 }
 57 Date.prototype.elapsed = function(msec) {
 58 	return Date.get().getTime() - this.getTime() >= msec;
 59 }
 60 
 61 String.prototype.merge = function(data) {
 62 	var newString = this;
 63 	for(k in data) {
 64 		newString = newString.replace("{" + k + "}", data[k]);
 65 	}
 66 	return newString;
 67 }
 68 
 69 String.prototype.parseURL = function() {
 70 	var m = this.match(/((((\w+):\/\/(((([^@:]+)(:([^@]+))?)@)?([^:\/\?#]+)?(:(\d+))?))?([^\?#]+)?)(\?([^#]+))?)(#(.+))?/);
 71 	
 72 	var includeAnchor = m[0];
 73 	var includeQuery = m[1] || undefined;
 74 	var includePath = m[2] || undefined;
 75 	var includeHost = m[3] || undefined;
 76 	var includeBase = null;
 77 	var protocol = m[4] || undefined;
 78 	var user = m[8] || undefined;
 79 	var password = m[10] || undefined;
 80 	var domain = m[11] || undefined;
 81 	var port = m[13] || undefined;
 82 	var path = m[14] || undefined;
 83 	var query = m[16] || undefined;
 84 	var anchor = m[18] || undefined;
 85 	
 86 	if(!path || path == '/') {
 87 		includeBase = includeHost + '/';
 88 	} else {
 89 		var index = path.lastIndexOf('/');
 90 		includeBase = includeHost + path.substring(0, index + 1);
 91 	}
 92 	
 93 	return {
 94 		includeAnchor: includeAnchor,
 95 		includeQuery: includeQuery,
 96 		includePath: includePath,
 97 		includeBase: includeBase,
 98 		includeHost: includeHost,
 99 		protocol: protocol,
100 		user: user,
101 		password: password,
102 		domain: domain,
103 		port: port,
104 		path: path,
105 		query: query,
106 		anchor: anchor
107 	};
108 }
109 
110 xq.findXquaredScript = function() {
111     return $A(document.getElementsByTagName("script")).find(function(script) {
112     	return script.src && script.src.match(/xquared\.js/i);
113     });
114 }
115 xq.shouldLoadOthers = function() {
116 	var script = xq.findXquaredScript();
117     return script && !!script.src.match(/xquared\.js\?load_others=1/i);
118 }
119 xq.loadScript = function(url) {
120     document.write('<script type="text/javascript" src="' + url + '"></script>');
121 }
122 xq.loadOthers = function() {
123 	var script = xq.findXquaredScript();
124 	var basePath = script.src.match(/(.*\/)xquared\.js.*/i)[1];
125 	var others = [
126 		'Editor.js',
127 		'Browser.js',
128 		'Shortcut.js',
129 		'DomTree.js',
130 		'RichDom.js',
131 		'RichDomW3.js',
132 		'RichDomGecko.js',
133 		'RichDomWebkit.js',
134 		'RichDomTrident.js',
135 		'RichTable.js',
136 		'Validator.js',
137 		'ValidatorW3.js',
138 		'ValidatorGecko.js',
139 		'ValidatorWebkit.js',
140 		'ValidatorTrident.js',
141 		'EditHistory.js',
142 		'Controls.js',
143 		'_ui_templates.js'
144 	];
145 	others.each(function(name) {
146 		xq.loadScript(basePath + name);
147 	});
148 }
149 
150 if(xq.shouldLoadOthers()) xq.loadOthers();