﻿
Ext.namespace('Ext','Ext.ux');(function(){Ext.ux.DomTemplate=function(config){config=config||{};if(!config.tpl){throw"Ext.ux.DomTemplate: No tpl parameter passed in config";}
Ext.apply(this,config);this._handlers=Ext.apply({},this.defaultHandlers);if(this.handlers){this.setHandler(this.handlers);delete this.handlers;}
this.set(config.tpl);};Ext.ux.DomTemplate.prototype={getLocalName:function(el){if(Ext.isIE){var splitPos=el.nodeName.indexOf(':');if(splitPos!=-1){return el.nodeName.substr(splitPos+1);}
return el.nodeName;}
return el.localName;},setHandler:function(handlerName,fn,scope){if(typeof handlerName=="object"){var o=handlerName;for(var e in o){if(e==="scope"){continue;}
if(typeof o[e]=="function"){this.setHandler(e,o[e],o.scope);}else{this.setHandler(e,o[e].fn,o[e].scope);}}
return;}
this._handlers[handlerName]={fn:fn,scope:scope||this};},removeHandler:function(handlerName){if(this._handlers[handlerName]){delete this._handlers[handlerName]}},replaceTags:function(t,replacer){if(typeof(t)==="number"){t=''+t;}else{t=t||'';}
var result='';for(var i=0;;){var open=t.indexOf('{',i);var close=t.indexOf('}',i);if((open<0)&&(close<0)){result+=t.slice(i);break;}
if((close>0)&&((close<open)||(open<0))){if(t.charAt(close+1)!=='}'){throw"Missing closing brace in template: "+t;}
result+=t.slice(i,close+1);i=close+2;continue;}
result+=t.slice(i,open);i=open+1;if(t.charAt(i)==='{'){result+='{';i++;continue;}
if(close<0)
throw"Missing closing brace in template: "+t;var tag=t.substring(i,close);var value=replacer.replaceAttribute(tag);if(typeof(value)!=="undefined"&&value!==null){result+=value;}
i=close+1;}
return result;},cloneTextNodeUnder:function(parent,n,replacer){var t=n.nodeValue;var result='';for(var i=0;;){var open=t.indexOf('{',i);var close=t.indexOf('}',i);if((open<0)&&(close<0)){result+=t.slice(i);break;}
if((close>0)&&((close<open)||(open<0))){if(t.charAt(close+1)!=='}'){throw"Missing closing brace in template: "+t;}
result+=t.slice(i,close+1);i=close+2;continue;}
result+=t.slice(i,open);i=open+1;if(t.charAt(i)==='{'){result+='{';i++;continue;}
if(close<0)
throw"Missing closing brace in template: "+t;parent.appendChild(document.createTextNode(result));result='';var tag=t.substring(i,close);var value=replacer.replaceText(tag);if(typeof(value)!=="undefined"&&value!==null){if(typeof(value)==="object"&&typeof(value.nodeType)==="number"){parent.appendChild(value);}else{parent.appendChild(document.createTextNode(value));}}
i=close+1;}
if(result){parent.appendChild(document.createTextNode(result));}},copyAttributes:function(to,from,replacer,skipAtts){skipAtts=skipAtts||{};for(var i=0;i<from.attributes.length;++i){var org=from.attributes[i];var attName=this.getLocalName(org);var x=org.nodeValue;if(Ext.isIE&&attName==="style"){if(org.nodeValue){var styles=org.nodeValue.split(';');var eel=Ext.get(to);for(var j=0;j<styles.length;++j){var kv=styles[j].split(':');if(kv[0]&&kv[1]){eel.setStyle(kv[0],kv[1]);}}}}else if(org.nodeValue&&!skipAtts.hasOwnProperty(attName.toLowerCase())){var attr=document.createAttribute(attName);attr.value=this.replaceTags(org.nodeValue,replacer);to.setAttributeNode(attr);}}},cloneNode:function(n,replacer){var el=document.createElement(this.getLocalName(n));this.copyAttributes(el,n,replacer);return el;},cloneNodeUnder:function(parent,n,replacer){if(n.nodeType==XML.TEXT_NODE){this.cloneTextNodeUnder(parent,n,replacer);return parent;}
if(n.nodeType==XML.COMMENT_NODE){return parent;}
if(n.nodeType!=XML.ELEMENT_NODE){throw"unknown node type in template: "+n.nodeType;}
var el=this.cloneNode(n,replacer);var elTemp=el;for(var c=n.firstChild;c;c=c.nextSibling){elTemp=this.cloneNodeUnder(elTemp,c,replacer);}
var tag=this.getLocalName(el).toLowerCase(),parentTag=this.getLocalName(parent).toLowerCase();if(tag==="tr"&&parentTag!=="tbody"&&parentTag!=="thead"){var tbody=document.createElement("tbody");tbody.appendChild(el);parent.appendChild(tbody);return tbody;}
parent.appendChild(el);return parent;},cloneTemplate:function(parent,replacer,tpl){for(var n=(tpl||this.tpl).firstChild;n;n=n.nextSibling){parent=this.cloneNodeUnder(parent,n,replacer);}},doTable:function(wrapperClass,el,replacer){var tab=document.createElement('table');tab.cellPadding=XML.getIntAttribute(this.tpl,"cell-padding",0);tab.cellSpacing=XML.getIntAttribute(this.tpl,"cell-spacing",0);tab.width="100%";if(wrapperClass){tab.className=wrapperClass;}
el.appendChild(tab);var tpl=XML.getChild(this.tpl,"row");if(tpl){var head=XML.getChild(this.tpl,"header");if(head){var thead=tab.createTHead();var item=thead.insertRow(-1);this.cloneTemplate(item,replacer,head);}}else{tpl=this.tpl;}
replacer.each(function(){var item=tab.insertRow(-1);this.cloneTemplate(item,replacer,tpl);replacer.createdItem(item);},this);return tab;},doDiv:function(el,replacer){var firstItem=null;replacer.each(function(){var item=document.createElement("div");this.cloneTemplate(item,replacer);el.appendChild(item);replacer.createdItem(item);if(!firstItem){firstItem=item;}},this);return firstItem;},doNone:function(el,replacer){replacer.each(function(){this.cloneTemplate(el,replacer);replacer.createdItem(el);},this);return el;},doAppend:function(el,replacer,returnElement){var wrapperType="none";if(this.tpl.nodeType!=XML.DOCUMENT_NODE&&this.tpl.nodeType!=XML.DOCUMENT_FRAGMENT_NODE){wrapperType=this.wrapperType||XML.getAttribute(this.tpl,"wrapper-type","none");wrapperClass=this.wrapperClass||XML.getAttribute(this.tpl,"wrapper-class");}
var n;switch(wrapperType){case"table":n=this.doTable(wrapperClass,el,replacer);break;case"none":n=this.doNone(el,replacer);break;default:n=this.doDiv(el,replacer);break;}
return returnElement?Ext.get(n):n;},doApply:function(replacer){var el=document.createElement("div");this.doAppend(el,replacer);return el.innerHTML;},doInsertAfter:function(el,replacer,returnElement){var frag=document.createDocumentFragment();var ret=this.doAppend(frag,replacer,returnElement);var el=Ext.getDom(el);if(el.nextSibling){el.insertBefore(frag,el.nextSibling);}else{el.parentNode.appendChild(frag);}
return el;},doInsertBefore:function(el,replacer,returnElement){var frag=document.createDocumentFragment();var ret=this.doAppend(frag,replacer,returnElement);var el=Ext.getDom(el);el.insertBefore(frag,el);return ret;},doOverwrite:function(el,replacer,returnElement){el=Ext.getDom(el);this.cleanEl(el);return this.doAppend(el,replacer,returnElement);},makeReplacer:function(values){return{values:(typeof(values)==="undefined"||values===null)?[{}]:Ext.isArray(values)?values:[values],current:null,callHandler:function(name,tag){var h=this.tpl._handlers[name];return h?h.fn.call(h.scope,this.tpl,this.current,tag):null;},replaceText:function(tag){return this.callHandler("replaceText",tag);},replaceAttribute:function(tag){return this.callHandler("replaceAttribute",tag);},createdItem:function(item){return this.callHandler("createdItem",item);},each:function(callback,scope){for(var i=0;i<this.values.length;++i){this.current=this.values[i];if(callback.call(scope,this)===false){break;}}},tpl:this}},cleanEl:function(el){while(el.firstChild){el.removeChild(el.firstChild);}},append:function(el,values,returnElement){return this.doAppend(el,this.makeReplacer(values),returnElement);},apply:function(values){return doApply(this.makeReplacer(values));},applyTemplate:function(values){return this.apply(values);},compile:function(){return this;},insertAfter:function(el,values,returnElement){return this.doInsertAfter(el,this.makeReplacer(values),returnElement);},insertBefore:function(el,values,returnElement){return this.doInsertBefore(el,this.makeReplacer(values),returnElement);},insertFirst:function(el,values,returnElement){return this.doInsertFirst(el,this.makeReplacer(values),returnElement);},overwrite:function(el,values,returnElement){return this.doOverwrite(el,this.makeReplacer(values),returnElement);},set:function(html,compile){if(typeof(html)==="string"){var div=document.createElement("div");div.innerHTML=html;this.tpl=document.createDocumentFragment();while(div.firstChild){this.tpl.appendChild(div.firstChild);}}else{this.tpl=html.dom||html;}},makeStoreReplacerBase:function(config){return Ext.applyIf(config,{record:null,callHandler:function(name,tag){var h=this.tpl._handlers[name];return h?h.fn.call(h.scope,this.tpl,this.store,this.record,tag):null;},replaceText:function(tag){return this.callHandler("storeReplaceText",tag);},replaceAttribute:function(tag){return this.callHandler("storeReplaceAttribute",tag);},createdItem:function(item){return this.callHandler("storeCreatedItem",item);},tpl:this});},makeRecordReplacer:function(store,record){return this.makeStoreReplacerBase({store:store,record:record,each:function(callback,scope){callback.call(scope,this);}});},appendRecord:function(el,store,record,returnElement){return this.doAppend(el,this.makeRecordReplacer(store,record),returnElement);},applyRecord:function(store,record){return this.doApply(this.makeRecordReplacer(store,record));},insertAfterRecord:function(el,store,record,returnElement){return this.doInsertAfter(el,this.makeRecordReplacer(store,record),returnElement);},insertBeforeRecord:function(el,store,record,returnElement){return this.doInsertBefore(el,this.makeRecordReplacer(store,record),returnElement);},insertFirstRecord:function(el,store,record,returnElement){return this.doInsertFirst(el,this.makeRecordReplacer(store,record),returnElement);},overwriteRecord:function(el,store,record,returnElement){return this.doOverwrite(el,this.makeRecordReplacer(store,record),returnElement);},makeStoreReplacer:function(store){return this.makeStoreReplacerBase({store:store,each:function(callback,scope){this.store.each(function(record){this.record=record;if(callback.call(scope,this)===false){return false;}});}});},appendStore:function(el,store,returnElement){return this.doAppend(el,this.makeStoreReplacer(store),returnElement);},applyStore:function(store){return this.doApply(this.makeStoreReplacer(store));},insertAfterStore:function(el,store,returnElement){return this.doInsertAfter(el,this.makeStoreReplacer(store),returnElement);},insertBeforeStore:function(el,store,returnElement){return this.doInsertBefore(el,this.makeStoreReplacer(store),returnElement);},insertFirstStore:function(el,store,returnElement){return this.doInsertFirst(el,this.makeStoreReplacer(store),returnElement);},overwriteStore:function(el,store,returnElement){return this.doOverwrite(el,this.makeStoreReplacer(store),returnElement);}};var defaultHandler={fn:function(tpl,values,tag){return values[tag];},scope:this};var defaultStoreHandler={fn:function(tpl,store,record,tag){return record.get(tag);},scope:this};Ext.ux.DomTemplate.prototype.defaultHandlers={"replaceText":defaultHandler,"replaceAttribute":defaultHandler,"storeReplaceText":defaultStoreHandler,"storeReplaceAttribute":defaultStoreHandler};}());