/**
 * Parser.js
 *
 * Copyright 2009, Moxiecode Systems AB
 * Released under LGPL License.
 *
 * License: http://tinymce.moxiecode.com/license
 * Contributing: http://tinymce.moxiecode.com/contributing
 */

(function() {
	/**
	 * XML Parser class. This class is only available for the dev version of TinyMCE.
	 */
	tinymce.create('tinymce.xml.Parser', {
		/**
		 * Constucts a new XML parser instance.
		 *
		 * @param {Object} Optional settings object.
		 */
		Parser : function(s) {
			this.settings = tinymce.extend({
				async : true
			}, s);
		},

		/**
		 * Parses the specified document and executed the callback ones it's parsed.
		 *
		 * @param {String} u URL to XML file to parse.
		 * @param {function} cb Optional callback to execute ones the XML file is loaded.
		 * @param {Object} s Optional scope for the callback execution.
		 */
		load : function(u, cb, s) {
			var doc, t, w = window, c = 0;

			s = s || this;

			// Explorer, use XMLDOM since it can be used on local fs
			if (window.ActiveXObject) {
				doc = new ActiveXObject("Microsoft.XMLDOM");
				doc.async = this.settings.async;

				// Wait for response
				if (doc.async) {
					function check() {
						if (doc.readyState == 4 || c++ > 10000)
							return cb.call(s, doc);

						w.setTimeout(check, 10);
					};

					t = w.setTimeout(check, 10);
				}

				doc.load(u);

				if (!doc.async)
					cb.call(s, doc);

				return;
			}

			// W3C using XMLHttpRequest
			if (window.XMLHttpRequest) {
				try {
					doc = new window.XMLHttpRequest();
					doc.open('GET', u, this.settings.async);
					doc.async = this.settings.async;

					doc.onload = function() {
						cb.call(s, doc.responseXML);
					};

					doc.send('');
				} catch (ex) {
					cb.call(s, null, ex);
				}
			}
		},

		/**
		 * Parses the specified XML string.
		 *
		 * @param {String} xml XML String to parse.
		 * @return {Document} XML Document instance.
		 */
		loadXML : function(xml) {
			var doc;

			// W3C
			if (window.DOMParser)
				return new DOMParser().parseFromString(xml, "text/xml");

			// Explorer
			if (window.ActiveXObject) {
				doc = new ActiveXObject("Microsoft.XMLDOM");
				doc.async = "false";
				doc.loadXML(xml);

				return doc;
			}
		},

		/**
		 * Returns all string contents of a element concated together.
		 *
		 * @param {XMLNode} el XML element to retrieve text from.
		 * @return {string} XML element text contents.
		 */
		getText : function(el) {
			var o = '';

			if (!el)
				return '';

			if (el.hasChildNodes()) {
				el = el.firstChild;

				do {
					if (el.nodeType == 3 || el.nodeType == 4)
						o += el.nodeValue;
				} while(el = el.nextSibling);
			}

			return o;
		}
	});
})();
