(function($) {
	$.dtemplate = {
		importXML : function(txt) {
			if (document.implementation && document.implementation.createDocument)	{
				var __parser = new DOMParser();
				var xmlDoc = __parser.parseFromString(txt, "text/xml");
			}	else if (window.ActiveXObject)	{
				var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async = false;
				xmlDoc.loadXML(txt);
			}

			if(xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.hasChildNodes) {
				return xmlDoc;
			}

			return false;
		},
		include : function(a) {
			document.getElementsByTagName("head")[0].appendChild(a);
		},
		script: function(element) {
			var jscode = element.firstChild.nodeValue;
			eval(jscode);
		},
		make : function(xmlNode) {
			var self = arguments.callee;
			switch(xmlNode.nodeType) {
				case 1:  // element
					return element(xmlNode);
				case 3:  // text
				case 4:  // cdata -- Corrected by Mike Alsup 07/26/2006
					var t = xmlNode.nodeValue.replace(/^\s+|\s+$/g, " "); // condense white space
					return t.length < 1 ? undefined : document.createTextNode(t);
				default:
					return undefined; // do nothing;
			}
			function element(xNode) {
				var node = document.createElement(xNode.tagName);
				var isradio = false;
				var attr = [];
				for(var i = 0, a = xNode.attributes; i < a.length; i++) {
					jQuery(node).attr(a[i].nodeName, a[i].nodeValue);
					attr.push(a[i].nodeName + '="' + a[i].nodeValue + '"');
				}
				for(var i = 0, c = xNode.childNodes; i < c.length; i++) {
					var child = self(c[i]);
					if(child) {
						node.appendChild(child);
					}
				}

				if(jQuery.browser.msie && node.type == "radio") {
					return document.createElement("<input "+ attr.join(" ") +" />");
				}

				return node;
			}
		}
	};

	

	$.fn.dtemplate = function(options) {
		/* init metadata */
		options = options || {
			datatype : "attr"
		};
		if (options.datatype == "class")
			$.meta.setType("class");
		else if (options.datatype == "script")
			$.meta.setType("elem", "script");
		else
			$.meta.setType("attr", "data");
		/* populate template element */
		var loads= $(".dtp-element-loading", this);
		var objs = $(".dtp-element", this);
		var __this=this;
		if(objs.length>0)
		{
			try {
				var _this = $(objs[0]);
				var o = _this.data();
				//if (o && o.sbroot && o.tpl) {
				if (o && o.url) {
					_this.removeClass("dtp-element").addClass("dtp-element-loading");
					$.ajax( {
						type : "GET",
						url : o.url,//o.sbroot+"Proxy/WebProxy.aspx",
						//data : {control:"../UC.Publish/RenderTemplateUC",action:"load",path:window.location.href,template:o.tpl},
						dataType : "json",
						success : function(data){
						    var xmlObj=null;
							try
							{
								xmlObj=$.dtemplate.importXML("<root>"+data.include+"</root>");
								$("/root/*",xmlObj).each(function(){
									$.dtemplate.include($.dtemplate.make(this));
								});
							}
							catch(e){}
							
							_this.prepend(data.body).removeClass("dtp-element-loading").addClass("dtp-element-loaded");
							if($.browser.msie)
							{
								try
								{
									xmlObj=$.dtemplate.importXML("<root>"+data.body+"</root>");
									$("/root/script",xmlObj).each(function(){
										$.dtemplate.script(this);
									});
								}
								catch(e){}
							}

							$(".dtp-region-panel", _this).each(function() {
							try {
									var p = $(this);
									var pd = p.data();
									$(".dtp-region-content", _this)
											.each(function() {
												var c = $(this);
												var cd = c.data();
												if (pd.id == cd.id) {
													p.html(c.html().replace(/>[\r\n ]+</gi,"><"));
													c.remove();
												}
											});
								} catch (e) {
								}
							});
							$(__this).dtemplate(options);
						}
					});
					return $(this);
				}
			} catch (e) {
			    $(document.body).show();
				if(typeof(options.callback_error)=="function")
					options.callback_error(e);
				return $(this);
			}
		}
		else
		{
			if (loads.length == 0) {
				/*$('link[@rel*=style]').each(function(i) {
					this.disabled = true;
					this.disabled = false;
				});*/
				$(".dtp-dummy-title").hide();
				$(".dtp-dummy-link").hide();
				$(document.body).show();
				if (typeof(options.callback) == "function")
					options.callback();
			}
			return $(this);
		}
	};
})($);
