Hébergeur de fichiers indépendant

freeboxos.min.js.js

À propos du fichier

Type de fichier
Fichier JS de 2.5 Mo (text/plain)
Confidentialité
Fichier public, envoyé le 14 juillet 2019 à 21:13, depuis l'adresse IP 78.239.x.x (France)
Sécurité
Ne contient aucun Virus ou Malware connus - Dernière vérification: 29/09/23
Statistiques
La présente page de téléchargement a été vue 671 fois depuis l'envoi du fichier
Page de téléchargement

Aperçu du fichier


var Ext=Ext||{};Ext._startTime=(new Date).getTime(),function(){var i,ExtApp,global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=!0,enumerablesTest={toString:1},emptyFn=function(){},callOverrideParent=function(){var method=callOverrideParent.caller.caller;return method.$owner.prototype[method.$name].apply(this,arguments)},nonWhitespaceRe=/\S/,iterableRe=/\[object\s*(?:Array|Arguments|\w*Collection|\w*List|HTML\s+document\.all\s+class)\]/;Ext.global=global;for(i in enumerablesTest)enumerables=null;enumerables&&(enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]),Ext.enumerables=enumerables,Ext.apply=function(object,config,defaults){if(defaults&&Ext.apply(object,defaults),object&&config&&"object"==typeof config){var i,j,k;for(i in config)object[i]=config[i];if(enumerables)for(j=enumerables.length;j--;)k=enumerables[j],config.hasOwnProperty(k)&&(object[k]=config[k])}return object},Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-"},Ext.buildSettings||{}),Ext.apply(Ext,{name:Ext.sandboxName||"Ext",emptyFn:emptyFn,identityFn:function(o){return o},emptyString:new String,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object)for(property in config)void 0===object[property]&&(object[property]=config[property]);return object},iterate:function(object,fn,scope){Ext.isEmpty(object)||(void 0===scope&&(scope=object),Ext.isIterable(object)?Ext.Array.each.call(Ext.Array,object,fn,scope):Ext.Object.each.call(Ext.Object,object,fn,scope))}}),Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o)o.hasOwnProperty(m)&&(this[m]=o[m])};return function(subclass,superclass,overrides){Ext.isObject(superclass)&&(overrides=superclass,superclass=subclass,subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}),superclass||Ext.Error.raise({sourceClass:"Ext",sourceMethod:"extend",msg:"Attempting to extend from a class which has not been loaded on the page."});var subclassProto,F=function(){},superclassProto=superclass.prototype;return F.prototype=superclassProto,subclassProto=subclass.prototype=new F,subclassProto.constructor=subclass,subclass.superclass=superclassProto,superclassProto.constructor===objectConstructor&&(superclassProto.constructor=superclass),subclass.override=function(overrides){Ext.override(subclass,overrides)},subclassProto.override=inlineOverrides,subclassProto.proto=subclassProto,subclass.override(overrides),subclass.extend=function(o){return Ext.extend(subclass,o)},subclass}}(),override:function(target,overrides){if(target.$isClass)target.override(overrides);else if("function"==typeof target)Ext.apply(target.prototype,overrides);else{var name,value,owner=target.self;if(owner&&owner.$isClass)for(name in overrides)overrides.hasOwnProperty(name)&&(value=overrides[name],"function"==typeof value&&(owner.$className&&(value.displayName=owner.$className+"#"+name),value.$name=name,value.$owner=owner,value.$previous=target.hasOwnProperty(name)?target[name]:callOverrideParent),target[name]=value);else Ext.apply(target,overrides)}return target}}),Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){var type;if(null===value)return"null";if("undefined"===(type=typeof value)||"string"===type||"number"===type||"boolean"===type)return type;switch(toString.call(value)){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}return"function"===type?"function":"object"===type?void 0!==value.nodeType?3===value.nodeType?nonWhitespaceRe.test(value.nodeValue)?"textnode":"whitespace":"element":"object":void Ext.Error.raise({sourceClass:"Ext",sourceMethod:"typeOf",msg:'Failed to determine the type of the specified value "'+value+'". This is most likely a bug.'})},coerce:function(from,to){var fromType=Ext.typeOf(from),toType=Ext.typeOf(to),isString="string"==typeof from;if(fromType!==toType)switch(toType){case"string":return String(from);case"number":return Number(from);case"boolean":return!(isString&&(!from||"false"===from))&&Boolean(from);case"null":return!isString||from&&"null"!==from?from:null;case"undefined":return!isString||from&&"undefined"!==from?from:void 0;case"date":return isString&&isNaN(from)?Ext.Date.parse(from,Ext.Date.defaultFormat):Date(Number(from))}return from},isEmpty:function(value,allowEmptyString){return null===value||void 0===value||!allowEmptyString&&""===value||Ext.isArray(value)&&0===value.length},isArray:"isArray"in Array?Array.isArray:function(value){return"[object Array]"===toString.call(value)},isDate:function(value){return"[object Date]"===toString.call(value)},isObject:"[object Object]"===toString.call(null)?function(value){return null!==value&&void 0!==value&&"[object Object]"===toString.call(value)&&void 0===value.ownerDocument}:function(value){return"[object Object]"===toString.call(value)},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return"string"===type||"number"===type||"boolean"===type},isFunction:"undefined"!=typeof document&&"function"==typeof document.getElementsByTagName("body")?function(value){return!!value&&"[object Function]"===toString.call(value)}:function(value){return!!value&&"function"==typeof value},isNumber:function(value){return"number"==typeof value&&isFinite(value)},isNumeric:function(value){return!isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return"string"==typeof value},isBoolean:function(value){return"boolean"==typeof value},isElement:function(value){return!!value&&1===value.nodeType},isTextNode:function(value){return!!value&&"#text"===value.nodeName},isDefined:function(value){return void 0!==value},isIterable:function(value){return!(!value||"number"!=typeof value.length||"string"==typeof value||Ext.isFunction(value))&&(value.propertyIsEnumerable?!(!value.hasOwnProperty("length")||value.propertyIsEnumerable("length"))||iterableRe.test(toString.call(value)):!!value.item)}}),Ext.apply(Ext,{clone:function(item){var type,i,j,k,clone,key;if(null===item||void 0===item)return item;if(item.nodeType&&item.cloneNode)return item.cloneNode(!0);if("[object Date]"===(type=toString.call(item)))return new Date(item.getTime());if("[object Array]"===type)for(i=item.length,clone=[];i--;)clone[i]=Ext.clone(item[i]);else if("[object Object]"===type&&item.constructor===Object){clone={};for(key in item)clone[key]=Ext.clone(item[key]);if(enumerables)for(j=enumerables.length;j--;)k=enumerables[j],item.hasOwnProperty(k)&&(clone[k]=item[k])}return clone||item},getUniqueGlobalNamespace:function(){var i,uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(void 0===uniqueGlobalNamespace){i=0;do{uniqueGlobalNamespace="ExtBox"+ ++i}while(void 0!==Ext.global[uniqueGlobalNamespace]);Ext.global[uniqueGlobalNamespace]=Ext,this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactoryCache:{},cacheableFunctionFactory:function(){var idx,fn,ln,me=this,args=Array.prototype.slice.call(arguments),cache=me.functionFactoryCache;return Ext.isSandboxed&&(ln=args.length)>0&&(ln--,args[ln]="var Ext=window."+Ext.name+";"+args[ln]),idx=args.join(""),fn=cache[idx],fn||(fn=Function.prototype.constructor.apply(Function.prototype,args),cache[idx]=fn),fn},functionFactory:function(){var ln,args=Array.prototype.slice.call(arguments);return Ext.isSandboxed&&(ln=args.length)>0&&(ln--,args[ln]="var Ext=window."+Ext.name+";"+args[ln]),Function.prototype.constructor.apply(Function.prototype,args)},Logger:{verbose:emptyFn,log:emptyFn,info:emptyFn,warn:emptyFn,error:function(message){throw new Error(message)},deprecate:emptyFn}}),Ext.type=Ext.typeOf,ExtApp=Ext.app,ExtApp||(ExtApp=Ext.app={}),Ext.apply(ExtApp,{namespaces:{},collectNamespaces:function(paths){var path,namespaces=Ext.app.namespaces;for(path in paths)paths.hasOwnProperty(path)&&(namespaces[path]=!0)},addNamespaces:function(ns){var i,l,namespaces=Ext.app.namespaces;for(Ext.isArray(ns)||(ns=[ns]),i=0,l=ns.length;i<l;i++)namespaces[ns[i]]=!0},clearNamespaces:function(){Ext.app.namespaces={}},getNamespace:function(className){var prefix,namespaces=Ext.app.namespaces,deepestPrefix="";for(prefix in namespaces)namespaces.hasOwnProperty(prefix)&&prefix.length>deepestPrefix.length&&prefix+"."===className.substring(0,prefix.length+1)&&(deepestPrefix=prefix);return""===deepestPrefix?void 0:deepestPrefix}})}(),Ext.globalEval=Ext.global.execScript?function(code){execScript(code)}:function($$code){!function(){var Ext=this.Ext;eval($$code)}()};!function(){var Version,checkVerTemp=[""],endOfVersionRe=/([^\d\.])/,notDigitsRe=/[^\d]/g,plusMinusRe=/[\-+]/g,stripRe=/\s/g,underscoreRe=/_/g;Ext.Version=Version=Ext.extend(Object,{isVersion:!0,padModes:{"~":NaN,"^":1/0},release:"",constructor:function(version,defaultMode){var ch,i,pad,parts,release,releaseStartIndex,ver,me=this,padModes=me.padModes;if(version.isVersion)return version;me.version=ver=String(version).toLowerCase().replace(underscoreRe,".").replace(plusMinusRe,""),ch=ver.charAt(0),ch in padModes?(ver=ver.substring(1),pad=padModes[ch]):pad=defaultMode?padModes[defaultMode]:0,me.pad=pad,releaseStartIndex=ver.search(endOfVersionRe),me.shortVersion=ver,-1!==releaseStartIndex&&(me.release=release=ver.substr(releaseStartIndex,version.length),me.shortVersion=ver.substr(0,releaseStartIndex),release=Version.releaseValueMap[release]||release),me.releaseValue=release||pad,me.shortVersion=me.shortVersion.replace(notDigitsRe,""),me.parts=parts=ver.split(".");for(i=parts.length;i--;)parts[i]=parseInt(parts[i],10);return pad===1/0&&parts.push(pad),me.major=parts[0]||pad,me.minor=parts[1]||pad,me.patch=parts[2]||pad,me.build=parts[3]||pad,me},compareTo:function(other){var i,lhs,rhs,me=this,lhsPad=me.pad,lhsParts=me.parts,lhsLength=lhsParts.length,rhsVersion=other.isVersion?other:new Version(other),rhsPad=rhsVersion.pad,rhsParts=rhsVersion.parts,rhsLength=rhsParts.length,length=Math.max(lhsLength,rhsLength);for(i=0;i<length;i++){if(lhs=i<lhsLength?lhsParts[i]:lhsPad,rhs=i<rhsLength?rhsParts[i]:rhsPad,lhs<rhs)return-1;if(lhs>rhs)return 1}return lhs=me.releaseValue,rhs=rhsVersion.releaseValue,lhs<rhs?-1:lhs>rhs?1:0},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major},getMinor:function(){return this.minor},getPatch:function(){return this.patch},getBuild:function(){return this.build},getRelease:function(){return this.release},getReleaseValue:function(){return this.releaseValue},isGreaterThan:function(target){return this.compareTo(target)>0},isGreaterThanOrEqual:function(target){return this.compareTo(target)>=0},isLessThan:function(target){return this.compareTo(target)<0},isLessThanOrEqual:function(target){return this.compareTo(target)<=0},equals:function(target){return 0===this.compareTo(target)},match:function(target){return target=String(target),this.version.substr(0,target.length)===target},toArray:function(){var me=this;return[me.getMajor(),me.getMinor(),me.getPatch(),me.getBuild(),me.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(target){return this.compareTo(target)>0},lt:function(target){return this.compareTo(target)<0},gtEq:function(target){return this.compareTo(target)>=0},ltEq:function(target){return this.compareTo(target)<=0}}),Ext.apply(Version,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(value){return value?isNaN(value)?this.releaseValueMap[value]||value:parseInt(value,10):0},compare:function(current,target){return(current.isVersion?current:new Version(current)).compareTo(target)}}),Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(packageName,version){return Ext.lastRegisteredVersion=Ext.versions[packageName]=new Version(version),this},getVersion:function(packageName){return void 0===packageName?Ext.lastRegisteredVersion:Ext.versions[packageName]},checkVersion:function(specs,matchAll){var i,index,matches,minVer,maxVer,spec,range,ver,isArray=Ext.isArray(specs),compat=isArray?specs:checkVerTemp,length=compat.length,versions=Ext.versions,frameworkVer=versions.ext||versions.touch;for(isArray||(checkVerTemp[0]=specs),i=0;i<length;++i){if(Ext.isString(spec=compat[i])){if(spec.indexOf(" ")>=0&&(spec=spec.replace(stripRe,"")),(index=spec.indexOf("@"))<0)range=spec,ver=frameworkVer;else{if(!(ver=versions[spec.substring(0,index)])){if(matchAll)return!1;continue}range=spec.substring(index+1)}index=range.indexOf("-"),index<0?"+"===range.charAt(index=range.length-1)?(minVer=range.substring(0,index),maxVer=null):minVer=maxVer=range:index>0?(minVer=range.substring(0,index),maxVer=range.substring(index+1)):(minVer=null,maxVer=range.substring(index+1)),matches=!0,minVer&&(minVer=new Version(minVer,"~"),matches=minVer.ltEq(ver)),matches&&maxVer&&(maxVer=new Version(maxVer,"~"),matches=maxVer.gtEq(ver))}else matches=Ext.checkVersion(spec.and||spec.or,!spec.or),spec.not&&(matches=!matches);if(matches){if(!matchAll)return!0}else if(matchAll)return!1}return!!matchAll},deprecate:function(packageName,since,closure,scope){Version.compare(Ext.getVersion(packageName),since)<1&&closure.call(scope)}}),Ext.setVersion("core","4.2.2.1144")}();Ext.String=function(){var charToEntity,entityToChar,charToEntityRegex,entityToCharRegex,trimRegex=/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe=/('|\\)/g,formatRe=/\{(\d+)\}/g,escapeRegexRe=/([-.*+?\^${}()|\[\]\/\\])/g,basicTrimRe=/^\s+|\s+$/g,whitespaceRe=/\s+/,varReplace=/(^[^a-z]*|[^\w])/gi,htmlEncodeReplaceFn=function(match,capture){return charToEntity[capture]},htmlDecodeReplaceFn=function(match,capture){return capture in entityToChar?entityToChar[capture]:String.fromCharCode(parseInt(capture.substr(2),10))},boundsCheck=function(s,other){return null!==s&&void 0!==s&&null!==other&&void 0!==other&&other.length<=s.length};return{insert:function(s,value,index){if(!s)return value;if(!value)return s;var len=s.length;return index||0===index||(index=len),index<0&&(index*=-1,index=index>=len?0:len-index),0===index?s=value+s:index>=s.length?s+=value:s=s.substr(0,index)+value+s.substr(index),s},startsWith:function(s,start,ignoreCase){var result=boundsCheck(s,start);return result&&(ignoreCase&&(s=s.toLowerCase(),start=start.toLowerCase()),result=0===s.lastIndexOf(start,0)),result},endsWith:function(s,end,ignoreCase){var result=boundsCheck(s,end);return result&&(ignoreCase&&(s=s.toLowerCase(),end=end.toLowerCase()),result=-1!==s.indexOf(end,s.length-end.length)),result},createVarName:function(s){return s.replace(varReplace,"")},htmlEncode:function(value){return value?String(value).replace(charToEntityRegex,htmlEncodeReplaceFn):value},htmlDecode:function(value){return value?String(value).replace(entityToCharRegex,htmlDecodeReplaceFn):value},hasHtmlCharacters:function(s){return charToEntityRegex.test(s)},addCharacterEntities:function(newEntities){var key,echar,charKeys=[],entityKeys=[];for(key in newEntities)echar=newEntities[key],entityToChar[key]=echar,charToEntity[echar]=key,charKeys.push(echar),entityKeys.push(key);charToEntityRegex=new RegExp("("+charKeys.join("|")+")","g"),entityToCharRegex=new RegExp("("+entityKeys.join("|")+"|&#[0-9]{1,5};)","g")},resetCharacterEntities:function(){charToEntity={},entityToChar={},this.addCharacterEntities({"&amp;":"&","&gt;":">","&lt;":"<","&quot;":'"',"&#39;":"'"})},urlAppend:function(url,string){return Ext.isEmpty(string)?url:url+(-1===url.indexOf("?")?"?":"&")+string},trim:function(string){return string.replace(trimRegex,"")},capitalize:function(string){return string.charAt(0).toUpperCase()+string.substr(1)},uncapitalize:function(string){return string.charAt(0).toLowerCase()+string.substr(1)},ellipsis:function(value,len,word){if(value&&value.length>len){if(word){var vs=value.substr(0,len-2),index=Math.max(vs.lastIndexOf(" "),vs.lastIndexOf("."),vs.lastIndexOf("!"),vs.lastIndexOf("?"));if(-1!==index&&index>=len-15)return vs.substr(0,index)+"..."}return value.substr(0,len-3)+"..."}return value},escapeRegex:function(string){return string.replace(escapeRegexRe,"\\$1")},escape:function(string){return string.replace(escapeRe,"\\$1")},toggle:function(string,value,other){return string===value?other:value},leftPad:function(string,size,character){var result=String(string);for(character=character||" ";result.length<size;)result=character+result;return result},format:function(format){var args=Ext.Array.toArray(arguments,1);return format.replace(formatRe,function(m,i){return args[i]})},repeat:function(pattern,count,sep){count<1&&(count=0);for(var buf=[],i=count;i--;)buf.push(pattern);return buf.join(sep||"")},splitWords:function(words){return words&&"string"==typeof words?words.replace(basicTrimRe,"").split(whitespaceRe):words||[]}}}(),Ext.String.resetCharacterEntities(),Ext.htmlEncode=Ext.String.htmlEncode,Ext.htmlDecode=Ext.String.htmlDecode,Ext.urlAppend=Ext.String.urlAppend;Ext.Number=new function(){var me=this,isToFixedBroken="1"!==.9.toFixed(),math=Math;Ext.apply(this,{constrain:function(number,min,max){var x=parseFloat(number);return x<min?min:x>max?max:x},snap:function(value,increment,minValue,maxValue){var m;return void 0===value||value<minValue?minValue||0:(increment&&0!==(m=value%increment)&&(value-=m,2*m>=increment?value+=increment:2*m<-increment&&(value-=increment)),me.constrain(value,minValue,maxValue))},snapInRange:function(value,increment,minValue,maxValue){var tween;return minValue=minValue||0,void 0===value||value<minValue?minValue:(increment&&(tween=(value-minValue)%increment)&&(value-=tween,(tween*=2)>=increment&&(value+=increment)),void 0!==maxValue&&value>(maxValue=me.snapInRange(maxValue,increment,minValue))&&(value=maxValue),value)},toFixed:isToFixedBroken?function(value,precision){precision=precision||0;var pow=math.pow(10,precision);return(math.round(value*pow)/pow).toFixed(precision)}:function(value,precision){return value.toFixed(precision)},from:function(value,defaultValue){return isFinite(value)&&(value=parseFloat(value)),isNaN(value)?defaultValue:value},randomInt:function(from,to){return math.floor(math.random()*(to-from+1)+from)},correctFloat:function(n){return parseFloat(n.toPrecision(14))}}),Ext.num=function(){return me.from.apply(this,arguments)}};!function(){function fixArrayIndex(array,index){return index<0?Math.max(0,array.length+index):Math.min(array.length,index)}function replaceSim(array,index,removeCount,insert){var remove,tailOldPos,tailNewPos,tailCount,lengthAfterRemove,i,add=insert?insert.length:0,length=array.length,pos=fixArrayIndex(array,index);if(pos===length)add&&array.push.apply(array,insert);else{if(remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove,tailNewPos<tailOldPos)for(i=0;i<tailCount;++i)array[tailNewPos+i]=array[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)array[tailNewPos+i]=array[tailOldPos+i];if(add&&pos===lengthAfterRemove)array.length=lengthAfterRemove,array.push.apply(array,insert);else for(array.length=lengthAfterRemove+add,i=0;i<add;++i)array[pos+i]=insert[i]}return array}function replaceNative(array,index,removeCount,insert){return insert&&insert.length?0!==index||removeCount?index<array.length?array.splice.apply(array,[index,removeCount].concat(insert)):array.push.apply(array,insert):array.unshift.apply(array,insert):array.splice(index,removeCount),array}function eraseSim(array,index,removeCount){return replaceSim(array,index,removeCount)}function eraseNative(array,index,removeCount){return array.splice(index,removeCount),array}function spliceSim(array,index,removeCount){var pos=fixArrayIndex(array,index),removed=array.slice(index,fixArrayIndex(array,pos+removeCount));return arguments.length<4?replaceSim(array,pos,removeCount):replaceSim(array,pos,removeCount,slice.call(arguments,3)),removed}function spliceNative(array){return array.splice.apply(array,slice.call(arguments,1))}var ExtArray,erase,replace,splice,arrayPrototype=Array.prototype,slice=arrayPrototype.slice,supportsSplice=function(){var lengthBefore,array=[],j=20;if(!array.splice)return!1;for(;j--;)array.push("A");return array.splice(15,0,"F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F"),lengthBefore=array.length,array.splice(13,0,"XXX"),lengthBefore+1==array.length}(),supportsForEach="forEach"in arrayPrototype,supportsMap="map"in arrayPrototype,supportsIndexOf="indexOf"in arrayPrototype,supportsEvery="every"in arrayPrototype,supportsSome="some"in arrayPrototype,supportsFilter="filter"in arrayPrototype,supportsSort=function(){var a=[1,2,3,4,5].sort(function(){return 0});return 1===a[0]&&2===a[1]&&3===a[2]&&4===a[3]&&5===a[4]}(),supportsSliceOnNodeList=!0;try{"undefined"!=typeof document&&slice.call(document.getElementsByTagName("body"))}catch(e){supportsSliceOnNodeList=!1}erase=supportsSplice?eraseNative:eraseSim,replace=supportsSplice?replaceNative:replaceSim,splice=supportsSplice?spliceNative:spliceSim,ExtArray=Ext.Array={each:function(array,fn,scope,reverse){array=ExtArray.from(array);var i,ln=array.length;if(!0!==reverse){for(i=0;i<ln;i++)if(!1===fn.call(scope||array[i],array[i],i,array))return i}else for(i=ln-1;i>-1;i--)if(!1===fn.call(scope||array[i],array[i],i,array))return i;return!0},forEach:supportsForEach?function(array,fn,scope){array.forEach(fn,scope)}:function(array,fn,scope){for(var i=0,ln=array.length;i<ln;i++)fn.call(scope,array[i],i,array)},indexOf:supportsIndexOf?function(array,item,from){return arrayPrototype.indexOf.call(array,item,from)}:function(array,item,from){var i,length=array.length;for(i=from<0?Math.max(0,length+from):from||0;i<length;i++)if(array[i]===item)return i;return-1},contains:supportsIndexOf?function(array,item){return-1!==arrayPrototype.indexOf.call(array,item)}:function(array,item){var i,ln;for(i=0,ln=array.length;i<ln;i++)if(array[i]===item)return!0;return!1},toArray:function(iterable,start,end){if(!iterable||!iterable.length)return[];if("string"==typeof iterable&&(iterable=iterable.split("")),supportsSliceOnNodeList)return slice.call(iterable,start||0,end||iterable.length);var i,array=[];for(start=start||0,end=end?end<0?iterable.length+end:end:iterable.length,i=start;i<end;i++)array.push(iterable[i]);return array},pluck:function(array,propertyName){var i,ln,item,ret=[];for(i=0,ln=array.length;i<ln;i++)item=array[i],ret.push(item[propertyName]);return ret},map:supportsMap?function(array,fn,scope){return fn||Ext.Error.raise("Ext.Array.map must have a callback function passed as second argument."),array.map(fn,scope)}:function(array,fn,scope){fn||Ext.Error.raise("Ext.Array.map must have a callback function passed as second argument.");for(var results=[],i=0,len=array.length;i<len;i++)results[i]=fn.call(scope,array[i],i,array);return results},every:supportsEvery?function(array,fn,scope){return fn||Ext.Error.raise("Ext.Array.every must have a callback function passed as second argument."),array.every(fn,scope)}:function(array,fn,scope){fn||Ext.Error.raise("Ext.Array.every must have a callback function passed as second argument.");for(var i=0,ln=array.length;i<ln;++i)if(!fn.call(scope,array[i],i,array))return!1;return!0},some:supportsSome?function(array,fn,scope){return fn||Ext.Error.raise("Ext.Array.some must have a callback function passed as second argument."),array.some(fn,scope)}:function(array,fn,scope){fn||Ext.Error.raise("Ext.Array.some must have a callback function passed as second argument.");for(var i=0,ln=array.length;i<ln;++i)if(fn.call(scope,array[i],i,array))return!0;return!1},equals:function(array1,array2){var i,len1=array1.length,len2=array2.length;if(array1===array2)return!0;if(len1!==len2)return!1;for(i=0;i<len1;++i)if(array1[i]!==array2[i])return!1;return!0},clean:function(array){for(var item,results=[],i=0,ln=array.length;i<ln;i++)item=array[i],Ext.isEmpty(item)||results.push(item);return results},unique:function(array){for(var item,clone=[],i=0,ln=array.length;i<ln;i++)item=array[i],-1===ExtArray.indexOf(clone,item)&&clone.push(item);return clone},filter:supportsFilter?function(array,fn,scope){return fn||Ext.Error.raise("Ext.Array.filter must have a filter function passed as second argument."),array.filter(fn,scope)}:function(array,fn,scope){fn||Ext.Error.raise("Ext.Array.filter must have a filter function passed as second argument.");for(var results=[],i=0,ln=array.length;i<ln;i++)fn.call(scope,array[i],i,array)&&results.push(array[i]);return results},findBy:function(array,fn,scope){for(var i=0,len=array.length;i<len;i++)if(fn.call(scope||array,array[i],i))return array[i];return null},from:function(value,newReference){if(void 0===value||null===value)return[];if(Ext.isArray(value))return newReference?slice.call(value):value;var type=typeof value;return!value||void 0===value.length||"string"===type||"function"===type&&value.apply?[value]:ExtArray.toArray(value)},remove:function(array,item){var index=ExtArray.indexOf(array,item);return-1!==index&&erase(array,index,1),array},include:function(array,item){ExtArray.contains(array,item)||array.push(item)},clone:function(array){return slice.call(array)},merge:function(){var i,ln,args=slice.call(arguments),array=[];for(i=0,ln=args.length;i<ln;i++)array=array.concat(args[i]);return ExtArray.unique(array)},intersect:function(){var arraysLength,array,arrayLength,minArray,minArrayIndex,minArrayCandidate,minArrayLength,element,elementCandidate,elementCount,i,j,k,intersection=[],arrays=slice.call(arguments);if(!arrays.length)return intersection;for(arraysLength=arrays.length,i=minArrayIndex=0;i<arraysLength;i++)minArrayCandidate=arrays[i],(!minArray||minArrayCandidate.length<minArray.length)&&(minArray=minArrayCandidate,minArrayIndex=i);for(minArray=ExtArray.unique(minArray),erase(arrays,minArrayIndex,1),minArrayLength=minArray.length,arraysLength=arrays.length,i=0;i<minArrayLength;i++){for(element=minArray[i],elementCount=0,j=0;j<arraysLength;j++)for(array=arrays[j],arrayLength=array.length,k=0;k<arrayLength;k++)if(elementCandidate=array[k],element===elementCandidate){elementCount++;break}elementCount===arraysLength&&intersection.push(element)}return intersection},difference:function(arrayA,arrayB){var i,j,lnB,clone=slice.call(arrayA),ln=clone.length;for(i=0,lnB=arrayB.length;i<lnB;i++)for(j=0;j<ln;j++)clone[j]===arrayB[i]&&(erase(clone,j,1),j--,ln--);return clone},slice:[1,2].slice(1,void 0).length?function(array,begin,end){return slice.call(array,begin,end)}:function(array,begin,end){return void 0===begin?slice.call(array):void 0===end?slice.call(array,begin):slice.call(array,begin,end)},sort:supportsSort?function(array,sortFn){return sortFn?array.sort(sortFn):array.sort()}:function(array,sortFn){for(var j,min,tmp,length=array.length,i=0;i<length;i++){for(min=i,j=i+1;j<length;j++)sortFn?sortFn(array[j],array[min])<0&&(min=j):array[j]<array[min]&&(min=j);min!==i&&(tmp=array[i],array[i]=array[min],array[min]=tmp)}return array},flatten:function(array){function rFlatten(a){var i,ln,v;for(i=0,ln=a.length;i<ln;i++)v=a[i],Ext.isArray(v)?rFlatten(v):worker.push(v);return worker}var worker=[];return rFlatten(array)},min:function(array,comparisonFn){var i,ln,item,min=array[0];for(i=0,ln=array.length;i<ln;i++)item=array[i],comparisonFn?1===comparisonFn(min,item)&&(min=item):item<min&&(min=item);return min},max:function(array,comparisonFn){var i,ln,item,max=array[0];for(i=0,ln=array.length;i<ln;i++)item=array[i],comparisonFn?-1===comparisonFn(max,item)&&(max=item):item>max&&(max=item);return max},mean:function(array){return array.length>0?ExtArray.sum(array)/array.length:void 0},sum:function(array){var i,ln,item,sum=0;for(i=0,ln=array.length;i<ln;i++)item=array[i],sum+=item;return sum},toMap:function(array,getKey,scope){var map={},i=array.length;if(getKey)if("string"==typeof getKey)for(;i--;)map[array[i][getKey]]=i+1;else for(;i--;)map[getKey.call(scope,array[i])]=i+1;else for(;i--;)map[array[i]]=i+1;return map},toValueMap:function(array,getKey,scope){var map={},i=array.length;if(getKey)if("string"==typeof getKey)for(;i--;)map[array[i][getKey]]=array[i];else for(;i--;)map[getKey.call(scope,array[i])]=array[i];else for(;i--;)map[array[i]]=array[i];return map},_replaceSim:replaceSim,_spliceSim:spliceSim,erase:erase,insert:function(array,index,items){return replace(array,index,0,items)},replace:replace,splice:splice,push:function(array){var newItem,len=arguments.length,i=1;for(void 0===array?array=[]:Ext.isArray(array)||(array=[array]);i<len;i++)newItem=arguments[i],Array.prototype.push[Ext.isIterable(newItem)?"apply":"call"](array,newItem);return array}},Ext.each=ExtArray.each,ExtArray.union=ExtArray.merge,Ext.min=ExtArray.min,Ext.max=ExtArray.max,Ext.sum=ExtArray.sum,Ext.mean=ExtArray.mean,Ext.flatten=ExtArray.flatten,Ext.clean=ExtArray.clean,Ext.unique=ExtArray.unique,Ext.pluck=ExtArray.pluck,Ext.toArray=function(){return ExtArray.toArray.apply(ExtArray,arguments)}}();Ext.Function={flexSetter:function(fn){return function(a,b){var k,i;if(null===a)return this;if("string"!=typeof a){for(k in a)a.hasOwnProperty(k)&&fn.call(this,k,a[k]);if(Ext.enumerables)for(i=Ext.enumerables.length;i--;)k=Ext.enumerables[i],a.hasOwnProperty(k)&&fn.call(this,k,a[k])}else fn.call(this,a,b);return this}},bind:function(fn,scope,args,appendArgs){if(2===arguments.length)return function(){return fn.apply(scope,arguments)};var method=fn,slice=Array.prototype.slice;return function(){var callArgs=args||arguments;return!0===appendArgs?(callArgs=slice.call(arguments,0),callArgs=callArgs.concat(args)):"number"==typeof appendArgs&&(callArgs=slice.call(arguments,0),Ext.Array.insert(callArgs,appendArgs,args)),method.apply(scope||Ext.global,callArgs)}},pass:function(fn,args,scope){return Ext.isArray(args)||(args=Ext.isIterable(args)?Ext.Array.clone(args):void 0!==args?[args]:[]),function(){var fnArgs=[].concat(args);return fnArgs.push.apply(fnArgs,arguments),fn.apply(scope||this,fnArgs)}},alias:function(object,methodName){return function(){return object[methodName].apply(object,arguments)}},clone:function(method){return function(){return method.apply(this,arguments)}},createInterceptor:function(origFn,newFn,scope,returnValue){return Ext.isFunction(newFn)?(returnValue=Ext.isDefined(returnValue)?returnValue:null,function(){var me=this,args=arguments;return newFn.target=me,newFn.method=origFn,!1!==newFn.apply(scope||me||Ext.global,args)?origFn.apply(me||Ext.global,args):returnValue}):origFn},createDelayed:function(fn,delay,scope,args,appendArgs){return(scope||args)&&(fn=Ext.Function.bind(fn,scope,args,appendArgs)),function(){var me=this,args=Array.prototype.slice.call(arguments);setTimeout(function(){fn.apply(me,args)},delay)}},defer:function(fn,millis,scope,args,appendArgs){return fn=Ext.Function.bind(fn,scope,args,appendArgs),millis>0?setTimeout(Ext.supports.TimeoutActualLateness?function(){fn()}:fn,millis):(fn(),0)},createSequence:function(originalFn,newFn,scope){return newFn?function(){var result=originalFn.apply(this,arguments);return newFn.apply(scope||this,arguments),result}:originalFn},createBuffered:function(fn,buffer,scope,args){var timerId;return function(){var callArgs=args||Array.prototype.slice.call(arguments,0),me=scope||this;timerId&&clearTimeout(timerId),timerId=setTimeout(function(){fn.apply(me,callArgs)},buffer)}},createThrottled:function(fn,interval,scope){var lastCallTime,elapsed,lastArgs,timer,execute=function(){fn.apply(scope||this,lastArgs),lastCallTime=Ext.Date.now()};return function(){elapsed=Ext.Date.now()-lastCallTime,lastArgs=arguments,clearTimeout(timer),!lastCallTime||elapsed>=interval?execute():timer=setTimeout(execute,interval-elapsed)}},interceptBefore:function(object,methodName,fn,scope){var method=object[methodName]||Ext.emptyFn;return object[methodName]=function(){var ret=fn.apply(scope||this,arguments);return method.apply(this,arguments),ret}},interceptAfter:function(object,methodName,fn,scope){var method=object[methodName]||Ext.emptyFn;return object[methodName]=function(){return method.apply(this,arguments),fn.apply(scope||this,arguments)}}},Ext.defer=Ext.Function.alias(Ext.Function,"defer"),Ext.pass=Ext.Function.alias(Ext.Function,"pass"),Ext.bind=Ext.Function.alias(Ext.Function,"bind");!function(){var TemplateClass=function(){},ExtObject=Ext.Object={chain:Object.create||function(object){TemplateClass.prototype=object;var result=new TemplateClass;return TemplateClass.prototype=null,result},clear:function(object){for(var keys=ExtObject.getKeys(object),n=keys.length;n--;)delete object[keys[n]];return object},toQueryObjects:function(name,value,recursive){var i,ln,self=ExtObject.toQueryObjects,objects=[];if(Ext.isArray(value))for(i=0,ln=value.length;i<ln;i++)recursive?objects=objects.concat(self(name+"["+i+"]",value[i],!0)):objects.push({name:name,value:value[i]});else if(Ext.isObject(value))for(i in value)value.hasOwnProperty(i)&&(recursive?objects=objects.concat(self(name+"["+i+"]",value[i],!0)):objects.push({name:name,value:value[i]}));else objects.push({name:name,value:value});return objects},toQueryString:function(object,recursive){var i,j,ln,paramObject,value,paramObjects=[],params=[];for(i in object)object.hasOwnProperty(i)&&(paramObjects=paramObjects.concat(ExtObject.toQueryObjects(i,object[i],recursive)));for(j=0,ln=paramObjects.length;j<ln;j++)paramObject=paramObjects[j],value=paramObject.value,Ext.isEmpty(value)?value="":Ext.isDate(value)&&(value=Ext.Date.toString(value)),params.push(encodeURIComponent(paramObject.name)+"="+encodeURIComponent(String(value)));return params.join("&")},fromQueryString:function(queryString,recursive){var temp,components,name,value,i,ln,part,j,subLn,matchedKeys,matchedName,keys,key,nextKey,parts=queryString.replace(/^\?/,"").split("&"),object={};for(i=0,ln=parts.length;i<ln;i++)if(part=parts[i],part.length>0)if(components=part.split("="),name=decodeURIComponent(components[0]),value=void 0!==components[1]?decodeURIComponent(components[1]):"",recursive){if(matchedKeys=name.match(/(\[):?([^\]]*)\]/g),!(matchedName=name.match(/^([^\[]+)/)))throw new Error('[Ext.Object.fromQueryString] Malformed query string given, failed parsing name from "'+part+'"');if(name=matchedName[0],keys=[],null===matchedKeys){object[name]=value;continue}for(j=0,subLn=matchedKeys.length;j<subLn;j++)key=matchedKeys[j],key=2===key.length?"":key.substring(1,key.length-1),keys.push(key);for(keys.unshift(name),temp=object,j=0,subLn=keys.length;j<subLn;j++)key=keys[j],j===subLn-1?Ext.isArray(temp)&&""===key?temp.push(value):temp[key]=value:(void 0!==temp[key]&&"string"!=typeof temp[key]||(nextKey=keys[j+1],temp[key]=Ext.isNumeric(nextKey)||""===nextKey?[]:{}),temp=temp[key])}else object.hasOwnProperty(name)?(Ext.isArray(object[name])||(object[name]=[object[name]]),object[name].push(value)):object[name]=value;return object},each:function(object,fn,scope){for(var property in object)if(object.hasOwnProperty(property)&&!1===fn.call(scope||object,property,object[property],object))return},merge:function(destination){for(var object,key,value,sourceKey,i=1,ln=arguments.length,mergeFn=ExtObject.merge,cloneFn=Ext.clone;i<ln;i++){object=arguments[i];for(key in object)value=object[key],value&&value.constructor===Object?(sourceKey=destination[key],sourceKey&&sourceKey.constructor===Object?mergeFn(sourceKey,value):destination[key]=cloneFn(value)):destination[key]=value}return destination},mergeIf:function(destination){for(var object,key,value,i=1,ln=arguments.length,cloneFn=Ext.clone;i<ln;i++){object=arguments[i];for(key in object)key in destination||(value=object[key],value&&value.constructor===Object?destination[key]=cloneFn(value):destination[key]=value)}return destination},getKey:function(object,value){for(var property in object)if(object.hasOwnProperty(property)&&object[property]===value)return property;return null},getValues:function(object){var property,values=[];for(property in object)object.hasOwnProperty(property)&&values.push(object[property]);return values},getKeys:"function"==typeof Object.keys?function(object){return object?Object.keys(object):[]}:function(object){var property,keys=[];for(property in object)object.hasOwnProperty(property)&&keys.push(property);return keys},getSize:function(object){var property,size=0;for(property in object)object.hasOwnProperty(property)&&size++;return size},isEmpty:function(object){for(var key in object)if(object.hasOwnProperty(key))return!1;return!0},equals:function(){var check=function(o1,o2){var key;for(key in o1)if(o1.hasOwnProperty(key)&&o1[key]!==o2[key])return!1;return!0};return function(object1,object2){return object1===object2||(object1&&object2?check(object1,object2)&&check(object2,object1):!object1&&!object2&&object1===object2)}}(),classify:function(object){var key,value,prototype=object,objectProperties=[],propertyClassesMap={},objectClass=function(){for(var property,i=0,ln=objectProperties.length;i<ln;i++)property=objectProperties[i],this[property]=new propertyClassesMap[property]};for(key in object)object.hasOwnProperty(key)&&(value=object[key])&&value.constructor===Object&&(objectProperties.push(key),propertyClassesMap[key]=ExtObject.classify(value));return objectClass.prototype=prototype,objectClass}};Ext.merge=Ext.Object.merge,Ext.mergeIf=Ext.Object.mergeIf,Ext.urlEncode=function(){var args=Ext.Array.from(arguments),prefix="";return"string"==typeof args[1]&&(prefix=args[1]+"&",args[1]=!1),prefix+ExtObject.toQueryString.apply(ExtObject,args)},Ext.urlDecode=function(){return ExtObject.fromQueryString.apply(ExtObject,arguments)}}();Ext.Date=new function(){function xf(format){var args=Array.prototype.slice.call(arguments,1);return format.replace(numberTokenRe,function(m,i){return args[i]})}var utilDate=this,stripEscapeRe=/(\\.)/g,hourInfoRe=/([gGhHisucUOPZ]|MS)/,dateInfoRe=/([djzmnYycU]|MS)/,slashRe=/\\/gi,numberTokenRe=/\{(\d+)\}/g,MSFormatRe=new RegExp("\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/"),code=["var me = this, dt, y, m, d, h, i, s, ms, o, O, z, zz, u, v, W, year, jan4, week1monday, daysInMonth, dayMatched,","def = me.defaults,","from = Ext.Number.from,","results = String(input).match(me.parseRegexes[{0}]);","if(results){","{1}","if(u != null){","v = new Date(u * 1000);","}else{","dt = me.clearTime(new Date);","y = from(y, from(def.y, dt.getFullYear()));","m = from(m, from(def.m - 1, dt.getMonth()));","dayMatched = d !== undefined;","d = from(d, from(def.d, dt.getDate()));","if (!dayMatched) {","dt.setDate(1);","dt.setMonth(m);","dt.setFullYear(y);","daysInMonth = me.getDaysInMonth(dt);","if (d > daysInMonth) {","d = daysInMonth;","}","}","h  = from(h, from(def.h, dt.getHours()));","i  = from(i, from(def.i, dt.getMinutes()));","s  = from(s, from(def.s, dt.getSeconds()));","ms = from(ms, from(def.ms, dt.getMilliseconds()));","if(z >= 0 && y >= 0){","v = me.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (me.isLeapYear(v) && z <= 365))? me.add(v, me.DAY, z) : null);","}else if(strict === true && !me.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","if (W) {","year = y || (new Date()).getFullYear(),","jan4 = new Date(year, 0, 4, 0, 0, 0),","week1monday = new Date(jan4.getTime() - ((jan4.getDay() - 1) * 86400000));","v = Ext.Date.clearTime(new Date(week1monday.getTime() + ((W - 1) * 604800000)));","} else {","v = me.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);","}","}","}","}","if(v){","if(zz != null){","v = me.add(v, me.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = me.add(v, me.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");Ext.apply(utilDate,{now:Date.now||function(){return+new Date},toString:function(date){var pad=Ext.String.leftPad;return date.getFullYear()+"-"+pad(date.getMonth()+1,2,"0")+"-"+pad(date.getDate(),2,"0")+"T"+pad(date.getHours(),2,"0")+":"+pad(date.getMinutes(),2,"0")+":"+pad(date.getSeconds(),2,"0")},getElapsed:function(dateA,dateB){return Math.abs(dateA-(dateB||utilDate.now()))},useStrict:!1,formatCodeToRegex:function(character,currentGroup){var p=utilDate.parseCodes[character];return p&&(p="function"==typeof p?p():p,utilDate.parseCodes[character]=p),p?Ext.applyIf({c:p.c?xf(p.c,currentGroup||"{0}"):p.c},p):{g:0,c:null,s:Ext.String.escapeRegex(character)}},parseFunctions:{MS:function(input,strict){var r=(input||"").match(MSFormatRe);return r?new Date(1*((r[1]||"")+r[2])):null},time:function(input,strict){var num=parseInt(input,10);return num||0===num?new Date(num):null},timestamp:function(input,strict){var num=parseInt(input,10);return num||0===num?new Date(1e3*num):null}},parseRegexes:[],formatFunctions:{MS:function(){return"\\/Date("+this.getTime()+")\\/"},time:function(){return this.getTime().toString()},timestamp:function(){return utilDate.format(this,"U")}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{January:0,Jan:0,February:1,Feb:1,March:2,Mar:2,April:3,Apr:3,May:4,June:5,Jun:5,July:6,Jul:6,August:7,Aug:7,September:8,Sep:8,October:9,Oct:9,November:10,Nov:10,December:11,Dec:11},defaultFormat:"m/d/Y",getShortMonthName:function(month){return Ext.Date.monthNames[month].substring(0,3)},getShortDayName:function(day){return Ext.Date.dayNames[day].substring(0,3)},getMonthNumber:function(name){return Ext.Date.monthNumbers[name.substring(0,1).toUpperCase()+name.substring(1,3).toLowerCase()]},formatContainsHourInfo:function(format){return hourInfoRe.test(format.replace(stripEscapeRe,""))},formatContainsDateInfo:function(format){return dateInfoRe.test(format.replace(stripEscapeRe,""))},unescapeFormat:function(format){return format.replace(slashRe,"")},formatCodes:{d:"Ext.String.leftPad(this.getDate(), 2, '0')",D:"Ext.Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Ext.Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"Ext.Date.getSuffix(this)",w:"this.getDay()",z:"Ext.Date.getDayOfYear(this)",W:"Ext.String.leftPad(Ext.Date.getWeekOfYear(this), 2, '0')",F:"Ext.Date.monthNames[this.getMonth()]",m:"Ext.String.leftPad(this.getMonth() + 1, 2, '0')",M:"Ext.Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"Ext.Date.getDaysInMonth(this)",L:"(Ext.Date.isLeapYear(this) ? 1 : 0)",o:"(this.getFullYear() + (Ext.Date.getWeekOfYear(this) == 1 && this.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){var c,code,i,l,e;for(c="Y-m-dTH:i:sP",code=[],i=0,l=c.length;i<l;++i)e=c.charAt(i),code.push("T"==e?"'T'":utilDate.getFormatCode(e));return code.join(" + ")},U:"Math.round(this.getTime() / 1000)"},isValid:function(y,m,d,h,i,s,ms){h=h||0,i=i||0,s=s||0,ms=ms||0;var dt=utilDate.add(new Date(y<100?100:y,m-1,d,h,i,s,ms),utilDate.YEAR,y<100?y-100:0);return y==dt.getFullYear()&&m==dt.getMonth()+1&&d==dt.getDate()&&h==dt.getHours()&&i==dt.getMinutes()&&s==dt.getSeconds()&&ms==dt.getMilliseconds()},parse:function(input,format,strict){var p=utilDate.parseFunctions;return null==p[format]&&utilDate.createParser(format),p[format].call(utilDate,input,Ext.isDefined(strict)?strict:utilDate.useStrict)},parseDate:function(input,format,strict){return utilDate.parse(input,format,strict)},getFormatCode:function(character){var f=utilDate.formatCodes[character];return f&&(f="function"==typeof f?f():f,utilDate.formatCodes[character]=f),f||"'"+Ext.String.escape(character)+"'"},createFormat:function(format){var i,code=[],special=!1,ch="";for(i=0;i<format.length;++i)ch=format.charAt(i),special||"\\"!=ch?special?(special=!1,code.push("'"+Ext.String.escape(ch)+"'")):code.push(utilDate.getFormatCode(ch)):special=!0;utilDate.formatFunctions[format]=Ext.functionFactory("return "+code.join("+"))},createParser:function(format){for(var obj,regexNum=utilDate.parseRegexes.length,currentGroup=1,calc=[],regex=[],special=!1,ch="",i=0,len=format.length,atEnd=[];i<len;++i)ch=format.charAt(i),special||"\\"!=ch?special?(special=!1,regex.push(Ext.String.escape(ch))):(obj=utilDate.formatCodeToRegex(ch,currentGroup),currentGroup+=obj.g,regex.push(obj.s),obj.g&&obj.c&&(obj.calcAtEnd?atEnd.push(obj.c):calc.push(obj.c))):special=!0;calc=calc.concat(atEnd),utilDate.parseRegexes[regexNum]=new RegExp("^"+regex.join("")+"$","i"),utilDate.parseFunctions[format]=Ext.functionFactory("input","strict",xf(code,regexNum,calc.join("")))},parseCodes:{d:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(3[0-1]|[1-2][0-9]|0[1-9])"},j:{g:1,c:"d = parseInt(results[{0}], 10);\n",s:"(3[0-1]|[1-2][0-9]|[1-9])"},D:function(){for(var a=[],i=0;i<7;a.push(utilDate.getShortDayName(i)),++i);return{g:0,c:null,s:"(?:"+a.join("|")+")"}},l:function(){return{g:0,c:null,s:"(?:"+utilDate.dayNames.join("|")+")"}},N:{g:0,c:null,s:"[1-7]"},S:{g:0,c:null,s:"(?:st|nd|rd|th)"},w:{g:0,c:null,s:"[0-6]"},z:{g:1,c:"z = parseInt(results[{0}], 10);\n",s:"(\\d{1,3})"},W:{g:1,c:"W = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},F:function(){return{g:1,c:"m = parseInt(me.getMonthNumber(results[{0}]), 10);\n",s:"("+utilDate.monthNames.join("|")+")"}},M:function(){for(var a=[],i=0;i<12;a.push(utilDate.getShortMonthName(i)),++i);return Ext.applyIf({s:"("+a.join("|")+")"},utilDate.formatCodeToRegex("F"))},m:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(1[0-2]|0[1-9])"},n:{g:1,c:"m = parseInt(results[{0}], 10) - 1;\n",s:"(1[0-2]|[1-9])"},t:{g:0,c:null,s:"(?:\\d{2})"},L:{g:0,c:null,s:"(?:1|0)"},o:{g:1,c:"y = parseInt(results[{0}], 10);\n",s:"(\\d{4})"},Y:{g:1,c:"y = parseInt(results[{0}], 10);\n",s:"(\\d{4})"},y:{g:1,c:"var ty = parseInt(results[{0}], 10);\ny = ty > me.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)",calcAtEnd:!0},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)",calcAtEnd:!0},g:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(1[0-2]|[0-9])"},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(2[0-3]|1[0-9]|[0-9])"},h:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(1[0-2]|0[1-9])"},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(2[0-3]|[0-1][0-9])"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"([0-5][0-9])"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"([0-5][0-9])"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,5}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var i,l,calc=[],arr=[utilDate.formatCodeToRegex("Y",1),utilDate.formatCodeToRegex("m",2),utilDate.formatCodeToRegex("d",3),utilDate.formatCodeToRegex("H",4),utilDate.formatCodeToRegex("i",5),utilDate.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",utilDate.formatCodeToRegex("P",8).c,"}else{",utilDate.formatCodeToRegex("O",8).c,"}","}"].join("\n")}];for(i=0,l=arr.length;i<l;++i)calc.push(arr[i].c);return{g:1,c:calc.join(""),s:[arr[0].s,"(?:","-",arr[1].s,"(?:","-",arr[2].s,"(?:","(?:T| )?",arr[3].s,":",arr[4].s,"(?::",arr[5].s,")?","(?:(?:\\.|,)(\\d+))?","(Z|(?:[-+]\\d{2}(?::)?\\d{2}))?",")?",")?",")?"].join("")}},U:{g:1,c:"u = parseInt(results[{0}], 10);\n",s:"(-?\\d+)"}},dateFormat:function(date,format){return utilDate.format(date,format)},isEqual:function(date1,date2){return date1&&date2?date1.getTime()===date2.getTime():!(date1||date2)},format:function(date,format){var formatFunctions=utilDate.formatFunctions;return Ext.isDate(date)?(null==formatFunctions[format]&&utilDate.createFormat(format),formatFunctions[format].call(date)+""):""},getTimezone:function(date){return date.toString().replace(/^.* (?:\((.*)\)|([A-Z]{1,5})(?:[\-+][0-9]{4})?(?: -?\d+)?)$/,"$1$2").replace(/[^A-Z]/g,"")},getGMTOffset:function(date,colon){var offset=date.getTimezoneOffset();return(offset>0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(offset)/60),2,"0")+(colon?":":"")+Ext.String.leftPad(Math.abs(offset%60),2,"0")},getDayOfYear:function(date){var i,num=0,d=Ext.Date.clone(date),m=date.getMonth();for(i=0,d.setDate(1),d.setMonth(0);i<m;d.setMonth(++i))num+=utilDate.getDaysInMonth(d);return num+date.getDate()-1},getWeekOfYear:function(){return function(date){var DC3=Date.UTC(date.getFullYear(),date.getMonth(),date.getDate()+3)/864e5,AWN=Math.floor(DC3/7),Wyr=new Date(6048e5*AWN).getUTCFullYear();return AWN-Math.floor(Date.UTC(Wyr,0,7)/6048e5)+1}}(),isLeapYear:function(date){var year=date.getFullYear();return!(0!=(3&year)||!(year%100||year%400==0&&year))},getFirstDayOfMonth:function(date){var day=(date.getDay()-(date.getDate()-1))%7;return day<0?day+7:day},getLastDayOfMonth:function(date){return utilDate.getLastDateOfMonth(date).getDay()},getFirstDateOfMonth:function(date){return new Date(date.getFullYear(),date.getMonth(),1)},getLastDateOfMonth:function(date){return new Date(date.getFullYear(),date.getMonth(),utilDate.getDaysInMonth(date))},getDaysInMonth:function(){var daysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31];return function(date){var m=date.getMonth();return 1==m&&utilDate.isLeapYear(date)?29:daysInMonth[m]}}(),getSuffix:function(date){switch(date.getDate()){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th"}},clone:function(date){return new Date(date.getTime())},isDST:function(date){return new Date(date.getFullYear(),0,1).getTimezoneOffset()!=date.getTimezoneOffset()},clearTime:function(date,clone){if(clone)return Ext.Date.clearTime(Ext.Date.clone(date));var hr,c,d=date.getDate();if(date.setHours(0),date.setMinutes(0),date.setSeconds(0),date.setMilliseconds(0),date.getDate()!=d){for(hr=1,c=utilDate.add(date,Ext.Date.HOUR,hr);c.getDate()!=d;hr++,c=utilDate.add(date,Ext.Date.HOUR,hr));date.setDate(d),date.setHours(c.getHours())}return date},add:function(date,interval,value){var day,decimalValue,d=Ext.Date.clone(date),base=(Ext.Date,0);if(!interval||0===value)return d;if(decimalValue=value-parseInt(value,10),value=parseInt(value,10))switch(interval.toLowerCase()){case Ext.Date.MILLI:d.setTime(d.getTime()+value);break;case Ext.Date.SECOND:d.setTime(d.getTime()+1e3*value);break;case Ext.Date.MINUTE:d.setTime(d.getTime()+60*value*1e3);break;case Ext.Date.HOUR:d.setTime(d.getTime()+60*value*60*1e3);break;case Ext.Date.DAY:d.setDate(d.getDate()+value);break;case Ext.Date.MONTH:day=date.getDate(),day>28&&(day=Math.min(day,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(date),Ext.Date.MONTH,value)).getDate())),d.setDate(day),d.setMonth(date.getMonth()+value);break;case Ext.Date.YEAR:day=date.getDate(),day>28&&(day=Math.min(day,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(date),Ext.Date.YEAR,value)).getDate())),d.setDate(day),d.setFullYear(date.getFullYear()+value)}if(decimalValue){switch(interval.toLowerCase()){case Ext.Date.MILLI:base=1;break;case Ext.Date.SECOND:base=1e3;break;case Ext.Date.MINUTE:base=6e4;break;case Ext.Date.HOUR:base=36e5;break;case Ext.Date.DAY:base=864e5;break;case Ext.Date.MONTH:day=utilDate.getDaysInMonth(d),base=864e5*day;break;case Ext.Date.YEAR:day=utilDate.isLeapYear(d)?366:365,base=864e5*day}base&&d.setTime(d.getTime()+base*decimalValue)}return d},subtract:function(date,interval,value){return utilDate.add(date,interval,-value)},between:function(date,start,end){var t=date.getTime();return start.getTime()<=t&&t<=end.getTime()},compat:function(){var p,stat,prot,s,nativeDate=window.Date,statics=["useStrict","formatCodeToRegex","parseFunctions","parseRegexes","formatFunctions","y2kYear","MILLI","SECOND","MINUTE","HOUR","DAY","MONTH","YEAR","defaults","dayNames","monthNames","monthNumbers","getShortMonthName","getShortDayName","getMonthNumber","formatCodes","isValid","parseDate","getFormatCode","createFormat","createParser","parseCodes"],proto=["dateFormat","format","getTimezone","getGMTOffset","getDayOfYear","getWeekOfYear","isLeapYear","getFirstDayOfMonth","getLastDayOfMonth","getDaysInMonth","getSuffix","clone","isDST","clearTime","add","between"],sLen=statics.length,pLen=proto.length;for(s=0;s<sLen;s++)stat=statics[s],nativeDate[stat]=utilDate[stat];for(p=0;p<pLen;p++)prot=proto[p],nativeDate.prototype[prot]=function(){var args=Array.prototype.slice.call(arguments);return args.unshift(this),utilDate[prot].apply(utilDate,args)}}})};!function(flexSetter){var noArgs=[],Base=function(){},hookFunctionFactory=function(hookFunction,underriddenFunction,methodName,owningClass){var result=function(){var result=this.callParent(arguments);return hookFunction.apply(this,arguments),result};return result.$name=methodName,result.$owner=owningClass,underriddenFunction&&(result.$previous=underriddenFunction.$previous,underriddenFunction.$previous=result),result};Ext.apply(Base,{$className:"Ext.Base",$isClass:!0,create:function(){return Ext.create.apply(Ext,[this].concat(Array.prototype.slice.call(arguments,0)))},extend:function(parent){var basePrototype,prototype,i,ln,name,statics,parentPrototype=parent.prototype;if(prototype=this.prototype=Ext.Object.chain(parentPrototype),prototype.self=this,this.superclass=prototype.superclass=parentPrototype,!parent.$isClass){basePrototype=Ext.Base.prototype;for(i in basePrototype)i in prototype&&(prototype[i]=basePrototype[i])}if(statics=parentPrototype.$inheritableStatics)for(i=0,ln=statics.length;i<ln;i++)name=statics[i],this.hasOwnProperty(name)||(this[name]=parent[name]);parent.$onExtended&&(this.$onExtended=parent.$onExtended.slice()),prototype.config=new prototype.configClass,prototype.initConfigList=prototype.initConfigList.slice(),prototype.initConfigMap=Ext.clone(prototype.initConfigMap),prototype.configMap=Ext.Object.chain(prototype.configMap)},$onExtended:[],triggerExtended:function(){Ext.classSystemMonitor&&Ext.classSystemMonitor(this,"Ext.Base#triggerExtended",arguments);var i,callback,callbacks=this.$onExtended,ln=callbacks.length;if(ln>0)for(i=0;i<ln;i++)callback=callbacks[i],callback.fn.apply(callback.scope||this,arguments)},onExtended:function(fn,scope){return this.$onExtended.push({fn:fn,scope:scope}),this},addConfig:function(config,fullMerge){var initializedName,name,value,prototype=this.prototype,configNameCache=Ext.Class.configNameCache,hasConfig=prototype.configMap,initConfigList=prototype.initConfigList,initConfigMap=prototype.initConfigMap,defaultConfig=prototype.config;for(name in config)config.hasOwnProperty(name)&&(hasConfig[name]||(hasConfig[name]=!0),value=config[name],initializedName=configNameCache[name].initialized,initConfigMap[name]||null===value||prototype[initializedName]||(initConfigMap[name]=!0,initConfigList.push(name)));fullMerge?Ext.merge(defaultConfig,config):Ext.mergeIf(defaultConfig,config),prototype.configClass=Ext.Object.classify(defaultConfig)},addStatics:function(members){var member,name;for(name in members)members.hasOwnProperty(name)&&(member=members[name],"function"!=typeof member||member.$isClass||member===Ext.emptyFn||member===Ext.identityFn||(member.$owner=this,member.$name=name,member.displayName=Ext.getClassName(this)+"."+name),this[name]=member);return this},addInheritableStatics:function(members){var inheritableStatics,hasInheritableStatics,name,member,prototype=this.prototype;inheritableStatics=prototype.$inheritableStatics,hasInheritableStatics=prototype.$hasInheritableStatics,inheritableStatics||(inheritableStatics=prototype.$inheritableStatics=[],hasInheritableStatics=prototype.$hasInheritableStatics={});for(name in members)members.hasOwnProperty(name)&&(member=members[name],"function"==typeof member&&(member.displayName=Ext.getClassName(this)+"."+name),this[name]=member,hasInheritableStatics[name]||(hasInheritableStatics[name]=!0,inheritableStatics.push(name)));return this},addMembers:function(members){var i,ln,name,member,prototype=this.prototype,enumerables=Ext.enumerables,names=[];for(name in members)names.push(name);for(enumerables&&names.push.apply(names,enumerables),i=0,ln=names.length;i<ln;i++)name=names[i],members.hasOwnProperty(name)&&(member=members[name],"function"!=typeof member||member.$isClass||member===Ext.emptyFn||member===Ext.identityFn||(member.$owner=this,member.$name=name,member.displayName=(this.$className||"")+"#"+name),prototype[name]=member);return this},addMember:function(name,member){return"function"!=typeof member||member.$isClass||member===Ext.emptyFn||member===Ext.identityFn||(member.$owner=this,member.$name=name,member.displayName=(this.$className||"")+"#"+name),this.prototype[name]=member,this},implement:function(){this.addMembers.apply(this,arguments)},borrow:function(fromClass,members){Ext.classSystemMonitor&&Ext.classSystemMonitor(this,"Ext.Base#borrow",arguments);var i,ln,name,fn,toBorrow,prototype=this.prototype,fromPrototype=fromClass.prototype,className=Ext.getClassName(this);for(members=Ext.Array.from(members),i=0,ln=members.length;i<ln;i++)name=members[i],toBorrow=fromPrototype[name],"function"==typeof toBorrow?(fn=Ext.Function.clone(toBorrow),className&&(fn.displayName=className+"#"+name),fn.$owner=this,fn.$name=name,prototype[name]=fn):prototype[name]=toBorrow;return this},override:function(members){var name,index,member,statics,names,previous,me=this,enumerables=Ext.enumerables,target=me.prototype,cloneFunction=Ext.Function.clone;2===arguments.length&&(name=members,members={},members[name]=arguments[1],enumerables=null);do{names=[],statics=null;for(name in members)"statics"==name?statics=members[name]:"inheritableStatics"==name?me.addInheritableStatics(members[name]):"config"==name?me.addConfig(members[name],!0):names.push(name);for(enumerables&&names.push.apply(names,enumerables),index=names.length;index--;)name=names[index],members.hasOwnProperty(name)&&(member=members[name],"function"!=typeof member||member.$className||member===Ext.emptyFn||member===Ext.identityFn||(void 0!==member.$owner&&(member=cloneFunction(member)),me.$className&&(member.displayName=me.$className+"#"+name),member.$owner=me,member.$name=name,(previous=target.hasOwnProperty(name)&&target[name])&&(member.$previous=previous)),target[name]=member);target=me,members=statics}while(members);return this},callParent:function(args){var method;return(method=this.callParent.caller)&&(method.$previous||(method=method.$owner?method:method.caller)&&method.$owner.superclass.self[method.$name]).apply(this,args||noArgs)},callSuper:function(args){var method;return(method=this.callSuper.caller)&&((method=method.$owner?method:method.caller)&&method.$owner.superclass.self[method.$name]).apply(this,args||noArgs)},mixin:function(name,mixinClass){var key,statics,i,ln,staticName,mixinValue,hookKey,hookFunction,me=this,mixin=mixinClass.prototype,prototype=me.prototype;void 0!==mixin.onClassMixedIn&&mixin.onClassMixedIn.call(mixinClass,me),prototype.hasOwnProperty("mixins")||(prototype.mixins="mixins"in prototype?Ext.Object.chain(prototype.mixins):{});for(key in mixin)if(mixinValue=mixin[key],"mixins"===key)Ext.merge(prototype.mixins,mixinValue);else if("xhooks"===key)for(hookKey in mixinValue)hookFunction=mixinValue[hookKey],hookFunction.$previous=Ext.emptyFn,prototype.hasOwnProperty(hookKey)?hookFunctionFactory(hookFunction,prototype[hookKey],hookKey,me):prototype[hookKey]=hookFunctionFactory(hookFunction,null,hookKey,me);else"mixinId"!==key&&"config"!==key&&void 0===prototype[key]&&(prototype[key]=mixinValue);if(statics=mixin.$inheritableStatics)for(i=0,ln=statics.length;i<ln;i++)staticName=statics[i],me.hasOwnProperty(staticName)||(me[staticName]=mixinClass[staticName]);return"config"in mixin&&me.addConfig(mixin.config,!1),prototype.mixins[name]=mixin,me},getName:function(){return Ext.getClassName(this)},createAlias:flexSetter(function(alias,origin){this.override(alias,function(){return this[origin].apply(this,arguments)})}),addXtype:function(xtype){var prototype=this.prototype,xtypesMap=prototype.xtypesMap,xtypes=prototype.xtypes,xtypesChain=prototype.xtypesChain;return prototype.hasOwnProperty("xtypesMap")||(xtypesMap=prototype.xtypesMap=Ext.merge({},prototype.xtypesMap||{}),xtypes=prototype.xtypes=prototype.xtypes?[].concat(prototype.xtypes):[],xtypesChain=prototype.xtypesChain=prototype.xtypesChain?[].concat(prototype.xtypesChain):[],prototype.xtype=xtype),xtypesMap[xtype]||(xtypesMap[xtype]=!0,xtypes.push(xtype),xtypesChain.push(xtype),Ext.ClassManager.setAlias(this,"widget."+xtype)),this}}),Base.implement({isInstance:!0,$className:"Ext.Base",configClass:Ext.emptyFn,initConfigList:[],configMap:{},initConfigMap:{},statics:function(){var method=this.statics.caller,self=this.self;return method?method.$owner:self},callParent:function(args){var method,superMethod=(method=this.callParent.caller)&&(method.$previous||(method=method.$owner?method:method.caller)&&method.$owner.superclass[method.$name]);if(!superMethod){method=this.callParent.caller;var parentClass,methodName;if(!method.$owner){if(!method.caller)throw new Error("Attempting to call a protected method from the public scope, which is not allowed");method=method.caller}if(parentClass=method.$owner.superclass,!((methodName=method.$name)in parentClass))throw new Error("this.callParent() was called but there's no such method ("+methodName+") found in the parent class ("+(Ext.getClassName(parentClass)||"Object")+")")}return superMethod.apply(this,args||noArgs)},callSuper:function(args){var method,superMethod=(method=this.callSuper.caller)&&(method=method.$owner?method:method.caller)&&method.$owner.superclass[method.$name];if(!superMethod){method=this.callSuper.caller;var parentClass,methodName;if(!method.$owner){if(!method.caller)throw new Error("Attempting to call a protected method from the public scope, which is not allowed");method=method.caller}if(parentClass=method.$owner.superclass,!((methodName=method.$name)in parentClass))throw new Error("this.callSuper() was called but there's no such method ("+methodName+") found in the parent class ("+(Ext.getClassName(parentClass)||"Object")+")")}return superMethod.apply(this,args||noArgs)},self:Base,constructor:function(){return this},initConfig:function(config){var nameMap,i,ln,name,initializedName,instanceConfig=config,configNameCache=Ext.Class.configNameCache,defaultConfig=new this.configClass,defaultConfigList=this.initConfigList,hasConfig=this.configMap;if(this.initConfig=Ext.emptyFn,this.initialConfig=instanceConfig||{},this.config=config=instanceConfig?Ext.merge(defaultConfig,config):defaultConfig,instanceConfig){defaultConfigList=defaultConfigList.slice();for(name in instanceConfig)hasConfig[name]&&null!==instanceConfig[name]&&(defaultConfigList.push(name),this[configNameCache[name].initialized]=!1)}for(i=0,ln=defaultConfigList.length;i<ln;i++)name=defaultConfigList[i],nameMap=configNameCache[name],initializedName=nameMap.initialized,this[initializedName]||(this[initializedName]=!0,this[nameMap.set].call(this,config[name]));return this},hasConfig:function(name){return Boolean(this.configMap[name])},setConfig:function(config,applyIfNotSet){if(!config)return this;var name,value,configNameCache=Ext.Class.configNameCache,currentConfig=this.config,hasConfig=this.configMap,initialConfig=this.initialConfig;applyIfNotSet=Boolean(applyIfNotSet);for(name in config)applyIfNotSet&&initialConfig.hasOwnProperty(name)||(value=config[name],currentConfig[name]=value,hasConfig[name]&&this[configNameCache[name].set](value));return this},getConfig:function(name){return this[Ext.Class.configNameCache[name].get]()},getInitialConfig:function(name){var config=this.config;return name?config[name]:config},onConfigUpdate:function(names,callback,scope){var i,ln,name,updaterName,updater,newUpdater,self=this.self,className=self.$className;for(names=Ext.Array.from(names),scope=scope||this,i=0,ln=names.length;i<ln;i++)name=names[i],updaterName="update"+Ext.String.capitalize(name),updater=this[updaterName]||Ext.emptyFn,newUpdater=function(){updater.apply(this,arguments),scope[callback].apply(scope,arguments)},newUpdater.$name=updaterName,newUpdater.$owner=self,newUpdater.displayName=className+"#"+updaterName,this[updaterName]=newUpdater},destroy:function(){this.destroy=Ext.emptyFn}}),Base.prototype.callOverridden=Base.prototype.callParent,Ext.Base=Base}(Ext.Function.flexSetter);!function(){function makeCtor(className){function constructor(){return this.constructor.apply(this,arguments)||null}return className&&(constructor.displayName=className),constructor}var ExtClass,baseStaticMember,baseStaticMemberLength,Base=Ext.Base,baseStaticMembers=[];for(baseStaticMember in Base)Base.hasOwnProperty(baseStaticMember)&&baseStaticMembers.push(baseStaticMember);baseStaticMemberLength=baseStaticMembers.length,Ext.Class=ExtClass=function(Class,data,onCreated){return"function"!=typeof Class&&(onCreated=data,data=Class,Class=null),data||(data={}),Class=ExtClass.create(Class,data),ExtClass.process(Class,data,onCreated),Class},Ext.apply(ExtClass,{onBeforeCreated:function(Class,data,hooks){Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,">> Ext.Class#onBeforeCreated",arguments),Class.addMembers(data),hooks.onCreated.call(Class,Class),Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"<< Ext.Class#onBeforeCreated",arguments)},create:function(Class,data){var name,i;for(Class||(Class=makeCtor(data.$className)),i=0;i<baseStaticMemberLength;i++)name=baseStaticMembers[i],Class[name]=Base[name];return Class},process:function(Class,data,onCreated){var preprocessor,preprocessorsProperties,i,ln,j,subLn,preprocessorProperty,preprocessorStack=data.preprocessors||ExtClass.defaultPreprocessors,registeredPreprocessors=this.preprocessors,hooks={onBeforeCreated:this.onBeforeCreated},preprocessors=[];for(delete data.preprocessors,i=0,ln=preprocessorStack.length;i<ln;i++)if("string"==typeof(preprocessor=preprocessorStack[i])){if(preprocessor=registeredPreprocessors[preprocessor],!0===(preprocessorsProperties=preprocessor.properties))preprocessors.push(preprocessor.fn);else if(preprocessorsProperties)for(j=0,subLn=preprocessorsProperties.length;j<subLn;j++)if(preprocessorProperty=preprocessorsProperties[j],data.hasOwnProperty(preprocessorProperty)){preprocessors.push(preprocessor.fn);break}}else preprocessors.push(preprocessor);hooks.onCreated=onCreated||Ext.emptyFn,hooks.preprocessors=preprocessors,this.doProcess(Class,data,hooks)},doProcess:function(Class,data,hooks){for(var me=this,preprocessors=hooks.preprocessors,preprocessor=preprocessors.shift(),doProcess=me.doProcess;preprocessor;preprocessor=preprocessors.shift())if(!1===preprocessor.call(me,Class,data,hooks,doProcess))return;hooks.onBeforeCreated.apply(me,arguments)},preprocessors:{},registerPreprocessor:function(name,fn,properties,position,relativeTo){return position||(position="last"),properties||(properties=[name]),this.preprocessors[name]={name:name,properties:properties||!1,fn:fn},this.setDefaultPreprocessorPosition(name,position,relativeTo),this},getPreprocessor:function(name){return this.preprocessors[name]},getPreprocessors:function(){return this.preprocessors},defaultPreprocessors:[],getDefaultPreprocessors:function(){return this.defaultPreprocessors},setDefaultPreprocessors:function(preprocessors){return this.defaultPreprocessors=Ext.Array.from(preprocessors),this},setDefaultPreprocessorPosition:function(name,offset,relativeName){var index,defaultPreprocessors=this.defaultPreprocessors;if("string"==typeof offset){if("first"===offset)return defaultPreprocessors.unshift(name),this;if("last"===offset)return defaultPreprocessors.push(name),this;offset="after"===offset?1:-1}return index=Ext.Array.indexOf(defaultPreprocessors,relativeName),-1!==index&&Ext.Array.splice(defaultPreprocessors,Math.max(0,index+offset),0,name),this},configNameCache:{},getConfigNameMap:function(name){var capitalizedName,cache=this.configNameCache,map=cache[name];return map||(capitalizedName=name.charAt(0).toUpperCase()+name.substr(1),map=cache[name]={internal:name,initialized:"_is"+capitalizedName+"Initialized",apply:"apply"+capitalizedName,update:"update"+capitalizedName,set:"set"+capitalizedName,get:"get"+capitalizedName,doSet:"doSet"+capitalizedName,changeEvent:name.toLowerCase()+"change"}),map}}),ExtClass.registerPreprocessor("extend",function(Class,data,hooks){Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"Ext.Class#extendPreProcessor",arguments);var Parent,parentPrototype,i,Base=Ext.Base,basePrototype=Base.prototype,extend=data.extend;if(delete data.extend,Parent=extend&&extend!==Object?extend:Base,parentPrototype=Parent.prototype,!Parent.$isClass)for(i in basePrototype)parentPrototype[i]||(parentPrototype[i]=basePrototype[i]);Class.extend(Parent),Class.triggerExtended.apply(Class,arguments),data.onClassExtended&&(Class.onExtended(data.onClassExtended,Class),delete data.onClassExtended)},!0),ExtClass.registerPreprocessor("statics",function(Class,data){Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"Ext.Class#staticsPreprocessor",arguments),Class.addStatics(data.statics),delete data.statics}),ExtClass.registerPreprocessor("inheritableStatics",function(Class,data){Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"Ext.Class#inheritableStaticsPreprocessor",arguments),Class.addInheritableStatics(data.inheritableStatics),delete data.inheritableStatics}),ExtClass.registerPreprocessor("config",function(Class,data){Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"Ext.Class#configPreProcessor",arguments);var config=data.config,prototype=Class.prototype;delete data.config,Ext.Object.each(config,function(name,value){var optimizedGetter,customGetter,nameMap=ExtClass.getConfigNameMap(name),internalName=nameMap.internal,initializedName=nameMap.initialized,applyName=nameMap.apply,updateName=nameMap.update,setName=nameMap.set,getName=nameMap.get,hasOwnSetter=setName in prototype||data.hasOwnProperty(setName),hasOwnApplier=applyName in prototype||data.hasOwnProperty(applyName),hasOwnUpdater=updateName in prototype||data.hasOwnProperty(updateName);null!==value&&(hasOwnSetter||hasOwnApplier||hasOwnUpdater)?prototype[initializedName]=!1:(prototype[internalName]=value,prototype[initializedName]=!0),hasOwnSetter||(data[setName]=function(value){var oldValue=this[internalName],applier=this[applyName],updater=this[updateName];return this[initializedName]||(this[initializedName]=!0),applier&&(value=applier.call(this,value,oldValue)),void 0!==value&&(this[internalName]=value,updater&&value!==oldValue&&updater.call(this,value,oldValue)),this}),getName in prototype&&!data.hasOwnProperty(getName)||(customGetter=data[getName]||!1,optimizedGetter=customGetter?function(){return customGetter.apply(this,arguments)}:function(){return this[internalName]},data[getName]=function(){var currentGetter;return this[initializedName]||(this[initializedName]=!0,this[setName](this.config[name])),currentGetter=this[getName],"$previous"in currentGetter?currentGetter.$previous=optimizedGetter:this[getName]=optimizedGetter,optimizedGetter.apply(this,arguments)})}),Class.addConfig(config,!0)}),ExtClass.registerPreprocessor("mixins",function(Class,data,hooks){Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"Ext.Class#mixinsPreprocessor",arguments);var name,mixin,i,ln,mixins=data.mixins;delete data.mixins,Ext.Function.interceptBefore(hooks,"onCreated",function(){if(Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"Ext.Class#mixinsPreprocessor#beforeCreated",arguments),mixins instanceof Array)for(i=0,ln=mixins.length;i<ln;i++)mixin=mixins[i],name=mixin.prototype.mixinId||mixin.$className,Class.mixin(name,mixin);else for(var mixinName in mixins)mixins.hasOwnProperty(mixinName)&&Class.mixin(mixinName,mixins[mixinName])})}),Ext.extend=function(Class,Parent,members){Ext.classSystemMonitor&&Ext.classSystemMonitor(Class,"Ext.Class#extend-backwards-compatible",arguments),2===arguments.length&&Ext.isObject(Parent)&&(members=Parent,Parent=Class,Class=null);var cls;if(!Parent)throw new Error("[Ext.extend] Attempting to extend from a class which has not been loaded on the page.");return members.extend=Parent,members.preprocessors=["extend","statics","inheritableStatics","mixins","config"],Class?(cls=new ExtClass(Class,members),cls.prototype.constructor=Class):cls=new ExtClass(members),cls.prototype.override=function(o){for(var m in o)o.hasOwnProperty(m)&&(this[m]=o[m])},cls}}();!function(Class,alias,arraySlice,arrayFrom,global){function makeCtor(){function constructor(){return this.constructor.apply(this,arguments)||null}return constructor}var Manager=Ext.ClassManager={classes:{},existCache:{},namespaceRewrites:[{from:"Ext.",to:Ext}],maps:{alternateToName:{},aliasToName:{},nameToAliases:{},nameToAlternates:{}},enableNamespaceParseCache:!0,namespaceParseCache:{},instantiators:[],isCreated:function(className){var i,ln,part,root,parts,existCache=this.existCache;if("string"!=typeof className||className.length<1)throw new Error("[Ext.ClassManager] Invalid classname, must be a string and must not be empty");if(this.classes[className]||existCache[className])return!0;for(root=global,parts=this.parseNamespace(className),i=0,ln=parts.length;i<ln;i++)if("string"!=typeof(part=parts[i]))root=part;else{if(!root||!root[part])return!1;root=root[part]}return existCache[className]=!0,this.triggerCreated(className),!0},createdListeners:[],nameCreatedListeners:{},triggerCreated:function(className){var i,ln,j,subLn,listener,name,listeners=this.createdListeners,nameListeners=this.nameCreatedListeners,alternateNames=this.maps.nameToAlternates[className],names=[className];for(i=0,ln=listeners.length;i<ln;i++)listener=listeners[i],listener.fn.call(listener.scope,className);for(alternateNames&&names.push.apply(names,alternateNames),i=0,ln=names.length;i<ln;i++)if(name=names[i],listeners=nameListeners[name]){for(j=0,subLn=listeners.length;j<subLn;j++)listener=listeners[j],listener.fn.call(listener.scope,name);delete nameListeners[name]}},onCreated:function(fn,scope,className){Ext.classSystemMonitor&&Ext.classSystemMonitor(className,"Ext.ClassManager#onCreated",arguments);var listeners=this.createdListeners,nameListeners=this.nameCreatedListeners,listener={fn:fn,scope:scope};if(className){if(this.isCreated(className))return void fn.call(scope,className);nameListeners[className]||(nameListeners[className]=[]),nameListeners[className].push(listener)}else listeners.push(listener)},parseNamespace:function(namespace){if("string"!=typeof namespace)throw new Error("[Ext.ClassManager] Invalid namespace, must be a string");var parts,rewrites,root,name,rewrite,from,to,i,ln,cache=this.namespaceParseCache;if(this.enableNamespaceParseCache&&cache.hasOwnProperty(namespace))return cache[namespace];for(parts=[],rewrites=this.namespaceRewrites,root=global,name=namespace,i=0,ln=rewrites.length;i<ln;i++)if(rewrite=rewrites[i],from=rewrite.from,to=rewrite.to,name===from||name.substring(0,from.length)===from){name=name.substring(from.length),"string"!=typeof to?root=to:parts=parts.concat(to.split("."));break}return parts.push(root),parts=parts.concat(name.split(".")),this.enableNamespaceParseCache&&(cache[namespace]=parts),parts},setNamespace:function(name,value){var i,part,root=global,parts=this.parseNamespace(name),ln=parts.length-1,leaf=parts[ln];for(i=0;i<ln;i++)part=parts[i],"string"!=typeof part?root=part:(root[part]||(root[part]={}),root=root[part]);return root[leaf]=value,root[leaf]},createNamespaces:function(){var parts,part,i,j,ln,subLn,root=global;for(i=0,ln=arguments.length;i<ln;i++)for(parts=this.parseNamespace(arguments[i]),j=0,subLn=parts.length;j<subLn;j++)part=parts[j],"string"!=typeof part?root=part:(root[part]||(root[part]={}),root=root[part]);return root},set:function(name,value){var alternates,me=this,maps=me.maps,nameToAlternates=maps.nameToAlternates,targetName=me.getName(value);return me.classes[name]=me.setNamespace(name,value),targetName&&targetName!==name&&(maps.alternateToName[name]=targetName,alternates=nameToAlternates[targetName]||(nameToAlternates[targetName]=[]),alternates.push(name)),this},get:function(name){var root,parts,part,i,ln,classes=this.classes;if(classes[name])return classes[name];for(root=global,parts=this.parseNamespace(name),i=0,ln=parts.length;i<ln;i++)if("string"!=typeof(part=parts[i]))root=part;else{if(!root||!root[part])return null;root=root[part]}return root},setAlias:function(cls,alias){var className,aliasToNameMap=this.maps.aliasToName,nameToAliasesMap=this.maps.nameToAliases;return className="string"==typeof cls?cls:this.getName(cls),alias&&aliasToNameMap[alias]!==className&&(aliasToNameMap[alias]&&Ext.isDefined(global.console)&&global.console.log("[Ext.ClassManager] Overriding existing alias: '"+alias+"' of: '"+aliasToNameMap[alias]+"' with: '"+className+"'. Be sure it's intentional."),aliasToNameMap[alias]=className),nameToAliasesMap[className]||(nameToAliasesMap[className]=[]),alias&&Ext.Array.include(nameToAliasesMap[className],alias),this},addNameAliasMappings:function(aliases){var className,aliasList,alias,i,aliasToNameMap=this.maps.aliasToName,nameToAliasesMap=this.maps.nameToAliases;for(className in aliases)for(aliasList=nameToAliasesMap[className]||(nameToAliasesMap[className]=[]),i=0;i<aliases[className].length;i++)alias=aliases[className][i],aliasToNameMap[alias]||(aliasToNameMap[alias]=className,aliasList.push(alias));return this},addNameAlternateMappings:function(alternates){var className,aliasList,alternate,i,alternateToName=this.maps.alternateToName,nameToAlternates=this.maps.nameToAlternates;for(className in alternates)for(aliasList=nameToAlternates[className]||(nameToAlternates[className]=[]),i=0;i<alternates[className].length;i++)alternate=alternates[className][i],alternateToName[alternate]||(alternateToName[alternate]=className,aliasList.push(alternate));return this},getByAlias:function(alias){return this.get(this.getNameByAlias(alias))},getNameByAlias:function(alias){return this.maps.aliasToName[alias]||""},getNameByAlternate:function(alternate){return this.maps.alternateToName[alternate]||""},getAliasesByName:function(name){return this.maps.nameToAliases[name]||[]},getName:function(object){return object&&object.$className||""},getClass:function(object){return object&&object.self||null},create:function(className,data,createdFn){if(null!=className&&"string"!=typeof className)throw new Error("[Ext.define] Invalid class name '"+className+"' specified, must be a non-empty string");var ctor=makeCtor();return"function"==typeof data&&(data=data(ctor)),className&&(ctor.displayName=className),data.$className=className,new Class(ctor,data,function(){var postprocessor,i,ln,j,subLn,postprocessorProperties,postprocessorProperty,postprocessorStack=data.postprocessors||Manager.defaultPostprocessors,registeredPostprocessors=Manager.postprocessors,postprocessors=[];for(delete data.postprocessors,i=0,ln=postprocessorStack.length;i<ln;i++)if("string"==typeof(postprocessor=postprocessorStack[i])){if(postprocessor=registeredPostprocessors[postprocessor],!0===(postprocessorProperties=postprocessor.properties))postprocessors.push(postprocessor.fn);else if(postprocessorProperties)for(j=0,subLn=postprocessorProperties.length;j<subLn;j++)if(postprocessorProperty=postprocessorProperties[j],data.hasOwnProperty(postprocessorProperty)){postprocessors.push(postprocessor.fn);break}}else postprocessors.push(postprocessor);data.postprocessors=postprocessors,data.createdFn=createdFn,Manager.processCreate(className,this,data)})},processCreate:function(className,cls,clsData){var me=this,postprocessor=clsData.postprocessors.shift(),createdFn=clsData.createdFn;if(!postprocessor)return Ext.classSystemMonitor&&Ext.classSystemMonitor(className,"Ext.ClassManager#classCreated",arguments),className&&me.set(className,cls),createdFn&&createdFn.call(cls,cls),void(className&&me.triggerCreated(className));!1!==postprocessor.call(me,className,cls,clsData,me.processCreate)&&me.processCreate(className,cls,clsData)},createOverride:function(className,data,createdFn){var me=this,overriddenClassName=data.override,requires=data.requires,uses=data.uses,compat=data.compatibility,classReady=function(){var cls,temp;requires?(temp=requires,requires=null,Ext.Loader.require(temp,classReady)):(cls=me.get(overriddenClassName),delete data.override,delete data.compatibility,delete data.requires,delete data.uses,Ext.override(cls,data),me.triggerCreated(className),uses&&Ext.Loader.addUsedClasses(uses),createdFn&&createdFn.call(cls))};return me.existCache[className]=!0,compat&&!Ext.checkVersion(compat)||me.onCreated(classReady,me,overriddenClassName),me},instantiateByAlias:function(){var alias=arguments[0],args=arraySlice.call(arguments),className=this.getNameByAlias(alias);if(!className){if(!(className=this.maps.aliasToName[alias]))throw new Error("[Ext.createByAlias] Cannot create an instance of unrecognized alias: "+alias);global.console&&global.console.warn("[Ext.Loader] Synchronously loading '"+className+"'; consider adding Ext.require('"+alias+"') above Ext.onReady"),Ext.syncRequire(className)}return args[0]=className,this.instantiate.apply(this,args)},instantiate:function(){var possibleName,cls,name=arguments[0],nameType=typeof name,args=arraySlice.call(arguments,1),alias=name;if("function"!=nameType){if("string"!=nameType&&0===args.length&&(args=[name],name=name.xclass),"string"!=typeof name||name.length<1)throw new Error("[Ext.create] Invalid class name or alias '"+name+"' specified, must be a non-empty string");cls=this.get(name)}else cls=name;if(cls||(possibleName=this.getNameByAlias(name))&&(name=possibleName,cls=this.get(name)),cls||(possibleName=this.getNameByAlternate(name))&&(name=possibleName,cls=this.get(name)),cls||(global.console&&global.console.warn("[Ext.Loader] Synchronously loading '"+name+"'; consider adding Ext.require('"+(possibleName?alias:name)+"') above Ext.onReady"),Ext.syncRequire(name),cls=this.get(name)),!cls)throw new Error("[Ext.create] Cannot create an instance of unrecognized class name / alias: "+alias);if("function"!=typeof cls)throw new Error("[Ext.create] '"+name+"' is a singleton and cannot be instantiated");return this.getInstantiator(args.length)(cls,args)},dynInstantiate:function(name,args){return args=arrayFrom(args,!0),args.unshift(name),this.instantiate.apply(this,args)},getInstantiator:function(length){var instantiator,i,args,instantiators=this.instantiators;if(!(instantiator=instantiators[length])){for(i=length,args=[],i=0;i<length;i++)args.push("a["+i+"]");instantiator=instantiators[length]=new Function("c","a","return new c("+args.join(",")+")"),instantiator.displayName="Ext.ClassManager.instantiate"+length}return instantiator},postprocessors:{},defaultPostprocessors:[],registerPostprocessor:function(name,fn,properties,position,relativeTo){return position||(position="last"),properties||(properties=[name]),this.postprocessors[name]={name:name,properties:properties||!1,fn:fn},this.setDefaultPostprocessorPosition(name,position,relativeTo),this},setDefaultPostprocessors:function(postprocessors){return this.defaultPostprocessors=arrayFrom(postprocessors),this},setDefaultPostprocessorPosition:function(name,offset,relativeName){var index,defaultPostprocessors=this.defaultPostprocessors;if("string"==typeof offset){if("first"===offset)return defaultPostprocessors.unshift(name),this;if("last"===offset)return defaultPostprocessors.push(name),this;offset="after"===offset?1:-1}return index=Ext.Array.indexOf(defaultPostprocessors,relativeName),-1!==index&&Ext.Array.splice(defaultPostprocessors,Math.max(0,index+offset),0,name),this},getNamesByExpression:function(expression){var name,alias,aliases,possibleName,regex,i,ln,nameToAliasesMap=this.maps.nameToAliases,names=[];if("string"!=typeof expression||expression.length<1)throw new Error("[Ext.ClassManager.getNamesByExpression] Expression "+expression+" is invalid, must be a non-empty string");if(-1!==expression.indexOf("*")){expression=expression.replace(/\*/g,"(.*?)"),regex=new RegExp("^"+expression+"$");for(name in nameToAliasesMap)if(nameToAliasesMap.hasOwnProperty(name))if(aliases=nameToAliasesMap[name],-1!==name.search(regex))names.push(name);else for(i=0,ln=aliases.length;i<ln;i++)if(alias=aliases[i],-1!==alias.search(regex)){names.push(name);break}}else possibleName=this.getNameByAlias(expression),possibleName?names.push(possibleName):(possibleName=this.getNameByAlternate(expression),possibleName?names.push(possibleName):names.push(expression));return names}};Manager.registerPostprocessor("alias",function(name,cls,data){Ext.classSystemMonitor&&Ext.classSystemMonitor(name,"Ext.ClassManager#aliasPostProcessor",arguments);var i,ln,aliases=data.alias;for(i=0,ln=aliases.length;i<ln;i++)alias=aliases[i],this.setAlias(cls,alias)},["xtype","alias"]),Manager.registerPostprocessor("singleton",function(name,cls,data,fn){return Ext.classSystemMonitor&&Ext.classSystemMonitor(name,"Ext.ClassManager#singletonPostProcessor",arguments),!data.singleton||(fn.call(this,name,new cls,data),!1)}),Manager.registerPostprocessor("alternateClassName",function(name,cls,data){Ext.classSystemMonitor&&Ext.classSystemMonitor(name,"Ext.ClassManager#alternateClassNamePostprocessor",arguments);var i,ln,alternate,alternates=data.alternateClassName;for(alternates instanceof Array||(alternates=[alternates]),i=0,ln=alternates.length;i<ln;i++){if("string"!=typeof(alternate=alternates[i]))throw new Error("[Ext.define] Invalid alternate of: '"+alternate+"' for class: '"+name+"'; must be a valid string");this.set(alternate,cls)}}),Ext.apply(Ext,{create:alias(Manager,"instantiate"),widget:function(name,config){var alias,className,T,load,xtype=name;return"string"!=typeof xtype?(config=name,xtype=config.xtype):config=config||{},config.isComponent?config:(alias="widget."+xtype,className=Manager.getNameByAlias(alias),className||(load=!0),T=Manager.get(className),load||!T?Manager.instantiateByAlias(alias,config):new T(config))},createByAlias:alias(Manager,"instantiateByAlias"),define:function(className,data,createdFn){return Ext.classSystemMonitor&&Ext.classSystemMonitor(className,"ClassManager#define",arguments),data.override?Manager.createOverride.apply(Manager,arguments):Manager.create.apply(Manager,arguments)},undefine:function(className){Ext.classSystemMonitor&&Ext.classSystemMonitor(className,"Ext.ClassManager#undefine",arguments);var parts,partCount,namespace,i,classes=Manager.classes,maps=Manager.maps,aliasToName=maps.aliasToName,nameToAliases=maps.nameToAliases,alternateToName=maps.alternateToName,nameToAlternates=maps.nameToAlternates,aliases=nameToAliases[className],alternates=nameToAlternates[className];if(delete Manager.namespaceParseCache[className],delete nameToAliases[className],delete nameToAlternates[className],delete classes[className],aliases)for(i=aliases.length;i--;)delete aliasToName[aliases[i]];if(alternates)for(i=alternates.length;i--;)delete alternateToName[alternates[i]];for(parts=Manager.parseNamespace(className),partCount=parts.length-1,namespace=parts[0],i=1;i<partCount;i++)if(!(namespace=namespace[parts[i]]))return;try{delete namespace[parts[partCount]]}catch(e){namespace[parts[partCount]]=void 0}},getClassName:alias(Manager,"getName"),getDisplayName:function(object){if(object){if(object.displayName)return object.displayName;if(object.$name&&object.$class)return Ext.getClassName(object.$class)+"#"+object.$name;if(object.$className)return object.$className}return"Anonymous"},getClass:alias(Manager,"getClass"),namespace:alias(Manager,"createNamespaces")}),Ext.createWidget=Ext.widget,Ext.ns=Ext.namespace,Class.registerPreprocessor("className",function(cls,data){data.$className&&(cls.$className=data.$className,cls.displayName=cls.$className),Ext.classSystemMonitor&&Ext.classSystemMonitor(cls,"Ext.ClassManager#classNamePreprocessor",arguments)},!0,"first"),Class.registerPreprocessor("alias",function(cls,data){Ext.classSystemMonitor&&Ext.classSystemMonitor(cls,"Ext.ClassManager#aliasPreprocessor",arguments);var i,ln,alias,xtype,prototype=cls.prototype,xtypes=arrayFrom(data.xtype),aliases=arrayFrom(data.alias),widgetPrefixLength="widget.".length,xtypesChain=Array.prototype.slice.call(prototype.xtypesChain||[]),xtypesMap=Ext.merge({},prototype.xtypesMap||{});for(i=0,ln=aliases.length;i<ln;i++){if("string"!=typeof(alias=aliases[i])||alias.length<1)throw new Error("[Ext.define] Invalid alias of: '"+alias+"' for class: '"+name+"'; must be a valid string");"widget."===alias.substring(0,widgetPrefixLength)&&(xtype=alias.substring(widgetPrefixLength),Ext.Array.include(xtypes,xtype))}for(cls.xtype=data.xtype=xtypes[0],data.xtypes=xtypes,i=0,ln=xtypes.length;i<ln;i++)xtype=xtypes[i],xtypesMap[xtype]||(xtypesMap[xtype]=!0,xtypesChain.push(xtype));for(data.xtypesChain=xtypesChain,data.xtypesMap=xtypesMap,Ext.Function.interceptAfter(data,"onClassCreated",function(){Ext.classSystemMonitor&&Ext.classSystemMonitor(cls,"Ext.ClassManager#aliasPreprocessor#afterClassCreated",arguments);var key,mixin,mixins=prototype.mixins;for(key in mixins)if(mixins.hasOwnProperty(key)&&(mixin=mixins[key],xtypes=mixin.xtypes))for(i=0,ln=xtypes.length;i<ln;i++)xtype=xtypes[i],xtypesMap[xtype]||(xtypesMap[xtype]=!0,xtypesChain.push(xtype))}),i=0,ln=xtypes.length;i<ln;i++){if("string"!=typeof(xtype=xtypes[i])||xtype.length<1)throw new Error("[Ext.define] Invalid xtype of: '"+xtype+"' for class: '"+name+"'; must be a valid non-empty string");Ext.Array.include(aliases,"widget."+xtype)}data.alias=aliases},["xtype","alias"])}(Ext.Class,Ext.Function.alias,Array.prototype.slice,Ext.Array.from,Ext.global),Ext._alternatesMetadata&&(Ext.ClassManager.addNameAlternateMappings(Ext._alternatesMetadata),Ext._alternatesMetadata=null),Ext._aliasMetadata&&(Ext.ClassManager.addNameAliasMappings(Ext._aliasMetadata),Ext._aliasMetadata=null);Ext.Loader=new function(){var Loader=this,Manager=Ext.ClassManager,Class=Ext.Class,flexSetter=Ext.Function.flexSetter,alias=Ext.Function.alias,pass=Ext.Function.pass,defer=Ext.Function.defer,arrayErase=Ext.Array.erase,isNonBrowser="undefined"==typeof window,isNodeJS=isNonBrowser&&"function"==typeof require,isJsdb=isNonBrowser&&"undefined"!=typeof system&&-1!==system.program.search(/jsdb/),isPhantomJS="undefined"!=typeof phantom&&phantom.fs,dependencyProperties=["extend","mixins","requires"],isInHistory={},history=[],slashDotSlashRe=/\/\.\//g,dotRe=/\./g,setPathCount=0;Ext.apply(Loader,{isInHistory:isInHistory,history:history,config:{enabled:!1,scriptChainDelay:!1,disableCaching:!0,disableCachingParam:"_dc",garbageCollect:!1,paths:{Ext:"."},preserveScripts:!0,scriptCharset:void 0},setConfig:function(name,value){return Ext.isObject(name)&&1===arguments.length?(Ext.merge(Loader.config,name),"paths"in name&&Ext.app.collectNamespaces(name.paths)):(Loader.config[name]=Ext.isObject(value)?Ext.merge(Loader.config[name],value):value,"paths"===name&&Ext.app.collectNamespaces(value)),Loader},getConfig:function(name){return name?Loader.config[name]:Loader.config},setPath:flexSetter(function(name,path){return Loader.config.paths[name]=path,Ext.app.namespaces[name]=!0,setPathCount++,Loader}),addClassPathMappings:function(paths){var name;if(0==setPathCount)Loader.config.paths=paths;else for(name in paths)Loader.config.paths[name]=paths[name];return setPathCount++,Loader},getPath:function(className){var path="",paths=Loader.config.paths,prefix=Loader.getPrefix(className);if(prefix.length>0){if(prefix===className)return paths[prefix];path=paths[prefix],className=className.substring(prefix.length+1)}return path.length>0&&(path+="/"),path.replace(slashDotSlashRe,"/")+className.replace(dotRe,"/")+".js"},getPrefix:function(className){var prefix,paths=Loader.config.paths,deepestPrefix="";if(paths.hasOwnProperty(className))return className;for(prefix in paths)paths.hasOwnProperty(prefix)&&prefix+"."===className.substring(0,prefix.length+1)&&prefix.length>deepestPrefix.length&&(deepestPrefix=prefix);return deepestPrefix},isAClassNameWithAKnownPrefix:function(className){var prefix=Loader.getPrefix(className);return""!==prefix&&prefix!==className},require:function(expressions,fn,scope,excludes){fn&&fn.call(scope)},syncRequire:function(){},exclude:function(excludes){return{require:function(expressions,fn,scope){return Loader.require(expressions,fn,scope,excludes)},syncRequire:function(expressions,fn,scope){return Loader.syncRequire(expressions,fn,scope,excludes)}}},onReady:function(fn,scope,withDomReady,options){var oldFn;!1!==withDomReady&&Ext.onDocumentReady&&(oldFn=fn,fn=function(){Ext.onDocumentReady(oldFn,scope,options)}),fn.call(scope)}});var queue=[],isClassFileLoaded={},isFileLoaded={},classNameToFilePathMap={},scriptElements={},readyListeners=[],usedClasses=[],requiresMap={},comparePriority=function(listenerA,listenerB){return listenerB.priority-listenerA.priority};Ext.apply(Loader,{documentHead:"undefined"!=typeof document&&(document.head||document.getElementsByTagName("head")[0]),isLoading:!1,queue:queue,isClassFileLoaded:isClassFileLoaded,isFileLoaded:isFileLoaded,readyListeners:readyListeners,optionalRequires:usedClasses,requiresMap:requiresMap,numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:!1,classNameToFilePathMap:classNameToFilePathMap,scriptsLoading:0,syncModeEnabled:!1,scriptElements:scriptElements,refreshQueue:function(){var i,item,j,requires,ln=queue.length;if(!ln&&!Loader.scriptsLoading)return Loader.triggerReady();for(i=0;i<ln;i++)if(item=queue[i]){if(requires=item.requires,requires.length>Loader.numLoadedFiles)continue;for(j=0;j<requires.length;)Manager.isCreated(requires[j])?arrayErase(requires,j,1):j++;if(0===item.requires.length){arrayErase(queue,i,1),item.callback.call(item.scope),Loader.refreshQueue();break}}return Loader},injectScriptElement:function(url,onLoad,onError,scope,charset){var script=document.createElement("script"),dispatched=!1,config=Loader.config,onLoadFn=function(){dispatched||(dispatched=!0,script.onload=script.onreadystatechange=script.onerror=null,"number"==typeof config.scriptChainDelay?defer(onLoad,config.scriptChainDelay,scope):onLoad.call(scope),Loader.cleanupScriptElement(script,!1===config.preserveScripts,config.garbageCollect))},onErrorFn=function(arg){defer(onError,1,scope),Loader.cleanupScriptElement(script,!1===config.preserveScripts,config.garbageCollect)};return script.type="text/javascript",script.onerror=onErrorFn,charset=charset||config.scriptCharset,charset&&(script.charset=charset),"addEventListener"in script?script.onload=onLoadFn:"readyState"in script?script.onreadystatechange=function(){"loaded"!=this.readyState&&"complete"!=this.readyState||onLoadFn()}:script.onload=onLoadFn,script.src=url,(Loader.documentHead||document.getElementsByTagName("head")[0]).appendChild(script),script},removeScriptElement:function(url){return scriptElements[url]&&(Loader.cleanupScriptElement(scriptElements[url],!0,!!Loader.getConfig("garbageCollect")),delete scriptElements[url]),Loader},cleanupScriptElement:function(script,remove,collect){var prop;if(script.onload=script.onreadystatechange=script.onerror=null,remove&&(Ext.removeNode(script),collect))for(prop in script)try{"src"!=prop&&(script[prop]=null),delete script[prop]}catch(cleanEx){}return Loader},loadScript:function(options){var src,config=Loader.getConfig(),isString="string"==typeof options,url=isString?options:options.url,onError=!isString&&options.onError,onLoad=!isString&&options.onLoad,scope=!isString&&options.scope,onScriptError=function(){Loader.numPendingFiles--,Loader.scriptsLoading--,onError&&onError.call(scope,"Failed loading '"+url+"', please verify that the file exists"),Loader.numPendingFiles+Loader.scriptsLoading===0&&Loader.refreshQueue()},onScriptLoad=function(){Loader.numPendingFiles--,Loader.scriptsLoading--,onLoad&&onLoad.call(scope),Loader.numPendingFiles+Loader.scriptsLoading===0&&Loader.refreshQueue()};Loader.isLoading=!0,Loader.numPendingFiles++,Loader.scriptsLoading++,src=config.disableCaching?url+"?"+config.disableCachingParam+"="+Ext.Date.now():url,scriptElements[url]=Loader.injectScriptElement(src,onScriptLoad,onScriptError)},loadScriptFile:function(url,onLoad,onError,scope,synchronous){if(isFileLoaded[url])return Loader;var xhr,status,onScriptError,config=Loader.getConfig(),noCacheUrl=url+(config.disableCaching?"?"+config.disableCachingParam+"="+Ext.Date.now():""),isCrossOriginRestricted=!1,debugSourceURL="";if(scope=scope||Loader,Loader.isLoading=!0,synchronous){xhr="undefined"!=typeof XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");try{xhr.open("GET",noCacheUrl,!1),xhr.send(null)}catch(e){isCrossOriginRestricted=!0}status=1223===xhr.status?204:0!==xhr.status||"file:"!=(self.location||{}).protocol&&"ionp:"!=(self.location||{}).protocol?xhr.status:200,isCrossOriginRestricted=isCrossOriginRestricted||0===status,isCrossOriginRestricted&&!isPhantomJS?onError.call(Loader,"Failed loading synchronously via XHR: '"+url+"'; It's likely that the file is either being loaded from a different domain or from the local file system whereby cross origin requests are not allowed due to security reasons. Use asynchronous loading with Ext.require instead.",synchronous):status>=200&&status<300||304===status||isPhantomJS?(Ext.isIE||(debugSourceURL="\n//@ sourceURL="+url),Ext.globalEval(xhr.responseText+debugSourceURL),onLoad.call(scope)):onError.call(Loader,"Failed loading synchronously via XHR: '"+url+"'; please verify that the file exists. XHR status code: "+status,synchronous),xhr=null}else onScriptError=function(){onError.call(scope,"Failed loading '"+url+"', please verify that the file exists",synchronous)},scriptElements[url]=Loader.injectScriptElement(noCacheUrl,onLoad,onScriptError,scope)},syncRequire:function(){var syncModeEnabled=Loader.syncModeEnabled;syncModeEnabled||(Loader.syncModeEnabled=!0),Loader.require.apply(Loader,arguments),syncModeEnabled||(Loader.syncModeEnabled=!1),Loader.refreshQueue()},require:function(expressions,fn,scope,excludes){var callback,syncModeEnabled,filePath,expression,exclude,className,possibleClassName,i,j,ln,subLn,excluded={},included={},excludedClassNames=[],possibleClassNames=[],classNames=[],references=[];if(excludes)for(excludes="string"==typeof excludes?[excludes]:excludes,i=0,ln=excludes.length;i<ln;i++)if("string"==typeof(exclude=excludes[i])&&exclude.length>0)for(excludedClassNames=Manager.getNamesByExpression(exclude),j=0,subLn=excludedClassNames.length;j<subLn;j++)excluded[excludedClassNames[j]]=!0;for(expressions="string"==typeof expressions?[expressions]:expressions||[],callback=fn?fn.length>0?function(){var i,ln,classes=[];for(i=0,ln=references.length;i<ln;i++)classes.push(Manager.get(references[i]));return fn.apply(this,classes)}:fn:Ext.emptyFn,scope=scope||Ext.global,i=0,ln=expressions.length;i<ln;i++)if("string"==typeof(expression=expressions[i])&&expression.length>0)for(possibleClassNames=Manager.getNamesByExpression(expression),subLn=possibleClassNames.length,j=0;j<subLn;j++)possibleClassName=possibleClassNames[j],!0!==excluded[possibleClassName]&&(references.push(possibleClassName),Manager.isCreated(possibleClassName)||included[possibleClassName]||(included[possibleClassName]=!0,classNames.push(possibleClassName)));if(!(classNames.length>0))return callback.call(scope),Loader;if(!Loader.config.enabled)throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+(classNames.length>1?"es":"")+": "+classNames.join(", "));for(syncModeEnabled=Loader.syncModeEnabled,syncModeEnabled||queue.push({requires:classNames.slice(),callback:callback,scope:scope}),ln=classNames.length,i=0;i<ln;i++)className=classNames[i],filePath=Loader.getPath(className),syncModeEnabled&&isClassFileLoaded.hasOwnProperty(className)&&(isClassFileLoaded[className]||(Loader.numPendingFiles--,Loader.removeScriptElement(filePath),delete isClassFileLoaded[className])),isClassFileLoaded.hasOwnProperty(className)||(isClassFileLoaded[className]=!1,classNameToFilePathMap[className]=filePath,Loader.numPendingFiles++,Loader.loadScriptFile(filePath,pass(Loader.onFileLoaded,[className,filePath],Loader),pass(Loader.onFileLoadError,[className,filePath],Loader),Loader,syncModeEnabled));return syncModeEnabled&&(callback.call(scope),1===ln)?Manager.get(className):Loader},onFileLoaded:function(className,filePath){var loaded=isClassFileLoaded[className];if(Loader.numLoadedFiles++,isClassFileLoaded[className]=!0,isFileLoaded[filePath]=!0,loaded||Loader.numPendingFiles--,0===Loader.numPendingFiles&&Loader.refreshQueue(),!Loader.syncModeEnabled&&0===Loader.numPendingFiles&&Loader.isLoading&&!Loader.hasFileLoadError){var requires,i,ln,j,subLn,missingClasses=[],missingPaths=[];for(i=0,ln=queue.length;i<ln;i++)for(requires=queue[i].requires,j=0,subLn=requires.length;j<subLn;j++)isClassFileLoaded[requires[j]]&&missingClasses.push(requires[j]);if(missingClasses.length<1)return;if(missingClasses=Ext.Array.filter(Ext.Array.unique(missingClasses),function(item){return!requiresMap.hasOwnProperty(item)},Loader),missingClasses.length<1)return;for(i=0,ln=missingClasses.length;i<ln;i++)missingPaths.push(classNameToFilePathMap[missingClasses[i]]);throw new Error("The following classes are not declared even if their files have been loaded: '"+missingClasses.join("', '")+"'. Please check the source code of their corresponding files for possible typos: '"+missingPaths.join("', '"))}},onFileLoadError:function(className,filePath,errorMessage,isSynchronous){throw Loader.numPendingFiles--,Loader.hasFileLoadError=!0,new Error("[Ext.Loader] "+errorMessage)},addUsedClasses:function(classes){var cls,i,ln;if(classes)for(classes="string"==typeof classes?[classes]:classes,i=0,ln=classes.length;i<ln;i++)"string"!=typeof(cls=classes[i])||Ext.Array.contains(usedClasses,cls)||usedClasses.push(cls);return Loader},triggerReady:function(){var listener,refClasses=usedClasses;if(Loader.isLoading&&(Loader.isLoading=!1,0!==refClasses.length))return refClasses=refClasses.slice(),usedClasses.length=0,Loader.require(refClasses,Loader.triggerReady,Loader),Loader;for(Ext.Array.sort(readyListeners,comparePriority);readyListeners.length&&!Loader.isLoading;)listener=readyListeners.shift(),listener.fn.call(listener.scope);return Loader},onReady:function(fn,scope,withDomReady,options){var oldFn;!1!==withDomReady&&Ext.onDocumentReady&&(oldFn=fn,fn=function(){Ext.onDocumentReady(oldFn,scope,options)}),Loader.isLoading?readyListeners.push({fn:fn,scope:scope,priority:options&&options.priority||0}):fn.call(scope)},historyPush:function(className){return className&&isClassFileLoaded.hasOwnProperty(className)&&!isInHistory[className]&&(isInHistory[className]=!0,history.push(className)),Loader}}),Ext.disableCacheBuster=function(disable,path){var date=new Date;date.setTime(date.getTime()+24*(disable?3650:-1)*60*60*1e3),date=date.toGMTString(),document.cookie="ext-cache=1; expires="+date+"; path="+(path||"/")},isNonBrowser&&(isNodeJS?Ext.apply(Loader,{syncModeEnabled:!0,setPath:flexSetter(function(name,path){return path=require("fs").realpathSync(path),Loader.config.paths[name]=path,Loader}),loadScriptFile:function(filePath,onLoad,onError,scope,synchronous){require(filePath),onLoad.call(scope)}}):isJsdb&&Ext.apply(Loader,{syncModeEnabled:!0,loadScriptFile:function(filePath,onLoad,onError,scope,synchronous){load(filePath),onLoad.call(scope)}})),Ext.require=alias(Loader,"require"),Ext.syncRequire=alias(Loader,"syncRequire"),Ext.exclude=alias(Loader,"exclude"),Ext.onReady=function(fn,scope,options){Loader.onReady(fn,scope,!0,options)},Class.registerPreprocessor("loader",function(cls,data,hooks,continueFn){Ext.classSystemMonitor&&Ext.classSystemMonitor(cls,"Ext.Loader#loaderPreprocessor",arguments);var dependency,i,j,ln,subLn,value,propertyName,propertyValue,requiredMap,me=this,dependencies=[],className=Manager.getName(cls);for(i=0,ln=dependencyProperties.length;i<ln;i++)if(propertyName=dependencyProperties[i],data.hasOwnProperty(propertyName))if("string"==typeof(propertyValue=data[propertyName]))dependencies.push(propertyValue);else if(propertyValue instanceof Array)for(j=0,subLn=propertyValue.length;j<subLn;j++)"string"==typeof(value=propertyValue[j])&&dependencies.push(value);else if("function"!=typeof propertyValue)for(j in propertyValue)propertyValue.hasOwnProperty(j)&&"string"==typeof(value=propertyValue[j])&&dependencies.push(value);if(0!==dependencies.length){var detectDeadlock,deadlockPath=[];if(className){for(requiresMap[className]=dependencies,requiredMap=Loader.requiredByMap||(Loader.requiredByMap={}),i=0,ln=dependencies.length;i<ln;i++)dependency=dependencies[i],(requiredMap[dependency]||(requiredMap[dependency]=[])).push(className);detectDeadlock=function(cls){if(deadlockPath.push(cls),requiresMap[cls]){if(Ext.Array.contains(requiresMap[cls],className))throw new Error("Deadlock detected while loading dependencies! '"+className+"' and '"+deadlockPath[1]+"' mutually require each other. Path: "+deadlockPath.join(" -> ")+" -> "+deadlockPath[0]);for(i=0,ln=requiresMap[cls].length;i<ln;i++)detectDeadlock(requiresMap[cls][i])}},detectDeadlock(className)}return Loader.require(dependencies,function(){for(i=0,ln=dependencyProperties.length;i<ln;i++)if(propertyName=dependencyProperties[i],data.hasOwnProperty(propertyName))if("string"==typeof(propertyValue=data[propertyName]))data[propertyName]=Manager.get(propertyValue);else if(propertyValue instanceof Array)for(j=0,subLn=propertyValue.length;j<subLn;j++)"string"==typeof(value=propertyValue[j])&&(data[propertyName][j]=Manager.get(value));else if("function"!=typeof propertyValue)for(var k in propertyValue)propertyValue.hasOwnProperty(k)&&"string"==typeof(value=propertyValue[k])&&(data[propertyName][k]=Manager.get(value));continueFn.call(me,cls,data,hooks)}),!1}},!0,"after","className"),Manager.registerPostprocessor("uses",function(name,cls,data){Ext.classSystemMonitor&&Ext.classSystemMonitor(cls,"Ext.Loader#usesPostprocessor",arguments);var uses=data.uses;uses&&Loader.addUsedClasses(uses)}),Manager.onCreated(Loader.historyPush)},Ext._classPathMetadata&&(Ext.Loader.addClassPathMappings(Ext._classPathMetadata),Ext._classPathMetadata=null),function(){var scripts=document.getElementsByTagName("script"),currentScript=scripts[scripts.length-1],src=currentScript.src,path=src.substring(0,src.lastIndexOf("/")+1),Loader=Ext.Loader;-1!=src.indexOf("/platform/core/src/class/")?path+="../../../../extjs/":-1!=src.indexOf("/core/src/class/")&&(path+="../../../"),Loader.setConfig({enabled:!0,disableCaching:!/[?&](?:cache|disableCacheBuster)\b/i.test(location.search)&&!/(^|[ ;])ext-cache=1/.test(document.cookie),paths:{Ext:path+"src"}})}(),Ext._endTime=(new Date).getTime(),Ext._beforereadyhandler&&Ext._beforereadyhandler();Ext.Error=Ext.extend(Error,{statics:{ignore:!1,raise:function(err){err=err||{},Ext.isString(err)&&(err={msg:err});var msg,method=this.raise.caller;if(method&&(method.$name&&(err.sourceMethod=method.$name),method.$owner&&(err.sourceClass=method.$owner.$className)),!0!==Ext.Error.handle(err))throw msg=Ext.Error.prototype.toString.call(err),Ext.log({msg:msg,level:"error",dump:err,stack:!0}),new Ext.Error(err)},handle:function(){return Ext.Error.ignore}},name:"Ext.Error",constructor:function(config){Ext.isString(config)&&(config={msg:config});var me=this;Ext.apply(me,config),me.message=me.message||me.msg},toString:function(){var me=this;return(me.sourceClass?me.sourceClass:"")+(me.sourceMethod?"."+me.sourceMethod+"(): ":"")+(me.msg||"(No description provided)")}}),Ext.deprecated=function(suggestion){function fail(){Ext.Error.raise('The method "'+fail.$owner.$className+"."+fail.$name+'" has been removed. '+suggestion)}return suggestion||(suggestion=""),fail},function(){function notify(){var counters=Ext.log.counters,supports=Ext.supports,hasOnError=supports&&supports.WindowOnError;counters&&counters.error+counters.warn+counters.info+counters.log&&(msg=["Logged Errors:",counters.error,"Warnings:",counters.warn,"Info:",counters.info,"Log:",counters.log].join(" "),errors?msg="*** Errors: "+errors+" - "+msg:counters.error&&(msg="*** "+msg),win.status=msg),Ext.isDefined(Ext.Error.notify)||(Ext.Error.notify=Ext.isIE6||Ext.isIE7),Ext.Error.notify&&(hasOnError?errors:counters&&counters.error)&&(Ext.Error.notify=!1,timer&&(win.clearInterval(timer),timer=null),alert("Unhandled error on page: See console or log"),poll())}function poll(){timer=win.setInterval(notify,1e3)}var timer,msg,errors=0,win=Ext.global;"undefined"!=typeof window&&poll()}();Ext.JSON=new function(){var me=this,encodingFunction,decodingFunction,useNative=null,useHasOwn=!!{}.hasOwnProperty,isNative=function(){return null===useNative&&(useNative=Ext.USE_NATIVE_JSON&&window.JSON&&"[object JSON]"==JSON.toString()),useNative},pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o,newline){return null===o||void 0===o?"null":Ext.isDate(o)?Ext.JSON.encodeDate(o):Ext.isString(o)?Ext.JSON.encodeString(o):"number"==typeof o?isFinite(o)?String(o):"null":Ext.isBoolean(o)?String(o):o.toJSON?o.toJSON():Ext.isArray(o)?encodeArray(o,newline):Ext.isObject(o)?encodeObject(o,newline):"function"==typeof o?"null":"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\v":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return"string"==typeof c?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArrayPretty=function(o,newline){var i,len=o.length,cnewline=newline+"   ",sep=","+cnewline,a=["[",cnewline];for(i=0;i<len;i+=1)a.push(Ext.JSON.encodeValue(o[i],cnewline),sep);return a[a.length-1]=newline+"]",a.join("")},encodeObjectPretty=function(o,newline){var i,val,cnewline=newline+"   ",sep=","+cnewline,a=["{",cnewline];for(i in o)if(val=o[i],!useHasOwn||o.hasOwnProperty(i)){if("function"==typeof val||void 0===val)continue;a.push(Ext.JSON.encodeValue(i)+": "+Ext.JSON.encodeValue(val,cnewline),sep)}return a[a.length-1]=newline+"}",a.join("")},encodeArray=function(o,newline){if(newline)return encodeArrayPretty(o,newline);var i,a=["[",""],len=o.length;for(i=0;i<len;i+=1)a.push(Ext.JSON.encodeValue(o[i]),",");return a[a.length-1]="]",a.join("")},encodeObject=function(o,newline){if(newline)return encodeObjectPretty(o,newline);var i,val,a=["{",""];for(i in o)if(val=o[i],!useHasOwn||o.hasOwnProperty(i)){if("function"==typeof val||void 0===val)continue;a.push(Ext.JSON.encodeValue(i),":",Ext.JSON.encodeValue(val),",")}return a[a.length-1]="}",a.join("")};me.encodeString=encodeString,me.encodeValue=doEncode,me.encodeDate=function(o){return'"'+o.getFullYear()+"-"+pad(o.getMonth()+1)+"-"+pad(o.getDate())+"T"+pad(o.getHours())+":"+pad(o.getMinutes())+":"+pad(o.getSeconds())+'"'},me.encode=function(o){return encodingFunction||(encodingFunction=isNative()?JSON.stringify:me.encodeValue),encodingFunction(o)},me.decode=function(json,safe){decodingFunction||(decodingFunction=isNative()?JSON.parse:doDecode);try{return decodingFunction(json)}catch(e){if(!0===safe)return null;Ext.Error.raise({sourceClass:"Ext.JSON",sourceMethod:"decode",msg:"You're trying to decode an invalid JSON String: "+json})}}},Ext.encode=Ext.JSON.encode,Ext.decode=Ext.JSON.decode;Ext.apply(Ext,{userAgent:navigator.userAgent.toLowerCase(),cache:{},idSeed:1e3,windowId:"ext-window",documentId:"ext-document",isReady:!1,enableGarbageCollector:!0,enableListenerCollection:!0,rootHierarchyState:{},addCacheEntry:function(id,el,dom){(dom=dom||el.dom)||Ext.Error.raise("Cannot add an entry to the element cache without the DOM node");var cache=Ext.cache,key=id||el&&el.id||dom.id,entry=cache[key]||(cache[key]={data:{},events:{},dom:dom,skipGarbageCollection:!(!dom.getElementById&&!dom.navigator)});return el&&(el.$cache=entry,entry.el=el),entry},updateCacheEntry:function(cacheItem,dom){return cacheItem.dom=dom,cacheItem.el&&(cacheItem.el.dom=dom),cacheItem},id:function(el,prefix){var me=this,sandboxPrefix="";return el=Ext.getDom(el,!0)||{},el===document?el.id=me.documentId:el===window&&(el.id=me.windowId),el.id||(me.isSandboxed&&(sandboxPrefix=Ext.sandboxName.toLowerCase()+"-"),el.id=sandboxPrefix+(prefix||"ext-gen")+ ++Ext.idSeed),el.id},escapeId:function(){var validIdRe=/^[a-zA-Z_][a-zA-Z0-9_\-]*$/i,escapeRx=/([\W]{1})/g,leadingNumRx=/^(\d)/g,escapeFn=function(match,capture){return"\\"+capture},numEscapeFn=function(match,capture){return"\\00"+capture.charCodeAt(0).toString(16)+" "};return function(id){return validIdRe.test(id)?id:id.replace(escapeRx,escapeFn).replace(leadingNumRx,numEscapeFn)}}(),getBody:function(){var body;return function(){return body||(body=Ext.get(document.body))}}(),getHead:function(){var head;return function(){return head||(head=Ext.get(document.getElementsByTagName("head")[0]))}}(),getDoc:function(){var doc;return function(){return doc||(doc=Ext.get(document))}}(),getOrientation:function(){return window.innerHeight>window.innerWidth?"portrait":"landscape"},destroy:function(){var i,arg,ln=arguments.length;for(i=0;i<ln;i++)(arg=arguments[i])&&(Ext.isArray(arg)?this.destroy.apply(this,arg):arg.isStore?arg.destroyStore():Ext.isFunction(arg.destroy)?arg.destroy():arg.dom&&arg.remove())},callback:function(callback,scope,args,delay){var fn,ret;return Ext.isFunction(callback)?fn=callback:scope&&Ext.isString(callback)&&((fn=scope[callback])||Ext.Error.raise('No method named "'+callback+'"')),fn&&(args=args||[],scope=scope||window,delay?Ext.defer(fn,delay,scope,args):ret=fn.apply(scope,args)),ret},resolveMethod:function(fn,scope){return Ext.isFunction(fn)?fn:(Ext.isObject(scope)&&Ext.isFunction(scope[fn])||Ext.Error.raise('No method named "'+fn+'"'),scope[fn])},htmlEncode:function(value){return Ext.String.htmlEncode(value)},htmlDecode:function(value){return Ext.String.htmlDecode(value)},urlAppend:function(url,s){return Ext.String.urlAppend(url,s)}}),Ext.ns=Ext.namespace,window.undefined=window.undefined,function(){function dumpObject(object){var member,type,value,name,members=[];for(name in object)if(object.hasOwnProperty(name)){if(value=object[name],"function"==(type=typeof value))continue;member="undefined"==type?type:null===value||primitiveRe.test(type)||Ext.isDate(value)?Ext.encode(value):Ext.isArray(value)?"[ ]":Ext.isObject(value)?"{ }":type,members.push(Ext.encode(name)+": "+member)}return members.length?" \nData: {\n  "+members.join(",\n  ")+"\n}":""}function log(message){var options,dump,stack,out,max,con=Ext.global.console,level="log",indent=log.indent||0;log.indent=indent,"string"!=typeof message&&(options=message,message=options.msg||"",level=options.level||level,dump=options.dump,stack=options.stack,options.indent?++log.indent:options.outdent&&(log.indent=indent=Math.max(indent-1,0)),!dump||con&&con.dir||(message+=dumpObject(dump),dump=null)),arguments.length>1&&(message+=Array.prototype.slice.call(arguments,1).join("")),message=indent?Ext.String.repeat(" ",log.indentSize*indent)+message:message,"log"!=level&&(message="["+level.charAt(0).toUpperCase()+"] "+message),con?(con[level]?con[level](message):con.log(message),dump&&con.dir(dump),stack&&con.trace&&(con.firebug&&"error"==level||con.trace())):Ext.isOpera?opera.postError(message):(out=log.out,max=log.max,out.length>=max&&Ext.Array.erase(out,0,out.length-3*Math.floor(max/4)),out.push(message)),++log.count,++log.counters[level]}function logx(level,args){"string"==typeof args[0]&&args.unshift({}),args[0].level=level,log.apply(this,args)}var nullLog,check=function(regex){return regex.test(Ext.userAgent)},isStrict="CSS1Compat"==document.compatMode,version=function(is,regex){var m;return is&&(m=regex.exec(Ext.userAgent))?parseFloat(m[1]):0},docMode=document.documentMode,isOpera=check(/opera/),isOpera10_5=isOpera&&check(/version\/10\.5/),isChrome=check(/\bchrome\b/),isWebKit=check(/webkit/),isSafari=!isChrome&&check(/safari/),isSafari2=isSafari&&check(/applewebkit\/4/),isSafari3=isSafari&&check(/version\/3/),isSafari4=isSafari&&check(/version\/4/),isSafari5_0=isSafari&&check(/version\/5\.0/),isSafari5=isSafari&&check(/version\/5/),isIE=!isOpera&&(check(/msie/)||check(/trident/)),isIE7=isIE&&(check(/msie 7/)&&8!=docMode&&9!=docMode&&10!=docMode||7==docMode),isIE8=isIE&&(check(/msie 8/)&&7!=docMode&&9!=docMode&&10!=docMode||8==docMode),isIE9=isIE&&(check(/msie 9/)&&7!=docMode&&8!=docMode&&10!=docMode||9==docMode),isIE10=isIE&&(check(/msie 10/)&&7!=docMode&&8!=docMode&&9!=docMode||10==docMode),isIE11=isIE&&(check(/trident\/7\.0/)&&7!=docMode&&8!=docMode&&9!=docMode&&10!=docMode||11==docMode),isIE6=isIE&&check(/msie 6/),isGecko=!isWebKit&&!isIE&&check(/gecko/),isGecko3=isGecko&&check(/rv:1\.9/),isGecko4=isGecko&&check(/rv:2\.0/),isGecko5=isGecko&&check(/rv:5\./),isGecko10=isGecko&&check(/rv:10\./),isFF3_0=isGecko3&&check(/rv:1\.9\.0/),isFF3_5=isGecko3&&check(/rv:1\.9\.1/),isFF3_6=isGecko3&&check(/rv:1\.9\.2/),isWindows=check(/windows|win32/),isMac=check(/macintosh|mac os x/),isLinux=check(/linux/),scrollbarSize=null,chromeVersion=version(!0,/\bchrome\/(\d+\.\d+)/),firefoxVersion=version(!0,/\bfirefox\/(\d+\.\d+)/),ieVersion=version(isIE,/msie (\d+\.\d+)/),operaVersion=version(isOpera,/version\/(\d+\.\d+)/),safariVersion=version(isSafari,/version\/(\d+\.\d+)/),webKitVersion=version(isWebKit,/webkit\/(\d+\.\d+)/),isSecure=/^https/i.test(window.location.protocol);try{document.execCommand("BackgroundImageCache",!1,!0)}catch(e){}var primitiveRe=/string|number|boolean/;log.error=function(){logx("error",Array.prototype.slice.call(arguments))},log.info=function(){logx("info",Array.prototype.slice.call(arguments))},log.warn=function(){logx("warn",Array.prototype.slice.call(arguments))},log.count=0,log.counters={error:0,warn:0,info:0,log:0},log.indentSize=2,log.out=[],log.max=750,log.show=function(){window.open("","extlog").document.write(['<html><head><script type="text/javascript">',"var lastCount = 0;","function update () {","var ext = window.opener.Ext,","extlog = ext && ext.log;","if (extlog && extlog.out && lastCount != extlog.count) {","lastCount = extlog.count;",'var s = "<tt>" + extlog.out.join("~~~").replace(/[&]/g, "&amp;").replace(/[<]/g, "&lt;").replace(/[ ]/g, "&#160;").replace(/\\~\\~\\~/g, "<br/>") + "</tt>";',"document.body.innerHTML = s;","}","setTimeout(update, 1000);","}","setTimeout(update, 1000);","<\/script></head><body></body></html>"].join(""))},nullLog=function(){},nullLog.info=nullLog.warn=nullLog.error=Ext.emptyFn,Ext.setVersion("ext","4.2.2.1144"),Ext.setVersion("extjs","4.2.2.1144"),Ext.apply(Ext,{SSL_SECURE_URL:isSecure&&isIE?"javascript:''":"about:blank",plainTableCls:Ext.buildSettings.baseCSSPrefix+"table-plain",plainListCls:Ext.buildSettings.baseCSSPrefix+"list-plain",enableNestedListenerRemoval:!1,USE_NATIVE_JSON:!1,getDom:function(el,strict){if(!el||!document)return null;if(el.dom)return el.dom;if("string"==typeof el){var e=Ext.getElementById(el);return e&&isIE&&strict?el==e.getAttribute("id")?e:null:e}return el},removeNode:isIE6||isIE7||isIE8?function(){var d;return function(n){if(n&&"BODY"!=n.tagName.toUpperCase()){Ext.enableNestedListenerRemoval?Ext.EventManager.purgeElement(n):Ext.EventManager.removeAll(n);var cache=Ext.cache,id=n.id;cache[id]&&(delete cache[id].dom,delete cache[id]),isIE8&&n.parentNode&&n.parentNode.removeChild(n),d=d||document.createElement("div"),d.appendChild(n),d.innerHTML=""}}}():function(n){if(n&&n.parentNode&&"BODY"!=n.tagName.toUpperCase()){Ext.enableNestedListenerRemoval?Ext.EventManager.purgeElement(n):Ext.EventManager.removeAll(n);var cache=Ext.cache,id=n.id;cache[id]&&(delete cache[id].dom,delete cache[id]),n.parentNode.removeChild(n)}},isStrict:isStrict,isIEQuirks:isIE&&!isStrict&&(isIE6||isIE7||isIE8||isIE9),isOpera:isOpera,isOpera10_5:isOpera10_5,isWebKit:isWebKit,isChrome:isChrome,isSafari:isSafari,isSafari3:isSafari3,isSafari4:isSafari4,isSafari5:isSafari5,isSafari5_0:isSafari5_0,isSafari2:isSafari2,isIE:isIE,isIE6:isIE6,isIE7:isIE7,isIE7m:isIE6||isIE7,isIE7p:isIE&&!isIE6,isIE8:isIE8,isIE8m:isIE6||isIE7||isIE8,isIE8p:isIE&&!(isIE6||isIE7),isIE9:isIE9,isIE9m:isIE6||isIE7||isIE8||isIE9,isIE9p:isIE&&!(isIE6||isIE7||isIE8),isIE10:isIE10,isIE10m:isIE6||isIE7||isIE8||isIE9||isIE10,isIE10p:isIE&&!(isIE6||isIE7||isIE8||isIE9),isIE11:isIE11,isIE11m:isIE6||isIE7||isIE8||isIE9||isIE10||isIE11,isIE11p:isIE&&!(isIE6||isIE7||isIE8||isIE9||isIE10),isGecko:isGecko,isGecko3:isGecko3,isGecko4:isGecko4,isGecko5:isGecko5,isGecko10:isGecko10,isFF3_0:isFF3_0,isFF3_5:isFF3_5,isFF3_6:isFF3_6,isFF4:4<=firefoxVersion&&firefoxVersion<5,isFF5:5<=firefoxVersion&&firefoxVersion<6,isFF10:10<=firefoxVersion&&firefoxVersion<11,isLinux:isLinux,isWindows:isWindows,isMac:isMac,chromeVersion:chromeVersion,firefoxVersion:firefoxVersion,ieVersion:ieVersion,operaVersion:operaVersion,safariVersion:safariVersion,webKitVersion:webKitVersion,isSecure:isSecure,BLANK_IMAGE_URL:isIE6||isIE7?"//www.sencha.com/s.gif":"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==",value:function(v,defaultValue,allowBlank){return Ext.isEmpty(v,allowBlank)?defaultValue:v},escapeRe:function(s){return s.replace(/([-.*+?\^${}()|\[\]\/\\])/g,"\\$1")},addBehaviors:function(o){if(Ext.isReady){var parts,b,s,cache={};for(b in o)(parts=b.split("@"))[1]&&(s=parts[0],cache[s]||(cache[s]=Ext.select(s)),cache[s].on(parts[1],o[b]));cache=null}else Ext.onReady(function(){Ext.addBehaviors(o)})},getScrollbarSize:function(force){if(!Ext.isReady)return{};if(force||!scrollbarSize){var db=document.body,div=document.createElement("div");div.style.width=div.style.height="100px",div.style.overflow="scroll",div.style.position="absolute",db.appendChild(div),scrollbarSize={width:div.offsetWidth-div.clientWidth,height:div.offsetHeight-div.clientHeight},db.removeChild(div)}return scrollbarSize},getScrollBarWidth:function(force){return Ext.getScrollbarSize(force).width+2},copyTo:function(dest,source,names,usePrototypeKeys){"string"==typeof names&&(names=names.split(/[,;\s]/));var n,name,nLen=names?names.length:0;for(n=0;n<nLen;n++)name=names[n],(usePrototypeKeys||source.hasOwnProperty(name))&&(dest[name]=source[name]);return dest},destroyMembers:function(o){for(var i=1,a=arguments,len=a.length;i<len;i++)Ext.destroy(o[a[i]]),delete o[a[i]]},log:log||nullLog,partition:function(arr,truth){var a,v,ret=[[],[]],aLen=arr.length;for(a=0;a<aLen;a++)v=arr[a],ret[truth&&truth(v,a,arr)||!truth&&v?0:1].push(v);return ret},invoke:function(arr,methodName){var a,v,ret=[],args=Array.prototype.slice.call(arguments,2),aLen=arr.length;for(a=0;a<aLen;a++)v=arr[a],v&&"function"==typeof v[methodName]?ret.push(v[methodName].apply(v,args)):ret.push(void 0);return ret},zip:function(){var i,j,aLen,parts=Ext.partition(arguments,function(val){return"function"!=typeof val}),arrs=parts[0],fn=parts[1][0],len=Ext.max(Ext.pluck(arrs,"length")),ret=[];for(i=0;i<len;i++)if(ret[i]=[],fn)ret[i]=fn.apply(fn,Ext.pluck(arrs,i));else for(j=0,aLen=arrs.length;j<aLen;j++)ret[i].push(arrs[j][i]);return ret},toSentence:function(items,connector){var head,tail,length=items.length;return length<=1?items[0]:(head=items.slice(0,length-1),tail=items[length-1],Ext.util.Format.format("{0} {1} {2}",head.join(", "),connector||"and",tail))},setGlyphFontFamily:function(fontFamily){Ext._glyphFontFamily=fontFamily},useShims:isIE6})}(),Ext.application=function(config){var App,paths,ns,createApp=function(){Ext.onReady(function(){Ext.app.Application.instance=new App})};if("string"==typeof config)Ext.require(config,function(){App=Ext.ClassManager.get(config),createApp()});else{if(Ext.Loader.setPath(config.name,config.appFolder||"app"),paths=config.paths)for(ns in paths)paths.hasOwnProperty(ns)&&Ext.Loader.setPath(ns,paths[ns]);config["paths processed"]=!0,Ext.define(config.name+".$application",Ext.apply({extend:"Ext.app.Application"},config),function(){App=this,createApp()})}};!function(){Ext.ns("Ext.util");var I18NFormatCleanRe,UtilFormat=Ext.util.Format={},stripTagsRE=/<\/?[^>]+>/gi,stripScriptsRe=/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/gi,nl2brRe=/\r?\n/g,allHashes=/^#+$/,formatPattern=/[\d,\.#]+/,formatCleanRe=/[^\d\.#]/g,formatFns={};Ext.apply(UtilFormat,{thousandSeparator:",",decimalSeparator:".",currencyPrecision:2,currencySign:"$",currencyAtEnd:!1,undef:function(value){return void 0!==value?value:""},defaultValue:function(value,defaultValue){return void 0!==value&&""!==value?value:defaultValue},substr:"b"!="ab".substr(-1)?function(value,start,length){var str=String(value);return start<0?str.substr(Math.max(str.length+start,0),length):str.substr(start,length)}:function(value,start,length){return String(value).substr(start,length)},lowercase:function(value){return String(value).toLowerCase()},uppercase:function(value){return String(value).toUpperCase()},usMoney:function(v){return UtilFormat.currency(v,"$",2)},currency:function(v,currencySign,decimals,end){var negativeSign="",format=",0",i=0;for(v-=0,v<0&&(v=-v,negativeSign="-"),decimals=Ext.isDefined(decimals)?decimals:UtilFormat.currencyPrecision,format+=decimals>0?".":"";i<decimals;i++)format+="0";return v=UtilFormat.number(v,format),!0===(end||UtilFormat.currencyAtEnd)?Ext.String.format("{0}{1}{2}",negativeSign,v,currencySign||UtilFormat.currencySign):Ext.String.format("{0}{1}{2}",negativeSign,currencySign||UtilFormat.currencySign,v)},date:function(v,format){return v?(Ext.isDate(v)||(v=new Date(Date.parse(v))),Ext.Date.dateFormat(v,format||Ext.Date.defaultFormat)):""},dateRenderer:function(format){return function(v){return UtilFormat.date(v,format)}},stripTags:function(v){return v?String(v).replace(stripTagsRE,""):v},stripScripts:function(v){return v?String(v).replace(stripScriptsRe,""):v},fileSize:function(){return function(size){return size<1024?1===size?"1 byte":size+" bytes":size<1048576?Math.round(10*size/1024)/10+" KB":size<1073741824?Math.round(10*size/1048576)/10+" MB":Math.round(10*size/1073741824)/10+" GB"}}(),math:function(){var fns={};return function(v,a){return fns[a]||(fns[a]=Ext.functionFactory("v","return v "+a+";")),fns[a](v)}}(),round:function(value,precision){var result=Number(value);return"number"==typeof precision&&(precision=Math.pow(10,precision),result=Math.round(value*precision)/precision),result},number:function(v,formatString){if(!formatString)return v;var formatFn=formatFns[formatString];if(!formatFn){var hasComma,splitFormat,extraChars,trimTrailingZeroes,code,originalFormatString=formatString,comma=UtilFormat.thousandSeparator,decimalSeparator=UtilFormat.decimalSeparator,precision=0,trimPart="";"/i"==formatString.substr(formatString.length-2)?(I18NFormatCleanRe||(I18NFormatCleanRe=new RegExp("[^\\d\\"+UtilFormat.decimalSeparator+"]","g")),formatString=formatString.substr(0,formatString.length-2),hasComma=-1!=formatString.indexOf(comma),splitFormat=formatString.replace(I18NFormatCleanRe,"").split(decimalSeparator)):(hasComma=-1!=formatString.indexOf(","),splitFormat=formatString.replace(formatCleanRe,"").split(".")),extraChars=formatString.replace(formatPattern,""),splitFormat.length>2?Ext.Error.raise({sourceClass:"Ext.util.Format",sourceMethod:"number",value:v,formatString:formatString,msg:"Invalid number format, should have no more than 1 decimal"}):2===splitFormat.length&&(precision=splitFormat[1].length,(trimTrailingZeroes=allHashes.test(splitFormat[1]))&&(trimPart='trailingZeroes=new RegExp(Ext.String.escapeRegex(utilFormat.decimalSeparator) + "?0+$")')),code=["var utilFormat=Ext.util.Format,extNumber=Ext.Number,neg,absVal,fnum,parts"+(hasComma?",thousandSeparator,thousands=[],j,n,i":"")+(extraChars?',formatString="'+formatString+'",formatPattern=/[\\d,\\.#]+/':"")+',trailingZeroes;return function(v){if(typeof v!=="number"&&isNaN(v=extNumber.from(v,NaN)))return"";neg=v<0;',"absVal=Math.abs(v);","fnum=Ext.Number.toFixed(absVal, "+precision+");",trimPart,";"],hasComma?(precision&&(code[code.length]='parts=fnum.split(".");',code[code.length]="fnum=parts[0];"),code[code.length]="if(absVal>=1000) {",code[code.length]="thousandSeparator=utilFormat.thousandSeparator;thousands.length=0;j=fnum.length;n=fnum.length%3||3;for(i=0;i<j;i+=n){if(i!==0){n=3;}thousands[thousands.length]=fnum.substr(i,n);}fnum=thousands.join(thousandSeparator);}",precision&&(code[code.length]="fnum += utilFormat.decimalSeparator+parts[1];")):precision&&(code[code.length]='if(utilFormat.decimalSeparator!=="."){parts=fnum.split(".");fnum=parts[0]+utilFormat.decimalSeparator+parts[1];}'),trimTrailingZeroes&&(code[code.length]='fnum=fnum.replace(trailingZeroes,"");'),code[code.length]='if(neg&&fnum!=="'+(precision?"0."+Ext.String.repeat("0",precision):"0")+'")fnum="-"+fnum;',code[code.length]="return ",code[code.length]=extraChars?"formatString.replace(formatPattern, fnum);":"fnum;",code[code.length]="};",formatFn=formatFns[originalFormatString]=Ext.functionFactory("Ext",code.join(""))(Ext)}return formatFn(v)},numberRenderer:function(format){return function(v){return UtilFormat.number(v,format)}},attributes:function(attributes){if("object"==typeof attributes){var name,result=[];for(name in attributes)result.push(name,'="',"style"===name?Ext.DomHelper.generateStyles(attributes[name],null,!0):Ext.htmlEncode(attributes[name]),'"');attributes=result.join("")}return attributes||""},plural:function(v,s,p){return v+" "+(1==v?s:p||s+"s")},nl2br:function(v){return Ext.isEmpty(v)?"":v.replace(nl2brRe,"<br/>")},capitalize:Ext.String.capitalize,ellipsis:Ext.String.ellipsis,format:Ext.String.format,htmlDecode:Ext.String.htmlDecode,htmlEncode:Ext.String.htmlEncode,leftPad:Ext.String.leftPad,trim:Ext.String.trim,parseBox:function(box){if("number"==typeof(box=box||0))return{top:box,right:box,bottom:box,left:box};var parts=box.split(" "),ln=parts.length;return 1==ln?parts[1]=parts[2]=parts[3]=parts[0]:2==ln?(parts[2]=parts[0],parts[3]=parts[1]):3==ln&&(parts[3]=parts[1]),{top:parseInt(parts[0],10)||0,right:parseInt(parts[1],10)||0,bottom:parseInt(parts[2],10)||0,left:parseInt(parts[3],10)||0}},escapeRegex:function(s){return s.replace(/([\-.*+?\^${}()|\[\]\/\\])/g,"\\$1")}})}();Ext.define("Ext.util.TaskRunner",{interval:10,timerId:null,constructor:function(interval){var me=this;"number"==typeof interval?me.interval=interval:interval&&Ext.apply(me,interval),me.tasks=[],me.timerFn=Ext.Function.bind(me.onTick,me)},newTask:function(config){var task=new Ext.util.TaskRunner.Task(config);return task.manager=this,task},start:function(task){var me=this,now=Ext.Date.now();return task.pending||(me.tasks.push(task),task.pending=!0),task.stopped=!1,task.taskStartTime=now,task.taskRunTime=!1!==task.fireOnStart?0:task.taskStartTime,task.taskRunCount=0,me.firing||(!1!==task.fireOnStart?me.startTimer(0,now):me.startTimer(task.interval,now)),task},stop:function(task){return task.stopped||(task.stopped=!0,task.onStop&&task.onStop.call(task.scope||task,task)),task},stopAll:function(){Ext.each(this.tasks,this.stop,this)},firing:!1,nextExpires:1e99,onTick:function(){var expires,newTasks,i,task,rt,remove,me=this,tasks=me.tasks,now=Ext.Date.now(),nextExpires=1e99,len=tasks.length;for(me.timerId=null,me.firing=!0,i=0;i<len||i<(len=tasks.length);++i){if(task=tasks[i],!(remove=task.stopped)){if((expires=task.taskRunTime+task.interval)<=now){rt=1;try{rt=task.run.apply(task.scope||task,task.args||[++task.taskRunCount])}catch(taskError){try{Ext.log({msg:taskError,level:"error"}),task.onError&&(rt=task.onError.call(task.scope||task,task,taskError))}catch(ignore){}}task.taskRunTime=now,!1===rt||task.taskRunCount===task.repeat?(me.stop(task),remove=!0):(remove=task.stopped,expires=now+task.interval)}!remove&&task.duration&&task.duration<=now-task.taskStartTime&&(me.stop(task),remove=!0)}remove?(task.pending=!1,newTasks||(newTasks=tasks.slice(0,i))):(newTasks&&newTasks.push(task),nextExpires>expires&&(nextExpires=expires))}newTasks&&(me.tasks=newTasks),me.firing=!1,me.tasks.length&&me.startTimer(nextExpires-now,Ext.Date.now()),!1!==me.fireIdleEvent&&Ext.EventManager.idleEvent.fire()},startTimer:function(timeout,now){var me=this,expires=now+timeout,timerId=me.timerId;timerId&&me.nextExpires-expires>me.interval&&(clearTimeout(timerId),timerId=null),timerId||(timeout<me.interval&&(timeout=me.interval),me.timerId=setTimeout(me.timerFn,timeout),me.nextExpires=expires)}},function(){var me=this,proto=me.prototype;proto.destroy=proto.stopAll,Ext.util.TaskManager=Ext.TaskManager=new me,me.Task=new Ext.Class({isTask:!0,stopped:!0,fireOnStart:!1,constructor:function(config){Ext.apply(this,config)},restart:function(interval){void 0!==interval&&(this.interval=interval),this.manager.start(this)},start:function(interval){this.stopped&&this.restart(interval)},stop:function(){this.manager.stop(this)}}),proto=me.Task.prototype,proto.destroy=proto.stop});Ext.define("Ext.util.TaskManager",{extend:"Ext.util.TaskRunner",alternateClassName:["Ext.TaskManager"],singleton:!0});Ext.define("Ext.perf.Accumulator",function(){function adjustSet(set,time){set.sum+=time,set.min=Math.min(set.min,time),set.max=Math.max(set.max,time)}function leaveFrame(time){var totalTime=time||getTimestamp()-this.time,me=this,accum=me.accum;++accum.count,--accum.depth||adjustSet(accum.total,totalTime),adjustSet(accum.pure,totalTime-me.childTime),(currentFrame=me.parent)&&(++currentFrame.accum.childCount,currentFrame.childTime+=totalTime)}function makeSet(){return{min:Number.MAX_VALUE,max:0,sum:0}}function makeTap(me,fn){return function(){var frame=me.enter(),ret=fn.apply(this,arguments);return frame.leave(),ret}}function setToJSON(count,childCount,calibration,set){var data={avg:0,min:set.min,max:set.max,sum:0};return count&&(calibration=calibration||0,data.sum=set.sum-childCount*calibration,data.avg=data.sum/count),data}var formatTpl,currentFrame=null,khrome=Ext.global.chrome,getTimestamp=function(){getTimestamp=function(){return(new Date).getTime()};var interval,toolbox;if(Ext.isChrome&&khrome&&khrome.Interval)interval=new khrome.Interval,interval.start(),getTimestamp=function(){return interval.microseconds()/1e3};else if(window.ActiveXObject)try{toolbox=new ActiveXObject("SenchaToolbox.Toolbox"),Ext.senchaToolbox=toolbox,getTimestamp=function(){return toolbox.milliseconds}}catch(e){}else Date.now&&(getTimestamp=Date.now);return Ext.perf.getTimestamp=Ext.perf.Accumulator.getTimestamp=getTimestamp,getTimestamp()};return{constructor:function(name){var me=this;me.count=me.childCount=me.depth=me.maxDepth=0,me.pure=makeSet(),me.total=makeSet(),me.name=name},statics:{getTimestamp:getTimestamp},format:function(calibration){formatTpl||(formatTpl=new Ext.XTemplate(["{name} - {count} call(s)",'<tpl if="count">','<tpl if="childCount">'," ({childCount} children)","</tpl>",'<tpl if="depth - 1">'," ({depth} deep)","</tpl>",'<tpl for="times">',", {type}: {[this.time(values.sum)]} msec (","avg={[this.time(values.sum / parent.count)]}",")","</tpl>","</tpl>"].join(""),{time:function(t){return Math.round(100*t)/100}}));var data=this.getData(calibration);return data.name=this.name,data.pure.type="Pure",data.total.type="Total",data.times=[data.pure,data.total],formatTpl.apply(data)},getData:function(calibration){var me=this;return{count:me.count,childCount:me.childCount,depth:me.maxDepth,pure:setToJSON(me.count,me.childCount,calibration,me.pure),total:setToJSON(me.count,me.childCount,calibration,me.total)}},enter:function(){var me=this,frame={accum:me,leave:leaveFrame,childTime:0,parent:currentFrame};return++me.depth,me.maxDepth<me.depth&&(me.maxDepth=me.depth),currentFrame=frame,frame.time=getTimestamp(),frame},monitor:function(fn,scope,args){var frame=this.enter();args?fn.apply(scope,args):fn.call(scope),frame.leave()},report:function(){Ext.log(this.format())},tap:function(className,methodName){var klass,statik,i,parts,length,name,src,tapFunc,me=this,methods="string"==typeof methodName?[methodName]:methodName;return tapFunc=function(){if("string"==typeof className)for(klass=Ext.global,parts=className.split("."),i=0,length=parts.length;i<length;++i)klass=klass[parts[i]];else klass=className;for(i=0,length=methods.length;i<length;++i)name=methods[i],statik="!"==name.charAt(0),statik?name=name.substring(1):statik=!(name in klass.prototype),src=statik?klass:klass.prototype,src[name]=makeTap(me,src[name])},Ext.ClassManager.onCreated(tapFunc,me,className),me}}}(),function(){Ext.perf.getTimestamp=this.getTimestamp});Ext.define("Ext.perf.Monitor",{singleton:!0,alternateClassName:"Ext.Perf",requires:["Ext.perf.Accumulator"],constructor:function(){this.accumulators=[],this.accumulatorsByName={}},calibrate:function(){var frame,startTime,accum=new Ext.perf.Accumulator("$"),total=accum.total,getTimestamp=Ext.perf.Accumulator.getTimestamp,count=0;startTime=getTimestamp();do{frame=accum.enter(),frame.leave(),++count}while(total.sum<100);return(getTimestamp()-startTime)/count},get:function(name){var me=this,accum=me.accumulatorsByName[name];return accum||(me.accumulatorsByName[name]=accum=new Ext.perf.Accumulator(name),me.accumulators.push(accum)),accum},enter:function(name){return this.get(name).enter()},monitor:function(name,fn,scope){this.get(name).monitor(fn,scope)},report:function(){var me=this,accumulators=me.accumulators,calibration=me.calibrate();accumulators.sort(function(a,b){return a.name<b.name?-1:b.name<a.name?1:0}),me.updateGC(),Ext.log("Calibration: "+Math.round(100*calibration)/100+" msec/sample"),Ext.each(accumulators,function(accum){Ext.log(accum.format(calibration))})},getData:function(all){var ret={},accumulators=this.accumulators;return Ext.each(accumulators,function(accum){(all||accum.count)&&(ret[accum.name]=accum.getData())}),ret},reset:function(){Ext.each(this.accumulators,function(accum){var me=accum;me.count=me.childCount=me.depth=me.maxDepth=0,me.pure={min:Number.MAX_VALUE,max:0,sum:0},me.total={min:Number.MAX_VALUE,max:0,sum:0}})},updateGC:function(){var bucket,accumGC=this.accumulatorsByName.GC,toolbox=Ext.senchaToolbox;accumGC&&(accumGC.count=toolbox.garbageCollectionCounter||0,accumGC.count&&(bucket=accumGC.pure,accumGC.total.sum=bucket.sum=toolbox.garbageCollectionMilliseconds,bucket.min=bucket.max=bucket.sum/accumGC.count,bucket=accumGC.total,bucket.min=bucket.max=bucket.sum/accumGC.count))},watchGC:function(){Ext.perf.getTimestamp();var toolbox=Ext.senchaToolbox;toolbox&&(this.get("GC"),toolbox.watchGarbageCollector(!1))},setup:function(config){config||(config={render:{"Ext.AbstractComponent":"render"},layout:{"Ext.layout.Context":"run"}}),this.currentConfig=config;var key,prop,accum,className,methods;for(key in config)if(config.hasOwnProperty(key)){prop=config[key],accum=Ext.Perf.get(key);for(className in prop)prop.hasOwnProperty(className)&&(methods=prop[className],accum.tap(className,methods))}this.watchGC()}});Ext.is={init:function(navigator){var i,platform,platforms=this.platforms,ln=platforms.length;for(navigator=navigator||window.navigator,i=0;i<ln;i++)platform=platforms[i],this[platform.identity]=platform.regex.test(navigator[platform.property]);this.Desktop=this.Mac||this.Windows||this.Linux&&!this.Android,this.Tablet=this.iPad,this.Phone=!this.Desktop&&!this.Tablet,this.iOS=this.iPhone||this.iPad||this.iPod,this.Standalone=!!window.navigator.standalone},platforms:[{property:"platform",regex:/iPhone/i,identity:"iPhone"},{property:"platform",regex:/iPod/i,identity:"iPod"},{property:"userAgent",regex:/iPad/i,identity:"iPad"},{property:"userAgent",regex:/Blackberry/i,identity:"Blackberry"},{property:"userAgent",regex:/Android/i,identity:"Android"},{property:"platform",regex:/Mac/i,identity:"Mac"},{property:"platform",regex:/Win/i,identity:"Windows"},{property:"platform",regex:/Linux/i,identity:"Linux"}]},Ext.is.init(),function(){function getBrowserKey(){var browser=Ext.isIE6?"IE6":Ext.isIE7?"IE7":Ext.isIE8?"IE8":Ext.isIE9?"IE9":Ext.isIE10?"IE10":"";return browser?browser+(Ext.isStrict?"-strict":"-quirks"):""}var getStyle=function(element,styleName){var view=element.ownerDocument.defaultView;return((view?view.getComputedStyle(element,null):element.currentStyle)||element.style)[styleName]},supportsVectors={"IE6-quirks":[0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0],"IE6-strict":[0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,1,0,0,1,0,1,0,0,0],"IE7-quirks":[0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0],"IE7-strict":[0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,1,0,0,1,0,1,0,0,0],"IE8-quirks":[0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0],"IE8-strict":[0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,0,0,1,0,1,0,0,1],"IE9-quirks":[0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0],"IE9-strict":[0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,0,0,0,1],"IE10-quirks":[1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,1],"IE10-strict":[1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,1]};Ext.supports={init:function(){var test,vector,value,me=this,doc=document,toRun=me.toRun||me.tests,n=toRun.length,div=n&&Ext.isReady&&doc.createElement("div"),notRun=[],browserKey=getBrowserKey();for(div&&(div.innerHTML=['<div style="height:30px;width:50px;">','<div style="height:20px;width:20px;"></div>',"</div>",'<div style="width: 200px; height: 200px; position: relative; padding: 5px;">','<div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"></div>',"</div>",'<div style="position: absolute; left: 10%; top: 10%;"></div>','<div style="float:left; background-color:transparent;"></div>'].join(""),doc.body.appendChild(div)),vector=supportsVectors[browserKey];n--;)test=toRun[n],value=vector&&vector[n],void 0!==value?me[test.identity]=value:div||test.early?me[test.identity]=test.fn.call(me,doc,div):notRun.push(test);div&&doc.body.removeChild(div),me.toRun=notRun},generateVector:function(){for(var test,tests=this.tests,vector=[],i=0,ln=tests.length;i<ln;i++)test=tests[i],vector.push(this[test.identity]?1:0);return vector},PointerEvents:"pointerEvents"in document.documentElement.style,LocalStorage:function(){try{return"localStorage"in window&&null!==window.localStorage}catch(e){return!1}}(),CSS3BoxShadow:"boxShadow"in document.documentElement.style||"WebkitBoxShadow"in document.documentElement.style||"MozBoxShadow"in document.documentElement.style,ClassList:!!document.documentElement.classList,OrientationChange:void 0!==window.orientation&&"onorientationchange"in window,DeviceMotion:"ondevicemotion"in window,Touch:"ontouchstart"in window&&!Ext.is.Desktop,TimeoutActualLateness:function(){setTimeout(function(){Ext.supports.TimeoutActualLateness=0!==arguments.length},0)}(),tests:[{identity:"Transitions",fn:function(doc,div){for(var prefix=["webkit","Moz","o","ms","khtml"],TE="TransitionEnd",transitionEndName=[prefix[0]+TE,"transitionend",prefix[2]+TE,prefix[3]+TE,prefix[4]+TE],ln=prefix.length,i=0,out=!1;i<ln;i++)if(getStyle(div,prefix[i]+"TransitionProperty")){Ext.supports.CSS3Prefix=prefix[i],Ext.supports.CSS3TransitionEnd=transitionEndName[i],out=!0;break}return out}},{identity:"RightMargin",fn:function(doc,div){var view=doc.defaultView;return!(view&&"0px"!=view.getComputedStyle(div.firstChild.firstChild,null).marginRight)}},{identity:"DisplayChangeInputSelectionBug",early:!0,fn:function(){var webKitVersion=Ext.webKitVersion;return 0<webKitVersion&&webKitVersion<533}},{identity:"DisplayChangeTextAreaSelectionBug",early:!0,fn:function(){var webKitVersion=Ext.webKitVersion;return 0<webKitVersion&&webKitVersion<534.24}},{identity:"TransparentColor",fn:function(doc,div,view){return!((view=doc.defaultView)&&"transparent"!=view.getComputedStyle(div.lastChild,null).backgroundColor)}},{identity:"ComputedStyle",fn:function(doc,div,view){return(view=doc.defaultView)&&view.getComputedStyle}},{identity:"Svg",fn:function(doc){return!!doc.createElementNS&&!!doc.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect}},{identity:"Canvas",fn:function(doc){return!!doc.createElement("canvas").getContext}},{identity:"Vml",fn:function(doc){var d=doc.createElement("div");return d.innerHTML="\x3c!--[if vml]><br/><br/><![endif]--\x3e",2==d.childNodes.length}},{identity:"Float",fn:function(doc,div){return!!div.lastChild.style.cssFloat}},{identity:"AudioTag",fn:function(doc){return!!doc.createElement("audio").canPlayType}},{identity:"History",fn:function(){var history=window.history;return!(!history||!history.pushState)}},{identity:"CSS3DTransform",fn:function(){return"undefined"!=typeof WebKitCSSMatrix&&(new WebKitCSSMatrix).hasOwnProperty("m41")}},{identity:"CSS3LinearGradient",fn:function(doc,div){var property="background-image:",w3c="linear-gradient(left top, black, white)",options=[property+"-webkit-gradient(linear, left top, right bottom, from(black), to(white))",property+w3c,property+"-moz-linear-gradient(left top, black, white)",property+"-ms-linear-gradient(left top, black, white)",property+"-o-linear-gradient(left top, black, white)"];return div.style.cssText=options.join(";"),-1!==(""+div.style.backgroundImage).indexOf("gradient")&&!Ext.isIE9}},{identity:"CSS3BorderRadius",fn:function(doc,div){var i,domPrefixes=["borderRadius","BorderRadius","MozBorderRadius","WebkitBorderRadius","OBorderRadius","KhtmlBorderRadius"];for(i=0;i<domPrefixes.length;i++)if(void 0!==document.body.style[domPrefixes[i]])return!0;return!1}},{identity:"GeoLocation",fn:function(){return"undefined"!=typeof navigator&&"geolocation"in navigator||"undefined"!=typeof google&&void 0!==google.gears}},{identity:"MouseEnterLeave",fn:function(doc,div){return"onmouseenter"in div&&"onmouseleave"in div}},{identity:"MouseWheel",fn:function(doc,div){return"onmousewheel"in div}},{identity:"Opacity",fn:function(doc,div){return!(Ext.isIE6||Ext.isIE7||Ext.isIE8)&&(div.firstChild.style.cssText="opacity:0.73","0.73"==div.firstChild.style.opacity)}},{identity:"Placeholder",fn:function(doc){return"placeholder"in doc.createElement("input")}},{identity:"Direct2DBug",fn:function(){return Ext.isString(document.body.style.msTransformOrigin)&&Ext.isIE10m}},{identity:"BoundingClientRect",fn:function(doc,div){return Ext.isFunction(div.getBoundingClientRect)}},{identity:"RotatedBoundingClientRect",fn:function(){var body=document.body,supports=!1,el=document.createElement("div"),style=el.style;return el.getBoundingClientRect&&(style.WebkitTransform=style.MozTransform=style.OTransform=style.transform="rotate(90deg)",style.width="100px",style.height="30px",body.appendChild(el),supports=100!==el.getBoundingClientRect().height,body.removeChild(el)),supports}},{identity:"IncludePaddingInWidthCalculation",fn:function(doc,div){return 210==div.childNodes[1].firstChild.offsetWidth}},{identity:"IncludePaddingInHeightCalculation",fn:function(doc,div){return 210==div.childNodes[1].firstChild.offsetHeight}},{identity:"ArraySort",fn:function(){var a=[1,2,3,4,5].sort(function(){return 0});return 1===a[0]&&2===a[1]&&3===a[2]&&4===a[3]&&5===a[4]}},{identity:"Range",fn:function(){return!!document.createRange}},{identity:"CreateContextualFragment",fn:function(){var range=!!Ext.supports.Range&&document.createRange();return range&&!!range.createContextualFragment}},{identity:"WindowOnError",fn:function(){return Ext.isIE||Ext.isGecko||Ext.webKitVersion>=534.16}},{identity:"TextAreaMaxLength",fn:function(){return"maxlength"in document.createElement("textarea")}},{identity:"GetPositionPercentage",fn:function(doc,div){return"10%"==getStyle(div.childNodes[2],"left")}},{identity:"PercentageHeightOverflowBug",fn:function(doc){var style,el,hasBug=!1;return Ext.getScrollbarSize().height&&(el=doc.createElement("div"),style=el.style,style.height="50px",style.width="50px",style.overflow="auto",style.position="absolute",el.innerHTML=['<div style="display:table;height:100%;">','<div style="width:51px;"></div>',"</div>"].join(""),doc.body.appendChild(el),50===el.firstChild.offsetHeight&&(hasBug=!0),doc.body.removeChild(el)),hasBug}},{identity:"xOriginBug",fn:function(doc,div){div.innerHTML='<div id="b1" style="height:100px;width:100px;direction:rtl;position:relative;overflow:scroll"><div id="b2" style="position:relative;width:100%;height:20px;"></div><div id="b3" style="position:absolute;width:20px;height:20px;top:0px;right:0px"></div></div>';var outerBox=document.getElementById("b1").getBoundingClientRect(),b2=document.getElementById("b2").getBoundingClientRect(),b3=document.getElementById("b3").getBoundingClientRect();return b2.left!==outerBox.left&&b3.right!==outerBox.right}},{identity:"ScrollWidthInlinePaddingBug",fn:function(doc){var style,el,hasBug=!1;return el=doc.createElement("div"),style=el.style,style.height="50px",style.width="50px",style.padding="10px",style.overflow="hidden",style.position="absolute",el.innerHTML='<span style="display:inline-block;zoom:1;height:60px;width:60px;"></span>',doc.body.appendChild(el),70===el.scrollWidth&&(hasBug=!0),doc.body.removeChild(el),hasBug}}]}}(),Ext.supports.init();Ext.util.DelayedTask=function(fn,scope,args,cancelOnDelay){var delay,me=this,call=function(){clearInterval(me.id),me.id=null,fn.apply(scope,args||[]),Ext.EventManager.idleEvent.fire()};cancelOnDelay="boolean"!=typeof cancelOnDelay||cancelOnDelay,me.id=null,me.delay=function(newDelay,newFn,newScope,newArgs){cancelOnDelay&&me.cancel(),"number"==typeof newDelay&&(delay=newDelay),fn=newFn||fn,scope=newScope||scope,args=newArgs||args,me.id||(me.id=setInterval(call,delay))},me.cancel=function(){me.id&&(clearInterval(me.id),me.id=null)}};Ext.define("Ext.util.Event",function(){var arraySlice=Array.prototype.slice,arrayInsert=Ext.Array.insert,toArray=Ext.Array.toArray,DelayedTask=Ext.util.DelayedTask;return{requires:"Ext.util.DelayedTask",isEvent:!0,suspended:0,noOptions:{},constructor:function(observable,name){this.name=name,this.observable=observable,this.listeners=[]},addListener:function(fn,scope,options){var listeners,listener,priority,isNegativePriority,highestNegativePriorityIndex,hasNegativePriorityIndex,length,index,i,me=this;if(scope=scope||me.observable,fn||Ext.Error.raise({sourceClass:Ext.getClassName(this.observable),sourceMethod:"addListener",msg:"The specified callback function is undefined"}),!me.isListening(fn,scope)){if(listener=me.createListener(fn,scope,options),me.firing&&(me.listeners=me.listeners.slice(0)),listeners=me.listeners,index=length=listeners.length,priority=options&&options.priority,highestNegativePriorityIndex=me._highestNegativePriorityIndex,hasNegativePriorityIndex=void 0!==highestNegativePriorityIndex,priority)if(!(isNegativePriority=priority<0)||hasNegativePriorityIndex){for(i=isNegativePriority?highestNegativePriorityIndex:0;i<length;i++)if((listeners[i].o?listeners[i].o.priority||0:0)<priority){index=i;break}}else me._highestNegativePriorityIndex=index;else hasNegativePriorityIndex&&(index=highestNegativePriorityIndex);!isNegativePriority&&index<=highestNegativePriorityIndex&&me._highestNegativePriorityIndex++,index===length?me.listeners[length]=listener:arrayInsert(me.listeners,index,[listener])}},createListener:function(fn,scope,o){scope=scope||this.observable;var me=this,listener={fn:fn,scope:scope,ev:me},handler=fn;return o&&(listener.o=o,o.single&&(handler=me.createSingle(handler,listener,o,scope)),o.target&&(handler=me.createTargeted(handler,listener,o,scope)),o.delay&&(handler=me.createDelayed(handler,listener,o,scope)),o.buffer&&(handler=me.createBuffered(handler,listener,o,scope))),listener.fireFn=handler,listener},findListener:function(fn,scope){for(var listener,s,listeners=this.listeners,i=listeners.length;i--;)if((listener=listeners[i])&&(s=listener.scope,listener.fn==fn&&s==(scope||this.observable)))return i;return-1},isListening:function(fn,scope){return-1!==this.findListener(fn,scope)},removeListener:function(fn,scope){var index,listener,highestNegativePriorityIndex,k,me=this;if(-1!=(index=me.findListener(fn,scope))){if(listener=me.listeners[index],highestNegativePriorityIndex=me._highestNegativePriorityIndex,me.firing&&(me.listeners=me.listeners.slice(0)),listener.task&&(listener.task.cancel(),delete listener.task),k=listener.tasks&&listener.tasks.length){for(;k--;)listener.tasks[k].cancel();delete listener.tasks}return me.listeners.splice(index,1),highestNegativePriorityIndex&&(index<highestNegativePriorityIndex?me._highestNegativePriorityIndex--:index===highestNegativePriorityIndex&&index===me.listeners.length&&delete me._highestNegativePriorityIndex),!0}return!1},clearListeners:function(){for(var listeners=this.listeners,i=listeners.length;i--;)this.removeListener(listeners[i].fn,listeners[i].scope)},suspend:function(){this.suspended+=1},resume:function(){this.suspended&&this.suspended--},fire:function(){var i,args,listener,len,me=this,listeners=me.listeners,count=listeners.length;if(!me.suspended&&count>0)for(me.firing=!0,args=arguments.length?arraySlice.call(arguments,0):[],len=args.length,i=0;i<count;i++)if(listener=listeners[i],listener.o&&(args[len]=listener.o),listener&&!1===listener.fireFn.apply(listener.scope||me.observable,args))return me.firing=!1;return me.firing=!1,!0},createTargeted:function(handler,listener,o,scope){return function(){o.target===arguments[0]&&handler.apply(scope,arguments)}},createBuffered:function(handler,listener,o,scope){return listener.task=new DelayedTask,function(){listener.task.delay(o.buffer,handler,scope,toArray(arguments))}},createDelayed:function(handler,listener,o,scope){return function(){var task=new DelayedTask;listener.tasks||(listener.tasks=[]),listener.tasks.push(task),task.delay(o.delay||10,handler,scope,toArray(arguments))}},createSingle:function(handler,listener,o,scope){return function(){var event=listener.ev;return event.removeListener(listener.fn,scope)&&event.observable&&event.observable.hasListeners[event.name]--,handler.apply(scope,arguments)}}}});Ext.EventManager=new function(){var readyEvent,EventManager=this,doc=document,win=window,escapeRx=/\\/g,prefix=Ext.baseCSSPrefix,supportsAddEventListener=!Ext.isIE9&&"addEventListener"in doc,initExtCss=function(){function add(c){cls.push(prefix+c)}var html,bd=doc.body||doc.getElementsByTagName("body")[0],cls=[],htmlCls=[],supportsLG=Ext.supports.CSS3LinearGradient,supportsBR=Ext.supports.CSS3BorderRadius;return Ext.scopeCss||cls.push(prefix+"body"),!!bd&&(html=bd.parentNode,Ext.isIE&&Ext.isIE9m&&(add("ie"),Ext.isIE6?add("ie6"):(add("ie7p"),Ext.isIE7?add("ie7"):(add("ie8p"),Ext.isIE8?add("ie8"):(add("ie9p"),Ext.isIE9&&add("ie9")))),Ext.isIE7m&&add("ie7m"),Ext.isIE8m&&add("ie8m"),Ext.isIE9m&&add("ie9m"),(Ext.isIE7||Ext.isIE8)&&add("ie78")),Ext.isIE10&&add("ie10"),Ext.isGecko&&(add("gecko"),Ext.isGecko3&&add("gecko3"),Ext.isGecko4&&add("gecko4"),Ext.isGecko5&&add("gecko5")),Ext.isOpera&&add("opera"),Ext.isWebKit&&add("webkit"),Ext.isSafari&&(add("safari"),Ext.isSafari2&&add("safari2"),Ext.isSafari3&&add("safari3"),Ext.isSafari4&&add("safari4"),Ext.isSafari5&&add("safari5"),Ext.isSafari5_0&&add("safari5_0")),Ext.isChrome&&add("chrome"),Ext.isMac&&add("mac"),Ext.isLinux&&add("linux"),supportsBR||add("nbr"),supportsLG||add("nlg"),html&&(Ext.isStrict&&(Ext.isIE6||Ext.isIE7)?Ext.isBorderBox=!1:Ext.isBorderBox=!0,Ext.isBorderBox||htmlCls.push(prefix+"content-box"),Ext.isStrict?htmlCls.push(prefix+"strict"):htmlCls.push(prefix+"quirks"),Ext.fly(html,"_internal").addCls(htmlCls)),Ext.fly(bd,"_internal").addCls(cls),!0)};Ext.apply(EventManager,{hasBoundOnReady:!1,hasFiredReady:!1,deferReadyEvent:1,onReadyChain:[],readyEvent:function(){return readyEvent=new Ext.util.Event,readyEvent.fire=function(){Ext._beforeReadyTime=Ext._beforeReadyTime||(new Date).getTime(),readyEvent.self.prototype.fire.apply(readyEvent,arguments),Ext._afterReadytime=(new Date).getTime()},readyEvent}(),idleEvent:new Ext.util.Event,isReadyPaused:function(){return/[?&]ext-pauseReadyFire\b/i.test(location.search)&&!Ext._continueFireReady},bindReadyEvent:function(){EventManager.hasBoundOnReady||("complete"==doc.readyState?EventManager.onReadyEvent({type:doc.readyState||"body"}):(doc.addEventListener("DOMContentLoaded",EventManager.onReadyEvent,!1),win.addEventListener("load",EventManager.onReadyEvent,!1),EventManager.hasBoundOnReady=!0))},onReadyEvent:function(e){e&&e.type&&EventManager.onReadyChain.push(e.type),EventManager.hasBoundOnReady&&(doc.removeEventListener("DOMContentLoaded",EventManager.onReadyEvent,!1),win.removeEventListener("load",EventManager.onReadyEvent,!1)),Ext.isReady||EventManager.fireDocReady()},fireDocReady:function(){Ext.isReady||(Ext._readyTime=(new Date).getTime(),Ext.isReady=!0,Ext.supports.init(),EventManager.onWindowUnload(),readyEvent.onReadyChain=EventManager.onReadyChain,Ext.isNumber(EventManager.deferReadyEvent)?(Ext.Function.defer(EventManager.fireReadyEvent,EventManager.deferReadyEvent),EventManager.hasDocReadyTimer=!0):EventManager.fireReadyEvent())},fireReadyEvent:function(){for(EventManager.hasDocReadyTimer=!1,EventManager.isFiring=!0;readyEvent.listeners.length&&!EventManager.isReadyPaused();)readyEvent.fire();EventManager.isFiring=!1,EventManager.hasFiredReady=!0,Ext.EventManager.idleEvent.fire()},onDocumentReady:function(fn,scope,options){options=options||{},options.single=!0,readyEvent.addListener(fn,scope,options),EventManager.isFiring||EventManager.hasDocReadyTimer||(Ext.isReady?EventManager.fireReadyEvent():EventManager.bindReadyEvent())},stoppedMouseDownEvent:new Ext.util.Event,propRe:/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate|freezeEvent)$/,getId:function(element){var id;return element=Ext.getDom(element),id=element===doc||element===win?element===doc?Ext.documentId:Ext.windowId:Ext.id(element),Ext.cache[id]||Ext.addCacheEntry(id,null,element),id},prepareListenerConfig:function(element,config,isRemove){var key,value,args,propRe=EventManager.propRe;for(key in config)config.hasOwnProperty(key)&&(propRe.test(key)||(value=config[key],args="function"==typeof value?[element,key,value,config.scope,config]:[element,key,value.fn,value.scope,value],isRemove?EventManager.removeListener.apply(EventManager,args):EventManager.addListener.apply(EventManager,args)))},mouseEnterLeaveRe:/mouseenter|mouseleave/,normalizeEvent:function(eventName,fn){return EventManager.mouseEnterLeaveRe.test(eventName)&&!Ext.supports.MouseEnterLeave?(fn&&(fn=Ext.Function.createInterceptor(fn,EventManager.contains)),eventName="mouseenter"==eventName?"mouseover":"mouseout"):"mousewheel"!=eventName||Ext.supports.MouseWheel||Ext.isOpera||(eventName="DOMMouseScroll"),{eventName:eventName,fn:fn}},contains:function(event){event=event.browserEvent||event;var parent=event.currentTarget,child=EventManager.getRelatedTarget(event);if(parent&&parent.firstChild)for(;child;){if(child===parent)return!1;child=child.parentNode,child&&1!=child.nodeType&&(child=null)}return!0},addListener:function(element,eventName,fn,scope,options){if("string"!=typeof eventName)return void EventManager.prepareListenerConfig(element,eventName);var hasAddEventListener,bind,wrap,cache,id,cacheItem,capture,dom=element.dom||Ext.getDom(element);"string"==typeof fn&&(fn=Ext.resolveMethod(fn,scope||element)),fn||Ext.Error.raise({sourceClass:"Ext.EventManager",sourceMethod:"addListener",targetElement:element,eventName:eventName,msg:'Error adding "'+eventName+'" listener. The handler function is undefined.'}),options=options||{},bind=EventManager.normalizeEvent(eventName,fn),wrap=EventManager.createListenerWrap(dom,eventName,bind.fn,scope,options),cache=EventManager.getEventListenerCache(element.dom?element:dom,eventName),eventName=bind.eventName,hasAddEventListener=supportsAddEventListener||Ext.isIE9&&!dom.attachEvent,hasAddEventListener||(id=EventManager.normalizeId(dom))&&(cacheItem=Ext.cache[id][eventName])&&cacheItem.firing&&(cache=EventManager.cloneEventListenerCache(dom,eventName)),capture=!!options.capture,cache.push({fn:fn,wrap:wrap,scope:scope,capture:capture}),hasAddEventListener?dom.addEventListener(eventName,wrap,capture):1===cache.length&&(id=EventManager.normalizeId(dom,!0),fn=Ext.Function.bind(EventManager.handleSingleEvent,EventManager,[id,eventName],!0),Ext.cache[id][eventName]={firing:!1,fn:fn},dom.attachEvent("on"+eventName,fn)),dom==doc&&"mousedown"==eventName&&EventManager.stoppedMouseDownEvent.addListener(wrap)},normalizeId:function(dom,force){var id;return id=dom===document?Ext.documentId:dom===window?Ext.windowId:dom.id,!id&&force&&(id=EventManager.getId(dom)),id},handleSingleEvent:function(e,id,eventName){var len,i,listenerCache=EventManager.getEventListenerCache(id,eventName),attachItem=Ext.cache[id][eventName];if(!attachItem.firing){for(attachItem.firing=!0,i=0,len=listenerCache.length;i<len;++i)listenerCache[i].wrap(e);attachItem.firing=!1}},removeListener:function(element,eventName,fn,scope){if("string"!=typeof eventName)return void EventManager.prepareListenerConfig(element,eventName,!0);var id,j,cacheItem,hasRemoveEventListener,listener,wrap,dom=Ext.getDom(element),el=element.dom?element:Ext.get(dom),cache=EventManager.getEventListenerCache(el,eventName),bindName=EventManager.normalizeEvent(eventName).eventName,i=cache.length;if(dom)for(hasRemoveEventListener=supportsAddEventListener||Ext.isIE9&&!dom.detachEvent,"string"==typeof fn&&(fn=Ext.resolveMethod(fn,scope||element));i--;)if((listener=cache[i])&&(!fn||listener.fn==fn)&&(!scope||listener.scope===scope)){if(wrap=listener.wrap,wrap.task&&(clearTimeout(wrap.task),delete wrap.task),j=wrap.tasks&&wrap.tasks.length){for(;j--;)clearTimeout(wrap.tasks[j]);delete wrap.tasks}hasRemoveEventListener?dom.removeEventListener(bindName,wrap,listener.capture):(id=EventManager.normalizeId(dom,!0),cacheItem=Ext.cache[id][bindName],cacheItem&&cacheItem.firing&&(cache=EventManager.cloneEventListenerCache(dom,bindName)),1===cache.length&&(fn=cacheItem.fn,delete Ext.cache[id][bindName],dom.detachEvent("on"+bindName,fn))),wrap&&dom==doc&&"mousedown"==eventName&&EventManager.stoppedMouseDownEvent.removeListener(wrap),Ext.Array.erase(cache,i,1)}},removeAll:function(element){var cache,events,eventName,id="string"==typeof element?element:element.id;if(id&&(cache=Ext.cache[id])){events=cache.events;for(eventName in events)events.hasOwnProperty(eventName)&&EventManager.removeListener(element,eventName);cache.events={}}},purgeElement:function(element,eventName){var len,childNodes,dom=Ext.getDom(element),i=0;if(eventName?EventManager.removeListener(element,eventName):EventManager.removeAll(element),dom&&dom.childNodes)for(childNodes=dom.childNodes,len=childNodes.length;i<len;i++)EventManager.purgeElement(childNodes[i],eventName)},createListenerWrap:function(dom,ename,fn,scope,options){options=options||{};var gen,wrap=function(e,args){var f;return gen||(f=["if(!"+Ext.name+") {return;}"],options.buffer||options.delay||options.freezeEvent?(options.freezeEvent&&f.push("e = X.EventObject.setEvent(e);"),f.push("e = new X.EventObjectImpl(e, "+(options.freezeEvent?"true":"false")+");")):f.push("e = X.EventObject.setEvent(e);"),options.delegate?(f.push('var result, t = e.getTarget("'+(options.delegate+"").replace(escapeRx,"\\\\")+'", this);'),f.push("if(!t) {return;}")):f.push("var t = e.target, result;"),options.target&&f.push("if(e.target !== options.target) {return;}"),options.stopEvent?f.push("e.stopEvent();"):(options.preventDefault&&f.push("e.preventDefault();"),options.stopPropagation&&f.push("e.stopPropagation();")),!1===options.normalized&&f.push("e = e.browserEvent;"),options.buffer&&(f.push("(wrap.task && clearTimeout(wrap.task));"),f.push("wrap.task = setTimeout(function() {")),options.delay&&(f.push("wrap.tasks = wrap.tasks || [];"),f.push("wrap.tasks.push(setTimeout(function() {")),f.push("result = fn.call(scope || dom, e, t, options);"),options.single&&f.push("evtMgr.removeListener(dom, ename, fn, scope);"),"mousemove"!==ename&&"unload"!==ename&&(f.push("if (evtMgr.idleEvent.listeners.length) {"),f.push("evtMgr.idleEvent.fire();"),f.push("}")),options.delay&&f.push("}, "+options.delay+"));"),options.buffer&&f.push("}, "+options.buffer+");"),f.push("return result;"),gen=Ext.cacheableFunctionFactory("e","options","fn","scope","ename","dom","wrap","args","X","evtMgr",f.join("\n"))),gen.call(dom,e,options,fn,scope,ename,dom,wrap,args,Ext,EventManager)};return wrap},getEventCache:function(element){var elementCache,id;return element?(element.$cache?elementCache=element.$cache:(id="string"==typeof element?element:EventManager.getId(element),elementCache=Ext.cache[id]),elementCache.events||(elementCache.events={})):[]},getEventListenerCache:function(element,eventName){var eventCache=EventManager.getEventCache(element);return eventCache[eventName]||(eventCache[eventName]=[])},cloneEventListenerCache:function(element,eventName){var out,eventCache=EventManager.getEventCache(element);return out=eventCache[eventName]?eventCache[eventName].slice(0):[],eventCache[eventName]=out,out},mouseLeaveRe:/(mouseout|mouseleave)/,mouseEnterRe:/(mouseover|mouseenter)/,stopEvent:function(event){EventManager.stopPropagation(event),EventManager.preventDefault(event)},stopPropagation:function(event){event=event.browserEvent||event,event.stopPropagation?event.stopPropagation():event.cancelBubble=!0},preventDefault:function(event){if(event=event.browserEvent||event,event.preventDefault)event.preventDefault();else{event.returnValue=!1;try{(event.ctrlKey||event.keyCode>111&&event.keyCode<124)&&(event.keyCode=-1)}catch(e){}}},getRelatedTarget:function(event){event=event.browserEvent||event;var target=event.relatedTarget;return target||(EventManager.mouseLeaveRe.test(event.type)?target=event.toElement:EventManager.mouseEnterRe.test(event.type)&&(target=event.fromElement)),EventManager.resolveTextNode(target)},getPageX:function(event){return EventManager.getPageXY(event)[0]},getPageY:function(event){return EventManager.getPageXY(event)[1]},getPageXY:function(event){event=event.browserEvent||event;var x=event.pageX,y=event.pageY,docEl=doc.documentElement,body=doc.body;return x||0===x||(x=event.clientX+(docEl&&docEl.scrollLeft||body&&body.scrollLeft||0)-(docEl&&docEl.clientLeft||body&&body.clientLeft||0),y=event.clientY+(docEl&&docEl.scrollTop||body&&body.scrollTop||0)-(docEl&&docEl.clientTop||body&&body.clientTop||0)),[x,y]},getTarget:function(event){return event=event.browserEvent||event,EventManager.resolveTextNode(event.target||event.srcElement)},resolveTextNode:Ext.isGecko?function(node){if(node){var s=HTMLElement.prototype.toString.call(node);if("[xpconnect wrapped native prototype]"!==s&&"[object XULElement]"!==s)return 3==node.nodeType?node.parentNode:node}}:function(node){return node&&3==node.nodeType?node.parentNode:node},curWidth:0,curHeight:0,onWindowResize:function(fn,scope,options){var resize=EventManager.resizeEvent;resize||(EventManager.resizeEvent=resize=new Ext.util.Event,EventManager.on(win,"resize",EventManager.fireResize,null,{buffer:100})),resize.addListener(fn,scope,options)},fireResize:function(){var w=Ext.Element.getViewWidth(),h=Ext.Element.getViewHeight();EventManager.curHeight==h&&EventManager.curWidth==w||(EventManager.curHeight=h,EventManager.curWidth=w,EventManager.resizeEvent.fire(w,h))},removeResizeListener:function(fn,scope){var resize=EventManager.resizeEvent;resize&&resize.removeListener(fn,scope)},onWindowUnload:function(fn,scope,options){var unload=EventManager.unloadEvent;unload||(EventManager.unloadEvent=unload=new Ext.util.Event,EventManager.addListener(win,"unload",EventManager.fireUnload)),fn&&unload.addListener(fn,scope,options)},fireUnload:function(){try{doc=win=void 0;var gridviews,i,ln,el,cache;if(EventManager.unloadEvent.fire(),Ext.isGecko3)for(gridviews=Ext.ComponentQuery.query("gridview"),i=0,ln=gridviews.length;i<ln;i++)gridviews[i].scrollToTop();cache=Ext.cache;for(el in cache)cache.hasOwnProperty(el)&&EventManager.removeAll(el)}catch(e){}},removeUnloadListener:function(fn,scope){var unload=EventManager.unloadEvent;unload&&unload.removeListener(fn,scope)},useKeyDown:Ext.isWebKit?parseInt(navigator.userAgent.match(/AppleWebKit\/(\d+)/)[1],10)>=525:!(Ext.isGecko&&!Ext.isWindows||Ext.isOpera&&Ext.operaVersion<12),getKeyEvent:function(){return EventManager.useKeyDown?"keydown":"keypress"}}),!supportsAddEventListener&&document.attachEvent&&Ext.apply(EventManager,{pollScroll:function(){var scrollable=!0;try{document.documentElement.doScroll("left")}catch(e){scrollable=!1}return scrollable&&document.body?EventManager.onReadyEvent({type:"doScroll"}):EventManager.scrollTimeout=setTimeout(EventManager.pollScroll,20),scrollable},scrollTimeout:null,readyStatesRe:/complete/i,checkReadyState:function(){var state=document.readyState;EventManager.readyStatesRe.test(state)&&EventManager.onReadyEvent({type:state})},bindReadyEvent:function(){var topContext=!0;if(!EventManager.hasBoundOnReady){try{topContext=void 0===window.frameElement}catch(e){topContext=!1}topContext&&doc.documentElement.doScroll||(EventManager.pollScroll=Ext.emptyFn),!0!==EventManager.pollScroll()&&("complete"==doc.readyState?EventManager.onReadyEvent({type:"already "+(doc.readyState||"body")}):(doc.attachEvent("onreadystatechange",EventManager.checkReadyState),window.attachEvent("onload",EventManager.onReadyEvent),EventManager.hasBoundOnReady=!0))}},onReadyEvent:function(e){e&&e.type&&EventManager.onReadyChain.push(e.type),EventManager.hasBoundOnReady&&(document.detachEvent("onreadystatechange",EventManager.checkReadyState),window.detachEvent("onload",EventManager.onReadyEvent)),Ext.isNumber(EventManager.scrollTimeout)&&(clearTimeout(EventManager.scrollTimeout),delete EventManager.scrollTimeout),Ext.isReady||EventManager.fireDocReady()},onReadyChain:[]}),Ext.onReady=function(fn,scope,options){Ext.Loader.onReady(fn,scope,!0,options)},Ext.onDocumentReady=EventManager.onDocumentReady,EventManager.on=EventManager.addListener,EventManager.un=EventManager.removeListener,Ext.onReady(initExtCss)};Ext.define("Ext.util.Observable",function(Observable){var emptyFn=Ext.emptyFn,emptyArray=[],arrayProto=Array.prototype,arraySlice=arrayProto.slice,ExtEvent=Ext.util.Event,ListenerRemover=function(observable){if(observable instanceof ListenerRemover)return observable;this.observable=observable,arguments[1].isObservable&&(this.managedListeners=!0),this.args=arraySlice.call(arguments,1)};return ListenerRemover.prototype.destroy=function(){this.observable[this.managedListeners?"mun":"un"].apply(this.observable,this.args)},{requires:["Ext.util.Event","Ext.EventManager"],statics:{releaseCapture:function(o){o.fireEventArgs=this.prototype.fireEventArgs},capture:function(o,fn,scope){var newFn=function(eventName,args){return fn.apply(scope,[eventName].concat(args))};this.captureArgs(o,newFn,scope)},captureArgs:function(o,fn,scope){o.fireEventArgs=Ext.Function.createInterceptor(o.fireEventArgs,fn,scope)},observe:function(cls,listeners){return cls&&(cls.isObservable||(Ext.applyIf(cls,new this),this.captureArgs(cls.prototype,cls.fireEventArgs,cls)),Ext.isObject(listeners)&&cls.on(listeners)),cls},prepareClass:function(T,mixin){if(!T.HasListeners){var HasListeners=function(){},SuperHL=T.superclass.HasListeners||mixin&&mixin.HasListeners||Observable.HasListeners;T.prototype.HasListeners=T.HasListeners=HasListeners,HasListeners.prototype=T.hasListeners=new SuperHL}}},isObservable:!0,eventsSuspended:0,constructor:function(config){var me=this;Ext.apply(me,config),me.hasListeners||(me.hasListeners=new me.HasListeners),me.events=me.events||{},me.listeners&&(me.on(me.listeners),me.listeners=null),me.bubbleEvents&&me.enableBubble(me.bubbleEvents)},onClassExtended:function(T){T.HasListeners||Observable.prepareClass(T)},eventOptionsRe:/^(?:scope|delay|buffer|single|stopEvent|preventDefault|stopPropagation|normalized|args|delegate|element|destroyable|vertical|horizontal|freezeEvent|priority)$/,addManagedListener:function(item,ename,fn,scope,options,noDestroy){var config,passedOptions,me=this,managedListeners=me.managedListeners=me.managedListeners||[];if("string"!=typeof ename){passedOptions=arguments.length>4?options:ename,options=ename;for(ename in options)options.hasOwnProperty(ename)&&(config=options[ename],me.eventOptionsRe.test(ename)||me.addManagedListener(item,ename,config.fn||config,config.scope||options.scope||scope,config.fn?config:passedOptions,!0));if(options&&options.destroyable)return new ListenerRemover(me,item,options)}else if("string"==typeof fn&&(scope=scope||me,fn=Ext.resolveMethod(fn,scope)),fn!==emptyFn&&(managedListeners.push({item:item,ename:ename,fn:fn,scope:scope,options:options}),item.on(ename,fn,scope,options),!noDestroy&&options&&options.destroyable))return new ListenerRemover(me,item,ename,fn,scope)},removeManagedListener:function(item,ename,fn,scope){var options,config,managedListeners,length,i,me=this;if("string"!=typeof ename){options=ename;for(ename in options)options.hasOwnProperty(ename)&&(config=options[ename],me.eventOptionsRe.test(ename)||me.removeManagedListener(item,ename,config.fn||config,config.scope||options.scope||scope))}else for(managedListeners=me.managedListeners?me.managedListeners.slice():[],"string"==typeof fn&&(scope=scope||me,fn=Ext.resolveMethod(fn,scope)),i=0,length=managedListeners.length;i<length;i++)me.removeManagedListenerItem(!1,managedListeners[i],item,ename,fn,scope)},fireEvent:function(eventName){return this.fireEventArgs(eventName,arraySlice.call(arguments,1))},fireEventArgs:function(eventName,args){eventName=eventName.toLowerCase();var me=this,events=me.events,event=events&&events[eventName],ret=!0;return event&&me.hasListeners[eventName]&&(ret=me.continueFireEvent(eventName,args||emptyArray,event.bubble)),ret},continueFireEvent:function(eventName,args,bubbles){var queue,event,target=this,ret=!0;do{if(target.eventsSuspended)return(queue=target.eventQueue)&&queue.push([eventName,args,bubbles]),ret;if((event=target.events[eventName])&&!0!==event&&!1===(ret=event.fire.apply(event,args)))break}while(bubbles&&(target=target.getBubbleParent()));return ret},getBubbleParent:function(){var me=this,parent=me.getBubbleTarget&&me.getBubbleTarget();return parent&&parent.isObservable?parent:null},addListener:function(ename,fn,scope,options){var config,event,me=this,prevListenerCount=0;if("string"!=typeof ename){options=ename;for(ename in options)options.hasOwnProperty(ename)&&(config=options[ename],me.eventOptionsRe.test(ename)||me.addListener(ename,config.fn||config,config.scope||options.scope,config.fn?config:options));if(options&&options.destroyable)return new ListenerRemover(me,options)}else if(ename=ename.toLowerCase(),event=me.events[ename],event&&event.isEvent?prevListenerCount=event.listeners.length:me.events[ename]=event=new ExtEvent(me,ename),fn||Ext.Error.raise("No function passed for event "+me.$className+"."+ename),"string"==typeof fn&&(scope=scope||me,fn=Ext.resolveMethod(fn,scope)),fn!==emptyFn&&(event.addListener(fn,scope,options),event.listeners.length!==prevListenerCount&&me.hasListeners._incr_(ename),options&&options.destroyable))return new ListenerRemover(me,ename,fn,scope,options)},removeListener:function(ename,fn,scope){var config,event,options,me=this;if("string"!=typeof ename){options=ename;for(ename in options)options.hasOwnProperty(ename)&&(config=options[ename],me.eventOptionsRe.test(ename)||me.removeListener(ename,config.fn||config,config.scope||options.scope))}else ename=ename.toLowerCase(),(event=me.events[ename])&&event.isEvent&&("string"==typeof fn&&(scope=scope||me,fn=Ext.resolveMethod(fn,scope)),event.removeListener(fn,scope)&&me.hasListeners._decr_(ename))},clearListeners:function(){var event,key,events=this.events,hasListeners=this.hasListeners;for(key in events)events.hasOwnProperty(key)&&(event=events[key],event.isEvent&&(delete hasListeners[key],event.clearListeners()));this.clearManagedListeners()},purgeListeners:function(){return Ext.global.console&&Ext.global.console.warn("Observable: purgeListeners has been deprecated. Please use clearListeners."),this.clearListeners.apply(this,arguments)},clearManagedListeners:function(){for(var managedListeners=this.managedListeners||[],i=0,len=managedListeners.length;i<len;i++)this.removeManagedListenerItem(!0,managedListeners[i]);this.managedListeners=[]},removeManagedListenerItem:function(isClear,managedListener,item,ename,fn,scope){!isClear&&(managedListener.item!==item||managedListener.ename!==ename||fn&&managedListener.fn!==fn||scope&&managedListener.scope!==scope)||(managedListener.item.un(managedListener.ename,managedListener.fn,managedListener.scope),isClear||Ext.Array.remove(this.managedListeners,managedListener))},purgeManagedListeners:function(){return Ext.global.console&&Ext.global.console.warn("Observable: purgeManagedListeners has been deprecated. Please use clearManagedListeners."),this.clearManagedListeners.apply(this,arguments)},addEvents:function(o){var arg,args,i,me=this,events=me.events||(me.events={});if("string"==typeof o)for(args=arguments,i=args.length;i--;)arg=args[i],events[arg]||(events[arg]=!0);else Ext.applyIf(me.events,o)},hasListener:function(ename){return!!this.hasListeners[ename.toLowerCase()]},suspendEvents:function(queueSuspended){this.eventsSuspended+=1,queueSuspended&&!this.eventQueue&&(this.eventQueue=[])},suspendEvent:function(eventName){var i,event,len=arguments.length;for(i=0;i<len;i++)(event=this.events[arguments[i]])&&event.suspend&&event.suspend()},resumeEvent:function(){var i,event,len=arguments.length;for(i=0;i<len;i++)(event=this.events[arguments[i]])&&event.resume&&event.resume()},resumeEvents:function(){var qLen,q,me=this,queued=me.eventQueue;if(me.eventsSuspended&&!--me.eventsSuspended&&(delete me.eventQueue,queued))for(qLen=queued.length,q=0;q<qLen;q++)me.continueFireEvent.apply(me,queued[q])},relayEvents:function(origin,events,prefix){for(var oldName,me=this,len=events.length,i=0,relayers={};i<len;i++)oldName=events[i],relayers[oldName]=me.createRelayer(prefix?prefix+oldName:oldName);return me.mon(origin,relayers,null,null,void 0),new ListenerRemover(me,origin,relayers)},createRelayer:function(newName,beginEnd){var me=this;return function(){return me.fireEventArgs.call(me,newName,beginEnd?arraySlice.apply(arguments,beginEnd):arguments)}},enableBubble:function(eventNames){if(eventNames){var ename,event,i,me=this,names="string"==typeof eventNames?arguments:eventNames,length=names.length,events=me.events;for(i=0;i<length;++i)ename=names[i].toLowerCase(),event=events[ename],event&&"boolean"!=typeof event||(events[ename]=event=new ExtEvent(me,ename)),me.hasListeners._incr_(ename),event.bubble=!0}}}},function(){function getMethodEvent(method){var returnValue,v,cancel,makeCall,e=(this.methodEvents=this.methodEvents||{})[method],obj=this;return e||(this.methodEvents[method]=e={},e.originalFn=this[method],e.methodName=method,e.before=[],e.after=[],makeCall=function(fn,scope,args){void 0!==(v=fn.apply(scope||obj,args))&&("object"==typeof v?(returnValue=void 0!==v.returnValue?v.returnValue:v,cancel=!!v.cancel):!1===v?cancel=!0:returnValue=v)},this[method]=function(){var b,i,len,args=Array.prototype.slice.call(arguments,0);for(returnValue=v=void 0,cancel=!1,i=0,len=e.before.length;i<len;i++)if(b=e.before[i],makeCall(b.fn,b.scope,args),cancel)return returnValue;for(void 0!==(v=e.originalFn.apply(obj,args))&&(returnValue=v),i=0,len=e.after.length;i<len;i++)if(b=e.after[i],makeCall(b.fn,b.scope,args),cancel)return returnValue;return returnValue}),e}var globalEvents,Observable=this,proto=Observable.prototype,HasListeners=function(){},prepareMixin=function(T){if(!T.HasListeners){var proto=T.prototype;Observable.prepareClass(T,this),T.onExtended(function(U){Ext.classSystemMonitor&&Ext.classSystemMonitor("extend mixin",arguments),Observable.prepareClass(U)}),proto.onClassMixedIn?Ext.override(T,{onClassMixedIn:function(U){prepareMixin.call(this,U),this.callParent(arguments)}}):proto.onClassMixedIn=function(U){prepareMixin.call(this,U)}}};HasListeners.prototype={_decr_:function(ev){--this[ev]||delete this[ev]},_incr_:function(ev){this.hasOwnProperty(ev)?++this[ev]:this[ev]=1}},proto.HasListeners=Observable.HasListeners=HasListeners,Observable.createAlias({on:"addListener",un:"removeListener",mon:"addManagedListener",mun:"removeManagedListener"}),Observable.observeClass=Observable.observe,Ext.globalEvents=globalEvents=new Observable({events:{idle:Ext.EventManager.idleEvent,ready:Ext.EventManager.readyEvent}}),Ext.on=function(){return globalEvents.addListener.apply(globalEvents,arguments)},Ext.un=function(){return globalEvents.removeListener.apply(globalEvents,arguments)},Ext.apply(proto,{onClassMixedIn:prepareMixin,beforeMethod:function(method,fn,scope){getMethodEvent.call(this,method).before.push({fn:fn,scope:scope})},afterMethod:function(method,fn,scope){getMethodEvent.call(this,method).after.push({fn:fn,scope:scope})},removeMethodListener:function(method,fn,scope){var i,len,e=this.getMethodEvent(method);for(i=0,len=e.before.length;i<len;i++)if(e.before[i].fn==fn&&e.before[i].scope==scope)return void Ext.Array.erase(e.before,i,1);for(i=0,len=e.after.length;i<len;i++)if(e.after[i].fn==fn&&e.after[i].scope==scope)return void Ext.Array.erase(e.after,i,1)},toggleEventLogging:function(toggle){Ext.util.Observable[toggle?"capture":"releaseCapture"](this,function(en){Ext.isDefined(Ext.global.console)&&Ext.global.console.log(en,arguments)})}})});Ext.define("Ext.EventObjectImpl",{uses:["Ext.util.Point"],BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,RETURN:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,WHEEL_SCALE:function(){var scale;return Ext.isGecko?scale=3:Ext.isMac?(scale=Ext.isSafari&&Ext.webKitVersion>=532?120:12,scale*=3):scale=120,scale}(),clickRe:/(dbl)?click/,safariKeys:{3:13,63234:37,63235:39,63232:38,63233:40,63276:33,63277:34,63272:46,63273:36,63275:35},btnMap:Ext.isIE?{1:0,4:1,2:2}:{0:0,1:1,2:2},constructor:function(event,freezeEvent){event&&this.setEvent(event.browserEvent||event,freezeEvent)},setEvent:function(event,freezeEvent){var button,me=this;return event===me||event&&event.browserEvent?event:(me.browserEvent=event,event?(button=event.button?me.btnMap[event.button]:event.which?event.which-1:-1,me.clickRe.test(event.type)&&-1==button&&(button=0),me.type=event.type,me.button=button,me.shiftKey=event.shiftKey,me.ctrlKey=event.ctrlKey||event.metaKey||!1,me.altKey=event.altKey,me.keyCode=event.keyCode,me.charCode=event.charCode,me.target=Ext.EventManager.getTarget(event),me.relatedTarget=Ext.EventManager.getRelatedTarget(event),me.currentTarget=event.currentTarget,me.xy=freezeEvent?me.getXY():null):(me.button=-1,me.shiftKey=!1,me.ctrlKey=!1,me.altKey=!1,me.keyCode=0,me.charCode=0,me.target=null,me.xy=[0,0]),me)},clone:function(){return new this.self(this.browserEvent,this)},stopEvent:function(){this.stopPropagation(),this.preventDefault()},preventDefault:function(){this.browserEvent&&Ext.EventManager.preventDefault(this.browserEvent)},stopPropagation:function(){var browserEvent=this.browserEvent;browserEvent&&("mousedown"==browserEvent.type&&Ext.EventManager.stoppedMouseDownEvent.fire(this),Ext.EventManager.stopPropagation(browserEvent))},getCharCode:function(){return this.charCode||this.keyCode},getKey:function(){return this.normalizeKey(this.keyCode||this.charCode)},normalizeKey:function(key){return Ext.isWebKit?this.safariKeys[key]||key:key},getPageX:function(){return this.getX()},getPageY:function(){return this.getY()},getX:function(){return this.getXY()[0]},getY:function(){return this.getXY()[1]},getXY:function(){return this.xy||(this.xy=Ext.EventManager.getPageXY(this.browserEvent)),this.xy},getTarget:function(selector,maxDepth,returnEl){return selector?Ext.fly(this.target).findParent(selector,maxDepth,returnEl):returnEl?Ext.get(this.target):this.target},getRelatedTarget:function(selector,maxDepth,returnEl){return selector&&this.relatedTarget?Ext.fly(this.relatedTarget).findParent(selector,maxDepth,returnEl):returnEl?Ext.get(this.relatedTarget):this.relatedTarget},correctWheelDelta:function(delta){var scale=this.WHEEL_SCALE,ret=Math.round(delta/scale);return!ret&&delta&&(ret=delta<0?-1:1),ret},getWheelDeltas:function(){var me=this,event=me.browserEvent,dx=0,dy=0;return Ext.isDefined(event.wheelDeltaX)?(dx=event.wheelDeltaX,dy=event.wheelDeltaY):event.wheelDelta?dy=event.wheelDelta:event.detail&&(dy=-event.detail,dy>100?dy=3:dy<-100&&(dy=-3),Ext.isDefined(event.axis)&&event.axis===event.HORIZONTAL_AXIS&&(dx=dy,dy=0)),{x:me.correctWheelDelta(dx),y:me.correctWheelDelta(dy)}},getWheelDelta:function(){return this.getWheelDeltas().y},within:function(el,related,allowEl){if(el){var result,t=related?this.getRelatedTarget():this.getTarget();if(t)return result=Ext.fly(el,"_internal").contains(t),!result&&allowEl&&(result=t==Ext.getDom(el)),result}return!1},isNavKeyPress:function(){var me=this,k=this.normalizeKey(me.keyCode);return k>=33&&k<=40||k==me.RETURN||k==me.TAB||k==me.ESC},isSpecialKey:function(){var k=this.normalizeKey(this.keyCode);return"keypress"==this.type&&this.ctrlKey||this.isNavKeyPress()||k==this.BACKSPACE||k>=16&&k<=20||k>=44&&k<=46},getPoint:function(){var xy=this.getXY();return new Ext.util.Point(xy[0],xy[1])},hasModifier:function(){return this.ctrlKey||this.altKey||this.shiftKey||this.metaKey},injectEvent:function(){function createMouseEventDispatcher(type,detail){var cancelable="mousemove"!=type;return function(targetEl,srcEvent){var xy=srcEvent.getXY(),e=API.createMouseEvent(targetEl.ownerDocument,type,!0,cancelable,detail,xy[0],xy[1],srcEvent.ctrlKey,srcEvent.altKey,srcEvent.shiftKey,srcEvent.metaKey,srcEvent.button,srcEvent.relatedTarget);API.fireEvent(targetEl,type,e)}}function cannotInject(target,srcEvent){}var API,crazyIEButtons,dispatchers={};return!Ext.isIE9m&&document.createEvent?API={createHtmlEvent:function(doc,type,bubbles,cancelable){var event=doc.createEvent("HTMLEvents");return event.initEvent(type,bubbles,cancelable),event},createMouseEvent:function(doc,type,bubbles,cancelable,detail,clientX,clientY,ctrlKey,altKey,shiftKey,metaKey,button,relatedTarget){var event=doc.createEvent("MouseEvents"),view=doc.defaultView||window;return event.initMouseEvent?event.initMouseEvent(type,bubbles,cancelable,view,detail,clientX,clientY,clientX,clientY,ctrlKey,altKey,shiftKey,metaKey,button,relatedTarget):(event=doc.createEvent("UIEvents"),event.initEvent(type,bubbles,cancelable),event.view=view,event.detail=detail,event.screenX=clientX,event.screenY=clientY,event.clientX=clientX,event.clientY=clientY,event.ctrlKey=ctrlKey,event.altKey=altKey,event.metaKey=metaKey,event.shiftKey=shiftKey,event.button=button,event.relatedTarget=relatedTarget),event},createUIEvent:function(doc,type,bubbles,cancelable,detail){var event=doc.createEvent("UIEvents"),view=doc.defaultView||window;return event.initUIEvent(type,bubbles,cancelable,view,detail),event},fireEvent:function(target,type,event){target.dispatchEvent(event)},fixTarget:function(target){return target!=window||target.dispatchEvent?target:document}}:document.createEventObject&&(crazyIEButtons={0:1,1:4,2:2},API={createHtmlEvent:function(doc,type,bubbles,cancelable){var event=doc.createEventObject();return event.bubbles=bubbles,event.cancelable=cancelable,event},createMouseEvent:function(doc,type,bubbles,cancelable,detail,clientX,clientY,ctrlKey,altKey,shiftKey,metaKey,button,relatedTarget){var event=doc.createEventObject();return event.bubbles=bubbles,event.cancelable=cancelable,event.detail=detail,event.screenX=clientX,event.screenY=clientY,event.clientX=clientX,event.clientY=clientY,event.ctrlKey=ctrlKey,event.altKey=altKey,event.shiftKey=shiftKey,event.metaKey=metaKey,event.button=crazyIEButtons[button]||button,event.relatedTarget=relatedTarget,event},createUIEvent:function(doc,type,bubbles,cancelable,detail){var event=doc.createEventObject();return event.bubbles=bubbles,event.cancelable=cancelable,event},fireEvent:function(target,type,event){target.fireEvent("on"+type,event)},fixTarget:function(target){return target==document?document.documentElement:target}}),Ext.Object.each({load:[!1,!1],unload:[!1,!1],select:[!0,!1],change:[!0,!1],submit:[!0,!0],reset:[!0,!1],resize:[!0,!1],scroll:[!0,!1]},function(name,value){var bubbles=value[0],cancelable=value[1];dispatchers[name]=function(targetEl,srcEvent){var e=API.createHtmlEvent(name,bubbles,cancelable);API.fireEvent(targetEl,name,e)}}),Ext.each(["click","dblclick","mousedown","mouseup","mouseover","mousemove","mouseout"],function(eventName){dispatchers[eventName]=createMouseEventDispatcher(eventName,1)}),Ext.Object.each({focusin:[!0,!1],focusout:[!0,!1],activate:[!0,!0],focus:[!1,!1],blur:[!1,!1]},function(name,value){var bubbles=value[0],cancelable=value[1];dispatchers[name]=function(targetEl,srcEvent){var e=API.createUIEvent(targetEl.ownerDocument,name,bubbles,cancelable,1);API.fireEvent(targetEl,name,e)}}),API||(dispatchers={},API={fixTarget:Ext.identityFn}),function(target){var me=this,dispatcher=dispatchers[me.type]||cannotInject,t=target?target.dom||target:me.getTarget();t=API.fixTarget(t),dispatcher(t,me)}}()},function(){Ext.EventObject=new Ext.EventObjectImpl});Ext.define("Ext.dom.AbstractQuery",{select:function(q,root){var nodes,i,j,qlen,nlen,results=[];for(root=root||document,"string"==typeof root&&(root=document.getElementById(root)),q=q.split(","),i=0,qlen=q.length;i<qlen;i++)if("string"==typeof q[i])if("@"==typeof q[i][0])nodes=root.getAttributeNode(q[i].substring(1)),results.push(nodes);else for(nodes=root.querySelectorAll(q[i]),j=0,nlen=nodes.length;j<nlen;j++)results.push(nodes[j]);return results},selectNode:function(q,root){return this.select(q,root)[0]},is:function(el,q){return"string"==typeof el&&(el=document.getElementById(el)),-1!==this.select(q).indexOf(el)}});Ext.define("Ext.dom.AbstractHelper",{emptyTags:/^(?:br|frame|hr|img|input|link|meta|range|spacer|wbr|area|param|col)$/i,confRe:/^(?:tag|children|cn|html|tpl|tplData)$/i,endRe:/end/i,styleSepRe:/\s*(?::|;)\s*/,attributeTransform:{cls:"class",htmlFor:"for"},closeTags:{},decamelizeName:function(){function decamel(match,p1,p2){return p1+"-"+p2.toLowerCase()}var camelCaseRe=/([a-z])([A-Z])/g,cache={};return function(s){return cache[s]||(cache[s]=s.replace(camelCaseRe,decamel))}}(),generateMarkup:function(spec,buffer){var attr,val,tag,i,closeTags,me=this,specType=typeof spec;if("string"==specType||"number"==specType)buffer.push(spec);else if(Ext.isArray(spec))for(i=0;i<spec.length;i++)spec[i]&&me.generateMarkup(spec[i],buffer);else{tag=spec.tag||"div",buffer.push("<",tag);for(attr in spec)spec.hasOwnProperty(attr)&&(val=spec[attr],me.confRe.test(attr)||("object"==typeof val?(buffer.push(" ",attr,'="'),me.generateStyles(val,buffer,!0).push('"')):buffer.push(" ",me.attributeTransform[attr]||attr,'="',val,'"')));me.emptyTags.test(tag)?buffer.push("/>"):(buffer.push(">"),(val=spec.tpl)&&val.applyOut(spec.tplData,buffer),(val=spec.html)&&buffer.push(val),(val=spec.cn||spec.children)&&me.generateMarkup(val,buffer),closeTags=me.closeTags,buffer.push(closeTags[tag]||(closeTags[tag]="</"+tag+">")))}return buffer},generateStyles:function(styles,buffer,encode){var name,val,a=buffer||[];for(name in styles)styles.hasOwnProperty(name)&&(val=styles[name],name=this.decamelizeName(name),encode&&Ext.String.hasHtmlCharacters(val)&&(val=Ext.String.htmlEncode(val)),a.push(name,":",val,";"));return buffer||a.join("")},markup:function(spec){return"string"==typeof spec?spec:this.generateMarkup(spec,[]).join("")},applyStyles:function(el,styles){if(styles){var len,i=0;if(el=Ext.fly(el,"_applyStyles"),"function"==typeof styles&&(styles=styles.call()),"string"==typeof styles)for(styles=Ext.util.Format.trim(styles).split(this.styleSepRe),len=styles.length;i<len;)el.setStyle(styles[i++],styles[i++]);else Ext.isObject(styles)&&el.setStyle(styles)}},insertHtml:function(where,el,html){var setStart,range,frag,rangeEl,hash={};return where=where.toLowerCase(),hash.beforebegin=["BeforeBegin","previousSibling"],hash.afterend=["AfterEnd","nextSibling"],range=el.ownerDocument.createRange(),setStart="setStart"+(this.endRe.test(where)?"After":"Before"),hash[where]?(range[setStart](el),frag=range.createContextualFragment(html),el.parentNode.insertBefore(frag,"beforebegin"==where?el:el.nextSibling),el[("beforebegin"==where?"previous":"next")+"Sibling"]):(rangeEl=("afterbegin"==where?"first":"last")+"Child",el.firstChild?(range[setStart](el[rangeEl]),frag=range.createContextualFragment(html),"afterbegin"==where?el.insertBefore(frag,el.firstChild):el.appendChild(frag)):el.innerHTML=html,el[rangeEl])},insertBefore:function(el,o,returnElement){return this.doInsert(el,o,returnElement,"beforebegin")},insertAfter:function(el,o,returnElement){return this.doInsert(el,o,returnElement,"afterend","nextSibling")},insertFirst:function(el,o,returnElement){return this.doInsert(el,o,returnElement,"afterbegin","firstChild")},append:function(el,o,returnElement){return this.doInsert(el,o,returnElement,"beforeend","",!0)},overwrite:function(el,o,returnElement){return el=Ext.getDom(el),el.innerHTML=this.markup(o),returnElement?Ext.get(el.firstChild):el.firstChild},doInsert:function(el,o,returnElement,pos,sibling,append){var newNode=this.insertHtml(pos,Ext.getDom(el),this.markup(o));return returnElement?Ext.get(newNode,!0):newNode}});Ext.define("Ext.dom.AbstractElement_static",{override:"Ext.dom.AbstractElement",inheritableStatics:{unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,msRe:/^-ms-/,cssRe:/([a-z0-9\-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*)?;?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(size,units){return"number"==typeof size?size+(units||this.defaultUnit||"px"):""===size||"auto"==size||void 0===size||null===size?size||"":this.unitRe.test(size)?size:(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Warning, size detected as NaN on Element.addUnits."),size||"")},isAncestor:function(p,c){var ret=!1;if(p=Ext.getDom(p),c=Ext.getDom(c),p&&c){if(p.contains)return p.contains(c);if(p.compareDocumentPosition)return!!(16&p.compareDocumentPosition(c));for(;c=c.parentNode;)ret=c==p||ret}return ret},parseBox:function(box){box=box||0;var parts,ln,type=typeof box;return"number"===type?{top:box,right:box,bottom:box,left:box}:"string"!==type?box:(parts=box.split(" "),ln=parts.length,1==ln?parts[1]=parts[2]=parts[3]=parts[0]:2==ln?(parts[2]=parts[0],parts[3]=parts[1]):3==ln&&(parts[3]=parts[1]),{top:parseFloat(parts[0])||0,right:parseFloat(parts[1])||0,bottom:parseFloat(parts[2])||0,left:parseFloat(parts[3])||0})},unitizeBox:function(box,units){var a=this.addUnits,b=this.parseBox(box);return a(b.top,units)+" "+a(b.right,units)+" "+a(b.bottom,units)+" "+a(b.left,units)},camelReplaceFn:function(m,a){return a.charAt(1).toUpperCase()},normalize:function(prop){return"float"==prop&&(prop=Ext.supports.Float?"cssFloat":"styleFloat"),this.propertyCache[prop]||(this.propertyCache[prop]=prop.replace(this.msRe,"ms-").replace(this.camelRe,this.camelReplaceFn))},getDocumentHeight:function(){return Math.max(Ext.isStrict?document.documentElement.scrollHeight:document.body.scrollHeight,this.getViewportHeight())},getDocumentWidth:function(){return Math.max(Ext.isStrict?document.documentElement.scrollWidth:document.body.scrollWidth,this.getViewportWidth())},getViewportHeight:function(){return window.innerHeight},getViewportWidth:function(){return window.innerWidth},getViewSize:function(){return{width:window.innerWidth,height:window.innerHeight}},getOrientation:function(){return Ext.supports.OrientationChange?0==window.orientation?"portrait":"landscape":window.innerHeight>window.innerWidth?"portrait":"landscape"},fromPoint:function(x,y){return Ext.get(document.elementFromPoint(x,y))},parseStyles:function(styles){var matches,out={},cssRe=this.cssRe;if(styles)for(cssRe.lastIndex=0;matches=cssRe.exec(styles);)out[matches[1]]=matches[2]||"";return out}}},function(){function makeSelectionRestoreFn(activeEl,start,end){return function(){activeEl.selectionStart=start,activeEl.selectionEnd=end}}var doc=document,activeElement=null,isCSS1="CSS1Compat"==doc.compatMode;"activeElement"in doc||!doc.addEventListener||doc.addEventListener("focus",function(ev){ev&&ev.target&&(activeElement=ev.target==doc?null:ev.target)},!0),this.addInheritableStatics({getActiveElement:function(){var active;try{active=doc.activeElement}catch(e){}return active=active||activeElement,active||(active=activeElement=document.body),active},getRightMarginFixCleaner:function(target){var activeEl,tag,start,end,supports=Ext.supports,hasInputBug=supports.DisplayChangeInputSelectionBug,hasTextAreaBug=supports.DisplayChangeTextAreaSelectionBug;return(hasInputBug||hasTextAreaBug)&&(activeEl=doc.activeElement||activeElement,tag=activeEl&&activeEl.tagName,(hasTextAreaBug&&"TEXTAREA"==tag||hasInputBug&&"INPUT"==tag&&"text"==activeEl.type)&&Ext.dom.Element.isAncestor(target,activeEl)&&(start=activeEl.selectionStart,end=activeEl.selectionEnd,Ext.isNumber(start)&&Ext.isNumber(end)))?makeSelectionRestoreFn(activeEl,start,end):Ext.emptyFn},getViewWidth:function(full){return full?Ext.dom.Element.getDocumentWidth():Ext.dom.Element.getViewportWidth()},getViewHeight:function(full){return full?Ext.dom.Element.getDocumentHeight():Ext.dom.Element.getViewportHeight()},getDocumentHeight:function(){return Math.max(isCSS1?doc.documentElement.scrollHeight:doc.body.scrollHeight,Ext.dom.Element.getViewportHeight())},getDocumentWidth:function(){return Math.max(isCSS1?doc.documentElement.scrollWidth:doc.body.scrollWidth,Ext.dom.Element.getViewportWidth())},getViewportHeight:function(){return Ext.isIE9m?Ext.isStrict?doc.documentElement.clientHeight:doc.body.clientHeight:self.innerHeight},getViewportWidth:function(){return Ext.isStrict||Ext.isOpera?Ext.isIE9m?doc.documentElement.clientWidth:self.innerWidth:doc.body.clientWidth},serializeForm:function(form){var element,name,type,options,hasValue,e,o,oLen,opt,fElements=form.elements||(document.forms[form]||Ext.getDom(form)).elements,hasSubmit=!1,encoder=encodeURIComponent,data="",eLen=fElements.length;for(e=0;e<eLen;e++)if(element=fElements[e],name=element.name,type=element.type,options=element.options,!element.disabled&&name)if(/select-(one|multiple)/i.test(type))for(oLen=options.length,o=0;o<oLen;o++)opt=options[o],opt.selected&&(hasValue=opt.hasAttribute?opt.hasAttribute("value"):opt.getAttributeNode("value").specified,data+=Ext.String.format("{0}={1}&",encoder(name),encoder(hasValue?opt.value:opt.text)));else/file|undefined|reset|button/i.test(type)||/radio|checkbox/i.test(type)&&!element.checked||"submit"==type&&hasSubmit||(data+=encoder(name)+"="+encoder(element.value)+"&",hasSubmit=/submit/i.test(type));return data.substr(0,data.length-1)}})});Ext.define("Ext.dom.AbstractElement_insertion",{override:"Ext.dom.AbstractElement",appendChild:function(el,returnDom){var insertEl,eLen,e,me=this;if(el.nodeType||el.dom||"string"==typeof el)return el=Ext.getDom(el),me.dom.appendChild(el),returnDom?el:Ext.get(el);if(el.length){for(insertEl=Ext.fly(document.createDocumentFragment(),"_internal"),eLen=el.length,Ext.DomHelper.useDom=!0,e=0;e<eLen;e++)insertEl.appendChild(el[e],returnDom);return Ext.DomHelper.useDom=void 0,me.dom.appendChild(insertEl.dom),returnDom?insertEl.dom:insertEl}return me.createChild(el,null,returnDom)},appendTo:function(el){return Ext.getDom(el).appendChild(this.dom),this},insertBefore:function(el){return el=Ext.getDom(el),el.parentNode.insertBefore(this.dom,el),this},insertAfter:function(el){return el=Ext.getDom(el),el.parentNode.insertBefore(this.dom,el.nextSibling),this},insertFirst:function(el,returnDom){return el=el||{},el.nodeType||el.dom||"string"==typeof el?(el=Ext.getDom(el),this.dom.insertBefore(el,this.dom.firstChild),returnDom?el:Ext.get(el)):this.createChild(el,this.dom.firstChild,returnDom)},insertSibling:function(el,where,returnDom){var rt,insertEl,eLen,e,me=this,DomHelper=Ext.core.DomHelper,oldUseDom=DomHelper.useDom,isAfter="after"==(where||"before").toLowerCase();if(Ext.isArray(el)){for(insertEl=Ext.fly(document.createDocumentFragment(),"_internal"),eLen=el.length,DomHelper.useDom=!0,e=0;e<eLen;e++)rt=insertEl.appendChild(el[e],returnDom);return DomHelper.useDom=oldUseDom,me.dom.parentNode.insertBefore(insertEl.dom,isAfter?me.dom.nextSibling:me.dom),rt}return el=el||{},el.nodeType||el.dom?(rt=me.dom.parentNode.insertBefore(Ext.getDom(el),isAfter?me.dom.nextSibling:me.dom),returnDom||(rt=Ext.get(rt))):rt=isAfter&&!me.dom.nextSibling?DomHelper.append(me.dom.parentNode,el,!returnDom):DomHelper[isAfter?"insertAfter":"insertBefore"](me.dom,el,!returnDom),rt},replace:function(el){return el=Ext.get(el),this.insertBefore(el),el.remove(),this},replaceWith:function(el){var me=this;return el.nodeType||el.dom||"string"==typeof el?(el=Ext.get(el),me.dom.parentNode.insertBefore(el.dom,me.dom)):el=Ext.core.DomHelper.insertBefore(me.dom,el),delete Ext.cache[me.id],Ext.removeNode(me.dom),me.id=Ext.id(me.dom=el),Ext.dom.AbstractElement.addToCache(me.isFlyweight?new Ext.dom.AbstractElement(me.dom):me),me},createChild:function(config,insertBefore,returnDom){return config=config||{tag:"div"},insertBefore?Ext.core.DomHelper.insertBefore(insertBefore,config,!0!==returnDom):Ext.core.DomHelper.append(this.dom,config,!0!==returnDom)},wrap:function(config,returnDom,selector){var newEl=Ext.core.DomHelper.insertBefore(this.dom,config||{tag:"div"},!0),target=newEl;return selector&&(target=Ext.DomQuery.selectNode(selector,newEl.dom)),target.appendChild(this.dom),returnDom?newEl.dom:newEl},insertHtml:function(where,html,returnEl){var el=Ext.core.DomHelper.insertHtml(where,this.dom,html);return returnEl?Ext.get(el):el}});Ext.define("Ext.dom.AbstractElement_style",{override:"Ext.dom.AbstractElement"},function(){var Element=this,wordsRe=/\w/g,spacesRe=/\s+/,transparentRe=/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,hasClassList=Ext.supports.ClassList,borders={l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings={l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins={l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},internalFly=new Element.Fly;Ext.override(Element,{styleHooks:{},addStyles:function(sides,styles){var i,side,totalSize=0,sidesArr=(sides||"").match(wordsRe),len=sidesArr.length,styleSides=[];if(1==len)totalSize=Math.abs(parseFloat(this.getStyle(styles[sidesArr[0]]))||0);else if(len){for(i=0;i<len;i++)side=sidesArr[i],styleSides.push(styles[side]);for(styleSides=this.getStyle(styleSides),i=0;i<len;i++)side=sidesArr[i],totalSize+=Math.abs(parseFloat(styleSides[styles[side]])||0)}return totalSize},addCls:function(){var addWithClassList=function(className){String(className).indexOf("undefined")>-1&&Ext.Logger.warn("called with an undefined className: "+className);var classList,newCls,i,len,cls,me=this,dom=me.dom,trimRe=me.trimRe,origClassName=className;if("string"==typeof className&&(className=className.replace(trimRe,"").split(spacesRe)),dom&&className&&(len=className.length))if(dom.className)if(classList=dom.classList){for(i=0;i<len;++i)(cls=className[i])&&(classList.contains(cls)||(newCls?newCls.push(cls):(newCls=dom.className.replace(trimRe,""),newCls=newCls?[newCls,cls]:[cls])));newCls&&(dom.className=newCls.join(" "))}else addWithoutClassList(origClassName);else dom.className=className.join(" ");return me},addWithoutClassList=function(className){String(className).indexOf("undefined")>-1&&Ext.Logger.warn("called with an undefined className: '"+className+"'");var elClasses,me=this,dom=me.dom;return dom&&className&&className.length&&(elClasses=Ext.Element.mergeClsList(dom.className,className),elClasses.changed&&(dom.className=elClasses.join(" "))),me};return hasClassList?addWithClassList:addWithoutClassList}(),removeCls:function(className){var classList,len,elClasses,me=this,dom=me.dom;return"string"==typeof className&&(className=className.replace(me.trimRe,"").split(spacesRe)),dom&&dom.className&&className&&(len=className.length)&&(classList=dom.classList,1===len&&classList?className[0]&&classList.remove(className[0]):(elClasses=Ext.Element.removeCls(dom.className,className),elClasses.changed&&(dom.className=elClasses.join(" ")))),me},radioCls:function(className){var v,i,len,cn=this.dom.parentNode.childNodes;for(className=Ext.isArray(className)?className:[className],i=0,len=cn.length;i<len;i++)(v=cn[i])&&1==v.nodeType&&internalFly.attach(v).removeCls(className);return this.addCls(className)},toggleCls:function(){var toggleWithClassList=function(className){var classList,me=this,dom=me.dom;return dom&&(className=className.replace(me.trimRe,""))&&(classList=dom.classList,classList?classList.toggle(className):toggleWithoutClassList(className)),me},toggleWithoutClassList=function(className){return this.hasCls(className)?this.removeCls(className):this.addCls(className)};return hasClassList?toggleWithClassList:toggleWithoutClassList}(),hasCls:function(){var hasClsWithClassList=function(className){var classList,dom=this.dom,out=!1;return dom&&className&&(classList=dom.classList,out=classList?classList.contains(className):hasClsWithoutClassList(className)),out},hasClsWithoutClassList=function(className){var dom=this.dom;return!!dom&&(className&&-1!==(" "+dom.className+" ").indexOf(" "+className+" "))};return hasClassList?hasClsWithClassList:hasClsWithoutClassList}(),replaceCls:function(oldClassName,newClassName){return this.removeCls(oldClassName).addCls(newClassName)},isStyle:function(style,val){return this.getStyle(style)==val},getStyle:function(property,inline){var domStyle,camel,values,hook,out,style,i,me=this,dom=me.dom,multiple="string"!=typeof property,hooks=me.styleHooks,prop=property,props=prop,len=1;if(multiple&&(values={},prop=props[0],i=0,!(len=props.length)))return values;if(!dom||dom.documentElement)return values||"";domStyle=dom.style,inline?style=domStyle:(style=dom.ownerDocument.defaultView.getComputedStyle(dom,null))||(inline=!0,style=domStyle);do{if(hook=hooks[prop],hook||(hooks[prop]=hook={name:Element.normalize(prop)}),hook.get?out=hook.get(dom,me,inline,style):(camel=hook.name,out=style[camel]),!multiple)return out;values[prop]=out,prop=props[++i]}while(i<len);return values},getStyles:function(){var inline,props=Ext.Array.slice(arguments),len=props.length;return len&&"boolean"==typeof props[len-1]&&(inline=props.pop()),this.getStyle(props,inline)},isTransparent:function(prop){var value=this.getStyle(prop);return!!value&&transparentRe.test(value)},setStyle:function(prop,value){var hook,me=this,dom=me.dom,hooks=me.styleHooks,style=dom.style,name=prop;if("string"==typeof name)hook=hooks[name],hook||(hooks[name]=hook={name:Element.normalize(name)}),value=null==value?"":value,hook.set?hook.set(dom,value,me):style[hook.name]=value,hook.afterSet&&hook.afterSet(dom,value,me);else for(name in prop)prop.hasOwnProperty(name)&&(hook=hooks[name],hook||(hooks[name]=hook={name:Element.normalize(name)}),value=prop[name],value=null==value?"":value,hook.set?hook.set(dom,value,me):style[hook.name]=value,hook.afterSet&&hook.afterSet(dom,value,me));return me},getHeight:function(contentHeight){var dom=this.dom,height=contentHeight?dom.clientHeight-this.getPadding("tb"):dom.offsetHeight;return height>0?height:0},getWidth:function(contentWidth){var dom=this.dom,width=contentWidth?dom.clientWidth-this.getPadding("lr"):dom.offsetWidth;return width>0?width:0},setWidth:function(width){var me=this;return me.dom.style.width=Element.addUnits(width),me},setHeight:function(height){var me=this;return me.dom.style.height=Element.addUnits(height),me},getBorderWidth:function(side){return this.addStyles(side,borders)},getPadding:function(side){return this.addStyles(side,paddings)},margins:margins,applyStyles:function(styles){if(styles){var i,len,dom=this.dom;if("function"==typeof styles&&(styles=styles.call()),"string"==typeof styles)for(styles=Ext.util.Format.trim(styles).split(/\s*(?::|;)\s*/),i=0,len=styles.length;i<len;)dom.style[Element.normalize(styles[i++])]=styles[i++];else"object"==typeof styles&&this.setStyle(styles)}},setSize:function(width,height){var me=this,style=me.dom.style;return Ext.isObject(width)&&(height=width.height,width=width.width),style.width=Element.addUnits(width),style.height=Element.addUnits(height),me},getViewSize:function(){var doc=document,dom=this.dom;return dom==doc||dom==doc.body?{width:Element.getViewportWidth(),height:Element.getViewportHeight()}:{width:dom.clientWidth,height:dom.clientHeight}},getSize:function(contentSize){var dom=this.dom;return{width:Math.max(0,contentSize?dom.clientWidth-this.getPadding("lr"):dom.offsetWidth),height:Math.max(0,contentSize?dom.clientHeight-this.getPadding("tb"):dom.offsetHeight)}},repaint:function(){var dom=this.dom;return this.addCls(Ext.baseCSSPrefix+"repaint"),setTimeout(function(){internalFly.attach(dom).removeCls(Ext.baseCSSPrefix+"repaint")},1),this},getMargin:function(side){var key,o,margins,me=this,hash={t:"top",l:"left",r:"right",b:"bottom"};if(side)return me.addStyles(side,me.margins);margins=[];for(key in me.margins)me.margins.hasOwnProperty(key)&&margins.push(me.margins[key]);if((o=me.getStyle(margins))&&"object"==typeof o)for(key in me.margins)me.margins.hasOwnProperty(key)&&(o[hash[key]]=parseFloat(o[me.margins[key]])||0);return o},mask:function(msg,msgCls,transparent){var mask,size,me=this,dom=me.dom,data=(me.$cache||me.getCache()).data,el=data.mask,prefix=Ext.baseCSSPrefix;me.addCls(prefix+"masked"),"static"==me.getStyle("position")&&me.addCls(prefix+"masked-relative"),el&&el.remove(),mask=me.createChild({role:"presentation",cls:prefix+"mask"+(!1!==transparent?"":" "+prefix+"mask-gray"),html:msg?'<div class="'+(msgCls||prefix+"mask-message")+'" role="presentation">'+msg+"</div>":""}),size=me.getSize(),data.mask=mask,dom===document.body&&(size.height=window.innerHeight,me.orientationHandler&&Ext.EventManager.unOrientationChange(me.orientationHandler,me),me.orientationHandler=function(){size=me.getSize(),size.height=window.innerHeight,mask.setSize(size)},Ext.EventManager.onOrientationChange(me.orientationHandler,me)),mask.setSize(size),Ext.is.iPad&&Ext.repaint()},unmask:function(){var me=this,data=(me.$cache||me.getCache()).data,mask=data.mask,prefix=Ext.baseCSSPrefix;mask&&(mask.remove(),delete data.mask),me.removeCls([prefix+"masked",prefix+"masked-relative"]),me.dom===document.body&&(Ext.EventManager.unOrientationChange(me.orientationHandler,me),delete me.orientationHandler)}}),Ext.onReady(function(){function fixTransparent(dom,el,inline,style){var value=style[this.name]||"";return transparentRe.test(value)?"transparent":value}function fixRightMargin(dom,el,inline,style){var domStyle,display,result=style.marginRight;return"0px"!=result&&(domStyle=dom.style,display=domStyle.display,domStyle.display="inline-block",result=(inline?style:dom.ownerDocument.defaultView.getComputedStyle(dom,null)).marginRight,domStyle.display=display),result}function fixRightMarginAndInputFocus(dom,el,inline,style){var domStyle,cleaner,display,result=style.marginRight;return"0px"!=result&&(domStyle=dom.style,cleaner=Element.getRightMarginFixCleaner(dom),display=domStyle.display,domStyle.display="inline-block",result=(inline?style:dom.ownerDocument.defaultView.getComputedStyle(dom,"")).marginRight,domStyle.display=display,cleaner()),result}var styleHooks,colorStyles,i,name,camel,supports=Ext.supports;if(styleHooks=Element.prototype.styleHooks,supports.init&&supports.init(),supports.RightMargin||(styleHooks.marginRight=styleHooks["margin-right"]={name:"marginRight",get:supports.DisplayChangeInputSelectionBug||supports.DisplayChangeTextAreaSelectionBug?fixRightMarginAndInputFocus:fixRightMargin}),!supports.TransparentColor)for(colorStyles=["background-color","border-color","color","outline-color"],i=colorStyles.length;i--;)name=colorStyles[i],camel=Element.normalize(name),styleHooks[name]=styleHooks[camel]={name:camel,get:fixTransparent}})});Ext.define("Ext.dom.AbstractElement_traversal",{override:"Ext.dom.AbstractElement",findParent:function(simpleSelector,limit,returnEl){var stopEl,target=this.dom,topmost=document.documentElement,depth=0;for(limit=limit||50,isNaN(limit)&&(stopEl=Ext.getDom(limit),limit=Number.MAX_VALUE);target&&1==target.nodeType&&depth<limit&&target!=topmost&&target!=stopEl;){if(Ext.DomQuery.is(target,simpleSelector))return returnEl?Ext.get(target):target;depth++,target=target.parentNode}return null},findParentNode:function(simpleSelector,limit,returnEl){var p=Ext.fly(this.dom.parentNode,"_internal");return p?p.findParent(simpleSelector,limit,returnEl):null},up:function(simpleSelector,limit,returnDom){return this.findParentNode(simpleSelector,limit,!returnDom)},select:function(selector,composite){return Ext.dom.Element.select(selector,this.dom,composite)},query:function(selector){return Ext.DomQuery.select(selector,this.dom)},down:function(selector,returnDom){var n=Ext.DomQuery.selectNode(selector,this.dom);return returnDom?n:Ext.get(n)},child:function(selector,returnDom){var node,id,me=this;return id=Ext.id(me.dom),id=Ext.escapeId(id),node=Ext.DomQuery.selectNode("#"+id+" > "+selector,me.dom),returnDom?node:Ext.get(node)},parent:function(selector,returnDom){return this.matchNode("parentNode","parentNode",selector,returnDom)},next:function(selector,returnDom){return this.matchNode("nextSibling","nextSibling",selector,returnDom)},prev:function(selector,returnDom){return this.matchNode("previousSibling","previousSibling",selector,returnDom)},first:function(selector,returnDom){return this.matchNode("nextSibling","firstChild",selector,returnDom)},last:function(selector,returnDom){return this.matchNode("previousSibling","lastChild",selector,returnDom)},matchNode:function(dir,start,selector,returnDom){if(!this.dom)return null;for(var n=this.dom[start];n;){if(1==n.nodeType&&(!selector||Ext.DomQuery.is(n,selector)))return returnDom?n:Ext.get(n);n=n[dir]}return null},isAncestor:function(element){return this.self.isAncestor.call(this.self,this.dom,element)}});Ext.define("Ext.dom.AbstractElement",{requires:["Ext.EventManager","Ext.dom.AbstractElement_static","Ext.dom.AbstractElement_insertion","Ext.dom.AbstractElement_style","Ext.dom.AbstractElement_traversal"],trimRe:/^\s+|\s+$/g,whitespaceRe:/\s/,inheritableStatics:{trimRe:/^\s+|\s+$/g,whitespaceRe:/\s/,get:function(el){var cacheItem,docEl,dom,id,me=this,document=window.document,El=Ext.dom.Element;return el?(el.isFly&&(el=el.dom),"string"==typeof el?el==Ext.windowId?El.get(window):el==Ext.documentId?El.get(document):(cacheItem=Ext.cache[el])&&cacheItem.skipGarbageCollection?cacheItem.el:(dom=document.getElementById(el))?cacheItem&&cacheItem.el?Ext.updateCacheEntry(cacheItem,dom).el:new El(dom,!!cacheItem):null:el.tagName?((id=el.id)||(id=Ext.id(el)),cacheItem=Ext.cache[id],cacheItem&&cacheItem.el?Ext.updateCacheEntry(cacheItem,el).el:new El(el,!!cacheItem)):el instanceof me?(el!=me.docEl&&el!=me.winEl&&(id=el.id,(cacheItem=Ext.cache[id])&&Ext.updateCacheEntry(cacheItem,document.getElementById(id)||el.dom)),el):el.isComposite?el:Ext.isArray(el)?me.select(el):el===document?(me.docEl||(docEl=me.docEl=Ext.Object.chain(El.prototype),docEl.dom=document,docEl.el=docEl,docEl.id=Ext.id(document),me.addToCache(docEl)),me.docEl):el===window?(me.winEl||(me.winEl=Ext.Object.chain(El.prototype),me.winEl.dom=window,me.winEl.id=Ext.id(window),me.addToCache(me.winEl)),me.winEl):null):null},addToCache:function(el,id){return el&&Ext.addCacheEntry(id,el),el},addMethods:function(){this.override.apply(this,arguments)},mergeClsList:function(){var clsList,i,length,j,listLength,clsName,clsHash={},result=[],changed=!1,trimRe=this.trimRe,whitespaceRe=this.whitespaceRe;for(i=0,length=arguments.length;i<length;i++)if(clsList=arguments[i],Ext.isString(clsList)&&(clsList=clsList.replace(trimRe,"").split(whitespaceRe)),clsList)for(j=0,listLength=clsList.length;j<listLength;j++)clsName=clsList[j],clsHash[clsName]||(i&&(changed=!0),clsHash[clsName]=!0);for(clsName in clsHash)result.push(clsName);return result.changed=changed,result},removeCls:function(existingClsList,removeClsList){var i,length,clsName,clsHash={},result=[],changed=!1,whitespaceRe=this.whitespaceRe;if(existingClsList)for(Ext.isString(existingClsList)&&(existingClsList=existingClsList.replace(this.trimRe,"").split(whitespaceRe)),i=0,length=existingClsList.length;i<length;i++)clsHash[existingClsList[i]]=!0;if(removeClsList)for(Ext.isString(removeClsList)&&(removeClsList=removeClsList.split(whitespaceRe)),i=0,length=removeClsList.length;i<length;i++)clsName=removeClsList[i],clsHash[clsName]&&(changed=!0,delete clsHash[clsName]);for(clsName in clsHash)result.push(clsName);return result.changed=changed,result},VISIBILITY:1,DISPLAY:2,OFFSETS:3,ASCLASS:4},constructor:function(element,forceNew){var id,me=this,dom="string"==typeof element?document.getElementById(element):element;return me.el=me,dom?(id=dom.id,!forceNew&&id&&Ext.cache[id]?Ext.cache[id].el:(me.dom=dom,me.id=id||Ext.id(dom),void me.self.addToCache(me))):null},set:function(o,useSet){var attr,value,el=this.dom;for(attr in o)o.hasOwnProperty(attr)&&(value=o[attr],"style"==attr?this.applyStyles(value):"cls"==attr?el.className=value:!1!==useSet?void 0===value?el.removeAttribute(attr):el.setAttribute(attr,value):el[attr]=value);return this},defaultUnit:"px",is:function(simpleSelector){return Ext.DomQuery.is(this.dom,simpleSelector)},getValue:function(asNumber){var val=this.dom.value;return asNumber?parseInt(val,10):val},remove:function(){var me=this,dom=me.dom;me.isAnimate&&me.stopAnimation(),dom&&(Ext.removeNode(dom),delete me.dom)},contains:function(){var isXpc=function(el){var s;try{el=el.dom||el}catch(e){return!0}return"[xpconnect wrapped native prototype]"===(s=HTMLElement.prototype.toString.call(el))||"[object XULElement]"===s};return function(el){if(!el||Ext.isGecko3&&isXpc(el))return!1;var me=this,dom=el.dom||el;return dom===me.dom||Ext.dom.AbstractElement.isAncestor(me.dom,dom)}}(),getAttribute:function(name,ns){var dom=this.dom;return dom.getAttributeNS(ns,name)||dom.getAttribute(ns+":"+name)||dom.getAttribute(name)||dom[name]},update:function(html){return this.dom&&(this.dom.innerHTML=html),this},setHTML:function(html){return this.dom&&(this.dom.innerHTML=html),this},getHTML:function(){return this.dom?this.dom.innerHTML:""},hide:function(){return this.setVisible(!1),this},show:function(){return this.setVisible(!0),this},setVisible:function(visible,animate){var me=this,statics=me.self,mode=me.getVisibilityMode(),prefix=Ext.baseCSSPrefix;switch(mode){case statics.VISIBILITY:me.removeCls([prefix+"hidden-display",prefix+"hidden-offsets"]),me[visible?"removeCls":"addCls"](prefix+"hidden-visibility");break;case statics.DISPLAY:me.removeCls([prefix+"hidden-visibility",prefix+"hidden-offsets"]),me[visible?"removeCls":"addCls"](prefix+"hidden-display");break;case statics.OFFSETS:me.removeCls([prefix+"hidden-visibility",prefix+"hidden-display"]),me[visible?"removeCls":"addCls"](prefix+"hidden-offsets")}return me},getVisibilityMode:function(){var data=(this.$cache||this.getCache()).data,visMode=data.visibilityMode;return void 0===visMode&&(data.visibilityMode=visMode=this.self.DISPLAY),visMode},setVisibilityMode:function(mode){return(this.$cache||this.getCache()).data.visibilityMode=mode,this},getCache:function(){var me=this,id=me.dom.id||Ext.id(me.dom);return me.$cache=Ext.cache[id]||Ext.addCacheEntry(id,null,me.dom),me.$cache}},function(){var AbstractElement=this;Ext.getDetachedBody=function(){var detachedEl=AbstractElement.detachedBodyEl;return detachedEl||(detachedEl=document.createElement("div"),AbstractElement.detachedBodyEl=detachedEl=new AbstractElement.Fly(detachedEl),detachedEl.isDetachedBody=!0),detachedEl},Ext.getElementById=function(id){var detachedBodyEl,el=document.getElementById(id);return!el&&(detachedBodyEl=AbstractElement.detachedBodyEl)&&(el=detachedBodyEl.dom.querySelector("#"+Ext.escapeId(id))),el},Ext.get=function(el){return Ext.dom.Element.get(el)},this.addStatics({Fly:new Ext.Class({extend:AbstractElement,isFly:!0,constructor:function(dom){this.dom=dom,this.el=this},attach:function(dom){return this.dom=dom,this.$cache=dom&&dom.id?Ext.cache[dom.id]:null,this}}),_flyweights:{},fly:function(dom,named){var fly=null,_flyweights=AbstractElement._flyweights;return named=named||"_global",dom=Ext.getDom(dom),dom&&(fly=_flyweights[named]||(_flyweights[named]=new AbstractElement.Fly),fly.dom=dom,fly.$cache=dom.id?Ext.cache[dom.id]:null),fly}}),Ext.fly=function(){return AbstractElement.fly.apply(AbstractElement,arguments)},function(proto){proto.destroy=proto.remove,document.querySelector?proto.getById=function(id,asDom){var dom=document.getElementById(id)||this.dom.querySelector("#"+Ext.escapeId(id));return asDom?dom:dom?Ext.get(dom):null}:proto.getById=function(id,asDom){var dom=document.getElementById(id);return asDom?dom:dom?Ext.get(dom):null}}(this.prototype)});Ext.define("Ext.dom.Helper",function(){var ts="<table>",te="</table>",tbs=ts+"<tbody>",tbe="</tbody>"+te,detachedDiv=document.createElement("div"),bbValues=["BeforeBegin","previousSibling"],aeValues=["AfterEnd","nextSibling"],bb_ae_PositionHash={beforebegin:bbValues,afterend:aeValues},fullPositionHash={beforebegin:bbValues,afterend:aeValues,afterbegin:["AfterBegin","firstChild"],beforeend:["BeforeEnd","lastChild"]};return{extend:"Ext.dom.AbstractHelper",requires:["Ext.dom.AbstractElement"],tableRe:/^(?:table|thead|tbody|tr|td)$/i,tableElRe:/td|tr|tbody|thead/i,useDom:!1,createDom:function(o,parentNode){var el,useSet,attr,val,cn,i,l,doc=document;if(Ext.isArray(o))for(el=doc.createDocumentFragment(),i=0,l=o.length;i<l;i++)this.createDom(o[i],el);else if("string"==typeof o)el=doc.createTextNode(o);else{el=doc.createElement(o.tag||"div"),useSet=!!el.setAttribute;for(attr in o)this.confRe.test(attr)||(val=o[attr],"cls"==attr?el.className=val:useSet?el.setAttribute(attr,val):el[attr]=val);Ext.DomHelper.applyStyles(el,o.style),(cn=o.children||o.cn)?this.createDom(cn,el):o.html&&(el.innerHTML=o.html)}return parentNode&&parentNode.appendChild(el),el},ieTable:function(depth,openingTags,htmlContent,closingTags){detachedDiv.innerHTML=[openingTags,htmlContent,closingTags].join("");for(var ns,i=-1,el=detachedDiv;++i<depth;)el=el.firstChild;if(ns=el.nextSibling)for(ns=el,el=document.createDocumentFragment();ns;)nx=ns.nextSibling,el.appendChild(ns),ns=nx;return el},insertIntoTable:function(tag,where,destinationEl,html){var node,before,bb="beforebegin"==where,ab="afterbegin"==where,be="beforeend"==where,ae="afterend"==where;return"td"==tag&&(ab||be)||!this.tableElRe.test(tag)&&(bb||ae)?null:(before=bb?destinationEl:ae?destinationEl.nextSibling:ab?destinationEl.firstChild:null,(bb||ae)&&(destinationEl=destinationEl.parentNode),node="td"==tag||"tr"==tag&&(be||ab)?this.ieTable(4,"<table><tbody><tr>",html,"</tr></tbody></table>"):("tbody"==tag||"thead"==tag)&&(be||ab)||"tr"==tag&&(bb||ae)?this.ieTable(3,tbs,html,tbe):this.ieTable(2,ts,html,te),destinationEl.insertBefore(node,before),node)},createContextualFragment:function(html){var length,childNodes,fragment=document.createDocumentFragment();for(detachedDiv.innerHTML=html,childNodes=detachedDiv.childNodes,length=childNodes.length;length--;)fragment.appendChild(childNodes[0]);return fragment},applyStyles:function(el,styles){styles&&("function"==typeof styles&&(styles=styles.call()),"string"==typeof styles&&(styles=Ext.dom.Element.parseStyles(styles)),"object"==typeof styles&&Ext.fly(el,"_applyStyles").setStyle(styles))},createHtml:function(spec){return this.markup(spec)},doInsert:function(el,o,returnElement,pos,sibling,append){el=el.dom||Ext.getDom(el);var newNode;return this.useDom?(newNode=this.createDom(o,null),append?el.appendChild(newNode):("firstChild"==sibling?el:el.parentNode).insertBefore(newNode,el[sibling]||el)):newNode=this.insertHtml(pos,el,this.markup(o)),returnElement?Ext.get(newNode,!0):newNode},overwrite:function(el,html,returnElement){var newNode;if(el=Ext.getDom(el),html=this.markup(html),Ext.isIE&&this.tableRe.test(el.tagName)){for(;el.firstChild;)el.removeChild(el.firstChild);return html?(newNode=this.insertHtml("afterbegin",el,html),returnElement?Ext.get(newNode):newNode):null}return el.innerHTML=html,returnElement?Ext.get(el.firstChild):el.firstChild},insertHtml:function(where,el,html){var hashVal,range,rangeEl,setStart,frag;return where=where.toLowerCase(),el.insertAdjacentHTML?Ext.isIE&&this.tableRe.test(el.tagName)&&(frag=this.insertIntoTable(el.tagName.toLowerCase(),where,el,html))?frag:(hashVal=fullPositionHash[where])?(Ext.global.MSApp&&Ext.global.MSApp.execUnsafeLocalFunction?MSApp.execUnsafeLocalFunction(function(){el.insertAdjacentHTML(hashVal[0],html)}):el.insertAdjacentHTML(hashVal[0],html),el[hashVal[1]]):void Ext.Error.raise({sourceClass:"Ext.DomHelper",sourceMethod:"insertHtml",htmlToInsert:html,targetElement:el,msg:'Illegal insertion point reached: "'+where+'"'}):(3===el.nodeType&&(where="afterbegin"===where?"beforebegin":where,where="beforeend"===where?"afterend":where),range=Ext.supports.CreateContextualFragment?el.ownerDocument.createRange():void 0,setStart="setStart"+(this.endRe.test(where)?"After":"Before"),bb_ae_PositionHash[where]?(range?(range[setStart](el),frag=range.createContextualFragment(html)):frag=this.createContextualFragment(html),el.parentNode.insertBefore(frag,"beforebegin"==where?el:el.nextSibling),el[("beforebegin"==where?"previous":"next")+"Sibling"]):(rangeEl=("afterbegin"==where?"first":"last")+"Child",el.firstChild?(range?(range[setStart](el[rangeEl]),frag=range.createContextualFragment(html)):frag=this.createContextualFragment(html),"afterbegin"==where?el.insertBefore(frag,el.firstChild):el.appendChild(frag)):el.innerHTML=html,el[rangeEl]))},createTemplate:function(o){var html=this.markup(o);return new Ext.Template(html)}}}(),function(){Ext.ns("Ext.core"),Ext.DomHelper=Ext.core.DomHelper=new this});Ext.define("Ext.Template",{requires:["Ext.dom.Helper","Ext.util.Format"],inheritableStatics:{from:function(el,config){return el=Ext.getDom(el),new this(el.value||el.innerHTML,config||"")}},constructor:function(html){var value,me=this,args=arguments,buffer=[],i=0,length=args.length;if(me.initialConfig={},1===length&&Ext.isArray(html)&&(args=html,length=args.length),length>1)for(;i<length;i++)value=args[i],"object"==typeof value?(Ext.apply(me.initialConfig,value),Ext.apply(me,value)):buffer.push(value);else buffer.push(html);me.html=buffer.join(""),me.compiled&&me.compile()},isTemplate:!0,disableFormats:!1,re:/\{([\w\-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g,apply:function(values){function fn(m,name,format,args){return format&&useFormat?(args=args?[values[name]].concat(Ext.functionFactory("return ["+args+"];")()):[values[name]],"this."==format.substr(0,5)?tpl[format.substr(5)].apply(tpl,args):fm[format].apply(fm,args)):void 0!==values[name]?values[name]:""}var me=this,useFormat=!0!==me.disableFormats,fm=Ext.util.Format,tpl=me;return me.compiled?me.compiled(values).join(""):me.html.replace(me.re,fn)},applyOut:function(values,out){var me=this;return me.compiled?out.push.apply(out,me.compiled(values)):out.push(me.apply(values)),out},applyTemplate:function(){return this.apply.apply(this,arguments)},set:function(html,compile){var me=this;return me.html=html,me.compiled=null,compile?me.compile():me},compileARe:/\\/g,compileBRe:/(\r\n|\n)/g,compileCRe:/'/g,compile:function(){function fn(m,name,format,args){return format&&useFormat?(args=args?","+args:"",format="this."!=format.substr(0,5)?"fm."+format+"(":"this."+format.substr(5)+"("):(args="",format="(values['"+name+"'] == undefined ? '' : "),"',"+format+"values['"+name+"']"+args+") ,'"}var me=this,fm=Ext.util.Format,useFormat=!0!==me.disableFormats,body,bodyReturn;return bodyReturn=me.html.replace(me.compileARe,"\\\\").replace(me.compileBRe,"\\n").replace(me.compileCRe,"\\'").replace(me.re,fn),body="this.compiled = function(values){ return ['"+bodyReturn+"'];};",eval(body),me},insertFirst:function(el,values,returnElement){return this.doInsert("afterBegin",el,values,returnElement)},insertBefore:function(el,values,returnElement){return this.doInsert("beforeBegin",el,values,returnElement)},insertAfter:function(el,values,returnElement){return this.doInsert("afterEnd",el,values,returnElement)},append:function(el,values,returnElement){return this.doInsert("beforeEnd",el,values,returnElement)},doInsert:function(where,el,values,returnElement){var newNode=Ext.DomHelper.insertHtml(where,Ext.getDom(el),this.apply(values));return returnElement?Ext.get(newNode):newNode},overwrite:function(el,values,returnElement){var newNode=Ext.DomHelper.overwrite(Ext.getDom(el),this.apply(values));return returnElement?Ext.get(newNode):newNode}});Ext.define("Ext.XTemplateParser",{constructor:function(config){Ext.apply(this,config)},doTpl:Ext.emptyFn,parse:function(str){var index,stack,s,m,t,prev,frame,subMatch,begin,end,actions,prop,me=this,len=str.length,aliases={elseif:"elif"},topRe=me.topRe,actionsRe=me.actionsRe;for(me.level=0,me.stack=stack=[],index=0;index<len;index=end){if(topRe.lastIndex=index,!(m=topRe.exec(str))){me.doText(str.substring(index,len));break}if(begin=m.index,end=topRe.lastIndex,index<begin&&me.doText(str.substring(index,begin)),m[1])end=str.indexOf("%}",begin+2),me.doEval(str.substring(begin+2,end)),end+=2;else if(m[2])end=str.indexOf("]}",begin+2),me.doExpr(str.substring(begin+2,end)),end+=2;else if(m[3])me.doTag(m[3]);else if(m[4]){for(actions=null;null!==(subMatch=actionsRe.exec(m[4]));)(s=subMatch[2]||subMatch[3])&&(s=Ext.String.htmlDecode(s),t=subMatch[1],t=aliases[t]||t,actions=actions||{},prev=actions[t],"string"==typeof prev?actions[t]=[prev,s]:prev?actions[t].push(s):actions[t]=s);actions?actions.if?(me.doIf(actions.if,actions),stack.push({type:"if"})):actions.switch?(me.doSwitch(actions.switch,actions),stack.push({type:"switch"})):actions.case?me.doCase(actions.case,actions):actions.elif?me.doElseIf(actions.elif,actions):actions.for?(++me.level,(prop=me.propRe.exec(m[4]))&&(actions.propName=prop[1]||prop[2]),me.doFor(actions.for,actions),stack.push({type:"for",actions:actions})):actions.foreach?(++me.level,(prop=me.propRe.exec(m[4]))&&(actions.propName=prop[1]||prop[2]),me.doForEach(actions.foreach,actions),stack.push({type:"foreach",actions:actions})):actions.exec&&(me.doExec(actions.exec,actions),stack.push({type:"exec",actions:actions})):me.elseRe.test(m[4])?me.doElse():me.defaultRe.test(m[4])?me.doDefault():(me.doTpl(),stack.push({type:"tpl"}))}else 5===m[0].length?stack.push({type:"tpl"}):(frame=stack.pop(),me.doEnd(frame.type,frame.actions),"for"!=frame.type&&"foreach"!=frame.type||--me.level)}},topRe:/(?:(\{\%)|(\{\[)|\{([^{}]+)\})|(?:<tpl([^>]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|foreach|exec|switch|case|eval|between)\s*\=\s*(?:(?:"([^"]*)")|(?:'([^']*)'))\s*/g,propRe:/prop=(?:(?:"([^"]*)")|(?:'([^']*)'))/,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/});Ext.define("Ext.XTemplateCompiler",{extend:"Ext.XTemplateParser",useEval:Ext.isGecko,useIndex:Ext.isIE8m,useFormat:!0,propNameRe:/^[\w\d\$]*$/,compile:function(tpl){var me=this,code=me.generate(tpl);return me.useEval?me.evalTpl(code):new Function("Ext",code)(Ext)},generate:function(tpl){var code,me=this,definitions="var fm=Ext.util.Format,ts=Object.prototype.toString;";return me.maxLevel=0,me.body=["var c0=values, a0="+me.createArrayTest(0)+", p0=parent, n0=xcount, i0=xindex, k0, v;\n"],me.definitions?"string"==typeof me.definitions?me.definitions=[me.definitions,definitions]:me.definitions.push(definitions):me.definitions=[definitions],me.switches=[],me.parse(tpl),me.definitions.push((me.useEval?"$=":"return")+" function ("+me.fnArgs+") {",me.body.join(""),"}"),code=me.definitions.join("\n"),me.definitions.length=me.body.length=me.switches.length=0,delete me.definitions,delete me.body,delete me.switches,code},doText:function(text){var me=this,out=me.body;text=text.replace(me.aposRe,"\\'").replace(me.newLineRe,"\\n"),me.useIndex?out.push("out[out.length]='",text,"'\n"):out.push("out.push('",text,"')\n")},doExpr:function(expr){var out=this.body;out.push("if ((v="+expr+") != null) out"),this.useIndex?out.push("[out.length]=v+''\n"):out.push(".push(v+'')\n")},doTag:function(tag){var expr=this.parseTag(tag);expr?this.doExpr(expr):this.doText("{"+tag+"}")},doElse:function(){this.body.push("} else {\n")},doEval:function(text){this.body.push(text,"\n")},doIf:function(action,actions){var me=this;"."===action?me.body.push("if (values) {\n"):me.propNameRe.test(action)?me.body.push("if (",me.parseTag(action),") {\n"):me.body.push("if (",me.addFn(action),me.callFn,") {\n"),actions.exec&&me.doExec(actions.exec)},doElseIf:function(action,actions){var me=this;"."===action?me.body.push("else if (values) {\n"):me.propNameRe.test(action)?me.body.push("} else if (",me.parseTag(action),") {\n"):me.body.push("} else if (",me.addFn(action),me.callFn,") {\n"),actions.exec&&me.doExec(actions.exec)},doSwitch:function(action){var me=this;"."===action?me.body.push("switch (values) {\n"):me.propNameRe.test(action)?me.body.push("switch (",me.parseTag(action),") {\n"):me.body.push("switch (",me.addFn(action),me.callFn,") {\n"),me.switches.push(0)},doCase:function(action){var match,i,me=this,cases=Ext.isArray(action)?action:[action],n=me.switches.length-1;for(me.switches[n]?me.body.push("break;\n"):me.switches[n]++,i=0,n=cases.length;i<n;++i)match=me.intRe.exec(cases[i]),cases[i]=match?match[1]:"'"+cases[i].replace(me.aposRe,"\\'")+"'";me.body.push("case ",cases.join(": case "),":\n")},doDefault:function(){var me=this,n=me.switches.length-1;me.switches[n]?me.body.push("break;\n"):me.switches[n]++,me.body.push("default:\n")},doEnd:function(type,actions){var me=this,L=me.level-1;"for"==type||"foreach"==type?(actions.exec&&me.doExec(actions.exec),me.body.push("}\n"),me.body.push("parent=p",L,";values=r",L+1,";xcount=n"+L+";xindex=i",L,"+1;xkey=k",L,";\n")):"if"!=type&&"switch"!=type||me.body.push("}\n")},doFor:function(action,actions){var s,parentAssignment,me=this,L=me.level,up=L-1;s="."===action?"values":me.propNameRe.test(action)?me.parseTag(action):me.addFn(action)+me.callFn,me.maxLevel<L&&(me.maxLevel=L,me.body.push("var ")),parentAssignment="."==action?"c"+L:"a"+up+"?c"+up+"[i"+up+"]:c"+up,me.body.push("i",L,"=0,n",L,"=0,c",L,"=",s,",a",L,"=",me.createArrayTest(L),",r",L,"=values,p",L,",k",L,";\n","p",L,"=parent=",parentAssignment,"\n","if (c",L,"){if(a",L,"){n",L,"=c",L,".length;}else if (c",L,".isMixedCollection){c",L,"=c",L,".items;n",L,"=c",L,".length;}else if(c",L,".isStore){c",L,"=c",L,".data.items;n",L,"=c",L,".length;}else{c",L,"=[c",L,"];n",L,"=1;}}\n","for (xcount=n",L,";i",L,"<n"+L+";++i",L,"){\n","values=c",L,"[i",L,"]"),actions.propName&&me.body.push(".",actions.propName),me.body.push("\n","xindex=i",L,"+1\n"),actions.between&&me.body.push('if(xindex>1){ out.push("',actions.between,'"); } \n')},doForEach:function(action,actions){var s,parentAssignment,me=this,L=me.level,up=L-1;s="."===action?"values":me.propNameRe.test(action)?me.parseTag(action):me.addFn(action)+me.callFn,me.maxLevel<L&&(me.maxLevel=L,me.body.push("var ")),parentAssignment="."==action?"c"+L:"a"+up+"?c"+up+"[i"+up+"]:c"+up,me.body.push("i",L,"=-1,n",L,"=0,c",L,"=",s,",a",L,"=",me.createArrayTest(L),",r",L,"=values,p",L,",k",L,";\n","p",L,"=parent=",parentAssignment,"\n","for(k",L," in c",L,"){\n","xindex=++i",L,"+1;\n","xkey=k",L,";\n","values=c",L,"[k",L,"];"),actions.propName&&me.body.push(".",actions.propName),actions.between&&me.body.push('if(xindex>1){ out.push("',actions.between,'"); } \n')},createArrayTest:"isArray"in Array?function(L){return"Array.isArray(c"+L+")"}:function(L){return"ts.call(c"+L+')==="[object Array]"'},doExec:function(action,actions){var me=this,name="f"+me.definitions.length;me.definitions.push("function "+name+"("+me.fnArgs+") {"," try { with(values) {","  "+action," }} catch(e) {",'Ext.log("XTemplate Error: " + e.message);',"}","}"),me.body.push(name+me.callFn+"\n")},addFn:function(body){var me=this,name="f"+me.definitions.length;return"."===body?me.definitions.push("function "+name+"("+me.fnArgs+") {"," return values","}"):".."===body?me.definitions.push("function "+name+"("+me.fnArgs+") {"," return parent","}"):me.definitions.push("function "+name+"("+me.fnArgs+") {"," try { with(values) {","  return("+body+")"," }} catch(e) {",'Ext.log("XTemplate Error: " + e.message);',"}","}"),name},parseTag:function(tag){var name,format,args,math,v,me=this,m=me.tagRe.exec(tag);return m?(name=m[1],format=m[2],args=m[3],math=m[4],"."==name?(me.validTypes||(me.definitions.push("var validTypes={string:1,number:1,boolean:1};"),me.validTypes=!0),v='validTypes[typeof values] || ts.call(values) === "[object Date]" ? values : ""'):v="#"==name?"xindex":"$"==name?"xkey":"parent."==name.substr(0,7)?name:isNaN(name)&&-1==name.indexOf("-")&&-1!=name.indexOf(".")?"values."+name:"values['"+name+"']",math&&(v="("+v+math+")"),format&&me.useFormat?(args=args?","+args:"","this."!=format.substr(0,5)?format="fm."+format+"(":format+="(",format+v+args+")"):v):null},evalTpl:function($){return eval($),$},newLineRe:/\r\n|\r|\n/g,aposRe:/[']/g,intRe:/^\s*(\d+)\s*$/,tagRe:/^([\w-\.\#\$]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?$/},function(){var proto=this.prototype;proto.fnArgs="out,values,parent,xindex,xcount,xkey",proto.callFn=".call(this,"+proto.fnArgs+")"});Ext.define("Ext.XTemplate",{extend:"Ext.Template",requires:"Ext.XTemplateCompiler",emptyObj:{},apply:function(values,parent){return this.applyOut(values,[],parent).join("")},applyOut:function(values,out,parent){var compiler,me=this;me.fn||(compiler=new Ext.XTemplateCompiler({useFormat:!0!==me.disableFormats,definitions:me.definitions}),me.fn=compiler.compile(me.html));try{me.fn(out,values,parent||me.emptyObj,1,1)}catch(e){Ext.log("Error: "+e.message)}return out},compile:function(){return this},statics:{getTpl:function(instance,name){var owner,tpl=instance[name];if(tpl&&!tpl.isTemplate){if(tpl=Ext.ClassManager.dynInstantiate("Ext.XTemplate",tpl),instance.hasOwnProperty(name))owner=instance;else for(owner=instance.self.prototype;owner&&!owner.hasOwnProperty(name);owner=owner.superclass);owner[name]=tpl,tpl.owner=owner}return tpl||null}}});Ext.ns("Ext.core"),Ext.dom.Query=Ext.core.DomQuery=Ext.DomQuery=function(){function children(parent){for(var nextNode,n=parent.firstChild,nodeIndex=-1;n;)nextNode=n.nextSibling,3!=n.nodeType||nonSpace.test(n.nodeValue)?n.nodeIndex=++nodeIndex:parent.removeChild(n),n=nextNode;return this}function attrValue(n,attr){return n.tagName||void 0===n.length||(n=n[0]),n?"for"==attr?n.htmlFor:"class"==attr||"className"==attr?n.className:n.getAttribute(attr)||n[attr]:null}function getNodes(ns,mode,tagName){var cs,i,ni,j,ci,cn,utag,n,cj,result=[],ri=-1;if(!ns)return result;if(tagName=tagName.replace("|",":")||"*",void 0!==ns.getElementsByTagName&&(ns=[ns]),mode){if("/"==mode||">"==mode)for(utag=tagName.toUpperCase(),i=0;ni=ns[i];i++)for(cn=ni.childNodes,j=0;cj=cn[j];j++)cj.nodeName!=utag&&cj.nodeName!=tagName&&"*"!=tagName||(result[++ri]=cj);else if("+"==mode)for(utag=tagName.toUpperCase(),i=0;n=ns[i];i++){for(;(n=n.nextSibling)&&1!=n.nodeType;);!n||n.nodeName!=utag&&n.nodeName!=tagName&&"*"!=tagName||(result[++ri]=n)}else if("~"==mode)for(utag=tagName.toUpperCase(),i=0;n=ns[i];i++)for(;n=n.nextSibling;)n.nodeName!=utag&&n.nodeName!=tagName&&"*"!=tagName||(result[++ri]=n)}else if(tagName=unescapeCssSelector(tagName),!supportsColonNsSeparator&&DQ.isXml(ns[0])&&-1!==tagName.indexOf(":"))for(i=0;ni=ns[i];i++)for(cs=ni.getElementsByTagName(tagName.split(":").pop()),j=0;ci=cs[j];j++)ci.tagName===tagName&&(result[++ri]=ci);else for(i=0;ni=ns[i];i++)for(cs=ni.getElementsByTagName(tagName),j=0;ci=cs[j];j++)result[++ri]=ci;return result}function concat(a,b){return a.push.apply(a,b),a}function byTag(cs,tagName){if((cs.tagName||cs===doc)&&(cs=[cs]),!tagName)return cs;var i,ci,result=[],ri=-1;for(tagName=tagName.toLowerCase(),i=0;ci=cs[i];i++)1==ci.nodeType&&ci.tagName.toLowerCase()==tagName&&(result[++ri]=ci);return result}function byId(cs,id){if(id=unescapeCssSelector(id),(cs.tagName||cs===doc)&&(cs=[cs]),!id)return cs;var i,ci,result=[],ri=-1;for(i=0;ci=cs[i];i++)if(ci&&ci.id==id)return result[++ri]=ci,result;return result}function byAttribute(cs,attr,value,op,custom){var a,xml,hasXml,i,ci,result=[],ri=-1,useGetStyle="{"==custom,fn=DQ.operators[op];for(value=unescapeCssSelector(value),i=0;ci=cs[i];i++)1===ci.nodeType&&(hasXml||(xml=DQ.isXml(ci),hasXml=!0),a=xml?ci.getAttribute(attr):useGetStyle?DQ.getStyle(ci,attr):"class"==attr||"className"==attr?ci.className:"for"==attr?ci.htmlFor:"href"==attr?ci.getAttribute("href",2):ci.getAttribute(attr),(fn&&fn(a,value)||!fn&&a)&&(result[++ri]=ci));return result}function byPseudo(cs,name,value){return value=unescapeCssSelector(value),DQ.pseudos[name](cs,value)}function nodupIEXml(cs){var r,i,len,c,d=++key;for(cs[0].setAttribute("_nodup",d),r=[cs[0]],i=1,len=cs.length;i<len;i++)c=cs[i],!c.getAttribute("_nodup")!=d&&(c.setAttribute("_nodup",d),r[r.length]=c);for(i=0,len=cs.length;i<len;i++)cs[i].removeAttribute("_nodup");return r}function nodup(cs){if(!cs)return[];var c,i,cj,d,j,len=cs.length,r=cs,ri=-1;if(!len||void 0!==cs.nodeType||1==len)return cs;if(isIE&&void 0!==cs[0].selectSingleNode)return nodupIEXml(cs);for(d=++key,cs[0]._nodup=d,i=1;c=cs[i];i++){if(c._nodup==d){for(r=[],j=0;j<i;j++)r[++ri]=cs[j];for(j=i+1;cj=cs[j];j++)cj._nodup!=d&&(cj._nodup=d,r[++ri]=cj);return r}c._nodup=d}return r}function quickDiffIEXml(c1,c2){var i,len,d=++key,r=[];for(i=0,len=c1.length;i<len;i++)c1[i].setAttribute("_qdiff",d);for(i=0,len=c2.length;i<len;i++)c2[i].getAttribute("_qdiff")!=d&&(r[r.length]=c2[i]);for(i=0,len=c1.length;i<len;i++)c1[i].removeAttribute("_qdiff");return r}function quickDiff(c1,c2){var i,len,len1=c1.length,d=++key,r=[];if(!len1)return c2;if(isIE&&void 0!==c1[0].selectSingleNode)return quickDiffIEXml(c1,c2);for(i=0;i<len1;i++)c1[i]._qdiff=d;for(i=0,len=c2.length;i<len;i++)c2[i]._qdiff!=d&&(r[r.length]=c2[i]);return r}function quickId(ns,mode,root,id){if(ns==root){id=unescapeCssSelector(id);return(root.ownerDocument||root).getElementById(id)}return ns=getNodes(ns,mode,"*"),byId(ns,id)}var DQ,doc=document,cache={},simpleCache={},valueCache={},useClassList=!!doc.documentElement.classList,useElementPointer=!!doc.documentElement.firstElementChild,useChildrenCollection=function(){var d=doc.createElement("div");return d.innerHTML="\x3c!-- --\x3etext\x3c!-- --\x3e",d.children&&0===d.children.length}(),nonSpace=/\S/,trimRe=/^\s+|\s+$/g,tplRe=/\{(\d+)\}/g,modeRe=/^(\s?[\/>+~]\s?|\s|$)/,tagTokenRe=/^(#)?([\w\-\*\|\\]+)/,nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/,startIdRe=/^\s*#/,isIE=!!window.ActiveXObject,key=30803,longHex=/\\([0-9a-fA-F]{6})/g,shortHex=/\\([0-9a-fA-F]{1,6})\s{0,1}/g,nonHex=/\\([^0-9a-fA-F]{1})/g,escapes=/\\/g,num,hasEscapes,supportsColonNsSeparator=function(){var xmlDoc,xmlString='<r><a:b xmlns:a="n"></a:b></r>';return window.DOMParser?xmlDoc=(new DOMParser).parseFromString(xmlString,"application/xml"):(xmlDoc=new ActiveXObject("Microsoft.XMLDOM"),xmlDoc.loadXML(xmlString)),!!xmlDoc.getElementsByTagName("a:b").length}(),longHexToChar=function($0,$1){return String.fromCharCode(parseInt($1,16))},shortToLongHex=function($0,$1){for(;$1.length<6;)$1="0"+$1;return"\\"+$1},charToLongHex=function($0,$1){return num=$1.charCodeAt(0).toString(16),1===num.length&&(num="0"+num),"\\0000"+num},unescapeCssSelector=function(selector){return hasEscapes?selector.replace(longHex,longHexToChar):selector},setupEscapes=function(path){return hasEscapes=path.indexOf("\\")>-1,hasEscapes&&(path=path.replace(shortHex,shortToLongHex).replace(nonHex,charToLongHex).replace(escapes,"\\\\")),path};return eval("var batch = 30803, child, next, prev, byClassName;"),child=useChildrenCollection?function(parent,index){return parent.children[index]}:function(parent,index){for(var i=0,n=parent.firstChild;n;){if(1==n.nodeType&&++i==index)return n;n=n.nextSibling}return null},next=useElementPointer?function(n){return n.nextElementSibling}:function(n){for(;(n=n.nextSibling)&&1!=n.nodeType;);return n},prev=useElementPointer?function(n){return n.previousElementSibling}:function(n){for(;(n=n.previousSibling)&&1!=n.nodeType;);return n},byClassName=useClassList?function(nodeSet,cls){if(!(cls=unescapeCssSelector(cls)))return nodeSet;var i,ci,classList,result=[],ri=-1;for(i=0;ci=nodeSet[i];i++)classList=ci.classList,classList?classList.contains(cls)&&(result[++ri]=ci):-1!==(" "+ci.className+" ").indexOf(cls)&&(result[++ri]=ci);return result}:function(nodeSet,cls){if(!(cls=unescapeCssSelector(cls)))return nodeSet;var i,ci,result=[],ri=-1;for(i=0;ci=nodeSet[i];i++)-1!==(" "+ci.className+" ").indexOf(cls)&&(result[++ri]=ci);return result},DQ={getStyle:function(el,name){return Ext.fly(el,"_DomQuery").getStyle(name)},compile:function(path,type){type=type||"select";var fn=["var f = function(root) {\n var mode; ++batch; var n = root || document;\n"],lastPath,matchers=DQ.matchers,matchersLn=matchers.length,modeMatch,lmode=path.match(modeRe),tokenMatch,matched,j,t,m;for(path=setupEscapes(path),lmode&&lmode[1]&&(fn[fn.length]='mode="'+lmode[1].replace(trimRe,"")+'";',path=path.replace(lmode[1],""));"/"==path.substr(0,1);)path=path.substr(1);for(;path&&lastPath!=path;){for(lastPath=path,tokenMatch=path.match(tagTokenRe),"select"==type?tokenMatch?("#"==tokenMatch[1]?fn[fn.length]='n = quickId(n, mode, root, "'+tokenMatch[2]+'");':fn[fn.length]='n = getNodes(n, mode, "'+tokenMatch[2]+'");',path=path.replace(tokenMatch[0],"")):"@"!=path.substr(0,1)&&(fn[fn.length]='n = getNodes(n, mode, "*");'):tokenMatch&&("#"==tokenMatch[1]?fn[fn.length]='n = byId(n, "'+tokenMatch[2]+'");':fn[fn.length]='n = byTag(n, "'+tokenMatch[2]+'");',path=path.replace(tokenMatch[0],""));!(modeMatch=path.match(modeRe));){for(matched=!1,j=0;j<matchersLn;j++)if(t=matchers[j],m=path.match(t.re)){fn[fn.length]=t.select.replace(tplRe,function(x,i){return m[i]}),path=path.replace(m[0],""),matched=!0;break}matched||Ext.Error.raise({sourceClass:"Ext.DomQuery",sourceMethod:"compile",msg:'Error parsing selector. Parsing failed at "'+path+'"'})}modeMatch[1]&&(fn[fn.length]='mode="'+modeMatch[1].replace(trimRe,"")+'";',path=path.replace(modeMatch[1],""))}return fn[fn.length]="return nodup(n);\n}",eval(fn.join("")),f},jsSelect:function(path,root,type){"string"==typeof(root=root||doc)&&(root=doc.getElementById(root));var i,len,subPath,result,paths=path.split(","),results=[];for(i=0,len=paths.length;i<len;i++)subPath=paths[i].replace(trimRe,""),cache[subPath]?setupEscapes(subPath):(cache[subPath]=DQ.compile(subPath,type),cache[subPath]||Ext.Error.raise({sourceClass:"Ext.DomQuery",sourceMethod:"jsSelect",msg:subPath+" is not a valid selector"})),(result=cache[subPath](root))&&result!==doc&&(results=results.concat(result));return paths.length>1?nodup(results):results},isXml:function(el){var docEl=(el?el.ownerDocument||el:0).documentElement;return!!docEl&&"HTML"!==docEl.nodeName},select:doc.querySelectorAll?function(path,root,type,single){if(root=root||doc,!DQ.isXml(root))try{return root.parentNode&&9!==root.nodeType&&-1===path.indexOf(",")&&!startIdRe.test(path)&&(path="#"+Ext.escapeId(Ext.id(root))+" "+path,root=root.parentNode),single?[root.querySelector(path)]:Ext.Array.toArray(root.querySelectorAll(path))}catch(e){}return DQ.jsSelect.call(this,path,root,type)}:function(path,root,type){return DQ.jsSelect.call(this,path,root,type)},selectNode:function(path,root){return Ext.DomQuery.select(path,root,null,!0)[0]},selectValue:function(path,root,defaultValue){path=path.replace(trimRe,""),valueCache[path]?setupEscapes(path):valueCache[path]=DQ.compile(path,"select");var v,n=valueCache[path](root);return n=n[0]?n[0]:n,"function"==typeof n.normalize&&n.normalize(),v=n&&n.firstChild?n.firstChild.nodeValue:null,null===v||void 0===v||""===v?defaultValue:v},selectNumber:function(path,root,defaultValue){var v=DQ.selectValue(path,root,defaultValue||0);return parseFloat(v)},is:function(el,ss){"string"==typeof el&&(el=doc.getElementById(el));var isArray=Ext.isArray(el),result=DQ.filter(isArray?el:[el],ss);return isArray?result.length==el.length:result.length>0},filter:function(els,ss,nonMatches){ss=ss.replace(trimRe,""),simpleCache[ss]?setupEscapes(ss):simpleCache[ss]=DQ.compile(ss,"simple");var result=simpleCache[ss](els);return nonMatches?quickDiff(result,els):result},matchers:[{re:/^\.([\w\-\\]+)/,select:useClassList?'n = byClassName(n, "{1}");':'n = byClassName(n, " {1} ");'},{re:/^\:([\w\-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,select:'n = byPseudo(n, "{1}", "{2}");'},{re:/^(?:([\[\{])(?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,select:'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'},{re:/^#([\w\-\\]+)/,select:'n = byId(n, "{1}");'},{re:/^@([\w\-\.]+)/,select:'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'}],operators:{"=":function(a,v){return a==v},"!=":function(a,v){return a!=v},"^=":function(a,v){return a&&a.substr(0,v.length)==v},"$=":function(a,v){return a&&a.substr(a.length-v.length)==v},"*=":function(a,v){return a&&-1!==a.indexOf(v)},"%=":function(a,v){return a%v==0},"|=":function(a,v){return a&&(a==v||a.substr(0,v.length+1)==v+"-")},"~=":function(a,v){return a&&-1!=(" "+a+" ").indexOf(" "+v+" ")}},pseudos:{"first-child":function(c){var n,i,ci,r=[],ri=-1;for(i=0;ci=n=c[i];i++){for(;(n=n.previousSibling)&&1!=n.nodeType;);n||(r[++ri]=ci)}return r},"last-child":function(c){var n,i,ci,r=[],ri=-1;for(i=0;ci=n=c[i];i++){for(;(n=n.nextSibling)&&1!=n.nodeType;);n||(r[++ri]=ci)}return r},"nth-child":function(c,a){var i,n,j,cn,pn,r=[],ri=-1,m=nthRe.exec("even"==a&&"2n"||"odd"==a&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a),f=(m[1]||1)-0,l=m[2]-0;for(i=0;n=c[i];i++){if(pn=n.parentNode,batch!=pn._batch){for(j=0,cn=pn.firstChild;cn;cn=cn.nextSibling)1==cn.nodeType&&(cn.nodeIndex=++j);pn._batch=batch}1==f?0!==l&&n.nodeIndex!=l||(r[++ri]=n):(n.nodeIndex+l)%f==0&&(r[++ri]=n)}return r},"only-child":function(c){var i,ci,r=[],ri=-1;for(i=0;ci=c[i];i++)prev(ci)||next(ci)||(r[++ri]=ci);return r},empty:function(c){var i,ci,cns,j,cn,empty,r=[],ri=-1;for(i=0;ci=c[i];i++){for(cns=ci.childNodes,j=0,empty=!0;cn=cns[j];)if(++j,1==cn.nodeType||3==cn.nodeType){empty=!1;break}empty&&(r[++ri]=ci)}return r},contains:function(c,v){var i,ci,r=[],ri=-1;for(i=0;ci=c[i];i++)-1!=(ci.textContent||ci.innerText||ci.text||"").indexOf(v)&&(r[++ri]=ci);return r},nodeValue:function(c,v){var i,ci,r=[],ri=-1;for(i=0;ci=c[i];i++)ci.firstChild&&ci.firstChild.nodeValue==v&&(r[++ri]=ci);return r},checked:function(c){var i,ci,r=[],ri=-1;for(i=0;ci=c[i];i++)!0===ci.checked&&(r[++ri]=ci);return r},not:function(c,ss){return DQ.filter(c,ss,!0)},any:function(c,selectors){var s,i,ci,j,ss=selectors.split("|"),r=[],ri=-1;for(i=0;ci=c[i];i++)for(j=0;s=ss[j];j++)if(DQ.is(ci,s)){r[++ri]=ci;break}return r},odd:function(c){return this["nth-child"](c,"odd")},even:function(c){return this["nth-child"](c,"even")},nth:function(c,a){return c[a-1]||[]},first:function(c){return c[0]||[]},last:function(c){return c[c.length-1]||[]},has:function(c,ss){var i,ci,s=DQ.select,r=[],ri=-1;for(i=0;ci=c[i];i++)s(ss,ci).length>0&&(r[++ri]=ci);return r},next:function(c,ss){var i,ci,n,is=DQ.is,r=[],ri=-1;for(i=0;ci=c[i];i++)(n=next(ci))&&is(n,ss)&&(r[++ri]=ci);return r},prev:function(c,ss){var i,ci,n,is=DQ.is,r=[],ri=-1;for(i=0;ci=c[i];i++)(n=prev(ci))&&is(n,ss)&&(r[++ri]=ci);return r},focusable:function(candidates){for(var c,len=candidates.length,results=[],i=0;i<len;i++)c=candidates[i],Ext.fly(c,"_DomQuery").isFocusable()&&results.push(c);return results},visible:function(candidates,deep){for(var c,len=candidates.length,results=[],i=0;i<len;i++)c=candidates[i],Ext.fly(c,"_DomQuery").isVisible(deep)&&results.push(c);return results}}}}(),Ext.query=Ext.DomQuery.select;Ext.define("Ext.dom.Element_anim",{override:"Ext.dom.Element",animate:function(config){var listeners,anim,end,me=this,animId=me.dom.id||Ext.id(me.dom);return Ext.fx.Manager.hasFxBlock(animId)||(config.listeners&&(listeners=config.listeners,delete config.listeners),config.internalListeners&&(config.listeners=config.internalListeners,delete config.internalListeners),end=config.autoEnd,delete config.autoEnd,anim=new Ext.fx.Anim(me.anim(config)),listeners&&anim.on(listeners),Ext.fx.Manager.queueFx(anim),end&&anim.jumpToEnd()),me},anim:function(config){if(!Ext.isObject(config))return!!config&&{};var animConfig,me=this,duration=config.duration||Ext.fx.Anim.prototype.duration,easing=config.easing||"ease";return config.stopAnimation&&me.stopAnimation(),Ext.applyIf(config,Ext.fx.Manager.getFxDefaults(me.id)),Ext.fx.Manager.setFxDefaults(me.id,{delay:0}),animConfig={target:me.dom,remove:config.remove,alternate:config.alternate||!1,duration:duration,easing:easing,callback:config.callback,listeners:config.listeners,iterations:config.iterations||1,scope:config.scope,block:config.block,concurrent:config.concurrent,delay:config.delay||0,paused:!0,keyframes:config.keyframes,from:config.from||{},to:Ext.apply({},config)},Ext.apply(animConfig.to,config.to),delete animConfig.to.to,delete animConfig.to.from,delete animConfig.to.remove,delete animConfig.to.alternate,delete animConfig.to.keyframes,delete animConfig.to.iterations,delete animConfig.to.listeners,delete animConfig.to.target,delete animConfig.to.paused,delete animConfig.to.callback,delete animConfig.to.scope,delete animConfig.to.duration,delete animConfig.to.easing,delete animConfig.to.concurrent,delete animConfig.to.block,delete animConfig.to.stopAnimation,delete animConfig.to.delay,animConfig},slideIn:function(anchor,obj,slideOut){var beforeAnim,wrapAnim,restoreScroll,wrapDomParentNode,me=this,dom=me.dom,elStyle=dom.style;return anchor=anchor||"t",obj=obj||{},beforeAnim=function(){var box,originalStyles,anim,wrap,animScope=this,listeners=obj.listeners,el=Ext.fly(dom,"_anim");switch(slideOut||el.fixDisplay(),box=el.getBox(),"t"!=anchor&&"b"!=anchor||0!==box.height?"l"!=anchor&&"r"!=anchor||0!==box.width||(box.width=dom.scrollWidth):box.height=dom.scrollHeight,originalStyles=el.getStyles("width","height","left","right","top","bottom","position","z-index",!0),el.setSize(box.width,box.height),obj.preserveScroll&&(restoreScroll=el.cacheScrollValues()),wrap=el.wrap({role:"presentation",id:Ext.id()+"-anim-wrap-for-"+el.dom.id,style:{visibility:slideOut?"visible":"hidden"}}),wrapDomParentNode=wrap.dom.parentNode,wrap.setPositioning(el.getPositioning(!0)),wrap.isStyle("position","static")&&wrap.position("relative"),el.clearPositioning("auto"),wrap.clip(),restoreScroll&&restoreScroll(),el.setStyle({visibility:"",position:"absolute"}),slideOut&&wrap.setSize(box.width,box.height),anchor){case"t":anim={from:{width:box.width+"px",height:"0px"},to:{width:box.width+"px",height:box.height+"px"}},elStyle.bottom="0px";break;case"l":anim={from:{width:"0px",height:box.height+"px"},to:{width:box.width+"px",height:box.height+"px"}},me.anchorAnimX(anchor);break;case"r":anim={from:{x:box.x+box.width,width:"0px",height:box.height+"px"},to:{x:box.x,width:box.width+"px",height:box.height+"px"}},me.anchorAnimX(anchor);break;case"b":anim={from:{y:box.y+box.height,width:box.width+"px",height:"0px"},to:{y:box.y,width:box.width+"px",height:box.height+"px"}};break;case"tl":anim={from:{x:box.x,y:box.y,width:"0px",height:"0px"},to:{width:box.width+"px",height:box.height+"px"}},elStyle.bottom="0px",me.anchorAnimX("l");break;case"bl":anim={from:{y:box.y+box.height,width:"0px",height:"0px"},to:{y:box.y,width:box.width+"px",height:box.height+"px"}},me.anchorAnimX("l");break;case"br":anim={from:{x:box.x+box.width,y:box.y+box.height,width:"0px",height:"0px"},to:{x:box.x,y:box.y,width:box.width+"px",height:box.height+"px"}},me.anchorAnimX("r");break;case"tr":anim={from:{x:box.x+box.width,width:"0px",height:"0px"},to:{x:box.x,width:box.width+"px",height:box.height+"px"}},elStyle.bottom="0px",me.anchorAnimX("r")}wrap.show(),wrapAnim=Ext.apply({},obj),delete wrapAnim.listeners,wrapAnim=new Ext.fx.Anim(Ext.applyIf(wrapAnim,{target:wrap,duration:500,easing:"ease-out",from:slideOut?anim.to:anim.from,to:slideOut?anim.from:anim.to})),wrapAnim.on("afteranimate",function(){var el=Ext.fly(dom,"_anim");el.setStyle(originalStyles),slideOut&&(obj.useDisplay?el.setDisplayed(!1):el.hide()),wrap.dom&&(wrap.dom.parentNode?wrap.dom.parentNode.insertBefore(el.dom,wrap.dom):wrapDomParentNode.appendChild(el.dom),wrap.remove()),restoreScroll&&restoreScroll(),animScope.end()}),listeners&&wrapAnim.on(listeners)},me.animate({duration:obj.duration?2*Math.max(obj.duration,500):1e3,listeners:{beforeanimate:beforeAnim}}),me},slideOut:function(anchor,o){return this.slideIn(anchor,o,!0)},puff:function(obj){var beforeAnim,me=this,dom=me.dom,box=me.getBox(),originalStyles=me.getStyles("width","height","left","right","top","bottom","position","z-index","font-size","opacity",!0);return obj=Ext.applyIf(obj||{},{easing:"ease-out",duration:500,useDisplay:!1}),beforeAnim=function(){var el=Ext.fly(dom,"_anim");el.clearOpacity(),el.show(),this.to={width:2*box.width,height:2*box.height,x:box.x-box.width/2,y:box.y-box.height/2,opacity:0,fontSize:"200%"},this.on("afteranimate",function(){var el=Ext.fly(dom,"_anim");el&&(obj.useDisplay?el.setDisplayed(!1):el.hide(),el.setStyle(originalStyles),Ext.callback(obj.callback,obj.scope))})},me.animate({duration:obj.duration,easing:obj.easing,listeners:{beforeanimate:{fn:beforeAnim}}}),me},switchOff:function(obj){var beforeAnim,me=this,dom=me.dom;return obj=Ext.applyIf(obj||{},{easing:"ease-in",duration:500,remove:!1,useDisplay:!1}),beforeAnim=function(){var keyframe,position,el=Ext.fly(dom,"_anim"),animScope=this,size=el.getSize(),xy=el.getXY();el.clearOpacity(),el.clip(),position=el.getPositioning(),keyframe=new Ext.fx.Animator({target:dom,duration:obj.duration,easing:obj.easing,keyframes:{33:{opacity:.3},66:{height:1,y:xy[1]+size.height/2},100:{width:1,x:xy[0]+size.width/2}}}),keyframe.on("afteranimate",function(){var el=Ext.fly(dom,"_anim");obj.useDisplay?el.setDisplayed(!1):el.hide(),el.clearOpacity(),el.setPositioning(position),el.setSize(size),animScope.end()})},me.animate({duration:2*Math.max(obj.duration,500),listeners:{beforeanimate:{fn:beforeAnim}},callback:obj.callback,scope:obj.scope}),me},frame:function(color,count,obj){var beforeAnim,me=this,dom=me.dom;return color=color||"#C3DAF9",count=count||1,obj=obj||{},beforeAnim=function(){var box,proxy,proxyAnim,el=Ext.fly(dom,"_anim"),animScope=this;el.show(),box=el.getBox(),proxy=Ext.getBody().createChild({role:"presentation",id:el.dom.id+"-anim-proxy",style:{position:"absolute","pointer-events":"none","z-index":35e3,border:"0px solid "+color}}),proxyAnim=new Ext.fx.Anim({target:proxy,duration:obj.duration||1e3,iterations:count,from:{top:box.y,left:box.x,borderWidth:0,opacity:1,height:box.height,width:box.width},to:{top:box.y-20,left:box.x-20,borderWidth:10,opacity:0,height:box.height+40,width:box.width+40}}),proxyAnim.on("afteranimate",function(){proxy.remove(),animScope.end()})},me.animate({duration:2*Math.max(obj.duration,500)||2e3,listeners:{beforeanimate:{fn:beforeAnim}},callback:obj.callback,scope:obj.scope}),me},ghost:function(anchor,obj){var beforeAnim,me=this,dom=me.dom;return anchor=anchor||"b",beforeAnim=function(){var el=Ext.fly(dom,"_anim"),width=el.getWidth(),height=el.getHeight(),xy=el.getXY(),position=el.getPositioning(),to={opacity:0};switch(anchor){case"t":to.y=xy[1]-height;break;case"l":to.x=xy[0]-width;break;case"r":to.x=xy[0]+width;break;case"b":to.y=xy[1]+height;break;case"tl":to.x=xy[0]-width,to.y=xy[1]-height;break;case"bl":to.x=xy[0]-width,to.y=xy[1]+height;break;case"br":to.x=xy[0]+width,to.y=xy[1]+height;break;case"tr":to.x=xy[0]+width,to.y=xy[1]-height}this.to=to,this.on("afteranimate",function(){var el=Ext.fly(dom,"_anim");el&&(el.hide(),el.clearOpacity(),el.setPositioning(position))})},me.animate(Ext.applyIf(obj||{},{duration:500,easing:"ease-out",listeners:{beforeanimate:beforeAnim}})),me},highlight:function(color,o){var restore,to,attr,lns,event,fn,me=this,dom=me.dom,from={};return dom.tagName.match(me.tableTagRe)?me.select("div").highlight(color,o):(o=o||{},lns=o.listeners||{},attr=o.attr||"backgroundColor",from[attr]=color||"ffff9c",o.to?to=o.to:(to={},to[attr]=o.endColor||me.getColor(attr,"ffffff","")),o.listeners=Ext.apply(Ext.apply({},lns),{beforeanimate:function(){restore=dom.style[attr];var el=Ext.fly(dom,"_anim");if(el.clearOpacity(),el.show(),event=lns.beforeanimate)return fn=event.fn||event,fn.apply(event.scope||lns.scope||window,arguments)},afteranimate:function(){dom&&(dom.style[attr]=restore),(event=lns.afteranimate)&&(fn=event.fn||event,fn.apply(event.scope||lns.scope||window,arguments))}}),me.animate(Ext.apply({},o,{duration:1e3,easing:"ease-in",from:from,to:to})),me)},pause:function(ms){var me=this;return Ext.fx.Manager.setFxDefaults(me.id,{delay:ms}),me},fadeIn:function(o){var me=this,dom=me.dom;return me.animate(Ext.apply({},o,{opacity:1,internalListeners:{beforeanimate:function(anim){var el=Ext.fly(dom,"_anim");el.isStyle("display","none")?el.setDisplayed(""):el.show()}}})),this},fadeOut:function(o){var me=this,dom=me.dom;return o=Ext.apply({opacity:0,internalListeners:{afteranimate:function(anim){if(dom&&0===anim.to.opacity){var el=Ext.fly(dom,"_anim");o.useDisplay?el.setDisplayed(!1):el.hide()}}}},o),me.animate(o),me},scale:function(w,h,o){return this.animate(Ext.apply({},o,{width:w,height:h})),this},shift:function(config){return this.animate(config),this},anchorAnimX:function(anchor){var xName="l"===anchor?"right":"left";this.dom.style[xName]="0px"}});Ext.define("Ext.dom.Element_dd",{override:"Ext.dom.Element",initDD:function(group,config,overrides){var dd=new Ext.dd.DD(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDProxy:function(group,config,overrides){var dd=new Ext.dd.DDProxy(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)},initDDTarget:function(group,config,overrides){var dd=new Ext.dd.DDTarget(Ext.id(this.dom),group,config);return Ext.apply(dd,overrides)}});Ext.define("Ext.dom.Element_fx",{override:"Ext.dom.Element"},function(){var Element=Ext.dom.Element,OFFSETCLASS=Ext.baseCSSPrefix+"hide-offsets",getDisplay=function(el){var data=(el.$cache||el.getCache()).data,display=data.originalDisplay;return void 0===display&&(data.originalDisplay=display=""),display},getVisMode=function(el){var data=(el.$cache||el.getCache()).data,visMode=data.visibilityMode;return void 0===visMode&&(data.visibilityMode=visMode=Element.VISIBILITY),visMode};Element.override({originalDisplay:"",visibilityMode:1,setVisible:function(visible,animate){var me=this,dom=me.dom,visMode=getVisMode(me);if("string"==typeof animate){switch(animate){case"display":visMode=Element.DISPLAY;break;case"visibility":visMode=Element.VISIBILITY;break;case"offsets":visMode=Element.OFFSETS;break;case"nosize":case"asclass":visMode=Element.ASCLASS}me.setVisibilityMode(visMode),animate=!1}if(animate&&me.anim)visible&&(me.setOpacity(.01),me.setVisible(!0)),Ext.isObject(animate)||(animate={duration:350,easing:"ease-in"}),me.animate(Ext.applyIf({callback:function(){visible||Ext.fly(dom,"_internal").setVisible(!1).setOpacity(1)},to:{opacity:visible?1:0}},animate));else{if(visMode==Element.DISPLAY)return me.setDisplayed(visible);visMode==Element.OFFSETS?me[visible?"removeCls":"addCls"](OFFSETCLASS):visMode==Element.VISIBILITY?(me.fixDisplay(),dom.style.visibility=visible?"":"hidden"):visMode==Element.ASCLASS&&me[visible?"removeCls":"addCls"](me.visibilityCls||Element.visibilityCls)}return(me.$cache||me.getCache()).data.isVisible=visible,me},hasMetrics:function(){var visMode=getVisMode(this);return this.isVisible()||visMode==Element.OFFSETS||visMode==Element.VISIBILITY},toggle:function(animate){var me=this;return me.setVisible(!me.isVisible(),me.anim(animate)),me},setDisplayed:function(value){return"boolean"==typeof value&&(value=value?getDisplay(this):"none"),this.setStyle("display",value),this},fixDisplay:function(){var me=this;me.isStyle("display","none")&&(me.setStyle("visibility","hidden"),me.setStyle("display",getDisplay(me)),me.isStyle("display","none")&&me.setStyle("display","block"))},hide:function(animate){return"string"==typeof animate?(this.setVisible(!1,animate),this):(this.setVisible(!1,this.anim(animate)),this)},show:function(animate){return"string"==typeof animate?(this.setVisible(!0,animate),this):(this.setVisible(!0,this.anim(animate)),this)}})});Ext.define("Ext.dom.Element_position",{override:"Ext.dom.Element"},function(){var flyInstance,Element=this,borders={l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings={l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},paddingsTLRB=[paddings.l,paddings.r,paddings.t,paddings.b],bordersTLRB=[borders.l,borders.r,borders.t,borders.b],round=Math.round,doc=document,fly=function(el){return flyInstance||(flyInstance=new Ext.Element.Fly),flyInstance.attach(el),flyInstance};Element.override({pxRe:/^\d+(?:\.\d*)?px$/i,inheritableStatics:{getX:function(el){return Element.getXY(el)[0]},getXY:function(el){var box,scroll,bd=doc.body,docEl=doc.documentElement,leftBorder=0,topBorder=0,ret=[0,0];if((el=Ext.getDom(el))!=doc&&el!=bd){if(Ext.isIE)try{box=el.getBoundingClientRect(),topBorder=docEl.clientTop||bd.clientTop,leftBorder=docEl.clientLeft||bd.clientLeft}catch(ex){box={left:0,top:0}}else box=el.getBoundingClientRect();scroll=fly(doc).getScroll(),ret=[round(box.left+scroll.left-leftBorder),round(box.top+scroll.top-topBorder)]}return ret},getY:function(el){return Element.getXY(el)[1]},setX:function(el,x){Element.setXY(el,[x,!1])},setXY:function(el,xy){(el=Ext.fly(el,"_setXY")).position();var pos,pts=el.translatePoints(xy),style=el.dom.style;style.right="auto";for(pos in pts)isNaN(pts[pos])||(style[pos]=pts[pos]+"px")},setY:function(el,y){Element.setXY(el,[!1,y])}},center:function(centerIn){return this.alignTo(centerIn||doc,"c-c")},clearPositioning:function(value){return value=value||"",this.setStyle({left:value,right:value,top:value,bottom:value,"z-index":"",position:"static"})},getAnchorToXY:function(el,anchor,local,mySize){return el.getAnchorXY(anchor,local,mySize)},getBottom:function(local){return(local?this.getLocalY():this.getY())+this.getHeight()},getBorderPadding:function(){var paddingWidth=this.getStyle(paddingsTLRB),bordersWidth=this.getStyle(bordersTLRB);return{beforeX:(parseFloat(bordersWidth[borders.l])||0)+(parseFloat(paddingWidth[paddings.l])||0),afterX:(parseFloat(bordersWidth[borders.r])||0)+(parseFloat(paddingWidth[paddings.r])||0),beforeY:(parseFloat(bordersWidth[borders.t])||0)+(parseFloat(paddingWidth[paddings.t])||0),afterY:(parseFloat(bordersWidth[borders.b])||0)+(parseFloat(paddingWidth[paddings.b])||0)}},getCenterXY:function(){return this.getAlignToXY(doc,"c-c")},getLeft:function(local){return local?this.getLocalX():this.getX()},getLocalX:function(){var me=this,offsetParent=me.dom.offsetParent,x=me.getStyle("left");return x&&"auto"!==x?me.pxRe.test(x)?x=parseFloat(x):(x=me.getX(),offsetParent&&(x-=Element.getX(offsetParent))):x=0,x},getLocalXY:function(){var me=this,offsetParent=me.dom.offsetParent,style=me.getStyle(["left","top"]),x=style.left,y=style.top;return x&&"auto"!==x?me.pxRe.test(x)?x=parseFloat(x):(x=me.getX(),offsetParent&&(x-=Element.getX(offsetParent))):x=0,y&&"auto"!==y?me.pxRe.test(y)?y=parseFloat(y):(y=me.getY(),offsetParent&&(y-=Element.getY(offsetParent))):y=0,[x,y]},getLocalY:function(){var me=this,offsetParent=me.dom.offsetParent,y=me.getStyle("top");return y&&"auto"!==y?me.pxRe.test(y)?y=parseFloat(y):(y=me.getY(),offsetParent&&(y-=Element.getY(offsetParent))):y=0,y},getPageBox:function(getRegion){var me=this,dom=me.dom,isDoc="BODY"==dom.nodeName,w=isDoc?Ext.Element.getViewWidth():dom.offsetWidth,h=isDoc?Ext.Element.getViewHeight():dom.offsetHeight,xy=me.getXY(),t=xy[1],r=xy[0]+w,b=xy[1]+h,l=xy[0];return getRegion?new Ext.util.Region(t,r,b,l):{left:l,top:t,width:w,height:h,right:r,bottom:b}},getPositioning:function(autoPx){var styles=this.getStyle(["left","top","position","z-index"]),dom=this.dom;return autoPx&&("auto"===styles.left&&(styles.left=dom.offsetLeft+"px"),"auto"===styles.top&&(styles.top=dom.offsetTop+"px")),styles},getRight:function(local){return(local?this.getLocalX():this.getX())+this.getWidth()},getTop:function(local){return local?this.getLocalY():this.getY()},getX:function(){return Element.getX(this.dom)},getXY:function(){return Element.getXY(this.dom)},getY:function(){return Element.getY(this.dom)},moveTo:function(x,y,animate){return this.setXY([x,y],animate)},position:function(pos,zIndex,x,y){var me=this;!pos&&me.isStyle("position","static")?me.setStyle("position","relative"):pos&&me.setStyle("position",pos),zIndex&&me.setStyle("z-index",zIndex),(x||y)&&me.setXY([x||!1,y||!1])},setBottom:function(bottom){return this.dom.style.bottom=this.addUnits(bottom),this},setBounds:function(x,y,width,height,animate){return this.setBox({x:x,y:y,width:width,height:height},animate)},setLeft:function(left){return this.dom.style.left=this.addUnits(left),this},setLeftTop:function(left,top){var me=this,style=me.dom.style;return style.left=me.addUnits(left),style.top=me.addUnits(top),me},setLocalX:function(x){var style=this.dom.style;style.right="auto",style.left=null===x?"auto":x+"px"},setLocalXY:function(x,y){var style=this.dom.style;style.right="auto",x&&x.length&&(y=x[1],x=x[0]),null===x?style.left="auto":void 0!==x&&(style.left=x+"px"),null===y?style.top="auto":void 0!==y&&(style.top=y+"px")},setLocalY:function(y){this.dom.style.top=null===y?"auto":y+"px"},setLocation:function(x,y,animate){return this.setXY([x,y],animate)},setPositioning:function(pc){return this.setStyle(pc)},setRight:function(right){return this.dom.style.right=this.addUnits(right),this},setTop:function(top){return this.dom.style.top=this.addUnits(top),this},setX:function(x,animate){return this.setXY([x,this.getY()],animate)},setXY:function(xy,animate){var me=this;return animate&&me.anim?(Ext.isObject(animate)||(animate={}),me.animate(Ext.applyIf({to:{x:xy[0],y:xy[1]}},animate))):Element.setXY(me.dom,xy),this},setY:function(y,animate){return this.setXY([this.getX(),y],animate)}}),Element.getTrueXY=Element.getXY});Ext.define("Ext.dom.Element_scroll",{override:"Ext.dom.Element",isScrollable:function(){var dom=this.dom;return dom.scrollHeight>dom.clientHeight||dom.scrollWidth>dom.clientWidth},getScroll:function(){var left,top,me=this,dom=me.dom,doc=document,body=doc.body,docElement=doc.documentElement;return dom===doc||dom===body?(left=docElement.scrollLeft||(body?body.scrollLeft:0),top=docElement.scrollTop||(body?body.scrollTop:0)):(left=dom.scrollLeft,top=dom.scrollTop),{left:left,top:top}},getScrollLeft:function(){var dom=this.dom,doc=document;return dom===doc||dom===doc.body?this.getScroll().left:dom.scrollLeft},getScrollTop:function(){var dom=this.dom,doc=document;return dom===doc||dom===doc.body?this.getScroll().top:dom.scrollTop},setScrollLeft:function(left){return this.dom.scrollLeft=left,this},setScrollTop:function(top){return this.dom.scrollTop=top,this},scrollBy:function(deltaX,deltaY,animate){var me=this,dom=me.dom;return deltaX.length?(animate=deltaY,deltaY=deltaX[1],deltaX=deltaX[0]):"number"!=typeof deltaX&&(animate=deltaY,deltaY=deltaX.y,deltaX=deltaX.x),deltaX&&me.scrollTo("left",me.constrainScrollLeft(dom.scrollLeft+deltaX),animate),deltaY&&me.scrollTo("top",me.constrainScrollTop(dom.scrollTop+deltaY),animate),me},scrollTo:function(side,value,animate){var animCfg,top=/top/i.test(side),me=this,prop=top?"scrollTop":"scrollLeft",dom=me.dom;return animate&&me.anim?(animCfg={to:{}},animCfg.to[prop]=value,Ext.isObject(animate)&&Ext.applyIf(animCfg,animate),me.animate(animCfg)):(dom[prop]=value,dom[prop]=value),me},scrollIntoView:function(container,hscroll,animate,highlight){var newPos,me=this,dom=me.dom,offsets=me.getOffsetsTo(container=Ext.getDom(container)||Ext.getBody().dom),left=offsets[0]+container.scrollLeft,top=offsets[1]+container.scrollTop,bottom=top+dom.offsetHeight,right=left+dom.offsetWidth,ctClientHeight=container.clientHeight,ctScrollTop=parseInt(container.scrollTop,10),ctScrollLeft=parseInt(container.scrollLeft,10),ctBottom=ctScrollTop+ctClientHeight,ctRight=ctScrollLeft+container.clientWidth;return highlight&&(animate?animate=Ext.apply({listeners:{afteranimate:function(){me.scrollChildFly.attach(dom).highlight()}}},animate):me.scrollChildFly.attach(dom).highlight()),dom.offsetHeight>ctClientHeight||top<ctScrollTop?newPos=top:bottom>ctBottom&&(newPos=bottom-ctClientHeight),null!=newPos&&me.scrollChildFly.attach(container).scrollTo("top",newPos,animate),!1!==hscroll&&(newPos=null,dom.offsetWidth>container.clientWidth||left<ctScrollLeft?newPos=left:right>ctRight&&(newPos=right-container.clientWidth),null!=newPos&&me.scrollChildFly.attach(container).scrollTo("left",newPos,animate)),me},scrollChildIntoView:function(child,hscroll){this.scrollChildFly.attach(Ext.getDom(child)).scrollIntoView(this,hscroll)},scroll:function(direction,distance,animate){if(!this.isScrollable())return!1;direction=direction.charAt(0);var currentScroll,constrainedScroll,me=this,dom=me.dom,side="r"===direction||"l"===direction?"left":"top",scrolled=!1;return"l"!==direction&&"t"!==direction&&"u"!==direction||(distance=-distance),"left"===side?(currentScroll=dom.scrollLeft,constrainedScroll=me.constrainScrollLeft(currentScroll+distance)):(currentScroll=dom.scrollTop,constrainedScroll=me.constrainScrollTop(currentScroll+distance)),constrainedScroll!==currentScroll&&(this.scrollTo(side,constrainedScroll,animate),scrolled=!0),scrolled},constrainScrollLeft:function(left){var dom=this.dom;return Math.max(Math.min(left,dom.scrollWidth-dom.clientWidth),0)},constrainScrollTop:function(top){var dom=this.dom;return Math.max(Math.min(top,dom.scrollHeight-dom.clientHeight),0)}},function(){this.prototype.scrollChildFly=new this.Fly,this.prototype.scrolltoFly=new this.Fly});Ext.define("Ext.dom.Element_style",{override:"Ext.dom.Element"},function(){function getBorderWidth(dom,el,inline,style){return"none"==style[this.styleName]?"0px":style[this.name]}var styleHooks,verticalStyleHooks90,verticalStyleHooks270,edges,k,edge,borderWidth,Element=this,view=document.defaultView,adjustDirect2DTableRe=/table-row|table-.*-group/,DOCORBODYRE=/#document|body/i;if(view&&view.getComputedStyle||(Element.prototype.getStyle=function(property,inline){var camel,domStyle,values,hook,out,style,i,me=this,dom=me.dom,multiple="string"!=typeof property,hooks=me.styleHooks,prop=property,props=prop,len=1,isInline=inline;if(multiple&&(values={},prop=props[0],i=0,!(len=props.length)))return values;if(!dom||dom.documentElement)return values||"";domStyle=dom.style,inline?style=domStyle:(style=dom.currentStyle)||(isInline=!0,style=domStyle);do{if(hook=hooks[prop],hook||(hooks[prop]=hook={name:Element.normalize(prop)}),hook.get)out=hook.get(dom,me,isInline,style);else if(camel=hook.name,hook.canThrow)try{out=style[camel]}catch(e){out=""}else out=style?style[camel]:"";if(!multiple)return out;values[prop]=out,prop=props[++i]}while(i<len);return values}),Element.override({getHeight:function(contentHeight,preciseHeight){var height,floating,me=this,hidden=me.isStyle("display","none");return hidden?0:(height=me.dom.offsetHeight,Ext.supports.Direct2DBug&&(floating=me.adjustDirect2DDimension("height"),preciseHeight?height+=floating:floating>0&&floating<.5&&height++),contentHeight&&(height-=me.getBorderWidth("tb")+me.getPadding("tb")),height<0?0:height)},getWidth:function(contentWidth,preciseWidth){var rect,width,floating,me=this,dom=me.dom,hidden=me.isStyle("display","none");return hidden?0:(Ext.supports.BoundingClientRect?(rect=dom.getBoundingClientRect(),width=!me.vertical||Ext.isIE9||Ext.supports.RotatedBoundingClientRect?rect.right-rect.left:rect.bottom-rect.top,width=preciseWidth?width:Math.ceil(width)):width=dom.offsetWidth,Ext.supports.Direct2DBug&&!me.vertical&&(floating=me.adjustDirect2DDimension("width"),preciseWidth?width+=floating:floating>0&&floating<.5&&width++),contentWidth&&(width-=me.getBorderWidth("lr")+me.getPadding("lr")),width<0?0:width)},setWidth:function(width,animate){var me=this;return width=me.adjustWidth(width),animate&&me.anim?(Ext.isObject(animate)||(animate={}),me.animate(Ext.applyIf({to:{width:width}},animate))):me.dom.style.width=me.addUnits(width),me},setHeight:function(height,animate){var me=this;return height=me.adjustHeight(height),animate&&me.anim?(Ext.isObject(animate)||(animate={}),me.animate(Ext.applyIf({to:{height:height}},animate))):me.dom.style.height=me.addUnits(height),me},applyStyles:function(style){return Ext.DomHelper.applyStyles(this.dom,style),this},setSize:function(width,height,animate){var me=this;return Ext.isObject(width)&&(animate=height,height=width.height,width=width.width),width=me.adjustWidth(width),height=me.adjustHeight(height),animate&&me.anim?(!0===animate&&(animate={}),me.animate(Ext.applyIf({to:{width:width,height:height}},animate))):(me.dom.style.width=me.addUnits(width),me.dom.style.height=me.addUnits(height)),me},getViewSize:function(){var me=this,dom=me.dom,isDoc=DOCORBODYRE.test(dom.nodeName);return isDoc?{width:Element.getViewWidth(),height:Element.getViewHeight()}:{width:dom.clientWidth,height:dom.clientHeight}},getSize:function(contentSize){return{width:this.getWidth(contentSize),height:this.getHeight(contentSize)}},adjustWidth:function(width){var me=this,isNum="number"==typeof width;return isNum&&me.autoBoxAdjust&&!me.isBorderBox()&&(width-=me.getBorderWidth("lr")+me.getPadding("lr")),isNum&&width<0?0:width},adjustHeight:function(height){var me=this,isNum="number"==typeof height;return isNum&&me.autoBoxAdjust&&!me.isBorderBox()&&(height-=me.getBorderWidth("tb")+me.getPadding("tb")),isNum&&height<0?0:height},getColor:function(attr,defaultValue,prefix){var h,len,v=this.getStyle(attr),color=prefix||""===prefix?prefix:"#",i=0;if(!v||/transparent|inherit/.test(v))return defaultValue;if(/^r/.test(v))for(v=v.slice(4,v.length-1).split(","),len=v.length;i<len;i++)h=parseInt(v[i],10),color+=(h<16?"0":"")+h.toString(16);else v=v.replace("#",""),color+=3==v.length?v.replace(/^(\w)(\w)(\w)$/,"$1$1$2$2$3$3"):v;return color.length>5?color.toLowerCase():defaultValue},setOpacity:function(opacity,animate){var me=this;return me.dom?(animate&&me.anim?("object"!=typeof animate&&(animate={duration:350,easing:"ease-in"}),me.animate(Ext.applyIf({to:{opacity:opacity}},animate))):me.setStyle("opacity",opacity),me):me},clearOpacity:function(){return this.setOpacity("")},adjustDirect2DDimension:function(dimension){var floating,me=this,dom=me.dom,display=me.getStyle("display"),inlineDisplay=dom.style.display,inlinePosition=dom.style.position,originIndex="width"===dimension?0:1,currentStyle=dom.currentStyle;return"inline"===display&&(dom.style.display="inline-block"),dom.style.position=display.match(adjustDirect2DTableRe)?"absolute":"static",floating=(parseFloat(currentStyle[dimension])||2*parseFloat(currentStyle.msTransformOrigin.split(" ")[originIndex]))%1,dom.style.position=inlinePosition,"inline"===display&&(dom.style.display=inlineDisplay),floating},clip:function(){var style,me=this,data=(me.$cache||me.getCache()).data;return data.isClipped||(data.isClipped=!0,style=me.getStyle(["overflow","overflow-x","overflow-y"]),data.originalClip={o:style.overflow,x:style["overflow-x"],y:style["overflow-y"]},me.setStyle("overflow","hidden"),me.setStyle("overflow-x","hidden"),me.setStyle("overflow-y","hidden")),me},unclip:function(){var clip,me=this,data=(me.$cache||me.getCache()).data;return data.isClipped&&(data.isClipped=!1,clip=data.originalClip,clip.o&&me.setStyle("overflow",clip.o),clip.x&&me.setStyle("overflow-x",clip.x),clip.y&&me.setStyle("overflow-y",clip.y)),me},boxWrap:function(cls){cls=cls||Ext.baseCSSPrefix+"box";var el=Ext.get(this.insertHtml("beforeBegin","<div class='"+cls+"' role='presentation'>"+Ext.String.format(Element.boxMarkup,cls)+"</div>"));return Ext.DomQuery.selectNode("."+cls+"-mc",el.dom).appendChild(this.dom),el},getComputedHeight:function(){var me=this,h=Math.max(me.dom.offsetHeight,me.dom.clientHeight);return h||(h=parseFloat(me.getStyle("height"))||0,me.isBorderBox()||(h+=me.getFrameWidth("tb"))),h},getComputedWidth:function(){var me=this,w=Math.max(me.dom.offsetWidth,me.dom.clientWidth);return w||(w=parseFloat(me.getStyle("width"))||0,me.isBorderBox()||(w+=me.getFrameWidth("lr"))),w},getFrameWidth:function(sides,onlyContentBox){return onlyContentBox&&this.isBorderBox()?0:this.getPadding(sides)+this.getBorderWidth(sides)},addClsOnOver:function(className,testFn,scope){var me=this,dom=me.dom,hasTest=Ext.isFunction(testFn);return me.hover(function(){hasTest&&!1===testFn.call(scope||me,me)||Ext.fly(dom,"_internal").addCls(className)},function(){Ext.fly(dom,"_internal").removeCls(className)}),me},addClsOnFocus:function(className,testFn,scope){var me=this,dom=me.dom,hasTest=Ext.isFunction(testFn);return me.on("focus",function(){if(hasTest&&!1===testFn.call(scope||me,me))return!1;Ext.fly(dom,"_internal").addCls(className)}),me.on("blur",function(){Ext.fly(dom,"_internal").removeCls(className)}),me},addClsOnClick:function(className,testFn,scope){var me=this,dom=me.dom,hasTest=Ext.isFunction(testFn);return me.on("mousedown",function(){if(hasTest&&!1===testFn.call(scope||me,me))return!1;Ext.fly(dom,"_internal").addCls(className);var d=Ext.getDoc(),fn=function(){Ext.fly(dom,"_internal").removeCls(className),d.removeListener("mouseup",fn)};d.on("mouseup",fn)}),me},getStyleSize:function(){var s,w,h,me=this,d=this.dom,isDoc=DOCORBODYRE.test(d.nodeName);return isDoc?{width:Element.getViewWidth(),height:Element.getViewHeight()}:(s=me.getStyle(["height","width"],!0),s.width&&"auto"!=s.width&&(w=parseFloat(s.width),me.isBorderBox()&&(w-=me.getFrameWidth("lr"))),s.height&&"auto"!=s.height&&(h=parseFloat(s.height),me.isBorderBox()&&(h-=me.getFrameWidth("tb"))),{width:w||me.getWidth(!0),height:h||me.getHeight(!0)})},statics:{selectableCls:Ext.baseCSSPrefix+"selectable",unselectableCls:Ext.baseCSSPrefix+"unselectable"},selectable:function(){var me=this;return me.dom.unselectable="",me.removeCls(Element.unselectableCls),me.addCls(Element.selectableCls),me},unselectable:function(){var me=this;return Ext.isOpera&&(me.dom.unselectable="on"),me.removeCls(Element.selectableCls),me.addCls(Element.unselectableCls),me},setVertical:function(angle,cls){var me=this,proto=Element.prototype;me.vertical=!0,cls&&me.addCls(me.verticalCls=cls),me.setWidth=proto.setHeight,me.setHeight=proto.setWidth,Ext.isIE9m||(me.getWidth=proto.getHeight,me.getHeight=proto.getWidth),me.styleHooks=270===angle?Element.prototype.verticalStyleHooks270:Element.prototype.verticalStyleHooks90},setHorizontal:function(){var me=this,cls=me.verticalCls;delete me.vertical,cls&&(delete me.verticalCls,me.removeCls(cls)),delete me.setWidth,delete me.setHeight,Ext.isIE9m||(delete me.getWidth,delete me.getHeight),delete me.styleHooks}}),Element.prototype.styleHooks=styleHooks=Ext.dom.AbstractElement.prototype.styleHooks,Element.prototype.verticalStyleHooks90=verticalStyleHooks90=Ext.Object.chain(Element.prototype.styleHooks),Element.prototype.verticalStyleHooks270=verticalStyleHooks270=Ext.Object.chain(Element.prototype.styleHooks),verticalStyleHooks90.width={name:"height"},verticalStyleHooks90.height={name:"width"},verticalStyleHooks90["margin-top"]={name:"marginLeft"},verticalStyleHooks90["margin-right"]={name:"marginTop"},verticalStyleHooks90["margin-bottom"]={name:"marginRight"},verticalStyleHooks90["margin-left"]={name:"marginBottom"},verticalStyleHooks90["padding-top"]={name:"paddingLeft"},verticalStyleHooks90["padding-right"]={name:"paddingTop"},verticalStyleHooks90["padding-bottom"]={name:"paddingRight"},verticalStyleHooks90["padding-left"]={name:"paddingBottom"},verticalStyleHooks90["border-top"]={name:"borderLeft"},verticalStyleHooks90["border-right"]={name:"borderTop"},verticalStyleHooks90["border-bottom"]={name:"borderRight"},verticalStyleHooks90["border-left"]={name:"borderBottom"},verticalStyleHooks270.width={name:"height"},verticalStyleHooks270.height={name:"width"},verticalStyleHooks270["margin-top"]={name:"marginRight"},verticalStyleHooks270["margin-right"]={name:"marginBottom"},verticalStyleHooks270["margin-bottom"]={name:"marginLeft"},verticalStyleHooks270["margin-left"]={name:"marginTop"},verticalStyleHooks270["padding-top"]={name:"paddingRight"},verticalStyleHooks270["padding-right"]={name:"paddingBottom"},verticalStyleHooks270["padding-bottom"]={name:"paddingLeft"},verticalStyleHooks270["padding-left"]={name:"paddingTop"},verticalStyleHooks270["border-top"]={name:"borderRight"},verticalStyleHooks270["border-right"]={name:"borderBottom"},verticalStyleHooks270["border-bottom"]={name:"borderLeft"},verticalStyleHooks270["border-left"]={name:"borderTop"},Ext.isIE7m&&(styleHooks.fontSize=styleHooks["font-size"]={name:"fontSize",canThrow:!0},styleHooks.fontStyle=styleHooks["font-style"]={name:"fontStyle",canThrow:!0},styleHooks.fontFamily=styleHooks["font-family"]={name:"fontFamily",canThrow:!0}),Ext.isIEQuirks||Ext.isIE&&Ext.ieVersion<=8)for(edges=["Top","Right","Bottom","Left"],k=edges.length;k--;)edge=edges[k],borderWidth="border"+edge+"Width",styleHooks["border-"+edge.toLowerCase()+"-width"]=styleHooks[borderWidth]={name:borderWidth,styleName:"border"+edge+"Style",get:getBorderWidth};Ext.getDoc().on("selectstart",function(ev,dom){var doc=document.documentElement,selectableCls=Element.selectableCls,unselectableCls=Element.unselectableCls,tagName=dom&&dom.tagName;if("input"!==(tagName=tagName&&tagName.toLowerCase())&&"textarea"!==tagName)for(;dom&&1===dom.nodeType&&dom!==doc;){var el=Ext.fly(dom);if(el.hasCls(selectableCls))return;if(el.hasCls(unselectableCls))return void ev.stopEvent();dom=dom.parentNode}})}),Ext.onReady(function(){var opacityRe=/alpha\(opacity=(.*)\)/i,trimRe=/^\s+|\s+$/g,hooks=Ext.dom.Element.prototype.styleHooks;hooks.opacity={name:"opacity",afterSet:function(dom,value,el){el.isLayer&&el.onOpacitySet(value)}},!Ext.supports.Opacity&&Ext.isIE&&Ext.apply(hooks.opacity,{get:function(dom){var match,opacity,filter=dom.style.filter;return filter.match&&(match=filter.match(opacityRe))&&(opacity=parseFloat(match[1]),!isNaN(opacity))?opacity?opacity/100:0:1},set:function(dom,value){var style=dom.style,val=style.filter.replace(opacityRe,"").replace(trimRe,"");style.zoom=1,"number"==typeof value&&value>=0&&value<1?(value*=100,style.filter=val+(val.length?" ":"")+"alpha(opacity="+value+")"):style.filter=val}})});Ext.define("Ext.util.Positionable",{_positionTopLeft:["position","top","left"],_alignRe:/^([a-z]+)-([a-z]+)(\?)?$/,afterSetPosition:Ext.emptyFn,getAnchorToXY:function(){Ext.Error.raise("getAnchorToXY is not implemented in "+this.$className)},getBorderPadding:function(){Ext.Error.raise("getBorderPadding is not implemented in "+this.$className)},getLocalX:function(){Ext.Error.raise("getLocalX is not implemented in "+this.$className)},getLocalXY:function(){Ext.Error.raise("getLocalXY is not implemented in "+this.$className)},getLocalY:function(){Ext.Error.raise("getLocalY is not implemented in "+this.$className)},getX:function(){Ext.Error.raise("getX is not implemented in "+this.$className)},getXY:function(){Ext.Error.raise("getXY is not implemented in "+this.$className)},getY:function(){Ext.Error.raise("getY is not implemented in "+this.$className)},setLocalX:function(){Ext.Error.raise("setLocalX is not implemented in "+this.$className)},setLocalXY:function(){Ext.Error.raise("setLocalXY is not implemented in "+this.$className)},setLocalY:function(){Ext.Error.raise("setLocalY is not implemented in "+this.$className)},setX:function(){Ext.Error.raise("setX is not implemented in "+this.$className)},setXY:function(){Ext.Error.raise("setXY is not implemented in "+this.$className)},setY:function(){Ext.Error.raise("setY is not implemented in "+this.$className)},adjustForConstraints:function(xy,parent){var vector=this.getConstrainVector(parent,xy);return vector&&(xy[0]+=vector[0],xy[1]+=vector[1]),xy},alignTo:function(element,position,offsets,animate){var me=this,el=me.el;return me.setXY(me.getAlignToXY(element,position,offsets),!(!el.anim||!animate)&&el.anim(animate))},anchorTo:function(anchorToEl,alignment,offsets,animate,monitorScroll,callback){var me=this,scroll=!Ext.isEmpty(monitorScroll),action=function(){me.alignTo(anchorToEl,alignment,offsets,animate),Ext.callback(callback,me)},anchor=me.getAnchor();return me.removeAnchor(),Ext.apply(anchor,{fn:action,scroll:scroll}),Ext.EventManager.onWindowResize(action,null),scroll&&Ext.EventManager.on(window,"scroll",action,null,{buffer:isNaN(monitorScroll)?50:monitorScroll}),action(),me},calculateAnchorXY:function(anchor,extraX,extraY,mySize){var xy,myWidth,myHeight,me=this,el=me.el,doc=document,isViewport=el.dom==doc.body||el.dom==doc,round=Math.round;switch(anchor=(anchor||"tl").toLowerCase(),mySize=mySize||{},myWidth=mySize.width||isViewport?Ext.Element.getViewWidth():me.getWidth(),myHeight=mySize.height||isViewport?Ext.Element.getViewHeight():me.getHeight(),anchor){case"tl":xy=[0,0];break;case"bl":xy=[0,myHeight];break;case"tr":xy=[myWidth,0];break;case"c":xy=[round(.5*myWidth),round(.5*myHeight)];break;case"t":xy=[round(.5*myWidth),0];break;case"l":xy=[0,round(.5*myHeight)];break;case"r":xy=[myWidth,round(.5*myHeight)];break;case"b":xy=[round(.5*myWidth),myHeight];break;case"tc":xy=[round(.5*myWidth),0];break;case"bc":xy=[round(.5*myWidth),myHeight];break;case"br":xy=[myWidth,myHeight]}return[xy[0]+extraX,xy[1]+extraY]},convertPositionSpec:Ext.identityFn,getAlignToXY:function(alignToEl,posSpec,offset){var alignMatch,myPosition,alignToElPosition,myWidth,myHeight,alignToElRegion,swapY,swapX,constrain,align1,align2,p1y,p1x,p2y,p2x,x,y,me=this,viewportWidth=Ext.Element.getViewWidth()-10,viewportHeight=Ext.Element.getViewHeight()-10,doc=document,docElement=doc.documentElement,docBody=doc.body,scrollX=docElement.scrollLeft||docBody.scrollLeft||0,scrollY=docElement.scrollTop||docBody.scrollTop||0;return alignToEl=Ext.get(alignToEl.el||alignToEl),alignToEl&&alignToEl.dom||Ext.Error.raise({sourceClass:"Ext.util.Positionable",sourceMethod:"getAlignToXY",msg:"Attempted to align an element that doesn't exist"}),offset=offset||[0,0],posSpec=(posSpec&&"?"!=posSpec?/-/.test(posSpec)||""===posSpec?posSpec||"tl-bl":"tl-"+posSpec:"tl-bl?").toLowerCase(),posSpec=me.convertPositionSpec(posSpec),alignMatch=posSpec.match(me._alignRe),alignMatch||Ext.Error.raise({sourceClass:"Ext.util.Positionable",sourceMethod:"getAlignToXY",el:alignToEl,position:posSpec,offset:offset,msg:'Attemmpted to align an element with an invalid position: "'+posSpec+'"'}),align1=alignMatch[1],align2=alignMatch[2],constrain=!!alignMatch[3],myPosition=me.getAnchorXY(align1,!0),alignToElPosition=me.getAnchorToXY(alignToEl,align2,!1),x=alignToElPosition[0]-myPosition[0]+offset[0],y=alignToElPosition[1]-myPosition[1]+offset[1],constrain&&(myWidth=me.getWidth(),myHeight=me.getHeight(),alignToElRegion=alignToEl.getRegion(),p1y=align1.charAt(0),p1x=align1.charAt(align1.length-1),p2y=align2.charAt(0),p2x=align2.charAt(align2.length-1),swapY="t"==p1y&&"b"==p2y||"b"==p1y&&"t"==p2y,swapX="r"==p1x&&"l"==p2x||"l"==p1x&&"r"==p2x,x+myWidth>viewportWidth+scrollX&&(x=swapX?alignToElRegion.left-myWidth:viewportWidth+scrollX-myWidth),x<scrollX&&(x=swapX?alignToElRegion.right:scrollX),y+myHeight>viewportHeight+scrollY&&(y=swapY?alignToElRegion.top-myHeight:viewportHeight+scrollY-myHeight),y<scrollY&&(y=swapY?alignToElRegion.bottom:scrollY)),[x,y]},getAnchor:function(){var anchor,el=this.el,data=(el.$cache||el.getCache()).data;if(el.dom)return anchor=data._anchor,anchor||(anchor=data._anchor={}),anchor},getAnchorXY:function(anchor,local,mySize){var me=this,myPos=me.getXY(),el=me.el,doc=document,isViewport=el.dom==doc.body||el.dom==doc,scroll=el.getScroll(),extraX=isViewport?scroll.left:local?0:myPos[0],extraY=isViewport?scroll.top:local?0:myPos[1];return me.calculateAnchorXY(anchor,extraX,extraY,mySize)},getBox:function(contentBox,local){var borderPadding,beforeX,beforeY,me=this,xy=local?me.getLocalXY():me.getXY(),x=xy[0],y=xy[1],w=me.getWidth(),h=me.getHeight();return contentBox&&(borderPadding=me.getBorderPadding(),beforeX=borderPadding.beforeX,beforeY=borderPadding.beforeY,x+=beforeX,y+=beforeY,w-=beforeX+borderPadding.afterX,h-=beforeY+borderPadding.afterY),{x:x,left:x,0:x,y:y,top:y,1:y,width:w,height:h,right:x+w,bottom:y+h}},calculateConstrainedPosition:function(constrainTo,proposedPosition,local,proposedSize){var vector,parentOffset,borderPadding,proposedConstrainPosition,me=this,fp=me.floatParent,parentNode=fp?fp.getTargetEl():null,xy=!1;return local&&fp?(parentOffset=parentNode.getXY(),borderPadding=parentNode.getBorderPadding(),parentOffset[0]+=borderPadding.beforeX,parentOffset[1]+=borderPadding.beforeY,proposedPosition&&(proposedConstrainPosition=[proposedPosition[0]+parentOffset[0],proposedPosition[1]+parentOffset[1]])):proposedConstrainPosition=proposedPosition,constrainTo=constrainTo||me.constrainTo||parentNode||me.container||me.el.parent(),vector=(me.constrainHeader?me.header:me).getConstrainVector(constrainTo,proposedConstrainPosition,proposedSize),vector&&(xy=proposedPosition||me.getPosition(local),xy[0]+=vector[0],xy[1]+=vector[1]),xy},getConstrainVector:function(constrainTo,proposedPosition,proposedSize){var thisRegion=this.getRegion(),vector=[0,0],shadowSize=this.shadow&&this.constrainShadow&&!this.shadowDisabled?this.shadow.getShadowSize():void 0,overflowed=!1,constraintInsets=this.constraintInsets;return constrainTo instanceof Ext.util.Region||(constrainTo=Ext.get(constrainTo.el||constrainTo).getViewRegion()),constraintInsets&&(constraintInsets=Ext.isObject(constraintInsets)?constraintInsets:Ext.Element.parseBox(constraintInsets),constrainTo.adjust(constraintInsets.top,constraintInsets.right,constraintInsets.bottom,constraintInsets.length)),proposedPosition&&thisRegion.translateBy(proposedPosition[0]-thisRegion.x,proposedPosition[1]-thisRegion.y),proposedSize&&(thisRegion.right=thisRegion.left+proposedSize[0],thisRegion.bottom=thisRegion.top+proposedSize[1]),shadowSize&&constrainTo.adjust(shadowSize[0],-shadowSize[1],-shadowSize[2],shadowSize[3]),thisRegion.right>constrainTo.right&&(overflowed=!0,vector[0]=constrainTo.right-thisRegion.right),thisRegion.left+vector[0]<constrainTo.left&&(overflowed=!0,vector[0]=constrainTo.left-thisRegion.left),thisRegion.bottom>constrainTo.bottom&&(overflowed=!0,vector[1]=constrainTo.bottom-thisRegion.bottom),thisRegion.top+vector[1]<constrainTo.top&&(overflowed=!0,vector[1]=constrainTo.top-thisRegion.top),!!overflowed&&vector},getOffsetsTo:function(offsetsTo){var o=this.getXY(),e=Ext.fly(offsetsTo.el||offsetsTo,"_internal").getXY();return[o[0]-e[0],o[1]-e[1]]},getRegion:function(){var box=this.getBox();return new Ext.util.Region(box.top,box.right,box.bottom,box.left)},getViewRegion:function(){var borderPadding,scroll,pos,top,left,width,height,me=this,el=me.el,isBody="BODY"===el.dom.nodeName;return isBody?(scroll=el.getScroll(),left=scroll.left,top=scroll.top,width=Ext.dom.AbstractElement.getViewportWidth(),height=Ext.dom.AbstractElement.getViewportHeight()):(borderPadding=me.getBorderPadding(),pos=me.getXY(),left=pos[0]+borderPadding.beforeX,top=pos[1]+borderPadding.beforeY,width=me.getWidth(!0),height=me.getHeight(!0)),new Ext.util.Region(top,left+width,top+height,left)},move:function(direction,distance,animate){var me=this,xy=me.getXY(),x=xy[0],y=xy[1],left=[x-distance,y],right=[x+distance,y],top=[x,y-distance],bottom=[x,y+distance],hash={l:left,left:left,r:right,right:right,t:top,top:top,up:top,b:bottom,bottom:bottom,down:bottom};direction=direction.toLowerCase(),me.setXY([hash[direction][0],hash[direction][1]],animate)},removeAnchor:function(){var anchor=this.getAnchor();return anchor&&anchor.fn&&(Ext.EventManager.removeResizeListener(anchor.fn),anchor.scroll&&Ext.EventManager.un(window,"scroll",anchor.fn),delete anchor.fn),this},setBox:function(box,animate){var me=this,el=me.el,x=box.x,y=box.y,w=box.width,h=box.height,doConstrain=me.constrain||me.constrainHeader,constrainedPos=doConstrain&&me.calculateConstrainedPosition(null,[x,y],!1,[w,h]);return constrainedPos&&(x=constrainedPos[0],y=constrainedPos[1]),animate&&el.anim?me.animate(Ext.applyIf({to:{x:x,y:y,width:el.adjustWidth(w),height:el.adjustHeight(h)},listeners:{afteranimate:Ext.Function.bind(me.afterSetPosition,me,[x,y])}},animate)):(me.setSize(w,h),me.setXY([x,y]),me.afterSetPosition(x,y)),me},setRegion:function(region,animate){return this.setBox({x:region.left,y:region.top,width:region.right-region.left,height:region.bottom-region.top},animate)},translatePoints:function(x,y){var pos=this.translateXY(x,y);return{left:pos.x,top:pos.y}},translateXY:function(x,y){var me=this,el=me.el,styles=el.getStyle(me._positionTopLeft),relative="relative"==styles.position,left=parseFloat(styles.left),top=parseFloat(styles.top),xy=me.getXY();return Ext.isArray(x)&&(y=x[1],x=x[0]),isNaN(left)&&(left=relative?0:el.dom.offsetLeft),isNaN(top)&&(top=relative?0:el.dom.offsetTop),left="number"==typeof x?x-xy[0]+left:void 0,top="number"==typeof y?y-xy[1]+top:void 0,{x:left,y:top}}});Ext.define("Ext.dom.Element",function(Element){var visFly,DOC=document,XMASKED=Ext.baseCSSPrefix+"masked",XMASKEDRELATIVE=Ext.baseCSSPrefix+"masked-relative",EXTELMASKMSG=Ext.baseCSSPrefix+"mask-msg",bodyRe=/^body/i,noBoxAdjust=Ext.isStrict?{select:1}:{input:1,select:1,textarea:1},isScrolled=function(c){var i,ci,r=[],ri=-1;for(i=0;ci=c[i];i++)(ci.scrollTop>0||ci.scrollLeft>0)&&(r[++ri]=ci);return r};return{extend:"Ext.dom.AbstractElement",alternateClassName:["Ext.Element","Ext.core.Element"],requires:["Ext.dom.Query","Ext.dom.Element_anim","Ext.dom.Element_dd","Ext.dom.Element_fx","Ext.dom.Element_position","Ext.dom.Element_scroll","Ext.dom.Element_style"],tableTagRe:/^(?:tr|td|table|tbody)$/i,mixins:["Ext.util.Positionable"],addUnits:function(){return Element.addUnits.apply(Element,arguments)},focus:function(defer,dom){var me=this;dom=dom||me.dom;try{Number(defer)?Ext.defer(me.focus,defer,me,[null,dom]):dom.focus()}catch(e){}return me},blur:function(){var me=this,dom=me.dom;if(dom!==document.body){try{dom.blur()}catch(e){}return me}return me.focus(void 0,dom)},isBorderBox:function(){var box=Ext.isBorderBox;return box&&Ext.isIE7m&&(box=!((this.dom.tagName||"").toLowerCase()in noBoxAdjust)),box},hover:function(overFn,outFn,scope,options){var me=this;return me.on("mouseenter",overFn,scope||me.dom,options),me.on("mouseleave",outFn,scope||me.dom,options),me},getAttributeNS:function(ns,name){return this.getAttribute(name,ns)},getAttribute:!Ext.isIE||Ext.isIE9p&&DOC.documentMode>=9?function(name,ns){var d=this.dom;return ns?d.getAttributeNS(ns,name)||d.getAttribute(ns+":"+name):d.getAttribute(name)||d[name]||null}:function(name,ns){var type,d=this.dom;return ns?(type=typeof d[ns+":"+name],"undefined"!=type&&"unknown"!=type?d[ns+":"+name]||null:null):("for"===name&&(name="htmlFor"),d[name]||null)},cacheScrollValues:function(){var scrolledDescendants,el,i,me=this,scrollValues=[],result=function(){for(i=0;i<scrolledDescendants.length;i++)el=scrolledDescendants[i],el.scrollLeft=scrollValues[i][0],el.scrollTop=scrollValues[i][1]};for(Ext.DomQuery.pseudos.isScrolled||(Ext.DomQuery.pseudos.isScrolled=isScrolled),scrolledDescendants=me.query(":isScrolled"),i=0;i<scrolledDescendants.length;i++)el=scrolledDescendants[i],scrollValues[i]=[el.scrollLeft,el.scrollTop];return result},autoBoxAdjust:!0,isVisible:function(deep){var me=this,dom=me.dom,stopNode=dom.ownerDocument.documentElement;for(visFly||(visFly=new Element.Fly);dom!==stopNode;){if(!dom||11===dom.nodeType||visFly.attach(dom).isStyle("visibility","hidden")||visFly.isStyle("display","none"))return!1;if(!deep)break;dom=dom.parentNode}return!0},isDisplayed:function(){return!this.isStyle("display","none")},enableDisplayMode:function(display){var me=this;return me.setVisibilityMode(Element.DISPLAY),Ext.isEmpty(display)||((me.$cache||me.getCache()).data.originalDisplay=display),me},mask:function(msg,msgCls,elHeight){var widthExpression,heightExpression,docElem,ie6DocElHeight,me=this,dom=me.dom,setExpression=dom.style.setExpression,data=(me.$cache||me.getCache()).data,maskShimEl=data.maskShimEl,maskEl=data.maskEl,maskMsg=data.maskMsg;if(bodyRe.test(dom.tagName)&&"static"==me.getStyle("position")||me.addCls(XMASKEDRELATIVE),maskEl&&maskEl.remove(),maskMsg&&maskMsg.remove(),maskShimEl&&maskShimEl.remove(),Ext.isIE6&&(maskShimEl=Ext.DomHelper.append(dom,{tag:"iframe",role:"presentation",cls:Ext.baseCSSPrefix+"shim "+Ext.baseCSSPrefix+"mask-shim"},!0),data.maskShimEl=maskShimEl,maskShimEl.setDisplayed(!0)),Ext.DomHelper.append(dom,[{role:"presentation",cls:Ext.baseCSSPrefix+"mask",style:"top:0;left:0;"},{role:"presentation",cls:msgCls?EXTELMASKMSG+" "+msgCls:EXTELMASKMSG,cn:{tag:"div",role:"presentation",cls:Ext.baseCSSPrefix+"mask-msg-inner",cn:{tag:"div",role:"presentation",cls:Ext.baseCSSPrefix+"mask-msg-text",html:msg||""}}}]),maskMsg=Ext.get(dom.lastChild),maskEl=Ext.get(maskMsg.dom.previousSibling),data.maskMsg=maskMsg,data.maskEl=maskEl,me.addCls(XMASKED),maskEl.setDisplayed(!0),"string"==typeof msg?(maskMsg.setDisplayed(!0),maskMsg.center(me)):maskMsg.setDisplayed(!1),Ext.isStrict&&!Ext.isIE6&&dom===DOC.body&&maskEl.addCls(Ext.baseCSSPrefix+"mask-fixed"),dom!==DOC.body||Ext.isIE6||Ext.isIEQuirks){if(!Ext.supports.IncludePaddingInWidthCalculation&&setExpression)try{maskEl.dom.style.setExpression("width",'this.parentNode.clientWidth + "px"'),widthExpression='this.parentNode.clientWidth + "px"',maskShimEl&&maskShimEl.dom.style.setExpression("width",widthExpression),maskEl.dom.style.setExpression("width",widthExpression)}catch(e){}if(!Ext.supports.IncludePaddingInHeightCalculation&&setExpression)try{heightExpression="this.parentNode."+(dom==DOC.body?"scrollHeight":"offsetHeight")+' + "px"',maskShimEl&&maskShimEl.dom.style.setExpression("height",heightExpression),maskEl.dom.style.setExpression("height",heightExpression)}catch(e){}else!Ext.isIE9m||Ext.isIE7&&Ext.isStrict||"auto"!=me.getStyle("height")||(Ext.isIE6&&Ext.isStrict&&(docElem=dom.parentNode,ie6DocElHeight=Math.max(docElem.clientHeight,docElem.scrollHeight)),maskShimEl&&maskShimEl.setSize(void 0,elHeight||ie6DocElHeight||me.getHeight()),maskEl.setSize(void 0,elHeight||ie6DocElHeight||me.getHeight()))}return maskEl},unmask:function(){var style,me=this,data=(me.$cache||me.getCache()).data,maskEl=data.maskEl,maskShimEl=data.maskShimEl,maskMsg=data.maskMsg;maskEl&&(style=maskEl.dom.style,style.clearExpression&&(style.clearExpression("width"),style.clearExpression("height")),maskEl&&(maskEl.remove(),delete data.maskEl),maskMsg&&(maskMsg.remove(),delete data.maskMsg),me.removeCls([XMASKED,XMASKEDRELATIVE]),maskShimEl&&(style=maskShimEl.dom.style,style.clearExpression&&(style.clearExpression("width"),style.clearExpression("height")),maskShimEl.remove(),delete data.maskShimEl))},isMasked:function(){var me=this,data=(me.$cache||me.getCache()).data,maskEl=data.maskEl,maskMsg=data.maskMsg,hasMask=!1;return maskEl&&maskEl.isVisible()&&(maskMsg&&maskMsg.center(me),hasMask=!0),hasMask},createShim:function(){var shim,el=DOC.createElement("iframe");return el.frameBorder="0",el.className=Ext.baseCSSPrefix+"shim",el.src=Ext.SSL_SECURE_URL,el.setAttribute("role","presentation"),shim=Ext.get(this.dom.parentNode.insertBefore(el,this.dom)),shim.autoBoxAdjust=!1,shim},addKeyListener:function(key,fn,scope){var config;return config="object"!=typeof key||Ext.isArray(key)?{target:this,key:key,fn:fn,scope:scope}:{target:this,key:key.key,shift:key.shift,ctrl:key.ctrl,alt:key.alt,fn:fn,scope:scope},new Ext.util.KeyMap(config)},addKeyMap:function(config){return new Ext.util.KeyMap(Ext.apply({target:this},config))},on:function(eventName,fn,scope,options){return Ext.EventManager.on(this,eventName,fn,scope||this,options),this},un:function(eventName,fn,scope){return Ext.EventManager.un(this,eventName,fn,scope||this),this},removeAllListeners:function(){return Ext.EventManager.removeAll(this),this},purgeAllListeners:function(){return Ext.EventManager.purgeElement(this),this},select:function(selector){return Element.select(selector,!1,this.dom)}}},function(){function garbageCollect(){if(Ext.enableGarbageCollector){var eid,d,o,t;for(eid in EC)EC.hasOwnProperty(eid)&&(o=EC[eid],o.skipGarbageCollection||(d=o.dom,d||Ext.Error.raise("Missing DOM node in element garbage collection: "+eid),d&&(d.getElementById||d.navigator)&&Ext.Error.raise("Unexpected document or window element in element garbage collection"),!d||d.parentNode&&(d.offsetParent||Ext.getElementById(eid))||(Ext.enableListenerCollection&&Ext.EventManager.removeAll(d),delete EC[eid])));if(Ext.isIE){t={};for(eid in EC)EC.hasOwnProperty(eid)&&(t[eid]=EC[eid]);EC=Ext.cache=t}}else clearInterval(Element.collectorThreadId)}var internalFly,DOC=document,EC=Ext.cache,Element=this,AbstractElement=Ext.dom.AbstractElement,focusRe=/^a|button|embed|iframe|input|object|select|textarea$/i,nonSpaceRe=/\S/,scriptTagRe=/(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/gi,replaceScriptTagRe=/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/gi,srcRe=/\ssrc=([\'\"])(.*?)\1/i,typeRe=/\stype=([\'\"])(.*?)\1/i,useDocForId=!Ext.isIE8m;Element.boxMarkup=['<div class="{0}-tl" role="presentation">','<div class="{0}-tr" role="presentation">','<div class="{0}-tc" role="presentation"></div>',"</div>","</div>",'<div class="{0}-ml" role="presentation">','<div class="{0}-mr" role="presentation">','<div class="{0}-mc" role="presentation"></div>',"</div>","</div>",'<div class="{0}-bl" role="presentation">','<div class="{0}-br" role="presentation">','<div class="{0}-bc" role="presentation"></div>',"</div>","</div>"].join(""),Element.collectorThreadId=setInterval(garbageCollect,3e4),Element.addMethods({monitorMouseLeave:function(delay,handler,scope){var timer,me=this,listeners={mouseleave:function(e){timer=setTimeout(Ext.Function.bind(handler,scope||me,[e]),delay)},mouseenter:function(){clearTimeout(timer)},freezeEvent:!0};return me.on(listeners),listeners},swallowEvent:function(eventName,preventDefault){var e,eLen,me=this,fn=function(e){e.stopPropagation(),preventDefault&&e.preventDefault()};if(Ext.isArray(eventName)){for(eLen=eventName.length,e=0;e<eLen;e++)me.on(eventName[e],fn);return me}return me.on(eventName,fn),me},relayEvent:function(eventName,observable){this.on(eventName,function(e){observable.fireEvent(eventName,e)})},clean:function(forceReclean){var nx,me=this,dom=me.dom,data=(me.$cache||me.getCache()).data,n=dom.firstChild,ni=-1;if(data.isCleaned&&!0!==forceReclean)return me;for(;n;)nx=n.nextSibling,3==n.nodeType?nonSpaceRe.test(n.nodeValue)?nx&&3==nx.nodeType&&(n.appendData(Ext.String.trim(nx.data)),dom.removeChild(nx),nx=n.nextSibling,n.nodeIndex=++ni):dom.removeChild(n):(internalFly.attach(n).clean(),n.nodeIndex=++ni),n=nx;return data.isCleaned=!0,me},load:function(options){return this.getLoader().load(options),this},getLoader:function(){var me=this,data=(me.$cache||me.getCache()).data,loader=data.loader;return loader||(data.loader=loader=new Ext.ElementLoader({target:me})),loader},syncContent:function(source){source=Ext.getDom(source);var i,destNode,sourceNode,nodeType,newAttrs,attLen,attName,sourceNodes=source.childNodes,sourceLen=sourceNodes.length,dest=this.dom,destNodes=dest.childNodes,destLen=destNodes.length;if(Ext.isIE9m&&dest.mergeAttributes)dest.mergeAttributes(source,!0),dest.src=source.src;else for(newAttrs=source.attributes,attLen=newAttrs.length,i=0;i<attLen;i++)"id"!==(attName=newAttrs[i].name)&&dest.setAttribute(attName,newAttrs[i].value);if(sourceLen!==destLen)return void(dest.innerHTML=source.innerHTML);for(i=0;i<sourceLen;i++){if(sourceNode=sourceNodes[i],destNode=destNodes[i],(nodeType=sourceNode.nodeType)!==destNode.nodeType||1===nodeType&&sourceNode.tagName!==destNode.tagName)return void(dest.innerHTML=source.innerHTML);3===nodeType?destNode.data=sourceNode.data:(sourceNode.id&&destNode.id!==sourceNode.id&&(destNode.id=sourceNode.id),destNode.style.cssText=sourceNode.style.cssText,destNode.className=sourceNode.className,internalFly.attach(destNode).syncContent(sourceNode))}},update:function(html,loadScripts,callback){var id,dom,interval,me=this;return me.dom?(html=html||"",dom=me.dom,!0!==loadScripts?(dom.innerHTML=html,Ext.callback(callback,me),me):(id=Ext.id(),html+='<span id="'+id+'" role="presentation"></span>',interval=setInterval(function(){var hd,match,attrs,srcMatch,typeMatch,el,s;if(!(el=DOC.getElementById(id)))return!1;for(clearInterval(interval),Ext.removeNode(el),hd=Ext.getHead().dom;match=scriptTagRe.exec(html);)attrs=match[1],srcMatch=!!attrs&&attrs.match(srcRe),srcMatch&&srcMatch[2]?(s=DOC.createElement("script"),s.src=srcMatch[2],typeMatch=attrs.match(typeRe),typeMatch&&typeMatch[2]&&(s.type=typeMatch[2]),hd.appendChild(s)):match[2]&&match[2].length>0&&(window.execScript?window.execScript(match[2]):window.eval(match[2]));Ext.callback(callback,me)},20),dom.innerHTML=html.replace(replaceScriptTagRe,""),me)):me},removeAllListeners:function(){return this.removeAnchor(),Ext.EventManager.removeAll(this.dom),this},createProxy:function(config,renderTo,matchBox){config="object"==typeof config?config:{tag:"div",role:"presentation",cls:config};var me=this,proxy=renderTo?Ext.DomHelper.append(renderTo,config,!0):Ext.DomHelper.insertBefore(me.dom,config,!0);return proxy.setVisibilityMode(Element.DISPLAY),proxy.hide(),matchBox&&me.setBox&&me.getBox&&proxy.setBox(me.getBox()),proxy},needsTabIndex:function(){if(this.dom)return"a"===this.dom.nodeName&&!this.dom.href||!focusRe.test(this.dom.nodeName)},isFocusable:function(asFocusEl){var tabIndex,dom=this.dom,tabIndexAttr=dom.getAttributeNode("tabIndex"),nodeName=dom.nodeName,canFocus=!1;return tabIndexAttr&&tabIndexAttr.specified&&(tabIndex=tabIndexAttr.value),dom&&!dom.disabled&&(-1==tabIndex?canFocus=Ext.FocusManager&&Ext.FocusManager.enabled&&asFocusEl:focusRe.test(nodeName)?("a"!==nodeName||dom.href)&&(canFocus=!0):canFocus=null!=tabIndex&&tabIndex>=0,canFocus=canFocus&&this.isVisible(!0)),canFocus}}),Ext.isIE9m&&(Element.prototype.getById=function(id,asDom){var cacheItem,el,ret,dom=this.dom;return dom&&(el=useDocForId&&DOC.getElementById(id)||dom.all[id])?(asDom?ret=el:(cacheItem=EC[id],ret=cacheItem&&cacheItem.el?Ext.updateCacheEntry(cacheItem,el).el:new Element(el)),ret):asDom?Ext.getDom(id):Element.get(id)}),Element.createAlias({addListener:"on",removeListener:"un",clearListeners:"removeAllListeners",focusable:"isFocusable"}),Element.Fly=AbstractElement.Fly=new Ext.Class({extend:Element,isFly:!0,constructor:function(dom){this.dom=dom,this.el=this},attach:AbstractElement.Fly.prototype.attach}),internalFly=new Element.Fly,Ext.isIE9m?Ext.getElementById=function(id){var detachedBodyEl,el=DOC.getElementById(id);return!el&&(detachedBodyEl=AbstractElement.detachedBodyEl)&&(el=detachedBodyEl.dom.all[id]),el}:DOC.querySelector||(Ext.getDetachedBody=Ext.getBody,Ext.getElementById=function(id){return DOC.getElementById(id)})});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:"Ext.CompositeElementLite",requires:["Ext.dom.Element","Ext.dom.Query"],statics:{importElementMethods:function(){var name,elementPrototype=Ext.dom.Element.prototype,prototype=this.prototype;for(name in elementPrototype)"function"==typeof elementPrototype[name]&&function(key){prototype[key]=prototype[key]||function(){return this.invoke(key,arguments)}}.call(prototype,name)}},constructor:function(elements,root){this.elements=[],this.add(elements,root),this.el=new Ext.dom.AbstractElement.Fly},isComposite:!0,getElement:function(el){return this.el.attach(el)},transformElement:function(el){return Ext.getDom(el)},getCount:function(){return this.elements.length},add:function(els,root){var i,ln,elements=this.elements;if(!els)return this;for("string"==typeof els?els=Ext.dom.Element.selectorFunction(els,root):els.isComposite?els=els.elements:Ext.isIterable(els)||(els=[els]),i=0,ln=els.length;i<ln;++i)elements.push(this.transformElement(els[i]));return this},invoke:function(fn,args){var element,i,elements=this.elements,ln=elements.length;for(fn=Ext.dom.Element.prototype[fn],i=0;i<ln;i++)(element=elements[i])&&fn.apply(this.getElement(element),args);return this},item:function(index){var el=this.elements[index],out=null;return el&&(out=this.getElement(el)),out},slice:function(){return this.elements.slice.apply(this.elements,arguments)},addListener:function(eventName,handler,scope,opt){var i,e,els=this.elements,len=els.length;for(i=0;i<len;i++)(e=els[i])&&Ext.EventManager.on(e,eventName,handler,scope||e,opt);return this},each:function(fn,scope){var i,e,me=this,els=me.elements,len=els.length;for(i=0;i<len&&(!(e=els[i])||(e=this.getElement(e),!1!==fn.call(scope||e,e,me,i)));i++);return me},fill:function(els){var me=this;return me.elements=[],me.add(els),me},insert:function(index,nodes){Ext.Array.insert(this.elements,index,nodes)},filter:function(selector){for(var el,me=this,els=me.elements,len=els.length,out=[],i=0,isFunc="function"==typeof selector;i<len;i++)el=els[i],!1,el&&(el=me.getElement(el),(isFunc?!1!==selector.call(el,el,me,i):el.is(selector))&&out.push(me.transformElement(el)));return me.elements=out,me},indexOf:function(el){return Ext.Array.indexOf(this.elements,this.transformElement(el))},replaceElement:function(el,replacement,domReplace){var d,index=isNaN(el)?this.indexOf(el):el;return index>-1&&(replacement=Ext.getDom(replacement),domReplace&&(d=this.elements[index],d.parentNode.insertBefore(replacement,d),Ext.removeNode(d)),Ext.Array.splice(this.elements,index,1,replacement)),this},clear:function(removeDom){var me=this,els=me.elements,i=els.length-1;if(removeDom)for(;i>=0;i--)Ext.removeNode(els[i]);this.elements=[]},addElements:function(els,root){if(!els)return this;"string"==typeof els&&(els=Ext.dom.Element.selectorFunction(els,root));var e,yels=this.elements,eLen=els.length;for(e=0;e<eLen;e++)yels.push(Ext.get(els[e]));return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(el){return-1!=this.indexOf(el)},removeElement:function(keys,removeDom){keys=[].concat(keys);var val,el,k,me=this,elements=me.elements,kLen=keys.length;for(k=0;k<kLen;k++)val=keys[k],(el=elements[val]||elements[val=me.indexOf(val)])&&(removeDom&&(el.dom?el.remove():Ext.removeNode(el)),Ext.Array.erase(elements,val,1));return me}},function(){this.importElementMethods(),this.prototype.on=this.prototype.addListener,Ext.DomQuery&&(Ext.dom.Element.selectorFunction=Ext.DomQuery.select),Ext.dom.Element.select=function(selector,root){var elements;if("string"==typeof selector)elements=Ext.dom.Element.selectorFunction(selector,root);else{if(void 0===selector.length)throw new Error("[Ext.select] Invalid selector specified: "+selector);elements=selector}return new Ext.CompositeElementLite(elements)},Ext.select=function(){return Ext.dom.Element.select.apply(Ext.dom.Element,arguments)}});Ext.define("Ext.dom.CompositeElement",{alternateClassName:"Ext.CompositeElement",extend:"Ext.dom.CompositeElementLite",getElement:function(el){return el},transformElement:function(el){return Ext.get(el)}},function(){Ext.dom.Element.select=function(selector,unique,root){var elements;if("string"==typeof selector)elements=Ext.dom.Element.selectorFunction(selector,root);else{if(void 0===selector.length)throw new Error("[Ext.select] Invalid selector specified: "+selector);elements=selector}return!0===unique?new Ext.CompositeElement(elements):new Ext.CompositeElementLite(elements)}}),Ext.select=Ext.Element.select;Ext.define("Ext.util.HashMap",{mixins:{observable:"Ext.util.Observable"},generation:0,constructor:function(config){config=config||{};var me=this,keyFn=config.keyFn;me.initialConfig=config,me.addEvents("add","clear","remove","replace"),me.mixins.observable.constructor.call(me,config),me.clear(!0),keyFn&&(me.getKey=keyFn)},getCount:function(){return this.length},getData:function(key,value){return void 0===value&&(value=key,key=this.getKey(value)),[key,value]},getKey:function(o){return o.id},add:function(key,value){var me=this;return 1===arguments.length&&(value=key,key=me.getKey(value)),me.containsKey(key)?me.replace(key,value):(me.map[key]=value,++me.length,me.generation++,me.hasListeners.add&&me.fireEvent("add",me,key,value),value)},replace:function(key,value){var old,me=this,map=me.map;return 1===arguments.length&&(value=key,key=me.getKey(value)),me.containsKey(key)||me.add(key,value),old=map[key],map[key]=value,me.generation++,me.hasListeners.replace&&me.fireEvent("replace",me,key,value,old),value},remove:function(o){var key=this.findKey(o);return void 0!==key&&this.removeAtKey(key)},removeAtKey:function(key){var value,me=this;return!!me.containsKey(key)&&(value=me.map[key],delete me.map[key],--me.length,me.generation++,me.hasListeners.remove&&me.fireEvent("remove",me,key,value),!0)},get:function(key){var map=this.map;return map.hasOwnProperty(key)?map[key]:void 0},clear:function(initial){var me=this;return(initial||me.generation)&&(me.map={},me.length=0,me.generation=initial?0:me.generation+1),!0!==initial&&me.hasListeners.clear&&me.fireEvent("clear",me),me},containsKey:function(key){var map=this.map;return map.hasOwnProperty(key)&&void 0!==map[key]},contains:function(value){return this.containsKey(this.findKey(value))},getKeys:function(){return this.getArray(!0)},getValues:function(){return this.getArray(!1)},getArray:function(isKey){var key,arr=[],map=this.map;for(key in map)map.hasOwnProperty(key)&&arr.push(isKey?key:map[key]);return arr},each:function(fn,scope){var key,items=Ext.apply({},this.map),length=this.length;scope=scope||this;for(key in items)if(items.hasOwnProperty(key)&&!1===fn.call(scope,key,items[key],length))break;return this},clone:function(){var key,hash=new this.self(this.initialConfig),map=this.map;hash.suspendEvents();for(key in map)map.hasOwnProperty(key)&&hash.add(key,map[key]);return hash.resumeEvents(),hash},findKey:function(value){var key,map=this.map;for(key in map)if(map.hasOwnProperty(key)&&map[key]===value)return key}});Ext.define("Ext.AbstractManager",{requires:["Ext.util.HashMap"],typeName:"type",constructor:function(config){Ext.apply(this,config||{}),this.all=new Ext.util.HashMap,this.types={}},get:function(id){return this.all.get(id)},register:function(item){var all=this.all,key=all.getKey(item);all.containsKey(key)&&Ext.Error.raise('Registering duplicate id "'+key+'" with this manager'),this.all.add(item)},unregister:function(item){this.all.remove(item)},registerType:function(type,cls){this.types[type]=cls,cls[this.typeName]=type},isRegistered:function(type){return void 0!==this.types[type]},create:function(config,defaultType){var type=config[this.typeName]||config.type||defaultType,Constructor=this.types[type];return void 0===Constructor&&Ext.Error.raise("The '"+type+"' type has not been registered with this manager"),new Constructor(config)},onAvailable:function(id,fn,scope){var item,callback,all=this.all;all.containsKey(id)?(item=all.get(id),fn.call(scope||item,item)):(callback=function(map,key,item){key==id&&(fn.call(scope||item,item),all.un("add",callback))},all.on("add",callback))},each:function(fn,scope){this.all.each(fn,scope||this)},getCount:function(){return this.all.getCount()}});Ext.define("Ext.ComponentManager",{extend:"Ext.AbstractManager",alternateClassName:"Ext.ComponentMgr",singleton:!0,typeName:"xtype",create:function(component,defaultType){return"string"==typeof component?Ext.widget(component):component.isComponent?component:Ext.widget(component.xtype||defaultType,component)},registerType:function(type,cls){this.types[type]=cls,cls[this.typeName]=type,cls.prototype[this.typeName]=type}},function(){Ext.getCmp=function(id){return Ext.ComponentManager.get(id)}});Ext.define("Ext.ComponentQuery",{singleton:!0,requires:["Ext.ComponentManager","Ext.dom.Query"]},function(){var cq=this,domQueryOperators=Ext.dom.Query.operators,nthRe=/(\d*)n\+?(\d*)/,nthRe2=/\D/,filterFnPattern=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),filterItems=function(items,operation){return operation.method.apply(this,[items].concat(operation.args))},getItems=function(items,mode){for(var candidate,result=[],i=0,length=items.length,deep=">"!==mode;i<length;i++)candidate=items[i],candidate.getRefItems&&(result=result.concat(candidate.getRefItems(deep)));return result},getAncestors=function(items){for(var candidate,result=[],i=0,length=items.length;i<length;i++)for(candidate=items[i];candidate=candidate.getRefOwner();)result.push(candidate);return result},filterByXType=function(items,xtype,shallow){if("*"===xtype)return items.slice();for(var candidate,result=[],i=0,length=items.length;i<length;i++)candidate=items[i],candidate.isXType(xtype,shallow)&&result.push(candidate);return result},filterByClassName=function(items,className){for(var candidate,result=[],i=0,length=items.length;i<length;i++)candidate=items[i],candidate.hasCls(className)&&result.push(candidate);return result},filterByAttribute=function(items,property,operator,compareTo){var mustBeOwnProperty,presenceOnly,candidate,propValue,j,propLen,result=[],i=0,length=items.length;for("@"===property.charAt(0)&&(mustBeOwnProperty=!0,property=property.substr(1)),"?"===property.charAt(0)&&(mustBeOwnProperty=!0,presenceOnly=!0,property=property.substr(1));i<length;i++)if(candidate=items[i],!mustBeOwnProperty||candidate.hasOwnProperty(property))if(propValue=candidate[property],presenceOnly)result.push(candidate);else if("~="===operator){if(propValue)for(Ext.isArray(propValue)||(propValue=propValue.split(" ")),j=0,propLen=propValue.length;j<propLen;j++)if(domQueryOperators[operator](Ext.coerce(propValue[j],compareTo),compareTo)){result.push(candidate);break}}else(compareTo?domQueryOperators[operator](Ext.coerce(propValue,compareTo),compareTo):!!candidate[property])&&result.push(candidate);return result},filterById=function(items,id){for(var candidate,result=[],i=0,length=items.length;i<length;i++)candidate=items[i],candidate.getItemId()===id&&result.push(candidate);return result},filterByPseudo=function(items,name,value){return cq.pseudos[name](items,value)},modeRe=/^(\s?([>\^])\s?|\s|$)/,tokenRe=/^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,matchers=[{re:/^\.([\w\-]+)(?:\((true|false)\))?/,method:filterByXType},{re:/^(?:\[((?:[@?$])?[\w\-]*)\s*(?:([\^$*~%!]?=)\s*['"]?(.*?)["']?)?\])/,method:filterByAttribute},{re:/^#([\w\-]+)/,method:filterById},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:filterByPseudo},{re:/^(?:\{([^\}]+)\})/,method:filterFnPattern}];cq.Query=Ext.extend(Object,{constructor:function(cfg){cfg=cfg||{},Ext.apply(this,cfg)},execute:function(root){var operation,workingItems,operations=this.operations,i=0,length=operations.length;for(root?Ext.isIterable(root)?workingItems=root:root.isMixedCollection&&(workingItems=root.items):workingItems=Ext.ComponentManager.all.getArray();i<length;i++)if(operation=operations[i],workingItems="^"===operation.mode?getAncestors(workingItems||[root]):operation.mode?getItems(workingItems||[root],operation.mode):filterItems(workingItems||getItems([root]),operation),i===length-1)return workingItems;return[]},is:function(component){var operation,i,j,mode,items,item,operations=this.operations,len=operations.length,active=[component];for(i=len-1;i>=0;--i)if(operation=operations[i],mode=operation.mode){if("^"===mode)active=getItems(active," ");else if(">"===mode){for(items=[],j=0,len=active.length;j<len;++j)(item=active[j].getRefOwner())&&items.push(item);active=items}else active=getAncestors(active);if(0===active.length)return!1}else if(active=filterItems(active,operation),0===active.length)return!1;return!0},getMatches:function(components,operations){var i,len=operations.length;for(i=0;i<len&&(components=filterItems(components,operations[i]),0!==components.length);++i);return components}}),Ext.apply(this,{cache:{},pseudos:{not:function(components,selector){for(var component,CQ=Ext.ComponentQuery,i=0,length=components.length,results=[],index=-1;i<length;++i)component=components[i],CQ.is(component,selector)||(results[++index]=component);return results},first:function(components){var ret=[];return components.length>0&&ret.push(components[0]),ret},last:function(components){var len=components.length,ret=[];return len>0&&ret.push(components[len-1]),ret},focusable:function(cmps){for(var c,len=cmps.length,results=[],i=0;i<len;i++)c=cmps[i],c.isFocusable()&&results.push(c);return results},"nth-child":function(c,a){var i,n,nodeIndex,result=[],m=nthRe.exec("even"==a&&"2n"||"odd"==a&&"2n+1"||!nthRe2.test(a)&&"n+"+a||a),f=(m[1]||1)-0,l=m[2]-0;for(i=0;n=c[i];i++)nodeIndex=i+1,1==f?0!=l&&nodeIndex!=l||result.push(n):(nodeIndex+l)%f==0&&result.push(n);return result}},query:function(selector,root){for(var query,resultsLn,cmp,selectors=selector.split(","),length=selectors.length,i=0,results=[],noDupResults=[],dupMatcher={};i<length;i++)selector=Ext.String.trim(selectors[i]),query=this.cache[selector]||(this.cache[selector]=this.parse(selector)),results=results.concat(query.execute(root));if(length>1){for(resultsLn=results.length,i=0;i<resultsLn;i++)cmp=results[i],dupMatcher[cmp.id]||(noDupResults.push(cmp),dupMatcher[cmp.id]=!0);results=noDupResults}return results},is:function(component,selector){if(!selector)return!0;for(var query,selectors=selector.split(","),length=selectors.length,i=0;i<length;i++)if(selector=Ext.String.trim(selectors[i]),query=this.cache[selector]||(this.cache[selector]=this.parse(selector)),query.is(component))return!0;return!1},parse:function(selector){for(var lastSelector,tokenMatch,matchedChar,modeMatch,selectorMatch,i,matcher,method,operations=[],length=matchers.length;selector&&lastSelector!==selector;){for(lastSelector=selector,tokenMatch=selector.match(tokenRe),tokenMatch&&(matchedChar=tokenMatch[1],"#"===matchedChar?operations.push({method:filterById,args:[Ext.String.trim(tokenMatch[2])]}):"."===matchedChar?operations.push({method:filterByClassName,args:[Ext.String.trim(tokenMatch[2])]}):operations.push({method:filterByXType,args:[Ext.String.trim(tokenMatch[2]),Boolean(tokenMatch[3])]}),selector=selector.replace(tokenMatch[0],""));!(modeMatch=selector.match(modeRe));)for(i=0;selector&&i<length;i++){if(matcher=matchers[i],selectorMatch=selector.match(matcher.re),method=matcher.method,selectorMatch){operations.push({method:Ext.isString(matcher.method)?Ext.functionFactory("items",Ext.String.format.apply(Ext.String,[method].concat(selectorMatch.slice(1)))):matcher.method,args:selectorMatch.slice(1)}),selector=selector.replace(selectorMatch[0],"");break}i===length-1&&Ext.Error.raise('Invalid ComponentQuery selector: "'+arguments[0]+'"')}modeMatch[1]&&(operations.push({mode:modeMatch[2]||modeMatch[1]}),selector=selector.replace(modeMatch[0],""))}return new cq.Query({operations:operations})}})});Ext.define("Ext.util.ProtoElement",function(){var splitWords=Ext.String.splitWords,toMap=Ext.Array.toMap;return{isProtoEl:!0,clsProp:"cls",styleProp:"style",removedProp:"removed",styleIsText:!1,constructor:function(config){var me=this;Ext.apply(me,config),me.classList=splitWords(me.cls),me.classMap=toMap(me.classList),delete me.cls,Ext.isFunction(me.style)?(me.styleFn=me.style,delete me.style):"string"==typeof me.style?me.style=Ext.Element.parseStyles(me.style):me.style&&(me.style=Ext.apply({},me.style))},flush:function(){this.flushClassList=[],this.removedClasses={},delete this.style,delete this.unselectableAttr},addCls:function(cls){for(var c,me=this,add="string"==typeof cls?splitWords(cls):cls,length=add.length,list=me.classList,map=me.classMap,flushList=me.flushClassList,i=0;i<length;++i)c=add[i],map[c]||(map[c]=!0,list.push(c),flushList&&(flushList.push(c),delete me.removedClasses[c]));return me},hasCls:function(cls){return cls in this.classMap},removeCls:function(cls){var i,c,me=this,list=me.classList,newList=me.classList=[],remove=toMap(splitWords(cls)),length=list.length,map=me.classMap,removedClasses=me.removedClasses;for(i=0;i<length;++i)c=list[i],remove[c]?(removedClasses&&map[c]&&(removedClasses[c]=!0,Ext.Array.remove(me.flushClassList,c)),delete map[c]):newList.push(c);return me},setStyle:function(prop,value){var me=this,style=me.style||(me.style={});return"string"==typeof prop?1===arguments.length?me.setStyle(Ext.Element.parseStyles(prop)):style[prop]=value:Ext.apply(style,prop),me},unselectable:function(){this.addCls(Ext.dom.Element.unselectableCls),Ext.isOpera&&(this.unselectableAttr=!0)},writeTo:function(to){var style,me=this,classList=me.flushClassList||me.classList,removedClasses=me.removedClasses;return me.styleFn?(style=Ext.apply({},me.styleFn()),Ext.apply(style,me.style)):style=me.style,to[me.clsProp]=classList.join(" "),style&&(to[me.styleProp]=me.styleIsText?Ext.DomHelper.generateStyles(style,null,!0):style),removedClasses&&(removedClasses=Ext.Object.getKeys(removedClasses),removedClasses.length&&(to[me.removedProp]=removedClasses.join(" "))),me.unselectableAttr&&(to.unselectable="on"),to}}}());Ext.define("Ext.PluginManager",{extend:"Ext.AbstractManager",alternateClassName:"Ext.PluginMgr",singleton:!0,typeName:"ptype",create:function(config,defaultType,host){var result;return config.init?result=config:(host?(config=Ext.apply({},config),config.cmp=host):host=config.cmp,config.xclass?result=Ext.create(config):"function"==typeof(result=Ext.ClassManager.getByAlias("plugin."+(config.ptype||defaultType)))&&(result=new result(config))),result&&host&&result.setCmp&&!result.setCmpCalled&&(result.setCmp(host),result.setCmpCalled=!0),result},findByType:function(type,defaultsOnly){var name,item,matches=[],types=this.types;for(name in types)types.hasOwnProperty(name)&&(item=types[name],item.type==type&&(!defaultsOnly||!0===defaultsOnly&&item.isDefault)&&matches.push(item));return matches}},function(){Ext.preg=function(){return Ext.PluginManager.registerType.apply(Ext.PluginManager,arguments)}});Ext.define("Ext.util.Filter",{id:null,anyMatch:!1,exactMatch:!1,caseSensitive:!1,disabled:!1,operator:null,statics:{createFilterFn:function(filters){return filters&&filters.length?function(candidate){var i,filter,isMatch=!0,length=filters.length;for(i=0;isMatch&&i<length;i++)filter=filters[i],filter.disabled||(isMatch=isMatch&&filter.filterFn.call(filter.scope||filter,candidate));return isMatch}:function(){return!0}}},operatorFns:{"<":function(candidate){return Ext.coerce(this.getRoot(candidate)[this.property],this.value)<this.value},"<=":function(candidate){return Ext.coerce(this.getRoot(candidate)[this.property],this.value)<=this.value},"=":function(candidate){return Ext.coerce(this.getRoot(candidate)[this.property],this.value)==this.value},">=":function(candidate){return Ext.coerce(this.getRoot(candidate)[this.property],this.value)>=this.value},">":function(candidate){return Ext.coerce(this.getRoot(candidate)[this.property],this.value)>this.value},"!=":function(candidate){return Ext.coerce(this.getRoot(candidate)[this.property],this.value)!=this.value}},constructor:function(config){var me=this;me.initialConfig=config,Ext.apply(me,config),me.filter=me.filter||me.filterFn,void 0===me.filter&&me.setValue(config.value)},setValue:function(value){var me=this;me.value=value,void 0===me.property||void 0===me.value||(me.filter=me.createFilterFn()),me.filterFn=me.filter},setFilterFn:function(filterFn){this.filterFn=this.filter=filterFn},createFilterFn:function(){var me=this,matcher=me.createValueMatcher(),property=me.property;return me.operator?me.operatorFns[me.operator]:function(item){var value=me.getRoot(item)[property];return null===matcher?null===value:matcher.test(value)}},getRoot:function(item){var root=this.root;return void 0===root?item:item[root]},createValueMatcher:function(){var me=this,value=me.value,anyMatch=me.anyMatch,exactMatch=me.exactMatch,caseSensitive=me.caseSensitive,escapeRe=Ext.String.escapeRegex;return null===value?value:(value.exec||(value=String(value),!0===anyMatch?value=escapeRe(value):(value="^"+escapeRe(value),!0===exactMatch&&(value+="$")),value=new RegExp(value,caseSensitive?"":"i")),value)},serialize:function(){var me=this,result=Ext.apply({},me.initialConfig);return result.value=me.value,result}},function(){this.prototype.operatorFns["=="]=this.prototype.operatorFns["="]});Ext.define("Ext.util.AbstractMixedCollection",{requires:["Ext.util.Filter"],mixins:{observable:"Ext.util.Observable"},isMixedCollection:!0,generation:0,indexGeneration:0,constructor:function(allowFunctions,keyFn){var me=this;1===arguments.length&&Ext.isObject(allowFunctions)?(me.initialConfig=allowFunctions,Ext.apply(me,allowFunctions)):(me.allowFunctions=!0===allowFunctions,keyFn&&(me.getKey=keyFn),me.initialConfig={allowFunctions:me.allowFunctions,getKey:me.getKey}),me.items=[],me.map={},me.keys=[],me.indexMap={},me.length=0,me.mixins.observable.constructor.call(me)},allowFunctions:!1,add:function(key,obj){var len=this.length;return 1===arguments.length?this.insert(len,key):this.insert(len,key,obj)},getKey:function(o){return o.id},replace:function(key,o){var old,index,me=this;return 1==arguments.length&&(o=arguments[0],key=me.getKey(o)),old=me.map[key],void 0===key||null===key||void 0===old?me.add(key,o):(me.generation++,index=me.indexOfKey(key),me.items[index]=o,me.map[key]=o,me.hasListeners.replace&&me.fireEvent("replace",key,old,o),o)},updateKey:function(oldKey,newKey){var item,me=this,map=me.map,indexMap=me.indexMap,index=me.indexOfKey(oldKey);index>-1&&(item=map[oldKey],delete map[oldKey],delete indexMap[oldKey],map[newKey]=item,indexMap[newKey]=index,me.keys[index]=newKey,me.indexGeneration=++me.generation)},addAll:function(objs){var key,me=this;if(arguments.length>1||Ext.isArray(objs))me.insert(me.length,arguments.length>1?arguments:objs);else for(key in objs)objs.hasOwnProperty(key)&&(me.allowFunctions||"function"!=typeof objs[key])&&me.add(key,objs[key])},each:function(fn,scope){for(var item,items=Ext.Array.push([],this.items),i=0,len=items.length;i<len&&(item=items[i],!1!==fn.call(scope||item,item,i,len));i++);},eachKey:function(fn,scope){for(var keys=this.keys,items=this.items,i=0,len=keys.length;i<len;i++)fn.call(scope||window,keys[i],items[i],i,len)},findBy:function(fn,scope){for(var keys=this.keys,items=this.items,i=0,len=items.length;i<len;i++)if(fn.call(scope||window,items[i],keys[i]))return items[i];return null},find:function(){return Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.util.MixedCollection: find has been deprecated. Use findBy instead."),this.findBy.apply(this,arguments)},insert:function(index,key,obj){var out;return Ext.isIterable(key)?out=this.doInsert(index,key,obj):(out=arguments.length>2?this.doInsert(index,[key],[obj]):this.doInsert(index,[key]),out=out[0]),out},doInsert:function(index,keys,objects){var itemKey,removeIndex,i,syncIndices,passedDuplicates,oldKeys,oldObjects,me=this,len=keys.length,deDupedLen=len,fireAdd=me.hasListeners.add,newKeys={};if(null!=objects)me.useLinearSearch=!0;else for(objects=keys,keys=new Array(len),i=0;i<len;i++)keys[i]=this.getKey(objects[i]);for(me.suspendEvents(),i=0;i<len;i++)itemKey=keys[i],removeIndex=me.indexOfKey(itemKey),-1!==removeIndex&&(removeIndex<index&&index--,me.removeAt(removeIndex)),null!=itemKey&&(null!=newKeys[itemKey]&&(passedDuplicates=!0,deDupedLen--),newKeys[itemKey]=i);if(me.resumeEvents(),passedDuplicates){oldKeys=keys,oldObjects=objects,keys=new Array(deDupedLen),objects=new Array(deDupedLen),i=0;for(itemKey in newKeys)keys[i]=oldKeys[newKeys[itemKey]],objects[i]=oldObjects[newKeys[itemKey]],i++;len=deDupedLen}for(syncIndices=index===me.length&&me.indexGeneration===me.generation,Ext.Array.insert(me.items,index,objects),Ext.Array.insert(me.keys,index,keys),me.length+=len,me.generation++,syncIndices&&(me.indexGeneration=me.generation),i=0;i<len;i++,index++)itemKey=keys[i],null!=itemKey&&(me.map[itemKey]=objects[i],syncIndices&&(me.indexMap[itemKey]=index)),fireAdd&&me.fireEvent("add",index,objects[i],itemKey);return objects},remove:function(o){var removeKey,index,me=this;return-1!==(index=!me.useLinearSearch&&(removeKey=me.getKey(o))?me.indexOfKey(removeKey):Ext.Array.indexOf(me.items,o))&&me.removeAt(index)},removeAll:function(items){var i,me=this;if(items||me.hasListeners.remove)if(items)for(i=items.length-1;i>=0;--i)me.remove(items[i]);else for(;me.length;)me.removeAt(0);else me.length=me.items.length=me.keys.length=0,me.map={},me.indexMap={},me.generation++,me.indexGeneration=me.generation},removeAt:function(index){var o,key,me=this;return index<me.length&&index>=0&&(me.length--,o=me.items[index],Ext.Array.erase(me.items,index,1),key=me.keys[index],void 0!==key&&delete me.map[key],Ext.Array.erase(me.keys,index,1),me.hasListeners.remove&&me.fireEvent("remove",o,key),me.generation++,o)},removeRange:function(index,removeCount){var o,key,i,limit,syncIndices,trimming,me=this;if(index<me.length&&index>=0){for(removeCount||(removeCount=1),limit=Math.min(index+removeCount,me.length),removeCount=limit-index,trimming=limit===me.length,syncIndices=trimming&&me.indexGeneration===me.generation,i=index;i<limit;i++)null!=(key=me.keys[i])&&(delete me.map[key],syncIndices&&delete me.indexMap[key]);return o=me.items[i-1],me.length-=removeCount,me.generation++,syncIndices&&(me.indexGeneration=me.generation),trimming?me.items.length=me.keys.length=me.length:(me.items.splice(index,removeCount),me.keys.splice(index,removeCount)),o}return!1},removeAtKey:function(key){var i,me=this,keys=me.keys;if(null!=key)return me.removeAt(me.indexOfKey(key));for(i=keys.length-1;i>=0;i--)null==keys[i]&&me.removeAt(i)},getCount:function(){return this.length},indexOf:function(o){var key,me=this;return null!=o?!me.useLinearSearch&&(key=me.getKey(o))?this.indexOfKey(key):Ext.Array.indexOf(me.items,o):-1},indexOfKey:function(key){return this.map.hasOwnProperty(key)?(this.indexGeneration!==this.generation&&this.rebuildIndexMap(),this.indexMap[key]):-1},rebuildIndexMap:function(){var i,me=this,indexMap=me.indexMap={},keys=me.keys,len=keys.length;for(i=0;i<len;i++)indexMap[keys[i]]=i;me.indexGeneration=me.generation},get:function(key){var me=this,mk=me.map[key],item=void 0!==mk?mk:"number"==typeof key?me.items[key]:void 0;return"function"!=typeof item||me.allowFunctions?item:null},getAt:function(index){return this.items[index]},getByKey:function(key){return this.map[key]},contains:function(o){var key,me=this;return null!=o&&(!me.useLinearSearch&&(key=me.getKey(o))?null!=this.map[key]:-1!==Ext.Array.indexOf(this.items,o))},containsKey:function(key){return this.map.hasOwnProperty(key)},clear:function(){var me=this;me.generation&&(me.length=0,me.items=[],me.keys=[],me.map={},me.indexMap={},me.generation++,me.indexGeneration=me.generation),me.hasListeners.clear&&me.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},sum:function(property,root,start,end){var i,values=this.extractValues(property,root),length=values.length,sum=0;for(start=start||0,end=end||0===end?end:length-1,i=start;i<=end;i++)sum+=values[i];return sum},collect:function(property,root,allowNull){var value,strValue,i,values=this.extractValues(property,root),length=values.length,hits={},unique=[];for(i=0;i<length;i++)value=values[i],strValue=String(value),!allowNull&&Ext.isEmpty(value)||hits[strValue]||(hits[strValue]=!0,unique.push(value));return unique},extractValues:function(property,root){var values=this.items;return root&&(values=Ext.Array.pluck(values,root)),Ext.Array.pluck(values,property)},hasRange:function(start,end){return end<this.length},getRange:function(start,end){var tmp,reverse,me=this,items=me.items,range=[],len=items.length;return len<1?range:(start>end&&(reverse=!0,tmp=start,start=end,end=tmp),start<0&&(start=0),(null==end||end>=len)&&(end=len-1),range=items.slice(start,end+1),reverse&&range.length&&range.reverse(),range)},filter:function(property,value,anyMatch,caseSensitive){var filters=[];return Ext.isString(property)?filters.push(new Ext.util.Filter({property:property,value:value,anyMatch:anyMatch,caseSensitive:caseSensitive})):(Ext.isArray(property)||property instanceof Ext.util.Filter)&&(filters=filters.concat(property)),this.filterBy(Ext.util.Filter.createFilterFn(filters))},filterBy:function(fn,scope){var i,me=this,newMC=new me.self(me.initialConfig),keys=me.keys,items=me.items,length=items.length;for(newMC.getKey=me.getKey,i=0;i<length;i++)fn.call(scope||me,items[i],keys[i])&&newMC.add(keys[i],items[i]);return newMC.useLinearSearch=me.useLinearSearch,newMC},findIndex:function(property,value,start,anyMatch,caseSensitive){return Ext.isEmpty(value,!1)?-1:(value=this.createValueMatcher(value,anyMatch,caseSensitive),this.findIndexBy(function(o){return o&&value.test(o[property])},null,start))},findIndexBy:function(fn,scope,start){for(var me=this,keys=me.keys,items=me.items,i=start||0,len=items.length;i<len;i++)if(fn.call(scope||me,items[i],keys[i]))return i;return-1},createValueMatcher:function(value,anyMatch,caseSensitive,exactMatch){if(!value.exec){var er=Ext.String.escapeRegex;value=String(value),!0===anyMatch?value=er(value):(value="^"+er(value),!0===exactMatch&&(value+="$")),value=new RegExp(value,caseSensitive?"":"i")}return value},clone:function(){var me=this,copy=new me.self(me.initialConfig);return copy.add(me.keys,me.items),copy.useLinearSearch=me.useLinearSearch,copy}});Ext.define("Ext.util.Sorter",{direction:"ASC",constructor:function(config){var me=this;Ext.apply(me,config),void 0===me.property&&void 0===me.sorterFn&&Ext.Error.raise("A Sorter requires either a property or a sorter function"),me.updateSortFunction()},createSortFunction:function(sorterFn){var me=this,direction=me.direction||"ASC",modifier="DESC"==direction.toUpperCase()?-1:1;return function(o1,o2){return modifier*sorterFn.call(me,o1,o2)}},defaultSorterFn:function(o1,o2){var me=this,transform=me.transform,v1=me.getRoot(o1)[me.property],v2=me.getRoot(o2)[me.property];return transform&&(v1=transform(v1),v2=transform(v2)),v1>v2?1:v1<v2?-1:0},getRoot:function(item){return void 0===this.root?item:item[this.root]},setDirection:function(direction){var me=this;me.direction=direction?direction.toUpperCase():direction,me.updateSortFunction()},toggle:function(){var me=this;me.direction=Ext.String.toggle(me.direction,"ASC","DESC"),me.updateSortFunction()},updateSortFunction:function(fn){var me=this;fn=fn||me.sorterFn||me.defaultSorterFn,me.sort=me.createSortFunction(fn)},serialize:function(){return{root:this.root,property:this.property,direction:this.direction}}});Ext.define("Ext.util.Sortable",{isSortable:!0,defaultSortDirection:"ASC",requires:["Ext.util.Sorter"],statics:{createComparator:function(sorters){return sorters&&sorters.length?function(r1,r2){for(var result=sorters[0].sort(r1,r2),length=sorters.length,i=1;i<length;i++)result=result||sorters[i].sort.call(this,r1,r2);return result}:function(){return 0}}},initSortable:function(){var me=this,sorters=me.sorters;me.sorters=new Ext.util.AbstractMixedCollection(!1,function(item){return item.id||item.property}),sorters&&me.sorters.addAll(me.decodeSorters(sorters))},sort:function(sorters,direction,where,doSort){var sorter,newSorters,me=this;return Ext.isArray(sorters)?(doSort=where,where=direction,newSorters=sorters):Ext.isObject(sorters)?(doSort=where,where=direction,newSorters=[sorters]):Ext.isString(sorters)&&(sorter=me.sorters.get(sorters),sorter?void 0===direction?sorter.toggle():sorter.setDirection(direction):(sorter={property:sorters,direction:direction},newSorters=[sorter])),newSorters&&newSorters.length&&(newSorters=me.decodeSorters(newSorters),Ext.isString(where)?"prepend"===where?me.sorters.insert(0,newSorters):me.sorters.addAll(newSorters):(me.sorters.clear(),me.sorters.addAll(newSorters))),!1!==doSort&&(me.fireEvent("beforesort",me,newSorters),me.onBeforeSort(newSorters),sorters=me.sorters.items,sorters.length&&me.doSort(me.generateComparator())),sorters},generateComparator:function(){var sorters=this.sorters.getRange();return sorters.length?this.createComparator(sorters):this.emptyComparator},emptyComparator:function(){return 0},onBeforeSort:Ext.emptyFn,decodeSorters:function(sorters){Ext.isArray(sorters)||(sorters=void 0===sorters?[]:[sorters]);var field,config,i,length=sorters.length,Sorter=Ext.util.Sorter,fields=this.model?this.model.prototype.fields:null;for(i=0;i<length;i++)(config=sorters[i])instanceof Sorter||(Ext.isString(config)&&(config={property:config}),Ext.applyIf(config,{root:this.sortRoot,direction:"ASC"}),config.fn&&(config.sorterFn=config.fn),"function"==typeof config&&(config={sorterFn:config}),fields&&!config.transform&&(field=fields.get(config.property),config.transform=field&&field.sortType!==Ext.identityFn?field.sortType:void 0),sorters[i]=new Ext.util.Sorter(config));return sorters},getSorters:function(){return this.sorters.items},getFirstSorter:function(){for(var sorter,sorters=this.sorters.items,len=sorters.length,i=0;i<len;++i)if(sorter=sorters[i],!sorter.isGrouper)return sorter;return null}},function(){this.prototype.createComparator=this.createComparator});Ext.define("Ext.util.MixedCollection",{extend:"Ext.util.AbstractMixedCollection",mixins:{sortable:"Ext.util.Sortable"},constructor:function(){var me=this;me.callParent(arguments),me.addEvents("sort"),me.mixins.sortable.initSortable.call(me)},doSort:function(sorterFn){this.sortBy(sorterFn)},_sort:function(property,dir,fn){var i,len,o,me=this,dsc="DESC"==String(dir).toUpperCase()?-1:1,c=[],keys=me.keys,items=me.items;for(fn=fn||function(a,b){return a-b},i=0,len=items.length;i<len;i++)c[c.length]={key:keys[i],value:items[i],index:i};for(Ext.Array.sort(c,function(a,b){return fn(a[property],b[property])*dsc||(a.index<b.index?-1:1)}),i=0,len=c.length;i<len;i++)o=c[i],items[i]=o.value,keys[i]=o.key,me.indexMap[o.key]=i;me.generation++,me.indexGeneration=me.generation,me.fireEvent("sort",me)},sortBy:function(sorterFn){var item,key,i,me=this,items=me.items,keys=me.keys,length=items.length;for(i=0;i<length;i++)items[i].$extCollectionIndex=i;for(Ext.Array.sort(items,function(a,b){return sorterFn(a,b)||(a.$extCollectionIndex<b.$extCollectionIndex?-1:1)}),i=0;i<length;i++)item=items[i],key=me.getKey(item),keys[i]=key,me.indexMap[key]=i,delete items.$extCollectionIndex;me.generation++,me.indexGeneration=me.generation,me.fireEvent("sort",me,items,keys)},findInsertionIndex:function(newItem,sorterFn){var middle,comparison,me=this,items=me.items,start=0,end=items.length-1;for(sorterFn||(sorterFn=me.generateComparator());start<=end;)middle=start+end>>1,comparison=sorterFn(newItem,items[middle]),comparison>=0?start=middle+1:comparison<0&&(end=middle-1);return start},reorder:function(mapping){var oldIndex,me=this,items=me.items,index=0,length=items.length,order=[],remaining=[];me.suspendEvents();for(oldIndex in mapping)order[mapping[oldIndex]]=items[oldIndex];for(index=0;index<length;index++)void 0==mapping[index]&&remaining.push(items[index]);for(index=0;index<length;index++)void 0==order[index]&&(order[index]=remaining.shift());me.clear(),me.addAll(order),me.resumeEvents(),me.fireEvent("sort",me)},sortByKey:function(dir,fn){this._sort("key",dir,fn||function(a,b){var v1=String(a).toUpperCase(),v2=String(b).toUpperCase();return v1>v2?1:v1<v2?-1:0})}});Ext.define("Ext.fx.target.Target",{isAnimTarget:!0,constructor:function(target){this.target=target,this.id=this.getId()},getId:function(){return this.target.id},remove:function(){Ext.destroy(this.target)}});Ext.define("Ext.fx.target.Element",{extend:"Ext.fx.target.Target",type:"element",getElVal:function(el,attr,val){return void 0==val&&(val="x"===attr?el.getX():"y"===attr?el.getY():"scrollTop"===attr?el.getScroll().top:"scrollLeft"===attr?el.getScroll().left:"height"===attr?el.getHeight():"width"===attr?el.getWidth():el.getStyle(attr)),val},getAttr:function(attr,val){var el=this.target;return[[el,this.getElVal(el,attr,val)]]},setAttr:function(targetData){var attrs,attr,o,i,j,ln2,ln=(this.target,targetData.length);for(i=0;i<ln;i++){attrs=targetData[i].attrs;for(attr in attrs)if(attrs.hasOwnProperty(attr))for(ln2=attrs[attr].length,j=0;j<ln2;j++)o=attrs[attr][j],this.setElVal(o[0],attr,o[1])}},setElVal:function(element,attr,value){"x"===attr?element.setX(value):"y"===attr?element.setY(value):"scrollTop"===attr?element.scrollTo("top",value):"scrollLeft"===attr?element.scrollTo("left",value):"width"===attr?element.setWidth(value):"height"===attr?element.setHeight(value):element.setStyle(attr,value)}});Ext.define("Ext.fx.target.ElementCSS",{extend:"Ext.fx.target.Element",setAttr:function(targetData,isFirstFrame){var attributes,attrs,attr,easing,duration,o,i,j,ln2,cssArr={attrs:[],duration:[],easing:[]},ln=targetData.length;for(i=0;i<ln;i++){attrs=targetData[i],duration=attrs.duration,easing=attrs.easing,attrs=attrs.attrs;for(attr in attrs)-1==Ext.Array.indexOf(cssArr.attrs,attr)&&(cssArr.attrs.push(attr.replace(/[A-Z]/g,function(v){return"-"+v.toLowerCase()})),cssArr.duration.push(duration+"ms"),cssArr.easing.push(easing))}for(attributes=cssArr.attrs.join(","),duration=cssArr.duration.join(","),easing=cssArr.easing.join(", "),i=0;i<ln;i++){attrs=targetData[i].attrs;for(attr in attrs)for(ln2=attrs[attr].length,j=0;j<ln2;j++)o=attrs[attr][j],o[0].setStyle(Ext.supports.CSS3Prefix+"TransitionProperty",isFirstFrame?"":attributes),o[0].setStyle(Ext.supports.CSS3Prefix+"TransitionDuration",isFirstFrame?"":duration),o[0].setStyle(Ext.supports.CSS3Prefix+"TransitionTimingFunction",isFirstFrame?"":easing),o[0].setStyle(attr,o[1]),isFirstFrame?o=o[0].dom.offsetWidth:o[0].on(Ext.supports.CSS3TransitionEnd,function(){this.setStyle(Ext.supports.CSS3Prefix+"TransitionProperty",null),this.setStyle(Ext.supports.CSS3Prefix+"TransitionDuration",null),this.setStyle(Ext.supports.CSS3Prefix+"TransitionTimingFunction",null)},o[0],{single:!0})}}});Ext.define("Ext.fx.target.CompositeElement",{extend:"Ext.fx.target.Element",isComposite:!0,constructor:function(target){target.id=target.id||Ext.id(null,"ext-composite-"),this.callParent([target])},getAttr:function(attr,val){var i,el,out=[],target=this.target,elements=target.elements,length=elements.length;for(i=0;i<length;i++)(el=elements[i])&&(el=target.getElement(el),out.push([el,this.getElVal(el,attr,val)]));return out},setAttr:function(targetData){var value,k,attrs,attr,i,j,ln2,target=this.target,ln=targetData.length,elements=target.elements,ln3=elements.length;for(i=0;i<ln;i++){attrs=targetData[i].attrs;for(attr in attrs)if(attrs.hasOwnProperty(attr))for(ln2=attrs[attr].length,j=0;j<ln2;j++)for(value=attrs[attr][j][1],k=0;k<ln3;++k)el=elements[k],el&&(el=target.getElement(el),this.setElVal(el,attr,value))}},remove:function(){this.target.remove()}});Ext.define("Ext.fx.target.CompositeElementCSS",{extend:"Ext.fx.target.CompositeElement",requires:["Ext.fx.target.ElementCSS"],setAttr:function(){return Ext.fx.target.ElementCSS.prototype.setAttr.apply(this,arguments)}});Ext.define("Ext.fx.target.Sprite",{extend:"Ext.fx.target.Target",type:"draw",getFromPrim:function(sprite,attr){var obj;switch(attr){case"rotate":case"rotation":return obj=sprite.attr.rotation,{x:obj.x||0,y:obj.y||0,degrees:obj.degrees||0};case"scale":case"scaling":return obj=sprite.attr.scaling,{x:obj.x||1,y:obj.y||1,cx:obj.cx||0,cy:obj.cy||0};case"translate":case"translation":return obj=sprite.attr.translation,{x:obj.x||0,y:obj.y||0};default:return sprite.attr[attr]}},getAttr:function(attr,val){return[[this.target,void 0!=val?val:this.getFromPrim(this.target,attr)]]},setAttr:function(targetData){var attrsConf,attr,attrArr,attrs,sprite,idx,value,i,j,x,y,ln2,ln=targetData.length,spriteArr=[];for(i=0;i<ln;i++){attrsConf=targetData[i].attrs;for(attr in attrsConf)for(attrArr=attrsConf[attr],ln2=attrArr.length,j=0;j<ln2;j++)sprite=attrArr[j][0],attrs=attrArr[j][1],"translate"===attr||"translation"===attr?value={x:attrs.x,y:attrs.y}:"rotate"===attr||"rotation"===attr?(x=attrs.x,isNaN(x)&&(x=null),y=attrs.y,isNaN(y)&&(y=null),value={degrees:attrs.degrees,x:x,y:y}):"scale"===attr||"scaling"===attr?(x=attrs.x,isNaN(x)&&(x=null),y=attrs.y,isNaN(y)&&(y=null),value={x:x,y:y,cx:attrs.cx,cy:attrs.cy}):value="width"===attr||"height"===attr||"x"===attr||"y"===attr?parseFloat(attrs):attrs,idx=Ext.Array.indexOf(spriteArr,sprite),-1==idx&&(spriteArr.push([sprite,{}]),idx=spriteArr.length-1),spriteArr[idx][1][attr]=value}for(ln=spriteArr.length,i=0;i<ln;i++)spriteArr[i][0].setAttributes(spriteArr[i][1]);this.target.redraw()}});Ext.define("Ext.fx.target.CompositeSprite",{extend:"Ext.fx.target.Sprite",getAttr:function(attr,val){var i,sprite,out=[],sprites=[].concat(this.target.items),length=sprites.length;for(i=0;i<length;i++)sprite=sprites[i],out.push([sprite,void 0!=val?val:this.getFromPrim(sprite,attr)]);return out}});Ext.define("Ext.fx.target.Component",{extend:"Ext.fx.target.Target",type:"component",getPropMethod:{top:function(){return this.getPosition(!0)[1]},left:function(){return this.getPosition(!0)[0]},x:function(){return this.getPosition()[0]},y:function(){return this.getPosition()[1]},height:function(){return this.getHeight()},width:function(){return this.getWidth()},opacity:function(){return this.el.getStyle("opacity")}},setMethods:{top:"setPosition",left:"setPosition",x:"setPagePosition",y:"setPagePosition",height:"setSize",width:"setSize",opacity:"setOpacity"},getAttr:function(attr,val){return[[this.target,void 0!==val?val:this.getPropMethod[attr].call(this.target)]]},setAttr:function(targetData,isFirstFrame,isLastFrame){var attrs,attr,o,i,j,targets,left,top,w,h,methodProps,me=this,ln=targetData.length,methodsToCall={};for(i=0;i<ln;i++){attrs=targetData[i].attrs;for(attr in attrs)for(targets=attrs[attr].length,j=0;j<targets;j++)o=attrs[attr][j],methodProps=methodsToCall[me.setMethods[attr]]||(methodsToCall[me.setMethods[attr]]={}),methodProps.target=o[0],methodProps[attr]=o[1];methodsToCall.setPosition&&(o=methodsToCall.setPosition,left=void 0===o.left?void 0:parseFloat(o.left),top=void 0===o.top?void 0:parseFloat(o.top),o.target.setPosition(left,top)),methodsToCall.setPagePosition&&(o=methodsToCall.setPagePosition,o.target.setPagePosition(o.x,o.y)),methodsToCall.setSize&&(o=methodsToCall.setSize,w=void 0===o.width?o.target.getWidth():parseFloat(o.width),h=void 0===o.height?o.target.getHeight():parseFloat(o.height),o.target.el.setSize(w,h),(isLastFrame||me.dynamic)&&Ext.globalEvents.on({idle:Ext.Function.bind(o.target.setSize,o.target,[w,h]),single:!0})),methodsToCall.setOpacity&&(o=methodsToCall.setOpacity,o.target.el.setStyle("opacity",o.opacity))}}});Ext.define("Ext.fx.Queue",{requires:["Ext.util.HashMap"],constructor:function(){this.targets=new Ext.util.HashMap,this.fxQueue={}},getFxDefaults:function(targetId){var target=this.targets.get(targetId);return target?target.fxDefaults:{}},setFxDefaults:function(targetId,obj){var target=this.targets.get(targetId);target&&(target.fxDefaults=Ext.apply(target.fxDefaults||{},obj))},stopAnimation:function(targetId){for(var me=this,queue=me.getFxQueue(targetId),ln=queue.length;ln;)queue[ln-1].end(),ln--},getActiveAnimation:function(targetId){var queue=this.getFxQueue(targetId);return!(!queue||!queue.length)&&queue[0]},hasFxBlock:function(targetId){var queue=this.getFxQueue(targetId);return queue&&queue[0]&&queue[0].block},getFxQueue:function(targetId){if(!targetId)return!1;var me=this,queue=me.fxQueue[targetId],target=me.targets.get(targetId);return!!target&&(queue||(me.fxQueue[targetId]=[],"element"!=target.type&&target.target.on("destroy",function(){me.fxQueue[targetId]=[]})),me.fxQueue[targetId])},queueFx:function(anim){var queue,ln,me=this,target=anim.target;target&&(queue=me.getFxQueue(target.getId()),ln=queue.length,ln?anim.concurrent?anim.paused=!1:queue[ln-1].on("afteranimate",function(){anim.paused=!1}):anim.paused=!1,anim.on("afteranimate",function(){if(Ext.Array.remove(queue,anim),0===queue.length&&me.targets.remove(anim.target),anim.remove&&"element"==target.type){var el=Ext.get(target.id);el&&el.remove()}},me,{single:!0}),queue.push(anim))}});Ext.define("Ext.fx.Manager",{singleton:!0,requires:["Ext.util.MixedCollection","Ext.fx.target.Element","Ext.fx.target.ElementCSS","Ext.fx.target.CompositeElement","Ext.fx.target.CompositeElementCSS","Ext.fx.target.Sprite","Ext.fx.target.CompositeSprite","Ext.fx.target.Component"],mixins:{queue:"Ext.fx.Queue"},constructor:function(){var me=this;me.items=new Ext.util.MixedCollection,me.targetArr={},me.mixins.queue.constructor.call(me),me.taskRunner=new Ext.util.TaskRunner},interval:16,forceJS:!0,createTarget:function(target){var targetObj,me=this,useCSS3=!me.forceJS&&Ext.supports.Transitions;if(me.useCSS3=useCSS3,target){if(target.tagName||Ext.isString(target)||target.isFly)target=Ext.get(target),targetObj=new Ext.fx.target["Element"+(useCSS3?"CSS":"")](target);else if(target.dom)targetObj=new Ext.fx.target["Element"+(useCSS3?"CSS":"")](target);else if(target.isComposite)targetObj=new Ext.fx.target["CompositeElement"+(useCSS3?"CSS":"")](target);else if(target.isSprite)targetObj=new Ext.fx.target.Sprite(target);else if(target.isCompositeSprite)targetObj=new Ext.fx.target.CompositeSprite(target);else{if(!target.isComponent)return target.isAnimTarget?target:null;targetObj=new Ext.fx.target.Component(target)}return me.targets.add(targetObj),targetObj}return null},addAnim:function(anim){var me=this,items=me.items,task=me.task;items.add(anim.id,anim),!task&&items.length&&(task=me.task={run:me.runner,interval:me.interval,scope:me},me.taskRunner.start(task))},removeAnim:function(anim){var me=this,items=me.items,task=me.task;items.removeAtKey(anim.id),task&&!items.length&&(me.taskRunner.stop(task),delete me.task)},runner:function(){var anim,me=this,items=me.items.getRange(),i=0,len=items.length;for(me.targetArr={},me.timestamp=new Date;i<len;i++)anim=items[i],anim.isReady()&&me.startAnim(anim);for(i=0;i<len;i++)anim=items[i],anim.isRunning()?me.runAnim(anim):me.useCSS3;me.applyPendingAttrs()},startAnim:function(anim){anim.start(this.timestamp)},runAnim:function(anim,forceEnd){if(anim){var target,o,me=this,useCSS3=me.useCSS3&&"element"==anim.target.type,elapsedTime=me.timestamp-anim.startTime,lastFrame=elapsedTime>=anim.duration;return forceEnd&&(elapsedTime=anim.duration,lastFrame=!0),target=this.collectTargetData(anim,elapsedTime,useCSS3,lastFrame),useCSS3&&(anim.target.setAttr(target.anims[anim.id].attributes,!0),me.collectTargetData(anim,anim.duration,useCSS3,lastFrame),anim.paused=!0,target=anim.target.target,anim.target.isComposite&&(target=anim.target.target.last()),o={},o[Ext.supports.CSS3TransitionEnd]=anim.lastFrame,o.scope=anim,o.single=!0,target.on(o)),target}},jumpToEnd:function(anim){var target=this.runAnim(anim,!0);this.applyAnimAttrs(target,target.anims[anim.id])},collectTargetData:function(anim,elapsedTime,useCSS3,isLastFrame){var targetId=anim.target.getId(),target=this.targetArr[targetId];return target||(target=this.targetArr[targetId]={id:targetId,el:anim.target,anims:{}}),target.anims[anim.id]={id:anim.id,anim:anim,elapsed:elapsedTime,isLastFrame:isLastFrame,attributes:[{duration:anim.duration,easing:useCSS3&&anim.reverse?anim.easingFn.reverse().toCSS3():anim.easing,attrs:anim.runAnim(elapsedTime)}]},target},applyAnimAttrs:function(target,animWrap){var anim=animWrap.anim;animWrap.attributes&&anim.isRunning()&&(target.el.setAttr(animWrap.attributes,!1,animWrap.isLastFrame),animWrap.isLastFrame&&anim.lastFrame())},applyPendingAttrs:function(){var target,targetId,animWrap,anim,animId,targetArr=this.targetArr;for(targetId in targetArr)if(targetArr.hasOwnProperty(targetId)){target=targetArr[targetId];for(animId in target.anims)target.anims.hasOwnProperty(animId)&&(animWrap=target.anims[animId],anim=animWrap.anim,animWrap.attributes&&anim.isRunning()&&(target.el.setAttr(animWrap.attributes,!1,animWrap.isLastFrame),animWrap.isLastFrame&&anim.lastFrame()))}}});Ext.define("Ext.fx.Animator",{mixins:{observable:"Ext.util.Observable"},requires:["Ext.fx.Manager"],isAnimator:!0,duration:250,delay:0,delayStart:0,dynamic:!1,easing:"ease",running:!1,paused:!1,damper:1,iterations:1,currentIteration:0,keyframeStep:0,animKeyFramesRE:/^(from|to|\d+%?)$/,constructor:function(config){var me=this;config=Ext.apply(me,config||{}),me.config=config,me.id=Ext.id(null,"ext-animator-"),me.addEvents("beforeanimate","keyframe","afteranimate"),me.mixins.observable.constructor.call(me,config),me.timeline=[],me.createTimeline(me.keyframes),me.target&&(me.applyAnimator(me.target),Ext.fx.Manager.addAnim(me))},sorter:function(a,b){return a.pct-b.pct},createTimeline:function(keyframes){var prevMs,ms,i,ln,pct,attr,me=this,attrs=[],to=me.to||{},duration=me.duration;for(pct in keyframes)keyframes.hasOwnProperty(pct)&&me.animKeyFramesRE.test(pct)&&(attr={attrs:Ext.apply(keyframes[pct],to)},"from"==pct?pct=0:"to"==pct&&(pct=100),attr.pct=parseInt(pct,10),attrs.push(attr));for(Ext.Array.sort(attrs,me.sorter),ln=attrs.length,i=0;i<ln;i++)prevMs=attrs[i-1]?duration*(attrs[i-1].pct/100):0,ms=duration*(attrs[i].pct/100),me.timeline.push({duration:ms-prevMs,attrs:attrs[i].attrs})},applyAnimator:function(target){var anim,easing,damper,attrs,i,me=this,anims=[],timeline=me.timeline,ln=timeline.length;if(!1!==me.fireEvent("beforeanimate",me)){for(i=0;i<ln;i++)anim=timeline[i],attrs=anim.attrs,easing=attrs.easing||me.easing,damper=attrs.damper||me.damper,delete attrs.easing,delete attrs.damper,anim=new Ext.fx.Anim({target:target,easing:easing,damper:damper,duration:anim.duration,paused:!0,to:attrs}),anims.push(anim);for(me.animations=anims,me.target=anim.target,i=0;i<ln-1;i++)anim=anims[i],anim.nextAnim=anims[i+1],anim.on("afteranimate",function(){this.nextAnim.paused=!1}),anim.on("afteranimate",function(){this.fireEvent("keyframe",this,++this.keyframeStep)},me);anims[ln-1].on("afteranimate",function(){this.lastFrame()},me)}},start:function(startTime){var me=this,delay=me.delay,delayStart=me.delayStart;if(delay){if(!delayStart)return void(me.delayStart=startTime);if(startTime-delayStart<delay)return;startTime=new Date(delayStart.getTime()+delay)}!1!==me.fireEvent("beforeanimate",me)&&(me.startTime=startTime,me.running=!0,me.animations[me.keyframeStep].paused=!1)},lastFrame:function(){var me=this,iter=me.iterations,iterCount=me.currentIteration;iterCount++,iterCount<iter?(me.startTime=new Date,me.currentIteration=iterCount,me.keyframeStep=0,me.applyAnimator(me.target),me.animations[me.keyframeStep].paused=!1):(me.currentIteration=0,me.end())},end:function(){var me=this;me.fireEvent("afteranimate",me,me.startTime,new Date-me.startTime)},isReady:function(){return!1===this.paused&&!1===this.running&&this.iterations>0},isRunning:function(){return!1}});Ext.define("Ext.fx.CubicBezier",{singleton:!0,cubicBezierAtTime:function(t,p1x,p1y,p2x,p2y,duration){function sampleCurveX(t){return((ax*t+bx)*t+cx)*t}function solveCurveX(x,epsilon){var t0,t1,t2,x2,d2,i;for(t2=x,i=0;i<8;i++){if(x2=sampleCurveX(t2)-x,Math.abs(x2)<epsilon)return t2;if(d2=(3*ax*t2+2*bx)*t2+cx,Math.abs(d2)<1e-6)break;t2-=x2/d2}if(t0=0,t1=1,(t2=x)<t0)return t0;if(t2>t1)return t1;for(;t0<t1;){if(x2=sampleCurveX(t2),Math.abs(x2-x)<epsilon)return t2;x>x2?t0=t2:t1=t2,t2=(t1-t0)/2+t0}return t2}var cx=3*p1x,bx=3*(p2x-p1x)-cx,ax=1-cx-bx,cy=3*p1y,by=3*(p2y-p1y)-cy,ay=1-cy-by;return function(x,epsilon){var t=solveCurveX(x,epsilon);return((ay*t+by)*t+cy)*t}(t,1/(200*duration))},cubicBezier:function(x1,y1,x2,y2){var fn=function(pos){return Ext.fx.CubicBezier.cubicBezierAtTime(pos,x1,y1,x2,y2,1)};return fn.toCSS3=function(){return"cubic-bezier("+[x1,y1,x2,y2].join(",")+")"},fn.reverse=function(){return Ext.fx.CubicBezier.cubicBezier(1-x2,1-y2,1-x1,1-y1)},fn}});Ext.require("Ext.fx.CubicBezier",function(){var math=Math,pi=math.PI,pow=math.pow,sin=math.sin,sqrt=math.sqrt,abs=math.abs;Ext.define("Ext.fx.Easing",{singleton:!0,linear:Ext.identityFn,ease:function(n){var q=.07813-n/2,Q=sqrt(.0066+q*q),x=Q-q,X=pow(abs(x),1/3)*(x<0?-1:1),y=-Q-q,Y=pow(abs(y),1/3)*(y<0?-1:1),t=X+Y+.25;return 3*pow(1-t,2)*t*.1+3*(1-t)*t*t+t*t*t},easeIn:function(n){return pow(n,1.7)},easeOut:function(n){return pow(n,.48)},easeInOut:function(n){var q=.48-n/1.04,Q=sqrt(.1734+q*q),x=Q-q,X=pow(abs(x),1/3)*(x<0?-1:1),y=-Q-q,Y=pow(abs(y),1/3)*(y<0?-1:1),t=X+Y+.5;return 3*(1-t)*t*t+t*t*t},backIn:function(n){return n*n*(2.70158*n-1.70158)},backOut:function(n){return(n-=1)*n*(2.70158*n+1.70158)+1},elasticIn:function(n){if(0===n||1===n)return n;return pow(2,-10*n)*sin(2*pi*(n-.075)/.3)+1},elasticOut:function(n){return 1-Ext.fx.Easing.elasticIn(1-n)},bounceIn:function(n){return 1-Ext.fx.Easing.bounceOut(1-n)},bounceOut:function(n){var l,s=7.5625,p=2.75;return n<1/p?l=s*n*n:n<2/p?(n-=1.5/p,l=s*n*n+.75):n<2.5/p?(n-=2.25/p,l=s*n*n+.9375):(n-=2.625/p,l=s*n*n+.984375),l}},function(){var easing=Ext.fx.Easing.self,proto=easing.prototype;easing.implement({"back-in":proto.backIn,"back-out":proto.backOut,"ease-in":proto.easeIn,"ease-out":proto.easeOut,"elastic-in":proto.elasticIn,"elastic-out":proto.elasticOut,"bounce-in":proto.bounceIn,"bounce-out":proto.bounceOut,"ease-in-out":proto.easeInOut})})});Ext.define("Ext.draw.Color",{colorToHexRe:/(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/,rgbRe:/\s*rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)\s*/,hexRe:/\s*#([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)([0-9a-fA-F][0-9a-fA-F]?)\s*/,lightnessFactor:.2,constructor:function(red,green,blue){var me=this,clamp=Ext.Number.constrain;me.r=clamp(red,0,255),me.g=clamp(green,0,255),me.b=clamp(blue,0,255)},getRed:function(){return this.r},getGreen:function(){return this.g},getBlue:function(){return this.b},getRGB:function(){var me=this;return[me.r,me.g,me.b]},getHSL:function(){var h,me=this,r=me.r/255,g=me.g/255,b=me.b/255,max=Math.max(r,g,b),min=Math.min(r,g,b),delta=max-min,s=0,l=.5*(max+min);return min!=max&&(s=l<.5?delta/(max+min):delta/(2-max-min),h=r==max?60*(g-b)/delta:g==max?120+60*(b-r)/delta:240+60*(r-g)/delta,h<0&&(h+=360),h>=360&&(h-=360)),[h,s,l]},getLighter:function(factor){var hsl=this.getHSL();return factor=factor||this.lightnessFactor,hsl[2]=Ext.Number.constrain(hsl[2]+factor,0,1),this.fromHSL(hsl[0],hsl[1],hsl[2])},getDarker:function(factor){return factor=factor||this.lightnessFactor,this.getLighter(-factor)},toString:function(){var me=this,round=Math.round,r=round(me.r).toString(16),g=round(me.g).toString(16),b=round(me.b).toString(16);return r=1==r.length?"0"+r:r,g=1==g.length?"0"+g:g,b=1==b.length?"0"+b:b,["#",r,g,b].join("")},toHex:function(color){if(Ext.isArray(color)&&(color=color[0]),!Ext.isString(color))return"";if("#"===color.substr(0,1))return color;var red,green,blue,rgb,digits=this.colorToHexRe.exec(color);return Ext.isArray(digits)?(red=parseInt(digits[2],10),green=parseInt(digits[3],10),blue=parseInt(digits[4],10),rgb=blue|green<<8|red<<16,digits[1]+"#"+("000000"+rgb.toString(16)).slice(-6)):color},fromString:function(str){var values,r,g,b,colorValue,parse=parseInt,firstChar=str.substr(0,1);return"#"!=firstChar&&(colorValue=Ext.draw.Color.cssColors[str])&&(str=colorValue,firstChar=str.substr(0,1)),4!=str.length&&7!=str.length||"#"!==firstChar?(values=str.match(this.rgbRe))&&(r=values[1],g=values[2],b=values[3]):(values=str.match(this.hexRe))&&(r=parse(values[1],16)>>0,g=parse(values[2],16)>>0,b=parse(values[3],16)>>0,4==str.length&&(r+=16*r,g+=16*g,b+=16*b)),void 0===r?void 0:new Ext.draw.Color(r,g,b)},getGrayscale:function(){return.3*this.r+.59*this.g+.11*this.b},fromHSL:function(h,s,l){var C,X,m,rgb=[],abs=Math.abs,floor=Math.floor;if(0==s||null==h)rgb=[l,l,l];else{switch(h/=60,C=s*(1-abs(2*l-1)),X=C*(1-abs(h-2*floor(h/2)-1)),m=l-C/2,floor(h)){case 0:rgb=[C,X,0];break;case 1:rgb=[X,C,0];break;case 2:rgb=[0,C,X];break;case 3:rgb=[0,X,C];break;case 4:rgb=[X,0,C];break;case 5:rgb=[C,0,X]}rgb=[rgb[0]+m,rgb[1]+m,rgb[2]+m]}return new Ext.draw.Color(255*rgb[0],255*rgb[1],255*rgb[2])}},function(){var prototype=this.prototype;this.addStatics({fromHSL:function(){return prototype.fromHSL.apply(prototype,arguments)},fromString:function(){return prototype.fromString.apply(prototype,arguments)},toHex:function(){return prototype.toHex.apply(prototype,arguments)},cssColors:{aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aqua:"#00FFFF",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blue:"#0000FF",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",fuchsia:"#FF00FF",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgray:"#D3D3D3",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",lime:"#00FF00",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",maroon:"#800000",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",navy:"#000080",oldlace:"#FDF5E6",olive:"#808000",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",purple:"#800080",red:"#FF0000",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",silver:"#C0C0C0",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",teal:"#008080",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",white:"#FFFFFF",whitesmoke:"#F5F5F5",yellow:"#FFFF00",yellowgreen:"#9ACD32"}})});Ext.define("Ext.draw.Draw",{singleton:!0,requires:["Ext.draw.Color"],pathToStringRE:/,?([achlmqrstvxz]),?/gi,pathCommandRE:/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/gi,pathValuesRE:/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/gi,stopsRE:/^(\d+%?)$/,radian:Math.PI/180,availableAnimAttrs:{along:"along",blur:null,"clip-rect":"csv",cx:null,cy:null,fill:"color","fill-opacity":null,"font-size":null,height:null,opacity:null,path:"path",r:null,rotation:"csv",rx:null,ry:null,scale:"csv",stroke:"color","stroke-opacity":null,"stroke-width":null,translation:"csv",width:null,x:null,y:null},is:function(o,type){return"object"==(type=String(type).toLowerCase())&&o===Object(o)||"undefined"==type&&typeof o==type||"null"==type&&null===o||"array"==type&&Array.isArray&&Array.isArray(o)||Object.prototype.toString.call(o).toLowerCase().slice(8,-1)==type},ellipsePath:function(sprite){var attr=sprite.attr;return Ext.String.format("M{0},{1}A{2},{3},0,1,1,{0},{4}A{2},{3},0,1,1,{0},{1}z",attr.x,attr.y-attr.ry,attr.rx,attr.ry,attr.y+attr.ry)},rectPath:function(sprite){var attr=sprite.attr;return attr.radius?Ext.String.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z",attr.x+attr.radius,attr.y,attr.width-2*attr.radius,attr.radius,-attr.radius,attr.height-2*attr.radius,2*attr.radius-attr.width,2*attr.radius-attr.height):Ext.String.format("M{0},{1}L{2},{1},{2},{3},{0},{3}z",attr.x,attr.y,attr.width+attr.x,attr.height+attr.y)},path2string:function(){return this.join(",").replace(Ext.draw.Draw.pathToStringRE,"$1")},pathToString:function(arrayPath){return arrayPath.join(",").replace(Ext.draw.Draw.pathToStringRE,"$1")},parsePathString:function(pathString){if(!pathString)return null;var paramCounts={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},data=[],me=this;return me.is(pathString,"array")&&me.is(pathString[0],"array")&&(data=me.pathClone(pathString)),data.length||String(pathString).replace(me.pathCommandRE,function(a,b,c){var params=[],name=b.toLowerCase();for(c.replace(me.pathValuesRE,function(a,b){b&&params.push(+b)}),"m"==name&&params.length>2&&(data.push([b].concat(Ext.Array.splice(params,0,2))),name="l",b="m"==b?"l":"L");params.length>=paramCounts[name]&&(data.push([b].concat(Ext.Array.splice(params,0,paramCounts[name]))),paramCounts[name]););}),data.toString=me.path2string,data},mapPath:function(path,matrix){if(!matrix)return path;var x,y,i,ii,j,jj,pathi;for(path=this.path2curve(path),i=0,ii=path.length;i<ii;i++)for(pathi=path[i],j=1,jj=pathi.length;j<jj-1;j+=2)x=matrix.x(pathi[j],pathi[j+1]),y=matrix.y(pathi[j],pathi[j+1]),pathi[j]=x,pathi[j+1]=y;return path},pathClone:function(pathArray){var j,jj,i,ii,res=[];for(this.is(pathArray,"array")&&this.is(pathArray&&pathArray[0],"array")||(pathArray=this.parsePathString(pathArray)),i=0,ii=pathArray.length;i<ii;i++)for(res[i]=[],j=0,jj=pathArray[i].length;j<jj;j++)res[i][j]=pathArray[i][j];return res.toString=this.path2string,res},pathToAbsolute:function(pathArray){this.is(pathArray,"array")&&this.is(pathArray&&pathArray[0],"array")||(pathArray=this.parsePathString(pathArray));var r,pathSegment,j,ln2,res=[],x=0,y=0,mx=0,my=0,i=0,ln=pathArray.length;for(ln&&"M"==pathArray[0][0]&&(x=+pathArray[0][1],y=+pathArray[0][2],mx=x,my=y,i++,res[0]=["M",x,y]);i<ln;i++){if(r=res[i]=[],pathSegment=pathArray[i],pathSegment[0]!=pathSegment[0].toUpperCase())switch(r[0]=pathSegment[0].toUpperCase(),r[0]){case"A":r[1]=pathSegment[1],r[2]=pathSegment[2],r[3]=pathSegment[3],r[4]=pathSegment[4],r[5]=pathSegment[5],r[6]=+(pathSegment[6]+x),r[7]=+(pathSegment[7]+y);break;case"V":r[1]=+pathSegment[1]+y;break;case"H":r[1]=+pathSegment[1]+x;break;case"M":mx=+pathSegment[1]+x,my=+pathSegment[2]+y;default:for(j=1,ln2=pathSegment.length;j<ln2;j++)r[j]=+pathSegment[j]+(j%2?x:y)}else for(j=0,ln2=pathSegment.length;j<ln2;j++)res[i][j]=pathSegment[j];switch(r[0]){case"Z":x=mx,y=my;break;case"H":x=r[1];break;case"V":y=r[1];break;case"M":pathSegment=res[i],ln2=pathSegment.length,mx=pathSegment[ln2-2],my=pathSegment[ln2-1];default:pathSegment=res[i],ln2=pathSegment.length,x=pathSegment[ln2-2],y=pathSegment[ln2-1]}}return res.toString=this.path2string,res},pathToRelative:function(pathArray){this.is(pathArray,"array")&&this.is(pathArray&&pathArray[0],"array")||(pathArray=this.parsePathString(pathArray));var r,pa,i,j,k,len,ii,jj,kk,res=[],x=0,y=0,mx=0,my=0,start=0;for("M"==pathArray[0][0]&&(x=pathArray[0][1],y=pathArray[0][2],mx=x,my=y,start++,res.push(["M",x,y])),i=start,ii=pathArray.length;i<ii;i++){if(r=res[i]=[],pa=pathArray[i],pa[0]!=pa[0].toLowerCase())switch(r[0]=pa[0].toLowerCase(),r[0]){case"a":r[1]=pa[1],r[2]=pa[2],r[3]=pa[3],r[4]=pa[4],r[5]=pa[5],r[6]=+(pa[6]-x).toFixed(3),r[7]=+(pa[7]-y).toFixed(3);break;case"v":r[1]=+(pa[1]-y).toFixed(3);break;case"m":mx=pa[1],my=pa[2];default:for(j=1,jj=pa.length;j<jj;j++)r[j]=+(pa[j]-(j%2?x:y)).toFixed(3)}else for(r=res[i]=[],"m"==pa[0]&&(mx=pa[1]+x,my=pa[2]+y),k=0,kk=pa.length;k<kk;k++)res[i][k]=pa[k];switch(len=res[i].length,res[i][0]){case"z":x=mx,y=my;break;case"h":x+=+res[i][len-1];break;case"v":y+=+res[i][len-1];break;default:x+=+res[i][len-2],y+=+res[i][len-1]}}return res.toString=this.path2string,res},path2curve:function(path){var i,seg,segLn,point,me=this,points=me.pathToAbsolute(path),ln=points.length,attrs={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null};for(i=0;i<ln;i++){if(points[i]=me.command2curve(points[i],attrs),points[i].length>7){for(points[i].shift(),point=points[i];point.length;)Ext.Array.splice(points,i++,0,["C"].concat(Ext.Array.splice(point,0,6)));Ext.Array.erase(points,i,1),ln=points.length,i--}seg=points[i],segLn=seg.length,attrs.x=seg[segLn-2],attrs.y=seg[segLn-1],attrs.bx=parseFloat(seg[segLn-4])||attrs.x,attrs.by=parseFloat(seg[segLn-3])||attrs.y}return points},interpolatePaths:function(path,path2){var i,ii,seg,seg2,seglen,seg2len,me=this,p=me.pathToAbsolute(path),p2=me.pathToAbsolute(path2),attrs={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},attrs2={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},fixArc=function(pp,i){if(pp[i].length>7){pp[i].shift();for(var pi=pp[i];pi.length;)Ext.Array.splice(pp,i++,0,["C"].concat(Ext.Array.splice(pi,0,6)));Ext.Array.erase(pp,i,1),ii=Math.max(p.length,p2.length||0)}},fixM=function(path1,path2,a1,a2,i){path1&&path2&&"M"==path1[i][0]&&"M"!=path2[i][0]&&(Ext.Array.splice(path2,i,0,["M",a2.x,a2.y]),a1.bx=0,a1.by=0,a1.x=path1[i][1],a1.y=path1[i][2],ii=Math.max(p.length,p2.length||0))};for(i=0,ii=Math.max(p.length,p2.length||0);i<ii;i++)p[i]=me.command2curve(p[i],attrs),fixArc(p,i),p2[i]=me.command2curve(p2[i],attrs2),fixArc(p2,i),fixM(p,p2,attrs,attrs2,i),fixM(p2,p,attrs2,attrs,i),seg=p[i],seg2=p2[i],seglen=seg.length,seg2len=seg2.length,attrs.x=seg[seglen-2],attrs.y=seg[seglen-1],attrs.bx=parseFloat(seg[seglen-4])||attrs.x,attrs.by=parseFloat(seg[seglen-3])||attrs.y,attrs2.bx=parseFloat(seg2[seg2len-4])||attrs2.x,attrs2.by=parseFloat(seg2[seg2len-3])||attrs2.y,attrs2.x=seg2[seg2len-2],attrs2.y=seg2[seg2len-1];return[p,p2]},command2curve:function(pathCommand,d){var me=this;if(!pathCommand)return["C",d.x,d.y,d.x,d.y,d.x,d.y];switch("T"!=pathCommand[0]&&"Q"!=pathCommand[0]&&(d.qx=d.qy=null),pathCommand[0]){case"M":d.X=pathCommand[1],d.Y=pathCommand[2];break;case"A":pathCommand=["C"].concat(me.arc2curve.apply(me,[d.x,d.y].concat(pathCommand.slice(1))));break;case"S":pathCommand=["C",d.x+(d.x-(d.bx||d.x)),d.y+(d.y-(d.by||d.y))].concat(pathCommand.slice(1));break;case"T":d.qx=d.x+(d.x-(d.qx||d.x)),d.qy=d.y+(d.y-(d.qy||d.y)),pathCommand=["C"].concat(me.quadratic2curve(d.x,d.y,d.qx,d.qy,pathCommand[1],pathCommand[2]));break;case"Q":d.qx=pathCommand[1],d.qy=pathCommand[2],pathCommand=["C"].concat(me.quadratic2curve(d.x,d.y,pathCommand[1],pathCommand[2],pathCommand[3],pathCommand[4]));break;case"L":pathCommand=["C"].concat(d.x,d.y,pathCommand[1],pathCommand[2],pathCommand[1],pathCommand[2]);break;case"H":pathCommand=["C"].concat(d.x,d.y,pathCommand[1],d.y,pathCommand[1],d.y);break;case"V":pathCommand=["C"].concat(d.x,d.y,d.x,pathCommand[1],d.x,pathCommand[1]);break;case"Z":pathCommand=["C"].concat(d.x,d.y,d.X,d.Y,d.X,d.Y)}return pathCommand},quadratic2curve:function(x1,y1,ax,ay,x2,y2){return[1/3*x1+2/3*ax,1/3*y1+2/3*ay,1/3*x2+2/3*ax,1/3*y2+2/3*ay,x2,y2]},rotate:function(x,y,rad){var cos=Math.cos(rad),sin=Math.sin(rad);return{x:x*cos-y*sin,y:x*sin+y*cos}},arc2curve:function(x1,y1,rx,ry,angle,large_arc_flag,sweep_flag,x2,y2,recursive){var xy,x,y,h,rx2,ry2,k,cx,cy,f1,f2,df,c1,s1,c2,s2,t,hx,hy,m1,m2,m3,m4,newres,i,ln,f2old,x2old,y2old,me=this,PI=Math.PI,radian=me.radian,_120=120*PI/180,rad=radian*(+angle||0),res=[],math=Math,mcos=math.cos,msin=math.sin,msqrt=math.sqrt,mabs=math.abs,masin=math.asin;if(recursive?(f1=recursive[0],f2=recursive[1],cx=recursive[2],cy=recursive[3]):(xy=me.rotate(x1,y1,-rad),x1=xy.x,y1=xy.y,xy=me.rotate(x2,y2,-rad),x2=xy.x,y2=xy.y,x=(x1-x2)/2,y=(y1-y2)/2,h=x*x/(rx*rx)+y*y/(ry*ry),h>1&&(h=msqrt(h),rx*=h,ry*=h),rx2=rx*rx,ry2=ry*ry,k=(large_arc_flag==sweep_flag?-1:1)*msqrt(mabs((rx2*ry2-rx2*y*y-ry2*x*x)/(rx2*y*y+ry2*x*x))),cx=k*rx*y/ry+(x1+x2)/2,cy=k*-ry*x/rx+(y1+y2)/2,f1=masin(((y1-cy)/ry).toFixed(7)),f2=masin(((y2-cy)/ry).toFixed(7)),f1=x1<cx?PI-f1:f1,f2=x2<cx?PI-f2:f2,f1<0&&(f1=2*PI+f1),f2<0&&(f2=2*PI+f2),sweep_flag&&f1>f2&&(f1-=2*PI),!sweep_flag&&f2>f1&&(f2-=2*PI)),df=f2-f1,mabs(df)>_120&&(f2old=f2,x2old=x2,y2old=y2,f2=f1+_120*(sweep_flag&&f2>f1?1:-1),x2=cx+rx*mcos(f2),y2=cy+ry*msin(f2),res=me.arc2curve(x2,y2,rx,ry,angle,0,sweep_flag,x2old,y2old,[f2,f2old,cx,cy])),df=f2-f1,c1=mcos(f1),s1=msin(f1),c2=mcos(f2),s2=msin(f2),t=math.tan(df/4),hx=4/3*rx*t,hy=4/3*ry*t,m1=[x1,y1],m2=[x1+hx*s1,y1-hy*c1],m3=[x2+hx*s2,y2-hy*c2],m4=[x2,y2],m2[0]=2*m1[0]-m2[0],m2[1]=2*m1[1]-m2[1],recursive)return[m2,m3,m4].concat(res);for(res=[m2,m3,m4].concat(res).join().split(","),newres=[],ln=res.length,i=0;i<ln;i++)newres[i]=i%2?me.rotate(res[i-1],res[i],rad).y:me.rotate(res[i],res[i+1],rad).x;return newres},rotateAndTranslatePath:function(sprite){var path,i,p,xy,j,alpha=sprite.rotation.degrees,cx=sprite.rotation.x,cy=sprite.rotation.y,dx=sprite.translation.x,dy=sprite.translation.y,res=[];if(!alpha&&!dx&&!dy)return this.pathToAbsolute(sprite.attr.path);for(dx=dx||0,dy=dy||0,path=this.pathToAbsolute(sprite.attr.path),i=path.length;i--;)if(p=res[i]=path[i].slice(),"A"==p[0])xy=this.rotatePoint(p[6],p[7],alpha,cx,cy),p[6]=xy.x+dx,p[7]=xy.y+dy;else for(j=1;null!=p[j+1];)xy=this.rotatePoint(p[j],p[j+1],alpha,cx,cy),p[j]=xy.x+dx,p[j+1]=xy.y+dy,j+=2;return res},rotatePoint:function(x,y,alpha,cx,cy){if(!alpha)return{x:x,y:y};cx=cx||0,cy=cy||0,x-=cx,y-=cy,alpha*=this.radian;var cos=Math.cos(alpha),sin=Math.sin(alpha);return{x:x*cos-y*sin+cx,y:x*sin+y*cos+cy}},pathDimensions:function(path){if(!(path&&path+""))return{x:0,y:0,width:0,height:0};path=this.path2curve(path);for(var p,xmin,ymin,xmax,ymax,dim,x=0,y=0,X=[],Y=[],i=0,ln=path.length;i<ln;i++)p=path[i],"M"==p[0]?(x=p[1],y=p[2],X.push(x),Y.push(y)):(dim=this.curveDim(x,y,p[1],p[2],p[3],p[4],p[5],p[6]),X=X.concat(dim.min.x,dim.max.x),Y=Y.concat(dim.min.y,dim.max.y),x=p[5],y=p[6]);return xmin=Math.min.apply(0,X),ymin=Math.min.apply(0,Y),xmax=Math.max.apply(0,X),ymax=Math.max.apply(0,Y),{x:Math.round(xmin),y:Math.round(ymin),path:path,width:Math.round(xmax-xmin),height:Math.round(ymax-ymin)}},intersectInside:function(path,cp1,cp2){return(cp2[0]-cp1[0])*(path[1]-cp1[1])>(cp2[1]-cp1[1])*(path[0]-cp1[0])},intersectIntersection:function(s,e,cp1,cp2){var p=[],dcx=cp1[0]-cp2[0],dcy=cp1[1]-cp2[1],dpx=s[0]-e[0],dpy=s[1]-e[1],n1=cp1[0]*cp2[1]-cp1[1]*cp2[0],n2=s[0]*e[1]-s[1]*e[0],n3=1/(dcx*dpy-dcy*dpx);return p[0]=(n1*dpx-n2*dcx)*n3,p[1]=(n1*dpy-n2*dcy)*n3,p},intersect:function(subjectPolygon,clipPolygon){for(var cp2,s,e,ln2,inputList,j,me=this,i=0,ln=clipPolygon.length,cp1=clipPolygon[ln-1],outputList=subjectPolygon;i<ln;++i){for(cp2=clipPolygon[i],inputList=outputList,outputList=[],s=inputList[inputList.length-1],j=0,ln2=inputList.length;j<ln2;j++)e=inputList[j],me.intersectInside(e,cp1,cp2)?(me.intersectInside(s,cp1,cp2)||outputList.push(me.intersectIntersection(s,e,cp1,cp2)),outputList.push(e)):me.intersectInside(s,cp1,cp2)&&outputList.push(me.intersectIntersection(s,e,cp1,cp2)),s=e;cp1=cp2}return outputList},bezier:function(a,b,c,d,x){if(0===x)return a;if(1===x)return d;var du=1-x,d3=du*du*du,r=x/du;return d3*(a+r*(3*b+r*(3*c+d*r)))},bezierDim:function(a,b,c,d){var r,A,top,C,delta,bottom,s,min,max,i,points=[];for(a+3*c==d+3*b?(r=a-b,(r/=2*(a-b-b+c))<1&&r>0&&points.push(r)):(A=a-3*b+3*c-d,top=2*(a-b-b+c),C=a-b,delta=top*top-4*A*C,bottom=A+A,0===delta?(r=top/bottom)<1&&r>0&&points.push(r):delta>0&&(s=Math.sqrt(delta),r=(s+top)/bottom,r<1&&r>0&&points.push(r),(r=(top-s)/bottom)<1&&r>0&&points.push(r))),min=Math.min(a,d),max=Math.max(a,d),i=0;i<points.length;i++)min=Math.min(min,this.bezier(a,b,c,d,points[i])),max=Math.max(max,this.bezier(a,b,c,d,points[i]));return[min,max]},curveDim:function(p1x,p1y,c1x,c1y,c2x,c2y,p2x,p2y){var x=this.bezierDim(p1x,c1x,c2x,p2x),y=this.bezierDim(p1y,c1y,c2y,p2y);return{min:{x:x[0],y:y[0]},max:{x:x[1],y:y[1]}}},getAnchors:function(prevX,prevY,curX,curY,nextX,nextY,value){value=value||4;var control1Length,control2Length,control1Angle,control2Angle,control1X,control1Y,control2X,control2Y,alpha,M=Math,PI=M.PI,halfPI=PI/2,abs=M.abs,sin=M.sin,cos=M.cos,atan=M.atan;return control1Length=(curX-prevX)/value,control2Length=(nextX-curX)/value,curY>=prevY&&curY>=nextY||curY<=prevY&&curY<=nextY?control1Angle=control2Angle=halfPI:(control1Angle=atan((curX-prevX)/abs(curY-prevY)),prevY<curY&&(control1Angle=PI-control1Angle),control2Angle=atan((nextX-curX)/abs(curY-nextY)),nextY<curY&&(control2Angle=PI-control2Angle)),alpha=halfPI-(control1Angle+control2Angle)%(2*PI)/2,alpha>halfPI&&(alpha-=PI),control1Angle+=alpha,control2Angle+=alpha,control1X=curX-control1Length*sin(control1Angle),control1Y=curY+control1Length*cos(control1Angle),control2X=curX+control2Length*sin(control2Angle),control2Y=curY+control2Length*cos(control2Angle),(curY>prevY&&control1Y<prevY||curY<prevY&&control1Y>prevY)&&(control1X+=abs(prevY-control1Y)*(control1X-curX)/(control1Y-curY),control1Y=prevY),(curY>nextY&&control2Y<nextY||curY<nextY&&control2Y>nextY)&&(control2X-=abs(nextY-control2Y)*(control2X-curX)/(control2Y-curY),control2Y=nextY),{x1:control1X,y1:control1Y,x2:control2X,y2:control2Y}},smooth:function(originalPath,value){for(var j,points,pathi,pathil,pathim,pathiml,pathip,pathipl,begl,path=this.path2curve(originalPath),newp=[path[0]],x=path[0][1],y=path[0][2],i=1,ii=path.length,beg=1,mx=x,my=y;i<ii;i++)if(pathi=path[i],pathil=pathi.length,pathim=path[i-1],pathiml=pathim.length,pathip=path[i+1],pathipl=pathip&&pathip.length,"M"!=pathi[0])pathi[pathil-2]!=mx||pathi[pathil-1]!=my||pathip&&"M"!=pathip[0]?points=pathip&&"M"!=pathip[0]?this.getAnchors(pathim[pathiml-2],pathim[pathiml-1],pathi[pathil-2],pathi[pathil-1],pathip[pathipl-2],pathip[pathipl-1],value):{x1:pathi[pathil-2],y1:pathi[pathil-1]}:(begl=newp[beg].length,points=this.getAnchors(pathim[pathiml-2],pathim[pathiml-1],mx,my,newp[beg][begl-2],newp[beg][begl-1],value),newp[beg][1]=points.x2,newp[beg][2]=points.y2),newp.push(["C",x,y,points.x1,points.y1,pathi[pathil-2],pathi[pathil-1]]),x=points.x2,y=points.y2;else{for(mx=pathi[1],my=pathi[2],j=i+1;"C"!=path[j][0];)j++;newp.push(["M",mx,my]),beg=newp.length,x=mx,y=my}return newp},findDotAtSegment:function(p1x,p1y,c1x,c1y,c2x,c2y,p2x,p2y,t){var t1=1-t;return{x:Math.pow(t1,3)*p1x+3*Math.pow(t1,2)*t*c1x+3*t1*t*t*c2x+Math.pow(t,3)*p2x,y:Math.pow(t1,3)*p1y+3*Math.pow(t1,2)*t*c1y+3*t1*t*t*c2y+Math.pow(t,3)*p2y}},snapEnds:function(from,to,stepsMax,prettyNumbers){if(Ext.isDate(from))return this.snapEndsByDate(from,to,stepsMax);var cur,floor,value,weight,i,topValue,step=(to-from)/stepsMax,level=Math.floor(Math.log(step)/Math.LN10)+1,m=Math.pow(10,level),modulo=Math.round(step%m*Math.pow(10,2-level)),interval=[[0,15],[10,1],[20,4],[25,2],[50,9],[100,15]],stepCount=0,topWeight=1e9,ln=interval.length;if(floor=Math.floor(from/m)*m,from==floor&&floor>0&&(floor=Math.floor((from-m/10)/m)*m),prettyNumbers){for(i=0;i<ln;i++)value=interval[i][0],(weight=value-modulo<0?1e6:(value-modulo)/interval[i][1])<topWeight&&(topValue=value,topWeight=weight);if(step=Math.floor(step*Math.pow(10,-level))*Math.pow(10,level)+topValue*Math.pow(10,level-2),from<0&&to>=0){for(cur=0;cur>from;)cur-=step,stepCount++;for(from=+cur.toFixed(10),cur=0;cur<to;)cur+=step,stepCount++;to=+cur.toFixed(10)}else for(cur=from=floor;cur<to;)cur+=step,stepCount++;to=+cur.toFixed(10)}else from=floor,stepCount=stepsMax;return{from:from,to:to,power:level,step:step,steps:stepCount}},snapEndsByDate:function(from,to,stepsMax,lockEnds){var scale,j,yearDiff,s,selectedStep=!1,scales=[[Ext.Date.MILLI,[1,2,5,10,20,50,100,200,250,500]],[Ext.Date.SECOND,[1,2,5,10,15,30]],[Ext.Date.MINUTE,[1,2,5,10,15,30]],[Ext.Date.HOUR,[1,2,3,4,6,12]],[Ext.Date.DAY,[1,2,7,14]],[Ext.Date.MONTH,[1,2,3,6]]],sLen=scales.length,stop=!1;for(s=0;s<sLen;s++)if(scale=scales[s],!stop)for(j=0;j<scale[1].length;j++)if(to<Ext.Date.add(from,scale[0],scale[1][j]*stepsMax)){selectedStep=[scale[0],scale[1][j]],stop=!0;break}return selectedStep||(yearDiff=this.snapEnds(from.getFullYear(),to.getFullYear()+1,stepsMax,lockEnds),selectedStep=[Date.YEAR,Math.round(yearDiff.step)]),this.snapEndsByDateAndStep(from,to,selectedStep,lockEnds)},snapEndsByDateAndStep:function(from,to,step,lockEnds){var testFrom,testTo,date,year,month,day,fractionalMonth,stepsArray,fromStat=[from.getFullYear(),from.getMonth(),from.getDate(),from.getHours(),from.getMinutes(),from.getSeconds(),from.getMilliseconds()],stepUnit=step[0],stepValue=step[1],steps=0;if(lockEnds)testFrom=from;else switch(stepUnit){case Ext.Date.MILLI:testFrom=new Date(fromStat[0],fromStat[1],fromStat[2],fromStat[3],fromStat[4],fromStat[5],Math.floor(fromStat[6]/stepValue)*stepValue);break;case Ext.Date.SECOND:testFrom=new Date(fromStat[0],fromStat[1],fromStat[2],fromStat[3],fromStat[4],Math.floor(fromStat[5]/stepValue)*stepValue,0);break;case Ext.Date.MINUTE:testFrom=new Date(fromStat[0],fromStat[1],fromStat[2],fromStat[3],Math.floor(fromStat[4]/stepValue)*stepValue,0,0);break;case Ext.Date.HOUR:testFrom=new Date(fromStat[0],fromStat[1],fromStat[2],Math.floor(fromStat[3]/stepValue)*stepValue,0,0,0);break;case Ext.Date.DAY:testFrom=new Date(fromStat[0],fromStat[1],Math.floor((fromStat[2]-1)/stepValue)*stepValue+1,0,0,0,0);break;case Ext.Date.MONTH:testFrom=new Date(fromStat[0],Math.floor(fromStat[1]/stepValue)*stepValue,1,0,0,0,0),steps=[],stepsArray=!0;break;default:testFrom=new Date(Math.floor(fromStat[0]/stepValue)*stepValue,0,1,0,0,0,0),steps=[],stepsArray=!0}for(fractionalMonth=stepUnit===Ext.Date.MONTH&&(.5==stepValue||stepValue==1/3||.25==stepValue),testTo=new Date(testFrom);testTo<to;)if(fractionalMonth){switch(date=new Date(testTo),year=date.getFullYear(),month=date.getMonth(),day=date.getDate(),stepValue){case.5:day>=15?(day=1,++month>11&&year++):day=15;break;case 1/3:day>=20?(day=1,++month>11&&year++):day=day>=10?20:10;break;case.25:day>=22?(day=1,++month>11&&year++):day=day>=15?22:day>=8?15:8}testTo.setYear(year),testTo.setMonth(month),testTo.setDate(day),steps.push(new Date(testTo))}else stepsArray?(testTo=Ext.Date.add(testTo,stepUnit,stepValue),steps.push(new Date(testTo))):(testTo=Ext.Date.add(testTo,stepUnit,stepValue),steps++);return lockEnds&&(testTo=to),stepsArray?{from:+testFrom,to:+testTo,steps:steps}:{from:+testFrom,to:+testTo,step:(testTo-testFrom)/steps,steps:steps}},sorter:function(a,b){return a.offset-b.offset},rad:function(degrees){return degrees%360*Math.PI/180},normalizeRadians:function(radian){var twoPi=2*Math.PI;return radian>=0?radian%twoPi:(radian%twoPi+twoPi)%twoPi},degrees:function(radian){return 180*radian/Math.PI%360},normalizeDegrees:function(degrees){return degrees>=0?degrees%360:(degrees%360+360)%360},withinBox:function(x,y,bbox){return bbox=bbox||{},x>=bbox.x&&x<=bbox.x+bbox.width&&y>=bbox.y&&y<=bbox.y+bbox.height},parseGradient:function(gradient){var stop,vector,max,stopObj,me=this,type=gradient.type||"linear",angle=gradient.angle||0,radian=me.radian,stops=gradient.stops,stopsArr=[];"linear"==type&&(vector=[0,0,Math.cos(angle*radian),Math.sin(angle*radian)],max=1/(Math.max(Math.abs(vector[2]),Math.abs(vector[3]))||1),vector[2]*=max,vector[3]*=max,vector[2]<0&&(vector[0]=-vector[2],vector[2]=0),vector[3]<0&&(vector[1]=-vector[3],vector[3]=0));for(stop in stops)stops.hasOwnProperty(stop)&&me.stopsRE.test(stop)&&(stopObj={offset:parseInt(stop,10),color:Ext.draw.Color.toHex(stops[stop].color)||"#ffffff",opacity:stops[stop].opacity||1},stopsArr.push(stopObj));return Ext.Array.sort(stopsArr,me.sorter),"linear"==type?{id:gradient.id,type:type,vector:vector,stops:stopsArr}:{id:gradient.id,type:type,centerX:gradient.centerX,centerY:gradient.centerY,focalX:gradient.focalX,focalY:gradient.focalY,radius:gradient.radius,vector:vector,stops:stopsArr}}});Ext.define("Ext.fx.PropertyHandler",{requires:["Ext.draw.Draw"],statics:{defaultHandler:{pixelDefaultsRE:/width|height|top$|bottom$|left$|right$/i,unitRE:/^(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)*$/,scrollRE:/^scroll/i,computeDelta:function(from,end,damper,initial,attr){damper="number"==typeof damper?damper:1;var start,units,unitRE=this.unitRE,match=unitRE.exec(from);return match&&(from=match[1],units=match[2],this.scrollRE.test(attr)||units||!this.pixelDefaultsRE.test(attr)||(units="px")),from=+from||0,match=unitRE.exec(end),match&&(end=match[1],units=match[2]||units),end=+end||0,start=null!=initial?initial:from,{from:from,delta:(end-start)*damper,units:units}},get:function(from,end,damper,initialFrom,attr){var i,initial,res,j,len,ln=from.length,out=[];for(i=0;i<ln;i++)if(initialFrom&&(initial=initialFrom[i][1].from),Ext.isArray(from[i][1])&&Ext.isArray(end)){for(res=[],j=0,len=from[i][1].length;j<len;j++)res.push(this.computeDelta(from[i][1][j],end[j],damper,initial,attr));out.push([from[i][0],res])}else out.push([from[i][0],this.computeDelta(from[i][1],end,damper,initial,attr)]);return out},set:function(values,easing){var i,val,res,len,j,ln=values.length,out=[];for(i=0;i<ln;i++)if(val=values[i][1],Ext.isArray(val)){for(res=[],j=0,len=val.length;j<len;j++)res.push(val[j].from+val[j].delta*easing+(val[j].units||0));out.push([values[i][0],res])}else out.push([values[i][0],val.from+val.delta*easing+(val.units||0)]);return out}},stringHandler:{computeDelta:function(from,end,damper,initial,attr){return{from:from,delta:end}},get:function(from,end,damper,initialFrom,attr){var i,ln=from.length,out=[];for(i=0;i<ln;i++)out.push([from[i][0],this.computeDelta(from[i][1],end,damper,void 0,attr)]);return out},set:function(values,easing){var i,val,ln=values.length,out=[];for(i=0;i<ln;i++)val=values[i][1],out.push([values[i][0],val.delta]);return out}},color:{rgbRE:/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,hexRE:/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,hex3RE:/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i,parseColor:function(color,damper){damper="number"==typeof damper?damper:1;var match,base,re,i,out=!1,reList=[this.hexRE,this.rgbRE,this.hex3RE],length=reList.length;for(i=0;i<length;i++)if(re=reList[i],base=i%2==0?16:10,(match=re.exec(color))&&4===match.length){2===i&&(match[1]+=match[1],match[2]+=match[2],match[3]+=match[3]),out={red:parseInt(match[1],base),green:parseInt(match[2],base),blue:parseInt(match[3],base)};break}return out||color},computeDelta:function(from,end,damper,initial){from=this.parseColor(from),end=this.parseColor(end,damper);var start=initial||from,tfrom=typeof start,tend=typeof end;return"string"==tfrom||"undefined"==tfrom||"string"==tend||"undefined"==tend?end||start:{from:from,delta:{red:Math.round((end.red-start.red)*damper),green:Math.round((end.green-start.green)*damper),blue:Math.round((end.blue-start.blue)*damper)}}},get:function(start,end,damper,initialFrom){var i,initial,ln=start.length,out=[];for(i=0;i<ln;i++)initialFrom&&(initial=initialFrom[i][1].from),out.push([start[i][0],this.computeDelta(start[i][1],end,damper,initial)]);return out},set:function(values,easing){var i,val,parsedString,from,delta,ln=values.length,out=[];for(i=0;i<ln;i++)if(val=values[i][1]){if(from=val.from,delta=val.delta,val="object"==typeof val&&"red"in val?"rgb("+val.red+", "+val.green+", "+val.blue+")":val,void 0===(val="object"==typeof val&&val.length?val[0]:val))return[];parsedString="string"==typeof val?val:"rgb("+[(from.red+Math.round(delta.red*easing))%256,(from.green+Math.round(delta.green*easing))%256,(from.blue+Math.round(delta.blue*easing))%256].join(",")+")",out.push([values[i][0],parsedString])}return out}},object:{interpolate:function(prop,damper){damper="number"==typeof damper?damper:1;var p,out={};for(p in prop)out[p]=parseFloat(prop[p])*damper;return out},computeDelta:function(from,end,damper,initial){from=this.interpolate(from),end=this.interpolate(end,damper);var p,start=initial||from,delta={};for(p in end)delta[p]=end[p]-start[p];return{from:from,delta:delta}},get:function(start,end,damper,initialFrom){var i,initial,ln=start.length,out=[];for(i=0;i<ln;i++)initialFrom&&(initial=initialFrom[i][1].from),out.push([start[i][0],this.computeDelta(start[i][1],end,damper,initial)]);return out},set:function(values,easing){var i,from,delta,val,p,ln=values.length,out=[],outObject={};for(i=0;i<ln;i++){val=values[i][1],from=val.from,delta=val.delta;for(p in from)outObject[p]=from[p]+delta[p]*easing;out.push([values[i][0],outObject])}return out}},path:{computeDelta:function(from,end,damper,initial){damper="number"==typeof damper?damper:1;var start;return from=+from||0,end=+end||0,start=null!=initial?initial:from,{from:from,delta:(end-start)*damper}},forcePath:function(path){return Ext.isArray(path)||Ext.isArray(path[0])||(path=Ext.draw.Draw.parsePathString(path)),path},get:function(start,end,damper,initialFrom){var startPathLn,pointsLn,i,deltaPath,initial,j,k,path,startPath,endPath=this.forcePath(end),out=[],startLn=start.length;for(i=0;i<startLn;i++){for(startPath=this.forcePath(start[i][1]),deltaPath=Ext.draw.Draw.interpolatePaths(startPath,endPath),startPath=deltaPath[0],endPath=deltaPath[1],startPathLn=startPath.length,path=[],j=0;j<startPathLn;j++){for(deltaPath=[startPath[j][0]],pointsLn=startPath[j].length,k=1;k<pointsLn;k++)initial=initialFrom&&initialFrom[0][1][j][k].from,deltaPath.push(this.computeDelta(startPath[j][k],endPath[j][k],damper,initial));path.push(deltaPath)}out.push([start[i][0],path])}return out},set:function(values,easing){var i,j,k,newPath,calcPath,deltaPath,deltaPathLn,pointsLn,ln=values.length,out=[];for(i=0;i<ln;i++){for(deltaPath=values[i][1],newPath=[],deltaPathLn=deltaPath.length,j=0;j<deltaPathLn;j++){for(calcPath=[deltaPath[j][0]],pointsLn=deltaPath[j].length,k=1;k<pointsLn;k++)calcPath.push(deltaPath[j][k].from+deltaPath[j][k].delta*easing);newPath.push(calcPath.join(","))}out.push([values[i][0],newPath.join(",")])}return out}}}},function(){for(var prop,props=["outlineColor","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","fill","stroke"],length=props.length,i=0;i<length;i++)prop=props[i],this[prop]=this.color;for(props=["cursor"],length=props.length,i=0;i<length;i++)prop=props[i],this[prop]=this.stringHandler});Ext.define("Ext.fx.Anim",{mixins:{observable:"Ext.util.Observable"},requires:["Ext.fx.Manager","Ext.fx.Animator","Ext.fx.Easing","Ext.fx.CubicBezier","Ext.fx.PropertyHandler"],isAnimation:!0,duration:250,delay:0,delayStart:0,dynamic:!1,easing:"ease",damper:1,bezierRE:/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,reverse:!1,running:!1,paused:!1,iterations:1,autoEnd:!1,alternate:!1,currentIteration:0,startTime:0,frameCount:0,constructor:function(config){var curve,me=this;if(config=config||{},config.keyframes)return new Ext.fx.Animator(config);Ext.apply(me,config),void 0===me.from&&(me.from={}),me.propHandlers={},me.config=config,me.target=Ext.fx.Manager.createTarget(me.target),me.easingFn=Ext.fx.Easing[me.easing],me.target.dynamic=me.dynamic,me.easingFn||(me.easingFn=String(me.easing).match(me.bezierRE),me.easingFn&&5==me.easingFn.length&&(curve=me.easingFn,me.easingFn=Ext.fx.CubicBezier.cubicBezier(+curve[1],+curve[2],+curve[3],+curve[4]))),me.id=Ext.id(null,"ext-anim-"),me.addEvents("beforeanimate","afteranimate","lastframe"),me.mixins.observable.constructor.call(me),Ext.fx.Manager.addAnim(me),config.autoEnd&&(me.running=!0,me.jumpToEnd())},setAttr:function(attr,value){return Ext.fx.Manager.items.get(this.id).setAttr(this.target,attr,value)},initAttrs:function(){var start,end,propHandler,attr,me=this,from=me.from,to=me.to,initialFrom=me.initialFrom||{},out={};for(attr in to)to.hasOwnProperty(attr)&&(start=me.target.getAttr(attr,from[attr]),end=to[attr],propHandler=Ext.fx.PropertyHandler[attr]?me.propHandlers[attr]=Ext.fx.PropertyHandler[attr]:Ext.isObject(end)?me.propHandlers[attr]=Ext.fx.PropertyHandler.object:me.propHandlers[attr]=Ext.fx.PropertyHandler.defaultHandler,out[attr]=propHandler.get(start,end,me.damper,initialFrom[attr],attr));me.currentAttrs=out},start:function(startTime){var me=this,delay=me.delay,delayStart=me.delayStart;if(delay){if(!delayStart)return void(me.delayStart=startTime);if(startTime-delayStart<delay)return;startTime=new Date(delayStart.getTime()+delay)}!1!==me.fireEvent("beforeanimate",me)&&(me.startTime=startTime,me.paused||me.currentAttrs||me.initAttrs(),me.running=!0,me.frameCount=0)},jumpToEnd:function(){var me=this;me.endWasCalled||(me.currentAttrs||me.initAttrs(),Ext.fx.Manager.jumpToEnd(me),me.end())},runAnim:function(elapsedTime){var easing,values,attr,lastFrame,me=this,attrs=me.currentAttrs,duration=me.duration,easingFn=me.easingFn,propHandlers=me.propHandlers,ret={};elapsedTime>=duration&&(elapsedTime=duration,lastFrame=!0),me.reverse&&(elapsedTime=duration-elapsedTime);for(attr in attrs)attrs.hasOwnProperty(attr)&&(values=attrs[attr],easing=lastFrame?1:easingFn(elapsedTime/duration),ret[attr]=propHandlers[attr].set(values,easing));return me.frameCount++,ret},lastFrame:function(){var me=this,iter=me.iterations,iterCount=me.currentIteration;iterCount++,iterCount<iter?(me.alternate&&(me.reverse=!me.reverse),me.startTime=new Date,me.currentIteration=iterCount,me.paused=!1):(me.currentIteration=0,me.end(),me.fireEvent("lastframe",me,me.startTime))},endWasCalled:0,end:function(){var me=this;me.endWasCalled++||(me.startTime=0,me.paused=!1,me.running=!1,Ext.fx.Manager.removeAnim(me),me.fireEvent("afteranimate",me,me.startTime),Ext.callback(me.callback,me.scope,[me,me.startTime]),me.remove&&me.target.remove())},isReady:function(){return!1===this.paused&&!1===this.running&&this.iterations>0},isRunning:function(){return!1===this.paused&&!0===this.running&&!0!==this.isAnimator}}),Ext.enableFx=!0;Ext.define("Ext.util.Animate",{requires:["Ext.Element","Ext.CompositeElementLite","Ext.fx.Manager","Ext.fx.Anim"],isAnimate:!0,animate:function(animObj){var me=this;return Ext.fx.Manager.hasFxBlock(me.id)?me:(Ext.fx.Manager.queueFx(new Ext.fx.Anim(me.anim(animObj))),this)},anim:function(config){if(!Ext.isObject(config))return!!config&&{};var me=this;return config.stopAnimation&&me.stopAnimation(),Ext.applyIf(config,Ext.fx.Manager.getFxDefaults(me.id)),Ext.apply({target:me,paused:!0},config)},stopFx:Ext.Function.alias(Ext.util.Animate,"stopAnimation"),stopAnimation:function(){return Ext.fx.Manager.stopAnimation(this.id),this},syncFx:function(){return Ext.fx.Manager.setFxDefaults(this.id,{concurrent:!0}),this},sequenceFx:function(){return Ext.fx.Manager.setFxDefaults(this.id,{concurrent:!1}),this},hasActiveFx:Ext.Function.alias(Ext.util.Animate,"getActiveAnimation"),getActiveAnimation:function(){return Ext.fx.Manager.getActiveAnimation(this.id)}},function(){Ext.applyIf(Ext.Element.prototype,this.prototype),Ext.CompositeElementLite.importElementMethods()});Ext.define("Ext.util.ElementContainer",{childEls:[],constructor:function(){var childEls,me=this;me.hasOwnProperty("childEls")&&(childEls=me.childEls,delete me.childEls,me.addChildEls.apply(me,childEls))},destroy:function(){var child,childName,i,me=this,childEls=me.getChildEls();for(i=childEls.length;i--;)childName=childEls[i],"string"!=typeof childName&&(childName=childName.name),(child=me[childName])&&(me[childName]=null,child.remove())},addChildEls:function(){var me=this,args=arguments;me.hasOwnProperty("childEls")?me.childEls.push.apply(me.childEls,args):me.childEls=me.getChildEls().concat(Array.prototype.slice.call(args)),me.prune(me.childEls,!1)},applyChildEls:function(el,id){var baseId,childName,i,selector,value,me=this,childEls=me.getChildEls();for(baseId=(id||me.id)+"-",i=childEls.length;i--;)childName=childEls[i],"string"==typeof childName?value=el.getById(baseId+childName):(value=(selector=childName.select)?Ext.select(selector,!0,el.dom):(selector=childName.selectNode)?Ext.get(Ext.DomQuery.selectNode(selector,el.dom)):el.getById(childName.id||baseId+childName.itemId),childName=childName.name),me[childName]=value},getChildEls:function(){var self,me=this;return me.hasOwnProperty("childEls")?me.childEls:(self=me.self,self.$childEls||me.getClassChildEls(self))},getClassChildEls:function(cls){var childEls,i,length,forked,mixin,mixins,name,parts,proto,supr,superMixins,me=this,result=cls.$childEls;if(!result){supr=cls.superclass,supr?(supr=supr.self,parts=[supr.$childEls||me.getClassChildEls(supr)],superMixins=supr.prototype.mixins||{}):(parts=[],superMixins={}),proto=cls.prototype,mixins=proto.mixins;for(name in mixins)mixins.hasOwnProperty(name)&&!superMixins.hasOwnProperty(name)&&(mixin=mixins[name].self,parts.push(mixin.$childEls||me.getClassChildEls(mixin)));for(parts.push(proto.hasOwnProperty("childEls")&&proto.childEls),i=0,length=parts.length;i<length;++i)(childEls=parts[i])&&childEls.length&&(result?(forked||(forked=!0,result=result.slice(0)),result.push.apply(result,childEls)):result=childEls);cls.$childEls=result=result?me.prune(result,!forked):[]}return result},prune:function(childEls,shared){for(var name,index=childEls.length,map={};index--;)name=childEls[index],"string"!=typeof name&&(name=name.name),map[name]?(shared&&(shared=!1,childEls=childEls.slice(0)),Ext.Array.erase(childEls,index,1)):map[name]=1;return childEls},removeChildEls:function(testFn){var n,i,cel,me=this,old=me.getChildEls(),keepers=me.childEls=[];for(i=0,n=old.length;i<n;++i)cel=old[i],testFn(cel)||keepers.push(cel)}});Ext.define("Ext.util.Renderable",{requires:["Ext.dom.Element"],frameCls:Ext.baseCSSPrefix+"frame",frameIdRegex:/[\-]frame\d+[TMB][LCR]$/,frameElNames:["TL","TC","TR","ML","MC","MR","BL","BC","BR","Table"],frameTpl:["{%this.renderDockedItems(out,values,0);%}",'<tpl if="top">','<tpl if="left"><div id="{fgid}TL" class="{frameCls}-tl {baseCls}-tl {baseCls}-{ui}-tl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tl</tpl>{frameElCls}" role="presentation"></tpl>','<tpl if="right"><div id="{fgid}TR" class="{frameCls}-tr {baseCls}-tr {baseCls}-{ui}-tr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tr</tpl>{frameElCls}" role="presentation"></tpl>','<div id="{fgid}TC" class="{frameCls}-tc {baseCls}-tc {baseCls}-{ui}-tc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tc</tpl>{frameElCls}" role="presentation"></div>','<tpl if="right"></div></tpl>','<tpl if="left"></div></tpl>',"</tpl>",'<tpl if="left"><div id="{fgid}ML" class="{frameCls}-ml {baseCls}-ml {baseCls}-{ui}-ml<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-ml</tpl>{frameElCls}" role="presentation"></tpl>','<tpl if="right"><div id="{fgid}MR" class="{frameCls}-mr {baseCls}-mr {baseCls}-{ui}-mr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mr</tpl>{frameElCls}" role="presentation"></tpl>','<div id="{fgid}MC" class="{frameCls}-mc {baseCls}-mc {baseCls}-{ui}-mc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mc</tpl>{frameElCls}" role="presentation">',"{%this.applyRenderTpl(out, values)%}","</div>",'<tpl if="right"></div></tpl>','<tpl if="left"></div></tpl>','<tpl if="bottom">','<tpl if="left"><div id="{fgid}BL" class="{frameCls}-bl {baseCls}-bl {baseCls}-{ui}-bl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bl</tpl>{frameElCls}" role="presentation"></tpl>','<tpl if="right"><div id="{fgid}BR" class="{frameCls}-br {baseCls}-br {baseCls}-{ui}-br<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-br</tpl>{frameElCls}" role="presentation"></tpl>','<div id="{fgid}BC" class="{frameCls}-bc {baseCls}-bc {baseCls}-{ui}-bc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bc</tpl>{frameElCls}" role="presentation"></div>','<tpl if="right"></div></tpl>','<tpl if="left"></div></tpl>',"</tpl>","{%this.renderDockedItems(out,values,1);%}"],frameTableTpl:["{%this.renderDockedItems(out,values,0);%}",'<table id="{fgid}Table" class="',Ext.plainTableCls,'" cellpadding="0" role="presentation">','<tbody role="presentation">','<tpl if="top">','<tr role="presentation">','<tpl if="left"><td id="{fgid}TL" class="{frameCls}-tl {baseCls}-tl {baseCls}-{ui}-tl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tl</tpl>{frameElCls}" role="presentation"></td></tpl>','<td id="{fgid}TC" class="{frameCls}-tc {baseCls}-tc {baseCls}-{ui}-tc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tc</tpl>{frameElCls}" role="presentation"></td>','<tpl if="right"><td id="{fgid}TR" class="{frameCls}-tr {baseCls}-tr {baseCls}-{ui}-tr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-tr</tpl>{frameElCls}" role="presentation"></td></tpl>',"</tr>","</tpl>",'<tr role="presentation">','<tpl if="left"><td id="{fgid}ML" class="{frameCls}-ml {baseCls}-ml {baseCls}-{ui}-ml<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-ml</tpl>{frameElCls}" role="presentation"></td></tpl>','<td id="{fgid}MC" class="{frameCls}-mc {baseCls}-mc {baseCls}-{ui}-mc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mc</tpl>{frameElCls}" role="presentation">',"{%this.applyRenderTpl(out, values)%}","</td>",'<tpl if="right"><td id="{fgid}MR" class="{frameCls}-mr {baseCls}-mr {baseCls}-{ui}-mr<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-mr</tpl>{frameElCls}" role="presentation"></td></tpl>',"</tr>",'<tpl if="bottom">','<tr role="presentation">','<tpl if="left"><td id="{fgid}BL" class="{frameCls}-bl {baseCls}-bl {baseCls}-{ui}-bl<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bl</tpl>{frameElCls}" role="presentation"></td></tpl>','<td id="{fgid}BC" class="{frameCls}-bc {baseCls}-bc {baseCls}-{ui}-bc<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-bc</tpl>{frameElCls}" role="presentation"></td>','<tpl if="right"><td id="{fgid}BR" class="{frameCls}-br {baseCls}-br {baseCls}-{ui}-br<tpl for="uiCls"> {parent.baseCls}-{parent.ui}-{.}-br</tpl>{frameElCls}" role="presentation"></td></tpl>',"</tr>","</tpl>","</tbody></table>","{%this.renderDockedItems(out,values,1);%}"],afterRender:function(){var item,pre,hide,contentEl,me=this,data={},protoEl=me.protoEl,target=me.el;me.finishRenderChildren(),me.contentEl&&(pre=Ext.baseCSSPrefix,hide=pre+"hide-",contentEl=Ext.get(me.contentEl),contentEl.removeCls([pre+"hidden",hide+"display",hide+"offsets",hide+"nosize"]),me.getContentTarget().appendChild(contentEl.dom)),protoEl.writeTo(data),item=data.removed,item&&target.removeCls(item),item=data.cls,item.length&&target.addCls(item),item=data.style,data.style&&target.setStyle(item),me.protoEl=null,me.ownerCt||me.updateLayout()},afterFirstLayout:function(width,height){var hasX,hasY,pos,xy,me=this,x=me.x,y=me.y;me.ownerLayout||(hasX=Ext.isDefined(x),hasY=Ext.isDefined(y)),!me.floating||hasX&&hasY||(me.floatParent?(pos=me.floatParent.getTargetEl().getViewRegion(),xy=me.el.getAlignToXY(me.floatParent.getTargetEl(),"c-c"),pos.x=xy[0]-pos.x,pos.y=xy[1]-pos.y):(xy=me.el.getAlignToXY(me.container,"c-c"),pos=me.container.translateXY(xy[0],xy[1])),x=hasX?x:pos.x,y=hasY?y:pos.y,hasX=hasY=!0),(hasX||hasY)&&me.setPosition(x,y),me.onBoxReady(width,height)},applyRenderSelectors:function(){var selector,me=this,selectors=me.renderSelectors,el=me.el,dom=el.dom;if(me.applyChildEls(el),selectors)for(selector in selectors)selectors.hasOwnProperty(selector)&&selectors[selector]&&(me[selector]=Ext.get(Ext.DomQuery.selectNode(selectors[selector],dom)))},beforeRender:function(){var me=this,overflowEl=(me.getTargetEl(),me.getOverflowEl()),layout=me.getComponentLayout(),overflowStyle=me.getOverflowStyle();me.frame=me.frame||me.alwaysFramed,layout.initialized||layout.initLayout(),overflowEl&&(overflowEl.setStyle(overflowStyle),me.overflowStyleSet=!0),me.setUI(me.ui),me.disabled&&me.disable(!0)},doApplyRenderTpl:function(out,values){var tpl,me=values.$comp;me.rendered||(tpl=me.initRenderTpl(),tpl.applyOut(values.renderData,out))},doAutoRender:function(){var me=this;me.rendered||(me.floating?me.render(document.body):me.render(Ext.isBoolean(me.autoRender)?Ext.getBody():me.autoRender))},doRenderContent:function(out,renderData){var me=renderData.$comp;me.html&&(Ext.DomHelper.generateMarkup(me.html,out),delete me.html),me.tpl&&(me.tpl.isTemplate||(me.tpl=new Ext.XTemplate(me.tpl)),me.data&&(me.tpl.applyOut(me.data,out),delete me.data))},doRenderFramingDockedItems:function(out,renderData,after){var me=renderData.$comp;!me.rendered&&me.doRenderDockedItems&&(renderData.renderData.$skipDockedItems=!0,me.doRenderDockedItems.call(this,out,renderData,after))},finishRender:function(containerIdx){var tpl,data,el,me=this;!me.el||me.$pid?(el=me.container?me.container.getById(me.id,!0):Ext.getDom(me.id),me.el?(delete me.$pid,me.el.dom||me.wrapPrimaryEl(me.el),el.parentNode.insertBefore(me.el.dom,el),Ext.removeNode(el)):me.wrapPrimaryEl(el)):me.rendering||(tpl=me.initRenderTpl())&&(data=me.initRenderData(),tpl.insertFirst(me.getTargetEl(),data)),me.container||(me.container=Ext.get(me.el.dom.parentNode)),me.ctCls&&me.container.addCls(me.ctCls),me.onRender(me.container,containerIdx),me.overflowStyleSet||me.getOverflowEl().setStyle(me.getOverflowStyle()),me.el.setVisibilityMode(Ext.Element[me.hideMode.toUpperCase()]),me.overCls&&me.el.hover(me.addOverCls,me.removeOverCls,me),me.hasListeners.render&&me.fireEvent("render",me),me.afterRender(),me.hasListeners.afterrender&&me.fireEvent("afterrender",me),me.initEvents(),me.hidden&&me.el.hide()},finishRenderChildren:function(){this.getComponentLayout().finishRender()},getElConfig:function(){var i,frameElNames,len,suffix,frameGenId,frameData,me=this,autoEl=me.autoEl,frameInfo=me.getFrameInfo(),config={tag:"div",tpl:frameInfo?me.initFramingTpl(frameInfo.table):me.initRenderTpl()},protoEl=me.protoEl;if(me.initStyles(protoEl),protoEl.writeTo(config),protoEl.flush(),Ext.isString(autoEl)?config.tag=autoEl:Ext.apply(config,autoEl),config.id=me.id,config.tpl)if(frameInfo){for(frameElNames=me.frameElNames,len=frameElNames.length,config.tplData=frameData=me.getFrameRenderData(),frameData.renderData=me.initRenderData(),frameGenId=frameData.fgid,i=0;i<len;i++)suffix=frameElNames[i],me.addChildEls({name:"frame"+suffix,id:frameGenId+suffix});me.addChildEls({name:"frameBody",id:frameGenId+"MC"})}else config.tplData=me.initRenderData();return config},initFramingTpl:function(table){var tpl=this.getFrameTpl(table);return tpl&&!tpl.applyRenderTpl&&this.setupFramingTpl(tpl),tpl},setupFramingTpl:function(frameTpl){frameTpl.applyRenderTpl=this.doApplyRenderTpl,frameTpl.renderDockedItems=this.doRenderFramingDockedItems},getInsertPosition:function(position){return void 0!==position&&(position=Ext.isNumber(position)?this.container.dom.childNodes[position]:Ext.getDom(position)),position},getRenderTree:function(){var me=this;return me.hasListeners.beforerender&&!1===me.fireEvent("beforerender",me)?null:(me.beforeRender(),me.rendering=!0,me.el?{tag:"div",role:"presentation",id:me.$pid=Ext.id()}:me.getElConfig())},initContainer:function(container){var me=this;return!container&&me.el&&(container=me.el.dom.parentNode,me.allowDomMove=!1),me.container=container.dom?container:Ext.get(container),me.container},initRenderData:function(){var me=this;return Ext.apply({$comp:me,id:me.id,ui:me.ui,uiCls:me.uiCls,baseCls:me.baseCls,componentCls:me.componentCls,frame:me.frame,role:me.ariaRole,childElCls:""},me.renderData)},initRenderTpl:function(){var tpl=this.getTpl("renderTpl");return tpl&&!tpl.renderContent&&this.setupRenderTpl(tpl),tpl},onRender:function(parentNode,containerIdx){var width,height,me=this,x=me.x,y=me.y,lastBox=null,el=me.el;me.applyRenderSelectors(),me.rendering=null,me.rendered=!0,null!=x&&(lastBox={x:x}),null!=y&&((lastBox=lastBox||{}).y=y),!me.getFrameInfo()&&Ext.isBorderBox&&(width=me.width,height=me.height,"number"==typeof width&&(lastBox=lastBox||{},lastBox.width=width),"number"==typeof height&&(lastBox=lastBox||{},lastBox.height=height)),me.lastBox=el.lastBox=lastBox},render:function(container,position){var vetoed,tree,nextSibling,me=this,el=me.el&&(me.el=Ext.get(me.el));Ext.suspendLayouts(),container=me.initContainer(container),nextSibling=me.getInsertPosition(position),el?me.hasListeners.beforerender&&!1===me.fireEvent("beforerender",me)?vetoed=!0:(me.beforeRender(),me.initStyles(el),!1!==me.allowDomMove&&(nextSibling?container.dom.insertBefore(el.dom,nextSibling):container.dom.appendChild(el.dom))):(tree=me.getRenderTree(),me.ownerLayout&&me.ownerLayout.transformItemRenderTree&&(tree=me.ownerLayout.transformItemRenderTree(tree)),tree&&(el=nextSibling?Ext.DomHelper.insertBefore(nextSibling,tree):Ext.DomHelper.append(container,tree),me.wrapPrimaryEl(el))),el&&!vetoed&&me.finishRender(position),Ext.resumeLayouts(!me.hidden&&!container.isDetachedBody)},ensureAttachedToBody:function(runLayout){for(var body,comp=this;comp.ownerCt;)comp=comp.ownerCt;comp.container.isDetachedBody&&(comp.container=body=Ext.getBody(),body.appendChild(comp.el.dom),runLayout&&comp.updateLayout(),"number"!=typeof comp.x&&"number"!=typeof comp.y||comp.setPosition(comp.x,comp.y))},setupRenderTpl:function(renderTpl){renderTpl.renderBody=renderTpl.renderContent=this.doRenderContent},wrapPrimaryEl:function(dom){this.el=Ext.get(dom,!0)},initFrame:function(){if(!Ext.supports.CSS3BorderRadius&&this.frame){var frameTpl,frameGenId,i,frameData,suffix,me=this,frameInfo=me.getFrameInfo(),frameElNames=me.frameElNames,len=frameElNames.length;if(frameInfo)for(frameTpl=me.getFrameTpl(frameInfo.table),frameData=me.getFrameRenderData(),frameGenId=frameData.fgid,frameTpl.insertFirst(me.el,frameData),me.frameBody=me.el.down("."+me.frameCls+"-mc"),me.removeChildEls(function(c){return c.id&&me.frameIdRegex.test(c.id)}),i=0;i<len;i++)suffix=frameElNames[i],me["frame"+suffix]=me.el.getById(frameGenId+suffix)}},getFrameRenderData:function(){var me=this,frameInfo=me.frameSize,frameGenId=(me.frameGenId||0)+1;return me.frameGenId=frameGenId,{$comp:me,fgid:me.id+"-frame"+frameGenId,ui:me.ui,uiCls:me.uiCls,frameCls:me.frameCls,baseCls:me.baseCls,top:!!frameInfo.top,left:!!frameInfo.left,right:!!frameInfo.right,bottom:!!frameInfo.bottom,frameElCls:""}},updateFrame:function(){if(!Ext.supports.CSS3BorderRadius&&this.frame){var newMCClassName,me=this,wasTable=me.frameSize&&me.frameSize.table,oldFrameTL=me.frameTL,oldFrameBL=me.frameBL,oldFrameML=me.frameML,oldFrameMC=me.frameMC;me.initFrame(),oldFrameMC?me.frame&&(newMCClassName=me.frameMC.dom.className,oldFrameMC.insertAfter(me.frameMC),me.frameMC.remove(),me.frameBody=me.frameMC=oldFrameMC,oldFrameMC.dom.className=newMCClassName,wasTable?me.el.query("> table")[1].remove():(oldFrameTL&&oldFrameTL.remove(),oldFrameBL&&oldFrameBL.remove(),oldFrameML&&oldFrameML.remove())):me.frame&&me.applyRenderSelectors()}},getFrameInfo:function(){if(Ext.supports.CSS3BorderRadius||!this.frame)return!1;var styleEl,info,frameTop,frameRight,frameBottom,frameLeft,borderWidthT,borderWidthR,borderWidthB,borderWidthL,paddingT,paddingR,paddingB,paddingL,borderRadiusTL,borderRadiusTR,borderRadiusBR,borderRadiusBL,me=this,frameInfoCache=me.frameInfoCache,cls=me.getFramingInfoCls()+"-frameInfo",frameInfo=frameInfoCache[cls],max=Math.max;return null==frameInfo&&(styleEl=Ext.fly(me.getStyleProxy(cls),"frame-style-el"),info=styleEl.getStyle("font-family"),info?(info=info.split("-"),borderRadiusTL=parseInt(info[1],10),borderRadiusTR=parseInt(info[2],10),borderRadiusBR=parseInt(info[3],10),borderRadiusBL=parseInt(info[4],10),borderWidthT=parseInt(info[5],10),borderWidthR=parseInt(info[6],10),borderWidthB=parseInt(info[7],10),borderWidthL=parseInt(info[8],10),paddingT=parseInt(info[9],10),paddingR=parseInt(info[10],10),paddingB=parseInt(info[11],10),paddingL=parseInt(info[12],10),frameTop=max(borderWidthT,max(borderRadiusTL,borderRadiusTR)),frameRight=max(borderWidthR,max(borderRadiusTR,borderRadiusBR)),frameBottom=max(borderWidthB,max(borderRadiusBL,borderRadiusBR)),frameLeft=max(borderWidthL,max(borderRadiusTL,borderRadiusBL)),frameInfo={table:"t"===info[0].charAt(0),vertical:"v"===info[0].charAt(1),top:frameTop,right:frameRight,bottom:frameBottom,left:frameLeft,width:frameLeft+frameRight,height:frameTop+frameBottom,maxWidth:max(frameTop,frameRight,frameBottom,frameLeft),border:{top:borderWidthT,right:borderWidthR,bottom:borderWidthB,left:borderWidthL,width:borderWidthL+borderWidthR,height:borderWidthT+borderWidthB},padding:{top:paddingT,right:paddingR,bottom:paddingB,left:paddingL,width:paddingL+paddingR,height:paddingT+paddingB},radius:{tl:borderRadiusTL,tr:borderRadiusTR,br:borderRadiusBR,bl:borderRadiusBL}}):frameInfo=!1,!0!==me.frame||frameInfo||Ext.log.error("You have set frame: true explicity on this component ("+me.getXType()+") and it does not have any framing defined in the CSS template. In this case IE cannot figure out what sizes to use and thus framing on this component will be disabled."),frameInfoCache[cls]=frameInfo),me.frame=!!frameInfo,me.frameSize=frameInfo,frameInfo},getFramingInfoCls:function(){return this.baseCls+"-"+this.ui},getStyleProxy:function(cls){var result=this.styleProxyEl||(Ext.AbstractComponent.prototype.styleProxyEl=Ext.getBody().createChild({"data-sticky":!0,role:"presentation",style:{position:"absolute",top:"-10000px"}},null,!0));return result.className=cls,result},getFrameTpl:function(table){return this.getTpl(table?"frameTableTpl":"frameTpl")},frameInfoCache:{}});Ext.define("Ext.state.Provider",{mixins:{observable:"Ext.util.Observable"},prefix:"ext-",constructor:function(config){config=config||{};var me=this;Ext.apply(me,config),me.addEvents("statechange"),me.state={},me.mixins.observable.constructor.call(me)},get:function(name,defaultValue){return void 0===this.state[name]?defaultValue:this.state[name]},clear:function(name){var me=this;delete me.state[name],me.fireEvent("statechange",me,name,null)},set:function(name,value){var me=this;me.state[name]=value,me.fireEvent("statechange",me,name,value)},decodeValue:function(value){var all,type,keyValue,values,vLen,v,me=this,re=/^(a|n|d|b|s|o|e)\:(.*)$/,matches=re.exec(unescape(value));if(matches&&matches[1])switch(type=matches[1],value=matches[2],type){case"e":return null;case"n":return parseFloat(value);case"d":return new Date(Date.parse(value));case"b":return"1"==value;case"a":if(all=[],""!=value)for(values=value.split("^"),vLen=values.length,v=0;v<vLen;v++)value=values[v],all.push(me.decodeValue(value));return all;case"o":if(all={},""!=value)for(values=value.split("^"),vLen=values.length,v=0;v<vLen;v++)value=values[v],keyValue=value.split("="),all[keyValue[0]]=me.decodeValue(keyValue[1]);return all;default:return value}},encodeValue:function(value){var enc,len,key,flat="",i=0;if(null==value)return"e:1";if("number"==typeof value)enc="n:"+value;else if("boolean"==typeof value)enc="b:"+(value?"1":"0");else if(Ext.isDate(value))enc="d:"+value.toGMTString();else if(Ext.isArray(value)){for(len=value.length;i<len;i++)flat+=this.encodeValue(value[i]),i!=len-1&&(flat+="^");enc="a:"+flat}else if("object"==typeof value){for(key in value)"function"!=typeof value[key]&&void 0!==value[key]&&(flat+=key+"="+this.encodeValue(value[key])+"^");enc="o:"+flat.substring(0,flat.length-1)}else enc="s:"+value;return escape(enc)}});Ext.define("Ext.state.Manager",{singleton:!0,requires:["Ext.state.Provider"],constructor:function(){this.provider=new Ext.state.Provider},setProvider:function(stateProvider){this.provider=stateProvider},get:function(key,defaultValue){return this.provider.get(key,defaultValue)},set:function(key,value){this.provider.set(key,value)},clear:function(key){this.provider.clear(key)},getProvider:function(){return this.provider}});Ext.define("Ext.state.Stateful",{mixins:{observable:"Ext.util.Observable"},requires:["Ext.state.Manager"],stateful:!1,saveDelay:100,constructor:function(config){var me=this;config=config||{},void 0!==config.stateful&&(me.stateful=config.stateful),void 0!==config.saveDelay&&(me.saveDelay=config.saveDelay),me.stateId=me.stateId||config.stateId,me.stateEvents||(me.stateEvents=[]),config.stateEvents&&me.stateEvents.concat(config.stateEvents),this.addEvents("beforestaterestore","staterestore","beforestatesave","statesave"),me.mixins.observable.constructor.call(me),!1!==me.stateful&&(me.addStateEvents(me.stateEvents),me.initState())},addStateEvents:function(events){var i,event,stateEventsByName,me=this;if(me.stateful&&me.getStateId())for("string"==typeof events&&(events=Array.prototype.slice.call(arguments,0)),stateEventsByName=me.stateEventsByName||(me.stateEventsByName={}),i=events.length;i--;)event=events[i],stateEventsByName[event]||(stateEventsByName[event]=1,me.on(event,me.onStateChange,me))},onStateChange:function(){var statics,runner,me=this,delay=me.saveDelay;me.stateful&&(delay?(me.stateTask||(statics=Ext.state.Stateful,runner=statics.runner||(statics.runner=new Ext.util.TaskRunner),me.stateTask=runner.newTask({run:me.saveState,scope:me,interval:delay,repeat:1})),me.stateTask.start()):me.saveState())},saveState:function(){var state,me=this,id=me.stateful&&me.getStateId(),hasListeners=me.hasListeners;id&&(state=me.getState()||{},hasListeners.beforestatesave&&!1===me.fireEvent("beforestatesave",me,state)||(Ext.state.Manager.set(id,state),hasListeners.statesave&&me.fireEvent("statesave",me,state)))},getState:function(){return null},applyState:function(state){state&&Ext.apply(this,state)},getStateId:function(){var me=this;return me.stateId||(me.autoGenId?null:me.id)},initState:function(){var state,me=this,id=me.stateful&&me.getStateId(),hasListeners=me.hasListeners;id&&(state=Ext.state.Manager.get(id))&&(state=Ext.apply({},state),hasListeners.beforestaterestore&&!1===me.fireEvent("beforestaterestore",me,state)||(me.applyState(state),hasListeners.staterestore&&me.fireEvent("staterestore",me,state)))},savePropToState:function(propName,state,stateName){var me=this,value=me[propName],config=me.initialConfig;return!(!me.hasOwnProperty(propName)||config&&config[propName]===value)&&(state&&(state[stateName||propName]=value),!0)},savePropsToState:function(propNames,state){var i,n,me=this;if("string"==typeof propNames)me.savePropToState(propNames,state);else for(i=0,n=propNames.length;i<n;++i)me.savePropToState(propNames[i],state);return state},destroy:function(){var me=this,task=me.stateTask;task&&(task.destroy(),me.stateTask=null),me.clearListeners()}});Ext.define("Ext.AbstractComponent",{requires:["Ext.ComponentQuery","Ext.ComponentManager","Ext.util.ProtoElement","Ext.dom.CompositeElement","Ext.PluginManager"],mixins:{positionable:"Ext.util.Positionable",observable:"Ext.util.Observable",animate:"Ext.util.Animate",elementCt:"Ext.util.ElementContainer",renderable:"Ext.util.Renderable",state:"Ext.state.Stateful"},uses:["Ext.PluginManager","Ext.Element","Ext.DomHelper","Ext.XTemplate","Ext.ComponentLoader","Ext.EventManager","Ext.layout.Context","Ext.layout.Layout","Ext.layout.component.Auto","Ext.LoadMask","Ext.ZIndexManager"],statics:{AUTO_ID:1e3,pendingLayouts:null,layoutSuspendCount:0,cancelLayout:function(comp,isDestroying){var context=this.runningLayoutContext||this.pendingLayouts;context&&context.cancelComponent(comp,!1,isDestroying)},flushLayouts:function(){var me=this,context=me.pendingLayouts;context&&context.invalidQueue.length&&(me.pendingLayouts=null,me.runningLayoutContext=context,Ext.override(context,{runComplete:function(){me.runningLayoutContext=null;var result=this.callParent();return Ext.globalEvents.hasListeners.afterlayout&&Ext.globalEvents.fireEvent("afterlayout"),result}}),context.run())},resumeLayouts:function(flush){this.layoutSuspendCount&&!--this.layoutSuspendCount&&(flush&&this.flushLayouts(),Ext.globalEvents.hasListeners.resumelayouts&&Ext.globalEvents.fireEvent("resumelayouts"))},suspendLayouts:function(){++this.layoutSuspendCount},updateLayout:function(comp,defer){var pending,me=this,running=me.runningLayoutContext;running?running.queueInvalidate(comp):(pending=me.pendingLayouts||(me.pendingLayouts=new Ext.layout.Context),pending.queueInvalidate(comp),defer||me.layoutSuspendCount||comp.isLayoutSuspended()||me.flushLayouts())}},isComponent:!0,getAutoId:function(){return this.autoGenId=!0,++Ext.AbstractComponent.AUTO_ID},deferLayouts:!1,autoGenId:!1,renderTpl:"{%this.renderContent(out,values)%}",frameSize:null,tplWriteMode:"overwrite",baseCls:Ext.baseCSSPrefix+"component",disabledCls:Ext.baseCSSPrefix+"item-disabled",ui:"default",uiCls:[],hidden:!1,disabled:!1,draggable:!1,floating:!1,hideMode:"display",autoShow:!1,autoRender:!1,allowDomMove:!0,rendered:!1,componentLayoutCounter:0,shrinkWrap:2,weight:0,maskOnDisable:!0,_isLayoutRoot:!1,contentPaddingProperty:"padding",horizontalPosProp:"left",borderBoxCls:Ext.baseCSSPrefix+"border-box",rootCls:Ext.baseCSSPrefix+"body",constructor:function(config){var i,len,xhooks,me=this;if(config?(Ext.apply(me,config),(xhooks=me.xhooks)&&(delete me.xhooks,Ext.override(me,xhooks))):config={},me.initialConfig=config,me.mixins.elementCt.constructor.call(me),me.addEvents("beforeactivate","activate","beforedeactivate","deactivate","added","disable","enable","beforeshow","show","beforehide","hide","removed","beforerender","render","afterrender","boxready","beforedestroy","destroy","resize","move","focus","blur"),me.getId(),me.setupProtoEl(),me.cls&&(me.initialCls=me.cls,me.protoEl.addCls(me.cls)),me.style&&(me.initialStyle=me.style,me.protoEl.setStyle(me.style)),me.renderData=me.renderData||{},me.renderSelectors=me.renderSelectors||{},me.plugins&&(me.plugins=me.constructPlugins()),me.hasListeners||(me.hasListeners=new me.HasListeners),me.initComponent(),Ext.ComponentManager.register(me),me.mixins.observable.constructor.call(me),me.mixins.state.constructor.call(me,config),this.addStateEvents("resize"),me.plugins)for(i=0,len=me.plugins.length;i<len;i++)me.plugins[i]=me.initPlugin(me.plugins[i]);me.loader=me.getLoader(),me.renderTo&&me.render(me.renderTo),me.autoShow&&!me.isContained&&me.show(),Ext.isDefined(me.disabledClass)&&(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.Component: disabledClass has been deprecated. Please use disabledCls."),me.disabledCls=me.disabledClass,delete me.disabledClass)},initComponent:function(){var me=this;me.plugins&&!me.plugins.processed&&(me.plugins=me.constructPlugins()),me.setSize(me.width,me.height)},getState:function(){var me=this,state=null,sizeModel=me.getSizeModel();return sizeModel.width.configured&&(state=me.addPropertyToState(state,"width")),sizeModel.height.configured&&(state=me.addPropertyToState(state,"height")),state},addPropertyToState:function(state,propName,value){var me=this,len=arguments.length;return(3==len||me.hasOwnProperty(propName))&&(len<3&&(value=me[propName]),value!==me.initialConfig[propName]&&((state||(state={}))[propName]=value)),state},show:Ext.emptyFn,animate:function(animObj){var hasToWidth,hasToHeight,toHeight,toWidth,to,clearWidth,clearHeight,curWidth,w,curHeight,h,isExpanding,wasConstrained,wasConstrainedHeader,passedCallback,oldOverflow,me=this;return animObj=animObj||{},to=animObj.to||{},Ext.fx.Manager.hasFxBlock(me.id)?me:(hasToWidth=Ext.isDefined(to.width),hasToWidth&&(toWidth=Ext.Number.constrain(to.width,me.minWidth,me.maxWidth)),hasToHeight=Ext.isDefined(to.height),hasToHeight&&(toHeight=Ext.Number.constrain(to.height,me.minHeight,me.maxHeight)),animObj.dynamic||!hasToWidth&&!hasToHeight||(curWidth=(animObj.from?animObj.from.width:void 0)||me.getWidth(),w=curWidth,curHeight=(animObj.from?animObj.from.height:void 0)||me.getHeight(),h=curHeight,isExpanding=!1,hasToHeight&&toHeight>curHeight&&(h=toHeight,isExpanding=!0),hasToWidth&&toWidth>curWidth&&(w=toWidth,isExpanding=!0),(hasToHeight||hasToWidth)&&"hidden"!==(oldOverflow=me.el.getStyle("overtflow"))&&me.el.setStyle("overflow","hidden"),isExpanding&&(clearWidth=!Ext.isNumber(me.width),clearHeight=!Ext.isNumber(me.height),me.setSize(w,h),me.el.setSize(curWidth,curHeight),clearWidth&&delete me.width,clearHeight&&delete me.height),hasToWidth&&(to.width=toWidth),hasToHeight&&(to.height=toHeight)),wasConstrained=me.constrain,wasConstrainedHeader=me.constrainHeader,(wasConstrained||wasConstrainedHeader)&&(me.constrain=me.constrainHeader=!1,passedCallback=animObj.callback,animObj.callback=function(){me.constrain=wasConstrained,me.constrainHeader=wasConstrainedHeader,passedCallback&&passedCallback.call(animObj.scope||me,arguments),"hidden"!==oldOverflow&&me.el.setStyle("overflow",oldOverflow)}),me.mixins.animate.animate.apply(me,arguments))},setHiddenState:function(hidden){var hierarchyState=this.getHierarchyState();this.hidden=hidden,hidden?hierarchyState.hidden=!0:delete hierarchyState.hidden},onHide:function(){this.ownerLayout&&this.updateLayout({isRoot:!1})},onShow:function(){this.updateLayout({isRoot:!1})},constructPlugin:function(plugin){var me=this;return plugin="string"==typeof plugin?Ext.PluginManager.create({},plugin,me):Ext.PluginManager.create(plugin,null,me)},constructPlugins:function(){var result,i,len,me=this,plugins=me.plugins;if(plugins)for(result=[],result.processed=!0,Ext.isArray(plugins)||(plugins=[plugins]),i=0,len=plugins.length;i<len;i++)result[i]=me.constructPlugin(plugins[i]);return me.pluginsInitialized=!0,result},initPlugin:function(plugin){return plugin.init(this),plugin},addPlugin:function(plugin){var me=this;return plugin=me.constructPlugin(plugin),me.plugins?me.plugins.push(plugin):me.plugins=[plugin],me.pluginsInitialized&&me.initPlugin(plugin),plugin},removePlugin:function(plugin){Ext.Array.remove(this.plugins,plugin),plugin.destroy()},findPlugin:function(ptype){var i,plugins=this.plugins,ln=plugins&&plugins.length;for(i=0;i<ln;i++)if(plugins[i].ptype===ptype)return plugins[i]},getPlugin:function(pluginId){var i,plugins=this.plugins,ln=plugins&&plugins.length;for(i=0;i<ln;i++)if(plugins[i].pluginId===pluginId)return plugins[i]},beforeLayout:Ext.emptyFn,registerFloatingItem:function(cmp){var me=this;me.floatingDescendants||(me.floatingDescendants=new Ext.ZIndexManager(me)),me.floatingDescendants.register(cmp)},unregisterFloatingItem:function(cmp){var me=this;me.floatingDescendants&&me.floatingDescendants.unregister(cmp)},layoutSuspendCount:0,suspendLayouts:function(){var me=this;me.rendered&&1==++me.layoutSuspendCount&&(me.suspendLayout=!0)},resumeLayouts:function(flushOptions){var me=this;me.rendered&&(--me.layoutSuspendCount||(me.suspendLayout=!1,flushOptions&&!me.isLayoutSuspended()&&me.updateLayout(flushOptions)))},setupProtoEl:function(){var cls=this.initCls();this.protoEl=new Ext.util.ProtoElement({cls:cls.join(" ")})},initCls:function(){var me=this,cls=[me.baseCls,me.getComponentLayout().targetCls];return Ext.isDefined(me.cmpCls)&&(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.Component: cmpCls has been deprecated. Please use componentCls."),me.componentCls=me.cmpCls,delete me.cmpCls),me.componentCls?cls.push(me.componentCls):me.componentCls=me.baseCls,cls},setUI:function(ui){var classes,me=this,uiCls=me.uiCls,activeUI=me.activeUI;ui!==activeUI&&(activeUI?(classes=me.removeClsWithUI(uiCls,!0),classes.length&&me.removeCls(classes),me.removeUIFromElement()):me.uiCls=[],me.ui=ui,me.activeUI=ui,me.addUIToElement(),classes=me.addClsWithUI(uiCls,!0),classes.length&&me.addCls(classes),me.rendered&&me.updateLayout())},addClsWithUI:function(classes,skip){var length,cls,me=this,clsArray=[],i=0,uiCls=me.uiCls=Ext.Array.clone(me.uiCls),activeUI=me.activeUI;for("string"==typeof classes&&(classes=classes.indexOf(" ")<0?[classes]:Ext.String.splitWords(classes)),length=classes.length;i<length;i++)(cls=classes[i])&&!me.hasUICls(cls)&&(uiCls.push(cls),activeUI&&(clsArray=clsArray.concat(me.addUIClsToElement(cls))));return!0!==skip&&activeUI&&me.addCls(clsArray),clsArray},removeClsWithUI:function(classes,skip){var length,cls,me=this,clsArray=[],i=0,extArray=Ext.Array,remove=extArray.remove,uiCls=me.uiCls=extArray.clone(me.uiCls),activeUI=me.activeUI;for("string"==typeof classes&&(classes=classes.indexOf(" ")<0?[classes]:Ext.String.splitWords(classes)),length=classes.length,i=0;i<length;i++)(cls=classes[i])&&me.hasUICls(cls)&&(remove(uiCls,cls),activeUI&&(clsArray=clsArray.concat(me.removeUIClsFromElement(cls))));return!0!==skip&&activeUI&&me.removeCls(clsArray),clsArray},hasUICls:function(cls){var me=this,uiCls=me.uiCls||[];return Ext.Array.contains(uiCls,cls)},frameElementsArray:["tl","tc","tr","ml","mc","mr","bl","bc","br"],addUIClsToElement:function(cls){var frameElementsArray,frameElementsLength,i,el,frameElement,me=this,baseClsUi=me.baseCls+"-"+me.ui+"-"+cls,result=[Ext.baseCSSPrefix+cls,me.baseCls+"-"+cls,baseClsUi];if(me.rendered&&me.frame&&!Ext.supports.CSS3BorderRadius)for(frameElementsArray=me.frameElementsArray,frameElementsLength=frameElementsArray.length,i=0;i<frameElementsLength;i++)frameElement=frameElementsArray[i],(el=me["frame"+frameElement.toUpperCase()])&&el.addCls(baseClsUi+"-"+frameElement);return result},removeUIClsFromElement:function(cls){var frameElementsArray,frameElementsLength,i,el,frameElement,me=this,baseClsUi=me.baseCls+"-"+me.ui+"-"+cls,result=[Ext.baseCSSPrefix+cls,me.baseCls+"-"+cls,baseClsUi];if(me.rendered&&me.frame&&!Ext.supports.CSS3BorderRadius)for(frameElementsArray=me.frameElementsArray,frameElementsLength=frameElementsArray.length,i=0;i<frameElementsLength;i++)frameElement=frameElementsArray[i],(el=me["frame"+frameElement.toUpperCase()])&&el.removeCls(baseClsUi+"-"+frameElement);return result},addUIToElement:function(){var frameElementsArray,frameElementsLength,i,el,frameElement,me=this,baseClsUI=me.baseCls+"-"+me.ui;if(me.addCls(baseClsUI),me.rendered&&me.frame&&!Ext.supports.CSS3BorderRadius)for(frameElementsArray=me.frameElementsArray,frameElementsLength=frameElementsArray.length,i=0;i<frameElementsLength;i++)frameElement=frameElementsArray[i],(el=me["frame"+frameElement.toUpperCase()])&&el.addCls(baseClsUI+"-"+frameElement)},removeUIFromElement:function(){var frameElementsArray,frameElementsLength,i,el,frameElement,me=this,baseClsUI=me.baseCls+"-"+me.ui;if(me.removeCls(baseClsUI),me.rendered&&me.frame&&!Ext.supports.CSS3BorderRadius)for(frameElementsArray=me.frameElementsArray,frameElementsLength=frameElementsArray.length,i=0;i<frameElementsLength;i++)frameElement=frameElementsArray[i],(el=me["frame"+frameElement.toUpperCase()])&&el.removeCls(baseClsUI+"-"+frameElement)},getTpl:function(name){return Ext.XTemplate.getTpl(this,name)},initStyles:function(targetEl){var width,height,me=this,margin=(Ext.Element,me.margin),border=me.border,cls=me.cls,style=me.style,x=me.x,y=me.y;me.initPadding(targetEl),null!=margin&&targetEl.setStyle("margin",this.unitizeBox(!0===margin?5:margin)),null!=border&&me.setBorder(border,targetEl),cls&&cls!=me.initialCls&&(targetEl.addCls(cls),me.cls=me.initialCls=null),style&&style!=me.initialStyle&&(targetEl.setStyle(style),me.style=me.initialStyle=null),null!=x&&targetEl.setStyle(me.horizontalPosProp,"number"==typeof x?x+"px":x),null!=y&&targetEl.setStyle("top","number"==typeof y?y+"px":y),me.ownerCt&&!me.floating||(Ext.scopeCss&&targetEl.addCls(me.rootCls),Ext.isBorderBox&&targetEl.addCls(me.borderBoxCls)),me.getFrameInfo()||(width=me.width,height=me.height,null!=width&&("number"==typeof width?Ext.isBorderBox&&targetEl.setStyle("width",width+"px"):targetEl.setStyle("width",width)),null!=height&&("number"==typeof height?Ext.isBorderBox&&targetEl.setStyle("height",height+"px"):targetEl.setStyle("height",height)))},initPadding:function(targetEl){var me=this,padding=me.padding;null!=padding&&(me.layout&&me.layout.managePadding&&"padding"===me.contentPaddingProperty?targetEl.setStyle("padding",0):targetEl.setStyle("padding",this.unitizeBox(!0===padding?5:padding)))},parseBox:function(box){return Ext.dom.Element.parseBox(box)},unitizeBox:function(box){return Ext.dom.Element.unitizeBox(box)},setMargin:function(margin,preventLayout){var me=this;me.rendered?(margin||0===margin?(!0===margin&&(margin=5),margin=this.unitizeBox(margin)):margin="",me.getTargetEl().setStyle("margin",margin),preventLayout||me.updateLayout()):me.margin=margin},initEvents:function(){var afterRenderEvent,el,property,index,len,me=this,afterRenderEvents=me.afterRenderEvents;if(afterRenderEvents)for(property in afterRenderEvents)if((el=me[property])&&el.on)for(afterRenderEvent=afterRenderEvents[property],index=0,len=afterRenderEvent.length;index<len;++index)me.mon(el,afterRenderEvent[index]);me.addFocusListener()},addFocusListener:function(){var needsTabIndex,me=this,focusEl=me.getFocusEl();if(focusEl){if(focusEl.isComponent)return focusEl.addFocusListener();needsTabIndex=focusEl.needsTabIndex(),me.focusListenerAdded||needsTabIndex&&!Ext.FocusManager.enabled||(needsTabIndex&&(focusEl.dom.tabIndex=-1),focusEl.on({focus:me.onFocus,blur:me.onBlur,scope:me}),me.focusListenerAdded=!0)}},getFocusEl:Ext.emptyFn,isFocusable:function(){var focusEl,me=this;if(!1!==me.focusable&&(focusEl=me.getFocusEl())&&me.rendered&&!me.destroying&&!me.isDestroyed&&!me.disabled&&me.isVisible(!0))return focusEl.isFocusable(!0)},beforeFocus:Ext.emptyFn,onFocus:function(e){var me=this,focusCls=me.focusCls,focusEl=me.getFocusEl();me.disabled||(me.beforeFocus(e),focusCls&&focusEl&&focusEl.addCls(me.addClsWithUI(focusCls,!0)),me.hasFocus||(me.hasFocus=!0,me.fireEvent("focus",me,e)))},beforeBlur:Ext.emptyFn,onBlur:function(e){var me=this,focusCls=me.focusCls,focusEl=me.getFocusEl();me.destroying||(me.beforeBlur(e),focusCls&&focusEl&&focusEl.removeCls(me.removeClsWithUI(focusCls,!0)),me.validateOnBlur&&me.validate(),me.hasFocus=!1,me.fireEvent("blur",me,e),me.postBlur(e))},postBlur:Ext.emptyFn,is:function(selector){return Ext.ComponentQuery.is(this,selector)},up:function(selector,limit){var result=this.getRefOwner(),limitSelector="string"==typeof limit,limitCount="number"==typeof limit,limitComponent=limit&&limit.isComponent,steps=0;if(selector)for(;result;result=result.getRefOwner()){if(steps++,selector.isComponent){if(result===selector)return result}else if(Ext.ComponentQuery.is(result,selector))return result;if(limitSelector&&result.is(limit))return;if(limitCount&&steps===limit)return;if(limitComponent&&result===limit)return}return result},nextSibling:function(selector){var it,last,idx,c,o=this.ownerCt;if(o&&(it=o.items,idx=it.indexOf(this)+1))if(selector){for(last=it.getCount();idx<last;idx++)if((c=it.getAt(idx)).is(selector))return c}else if(idx<it.getCount())return it.getAt(idx);return null},previousSibling:function(selector){var it,idx,c,o=this.ownerCt;if(o&&(it=o.items,-1!=(idx=it.indexOf(this))))if(selector){for(--idx;idx>=0;idx--)if((c=it.getAt(idx)).is(selector))return c}else if(idx)return it.getAt(--idx);return null},previousNode:function(selector,includeSelf){var result,it,i,sib,node=this,ownerCt=node.ownerCt;if(includeSelf&&node.is(selector))return node;if(ownerCt){for(it=ownerCt.items.items,i=Ext.Array.indexOf(it,node)-1;i>-1;i--){if(sib=it[i],sib.query&&(result=sib.query(selector),result=result[result.length-1]))return result;if(sib.is(selector))return sib}return ownerCt.previousNode(selector,!0)}return null},nextNode:function(selector,includeSelf){var result,it,len,i,sib,node=this,ownerCt=node.ownerCt;if(includeSelf&&node.is(selector))return node;if(ownerCt){for(it=ownerCt.items.items,i=Ext.Array.indexOf(it,node)+1,len=it.length;i<len;i++){if(sib=it[i],sib.is(selector))return sib;if(sib.down&&(result=sib.down(selector)))return result}return ownerCt.nextNode(selector)}return null},getId:function(){return this.id||(this.id="ext-comp-"+this.getAutoId())},getItemId:function(){return this.itemId||this.id},getEl:function(){return this.el},getTargetEl:function(){return this.frameBody||this.el},getOverflowEl:function(){return this.getTargetEl()},getOverflowStyle:function(){var ox,oy,overflowStyle,me=this,result=null,auto=me.autoScroll;return"boolean"==typeof auto?(result={overflow:overflowStyle=auto?"auto":""},me.scrollFlags={overflowX:overflowStyle,overflowY:overflowStyle,x:auto,y:auto,both:auto}):(ox=me.overflowX,oy=me.overflowY,void 0!==ox||void 0!==oy?(ox&&!0===ox&&(ox="auto"),oy&&!0===oy&&(oy="auto"),result={overflowX:ox=ox||"",overflowY:oy=oy||""},me.scrollFlags={overflowX:ox,overflowY:oy,x:ox="auto"===ox||"scroll"===ox,y:oy="auto"===oy||"scroll"===oy,both:ox&&oy}):me.scrollFlags={overflowX:"",overflowY:"",x:!1,y:!1,both:!1}),result&&Ext.isIE7m&&(result.position="relative"),result},isXType:function(xtype,shallow){return shallow?this.xtype===xtype:this.xtypesMap[xtype]},getXTypes:function(){var xtypes,parentPrototype,parentXtypes,self=this.self;if(!self.xtypes){for(xtypes=[],parentPrototype=this;parentPrototype;)parentXtypes=parentPrototype.xtypes,void 0!==parentXtypes&&xtypes.unshift.apply(xtypes,parentXtypes),parentPrototype=parentPrototype.superclass;self.xtypeChain=xtypes,self.xtypes=xtypes.join("/")}return self.xtypes},update:function(htmlOrData,loadScripts,cb){var el,me=this,isData=me.tpl&&!Ext.isString(htmlOrData);isData?me.data=htmlOrData:me.html=Ext.isObject(htmlOrData)?Ext.DomHelper.markup(htmlOrData):htmlOrData,me.rendered&&(el=me.isContainer?me.layout.getRenderTarget():me.getTargetEl(),isData?me.tpl[me.tplWriteMode](el,htmlOrData||{}):el.update(me.html,loadScripts,cb),me.updateLayout())},setVisible:function(visible){return this[visible?"show":"hide"]()},isVisible:function(deep){var hidden,me=this;return me.hidden||!me.rendered||me.isDestroyed?hidden=!0:deep&&(hidden=me.isHierarchicallyHidden()),!hidden},isHierarchicallyHidden:function(){for(var parent,parentHierarchyState,child=this,hidden=!1;parent=child.ownerCt||child.floatParent;child=parent){if(parentHierarchyState=parent.getHierarchyState(),parentHierarchyState.hidden){hidden=!0;break}if(!child.getHierarchyState().collapseImmune){hidden=!!parentHierarchyState.collapsed;break}if(parent.collapsed&&!child.collapseImmune){hidden=!0;break}}return hidden},onBoxReady:function(width,height){var me=this;me.disableOnBoxReady?me.onDisable():me.enableOnBoxReady&&me.onEnable(),me.resizable&&me.initResizable(me.resizable),me.draggable&&me.initDraggable(),me.hasListeners.boxready&&me.fireEvent("boxready",me,width,height)},enable:function(silent){var me=this;return delete me.disableOnBoxReady,me.removeCls(me.disabledCls),me.rendered?me.onEnable():me.enableOnBoxReady=!0,me.disabled=!1,delete me.resetDisable,!0!==silent&&me.fireEvent("enable",me),me},disable:function(silent){var me=this;return delete me.enableOnBoxReady,me.addCls(me.disabledCls),me.rendered?me.onDisable():me.disableOnBoxReady=!0,me.disabled=!0,!0!==silent&&(delete me.resetDisable,me.fireEvent("disable",me)),me},onEnable:function(){this.maskOnDisable&&(this.el.dom.disabled=!1,this.unmask())},onDisable:function(){var me=this,focusCls=me.focusCls,focusEl=me.getFocusEl();focusCls&&focusEl&&focusEl.removeCls(me.removeClsWithUI(focusCls,!0)),me.maskOnDisable&&(me.el.dom.disabled=!0,me.mask())},mask:function(msg,msgCls,elHeight){var box=this.lastBox,target=this.getMaskTarget();box&&(elHeight=box.height),target.mask(msg,msgCls,elHeight)},unmask:function(){this.getMaskTarget().unmask()},getMaskTarget:function(){return this.el},isDisabled:function(){return this.disabled},setDisabled:function(disabled){return this[disabled?"disable":"enable"]()},isHidden:function(){return this.hidden},addCls:function(cls){var me=this,el=me.rendered?me.el:me.protoEl;return el.addCls.apply(el,arguments),me},addClass:function(){return this.addCls.apply(this,arguments)},hasCls:function(cls){var me=this,el=me.rendered?me.el:me.protoEl;return el.hasCls.apply(el,arguments)},removeCls:function(cls){var me=this,el=me.rendered?me.el:me.protoEl;return el.removeCls.apply(el,arguments),me},removeClass:function(){return Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.Component: removeClass has been deprecated. Please use removeCls."),this.removeCls.apply(this,arguments)},addOverCls:function(){var me=this;me.disabled||me.el.addCls(me.overCls)},removeOverCls:function(){this.el.removeCls(this.overCls)},addListener:function(element,listeners,scope,options){var fn,option,me=this;if(Ext.isString(element)&&(Ext.isObject(listeners)||options&&options.element)){if(options.element){fn=listeners,listeners={},listeners[element]=fn,element=options.element,scope&&(listeners.scope=scope);for(option in options)options.hasOwnProperty(option)&&me.eventOptionsRe.test(option)&&(listeners[option]=options[option])}return void(me[element]&&me[element].on?me.mon(me[element],listeners):(me.afterRenderEvents=me.afterRenderEvents||{},me.afterRenderEvents[element]||(me.afterRenderEvents[element]=[]),me.afterRenderEvents[element].push(listeners)))}return me.mixins.observable.addListener.apply(me,arguments)},removeManagedListenerItem:function(isClear,managedListener,item,ename,fn,scope){var me=this,element=managedListener.options?managedListener.options.element:null;if(!element)return me.mixins.observable.removeManagedListenerItem.apply(me,arguments);(element=me[element])&&element.un&&(!isClear&&(managedListener.item!==item||managedListener.ename!==ename||fn&&managedListener.fn!==fn||scope&&managedListener.scope!==scope)||(element.un(managedListener.ename,managedListener.fn,managedListener.scope),isClear||Ext.Array.remove(me.managedListeners,managedListener)))},getBubbleTarget:function(){return this.ownerCt},isFloating:function(){return this.floating},isDraggable:function(){return!!this.draggable},isDroppable:function(){return!!this.droppable},onAdded:function(container,pos){var me=this;me.ownerCt=container,me.hierarchyState&&(me.hierarchyState.invalid=!0,delete me.hierarchyState),me.hasListeners.added&&me.fireEvent("added",me,container,pos)},onRemoved:function(destroying){var me=this;me.hasListeners.removed&&me.fireEvent("removed",me,me.ownerCt),delete me.ownerCt,delete me.ownerLayout},beforeDestroy:Ext.emptyFn,onResize:function(width,height,oldWidth,oldHeight){var me=this;me.floating&&me.constrain&&me.doConstrain(),me.hasListeners.resize&&me.fireEvent("resize",me,width,height,oldWidth,oldHeight)},setSize:function(width,height){var me=this;return width&&"object"==typeof width&&(height=width.height,width=width.width),"number"==typeof width?me.width=Ext.Number.constrain(width,me.minWidth,me.maxWidth):null===width&&delete me.width,"number"==typeof height?me.height=Ext.Number.constrain(height,me.minHeight,me.maxHeight):null===height&&delete me.height,me.rendered&&me.isVisible()&&me.updateLayout({isRoot:!1}),me},isLayoutRoot:function(){var me=this,ownerLayout=me.ownerLayout;return!(ownerLayout&&!me._isLayoutRoot&&!me.floating)||ownerLayout.isItemLayoutRoot(me)},isLayoutSuspended:function(){for(var ownerLayout,comp=this;comp;){if(comp.layoutSuspendCount||comp.suspendLayout)return!0;if(!(ownerLayout=comp.ownerLayout))break;comp=ownerLayout.owner}return!1},updateLayout:function(options){var defer,me=this,lastBox=me.lastBox,isRoot=options&&options.isRoot;lastBox&&(lastBox.invalid=!0),!me.rendered||me.layoutSuspendCount||me.suspendLayout||(me.hidden?Ext.AbstractComponent.cancelLayout(me):"boolean"!=typeof isRoot&&(isRoot=me.isLayoutRoot()),!isRoot&&me.ownerLayout&&me.ownerLayout.onContentChange(me)||me.isLayoutSuspended()||(defer=options&&options.hasOwnProperty("defer")?options.defer:me.deferLayouts,Ext.AbstractComponent.updateLayout(me,defer)))},getSizeModel:function(ownerCtSizeModel){var typeofWidth,typeofHeight,hasPixelWidth,hasPixelHeight,heightModel,ownerLayout,policy,shrinkWrap,topLevel,widthModel,me=this,models=Ext.layout.SizeModel,ownerContext=me.componentLayout.ownerContext,width=me.width,height=me.height;return ownerContext&&(widthModel=ownerContext.widthModel,heightModel=ownerContext.heightModel),widthModel&&heightModel||(hasPixelWidth="number"==(typeofWidth=typeof width),hasPixelHeight="number"==(typeofHeight=typeof height),topLevel=me.floating||!(ownerLayout=me.ownerLayout),topLevel?(policy=Ext.layout.Layout.prototype.autoSizePolicy,shrinkWrap=me.floating?3:me.shrinkWrap,hasPixelWidth&&(widthModel=models.configured),hasPixelHeight&&(heightModel=models.configured)):(policy=ownerLayout.getItemSizePolicy(me,ownerCtSizeModel),shrinkWrap=ownerLayout.isItemShrinkWrap(me)),ownerContext&&(ownerContext.ownerSizePolicy=policy),shrinkWrap=!0===shrinkWrap?3:shrinkWrap||0,topLevel&&shrinkWrap&&(width&&"string"==typeofWidth&&(shrinkWrap&=2),height&&"string"==typeofHeight&&(shrinkWrap&=1)),3!==shrinkWrap&&(ownerCtSizeModel||(ownerCtSizeModel=me.ownerCt&&me.ownerCt.getSizeModel()),ownerCtSizeModel&&(shrinkWrap|=(ownerCtSizeModel.width.shrinkWrap?1:0)|(ownerCtSizeModel.height.shrinkWrap?2:0))),widthModel||(widthModel=policy.setsWidth?policy.readsWidth?hasPixelWidth?models.calculatedFromConfigured:1&shrinkWrap?models.calculatedFromShrinkWrap:models.calculatedFromNatural:models.calculated:hasPixelWidth?models.configured:1&shrinkWrap?models.shrinkWrap:models.natural),heightModel||(heightModel=policy.setsHeight?policy.readsHeight?hasPixelHeight?models.calculatedFromConfigured:2&shrinkWrap?models.calculatedFromShrinkWrap:models.calculatedFromNatural:models.calculated:hasPixelHeight?models.configured:2&shrinkWrap?models.shrinkWrap:models.natural)),widthModel.pairsByHeightOrdinal[heightModel.ordinal]},isDescendant:function(ancestor){if(ancestor.isContainer)for(var c=this.ownerCt;c;c=c.ownerCt)if(c===ancestor)return!0;return!1},doComponentLayout:function(){return this.updateLayout(),this},forceComponentLayout:function(){this.updateLayout()},setComponentLayout:function(layout){var currentLayout=this.componentLayout;currentLayout&&currentLayout.isLayout&&currentLayout!=layout&&currentLayout.setOwner(null),this.componentLayout=layout,layout.setOwner(this)},getComponentLayout:function(){var me=this;return me.componentLayout&&me.componentLayout.isLayout||me.setComponentLayout(Ext.layout.Layout.create(me.componentLayout,"autocomponent")),me.componentLayout},afterComponentLayout:function(width,height,oldWidth,oldHeight){var me=this;1==++me.componentLayoutCounter&&me.afterFirstLayout(width,height),width===oldWidth&&height===oldHeight||me.onResize(width,height,oldWidth,oldHeight)},beforeComponentLayout:function(width,height){return!0},setPosition:function(x,y,animate){var me=this,pos=me.beforeSetPosition.apply(me,arguments);return pos&&me.rendered&&(x=pos.x,y=pos.y,animate?x===me.getLocalX()&&y===me.getLocalY()||(me.stopAnimation(),me.animate(Ext.apply({duration:1e3,listeners:{afteranimate:Ext.Function.bind(me.afterSetPosition,me,[x,y])},to:{left:x,top:y}},animate))):(me.setLocalXY(x,y),me.afterSetPosition(x,y))),me},beforeSetPosition:function(x,y,animate){var pos,x0;return x&&(Ext.isNumber(x0=x[0])?(animate=y,y=x[1],x=x0):void 0!==(x0=x.x)&&(animate=y,y=x.y,x=x0)),(this.constrain||this.constrainHeader)&&(pos=this.calculateConstrainedPosition(null,[x,y],!0))&&(x=pos[0],y=pos[1]),pos={x:this.x=x,y:this.y=y,anim:animate,hasX:void 0!==x,hasY:void 0!==y},pos.hasX||pos.hasY?pos:null},afterSetPosition:function(x,y){var me=this;me.onPosition(x,y),me.hasListeners.move&&me.fireEvent("move",me,x,y)},onPosition:Ext.emptyFn,setWidth:function(width){return this.setSize(width)},setHeight:function(height){return this.setSize(void 0,height)},getSize:function(contentSize){return this.el.getSize(contentSize)},getWidth:function(){return this.el.getWidth()},getHeight:function(){return this.el.getHeight()},getLoader:function(){var me=this,autoLoad=me.autoLoad?Ext.isObject(me.autoLoad)?me.autoLoad:{url:me.autoLoad}:null,loader=me.loader||autoLoad;return loader?(loader.isLoader?loader.setTarget(me):me.loader=new Ext.ComponentLoader(Ext.apply({target:me,autoLoad:autoLoad},loader)),me.loader):null},setDocked:function(dock,layoutParent){var me=this;return me.dock=dock,layoutParent&&me.ownerCt&&me.rendered&&me.ownerCt.updateLayout(),me},setBorder:function(border,targetEl){var me=this,initial=!!targetEl;(me.rendered||initial)&&(initial||(targetEl=me.el),border=border?!0===border?"1px":this.unitizeBox(border):0,targetEl.setStyle("border-width",border),initial||me.updateLayout()),me.border=border},onDestroy:function(){var me=this;me.monitorResize&&Ext.EventManager.resizeEvent&&Ext.EventManager.resizeEvent.removeListener(me.setSize,me),Ext.destroy(me.componentLayout,me.loadMask,me.floatingDescendants)},destroy:function(){var selector,el,me=this,selectors=me.renderSelectors;if(!(me.isDestroyed||me.hasListeners.beforedestroy&&!1===me.fireEvent("beforedestroy",me))){if(me.destroying=!0,me.beforeDestroy(),me.floating?(delete me.floatParent,me.zIndexManager&&me.zIndexManager.unregister(me)):me.ownerCt&&me.ownerCt.remove&&me.ownerCt.remove(me,!1),me.stopAnimation(),me.onDestroy(),Ext.destroy(me.plugins),me.hasListeners.destroy&&me.fireEvent("destroy",me),Ext.ComponentManager.unregister(me),me.mixins.state.destroy.call(me),me.clearListeners(),me.rendered){if(me.preserveElOnDestroy||me.el.remove(),me.mixins.elementCt.destroy.call(me),selectors)for(selector in selectors)selectors.hasOwnProperty(selector)&&(el=me[selector])&&(delete me[selector],el.remove());delete me.el,delete me.frameBody,delete me.rendered}me.destroying=!1,me.isDestroyed=!0}},isDescendantOf:function(container){return!!this.findParentBy(function(p){return p===container})},getHierarchyState:function(inner){var parent,layout,hierarchyStateInner,getInner,me=this,hierarchyState=inner&&me.hierarchyStateInner||me.hierarchyState,ownerCt=me.ownerCt;return hierarchyState&&!hierarchyState.invalid||(parent=me.getRefOwner(),ownerCt&&(getInner=me.ownerLayout===ownerCt.layout),me.hierarchyState=hierarchyState=Ext.Object.chain(parent?parent.getHierarchyState(getInner):Ext.rootHierarchyState),me.initHierarchyState(hierarchyState),(layout=me.componentLayout).initHierarchyState&&layout.initHierarchyState(hierarchyState),me.isContainer&&(me.hierarchyStateInner=hierarchyStateInner=Ext.Object.chain(hierarchyState),layout=me.layout,layout&&layout.initHierarchyState&&layout.initHierarchyState(hierarchyStateInner,hierarchyState),inner&&(hierarchyState=hierarchyStateInner))),hierarchyState},initHierarchyState:function(hierarchyState){var me=this;me.collapsed&&(hierarchyState.collapsed=!0),me.hidden&&(hierarchyState.hidden=!0),me.collapseImmune&&(hierarchyState.collapseImmune=!0)},getAnchorToXY:function(el,anchor,local,mySize){return el.getAnchorXY(anchor,local,mySize)},getBorderPadding:function(){return this.el.getBorderPadding()},getLocalX:function(){return this.el.getLocalX()},getLocalXY:function(){return this.el.getLocalXY()},getLocalY:function(){return this.el.getLocalY()},getX:function(){return this.el.getX()},getXY:function(){return this.el.getXY()
},getY:function(){return this.el.getY()},setLocalX:function(x){this.el.setLocalX(x)},setLocalXY:function(x,y){this.el.setLocalXY(x,y)},setLocalY:function(y){this.el.setLocalY(y)},setX:function(x,animate){this.el.setX(x,animate)},setXY:function(xy,animate){this.el.setXY(xy,animate)},setY:function(y,animate){this.el.setY(y,animate)}},function(){var AbstractComponent=this;AbstractComponent.createAlias({on:"addListener",prev:"previousSibling",next:"nextSibling"}),Ext.resumeLayouts=function(flush){AbstractComponent.resumeLayouts(flush)},Ext.suspendLayouts=function(){AbstractComponent.suspendLayouts()},Ext.batchLayouts=function(fn,scope){AbstractComponent.suspendLayouts(),fn.call(scope),AbstractComponent.resumeLayouts(!0)}});Ext.define("Ext.AbstractPlugin",{disabled:!1,isPlugin:!0,constructor:function(config){this.pluginConfig=config,Ext.apply(this,config)},clonePlugin:function(overrideCfg){return new this.self(Ext.apply({},overrideCfg,this.pluginConfig))},setCmp:function(cmp){this.cmp=cmp},getCmp:function(){return this.cmp},init:Ext.emptyFn,destroy:Ext.emptyFn,enable:function(){this.disabled=!1},disable:function(){this.disabled=!0},onClassExtended:function(cls,data,hooks){var alias=data.alias;alias&&!data.ptype&&(Ext.isArray(alias)&&(alias=alias[0]),cls.prototype.ptype=alias.split("plugin.")[1])}});Ext.define("Ext.data.flash.BinaryXhr",{statics:{flashPluginActivated:function(){Ext.data.flash.BinaryXhr.flashPluginActive=!0,Ext.data.flash.BinaryXhr.flashPlugin=document.getElementById("ext-flash-polyfill"),Ext.globalEvents.fireEvent("flashready")},flashPluginActive:!1,flashPluginInjected:!1,connectionIndex:1,liveConnections:{},flashPlugin:null,onFlashStateChange:function(javascriptId,state,data){var connection;connection=this.liveConnections[Number(javascriptId)],connection?connection.onFlashStateChange(state,data):Ext.warn.log("onFlashStateChange for unknown connection ID: "+javascriptId)},registerConnection:function(conn){var i=this.connectionIndex;return this.conectionIndex=this.connectionIndex+1,this.liveConnections[i]=conn,i},injectFlashPlugin:function(){var flashLoaderPath,flashObjectPath,me=this;me.flashPolyfillEl=Ext.getBody().appendChild({id:"ext-flash-polyfill",cn:[{tag:"p",html:"To view this page ensure that Adobe Flash Player version 11.1.0 or greater is installed."},{tag:"a",href:"http://www.adobe.com/go/getflashplayer",cn:[{tag:"img",src:window.location.protocol+"//www.adobe.com/images/shared/download_buttons/get_flash_player.gif",alt:"Get Adobe Flash player"}]}]}),flashLoaderPath=[Ext.Loader.getPath("Ext.data.Connection"),"../../../plugins/flash/swfobject.js"].join("/"),flashObjectPath="/plugins/flash/FlashPlugin.swf",flashObjectPath=[Ext.Loader.getPath("Ext.data.Connection"),"../../plugins/flash/FlashPlugin.swf"].join("/"),Ext.flashPluginPath&&(flashObjectPath=Ext.flashPluginPath),Ext.Loader.loadScript({url:flashLoaderPath,onLoad:function(){var flashvars={},params={};params.quality="high",params.bgcolor="#ffffff",params.allowscriptaccess="sameDomain",params.allowfullscreen="true";var attributes={};attributes.id="ext-flash-polyfill",attributes.name="polyfill",attributes.align="middle",swfobject.embedSWF(flashObjectPath,"ext-flash-polyfill","0","0","11.4.0","playerProductInstall.swf",flashvars,params,attributes)},onError:function(){Ext.Error.raise("Could not load flash-loader file swfobject.js from "+flashLoader)},scope:me}),Ext.globalEvents.addEvents("flashready"),Ext.data.flash.BinaryXhr.flashPluginInjected=!0}},readyState:0,status:0,statusText:"",responseBytes:null,javascriptId:null,constructor:function(config){Ext.data.flash.BinaryXhr.flashPluginInjected||Ext.data.flash.BinaryXhr.injectFlashPlugin();var me=this;Ext.apply(me,config),me.requestHeaders={}},abort:function(){var me=this;return 4==me.readyState?void Ext.warn.log("Aborting a connection that's completed its transfer: "+this.url):(me.aborted=!0,Ext.data.flash.BinaryXhr.flashPluginActive?(Ext.data.flash.BinaryXhr.flashPlugin.abortRequest(me.javascriptId),void delete Ext.data.flash.BinaryXhr.liveConnections[me.javascriptId]):void Ext.globalEvents.removeListener("flashready",me.onFlashReady,me))},getAllResponseHeaders:function(){var headers=[];return Ext.Object.each(this.responseHeaders,function(name,value){headers.push(name+": "+value)}),headers.join("\r\n")},getResponseHeader:function(header){var headers=this.responseHeaders;return headers&&headers[header]||null},open:function(method,url,async,user,password){var me=this;me.method=method,me.url=url,me.async=!1!==async,me.user=user,me.password=password,me.async||Ext.Error.raise("Binary posts are only supported in async mode: "+url),"POST"!=me.method&&Ext.log.warn("Binary data can only be sent as a POST request: "+url)},overrideMimeType:function(mimeType){this.mimeType=mimeType},send:function(body){var me=this;me.body=body,Ext.data.flash.BinaryXhr.flashPluginActive?this.onFlashReady():Ext.globalEvents.addListener("flashready",me.onFlashReady,me)},onFlashReady:function(){var req,me=this;me.javascriptId=Ext.data.flash.BinaryXhr.registerConnection(me),req={method:me.method,url:me.url,user:me.user,password:me.password,mimeType:me.mimeType,requestHeaders:me.requestHeaders,body:me.body,javascriptId:me.javascriptId},Ext.data.flash.BinaryXhr.flashPlugin.postBinary(req)},setReadyState:function(state){var me=this;me.readyState!=state&&(me.readyState=state,me.onreadystatechange())},setRequestHeader:function(header,value){this.requestHeaders[header]=value},onreadystatechange:Ext.emptyFn,parseData:function(data){var me=this;this.status=data.status||0,me.responseHeaders={},me.mimeType&&(me.responseHeaders["content-type"]=me.mimeType),"complete"==data.reason?(this.responseBytes=data.data,me.responseHeaders["content-length"]=data.data.length):"error"==data.reason||"securityError"==data.reason?(this.statusText=data.text,me.responseHeaders["content-length"]=0):Ext.Error.raise("Unkown reason code in data: "+data.reason)},onFlashStateChange:function(state,data){var me=this;4==state&&(me.parseData(data),delete Ext.data.flash.BinaryXhr.liveConnections[me.javascriptId]),me.setReadyState(state)}});Ext.define("Ext.data.Connection",{mixins:{observable:"Ext.util.Observable"},requires:["Ext.data.flash.BinaryXhr"],statics:{requestId:0},url:null,async:!0,method:null,username:"",password:"",disableCaching:!0,withCredentials:!1,binary:!1,cors:!1,isXdr:!1,defaultXdrContentType:"text/plain",disableCachingParam:"_dc",timeout:3e4,useDefaultHeader:!0,defaultPostHeader:"application/x-www-form-urlencoded; charset=UTF-8",useDefaultXhrHeader:!0,defaultXhrHeader:"XMLHttpRequest",constructor:function(config){config=config||{},Ext.apply(this,config),this.requests={},this.mixins.observable.constructor.call(this)},request:function(options){options=options||{};var async,requestOptions,request,headers,xhr,me=this,scope=options.scope||window,username=options.username||me.username,password=options.password||me.password||"";return!1!==me.fireEvent("beforerequest",me,options)?(requestOptions=me.setOptions(options,scope),me.isFormUpload(options)?(me.upload(options.form,requestOptions.url,requestOptions.data,options),null):((options.autoAbort||me.autoAbort)&&me.abort(),async=!1!==options.async&&(options.async||me.async),xhr=me.openRequest(options,requestOptions,async,username,password),me.isXdr||(headers=me.setupHeaders(xhr,options,requestOptions.data,requestOptions.params)),request={id:++Ext.data.Connection.requestId,xhr:xhr,headers:headers,options:options,async:async,binary:options.binary||me.binary,timeout:setTimeout(function(){request.timedout=!0,me.abort(request)},options.timeout||me.timeout)},me.requests[request.id]=request,me.latestId=request.id,async&&(me.isXdr||(xhr.onreadystatechange=Ext.Function.bind(me.onStateChange,me,[request]))),me.isXdr&&me.processXdrRequest(request,xhr),xhr.send(requestOptions.data),async?request:me.onComplete(request))):(Ext.callback(options.callback,options.scope,[options,void 0,void 0]),null)},processXdrRequest:function(request,xhr){var me=this;delete request.headers,request.contentType=request.options.contentType||me.defaultXdrContentType,xhr.onload=Ext.Function.bind(me.onStateChange,me,[request,!0]),xhr.onerror=xhr.ontimeout=Ext.Function.bind(me.onStateChange,me,[request,!1])},processXdrResponse:function(response,xhr){response.getAllResponseHeaders=function(){return[]},response.getResponseHeader=function(){return""},response.contentType=xhr.contentType||this.defaultXdrContentType},upload:function(form,url,params,options){form=Ext.getDom(form),options=options||{};var hiddenItem,obj,value,name,vLen,v,hLen,h,id=Ext.id(),frame=document.createElement("iframe"),hiddens=[],buf={target:form.target,method:form.method,encoding:form.encoding,enctype:form.enctype,action:form.action},addField=function(name,value){hiddenItem=document.createElement("input"),Ext.fly(hiddenItem).set({type:"hidden",value:value,name:name}),form.appendChild(hiddenItem),hiddens.push(hiddenItem)};if(Ext.fly(frame).set({id:id,name:id,cls:Ext.baseCSSPrefix+"hide-display",src:Ext.SSL_SECURE_URL}),document.body.appendChild(frame),document.frames&&(document.frames[id].name=id),Ext.fly(form).set({target:id,method:"POST",enctype:"multipart/form-data",encoding:"multipart/form-data",action:url||buf.action}),params){obj=Ext.Object.fromQueryString(params)||{};for(name in obj)if(obj.hasOwnProperty(name))if(value=obj[name],Ext.isArray(value))for(vLen=value.length,v=0;v<vLen;v++)addField(name,value[v]);else addField(name,value)}for(Ext.fly(frame).on("load",Ext.Function.bind(this.onUploadComplete,this,[frame,options]),null,{single:!Ext.isOpera}),form.submit(),Ext.fly(form).set(buf),hLen=hiddens.length,h=0;h<hLen;h++)Ext.removeNode(hiddens[h])},onUploadComplete:function(frame,options){var callback,success,doc,contentNode,me=this,response={responseText:"",responseXML:null};try{if(doc=frame.contentWindow.document||frame.contentDocument||window.frames[frame.id].document){if(Ext.isOpera&&"about:blank"==doc.location)return;doc.body&&((contentNode=doc.body.firstChild)&&/pre/i.test(contentNode.tagName)?response.responseText=contentNode.textContent:(contentNode=doc.getElementsByTagName("textarea")[0])?response.responseText=contentNode.value:response.responseText=doc.body.textContent||doc.body.innerText),response.responseXML=doc.XMLDocument||doc,callback=options.success,success=!0}}catch(e){response.responseText='{success:false,message:"'+Ext.String.trim(e.message||e.description)+'"}',callback=options.failure,success=!1}me.fireEvent("requestcomplete",me,response,options),Ext.callback(callback,options.scope,[response,options]),Ext.callback(options.callback,options.scope,[options,success,response]),setTimeout(function(){Ext.removeNode(frame)},100)},isFormUpload:function(options){var form=this.getForm(options);return!!form&&(options.isUpload||/multipart\/form-data/i.test(form.getAttribute("enctype")))},getForm:function(options){return Ext.getDom(options.form)||null},setOptions:function(options,scope){var method,disableCache,data,me=this,params=options.params||{},extraParams=me.extraParams,urlParams=options.urlParams,url=options.url||me.url,jsonData=options.jsonData;return Ext.isFunction(params)&&(params=params.call(scope,options)),Ext.isFunction(url)&&(url=url.call(scope,options)),url=this.setupUrl(options,url),url||Ext.Error.raise({options:options,msg:"No URL specified"}),data=options.rawData||options.binaryData||options.xmlData||jsonData||null,jsonData&&!Ext.isPrimitive(jsonData)&&(data=Ext.encode(data)),options.binaryData&&(Ext.isArray(options.binaryData)||Ext.log.warn("Binary submission data must be an array of byte values! Instead got "+typeof options.binaryData),me.nativeBinaryPostSupport()&&(data=new Uint8Array(options.binaryData),(Ext.isChrome&&Ext.chromeVersion<22||Ext.isSafari||Ext.isGecko)&&(data=data.buffer))),Ext.isObject(params)&&(params=Ext.Object.toQueryString(params)),Ext.isObject(extraParams)&&(extraParams=Ext.Object.toQueryString(extraParams)),params+=extraParams?(params?"&":"")+extraParams:"",urlParams=Ext.isObject(urlParams)?Ext.Object.toQueryString(urlParams):urlParams,params=this.setupParams(options,params),method=(options.method||me.method||(params||data?"POST":"GET")).toUpperCase(),this.setupMethod(options,method),disableCache=!1!==options.disableCaching&&(options.disableCaching||me.disableCaching),"GET"===method&&disableCache&&(url=Ext.urlAppend(url,(options.disableCachingParam||me.disableCachingParam)+"="+(new Date).getTime())),("GET"==method||data)&&params&&(url=Ext.urlAppend(url,params),params=null),urlParams&&(url=Ext.urlAppend(url,urlParams)),{url:url,method:method,data:data||params||null}},setupUrl:function(options,url){var form=this.getForm(options);return form&&(url=url||form.action),url},setupParams:function(options,params){var serializedForm,form=this.getForm(options);return form&&!this.isFormUpload(options)&&(serializedForm=Ext.Element.serializeForm(form),params=params?params+"&"+serializedForm:serializedForm),params},setupMethod:function(options,method){return this.isFormUpload(options)?"POST":method},setupHeaders:function(xhr,options,data,params){var key,header,me=this,headers=Ext.apply({},options.headers||{},me.defaultHeaders||{}),contentType=me.defaultPostHeader,jsonData=options.jsonData,xmlData=options.xmlData,type="Content-Type";headers.hasOwnProperty(type)||!data&&!params||(data&&(options.rawData?contentType="text/plain":xmlData&&Ext.isDefined(xmlData)?contentType="text/xml":jsonData&&Ext.isDefined(jsonData)&&(contentType="application/json")),headers[type]=contentType),me.useDefaultXhrHeader&&!headers["X-Requested-With"]&&(headers["X-Requested-With"]=me.defaultXhrHeader),void 0!==headers[type]&&null!==headers[type]||delete headers[type];try{for(key in headers)headers.hasOwnProperty(key)&&(header=headers[key],xhr.setRequestHeader(key,header))}catch(e){me.fireEvent("exception",key,header)}return headers},newRequest:function(options){var xhr,me=this;return options.binaryData?xhr=me.nativeBinaryPostSupport()?this.getXhrInstance():new Ext.data.flash.BinaryXhr:(options.cors||me.cors)&&Ext.isIE&&Ext.ieVersion<=9?(xhr=me.getXdrInstance(),me.isXdr=!0):xhr=me.getXhrInstance(),xhr},openRequest:function(options,requestOptions,async,username,password){var me=this,xhr=me.newRequest(options);return username?xhr.open(requestOptions.method,requestOptions.url,async,username,password):me.isXdr?xhr.open(requestOptions.method,requestOptions.url):xhr.open(requestOptions.method,requestOptions.url,async),(options.binary||me.binary)&&(window.Uint8Array?xhr.responseType="arraybuffer":xhr.overrideMimeType?xhr.overrideMimeType("text/plain; charset=x-user-defined"):Ext.isIE||Ext.log.warn("Your does not support loading binary data using Ajax.")),(options.withCredentials||me.withCredentials)&&(xhr.withCredentials=!0),xhr},getXdrInstance:function(){var xdr;return Ext.ieVersion>=8?xdr=new XDomainRequest:Ext.Error.raise({msg:"Your browser does not support CORS"}),xdr},getXhrInstance:function(){for(var xhr,options=[function(){return new XMLHttpRequest},function(){return new ActiveXObject("MSXML2.XMLHTTP.3.0")},function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],i=0,len=options.length;i<len;++i)try{xhr=options[i],xhr();break}catch(e){}return xhr}(),isLoading:function(request){if(request||(request=this.getLatest()),!request||!request.xhr)return!1;var state=request.xhr.readyState;return request.xhr instanceof Ext.data.flash.BinaryXhr&&4!=state||!(0===state||4==state)},abort:function(request){var xhr,me=this;if(request||(request=me.getLatest()),request&&me.isLoading(request)){xhr=request.xhr;try{xhr.onreadystatechange=null}catch(e){xhr.onreadystatechange=Ext.emptyFn}xhr.abort(),me.clearTimeout(request),request.timedout||(request.aborted=!0),me.onComplete(request),me.cleanup(request)}},abortAll:function(){var id,requests=this.requests;for(id in requests)requests.hasOwnProperty(id)&&this.abort(requests[id])},getLatest:function(){var request,id=this.latestId;return id&&(request=this.requests[id]),request||null},onStateChange:function(request,xdrResult){var me=this;(request.xhr&&4==request.xhr.readyState||me.isXdr)&&(me.clearTimeout(request),me.onComplete(request,xdrResult),me.cleanup(request),Ext.EventManager.idleEvent.fire())},clearTimeout:function(request){clearTimeout(request.timeout),delete request.timeout},cleanup:function(request){request.xhr=null,delete request.xhr},onComplete:function(request,xdrResult){var xhr,result,success,response,me=this,options=request.options;try{xhr=request.xhr,result=me.parseStatus(xhr.status),result.success&&(result.success=4===xhr.readyState)}catch(e){result={success:!1,isException:!1}}return success=me.isXdr?xdrResult:result.success,success?(response=me.createResponse(request),me.fireEvent("requestcomplete",me,response,options),Ext.callback(options.success,options.scope,[response,options])):(response=result.isException||request.aborted||request.timedout?me.createException(request):me.createResponse(request),me.fireEvent("requestexception",me,response,options),Ext.callback(options.failure,options.scope,[response,options])),Ext.callback(options.callback,options.scope,[options,success,response]),delete me.requests[request.id],response},parseStatus:function(status){status=1223==status?204:status;var success=status>=200&&status<300||304==status,isException=!1;if(!success)switch(status){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:isException=!0}return{success:success,isException:isException}},createResponse:function(request){for(var line,index,key,response,me=this,xhr=request.xhr,isXdr=me.isXdr,headers={},lines=isXdr?[]:xhr.getAllResponseHeaders().replace(/\r\n/g,"\n").split("\n"),count=lines.length;count--;)line=lines[count],(index=line.indexOf(":"))>=0&&(key=line.substr(0,index).toLowerCase()," "==line.charAt(index+1)&&++index,headers[key]=line.substr(index+1));return request.xhr=null,delete request.xhr,response={request:request,requestId:request.id,status:xhr.status,statusText:xhr.statusText,getResponseHeader:function(header){return headers[header.toLowerCase()]},getAllResponseHeaders:function(){return headers}},isXdr&&me.processXdrResponse(response,xhr),request.binary?response.responseBytes=me.getByteArray(xhr):(response.responseText=xhr.responseText,response.responseXML=xhr.responseXML),xhr=null,response},createException:function(request){return{request:request,requestId:request.id,status:request.aborted?-1:0,statusText:request.aborted?"transaction aborted":"communication failure",aborted:request.aborted,timedout:request.timedout}},getByteArray:function(xhr){var byteArray,responseText,len,i,response=xhr.response,responseBody=xhr.responseBody;if(xhr instanceof Ext.data.flash.BinaryXhr)byteArray=xhr.responseBytes;else if(window.Uint8Array)byteArray=response?new Uint8Array(response):[];else if(Ext.isIE9p)try{byteArray=new VBArray(responseBody).toArray()}catch(e){byteArray=[]}else if(Ext.isIE)this.self.vbScriptInjected||this.injectVBScript(),getIEByteArray(xhr.responseBody,byteArray=[]);else for(byteArray=[],responseText=xhr.responseText,len=responseText.length,i=0;i<len;i++)byteArray.push(255&responseText.charCodeAt(i));return byteArray},injectVBScript:function(){var scriptTag=document.createElement("script");scriptTag.type="text/vbscript",scriptTag.text=["Function getIEByteArray(byteArray, out)","Dim len, i","len = LenB(byteArray)","For i = 1 to len","out.push(AscB(MidB(byteArray, i, 1)))","Next","End Function"].join("\n"),Ext.getHead().dom.appendChild(scriptTag),this.self.vbScriptInjected=!0},nativeBinaryPostSupport:function(){return Ext.isChrome||Ext.isSafari&&Ext.isDefined(window.Uint8Array)||Ext.isGecko&&Ext.isDefined(window.Uint8Array)}});Ext.define("Ext.Ajax",{extend:"Ext.data.Connection",singleton:!0,autoAbort:!1});Ext.define("Ext.util.Floating",{uses:["Ext.Layer","Ext.ZIndexManager"],focusOnToFront:!0,shadow:"sides",constrain:!1,constructor:function(dom){var me=this;me.fixed=me.fixed&&!(Ext.isIE6||Ext.isIEQuirks),me.el=new Ext.dom.Layer(Ext.apply({preventSync:!0,hideMode:me.hideMode,shadow:void 0!==me.shadow?me.shadow:"sides",shadowOffset:me.shadowOffset,constrain:!1,fixed:me.fixed,shim:!1!==me.shim&&void 0},me.floating),dom),!me.modal||Ext.FocusManager&&Ext.FocusManager.enabled||me.mon(me.el,{keydown:me.onKeyDown,scope:me}),me.mon(me.el,{mousedown:me.onMouseDown,scope:me}),me.floating=!0,me.registerWithOwnerCt(),me.initHierarchyEvents()},initHierarchyEvents:function(){var me=this,syncHidden=this.syncHidden;me.hasHierarchyEventListeners||(me.mon(me.hierarchyEventSource,{hide:syncHidden,collapse:syncHidden,show:syncHidden,expand:syncHidden,added:syncHidden,scope:me}),me.hasHierarchyEventListeners=!0)},registerWithOwnerCt:function(){var me=this,ownerCt=me.ownerCt,zip=me.zIndexParent;zip&&zip.unregisterFloatingItem(me),zip=me.zIndexParent=me.up("[floating]"),me.setFloatParent(ownerCt||zip),delete me.ownerCt,zip?zip.registerFloatingItem(me):Ext.WindowManager.register(me)},onKeyDown:function(e){var shift,focusables,first,last,me=this;e.getKey()==Ext.EventObject.TAB&&(shift=e.shiftKey,focusables=me.el.query(":focusable"),first=focusables[0],last=focusables[focusables.length-1],first&&last&&e.target===(shift?first:last)&&(e.stopEvent(),(shift?last:first).focus(!1,!0)))},onMouseDown:function(e){var focusTask=this.focusTask;!this.floating||focusTask&&focusTask.id||this.toFront(!!e.getTarget(":focusable"))},setFloatParent:function(floatParent){var me=this;me.floatParent=floatParent,!me.constrain&&!me.constrainHeader||me.constrainTo||(me.constrainTo=floatParent?floatParent.getTargetEl():me.container)},syncShadow:function(){this.floating&&this.el.sync(!0)},onBeforeFloatLayout:function(){this.el.preventSync=!0},onAfterFloatLayout:function(){delete this.el.preventSync,this.syncShadow()},syncHidden:function(){var me=this,hidden=me.hidden||!me.rendered,hierarchicallyHidden=me.hierarchicallyHidden=me.isHierarchicallyHidden(),pendingShow=me.pendingShow;hidden!==hierarchicallyHidden&&(hierarchicallyHidden?(me.hide(),me.pendingShow=!0):pendingShow&&(delete me.pendingShow,pendingShow.length?me.show.apply(me,pendingShow):me.show()))},setZIndex:function(index){var me=this;return me.el.setZIndex(index),index+=10,me.floatingDescendants&&(index=100*Math.floor(me.floatingDescendants.setBase(index)/100)+1e4),index},doConstrain:function(constrainTo){var me=this,xy=me.calculateConstrainedPosition(constrainTo,null,!0);xy&&me.setPosition(xy)},toFront:function(preventFocus){var me=this,zip=me.zIndexParent,preventFocusSetting=me.preventFocusOnActivate;return zip&&!1!==me.bringParentToFront&&zip.toFront(!0),Ext.isDefined(preventFocus)||(preventFocus=!me.focusOnToFront),preventFocus&&(me.preventFocusOnActivate=!0),me.zIndexManager.bringToFront(me,preventFocus)&&(preventFocus||me.focus(!1,!0)),me.preventFocusOnActivate=preventFocusSetting,me},setActive:function(active,newActive){var me=this;active?(me.el.shadow&&!me.maximized&&me.el.enableShadow(!0),me.preventFocusOnActivate||me.focus(!1,!0),me.fireEvent("activate",me)):(me.isWindow&&newActive&&newActive.isWindow&&me.hideShadowOnDeactivate&&me.el.disableShadow(),me.fireEvent("deactivate",me))},toBack:function(){return this.zIndexManager.sendToBack(this),this},center:function(){var xy,me=this;return me.isVisible()?(xy=me.getAlignToXY(me.container,"c-c"),me.setPagePosition(xy)):me.needsCenter=!0,me},onFloatShow:function(){this.needsCenter&&this.center(),delete this.needsCenter,this.toFrontOnShow&&this.toFront()},fitContainer:function(animate){var me=this,parent=me.floatParent,container=parent?parent.getTargetEl():me.container,newBox=container.getViewSize(!1),newPosition=parent||container.dom!==document.body?[0,0]:container.getXY();newBox.x=newPosition[0],newBox.y=newPosition[1],me.setBox(newBox,animate)}});Ext.define("Ext.Component",{alias:["widget.component","widget.box"],extend:"Ext.AbstractComponent",uses:["Ext.util.DelayedTask","Ext.Layer","Ext.resizer.Resizer","Ext.util.ComponentDragger"],mixins:{floating:"Ext.util.Floating"},statics:{DIRECTION_TOP:"top",DIRECTION_RIGHT:"right",DIRECTION_BOTTOM:"bottom",DIRECTION_LEFT:"left",VERTICAL_DIRECTION_Re:/^(?:top|bottom)$/,INVALID_ID_CHARS_Re:/[\.,\s]/g},resizeHandles:"all",floating:!1,defaultAlign:"tl-bl?",toFrontOnShow:!0,hideMode:"display",offsetsCls:Ext.baseCSSPrefix+"hide-offsets",bubbleEvents:[],defaultComponentLayoutType:"autocomponent",constructor:function(config){var me=this;config=config||{},config.initialConfig?(config.isAction&&(me.baseAction=config),config=config.initialConfig):(config.tagName||config.dom||Ext.isString(config))&&(config={applyTo:config,id:config.id||config}),me.callParent([config]),me.baseAction&&me.baseAction.addComponent(me)},initComponent:function(){var me=this;me.callParent(),me.listeners&&(me.on(me.listeners),me.listeners=null),me.enableBubble(me.bubbleEvents)},afterRender:function(){var me=this;me.callParent(),me.x&&me.y||!me.pageX&&!me.pageY||me.setPagePosition(me.pageX,me.pageY)},setAutoScroll:function(scroll){var me=this;return me.autoScroll=!!scroll,me.rendered&&me.getOverflowEl().setStyle(me.getOverflowStyle()),me.updateLayout(),me},setOverflowXY:function(overflowX,overflowY){var me=this,argCount=arguments.length;return argCount&&(me.overflowX=overflowX||"",argCount>1&&(me.overflowY=overflowY||"")),me.rendered&&me.getOverflowEl().setStyle(me.getOverflowStyle()),me.updateLayout(),me},beforeRender:function(){var cls,me=this,floating=me.floating;return floating&&(me.addCls(Ext.baseCSSPrefix+"layer"),(cls=floating.cls)&&me.addCls(cls)),me.callParent()},beforeLayout:function(){this.callParent(arguments),this.floating&&this.onBeforeFloatLayout()},afterComponentLayout:function(){this.callParent(arguments),this.floating&&this.onAfterFloatLayout()},makeFloating:function(dom){this.mixins.floating.constructor.call(this,dom)},wrapPrimaryEl:function(dom){this.floating?this.makeFloating(dom):this.callParent(arguments)},initResizable:function(resizable){var me=this;resizable=Ext.apply({target:me,dynamic:!1,constrainTo:me.constrainTo||(me.floatParent?me.floatParent.getTargetEl():null),handles:me.resizeHandles},resizable),resizable.target=me,me.resizer=new Ext.resizer.Resizer(resizable)},getDragEl:function(){return this.el},initDraggable:function(){var me=this,dragTarget=me.resizer&&me.resizer.el!==me.el?me.resizerComponent=new Ext.Component({ariaRole:"presentation",el:me.resizer.el,rendered:!0,container:me.container}):me,ddConfig=Ext.applyIf({el:dragTarget.getDragEl(),constrainTo:me.constrain||me.draggable.constrain?me.constrainTo||(me.floatParent?me.floatParent.getTargetEl():me.container):void 0},me.draggable);(me.constrain||me.constrainDelegate)&&(ddConfig.constrain=me.constrain,ddConfig.constrainDelegate=me.constrainDelegate),me.dd=new Ext.util.ComponentDragger(dragTarget,ddConfig)},scrollBy:function(deltaX,deltaY,animate){var el;(el=this.getTargetEl())&&el.dom&&el.scrollBy.apply(el,arguments)},setLoading:function(load,targetEl){var me=this,config={target:me};return me.rendered&&(Ext.destroy(me.loadMask),me.loadMask=null,!1===load||me.collapsed||(Ext.isObject(load)?Ext.apply(config,load):Ext.isString(load)&&(config.msg=load),targetEl&&Ext.applyIf(config,{useTargetEl:!0}),me.loadMask=new Ext.LoadMask(config),me.loadMask.show())),me.loadMask},beforeSetPosition:function(){var adj,me=this,pos=me.callParent(arguments);return pos&&(adj=me.adjustPosition(pos.x,pos.y),pos.x=adj.x,pos.y=adj.y),pos||null},afterSetPosition:function(ax,ay){this.onPosition(ax,ay),this.fireEvent("move",this,ax,ay)},showAt:function(x,y,animate){var me=this;if(!me.rendered&&(me.autoRender||me.floating))return me.x=x,me.y=y,me.show();me.floating?me.setPosition(x,y,animate):me.setPagePosition(x,y,animate),me.show()},showBy:function(cmp,pos,off){var me=this;return me.floating?(me.floating&&cmp&&(me.show(),me.rendered&&!me.hidden&&me.alignTo(cmp,pos||me.defaultAlign,off)),me):(Ext.log.warn("Using showBy on a non-floating component"),me)},setPagePosition:function(x,y,animate){var p,floatParentBox,me=this;return Ext.isArray(x)&&(y=x[1],x=x[0]),me.pageX=x,me.pageY=y,me.floating?(me.isContainedFloater()?(floatParentBox=me.floatParent.getTargetEl().getViewRegion(),Ext.isNumber(x)&&Ext.isNumber(floatParentBox.left)&&(x-=floatParentBox.left),Ext.isNumber(y)&&Ext.isNumber(floatParentBox.top)&&(y-=floatParentBox.top)):(p=me.el.translateXY(x,y),x=p.x,y=p.y),me.setPosition(x,y,animate)):(p=me.el.translateXY(x,y),me.setPosition(p.x,p.y,animate)),me},isContainedFloater:function(){return this.floating&&this.floatParent},updateBox:function(box){return this.setSize(box.width,box.height),this.setPagePosition(box.x,box.y),this},getOuterSize:function(){var el=this.el;return{width:el.getWidth()+el.getMargin("lr"),height:el.getHeight()+el.getMargin("tb")}},adjustPosition:function(x,y){var floatParentBox,me=this;return me.isContainedFloater()&&(floatParentBox=me.floatParent.getTargetEl().getViewRegion(),x+=floatParentBox.left,y+=floatParentBox.top),{x:x,y:y}},getPosition:function(local){var xy,floatParentBox,me=this,isContainedFloater=me.isContainedFloater();return!0!==local||isContainedFloater?(xy=me.getXY(),!0===local&&isContainedFloater&&(floatParentBox=me.floatParent.getTargetEl().getViewRegion(),xy[0]-=floatParentBox.left,xy[1]-=floatParentBox.top),xy):[me.getLocalX(),me.getLocalY()]},getId:function(){var xtype,me=this;return me.id||(xtype=me.getXType(),xtype=xtype?xtype.replace(Ext.Component.INVALID_ID_CHARS_Re,"-"):Ext.name.toLowerCase()+"-comp",me.id=xtype+"-"+me.getAutoId()),me.id},show:function(animateTarget,cb,scope){var me=this,rendered=me.rendered;return me.hierarchicallyHidden||me.floating&&!rendered&&me.isHierarchicallyHidden()?(rendered||me.initHierarchyEvents(),arguments.length>1?(arguments[0]=null,me.pendingShow=arguments):me.pendingShow=!0):rendered&&me.isVisible()?me.floating&&me.onFloatShow():!1!==me.fireEvent("beforeshow",me)?(me.hidden=!1,delete this.getHierarchyState().hidden,Ext.suspendLayouts(),rendered||!me.autoRender&&!me.floating||(me.doAutoRender(),rendered=me.rendered),rendered?(me.beforeShow(),Ext.resumeLayouts(),me.onShow.apply(me,arguments),me.afterShow.apply(me,arguments)):Ext.resumeLayouts(!0)):me.onShowVeto(),me},onShowVeto:Ext.emptyFn,beforeShow:Ext.emptyFn,onShow:function(){var me=this;me.el.show(),me.callParent(arguments),me.floating&&(me.maximized?me.fitContainer():me.constrain&&me.doConstrain())},getAnimateTarget:function(target){return target=target||this.animateTarget,target&&(target=target.isComponent?target.getEl():Ext.get(target)),target||null},afterShow:function(animateTarget,cb,scope){var fromBox,toBox,ghostPanel,me=this,myEl=me.el;animateTarget=me.getAnimateTarget(animateTarget),me.ghost||(animateTarget=null),animateTarget?(toBox={x:myEl.getX(),y:myEl.getY(),width:myEl.dom.offsetWidth,height:myEl.dom.offsetHeight},fromBox={x:animateTarget.getX(),y:animateTarget.getY(),width:animateTarget.dom.offsetWidth,height:animateTarget.dom.offsetHeight},myEl.addCls(me.offsetsCls),ghostPanel=me.ghost(),ghostPanel.el.stopAnimation(),ghostPanel.setX(-1e4),me.ghostBox=toBox,ghostPanel.el.animate({from:fromBox,to:toBox,listeners:{afteranimate:function(){delete ghostPanel.componentLayout.lastComponentSize,me.unghost(),delete me.ghostBox,myEl.removeCls(me.offsetsCls),me.onShowComplete(cb,scope)}}})):me.onShowComplete(cb,scope),me.fireHierarchyEvent("show")},onShowComplete:function(cb,scope){var me=this;me.floating&&me.onFloatShow(),Ext.callback(cb,scope||me),me.fireEvent("show",me),delete me.hiddenByLayout},hide:function(animateTarget,cb,scope){var continueHide,me=this;return me.pendingShow&&delete me.pendingShow,me.rendered&&!me.isVisible()||(continueHide=!1!==me.fireEvent("beforehide",me),(me.hierarchicallyHidden||continueHide)&&(me.hidden=!0,me.getHierarchyState().hidden=!0,me.rendered&&me.onHide.apply(me,arguments))),me},onHide:function(animateTarget,cb,scope){var ghostPanel,fromSize,toBox,me=this,activeEl=Ext.Element.getActiveElement();(activeEl===me.el||me.el.contains(activeEl))&&Ext.fly(activeEl).blur(),animateTarget=me.getAnimateTarget(animateTarget),me.ghost||(animateTarget=null),animateTarget&&(toBox={x:animateTarget.getX(),y:animateTarget.getY(),width:animateTarget.dom.offsetWidth,height:animateTarget.dom.offsetHeight},ghostPanel=me.ghost(),ghostPanel.el.stopAnimation(),fromSize=me.getSize(),ghostPanel.el.animate({to:toBox,listeners:{afteranimate:function(){delete ghostPanel.componentLayout.lastComponentSize,ghostPanel.el.hide(),ghostPanel.setHiddenState(!0),ghostPanel.el.setSize(fromSize),me.afterHide(cb,scope)}}})),me.el.hide(),animateTarget||me.afterHide(cb,scope)},afterHide:function(cb,scope){var me=this;me.hiddenByLayout=null,Ext.AbstractComponent.prototype.onHide.call(me),Ext.callback(cb,scope||me),me.fireEvent("hide",me),me.fireHierarchyEvent("hide")},onDestroy:function(){var me=this;me.rendered&&Ext.destroy(me.dd,me.resizer,me.proxy,me.proxyWrap,me.resizerComponent),delete me.focusTask,me.callParent()},deleteMembers:function(){for(var args=arguments,len=args.length,i=0;i<len;++i)delete this[args[i]]},focus:function(selectText,delay,callback,scope){var focusEl,focusElDom,containerScrollTop,me=this;if(delay)return me.getFocusTask().delay(Ext.isNumber(delay)?delay:10,me.focus,me,[selectText,!1,callback,scope]),me;if(me.focusTask&&me.focusTask.cancel(),me.rendered&&!me.isDestroyed&&me.isVisible(!0)&&(focusEl=me.getFocusEl())){if(focusEl.isComponent)return focusEl.focus(selectText,delay);(focusElDom=focusEl.dom)&&(focusEl.needsTabIndex()&&(focusElDom.tabIndex=-1),me.floating&&(containerScrollTop=me.container.dom.scrollTop),focusEl.focus(),selectText&&(Ext.isArray(selectText)?me.selectText&&me.selectText.apply(me,selectText):focusElDom.select()),Ext.callback(callback,scope)),me.floating&&(me!==me.zIndexManager.getActive()&&me.toFront(!0),void 0!==containerScrollTop&&(me.container.dom.scrollTop=containerScrollTop))}return me},getFocusTask:function(){return this.focusTask||(Ext.Component.prototype.focusTask=new Ext.util.DelayedTask),this.focusTask},cancelFocus:function(){var task=this.focusTask;task&&task.cancel()},blur:function(){var focusEl,me=this;return me.rendered&&(focusEl=me.getFocusEl())&&(me.blurring=!0,focusEl.blur(),delete me.blurring),me},getEl:function(){return this.el},getResizeEl:function(){return this.el},getPositionEl:function(){return this.el},getActionEl:function(){return this.el},getVisibilityEl:function(){return this.el},getRefOwner:function(){return this.ownerCt||this.floatParent},getBubbleTarget:function(){return this.getRefOwner()},getContentTarget:function(){return this.el},cloneConfig:function(overrides){overrides=overrides||{};var id=overrides.id||Ext.id(),cfg=Ext.applyIf(overrides,this.initialConfig);return cfg.id=id,new(Ext.getClass(this))(cfg)},getXType:function(){return this.self.xtype},findParentBy:function(fn){var p;for(p=this.getBubbleTarget();p&&!fn(p,this);p=p.getBubbleTarget());return p||null},findParentByType:function(xtype){return Ext.isFunction(xtype)?this.findParentBy(function(p){return p.constructor===xtype}):this.up(xtype)},bubble:function(fn,scope,args){for(var p=this;p&&!1!==fn.apply(scope||p,args||[p]);)p=p.getBubbleTarget();return this},getProxy:function(){var target,me=this;return me.proxy||(target=Ext.getBody(),me.proxy=me.el.createProxy(Ext.baseCSSPrefix+"proxy-el",target,!0)),me.proxy},fireHierarchyEvent:function(ename){this.hierarchyEventSource.fireEvent(ename,this)},onAdded:function(){this.callParent(arguments),this.hierarchyEventSource.hasListeners.added&&this.fireHierarchyEvent("added")}},function(){this.hierarchyEventSource=this.prototype.hierarchyEventSource=new Ext.util.Observable({events:{hide:!0,show:!0,collapse:!0,expand:!0,added:!0}})});Ext.define("Ext.layout.container.border.Region",{override:"Ext.Component",initBorderRegion:function(){var me=this;me._borderRegionInited||(me._borderRegionInited=!0,me.addStateEvents(["changeregion","changeweight"]),Ext.override(me,{getState:function(){var state=me.callParent();return state=me.addPropertyToState(state,"region"),state=me.addPropertyToState(state,"weight")}}))},getOwningBorderContainer:function(){var layout=this.getOwningBorderLayout();return layout&&layout.owner},getOwningBorderLayout:function(){var layout=this.ownerLayout;return layout&&layout.isBorderLayout?layout:null},setBorderRegion:function(region){var borderLayout,me=this,old=me.region;if(region!==old)if(borderLayout=me.getOwningBorderLayout()){var delta,items,index,regionFlags=borderLayout.regionFlags[region],placeholder=me.placeholder,splitter=me.splitter,owner=borderLayout.owner,regionMeta=borderLayout.regionMeta,collapsed=me.collapsed||me.floated;if(!1===me.fireEventArgs("beforechangeregion",[me,region]))return old;Ext.suspendLayouts(),me.region=region,Ext.apply(me,regionFlags),me.updateCollapseTool&&me.updateCollapseTool(),splitter&&(Ext.apply(splitter,regionFlags),splitter.updateOrientation(),items=owner.items,(index=items.indexOf(me))>=0&&(delta=regionMeta[region].splitterDelta,items.getAt(index+delta)!==splitter&&(items.remove(splitter),index=items.indexOf(me),delta>0&&++index,items.insert(index,splitter)))),placeholder&&(collapsed&&me.expand(!1),owner.remove(placeholder),me.placeholder=null,collapsed&&me.collapse(null,!1)),owner.updateLayout(),Ext.resumeLayouts(!0),me.fireEventArgs("changeregion",[me,old])}else me.region=region;return old},setRegionWeight:function(weight){var me=this,ownerCt=me.getOwningBorderContainer(),placeholder=me.placeholder,old=me.weight;return weight!==old&&!1!==me.fireEventArgs("beforechangeweight",[me,weight])&&(me.weight=weight,placeholder&&(placeholder.weight=weight),ownerCt&&ownerCt.updateLayout(),me.fireEventArgs("changeweight",[me,old])),old}});Ext.define("Ext.ElementLoader",{mixins:{observable:"Ext.util.Observable"},uses:["Ext.data.Connection","Ext.Ajax"],statics:{Renderer:{Html:function(loader,response,active){return loader.getTarget().update(response.responseText,!0===active.scripts),!0}}},url:null,params:null,baseParams:null,autoLoad:!1,target:null,loadMask:!1,ajaxOptions:null,scripts:!1,isLoader:!0,constructor:function(config){var autoLoad,me=this;config=config||{},Ext.apply(me,config),me.setTarget(me.target),me.addEvents("beforeload","exception","load"),me.mixins.observable.constructor.call(me),me.autoLoad&&(autoLoad=me.autoLoad,!0===autoLoad&&(autoLoad={}),me.load(autoLoad))},setTarget:function(target){var me=this;target=Ext.get(target),me.target&&me.target!=target&&me.abort(),me.target=target},getTarget:function(){return this.target||null},abort:function(){var active=this.active;void 0!==active&&(Ext.Ajax.abort(active.request),active.mask&&this.removeMask(),delete this.active)},removeMask:function(){this.target.unmask()},addMask:function(mask){this.target.mask(!0===mask?null:mask)},load:function(options){this.target||Ext.Error.raise("A valid target is required when loading content"),options=Ext.apply({},options);var me=this,mask=Ext.isDefined(options.loadMask)?options.loadMask:me.loadMask,params=Ext.apply({},options.params),ajaxOptions=Ext.apply({},options.ajaxOptions),callback=options.callback||me.callback,scope=options.scope||me.scope||me;Ext.applyIf(ajaxOptions,me.ajaxOptions),Ext.applyIf(options,ajaxOptions),Ext.applyIf(params,me.params),Ext.apply(params,me.baseParams),Ext.applyIf(options,{url:me.url}),options.url||Ext.Error.raise("You must specify the URL from which content should be loaded"),Ext.apply(options,{scope:me,params:params,callback:me.onComplete}),!1!==me.fireEvent("beforeload",me,options)&&(mask&&me.addMask(mask),me.active={options:options,mask:mask,scope:scope,callback:callback,success:options.success||me.success,failure:options.failure||me.failure,renderer:options.renderer||me.renderer,scripts:Ext.isDefined(options.scripts)?options.scripts:me.scripts},me.active.request=Ext.Ajax.request(options),me.setOptions(me.active,options))},setOptions:Ext.emptyFn,onComplete:function(options,success,response){var scope,me=this,active=me.active;active&&(scope=active.scope,success&&(success=!1!==me.getRenderer(active.renderer).call(me,me,response,active)),success?(Ext.callback(active.success,scope,[me,response,options]),me.fireEvent("load",me,response,options)):(Ext.callback(active.failure,scope,[me,response,options]),me.fireEvent("exception",me,response,options)),Ext.callback(active.callback,scope,[me,success,response,options]),active.mask&&me.removeMask()),delete me.active},getRenderer:function(renderer){return Ext.isFunction(renderer)?renderer:this.statics().Renderer.Html},startAutoRefresh:function(interval,options){var me=this;me.stopAutoRefresh(),me.autoRefresh=setInterval(function(){me.load(options)},interval)},stopAutoRefresh:function(){clearInterval(this.autoRefresh),delete this.autoRefresh},isAutoRefreshing:function(){return Ext.isDefined(this.autoRefresh)},destroy:function(){var me=this;me.stopAutoRefresh(),delete me.target,me.abort(),me.clearListeners()}});Ext.define("Ext.ComponentLoader",{extend:"Ext.ElementLoader",statics:{Renderer:{Data:function(loader,response,active){var success=!0;try{loader.getTarget().update(Ext.decode(response.responseText))}catch(e){success=!1}return success},Component:function(loader,response,active){var success=!0,target=loader.getTarget(),items=[];target.isContainer||Ext.Error.raise({target:target,msg:"Components can only be loaded into a container"});try{items=Ext.decode(response.responseText)}catch(e){success=!1}return success&&(target.suspendLayouts(),active.removeAll&&target.removeAll(),target.add(items),target.resumeLayouts(!0)),success}}},target:null,loadMask:!1,renderer:"html",setTarget:function(target){var me=this;Ext.isString(target)&&(target=Ext.getCmp(target)),me.target&&me.target!=target&&me.abort(),me.target=target},removeMask:function(){this.target.setLoading(!1)},addMask:function(mask){this.target.setLoading(mask)},setOptions:function(active,options){active.removeAll=Ext.isDefined(options.removeAll)?options.removeAll:this.removeAll},getRenderer:function(renderer){if(Ext.isFunction(renderer))return renderer;var renderers=this.statics().Renderer;switch(renderer){case"component":return renderers.Component;case"data":return renderers.Data;default:return Ext.ElementLoader.Renderer.Html}}});Ext.define("Ext.layout.SizeModel",{constructor:function(config){var name,me=this,SizeModel=me.self,sizeModelsArray=SizeModel.sizeModelsArray;Ext.apply(me,config),me[name=me.name]=!0,me.fixed=!(me.auto=me.natural||me.shrinkWrap),sizeModelsArray[me.ordinal=sizeModelsArray.length]=SizeModel[name]=SizeModel.sizeModels[name]=me},statics:{sizeModelsArray:[],sizeModels:{}},calculated:!1,configured:!1,constrainedMax:!1,constrainedMin:!1,natural:!1,shrinkWrap:!1,calculatedFromConfigured:!1,calculatedFromNatural:!1,calculatedFromShrinkWrap:!1,names:null},function(){var i,j,n,pairs,sizeModel,SizeModel=this,sizeModelsArray=SizeModel.sizeModelsArray;for(new SizeModel({name:"calculated"}),new SizeModel({name:"configured",names:{width:"width",height:"height"}}),new SizeModel({name:"natural"}),new SizeModel({name:"shrinkWrap"}),new SizeModel({name:"calculatedFromConfigured",configured:!0,names:{width:"width",height:"height"}}),new SizeModel({name:"calculatedFromNatural",natural:!0}),new SizeModel({name:"calculatedFromShrinkWrap",shrinkWrap:!0}),new SizeModel({name:"constrainedMax",configured:!0,constrained:!0,names:{width:"maxWidth",height:"maxHeight"}}),new SizeModel({name:"constrainedMin",configured:!0,constrained:!0,names:{width:"minWidth",height:"minHeight"}}),new SizeModel({name:"constrainedDock",configured:!0,constrained:!0,constrainedByMin:!0,names:{width:"dockConstrainedWidth",height:"dockConstrainedHeight"}}),i=0,n=sizeModelsArray.length;i<n;++i)for(sizeModel=sizeModelsArray[i],sizeModel.pairsByHeightOrdinal=pairs=[],j=0;j<n;++j)pairs.push({width:sizeModel,height:sizeModelsArray[j]})});Ext.define("Ext.layout.Layout",{requires:["Ext.XTemplate","Ext.layout.SizeModel"],uses:["Ext.layout.Context"],isLayout:!0,initialized:!1,running:!1,autoSizePolicy:{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:0},statics:{layoutsByType:{},create:function(layout,defaultType){var alias,className,config,layoutClass,type,load,ClassManager=Ext.ClassManager,layoutsByType=this.layoutsByType;if(layout&&"string"!=typeof layout){if(layout.isLayout)return layout;config=layout,type=layout.type||defaultType}else type=layout||defaultType,config={};if(!(layoutClass=layoutsByType[type])){if(alias="layout."+type,className=ClassManager.getNameByAlias(alias),className||(load=!0),layoutClass=ClassManager.get(className),load||!layoutClass)return ClassManager.instantiateByAlias(alias,config||{});layoutsByType[type]=layoutClass}return new layoutClass(config)}},constructor:function(config){var me=this;me.id=Ext.id(null,me.type+"-"),Ext.apply(me,config),me.layoutCount=0},beginLayout:Ext.emptyFn,beginLayoutCycle:function(ownerContext){var changed,me=this,context=me.context;me.lastWidthModel!=ownerContext.widthModel&&(me.lastWidthModel&&(changed=!0),me.lastWidthModel=ownerContext.widthModel),me.lastHeightModel!=ownerContext.heightModel&&(me.lastWidthModel&&(changed=!0),me.lastHeightModel=ownerContext.heightModel),changed&&((context=ownerContext.context).clearTriggers(me,!1),context.clearTriggers(me,!0),me.triggerCount=0)},finishedLayout:function(ownerContext){this.lastWidthModel=ownerContext.widthModel,this.lastHeightModel=ownerContext.heightModel,this.ownerContext=null},redoLayout:Ext.emptyFn,undoLayout:Ext.emptyFn,getAnimatePolicy:function(){return this.animatePolicy},getItemSizePolicy:function(item){return this.autoSizePolicy},isItemBoxParent:function(itemContext){return!1},isItemLayoutRoot:function(item){var sizeModel=item.getSizeModel(),width=sizeModel.width,height=sizeModel.height;return!(!item.componentLayout.lastComponentSize&&(width.calculated||height.calculated))&&(!width.shrinkWrap&&!height.shrinkWrap)},isItemShrinkWrap:function(item){return item.shrinkWrap},isRunning:function(){return!!this.ownerContext},getItemsRenderTree:function(items,renderCfgs){var i,item,itemConfig,result,length=items.length;if(length)for(result=[],i=0;i<length;++i)item=items[i],item.rendered||(renderCfgs&&void 0!==renderCfgs[item.id]?itemConfig=renderCfgs[item.id]:(this.configureItem(item),itemConfig=item.getRenderTree(),renderCfgs&&(renderCfgs[item.id]=itemConfig)),itemConfig&&result.push(itemConfig));return result},finishRender:Ext.emptyFn,finishRenderItems:function(target,items){var i,item,length=items.length;for(i=0;i<length;i++)item=items[i],item.rendering&&(item.finishRender(i),this.afterRenderItem(item))},renderChildren:function(){var me=this,items=me.getLayoutItems(),target=me.getRenderTarget();me.renderItems(items,target)},renderItems:function(items,target){var item,me=this,ln=items.length,i=0;if(ln){for(Ext.suspendLayouts();i<ln;i++)item=items[i],item&&!item.rendered?me.renderItem(item,target,i):me.isValidParent(item,target,i)?me.configureItem(item):me.moveItem(item,target,i);Ext.resumeLayouts(!0)}},isValidParent:function(item,target,position){var className,itemDom=item.el?item.el.dom:Ext.getDom(item),targetDom=target&&target.dom||target,parentNode=itemDom.parentNode;return parentNode&&(className=parentNode.className)&&-1!==className.indexOf(Ext.baseCSSPrefix+"resizable-wrap")&&(itemDom=itemDom.parentNode),!(!itemDom||!targetDom)&&("number"==typeof position?(position=this.getPositionOffset(position),itemDom===targetDom.childNodes[position]):itemDom.parentNode===targetDom)},getPositionOffset:function(position){return position},configureItem:function(item){item.ownerLayout=this},renderItem:function(item,target,position){var me=this;item.rendered||(me.configureItem(item),item.render(target,position),me.afterRenderItem(item))},moveItem:function(item,target,position){target=target.dom||target,"number"==typeof position&&(position=target.childNodes[position]),target.insertBefore(item.el.dom,position||null),item.container=Ext.get(target),this.configureItem(item)},onContentChange:function(){return this.owner.updateLayout(),!0},initLayout:function(){this.initialized=!0},setOwner:function(owner){this.owner=owner},getLayoutItems:function(){return[]},onAdd:function(item){item.ownerLayout=this},afterRenderItem:Ext.emptyFn,onRemove:Ext.emptyFn,onDestroy:Ext.emptyFn,afterRemove:function(item){var removeClasses,me=this,el=item.el,owner=me.owner;item.rendered&&(removeClasses=[].concat(me.itemCls||[]),owner.itemCls&&(removeClasses=Ext.Array.push(removeClasses,owner.itemCls)),removeClasses.length&&el.removeCls(removeClasses)),delete item.ownerLayout},destroy:function(){var target,me=this;me.targetCls&&(target=me.getTarget())&&target.removeCls(me.targetCls),me.onDestroy()},sortWeightedItems:function(items,reverseProp){for(var i=0,length=items.length;i<length;++i)items[i].$i=i;for(Ext.Array.sort(items,function(item1,item2){var ret=item2.weight-item1.weight;return ret||(ret=item1.$i-item2.$i,item1[reverseProp]&&(ret=-ret)),ret}),i=0;i<length;++i)delete items[i].$i}},function(){var Layout=this;Layout.prototype.sizeModels=Layout.sizeModels=Ext.layout.SizeModel.sizeModels});Ext.define("Ext.layout.container.Container",{alias:["layout.container"],extend:"Ext.layout.Layout",alternateClassName:"Ext.layout.ContainerLayout",mixins:{elementCt:"Ext.util.ElementContainer"},requires:["Ext.XTemplate"],type:"container",beginCollapse:Ext.emptyFn,beginExpand:Ext.emptyFn,animatePolicy:null,childEls:["overflowPadderEl"],renderTpl:["{%this.renderBody(out,values)%}"],usesContainerHeight:!0,usesContainerWidth:!0,usesHeight:!0,usesWidth:!0,constructor:function(){this.callParent(arguments),this.mixins.elementCt.constructor.call(this)},destroy:function(){this.callParent(),this.mixins.elementCt.destroy.call(this)},beginLayout:function(ownerContext){this.callParent(arguments),ownerContext.targetContext=ownerContext.paddingContext=ownerContext.getEl("getTarget",this),this.cacheChildItems(ownerContext)},beginLayoutCycle:function(ownerContext,firstCycle){var me=this;me.callParent(arguments),firstCycle&&(me.usesContainerHeight&&++ownerContext.consumersContainerHeight,me.usesContainerWidth&&++ownerContext.consumersContainerWidth)},cacheChildItems:function(ownerContext){var i,context=ownerContext.context,childItems=[],items=this.getVisibleItems(),length=items.length;for(ownerContext.childItems=childItems,ownerContext.visibleItems=items,i=0;i<length;++i)childItems.push(context.getCmp(items[i]))},cacheElements:function(){var owner=this.owner;this.applyChildEls(owner.el,owner.id)},configureItem:function(item){var addClasses,me=this,itemCls=me.itemCls,ownerItemCls=me.owner.itemCls;item.ownerLayout=me,itemCls&&(addClasses="string"==typeof itemCls?[itemCls]:itemCls),ownerItemCls&&(addClasses=Ext.Array.push(addClasses||[],ownerItemCls)),addClasses&&item.addCls(addClasses)},doRenderBody:function(out,renderData){this.renderItems(out,renderData),this.renderContent(out,renderData)},doRenderContainer:function(out,renderData){var me=renderData.$comp.layout,tpl=me.getRenderTpl(),data=me.getRenderData();tpl.applyOut(data,out)},doRenderItems:function(out,renderData){var me=renderData.$layout,tree=me.getRenderTree();tree&&Ext.DomHelper.generateMarkup(tree,out)},finishRender:function(){var target,items,me=this;me.callParent(),me.cacheElements(),target=me.getRenderTarget(),items=me.getLayoutItems(),me.targetCls&&!me.getTarget().hasCls(me.targetCls)&&Ext.log.warn("targetCls is missing. This may mean that getTargetEl() is being overridden but not applyTargetCls(). "+me.owner.id),me.finishRenderItems(target,items)},notifyOwner:function(){this.owner.afterLayout(this)},getContainerSize:function(ownerContext,inDom){var gotWidth,gotHeight,width,height,targetContext=ownerContext.targetContext,frameInfo=targetContext.getFrameInfo(),padding=ownerContext.paddingContext.getPaddingInfo(),got=0,needed=0;return ownerContext.widthModel.shrinkWrap||(++needed,width=inDom?targetContext.getDomProp("width"):targetContext.getProp("width"),(gotWidth="number"==typeof width)&&(++got,(width-=frameInfo.width+padding.width)<0&&(width=0))),ownerContext.heightModel.shrinkWrap||(++needed,height=inDom?targetContext.getDomProp("height"):targetContext.getProp("height"),(gotHeight="number"==typeof height)&&(++got,(height-=frameInfo.height+padding.height)<0&&(height=0))),{width:width,height:height,needed:needed,got:got,gotAll:got==needed,gotWidth:gotWidth,gotHeight:gotHeight}},getPositionOffset:function(position){if(!this.createsInnerCt){var offset=this.owner.itemNodeOffset;offset&&(position+=offset)}return position},getLayoutItems:function(){var owner=this.owner,items=owner&&owner.items;return items&&items.items||[]},getRenderData:function(){var comp=this.owner;return{$comp:comp,$layout:this,ownerId:comp.id}},getRenderedItems:function(){var i,item,me=this,target=me.getRenderTarget(),items=me.getLayoutItems(),ln=items.length,renderedItems=[];for(i=0;i<ln;i++)item=items[i],item.rendered&&me.isValidParent(item,target,i)&&renderedItems.push(item);return renderedItems},getRenderTarget:function(){return this.owner.getTargetEl()},getElementTarget:function(){return this.getRenderTarget()},getRenderTpl:function(){var me=this,renderTpl=Ext.XTemplate.getTpl(this,"renderTpl");return renderTpl.renderContent||me.owner.setupRenderTpl(renderTpl),renderTpl},getRenderTree:function(){var result,itemsGen,items=this.owner.items,renderCfgs={};do{itemsGen=items.generation,result=this.getItemsRenderTree(this.getLayoutItems(),renderCfgs)}while(items.generation!==itemsGen);return result},renderChildren:function(){var itemsGen,items,me=this,ownerItems=me.owner.items,target=me.getRenderTarget();do{itemsGen=ownerItems.generation,items=me.getLayoutItems(),me.renderItems(items,target)}while(ownerItems.generation!==itemsGen)},getScrollbarsNeeded:function(width,height,contentWidth,contentHeight){var scrollbarSize=Ext.getScrollbarSize(),hasWidth="number"==typeof width,hasHeight="number"==typeof height,needHorz=0,needVert=0;return scrollbarSize.width?(hasHeight&&height<contentHeight&&(needVert=2,width-=scrollbarSize.width),hasWidth&&width<contentWidth&&(needHorz=1,!needVert&&hasHeight&&(height-=scrollbarSize.height)<contentHeight&&(needVert=2)),needVert+needHorz):0},getTarget:function(){return this.owner.getTargetEl()},getVisibleItems:function(){var i,item,target=this.getRenderTarget(),items=this.getLayoutItems(),ln=items.length,visibleItems=[];for(i=0;i<ln;i++)item=items[i],item.rendered&&this.isValidParent(item,target,i)&&!0!==item.hidden&&visibleItems.push(item);return visibleItems},setupRenderTpl:function(renderTpl){var me=this;renderTpl.renderBody=me.doRenderBody,renderTpl.renderContainer=me.doRenderContainer,renderTpl.renderItems=me.doRenderItems},getContentTarget:function(){return this.owner.getDefaultContentTarget()}});Ext.define("Ext.layout.container.Auto",{alias:["layout.auto","layout.autocontainer"],extend:"Ext.layout.container.Container",type:"autocontainer",childEls:["outerCt","innerCt","clearEl"],reserveScrollbar:!1,managePadding:!0,manageOverflow:!1,lastOverflowAdjust:{width:0,height:0},renderTpl:["{% if (!(Ext.isIEQuirks || Ext.isIE7m)) { %}",'<span id="{ownerId}-outerCt" style="display:table;" role="presentation">','<div id="{ownerId}-innerCt" style="display:table-cell;height:100%;','vertical-align:top;{%this.renderPadding(out, values)%}" class="{innerCtCls}" role="presentation">',"{%this.renderBody(out,values)%}","</div>","</span>","{% } else if (values.shrinkWrapWidth) { %}",'<table id="{ownerId}-outerCt" class="'+Ext.plainTableCls+'" role="presentation">','<tbody role="presentation">','<tr role="presentation">','<td id="{ownerId}-innerCt" style="vertical-align:top;padding:0;','{%this.renderPadding(out, values)%}" class="{innerCtCls}" role="presentation">',"{%this.renderBody(out,values)%}",'<div id="{ownerId}-clearEl" class="',Ext.baseCSSPrefix,'clear"','role="presentation"></div>',"</td>","</tr>","</tbody>","</table>","{% } else { %}",'<div id="{ownerId}-outerCt" style="zoom:1;{%this.renderPadding(out, values)%}" role="presentation">','<div id="{ownerId}-innerCt" style="zoom:1;height:100%;" class="{innerCtCls}" role="presentation">',"{%this.renderBody(out,values)%}",'<div id="{ownerId}-clearEl" class="',Ext.baseCSSPrefix,'clear"','role="presentation"></div>',"</div>","</div>","{% values.$layout.isShrinkWrapTpl = false %}","{% } %}"],tableTpl:['<table id="{ownerId}-outerCt" class="'+Ext.plainTableCls+'" role="presentation">','<tbody role="presentation">','<tr role="presentation">','<td id="{ownerId}-innerCt" style="vertical-align:top;padding:0;','{%this.renderPadding(out, values)%}" class="{innerCtCls}" role="presentation">',"</td>","</tr>","</tbody>","</table>"],isShrinkWrapTpl:!0,beginLayout:function(ownerContext){var bottomPadding,overflowYStyle,overflowXStyle,needsTable,me=this;me.callParent(arguments),me.initContextItems(ownerContext),me.isShrinkWrapTpl||(ownerContext.widthModel.shrinkWrap&&(needsTable=!0),Ext.isStrict&&Ext.isIE7&&("auto"!==(overflowXStyle=me.getOverflowXStyle(ownerContext))&&"scroll"!==overflowXStyle||!ownerContext.paddingContext.getPaddingInfo().right||(needsTable=!0)),needsTable&&me.insertTableCt(ownerContext)),!me.isShrinkWrapTpl&&Ext.isIE7&&Ext.isStrict&&!me.clearElHasPadding&&(bottomPadding=ownerContext.paddingContext.getPaddingInfo().bottom,overflowYStyle=me.getOverflowYStyle(ownerContext),!bottomPadding||"auto"!==overflowYStyle&&"scroll"!==overflowYStyle||(me.clearEl.setStyle("height",bottomPadding),me.clearElHasPadding=!0))},beforeLayoutCycle:function(ownerContext){var comp=this.owner,hierarchyState=comp.hierarchyState,hierarchyStateInner=comp.hierarchyStateInner;hierarchyState&&!hierarchyState.invalid||(hierarchyState=comp.getHierarchyState(),hierarchyStateInner=comp.hierarchyStateInner),ownerContext.widthModel.shrinkWrap&&this.isShrinkWrapTpl?hierarchyStateInner.inShrinkWrapTable=!0:delete hierarchyStateInner.inShrinkWrapTable},beginLayoutCycle:function(ownerContext){var overflowXStyle,overflowYStyle,outerCtWidth,outerCtHeight,outerCtTableLayout,deferWidth,hierarchyStateInner,me=this,outerCt=me.outerCt,lastOuterCtWidth=me.lastOuterCtWidth||"",lastOuterCtHeight=me.lastOuterCtHeight||"",lastOuterCtTableLayout=me.lastOuterCtTableLayout||"",state=ownerContext.state;me.callParent(arguments),outerCtWidth=outerCtHeight=outerCtTableLayout="",!ownerContext.widthModel.shrinkWrap&&me.isShrinkWrapTpl&&(Ext.isIE7m&&Ext.isStrict&&("auto"!==(overflowYStyle=me.getOverflowYStyle(ownerContext))&&"scroll"!==overflowYStyle||(deferWidth=!0)),deferWidth||(outerCtWidth="100%"),hierarchyStateInner=me.owner.hierarchyStateInner,overflowXStyle=me.getOverflowXStyle(ownerContext),outerCtTableLayout=hierarchyStateInner.inShrinkWrapTable||"auto"===overflowXStyle||"scroll"===overflowXStyle?"":"fixed"),ownerContext.heightModel.shrinkWrap||Ext.supports.PercentageHeightOverflowBug||(outerCtHeight="100%"),(outerCtWidth!==lastOuterCtWidth||me.hasOuterCtPxWidth)&&(outerCt.setStyle("width",outerCtWidth),me.lastOuterCtWidth=outerCtWidth,me.hasOuterCtPxWidth=!1),outerCtTableLayout!==lastOuterCtTableLayout&&(outerCt.setStyle("table-layout",outerCtTableLayout),me.lastOuterCtTableLayout=outerCtTableLayout),(outerCtHeight!==lastOuterCtHeight||me.hasOuterCtPxHeight)&&(outerCt.setStyle("height",outerCtHeight),me.lastOuterCtHeight=outerCtHeight,me.hasOuterCtPxHeight=!1),me.hasInnerCtPxHeight&&(me.innerCt.setStyle("height",""),me.hasInnerCtPxHeight=!1),state.overflowAdjust=state.overflowAdjust||me.lastOverflowAdjust},calculate:function(ownerContext){var me=this,state=ownerContext.state,containerSize=me.getContainerSize(ownerContext,!0),calculatedItems=state.calculatedItems||(state.calculatedItems=!me.calculateItems||me.calculateItems(ownerContext,containerSize));if(me.setCtSizeIfNeeded(ownerContext,containerSize),calculatedItems&&ownerContext.hasDomProp("containerChildrenSizeDone")&&(me.calculateContentSize(ownerContext),containerSize.gotAll))return void(!me.manageOverflow||ownerContext.state.secondPass||me.reserveScrollbar||me.calculateOverflow(ownerContext,containerSize));me.done=!1},calculateContentSize:function(ownerContext){var me=this,containerDimensions=(ownerContext.widthModel.shrinkWrap?1:0)|(ownerContext.heightModel.shrinkWrap?2:0),calcWidth=1&containerDimensions||void 0,calcHeight=2&containerDimensions||void 0,needed=0,props=ownerContext.props;calcWidth&&(isNaN(props.contentWidth)?++needed:calcWidth=void 0),calcHeight&&(isNaN(props.contentHeight)?++needed:calcHeight=void 0),needed&&(calcWidth&&!ownerContext.setContentWidth(me.measureContentWidth(ownerContext))&&(me.done=!1),calcHeight&&!ownerContext.setContentHeight(me.measureContentHeight(ownerContext))&&(me.done=!1))},calculateOverflow:function(ownerContext){var width,height,scrollbarSize,scrollbars,xauto,yauto,targetEl,me=this;xauto="auto"===me.getOverflowXStyle(ownerContext),yauto="auto"===me.getOverflowYStyle(ownerContext),(xauto||yauto)&&(scrollbarSize=Ext.getScrollbarSize(),targetEl=ownerContext.overflowContext.el.dom,scrollbars=0,targetEl.scrollWidth>targetEl.clientWidth&&(scrollbars|=1),targetEl.scrollHeight>targetEl.clientHeight&&(scrollbars|=2),width=yauto&&2&scrollbars?scrollbarSize.width:0,height=xauto&&1&scrollbars?scrollbarSize.height:0,width===me.lastOverflowAdjust.width&&height===me.lastOverflowAdjust.height||(me.done=!1,ownerContext.invalidate({state:{overflowAdjust:{width:width,height:height},overflowState:scrollbars,secondPass:!0}})))},completeLayout:function(ownerContext){this.lastOverflowAdjust=ownerContext.state.overflowAdjust},doRenderPadding:function(out,renderData){var me=renderData.$layout,owner=renderData.$layout.owner,padding=owner[owner.contentPaddingProperty];me.managePadding&&padding&&out.push("padding:",owner.unitizeBox(padding))},finishedLayout:function(ownerContext){var innerCt=this.innerCt;this.callParent(arguments),(Ext.isIEQuirks||Ext.isIE8m)&&innerCt.repaint(),Ext.isOpera&&(innerCt.setStyle("position","relative"),innerCt.dom.scrollWidth,innerCt.setStyle("position",""))},getContainerSize:function(ownerContext,inDom){var size=this.callParent(arguments),overflowAdjust=ownerContext.state.overflowAdjust;return overflowAdjust&&(size.width-=overflowAdjust.width,size.height-=overflowAdjust.height),size},getRenderData:function(){var owner=this.owner,data=this.callParent();return(Ext.isIEQuirks||Ext.isIE7m)&&(1&owner.shrinkWrap||owner.floating&&!owner.width)&&(data.shrinkWrapWidth=!0),data},getRenderTarget:function(){return this.innerCt},getElementTarget:function(){return this.innerCt},getOverflowXStyle:function(ownerContext){return ownerContext.overflowXStyle||(ownerContext.overflowXStyle=this.owner.scrollFlags.overflowX||ownerContext.overflowContext.getStyle("overflow-x"))},getOverflowYStyle:function(ownerContext){return ownerContext.overflowYStyle||(ownerContext.overflowYStyle=this.owner.scrollFlags.overflowY||ownerContext.overflowContext.getStyle("overflow-y"))},initContextItems:function(ownerContext){var me=this,target=ownerContext.target,customOverflowEl=me.owner.customOverflowEl;ownerContext.outerCtContext=ownerContext.getEl("outerCt",me),ownerContext.innerCtContext=ownerContext.getEl("innerCt",me),ownerContext.overflowContext=customOverflowEl?ownerContext.getEl(customOverflowEl):ownerContext.targetContext,void 0!==target[target.contentPaddingProperty]&&(ownerContext.paddingContext=me.isShrinkWrapTpl?ownerContext.innerCtContext:ownerContext.outerCtContext)},initLayout:function(){var me=this,scrollbarWidth=Ext.getScrollbarSize().width,owner=me.owner;me.callParent(),scrollbarWidth&&me.manageOverflow&&!me.hasOwnProperty("lastOverflowAdjust")&&(owner.autoScroll||me.reserveScrollbar)&&(me.lastOverflowAdjust={width:scrollbarWidth,height:0})},insertTableCt:function(ownerContext){var renderTpl,fragment,childNodes,childLength,targetEl,me=this,owner=me.owner,i=0;for(renderTpl=Ext.XTemplate.getTpl(this,"tableTpl"),renderTpl.renderPadding=me.doRenderPadding,me.outerCt.dom.removeChild(me.innerCt.dom),fragment=document.createDocumentFragment(),childNodes=me.innerCt.dom.childNodes,childLength=childNodes.length;i<childLength;i++)fragment.appendChild(childNodes[0]);targetEl=me.getTarget(),targetEl.dom.innerHTML=renderTpl.apply({$layout:me,ownerId:me.owner.id}),targetEl.down("td").dom.appendChild(fragment),me.applyChildEls(owner.el,owner.id),me.isShrinkWrapTpl=!0,ownerContext.removeEl(me.outerCt),ownerContext.removeEl(me.innerCt),me.initContextItems(ownerContext)},measureContentHeight:function(ownerContext){var contentHeight=this.outerCt.getHeight(),target=ownerContext.target;return this.managePadding&&void 0===target[target.contentPaddingProperty]&&(contentHeight+=ownerContext.targetContext.getPaddingInfo().height),contentHeight},measureContentWidth:function(ownerContext){var dom,style,old,contentWidth,target;return this.chromeCellMeasureBug&&(dom=this.innerCt.dom,style=dom.style,"table-cell"==(old=style.display)&&(style.display="",dom.offsetWidth,style.display=old)),contentWidth=this.outerCt.getWidth(),target=ownerContext.target,this.managePadding&&void 0===target[target.contentPaddingProperty]&&(contentWidth+=ownerContext.targetContext.getPaddingInfo().width),contentWidth},setCtSizeIfNeeded:function(ownerContext,containerSize){var overflowStyleName,needsOuterHeight,needsInnerHeight,needsInnerCtPaddingHeight,me=this,width=containerSize.width,height=containerSize.height,padding=ownerContext.paddingContext.getPaddingInfo(),targetEl=me.getTarget(),overflowXStyle=me.getOverflowXStyle(ownerContext),overflowYStyle=me.getOverflowYStyle(ownerContext),canOverflowX="auto"===overflowXStyle||"scroll"===overflowXStyle,canOverflowY="auto"===overflowYStyle||"scroll"===overflowYStyle,scrollbarSize=Ext.getScrollbarSize(),isShrinkWrapTpl=me.isShrinkWrapTpl,manageOverflow=me.manageOverflow;width&&!ownerContext.widthModel.shrinkWrap&&(Ext.isIE7m&&Ext.isStrict&&isShrinkWrapTpl&&canOverflowY||Ext.isIEQuirks&&!isShrinkWrapTpl&&!canOverflowX)&&(manageOverflow||canOverflowY&&targetEl.dom.scrollHeight>targetEl.dom.clientHeight&&(width-=scrollbarSize.width),ownerContext.outerCtContext.setProp("width",width+padding.width),me.hasOuterCtPxWidth=!0),height&&!ownerContext.heightModel.shrinkWrap&&(Ext.supports.PercentageHeightOverflowBug&&(needsOuterHeight=!0),(Ext.isIE8&&Ext.isStrict||Ext.isIE7m&&Ext.isStrict&&isShrinkWrapTpl)&&(needsInnerHeight=!0,needsInnerCtPaddingHeight=!Ext.isIE8),(needsOuterHeight||needsInnerHeight)&&canOverflowX&&targetEl.dom.scrollWidth>targetEl.dom.clientWidth&&(height=Math.max(height-scrollbarSize.height,0)),needsOuterHeight&&(ownerContext.outerCtContext.setProp("height",height+padding.height),me.hasOuterCtPxHeight=!0),needsInnerHeight&&(needsInnerCtPaddingHeight&&(height+=padding.height),ownerContext.innerCtContext.setProp("height",height),me.hasInnerCtPxHeight=!0)),Ext.isIE7&&Ext.isStrict&&!isShrinkWrapTpl&&"auto"===overflowYStyle&&(overflowStyleName="auto"===overflowXStyle?"overflow-x":"overflow-y",targetEl.setStyle(overflowStyleName,"hidden"),targetEl.setStyle(overflowStyleName,"auto"))},setupRenderTpl:function(renderTpl){this.callParent(arguments),renderTpl.renderPadding=this.doRenderPadding},getContentTarget:function(){return this.innerCt}},function(){this.prototype.chromeCellMeasureBug=Ext.isChrome&&Ext.chromeVersion>=26});Ext.define("Ext.ZIndexManager",{alternateClassName:"Ext.WindowGroup",statics:{zBase:9e3},constructor:function(container){var me=this;me.map={},me.zIndexStack=[],me.front=null,container?container.isContainer?(container.on("resize",me._onContainerResize,me),me.zseed=Ext.Number.from(me.rendered?container.getEl().getStyle("zIndex"):void 0,me.getNextZSeed()),me.targetEl=container.getTargetEl(),me.container=container):(Ext.EventManager.onWindowResize(me._onContainerResize,me),me.zseed=me.getNextZSeed(),me.targetEl=Ext.get(container)):(Ext.EventManager.onWindowResize(me._onContainerResize,me),me.zseed=me.getNextZSeed(),Ext.onDocumentReady(function(){me.targetEl=Ext.getBody()}))},getNextZSeed:function(){return Ext.ZIndexManager.zBase+=1e4},setBase:function(baseZIndex){this.zseed=baseZIndex;var result=this.assignZIndices();return this._activateLast(),result},assignZIndices:function(){for(var comp,topModal,a=this.zIndexStack,len=a.length,i=0,zIndex=this.zseed;i<len;i++)(comp=a[i])&&!comp.hidden&&(zIndex=comp.setZIndex(zIndex),comp.modal&&(topModal=comp));return topModal&&this._showModalMask(topModal),zIndex},_setActiveChild:function(comp,oldFront){var front=this.front,oldPreventFocus=comp.preventFocusOnActivate;comp!==front&&(front&&!front.destroying&&front.setActive(!1,comp),this.front=comp,comp&&comp!=oldFront&&(comp.preventFocusOnActivate=comp.preventFocusOnActivate||oldFront&&(oldFront.preventFocusOnActivate||!oldFront.focusOnToFront),comp.setActive(!0),comp.modal&&this._showModalMask(comp),comp.preventFocusOnActivate=oldPreventFocus))},onComponentHide:function(comp){this._activateLast()},_activateLast:function(){for(var comp,me=this,stack=me.zIndexStack,i=stack.length-1;i>=0&&stack[i].hidden;--i);if(comp=stack[i]){if(me._setActiveChild(comp,me.front),comp.modal)return}else me.front&&!me.front.destroying&&me.front.setActive(!1),me.front=null;for(;i>=0;--i)if(comp=stack[i],comp.isVisible()&&comp.modal)return void me._showModalMask(comp);me._hideModalMask()},_showModalMask:function(comp){var viewSize,me=this,zIndex=comp.el.getStyle("zIndex")-4,maskTarget=comp.floatParent?comp.floatParent.getTargetEl():comp.container,mask=me.mask,shim=me.maskShim;mask||(Ext.isIE6&&(shim=me.maskShim=Ext.getBody().createChild({"data-sticky":!0,tag:"iframe",role:"presentation",cls:Ext.baseCSSPrefix+"shim "+Ext.baseCSSPrefix+"mask-shim"}),shim.setVisibilityMode(Ext.Element.DISPLAY)),mask=me.mask=Ext.getBody().createChild({"data-sticky":!0,role:"presentation",cls:Ext.baseCSSPrefix+"mask",style:"height:0;width:0"}),mask.setVisibilityMode(Ext.Element.DISPLAY),mask.on("click",me._onMaskClick,me)),mask.maskTarget=maskTarget,viewSize=me.getMaskBox(),shim&&(shim.setStyle("zIndex",zIndex),shim.show(),shim.setBox(viewSize)),mask.setStyle("zIndex",zIndex),mask.show(),mask.setBox(viewSize)},_hideModalMask:function(){var mask=this.mask,maskShim=this.maskShim;mask&&mask.isVisible()&&(mask.maskTarget=void 0,mask.hide(),maskShim&&maskShim.hide())},_onMaskClick:function(){this.front&&this.front.focus()},getMaskBox:function(){var maskTarget=this.mask.maskTarget;return maskTarget.dom===document.body?{height:Math.max(document.body.scrollHeight,Ext.dom.Element.getDocumentHeight()),width:Math.max(document.body.scrollWidth,document.documentElement.clientWidth),x:0,y:0}:maskTarget.getBox()},_onContainerResize:function(){var viewSize,me=this,mask=me.mask,maskShim=me.maskShim;mask&&mask.isVisible()&&(mask.hide(),maskShim&&maskShim.hide(),viewSize=me.getMaskBox(),maskShim&&(maskShim.setSize(viewSize),maskShim.show()),mask.setSize(viewSize),mask.show())},register:function(comp){var me=this,compAfterHide=comp.afterHide;comp.zIndexManager&&comp.zIndexManager.unregister(comp),comp.zIndexManager=me,me.map[comp.id]=comp,me.zIndexStack.push(comp),comp.afterHide=function(){compAfterHide.apply(comp,arguments),me.onComponentHide(comp)}},unregister:function(comp){var me=this,map=me.map;delete comp.zIndexManager,map&&map[comp.id]&&(delete map[comp.id],delete comp.afterHide,Ext.Array.remove(me.zIndexStack,comp),me._activateLast())},get:function(id){return id.isComponent?id:this.map[id]},bringToFront:function(comp,preventFocus){var me=this,result=!1,zIndexStack=me.zIndexStack;return comp=me.get(comp),comp!==me.front&&(Ext.Array.remove(zIndexStack,comp),comp.preventBringToFront?zIndexStack.unshift(comp):zIndexStack.push(comp),me.assignZIndices(),preventFocus||me._activateLast(),result=!0,me.front=comp,comp.modal&&me._showModalMask(comp)),result},sendToBack:function(comp){var me=this;return comp=me.get(comp),Ext.Array.remove(me.zIndexStack,comp),me.zIndexStack.unshift(comp),me.assignZIndices(),this._activateLast(),comp},hideAll:function(){var item,id,map=this.map;for(id in map)map.hasOwnProperty(id)&&(item=map[id],item.isComponent&&item.isVisible()&&item.hide())},hide:function(){var comp,i=0,stack=this.zIndexStack,len=stack.length;for(this.tempHidden=[];i<len;i++)comp=stack[i],comp.isVisible()&&(this.tempHidden.push(comp),comp.el.hide(),comp.hidden=!0)},show:function(){for(var comp,i=0,tempHidden=this.tempHidden,len=tempHidden?tempHidden.length:0;i<len;i++)comp=tempHidden[i],comp.el.show(),comp.hidden=!1,comp.setPosition(comp.x,comp.y);delete this.tempHidden},getActive:function(){return this.front},getBy:function(fn,scope){for(var comp,r=[],i=0,stack=this.zIndexStack,len=stack.length;i<len;i++)comp=stack[i],!1!==fn.call(scope||comp,comp)&&r.push(comp);return r},each:function(fn,scope){var id,comp,map=this.map;for(id in map)if(map.hasOwnProperty(id)&&(comp=map[id],comp.isComponent&&!1===fn.call(scope||comp,comp)))return},eachBottomUp:function(fn,scope){for(var comp,stack=this.zIndexStack,i=0,len=stack.length;i<len;i++)if(comp=stack[i],comp.isComponent&&!1===fn.call(scope||comp,comp))return},eachTopDown:function(fn,scope){for(var comp,stack=this.zIndexStack,i=stack.length;i-- >0;)if(comp=stack[i],comp.isComponent&&!1===fn.call(scope||comp,comp))return},destroy:function(){var comp,id,me=this,map=me.map;for(id in map)map.hasOwnProperty(id)&&(comp=map[id],comp.isComponent&&comp.destroy());Ext.destroy(me.mask),Ext.destroy(me.maskShim),delete me.zIndexStack,delete me.map,delete me.container,delete me.targetEl}},function(){Ext.WindowManager=Ext.WindowMgr=new this});Ext.define("Ext.Queryable",{isQueryable:!0,query:function(selector){return selector=selector||"*",Ext.ComponentQuery.query(selector,this)},queryBy:function(fn,scope){for(var item,out=[],items=this.getRefItems(!0),i=0,len=items.length;i<len;++i)item=items[i],!1!==fn.call(scope||item,item)&&out.push(item);return out},queryById:function(id){return this.down("#"+id)},child:function(selector){return selector&&selector.isComponent&&(selector="#"+Ext.escapeId(selector.getItemId())),selector=selector||"",this.query("> "+selector)[0]||null},down:function(selector){return selector&&selector.isComponent&&(selector="#"+Ext.escapeId(selector.getItemId())),selector=selector||"",this.query(selector)[0]||null},getRefItems:function(){return[]}});Ext.define("Ext.layout.component.Component",{extend:"Ext.layout.Layout",type:"component",isComponentLayout:!0,nullBox:{},usesContentHeight:!0,usesContentWidth:!0,usesHeight:!0,usesWidth:!0,beginLayoutCycle:function(ownerContext,firstCycle){var ownerLayout,v,widthName,heightName,me=this,owner=me.owner,ownerCtContext=ownerContext.ownerCtContext,heightModel=ownerContext.heightModel,widthModel=ownerContext.widthModel,body=owner.el.dom===document.body,lastBox=owner.lastBox||me.nullBox,lastSize=owner.el.lastBox||me.nullBox,dirty=!body;me.callParent(arguments),firstCycle&&(me.usesContentWidth&&++ownerContext.consumersContentWidth,me.usesContentHeight&&++ownerContext.consumersContentHeight,me.usesWidth&&++ownerContext.consumersWidth,me.usesHeight&&++ownerContext.consumersHeight,ownerCtContext&&!ownerCtContext.hasRawContent&&(ownerLayout=owner.ownerLayout,ownerLayout.usesWidth&&++ownerContext.consumersWidth,ownerLayout.usesHeight&&++ownerContext.consumersHeight)),widthModel.configured?(widthName=widthModel.names.width,body||(dirty=me.setWidthInDom||(firstCycle?owner[widthName]!==lastSize.width:widthModel.constrained)),ownerContext.setWidth(owner[widthName],dirty)):ownerContext.isTopLevel&&(widthModel.calculated&&(v=lastBox.width,ownerContext.setWidth(v,v!=lastSize.width)),v=lastBox.x,ownerContext.setProp("x",v,v!=lastSize.x)),heightModel.configured?(heightName=heightModel.names.height,body||(dirty=firstCycle?owner[heightName]!==lastSize.height:heightModel.constrained),ownerContext.setHeight(owner[heightName],dirty)):ownerContext.isTopLevel&&(heightModel.calculated&&(v=lastBox.height,ownerContext.setHeight(v,v!=lastSize.height)),v=lastBox.y,ownerContext.setProp("y",v,v!=lastSize.y))},finishedLayout:function(ownerContext){var len,i,elContext,lastBox,props,me=this,elementChildren=ownerContext.children,owner=me.owner;if(elementChildren)for(len=elementChildren.length,i=0;i<len;i++)elContext=elementChildren[i],elContext.el.lastBox=elContext.props;ownerContext.previousSize=me.lastComponentSize,me.lastComponentSize=owner.el.lastBox=props=ownerContext.props,lastBox=owner.lastBox||(owner.lastBox={}),lastBox.x=props.x,lastBox.y=props.y,lastBox.width=props.width,lastBox.height=props.height,lastBox.invalid=!1,me.callParent(arguments)},notifyOwner:function(ownerContext){var me=this,currentSize=me.lastComponentSize,prevSize=ownerContext.previousSize,args=[currentSize.width,currentSize.height];prevSize&&args.push(prevSize.width,prevSize.height),me.owner.afterComponentLayout.apply(me.owner,args)},getTarget:function(){return this.owner.el},getRenderTarget:function(){return this.owner.el},cacheTargetInfo:function(ownerContext){var target,me=this,targetInfo=me.targetInfo;return targetInfo||(target=ownerContext.getEl("getTarget",me),me.targetInfo=targetInfo={padding:target.getPaddingInfo(),border:target.getBorderInfo()}),targetInfo},measureAutoDimensions:function(ownerContext,dimensions){var isContainer,zeroWidth,zeroHeight,size,temp,me=this,owner=me.owner,containerLayout=owner.layout,heightModel=ownerContext.heightModel,widthModel=ownerContext.widthModel,boxParent=ownerContext.boxParent,isBoxParent=ownerContext.isBoxParent,props=ownerContext.props,ret={gotWidth:!1,gotHeight:!1,isContainer:isContainer=!ownerContext.hasRawContent},hv=dimensions||3,needed=0,got=0;return widthModel.shrinkWrap&&ownerContext.consumersContentWidth?(++needed,zeroWidth=!(1&hv),isContainer?zeroWidth?(ret.contentWidth=0,ret.gotWidth=!0,++got):void 0!==(ret.contentWidth=ownerContext.getProp("contentWidth"))&&(ret.gotWidth=!0,++got):(size=props.contentWidth,"number"==typeof size?(ret.contentWidth=size,ret.gotWidth=!0,++got):(!!zeroWidth||!!ownerContext.hasDomProp("containerChildrenSizeDone")&&(!(!isBoxParent&&boxParent&&!boxParent.widthModel.shrinkWrap)||boxParent.hasDomProp("width")))&&(temp=zeroWidth?0:containerLayout&&containerLayout.measureContentWidth?containerLayout.measureContentWidth(ownerContext):me.measureContentWidth(ownerContext),isNaN(ret.contentWidth=temp)||(ownerContext.setContentWidth(temp,!0),ret.gotWidth=!0,++got)))):widthModel.natural&&ownerContext.consumersWidth&&(++needed,size=props.width,"number"==typeof size?(ret.width=size,ret.gotWidth=!0,++got):(!(!isBoxParent&&boxParent)||boxParent.hasDomProp("width"))&&(isNaN(ret.width=me.measureOwnerWidth(ownerContext))||(ownerContext.setWidth(ret.width,!1),ret.gotWidth=!0,++got))),heightModel.shrinkWrap&&ownerContext.consumersContentHeight?(++needed,zeroHeight=!(2&hv),isContainer?zeroHeight?(ret.contentHeight=0,ret.gotHeight=!0,++got):void 0!==(ret.contentHeight=ownerContext.getProp("contentHeight"))&&(ret.gotHeight=!0,++got):(size=props.contentHeight,"number"==typeof size?(ret.contentHeight=size,ret.gotHeight=!0,++got):(!!zeroHeight||!!ownerContext.hasDomProp("containerChildrenSizeDone")&&(!!owner.noWrap||(widthModel.shrinkWrap?!(!isBoxParent&&boxParent&&!boxParent.widthModel.shrinkWrap)||boxParent.hasDomProp("width"):(ownerContext.bodyContext||ownerContext).hasDomProp("width"))))&&(temp=zeroHeight?0:containerLayout&&containerLayout.measureContentHeight?containerLayout.measureContentHeight(ownerContext):me.measureContentHeight(ownerContext),isNaN(ret.contentHeight=temp)||(ownerContext.setContentHeight(temp,!0),ret.gotHeight=!0,++got)))):heightModel.natural&&ownerContext.consumersHeight&&(++needed,size=props.height,"number"==typeof size?(ret.height=size,ret.gotHeight=!0,++got):(!(!isBoxParent&&boxParent)||boxParent.hasDomProp("width"))&&(isNaN(ret.height=me.measureOwnerHeight(ownerContext))||(ownerContext.setHeight(ret.height,!1),ret.gotHeight=!0,++got))),boxParent&&ownerContext.onBoxMeasured(),ret.gotAll=got==needed,ret},measureContentWidth:function(ownerContext){return ownerContext.el.getWidth()-ownerContext.getFrameInfo().width},measureContentHeight:function(ownerContext){return ownerContext.el.getHeight()-ownerContext.getFrameInfo().height},measureOwnerHeight:function(ownerContext){return ownerContext.el.getHeight()},measureOwnerWidth:function(ownerContext){return ownerContext.el.getWidth()}});Ext.define("Ext.layout.component.Auto",{alias:"layout.autocomponent",extend:"Ext.layout.component.Component",type:"autocomponent",setHeightInDom:!1,setWidthInDom:!1,waitForOuterHeightInDom:!1,waitForOuterWidthInDom:!1,beginLayoutCycle:function(ownerContext,firstCycle){var me=this,lastWidthModel=me.lastWidthModel,lastHeightModel=me.lastHeightModel,el=me.owner.el;me.callParent(arguments),lastWidthModel&&lastWidthModel.fixed&&ownerContext.widthModel.shrinkWrap&&el.setWidth(null),lastHeightModel&&lastHeightModel.fixed&&ownerContext.heightModel.shrinkWrap&&el.setHeight(null)},calculate:function(ownerContext){var width,height,me=this,measurement=me.measureAutoDimensions(ownerContext),heightModel=ownerContext.heightModel,widthModel=ownerContext.widthModel;measurement.gotWidth?widthModel.shrinkWrap?me.publishOwnerWidth(ownerContext,measurement.contentWidth):me.publishInnerWidth&&me.publishInnerWidth(ownerContext,measurement.width):!widthModel.auto&&me.publishInnerWidth&&(width=me.waitForOuterWidthInDom?ownerContext.getDomProp("width"):ownerContext.getProp("width"),void 0===width?me.done=!1:me.publishInnerWidth(ownerContext,width)),measurement.gotHeight?heightModel.shrinkWrap?me.publishOwnerHeight(ownerContext,measurement.contentHeight):me.publishInnerHeight&&me.publishInnerHeight(ownerContext,measurement.height):!heightModel.auto&&me.publishInnerHeight&&(height=me.waitForOuterHeightInDom?ownerContext.getDomProp("height"):ownerContext.getProp("height"),void 0===height?me.done=!1:me.publishInnerHeight(ownerContext,height)),measurement.gotAll||(me.done=!1)},calculateOwnerHeightFromContentHeight:function(ownerContext,contentHeight){return contentHeight+ownerContext.getFrameInfo().height},calculateOwnerWidthFromContentWidth:function(ownerContext,contentWidth){return contentWidth+ownerContext.getFrameInfo().width},publishOwnerHeight:function(ownerContext,contentHeight){var constrainedHeight,dirty,heightModel,me=this,owner=me.owner,height=me.calculateOwnerHeightFromContentHeight(ownerContext,contentHeight);isNaN(height)?me.done=!1:(constrainedHeight=Ext.Number.constrain(height,owner.minHeight,owner.maxHeight),constrainedHeight==height?dirty=me.setHeightInDom:(heightModel=me.sizeModels[constrainedHeight<height?"constrainedMax":"constrainedMin"],height=constrainedHeight,ownerContext.heightModel.calculatedFromShrinkWrap?ownerContext.heightModel=heightModel:ownerContext.invalidate({heightModel:heightModel})),ownerContext.setHeight(height,dirty))},publishOwnerWidth:function(ownerContext,contentWidth){var constrainedWidth,dirty,widthModel,me=this,owner=me.owner,width=me.calculateOwnerWidthFromContentWidth(ownerContext,contentWidth);isNaN(width)?me.done=!1:(constrainedWidth=Ext.Number.constrain(width,owner.minWidth,owner.maxWidth),constrainedWidth==width?dirty=me.setWidthInDom:(widthModel=me.sizeModels[constrainedWidth<width?"constrainedMax":"constrainedMin"],width=constrainedWidth,ownerContext.widthModel.calculatedFromShrinkWrap?ownerContext.widthModel=widthModel:ownerContext.invalidate({widthModel:widthModel})),ownerContext.setWidth(width,dirty))}});Ext.define("Ext.container.AbstractContainer",{extend:"Ext.Component",requires:["Ext.util.MixedCollection","Ext.layout.container.Auto","Ext.ZIndexManager"],mixins:{queryable:"Ext.Queryable"},renderTpl:"{%this.renderContainer(out,values)%}",suspendLayout:!1,autoDestroy:!0,defaultType:"panel",detachOnRemove:!0,isContainer:!0,layoutCounter:0,baseCls:Ext.baseCSSPrefix+"container",defaultLayoutType:"auto",ariaRole:"presentation",initComponent:function(){var me=this;me.addEvents("afterlayout","beforeadd","beforeremove","add","remove"),me.callParent(),me.getLayout(),me.initItems()},initItems:function(){var me=this,items=me.items;me.items=new Ext.util.AbstractMixedCollection(!1,me.getComponentId),me.floatingItems=new Ext.util.MixedCollection(!1,me.getComponentId),items&&(Ext.isArray(items)||(items=[items]),me.add(items))},getFocusEl:function(){return this.getTargetEl()},finishRenderChildren:function(){this.callParent();var layout=this.getLayout();layout&&layout.finishRender()},beforeRender:function(){var targetCls,me=this,layout=me.getLayout();me.callParent(),layout.initialized||layout.initLayout(),(targetCls=layout.targetCls)&&me.applyTargetCls(targetCls)},applyTargetCls:function(targetCls){this.addCls(targetCls)},afterComponentLayout:function(){var i,floater,floaters=this.floatingItems.items,floaterCount=floaters.length;for(this.callParent(arguments),i=0;i<floaterCount;i++)floater=floaters[i],!floater.rendered&&floater.autoShow&&floater.show()},onPosition:function(){this.callParent(arguments),this.repositionFloatingItems()},onResize:function(){this.callParent(arguments),this.repositionFloatingItems()},repositionFloatingItems:function(){var i,floater,floaters=this.floatingItems.items,floaterCount=floaters.length;for(i=0;i<floaterCount;i++)floater=floaters[i],floater.el&&!floater.hidden&&floater.setPosition(floater.x,floater.y)},setupRenderTpl:function(renderTpl){this.callParent(arguments),this.getLayout().setupRenderTpl(renderTpl)},getDefaultContentTarget:function(){return this.el},getContentTarget:function(){return this.getLayout().getContentTarget()},setLayout:function(layout){var currentLayout=this.layout;currentLayout&&currentLayout.isLayout&&currentLayout!=layout&&currentLayout.setOwner(null),this.layout=layout,layout.setOwner(this)},getLayout:function(){var me=this;return me.layout&&me.layout.isLayout||me.setLayout(Ext.layout.Layout.create(me.layout,me.self.prototype.layout||me.defaultLayoutType)),me.layout},doLayout:function(){return this.updateLayout(),this},afterLayout:function(layout){var me=this;++me.layoutCounter,me.hasListeners.afterlayout&&me.fireEvent("afterlayout",me,layout)},prepareItems:function(items,applyDefaults){items=Ext.isArray(items)?items.slice():[items];for(var item,me=this,i=0,len=items.length;i<len;i++)item=items[i],null==item?(Ext.Array.erase(items,i,1),--i,--len):(applyDefaults&&(item=this.applyDefaults(item)),item.isContained=me,items[i]=me.lookupComponent(item),delete item.isContained,delete items[i].isContained);return items},applyDefaults:function(config){var defaults=this.defaults;return defaults&&(Ext.isFunction(defaults)&&(defaults=defaults.call(this,config)),Ext.isString(config)&&(config=Ext.ComponentManager.get(config)),Ext.applyIf(config,defaults)),config},lookupComponent:function(comp){return"string"==typeof comp?Ext.ComponentManager.get(comp):Ext.ComponentManager.create(comp,this.defaultType)},getComponentId:function(comp){return comp.getItemId&&comp.getItemId()},add:function(){var addingArray,items,i,length,item,pos,ret,me=this,args=Ext.Array.slice(arguments),index="number"==typeof args[0]?args.shift():-1,layout=me.getLayout(),needsLayout=!1;for(1==args.length&&Ext.isArray(args[0])?(items=args[0],addingArray=!0):items=args,me.rendered&&Ext.suspendLayouts(),ret=items=me.prepareItems(items,!0),length=items.length,addingArray||1!=length||(ret=items[0]),i=0;i<length;i++)item=items[i],item||Ext.Error.raise("Cannot add null item to Container with itemId/id: "+me.getItemId()),pos=index<0?me.items.length:index+i,item.floating?(me.floatingItems.add(item),item.onAdded(me,pos),me.hasListeners.add&&me.fireEvent("add",me,item,pos)):me.hasListeners.beforeadd&&!1===me.fireEvent("beforeadd",me,item,pos)||!1===me.onBeforeAdd(item)||(me.items.insert(pos,item),item.onAdded(me,pos),me.onAdd(item,pos),layout.onAdd(item,pos),needsLayout=!0,me.hasListeners.add&&me.fireEvent("add",me,item,pos));return needsLayout&&me.updateLayout(),me.rendered&&Ext.resumeLayouts(!0),ret},onAdd:Ext.emptyFn,onRemove:Ext.emptyFn,insert:function(index,comp){var compIdx;return comp&&comp.isComponent&&-1!==(compIdx=this.items.indexOf(comp))?this.move(compIdx,index):this.add(index,comp)},move:function(fromIdx,toIdx){var item,items=this.items;return fromIdx.isComponent&&(fromIdx=items.indexOf(fromIdx)),!1!==(item=items.removeAt(fromIdx))&&(items.insert(toIdx,item),this.onMove(item,fromIdx,toIdx),this.updateLayout(),item)},onMove:Ext.emptyFn,onBeforeAdd:function(item){item.ownerCt&&item.ownerCt!==this&&item.ownerCt.remove(item,!1)},remove:function(comp,autoDestroy){var me=this,c=me.getComponent(comp);return Ext.isDefined(Ext.global.console)&&!c&&Ext.global.console.warn("Attempted to remove a component that does not exist. Ext.container.Container: remove takes an argument of the component to remove. cmp.remove() is incorrect usage."),!c||me.hasListeners.beforeremove&&!1===me.fireEvent("beforeremove",me,c)||(me.doRemove(c,autoDestroy),me.hasListeners.remove&&me.fireEvent("remove",me,c),me.destroying||c.floating||me.updateLayout()),c},doRemove:function(component,doDestroy){doDestroy=!0===doDestroy||!1!==doDestroy&&this.autoDestroy;var me=this,layout=me.layout,hasLayout=layout&&me.rendered,isDestroying=component.destroying||doDestroy,floating=component.floating;floating?me.floatingItems.remove(component):me.items.remove(component),hasLayout&&!floating&&(layout.running&&Ext.AbstractComponent.cancelLayout(component,isDestroying),layout.onRemove(component,isDestroying)),component.onRemoved(isDestroying),me.onRemove(component,isDestroying),doDestroy?component.destroy():(hasLayout&&!floating&&layout.afterRemove(component),me.detachOnRemove&&component.rendered&&me.detachComponent(component))},detachComponent:function(component){Ext.getDetachedBody().appendChild(component.getEl())},removeAll:function(autoDestroy){var item,me=this,removeItems=me.items.items.slice().concat(me.floatingItems.items),items=[],i=0,len=removeItems.length;for(me.suspendLayouts();i<len;i++)item=removeItems[i],me.remove(item,autoDestroy),item.ownerCt!==me&&items.push(item);return me.resumeLayouts(!!len),items},getRefItems:function(deep){for(var item,me=this,items=me.items.items,len=items.length,i=0,result=[];i<len;i++)item=items[i],result[result.length]=item,deep&&item.getRefItems&&result.push.apply(result,item.getRefItems(!0));for(items=me.floatingItems.items,len=items.length,i=0;i<len;i++)item=items[i],result[result.length]=item,deep&&item.getRefItems&&result.push.apply(result,item.getRefItems(!0));return result},cascade:function(fn,scope,origArgs){var c,me=this,cs=me.items?me.items.items:[],len=cs.length,i=0,args=origArgs?origArgs.concat(me):[me],componentIndex=args.length-1;if(!1!==fn.apply(scope||me,args))for(;i<len;i++)c=cs[i],c.cascade?c.cascade(fn,scope,origArgs):(args[componentIndex]=c,fn.apply(scope||cs,args));return this},isAncestor:function(possibleDescendant){for(;possibleDescendant;){if(possibleDescendant.ownerCt===this)return!0;possibleDescendant=possibleDescendant.ownerCt}},getComponent:function(comp){Ext.isObject(comp)&&(comp=comp.getItemId());var c=this.items.get(comp);return c||"number"==typeof comp||(c=this.floatingItems.get(comp)),c},contains:function(comp,deep){var result=!1;return deep?(this.cascade(function(c){if(c.contains&&c.contains(comp))return result=!0,!1}),result):this.items.contains(comp)||this.floatingItems.contains(comp)},nextChild:function(child,selector){var result,me=this,childIndex=me.items.indexOf(child);return-1!==childIndex&&!(result=selector?Ext.ComponentQuery(selector,me.items.items.slice(childIndex+1)):me.items.getAt(childIndex+1))&&me.ownerCt&&(result=me.ownerCt.nextChild(me,selector)),result},prevChild:function(child,selector){var result,me=this,childIndex=me.items.indexOf(child);return-1!==childIndex&&!(result=selector?Ext.ComponentQuery(selector,me.items.items.slice(childIndex+1)):me.items.getAt(childIndex+1))&&me.ownerCt&&(result=me.ownerCt.nextChild(me,selector)),result},enable:function(){this.callParent(arguments);var item,i,itemsToDisable=this.getChildItemsToDisable(),length=itemsToDisable.length;for(i=0;i<length;i++)item=itemsToDisable[i],item.resetDisable&&item.enable();return this},disable:function(){this.callParent(arguments);var item,i,itemsToDisable=this.getChildItemsToDisable(),length=itemsToDisable.length;for(i=0;i<length;i++)item=itemsToDisable[i],!1===item.resetDisable||item.disabled||(item.disable(),item.resetDisable=!0);return this},getChildItemsToDisable:function(){return this.query("[isFormField],button")},beforeDestroy:function(){var c,me=this,items=me.items,floatingItems=me.floatingItems;if(items)for(;c=items.first();)me.doRemove(c,!0);if(floatingItems)for(;c=floatingItems.first();)me.doRemove(c,!0);Ext.destroy(me.layout),me.callParent()}});Ext.define("Ext.container.Container",{extend:"Ext.container.AbstractContainer",alias:"widget.container",alternateClassName:"Ext.Container",getChildByElement:function(el,deep){var item,itemEl,i=0,it=this.getRefItems(),ln=it.length;for(el=Ext.getDom(el);i<ln;i++)if(item=it[i],(itemEl=item.getEl())&&(itemEl.dom===el||itemEl.contains(el)))return deep&&item.getChildByElement?item.getChildByElement(el,deep):item;return null}});Ext.define("Ext.layout.container.Editor",{alias:"layout.editor",extend:"Ext.layout.container.Container",autoSizeDefault:{width:"field",height:"field"},sizePolicies:{$:{$:{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:0},boundEl:{readsWidth:1,readsHeight:0,setsWidth:0,setsHeight:1}},boundEl:{$:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},boundEl:{readsWidth:0,readsHeight:0,setsWidth:1,setsHeight:1}}},getItemSizePolicy:function(item){var me=this,autoSize=me.owner.autoSize,key=autoSize&&autoSize.width,policy=me.sizePolicies;return policy=policy[key]||policy.$,key=autoSize&&autoSize.height,policy=policy[key]||policy.$},calculate:function(ownerContext){var fieldWidth,fieldHeight,me=this,owner=me.owner,autoSize=owner.autoSize;!0===autoSize&&(autoSize=me.autoSizeDefault),autoSize&&(fieldWidth=me.getDimension(owner,autoSize.width,"getWidth",owner.width),fieldHeight=me.getDimension(owner,autoSize.height,"getHeight",owner.height)),ownerContext.childItems[0].setSize(fieldWidth,fieldHeight),ownerContext.setWidth(fieldWidth),ownerContext.setHeight(fieldHeight),ownerContext.setContentSize(fieldWidth||owner.field.getWidth(),fieldHeight||owner.field.getHeight())},getDimension:function(owner,type,getMethod,ownerSize){switch(type){case"boundEl":return owner.boundEl[getMethod]();case"field":return;default:return ownerSize}}});Ext.define("Ext.Editor",{extend:"Ext.container.Container",alias:"widget.editor",requires:["Ext.layout.container.Editor"],layout:"editor",allowBlur:!0,revertInvalid:!0,value:"",alignment:"c-c?",offsets:[0,0],shadow:"frame",constrain:!1,swallowKeys:!0,completeOnEnter:!0,cancelOnEsc:!0,updateEl:!1,focusOnToFront:!1,hidden:!0,baseCls:Ext.baseCSSPrefix+"editor",initComponent:function(){var me=this,field=me.field=Ext.ComponentManager.create(me.field,"textfield");field.inEditor=!0,field.msgTarget=field.msgTarget||"qtip",me.mon(field,{scope:me,blur:me.onFieldBlur,specialkey:me.onSpecialKey}),field.grow&&me.mon(field,"autosize",me.onFieldAutosize,me,{delay:1}),me.floating={constrain:me.constrain},me.items=field,me.callParent(arguments),me.addEvents("beforestartedit","startedit","beforecomplete","complete","canceledit","specialkey")},onFieldAutosize:function(){this.updateLayout()},afterRender:function(ct,position){var me=this,field=me.field,inputEl=field.inputEl;me.callParent(arguments),inputEl&&(inputEl.dom.name="",me.swallowKeys&&inputEl.swallowEvent(["keypress","keydown"]))},onSpecialKey:function(field,event){var me=this,key=event.getKey(),complete=me.completeOnEnter&&key==event.ENTER,cancel=me.cancelOnEsc&&key==event.ESC;(complete||cancel)&&(event.stopEvent(),Ext.defer(function(){complete?me.completeEdit():me.cancelEdit()},1)),me.fireEvent("specialkey",me,field,event)},startEdit:function(el,value){var me=this,field=me.field;me.completeEdit(),me.boundEl=Ext.get(el),value=Ext.isDefined(value)?value:Ext.String.trim(me.boundEl.dom.innerText||me.boundEl.dom.innerHTML),me.rendered||(me.ownerCt&&(me.parentEl=me.ownerCt.el,me.parentEl.position()),me.render(me.parentEl||document.body)),!1!==me.fireEvent("beforestartedit",me,me.boundEl,value)&&(me.startValue=value,me.show(),field.suspendEvents(),field.reset(),field.setValue(value),field.resumeEvents(),me.realign(!0),field.focus([field.getRawValue().length]),field.autoSize&&field.autoSize(),me.editing=!0)},realign:function(autoSize){var me=this;!0===autoSize&&me.updateLayout(),me.alignTo(me.boundEl,me.alignment,me.offsets)},completeEdit:function(remainVisible){var value,me=this,field=me.field;if(me.editing)return field.assertValue&&field.assertValue(),value=me.getValue(),field.isValid()?String(value)===String(me.startValue)&&me.ignoreNoChange?void me.hideEdit(remainVisible):void(!1!==me.fireEvent("beforecomplete",me,value,me.startValue)&&(value=me.getValue(),me.updateEl&&me.boundEl&&me.boundEl.update(value),me.hideEdit(remainVisible),me.fireEvent("complete",me,value,me.startValue))):void(!1!==me.revertInvalid&&me.cancelEdit(remainVisible))},onShow:function(){var me=this;me.callParent(arguments),!1!==me.hideEl&&me.boundEl.hide(),me.fireEvent("startedit",me,me.boundEl,me.startValue)},cancelEdit:function(remainVisible){var value,me=this,startValue=me.startValue,field=me.field;me.editing&&(field&&(value=me.editedValue=me.getValue(),field.suspendEvents(),me.setValue(startValue),field.resumeEvents()),me.hideEdit(remainVisible),me.fireEvent("canceledit",me,value,startValue),delete me.editedValue)},hideEdit:function(remainVisible){!0!==remainVisible&&(this.editing=!1,this.hide())},onFieldBlur:function(field,e){var me=this,target=Ext.Element.getActiveElement();!0===me.allowBlur&&me.editing&&!0!==me.selectSameEditor&&me.completeEdit(),(Ext.fly(target).isFocusable()||target.getAttribute("tabIndex"))&&target.focus()},onHide:function(){var me=this,field=me.field;if(me.editing)return void me.completeEdit();field.hasFocus&&field.triggerBlur&&field.triggerBlur(),field.collapse&&field.collapse(),!1!==me.hideEl&&me.boundEl.show(),me.callParent(arguments)},setValue:function(value){this.field.setValue(value)},getValue:function(){return this.field.getValue()},beforeDestroy:function(){var me=this;Ext.destroy(me.field),delete me.field,delete me.parentEl,delete me.boundEl,me.callParent(arguments)}});Ext.define("Ext.util.KeyMap",{alternateClassName:"Ext.KeyMap",eventName:"keydown",constructor:function(config){var me=this;if(1!==arguments.length||"string"==typeof config||config.dom||config.tagName||config===document||config.isComponent)return void me.legacyConstructor.apply(me,arguments);Ext.apply(me,config),me.bindings=[],me.target.isComponent||(me.target=Ext.get(me.target)),me.binding?me.addBinding(me.binding):config.key&&me.addBinding(config),me.enable()},legacyConstructor:function(el,binding,eventName){var me=this;Ext.apply(me,{target:Ext.get(el),eventName:eventName||me.eventName,bindings:[]}),binding&&me.addBinding(binding),me.enable()},addBinding:function(binding){var i,len,me=this,keyCode=binding.key;if(me.processing&&(me.bindings=bindings.slice(0)),Ext.isArray(binding))for(i=0,len=binding.length;i<len;i++)me.addBinding(binding[i]);else me.bindings.push(Ext.apply({keyCode:me.processKeys(keyCode)},binding))},removeBinding:function(binding){var i,item,keys,me=this,bindings=me.bindings,len=bindings.length;for(me.processing&&(me.bindings=bindings.slice(0)),keys=me.processKeys(binding.key),i=0;i<len;++i)if(item=bindings[i],item.fn===binding.fn&&item.scope===binding.scope&&binding.alt==item.alt&&binding.crtl==item.crtl&&binding.shift==item.shift&&Ext.Array.equals(item.keyCode,keys))return void Ext.Array.erase(me.bindings,i,1)},processKeys:function(keyCode){var key,keys,keyString,len,i,processed=!1;if(Ext.isString(keyCode)){for(keys=[],keyString=keyCode.toUpperCase(),i=0,len=keyString.length;i<len;++i)keys.push(keyString.charCodeAt(i));keyCode=keys,processed=!0}if(Ext.isArray(keyCode)||(keyCode=[keyCode]),!processed)for(i=0,len=keyCode.length;i<len;++i)key=keyCode[i],Ext.isString(key)&&(keyCode[i]=key.toUpperCase().charCodeAt(0));return keyCode},handleTargetEvent:function(){var tagRe=/input|textarea/i;return function(event){var bindings,i,len,target,contentEditable,me=this;if(me.enabled){if(bindings=me.bindings,i=0,len=bindings.length,event=me.processEvent.apply(me||me.processEventScope,arguments),me.ignoreInputFields&&(target=event.target,contentEditable=target.contentEditable,tagRe.test(target.tagName)||""===contentEditable||"true"===contentEditable))return;if(!event.getKey)return event;for(me.processing=!0;i<len;++i)me.processBinding(bindings[i],event);me.processing=!1}}}(),processEvent:Ext.identityFn,processBinding:function(binding,event){if(this.checkModifiers(binding,event)){var i,len,key=event.getKey(),handler=binding.fn||binding.handler,scope=binding.scope||this,keyCode=binding.keyCode,defaultEventAction=binding.defaultEventAction,keydownEvent=new Ext.EventObjectImpl(event);for(i=0,len=keyCode.length;i<len;++i)if(key===keyCode[i]){!0!==handler.call(scope,key,event)&&defaultEventAction&&keydownEvent[defaultEventAction]();break}}},checkModifiers:function(binding,e){for(var val,key,keys=["shift","ctrl","alt"],i=0,len=keys.length;i<len;++i)if(key=keys[i],void 0!==(val=binding[key])&&val!==e[key+"Key"])return!1;return!0},on:function(key,fn,scope){var keyCode,shift,ctrl,alt;Ext.isObject(key)&&!Ext.isArray(key)?(keyCode=key.key,shift=key.shift,ctrl=key.ctrl,alt=key.alt):keyCode=key,this.addBinding({key:keyCode,shift:shift,ctrl:ctrl,alt:alt,fn:fn,scope:scope})},un:function(key,fn,scope){var keyCode,shift,ctrl,alt;Ext.isObject(key)&&!Ext.isArray(key)?(keyCode=key.key,shift=key.shift,ctrl=key.ctrl,alt=key.alt):keyCode=key,this.removeBinding({key:keyCode,shift:shift,ctrl:ctrl,alt:alt,fn:fn,scope:scope})},isEnabled:function(){return this.enabled},enable:function(){var me=this;me.enabled||(me.target.on(me.eventName,me.handleTargetEvent,me),me.enabled=!0)},disable:function(){var me=this;me.enabled&&(me.target.removeListener(me.eventName,me.handleTargetEvent,me),me.enabled=!1)},setDisabled:function(disabled){disabled?this.disable():this.enable()},destroy:function(removeTarget){var me=this,target=me.target;me.bindings=[],me.disable(),!0===removeTarget&&(target.isComponent?target.destroy():target.remove()),delete me.target}});Ext.define("Ext.util.KeyNav",{alternateClassName:"Ext.KeyNav",requires:["Ext.util.KeyMap"],statics:{keyOptions:{left:37,right:39,up:38,down:40,space:32,pageUp:33,pageDown:34,del:46,backspace:8,home:36,end:35,enter:13,esc:27,tab:9}},constructor:function(config){var me=this;if(2===arguments.length)return void me.legacyConstructor.apply(me,arguments);me.setConfig(config)},legacyConstructor:function(el,config){this.setConfig(Ext.apply({target:el},config))},setConfig:function(config){var map,keyCodes,defaultScope,keyName,binding,me=this,keymapCfg={target:config.target,ignoreInputFields:config.ignoreInputFields,eventName:me.getKeyEvent("forceKeyDown"in config?config.forceKeyDown:me.forceKeyDown,config.eventName)};me.map&&me.map.destroy(),config.processEvent&&(keymapCfg.processEvent=config.processEvent,keymapCfg.processEventScope=config.processEventScope||me),config.keyMap?map=me.map=config.keyMap:(map=me.map=new Ext.util.KeyMap(keymapCfg),me.destroyKeyMap=!0),keyCodes=Ext.util.KeyNav.keyOptions,defaultScope=config.scope||me;for(keyName in keyCodes)keyCodes.hasOwnProperty(keyName)&&(binding=config[keyName])&&("function"==typeof binding&&(binding={handler:binding,defaultEventAction:void 0!==config.defaultEventAction?config.defaultEventAction:me.defaultEventAction}),map.addBinding({key:keyCodes[keyName],handler:Ext.Function.bind(me.handleEvent,binding.scope||defaultScope,binding.handler||binding.fn,!0),defaultEventAction:void 0!==binding.defaultEventAction?binding.defaultEventAction:me.defaultEventAction}));map.disable(),config.disabled||map.enable()},handleEvent:function(keyCode,event,handler){return handler.call(this,event)},disabled:!1,defaultEventAction:"stopEvent",forceKeyDown:!1,eventName:"keypress",destroy:function(removeEl){this.destroyKeyMap&&this.map.destroy(removeEl),delete this.map},enable:function(){this.map&&(this.map.enable(),this.disabled=!1)},disable:function(){this.map&&this.map.disable(),this.disabled=!0},setDisabled:function(disabled){this.map.setDisabled(disabled),this.disabled=disabled},getKeyEvent:function(forceKeyDown,configuredEventName){return forceKeyDown||Ext.EventManager.useKeyDown&&!configuredEventName?"keydown":configuredEventName||this.eventName}});Ext.define("Ext.FocusManager",{singleton:!0,alternateClassName:["Ext.FocusMgr"],mixins:{observable:"Ext.util.Observable"},requires:["Ext.AbstractComponent","Ext.Component","Ext.ComponentManager","Ext.ComponentQuery","Ext.util.HashMap","Ext.util.KeyNav"],enabled:!1,focusElementCls:Ext.baseCSSPrefix+"focus-element",focusFrameCls:Ext.baseCSSPrefix+"focus-frame",whitelist:["textfield"],constructor:function(config){var me=this,CQ=Ext.ComponentQuery;me.mixins.observable.constructor.call(me,config),me.addEvents("beforecomponentfocus","componentfocus","disable","enable"),me.focusTask=new Ext.util.DelayedTask(me.handleComponentFocus,me),Ext.override(Ext.AbstractComponent,{onFocus:function(){this.callParent(arguments),me.enabled&&this.hasFocus&&(Array.prototype.unshift.call(arguments,this),me.onComponentFocus.apply(me,arguments))},onBlur:function(){this.callParent(arguments),me.enabled&&!this.hasFocus&&(Array.prototype.unshift.call(arguments,this),me.onComponentBlur.apply(me,arguments))},onDestroy:function(){this.callParent(arguments),me.enabled&&(Array.prototype.unshift.call(arguments,this),me.onComponentDestroy.apply(me,arguments))}}),Ext.override(Ext.Component,{afterHide:function(){this.callParent(arguments),me.enabled&&(Array.prototype.unshift.call(arguments,this),me.onComponentHide.apply(me,arguments))}}),me.keyNav=new Ext.util.KeyNav(Ext.getDoc(),{disabled:!0,scope:me,backspace:me.focusLast,enter:me.navigateIn,esc:me.navigateOut,tab:me.navigateSiblings,space:me.navigateIn,del:me.focusLast,left:me.navigateSiblings,right:me.navigateSiblings,down:me.navigateSiblings,up:me.navigateSiblings}),me.focusData={},me.subscribers=new Ext.util.HashMap,me.focusChain={},Ext.apply(CQ.pseudos,{nextFocus:function(cmps,idx,step){step=step||1,idx=parseInt(idx,10);for(var c,len=cmps.length,i=idx;;){if((i+=step)>=len?i=0:i<0&&(i=len-1),i===idx)return[];if((c=cmps[i]).isFocusable())return[c]}return[]},prevFocus:function(cmps,idx){return this.nextFocus(cmps,idx,-1)},root:function(cmps){for(var c,len=cmps.length,results=[],i=0;i<len;i++)c=cmps[i],c.ownerCt||results.push(c);return results}})},addXTypeToWhitelist:function(xtype){var me=this;if(Ext.isArray(xtype))return void Ext.Array.forEach(xtype,me.addXTypeToWhitelist,me);Ext.Array.contains(me.whitelist,xtype)||me.whitelist.push(xtype)},clearComponent:function(cmp){clearTimeout(this.cmpFocusDelay),cmp.isDestroyed||cmp.blur()},disable:function(){var me=this;me.enabled&&(delete me.options,me.enabled=!1,me.removeDOM(),me.keyNav.disable(),me.fireEvent("disable",me))},enable:function(options){var me=this;!0===options&&(options={focusFrame:!0}),me.options=options=options||{},me.enabled||(me.enabled=!0,me.initDOM(options),me.keyNav.enable(),me.focusEl.focus(),delete me.focusedCmp,me.fireEvent("enable",me))},focusLast:function(e){var me=this;if(me.isWhitelisted(me.focusedCmp))return!0;me.previousFocusedCmp&&me.previousFocusedCmp.focus()},getRootComponents:function(){var CQ=Ext.ComponentQuery,inline=CQ.query(":focusable:root:not([floating])"),floating=CQ.query(":focusable:root[floating]");return floating.sort(function(a,b){return a.el.getZIndex()>b.el.getZIndex()}),floating.concat(inline)},initDOM:function(options){var me=this,cls=me.focusFrameCls,needListeners=Ext.ComponentQuery.query("{getFocusEl()}:not([focusListenerAdded])"),i=0,len=needListeners.length;if(!Ext.isReady)return Ext.onReady(me.initDOM,me);for(;i<len;i++)needListeners[i].addFocusListener();me.focusEl||(me.focusEl=Ext.getBody(),me.focusEl.dom.tabIndex=-1),!me.focusFrame&&options.focusFrame&&(me.focusFrame=Ext.getBody().createChild({cls:cls,children:[{cls:cls+"-top"},{cls:cls+"-bottom"},{cls:cls+"-left"},{cls:cls+"-right"}],style:"top: -100px; left: -100px;"}),me.focusFrame.setVisibilityMode(Ext.Element.DISPLAY),me.focusFrame.hide().setLocalXY(0,0))},isWhitelisted:function(cmp){return cmp&&Ext.Array.some(this.whitelist,function(x){return cmp.isXType(x)})},navigateIn:function(e){var defaultRoot,firstChild,me=this,focusedCmp=me.focusedCmp;if(me.isWhitelisted(focusedCmp))return!0;focusedCmp?(firstChild=focusedCmp.hasFocus?Ext.ComponentQuery.query(">:focusable",focusedCmp)[0]:focusedCmp,firstChild?firstChild.focus():Ext.isFunction(focusedCmp.onClick)&&(e.button=0,focusedCmp.onClick(e),focusedCmp.isVisible(!0)?focusedCmp.focus():me.navigateOut())):(defaultRoot=me.getRootComponents()[0])&&(defaultRoot.getFocusEl()===me.focusEl&&me.focusEl.blur(),defaultRoot.focus())},navigateOut:function(e){var parent,me=this;return me.focusedCmp&&(parent=me.focusedCmp.up(":focusable"))?parent.focus():me.focusEl.focus(),!0},navigateSiblings:function(e,source,parent){var idx,next,focusedCmp,siblings,me=this,src=source||me,key=e.getKey(),EO=Ext.EventObject,goBack=e.shiftKey||key==EO.LEFT||key==EO.UP,checkWhitelist=key==EO.LEFT||key==EO.RIGHT||key==EO.UP||key==EO.DOWN,nextSelector=goBack?"prev":"next";return!(focusedCmp=src.focusedCmp&&src.focusedCmp.comp||src.focusedCmp)&&!parent||(!(!checkWhitelist||!me.isWhitelisted(focusedCmp))||(!focusedCmp||focusedCmp.is(":root")?siblings=me.getRootComponents():(parent=parent||focusedCmp.up())&&(siblings=parent.getRefItems()),siblings&&(idx=focusedCmp?Ext.Array.indexOf(siblings,focusedCmp):-1,(next=Ext.ComponentQuery.query(":"+nextSelector+"Focus("+idx+")",siblings)[0])&&focusedCmp!==next)?(next.focus(),next):void 0))},onComponentBlur:function(cmp,e){var me=this;me.focusedCmp===cmp&&(me.previousFocusedCmp=cmp,delete me.focusedCmp),me.focusFrame&&me.focusFrame.hide()},onComponentFocus:function(cmp,e){var parent,me=this,chain=me.focusChain;if(!cmp.isFocusable()){if(me.clearComponent(cmp),chain[cmp.id])return;return void((parent=cmp.up())&&(chain[cmp.id]=!0,parent.focus()))}me.focusChain={},me.focusTask.delay(10,null,null,[cmp,cmp.getFocusEl()])},handleComponentFocus:function(cmp,focusEl){var cls,ff,box,bt,bl,bw,bh,ft,fb,fl,fr,me=this;if(!1===me.fireEvent("beforecomponentfocus",me,cmp,me.previousFocusedCmp))return void me.clearComponent(cmp);me.focusedCmp=cmp,me.shouldShowFocusFrame(cmp)&&(cls="."+me.focusFrameCls+"-",ff=me.focusFrame,box=(focusEl.dom?focusEl:focusEl.el).getBox(),bt=box.top,bl=box.left,bw=box.width,bh=box.height,ft=ff.child(cls+"top"),fb=ff.child(cls+"bottom"),fl=ff.child(cls+"left"),fr=ff.child(cls+"right"),ft.setWidth(bw).setLocalXY(bl,bt),fb.setWidth(bw).setLocalXY(bl,bt+bh-2),fl.setHeight(bh-2).setLocalXY(bl,bt+2),fr.setHeight(bh-2).setLocalXY(bl+bw-2,bt+2),ff.show()),me.fireEvent("componentfocus",me,cmp,me.previousFocusedCmp)},onComponentHide:function(cmp){var parent,me=this,cmpHadFocus=!1,focusedCmp=me.focusedCmp;focusedCmp&&(cmpHadFocus=cmp.hasFocus||cmp.isContainer&&cmp.isAncestor(me.focusedCmp)),me.clearComponent(cmp),cmpHadFocus&&(parent=cmp.up(":focusable"))?parent.focus():me.focusEl.focus()},onComponentDestroy:function(){},removeDOM:function(){var me=this;me.enabled||me.subscribers.length||(Ext.destroy(me.focusFrame),delete me.focusEl,delete me.focusFrame)},removeXTypeFromWhitelist:function(xtype){var me=this;if(Ext.isArray(xtype))return void Ext.Array.forEach(xtype,me.removeXTypeFromWhitelist,me);Ext.Array.remove(me.whitelist,xtype)},setupSubscriberKeys:function(container,keys){var me=this,el=container.getFocusEl(),scope=keys.scope,handlers={backspace:me.focusLast,enter:me.navigateIn,esc:me.navigateOut,scope:me},navSiblings=function(e){return me.focusedCmp===container?me.navigateSiblings(e,me,container):me.navigateSiblings(e)};return Ext.iterate(keys,function(key,cb){handlers[key]=function(e){var ret=navSiblings(e);return!(!Ext.isFunction(cb)||!0!==cb.call(scope||container,e,ret))||ret}},me),new Ext.util.KeyNav(el,handlers)},shouldShowFocusFrame:function(cmp){var me=this,opts=me.options||{};return!(!me.focusFrame||!cmp)&&(!!opts.focusFrame||!!me.focusData[cmp.id].focusFrame)}});Ext.define("Ext.Img",{extend:"Ext.Component",alias:["widget.image","widget.imagecomponent"],autoEl:"img",baseCls:Ext.baseCSSPrefix+"img",src:"",alt:"",title:"",imgCls:"",ariaRole:"img",initComponent:function(){this.glyph&&(this.autoEl="div"),this.callParent()},getElConfig:function(){var img,glyphParts,me=this,autoEl=me.autoEl,config=me.callParent(),glyphFontFamily=Ext._glyphFontFamily,glyph=me.glyph;return"img"===autoEl||Ext.isObject(autoEl)&&"img"===autoEl.tag?img=config:me.glyph?("string"==typeof glyph&&(glyphParts=glyph.split("@"),glyph=glyphParts[0],glyphFontFamily=glyphParts[1]),config.html="&#"+glyph+";",glyphFontFamily&&(config.style="font-family:"+glyphFontFamily)):config.cn=[img={tag:"img",role:me.ariaRole,id:me.id+"-img"}],img&&(me.imgCls&&(img.cls=(img.cls?img.cls+" ":"")+me.imgCls),img.src=me.src||Ext.BLANK_IMAGE_URL),me.alt&&((img||config).alt=me.alt),me.title&&((img||config).title=me.title),config},onRender:function(){var el,me=this,autoEl=me.autoEl;me.callParent(arguments),el=me.el,"img"===autoEl||Ext.isObject(autoEl)&&"img"===autoEl.tag?me.imgEl=el:me.imgEl=el.getById(me.id+"-img")},onDestroy:function(){Ext.destroy(this.imgEl),this.imgEl=null,this.callParent()},setSrc:function(src){var me=this,imgEl=me.imgEl;me.src=src,imgEl&&(imgEl.dom.src=src||Ext.BLANK_IMAGE_URL)},setGlyph:function(glyph){var glyphParts,dom,me=this,glyphFontFamily=Ext._glyphFontFamily;glyph!=me.glyph&&("string"==typeof glyph&&(glyphParts=glyph.split("@"),glyph=glyphParts[0],glyphFontFamily=glyphParts[1]),dom=me.el.dom,dom.innerHTML="&#"+glyph+";",glyphFontFamily&&(dom.style="font-family:"+glyphFontFamily))}});Ext.define("Ext.util.Bindable",{bindStore:function(store,initial,propertyName){propertyName=propertyName||"store";var me=this,oldStore=me[propertyName];return!initial&&oldStore&&(me.onUnbindStore(oldStore,initial,propertyName),store!==oldStore&&oldStore.autoDestroy?oldStore.destroyStore():me.unbindStoreListeners(oldStore)),store&&(store=Ext.data.StoreManager.lookup(store),me.bindStoreListeners(store),me.onBindStore(store,initial,propertyName)),me[propertyName]=store||null,me},getStore:function(){return this.store},unbindStoreListeners:function(store){var listeners=this.storeListeners;listeners&&store.un(listeners)},bindStoreListeners:function(store){var me=this,listeners=Ext.apply({},me.getStoreListeners(store));listeners.scope||(listeners.scope=me),me.storeListeners=listeners,store.on(listeners)},getStoreListeners:Ext.emptyFn,onUnbindStore:Ext.emptyFn,onBindStore:Ext.emptyFn});Ext.define("Ext.LoadMask",{extend:"Ext.Component",alias:"widget.loadmask",mixins:{floating:"Ext.util.Floating",bindable:"Ext.util.Bindable"},uses:["Ext.data.StoreManager"],msg:"Loading...",msgCls:Ext.baseCSSPrefix+"mask-loading",maskCls:Ext.baseCSSPrefix+"mask",useMsg:!0,useTargetEl:!1,baseCls:Ext.baseCSSPrefix+"mask-msg",ariaRole:"presentation",childEls:["msgEl","msgTextEl"],renderTpl:['<div id="{id}-msgEl" role="{role}"','<tpl if="ariaAttr"> {ariaAttr}</tpl>',' class="{[values.$comp.msgCls]} ',Ext.baseCSSPrefix,'mask-msg-inner{childElCls}">','<div id="{id}-msgTextEl" class="',Ext.baseCSSPrefix,"mask-msg-text",'{childElCls}"></div>',"</div>"],floating:{shadow:"frame"},focusOnToFront:!1,bringParentToFront:!1,constructor:function(config){var comp,me=this;2===arguments.length?(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.LoadMask: LoadMask now uses a standard 1 arg constructor: use the target config"),comp=config,config=arguments[1]):comp=config.target,comp.isComponent||(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.LoadMask: LoadMask for elements has been deprecated, use Ext.dom.Element.mask & Ext.dom.Element.unmask"),comp=Ext.get(comp),this.isElement=!0),me.ownerCt=comp,this.isElement||me.bindComponent(comp),me.callParent([config]),me.store&&me.bindStore(me.store,!0)},bindComponent:function(comp){var me=this,listeners={scope:this,resize:me.sizeMask,added:me.onComponentAdded,removed:me.onComponentRemoved};comp.floating?(listeners.move=me.sizeMask,me.activeOwner=comp):comp.ownerCt?me.onComponentAdded(comp.ownerCt):me.preventBringToFront=!0,me.mon(comp,listeners),me.mon(me.hierarchyEventSource,{show:me.onContainerShow,hide:me.onContainerHide,expand:me.onContainerExpand,collapse:me.onContainerCollapse,scope:me})},onComponentAdded:function(owner){var me=this;delete me.activeOwner,me.floatParent=owner,owner.floating||(owner=owner.up("[floating]")),owner?(me.activeOwner=owner,me.mon(owner,"move",me.sizeMask,me)):me.preventBringToFront=!0,owner=me.floatParent.ownerCt,me.rendered&&me.isVisible()&&owner&&(me.floatOwner=owner,me.mon(owner,"afterlayout",me.sizeMask,me,{single:!0}))},onComponentRemoved:function(owner){var me=this,activeOwner=me.activeOwner,floatOwner=me.floatOwner;activeOwner&&me.mun(activeOwner,"move",me.sizeMask,me),floatOwner&&me.mun(floatOwner,"afterlayout",me.sizeMask,me),delete me.activeOwner,delete me.floatOwner},afterRender:function(){this.callParent(arguments),this.container=this.floatParent.getContentTarget()},onContainerShow:function(container){this.isActiveContainer(container)&&this.onComponentShow()},onContainerHide:function(container){this.isActiveContainer(container)&&this.onComponentHide()},onContainerExpand:function(container){this.isActiveContainer(container)&&this.onComponentShow()},onContainerCollapse:function(container){this.isActiveContainer(container)&&this.onComponentHide()},isActiveContainer:function(container){return this.isDescendantOf(container)},onComponentHide:function(){var me=this;me.rendered&&me.isVisible()&&(me.hide(),me.showNext=!0)},onComponentShow:function(){this.showNext&&this.show(),delete this.showNext},sizeMask:function(){var target,me=this;me.rendered&&me.isVisible()&&(me.center(),target=me.getMaskTarget(),me.getMaskEl().show().setSize(target.getSize()).alignTo(target,"tl-tl"))},bindStore:function(store,initial){var me=this;me.mixins.bindable.bindStore.apply(me,arguments),(store=me.store)&&store.isLoading()&&me.onBeforeLoad()},getStoreListeners:function(store){var load=this.onLoad,beforeLoad=this.onBeforeLoad,result={cachemiss:beforeLoad,cachefilled:load};return store.proxy.isSynchronous||(result.beforeLoad=beforeLoad,result.load=load),result},onDisable:function(){this.callParent(arguments),this.loading&&this.onLoad()},getOwner:function(){return this.ownerCt||this.floatParent},getMaskTarget:function(){var owner=this.getOwner();return this.useTargetEl?owner.getTargetEl():owner.getEl()},onBeforeLoad:function(){var origin,me=this,owner=me.getOwner();me.disabled||(me.loading=!0,owner.componentLayoutCounter?me.maybeShow():(origin=owner.afterComponentLayout,owner.afterComponentLayout=function(){owner.afterComponentLayout=origin,origin.apply(owner,arguments),me.maybeShow()}))},maybeShow:function(){var me=this,owner=me.getOwner();owner.isVisible(!0)?me.loading&&owner.rendered&&me.show():me.showNext=!0},getMaskEl:function(){var me=this;return me.maskEl||(me.maskEl=me.el.insertSibling({role:"presentation",cls:me.maskCls,style:{zIndex:me.el.getStyle("zIndex")-2}},"before"))},onShow:function(){var me=this,msgEl=me.msgEl;me.callParent(arguments),me.loading=!0,me.useMsg?(msgEl.show(),me.msgTextEl.update(me.msg)):msgEl.parent().hide()},hide:function(){return this.isElement?(this.ownerCt.unmask(),void this.fireEvent("hide",this)):(delete this.showNext,this.callParent(arguments))},onHide:function(){this.callParent(),this.getMaskEl().hide()},show:function(){return this.isElement?(this.ownerCt.mask(this.useMsg?this.msg:"",this.msgCls),void this.fireEvent("show",this)):this.callParent(arguments)},afterShow:function(){this.callParent(arguments),this.sizeMask()},setZIndex:function(index){var me=this,owner=me.activeOwner;return owner&&(index=parseInt(owner.el.getStyle("zIndex"),10)+1),me.getMaskEl().setStyle("zIndex",index-1),me.mixins.floating.setZIndex.apply(me,arguments)},onLoad:function(){this.loading=!1,this.hide()},onDestroy:function(){var me=this;me.isElement&&me.ownerCt.unmask(),Ext.destroy(me.maskEl),me.callParent()}});Ext.define("Ext.data.association.Association",{alternateClassName:"Ext.data.Association",primaryKey:"id",associationKeyFunction:null,defaultReaderType:"json",isAssociation:!0,initialConfig:null,statics:{AUTO_ID:1e3,create:function(association){switch(Ext.isString(association)&&(association={type:association}),association.type){case"belongsTo":return new Ext.data.association.BelongsTo(association);case"hasMany":return new Ext.data.association.HasMany(association);case"hasOne":return new Ext.data.association.HasOne(association);default:Ext.Error.raise('Unknown Association type: "'+association.type+'"')}return association}},constructor:function(config){Ext.apply(this,config);var keyReIdx,me=this,types=Ext.ModelManager.types,ownerName=config.ownerModel,associatedName=config.associatedModel,ownerModel=types[ownerName],associatedModel=types[associatedName],associationKey=config.associationKey;associationKey&&(keyReIdx=String(associationKey).search(/[\[\.]/))>=0&&(me.associationKeyFunction=Ext.functionFactory("obj","return obj"+(keyReIdx>0?".":"")+associationKey)),me.initialConfig=config,void 0===ownerModel&&Ext.Error.raise("The configured ownerModel was not valid (you tried "+ownerName+")"),void 0===associatedModel&&Ext.Error.raise("The configured associatedModel was not valid (you tried "+associatedName+")"),me.ownerModel=ownerModel,me.associatedModel=associatedModel,Ext.applyIf(me,{ownerName:ownerName,associatedName:associatedName}),me.associationId="association"+ ++me.statics().AUTO_ID},getReader:function(){var me=this,reader=me.reader,model=me.associatedModel;return reader&&(Ext.isString(reader)&&(reader={type:reader}),reader.isReader?reader.setModel(model):Ext.applyIf(reader,{model:model,type:me.defaultReaderType}),me.reader=Ext.createByAlias("reader."+reader.type,reader)),me.reader||null}});Ext.define("Ext.ModelManager",{extend:"Ext.AbstractManager",alternateClassName:"Ext.ModelMgr",requires:["Ext.data.association.Association"],singleton:!0,typeName:"mtype",associationStack:[],registerType:function(name,config){var model,proto=config.prototype;return proto&&proto.isModel?model=config:(config.extend||(config.extend="Ext.data.Model"),model=Ext.define(name,config)),this.types[name]=model,model},unregisterType:function(name){delete this.types[name]},onModelDefined:function(model){var association,i,created,stack=this.associationStack,length=stack.length,create=[];for(i=0;i<length;i++)association=stack[i],association.associatedModel==model.modelName&&create.push(association);for(i=0,length=create.length;i<length;i++)created=create[i],this.types[created.ownerModel].prototype.associations.add(Ext.data.association.Association.create(created)),Ext.Array.remove(stack,created)},registerDeferredAssociation:function(association){this.associationStack.push(association)},getModel:function(id){var model=id;return"string"==typeof model&&(model=this.types[model]),model},create:function(config,name,id){return new("function"==typeof name?name:this.types[name||config.name])(config,id)}},function(){Ext.regModel=function(){return Ext.isDefined(Ext.global.console)&&Ext.global.console.warn('Ext.regModel has been deprecated. Models can now be created by extending Ext.data.Model: Ext.define("MyModel", {extend: "Ext.data.Model", fields: []});.'),this.ModelManager.registerType.apply(this.ModelManager,arguments)}});Ext.define("Ext.layout.component.ProgressBar",{alias:["layout.progressbar"],extend:"Ext.layout.component.Auto",type:"progressbar",beginLayout:function(ownerContext){var i,textEls,me=this;if(me.callParent(arguments),!ownerContext.textEls)if(textEls=me.owner.textEl,textEls.isComposite)for(ownerContext.textEls=[],textEls=textEls.elements,i=textEls.length;i--;)ownerContext.textEls[i]=ownerContext.getEl(Ext.get(textEls[i]));else ownerContext.textEls=[ownerContext.getEl("textEl")]},calculate:function(ownerContext){var i,textEls,width,me=this;if(me.callParent(arguments),Ext.isNumber(width=ownerContext.getProp("width")))for(width-=ownerContext.getBorderInfo().width,textEls=ownerContext.textEls,i=textEls.length;i--;)textEls[i].setWidth(width);else me.done=!1}});Ext.define("Ext.ProgressBar",{extend:"Ext.Component",alias:"widget.progressbar",requires:["Ext.Template","Ext.CompositeElement","Ext.TaskManager","Ext.layout.component.ProgressBar"],uses:["Ext.fx.Anim"],baseCls:Ext.baseCSSPrefix+"progress",animate:!1,text:"",waitTimer:null,childEls:["bar"],renderTpl:['<tpl if="internalText">','<div class="{baseCls}-text {baseCls}-text-back">{text}</div>',"</tpl>",'<div id="{id}-bar" class="{baseCls}-bar {baseCls}-bar-{ui}" role="presentation" style="width:{percentage}%">','<tpl if="internalText">','<div class="{baseCls}-text">',"<div>{text}</div>","</div>","</tpl>","</div>"],componentLayout:"progressbar",ariaRole:"progressbar",initComponent:function(){this.callParent(),this.addEvents("update")},initRenderData:function(){var me=this;return Ext.apply(me.callParent(),{internalText:!me.hasOwnProperty("textEl"),text:me.text||"&#160;",percentage:me.value?100*me.value:0})},onRender:function(){var me=this;me.callParent(arguments),me.textEl?(me.textEl=Ext.get(me.textEl),me.updateText(me.text)):me.textEl=me.el.select("."+me.baseCls+"-text")},updateProgress:function(value,text,animate){var me=this,oldValue=me.value;return me.value=value||0,text&&me.updateText(text),me.rendered&&!me.isDestroyed&&(!0===animate||!1!==animate&&me.animate?(me.bar.stopAnimation(),me.bar.animate(Ext.apply({from:{width:100*oldValue+"%"},to:{width:100*me.value+"%"}},me.animate))):me.bar.setStyle("width",100*me.value+"%")),me.fireEvent("update",me,me.value,text),me},updateText:function(text){var me=this;return me.text=text,me.rendered&&me.textEl.update(me.text),me},applyText:function(text){this.updateText(text)},getText:function(){return this.text},wait:function(o){var scope,me=this;return me.waitTimer||(scope=me,o=o||{},me.updateText(o.text),me.waitTimer=Ext.TaskManager.start({run:function(i){var inc=o.increment||10;i-=1,me.updateProgress(100/inc*((i+inc)%inc+1)*.01,null,o.animate)},interval:o.interval||1e3,duration:o.duration,onStop:function(){o.fn&&o.fn.apply(o.scope||me),me.reset()},scope:scope})),me},isWaiting:function(){return null!==this.waitTimer},reset:function(hide){var me=this;return me.updateProgress(0),me.clearTimer(),!0===hide&&me.hide(),me},clearTimer:function(){var me=this;me.waitTimer&&(me.waitTimer.onStop=null,Ext.TaskManager.stop(me.waitTimer),me.waitTimer=null)},onDestroy:function(){var me=this,bar=me.bar;me.clearTimer(),me.rendered&&(me.textEl.isComposite&&me.textEl.clear(),Ext.destroyMembers(me,"textEl","progressBar"),bar&&me.animate&&bar.stopAnimation()),me.callParent()}});Ext.define("Ext.ShadowPool",{singleton:!0,requires:["Ext.DomHelper"],markup:function(){return Ext.String.format('<div class="{0}{1}-shadow" role="presentation"></div>',Ext.baseCSSPrefix,Ext.isIE&&!Ext.supports.CSS3BoxShadow?"ie":"css")}(),shadows:[],pull:function(){var sh=this.shadows.shift();return sh||(sh=Ext.get(Ext.DomHelper.insertHtml("beforeBegin",document.body.firstChild,this.markup)),sh.autoBoxAdjust=!1,sh.dom.setAttribute("data-sticky",!0)),sh},push:function(sh){this.shadows.push(sh)},reset:function(){var s,shadows=[].concat(this.shadows),sLen=shadows.length;for(s=0;s<sLen;s++)shadows[s].remove();this.shadows=[]}});Ext.define("Ext.Shadow",{requires:["Ext.ShadowPool"],localXYNames:{get:"getLocalXY",set:"setLocalXY"},constructor:function(config){var adjusts,offset,rad,me=this;switch(Ext.apply(me,config),Ext.isString(me.mode)||(me.mode=me.defaultMode),offset=me.offset,rad=Math.floor(offset/2),me.opacity=50,me.mode.toLowerCase()){case"drop":adjusts=Ext.supports.CSS3BoxShadow?{t:offset,l:offset,h:-offset,w:-offset}:{t:-rad,l:-rad,h:-rad,w:-rad};break;case"sides":adjusts=Ext.supports.CSS3BoxShadow?{t:offset,l:0,h:-offset,w:0}:{t:-(1+rad),l:1+rad-2*offset,h:-1,w:rad-1};break;case"frame":adjusts=Ext.supports.CSS3BoxShadow?{t:0,l:0,h:0,w:0}:{t:1+rad-2*offset,l:1+rad-2*offset,h:offset-rad-1,w:offset-rad-1};break;case"bottom":adjusts=Ext.supports.CSS3BoxShadow?{t:offset,l:0,h:-offset,w:0}:{t:offset,l:0,h:0,w:0}}me.adjusts=adjusts},getShadowSize:function(){var me=this,offset=me.el?me.offset:0,result=[offset,offset,offset,offset],mode=me.mode.toLowerCase();return me.el&&"frame"!==mode&&(result[0]=0,"drop"==mode&&(result[3]=0)),result},offset:4,defaultMode:"drop",boxShadowProperty:function(){var property="boxShadow",style=document.documentElement.style;return"boxShadow"in style||("WebkitBoxShadow"in style?property="WebkitBoxShadow":"MozBoxShadow"in style&&(property="MozBoxShadow")),property}(),show:function(target){var index,xy,me=this;target=Ext.get(target),index=parseInt(target.getStyle("z-index"),10)-1||0,xy=target[me.localXYNames.get](),me.el||(me.el=Ext.ShadowPool.pull(),me.fixed?me.el.dom.style.position="fixed":me.el.dom.style.position="",me.el.dom.nextSibling!=target.dom&&me.el.insertBefore(target)),me.el.setStyle("z-index",me.zIndex||index),Ext.isIE&&!Ext.supports.CSS3BoxShadow&&(me.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity="+me.opacity+") progid:DXImageTransform.Microsoft.Blur(pixelradius="+me.offset+")"),me.realign(xy[0],xy[1],target.dom.offsetWidth,target.dom.offsetHeight),me.el.dom.style.display="block"},isVisible:function(){return!!this.el},realign:function(l,t,targetWidth,targetHeight){if(this.el){var shadowWidth,shadowHeight,sws,shs,adjusts=this.adjusts,el=this.el,targetStyle=el.dom.style;el[this.localXYNames.set](l+adjusts.l,t+adjusts.t),shadowWidth=Math.max(targetWidth+adjusts.w,0),shadowHeight=Math.max(targetHeight+adjusts.h,0),sws=shadowWidth+"px",shs=shadowHeight+"px",targetStyle.width==sws&&targetStyle.height==shs||(targetStyle.width=sws,targetStyle.height=shs,Ext.supports.CSS3BoxShadow&&(targetStyle[this.boxShadowProperty]="0 0 "+(this.offset+2)+"px #888"))}},hide:function(){var me=this;me.el&&(me.el.dom.style.display="none",Ext.ShadowPool.push(me.el),delete me.el)},setZIndex:function(z){this.zIndex=z,this.el&&this.el.setStyle("z-index",z)},setOpacity:function(opacity){this.el&&(Ext.isIE&&!Ext.supports.CSS3BoxShadow&&(opacity=Math.floor(100*opacity/2)/100),this.opacity=opacity,this.el.setOpacity(opacity))}});Ext.define("Ext.app.EventDomain",{requires:["Ext.util.Event"],statics:{instances:{}},isEventDomain:!0,constructor:function(){var me=this;Ext.app.EventDomain.instances[me.type]=me,me.bus={},me.monitoredClasses=[]},dispatch:function(target,ev,args){var selector,controllers,id,events,event,i,ln,me=this,bus=me.bus,selectors=bus[ev];if(!selectors)return!0;for(selector in selectors)if(selectors.hasOwnProperty(selector)&&me.match(target,selector)){controllers=selectors[selector];for(id in controllers)if(controllers.hasOwnProperty(id))for(events=controllers[id],i=0,ln=events.length;i<ln;i++)if(event=events[i],!1===event.fire.apply(event,args))return!1}return!0},listen:function(selectors,controller){var i,tree,list,selector,options,listener,scope,event,listeners,ev,me=this,bus=me.bus,idProperty=me.idProperty,monitoredClasses=me.monitoredClasses,monitoredClassesCount=monitoredClasses.length;for(selector in selectors)if(selectors.hasOwnProperty(selector)&&(listeners=selectors[selector])){idProperty&&(/^[*#]/.test(selector)||Ext.Error.raise("Selectors containing id should begin with #"),selector="*"===selector?selector:selector.substring(1));for(ev in listeners)if(listeners.hasOwnProperty(ev)){for(options=null,listener=listeners[ev],scope=controller,event=new Ext.util.Event(controller,ev),Ext.isObject(listener)&&(options=listener,listener=options.fn,scope=options.scope||controller,delete options.fn,delete options.scope),"string"==typeof listener&&(listener=scope[listener]),event.addListener(listener,scope,options),i=monitoredClassesCount;i-- >0;)monitoredClasses[i].hasListeners._incr_(ev);tree=bus[ev]||(bus[ev]={}),tree=tree[selector]||(tree[selector]={}),list=tree[controller.id]||(tree[controller.id]=[]),list.push(event)}}},match:function(target,selector){var idProperty=this.idProperty;return!!idProperty&&("*"===selector||target[idProperty]===selector)},monitor:function(observable){var domain=this,prototype=observable.isInstance?observable:observable.prototype,fireEventArgs=prototype.fireEventArgs;domain.monitoredClasses.push(observable),prototype.fireEventArgs=function(ev,args){var ret=fireEventArgs.apply(this,arguments);return!1!==ret&&(ret=domain.dispatch(this,ev,args)),ret}},unlisten:function(controllerId){var controllers,ev,selector,selectors,bus=this.bus;for(ev in bus)if(bus.hasOwnProperty(ev)&&(selectors=bus[ev]))for(selector in selectors)controllers=selectors[selector],delete controllers[controllerId]}});Ext.define("Ext.app.domain.Component",{extend:"Ext.app.EventDomain",singleton:!0,requires:["Ext.Component"],type:"component",constructor:function(){var me=this;me.callParent(),me.monitor(Ext.Component)},match:function(target,selector){return target.is(selector)}});Ext.define("Ext.app.EventBus",{singleton:!0,requires:["Ext.app.domain.Component"],constructor:function(){var me=this,domains=Ext.app.EventDomain.instances;me.callParent(),me.domains=domains,me.bus=domains.component.bus},control:function(selectors,controller){return this.domains.component.listen(selectors,controller)},listen:function(to,controller){var domain,domains=this.domains;for(domain in to)to.hasOwnProperty(domain)&&domains[domain].listen(to[domain],controller)},unlisten:function(controllerId){var domain,domains=Ext.app.EventDomain.instances;for(domain in domains)domains[domain].unlisten(controllerId)}});Ext.define("Ext.data.StoreManager",{extend:"Ext.util.MixedCollection",alternateClassName:["Ext.StoreMgr","Ext.data.StoreMgr","Ext.StoreManager"],singleton:!0,uses:["Ext.data.ArrayStore"],register:function(){for(var s,i=0;s=arguments[i];i++)this.add(s)},unregister:function(){for(var s,i=0;s=arguments[i];i++)this.remove(this.lookup(s))},lookup:function(store){if(Ext.isArray(store)){var i,len,fields=["field1"],expand=!Ext.isArray(store[0]),data=store;if(expand)for(data=[],i=0,len=store.length;i<len;++i)data.push([store[i]]);else for(i=2,len=store[0].length;i<=len;++i)fields.push("field"+i);return new Ext.data.ArrayStore({data:data,fields:fields,autoDestroy:!0,autoCreated:!0,expanded:expand})}return Ext.isString(store)?this.get(store):Ext.data.AbstractStore.create(store)},getKey:function(o){return o.storeId}},function(){Ext.regStore=function(name,config){var store;return Ext.isObject(name)?config=name:config.storeId=name,store=config instanceof Ext.data.Store?config:new Ext.data.Store(config),Ext.data.StoreManager.register(store)},Ext.getStore=function(name){return Ext.data.StoreManager.lookup(name)}});Ext.define("Ext.app.domain.Global",{extend:"Ext.app.EventDomain",singleton:!0,type:"global",constructor:function(){var me=this;me.callParent(),me.monitor(Ext.globalEvents)},listen:function(listeners,controller){this.callParent([{global:listeners},controller])},match:function(){return!0}});Ext.define("Ext.data.ResultSet",{loaded:!0,count:0,total:0,success:!1,constructor:function(config){Ext.apply(this,config),this.totalRecords=this.total,void 0===config.count&&(this.count=this.records.length)}});Ext.define("Ext.data.reader.Reader",{requires:["Ext.data.ResultSet","Ext.XTemplate"],alternateClassName:["Ext.data.Reader","Ext.data.DataReader"],mixins:{observable:"Ext.util.Observable"},totalProperty:"total",successProperty:"success",root:"",implicitIncludes:!0,readRecordsOnFailure:!0,isReader:!0,applyDefaults:!0,lastFieldGeneration:null,constructor:function(config){var me=this;me.mixins.observable.constructor.call(me,config),me.model=Ext.ModelManager.getModel(me.model),me.model&&me.model.prototype.fields&&me.buildExtractors(),this.addEvents("exception")},setModel:function(model,setOnProxy){var me=this,oldModel=me.model,force=!0;model=me.model=Ext.ModelManager.getModel(model),model&&oldModel===model&&(force=me.lastFieldGeneration!==model.prototype.fields.generation),model&&me.buildExtractors(force),setOnProxy&&me.proxy&&me.proxy.setModel(model,!0)},read:function(response){var data;return response&&(data=response.responseText?this.getResponseData(response):this.readRecords(response)),data||this.nullResultSet},readRecords:function(data){var success,recordCount,records,root,total,value,message,me=this;return me.lastFieldGeneration!==me.model.prototype.fields.generation&&me.buildExtractors(!0),me.rawData=data,data=me.getData(data),success=!0,recordCount=0,records=[],me.successProperty&&(!1!==(value=me.getSuccess(data))&&"false"!==value||(success=!1)),me.messageProperty&&(message=me.getMessage(data)),(me.readRecordsOnFailure||success)&&(root=Ext.isArray(data)?data:me.getRoot(data),root&&(total=root.length),me.totalProperty&&(value=parseInt(me.getTotal(data),10),isNaN(value)||(total=value)),root&&(records=me.extractData(root),recordCount=records.length)),new Ext.data.ResultSet({total:total||recordCount,count:recordCount,records:records,success:success,message:message})},extractData:function(root){var convertedValues,node,record,i,me=this,Model=me.model,length=root.length,records=new Array(length);for(!root.length&&Ext.isObject(root)&&(root=[root],length=1),i=0;i<length;i++)node=root[i],node.isModel?records[i]=node:(records[i]=record=new Model(void 0,me.getId(node),node,convertedValues={}),record.phantom=!1,me.convertRecordData(convertedValues,node,record),me.implicitIncludes&&record.associations.length&&me.readAssociated(record,node));return records},readAssociated:function(record,data){for(var association,associationData,proxy,reader,associations=record.associations.items,i=0,length=associations.length;i<length;i++)association=associations[i],(associationData=this.getAssociatedDataRoot(data,association.associationKeyFunction||association.associationKey||association.name))&&(reader=association.getReader(),reader||(proxy=association.associatedModel.getProxy(),reader=proxy?proxy.getReader():new this.constructor({model:association.associatedName})),association.read(record,reader,associationData))},getAssociatedDataRoot:function(data,associationName){return Ext.isFunction(associationName)?associationName(data):data[associationName]},getFields:function(){return this.model.prototype.fields.items},getData:Ext.identityFn,getRoot:Ext.identityFn,getResponseData:function(response){Ext.Error.raise("getResponseData must be implemented in the Ext.data.reader.Reader subclass")},onMetaChange:function(meta){var newModel,clientIdProperty,me=this,fields=meta.fields||me.getFields();me.metaData=meta,me.root=meta.root||me.root,me.idProperty=meta.idProperty||me.idProperty,me.totalProperty=meta.totalProperty||me.totalProperty,me.successProperty=meta.successProperty||me.successProperty,me.messageProperty=meta.messageProperty||me.messageProperty,clientIdProperty=meta.clientIdProperty,me.model?(me.model.setFields(fields,me.idProperty,clientIdProperty),me.setModel(me.model,!0)):(newModel=Ext.define("Ext.data.reader.Json-Model"+Ext.id(),{extend:"Ext.data.Model",fields:fields,clientIdProperty:clientIdProperty}),me.idProperty&&(newModel.idProperty=me.idProperty),me.setModel(newModel,!0))},getIdProperty:function(){var idField=this.model.prototype.idField,idProperty=this.idProperty;return!idProperty&&idField&&null==(idProperty=idField.mapping)&&(idProperty=idField.name),idProperty},buildExtractors:function(force){var accessor,me=this,idProp=me.getIdProperty(),totalProp=me.totalProperty,successProp=me.successProperty,messageProp=me.messageProperty;!0===force&&delete me.convertRecordData,me.convertRecordData||(totalProp&&(me.getTotal=me.createAccessor(totalProp)),successProp&&(me.getSuccess=me.createAccessor(successProp)),messageProp&&(me.getMessage=me.createAccessor(messageProp)),idProp?(accessor=me.createAccessor(idProp),me.getId=function(record){var id=accessor.call(me,record);return void 0===id||""===id?null:id}):me.getId=function(){return null},me.convertRecordData=me.buildRecordDataExtractor(),me.lastFieldGeneration=me.model.prototype.fields.generation)},recordDataExtractorTemplate:["var me = this\n","    ,fields = me.model.prototype.fields\n","    ,value\n","    ,internalId\n",'<tpl for="fields">','    ,__field{#} = fields.map["{name}"]\n',"</tpl>",";\n","return function(dest, source, record) {\n",'<tpl for="fields">','{% var fieldAccessExpression =  this.createFieldAccessExpression(values, "__field" + xindex, "source");',"   if (fieldAccessExpression) { %}",'    value = {[ this.createFieldAccessExpression(values, "__field" + xindex, "source") ]};\n','<tpl if="hasCustomConvert">','    dest["{name}"] = value === undefined ? __field{#}.convert(__field{#}.defaultValue, record) : __field{#}.convert(value, record);\n','<tpl elseif="defaultValue !== undefined">',"    if (value === undefined) {\n","        if (me.applyDefaults) {\n",'<tpl if="convert">','            dest["{name}"] = __field{#}.convert(__field{#}.defaultValue, record);\n',"<tpl else>",'            dest["{name}"] = __field{#}.defaultValue\n',"</tpl>","        };\n","    } else {\n",'<tpl if="convert">','        dest["{name}"] = __field{#}.convert(value, record);\n',"<tpl else>",'        dest["{name}"] = value;\n',"</tpl>","    };\n","<tpl else>","    if (value !== undefined) {\n",'<tpl if="convert">','        dest["{name}"] = __field{#}.convert(value, record);\n',"<tpl else>",'        dest["{name}"] = value;\n',"</tpl>","    }\n","</tpl>","{% } else { %}",'<tpl if="defaultValue !== undefined">','<tpl if="convert">','    dest["{name}"] = __field{#}.convert(__field{#}.defaultValue, record);\n',"<tpl else>",'    dest["{name}"] = __field{#}.defaultValue\n',"</tpl>","</tpl>","{% } %}","</tpl>",'<tpl if="clientIdProp">','    if (record && (internalId = {[ this.createFieldAccessExpression({mapping: values.clientIdProp}, null, "source") ]})) {\n','        record.{["internalId"]} = internalId;\n',"    }\n","</tpl>","};"],buildRecordDataExtractor:function(){var me=this,modelProto=me.model.prototype,templateData={clientIdProp:modelProto.clientIdProperty,fields:modelProto.fields.items};return me.recordDataExtractorTemplate.createFieldAccessExpression=function(){return me.createFieldAccessExpression.apply(me,arguments)},Ext.functionFactory(me.recordDataExtractorTemplate.apply(templateData)).call(me)},destroyReader:function(){var me=this;delete me.proxy,delete me.model,delete me.convertRecordData,delete me.getId,delete me.getTotal,delete me.getSuccess,delete me.getMessage}},function(){var proto=this.prototype;Ext.apply(proto,{nullResultSet:new Ext.data.ResultSet({total:0,count:0,records:[],success:!0,message:""}),recordDataExtractorTemplate:new Ext.XTemplate(proto.recordDataExtractorTemplate)})});Ext.define("Ext.data.reader.Json",{extend:"Ext.data.reader.Reader",alternateClassName:"Ext.data.JsonReader",alias:"reader.json",root:"",metaProperty:"metaData",useSimpleAccessors:!1,readRecords:function(data){var meta,me=this;return me.getMeta?(meta=me.getMeta(data))&&me.onMetaChange(meta):data.metaData&&me.onMetaChange(data.metaData),me.jsonData=data,me.callParent([data])},getResponseData:function(response){var data,error;try{return data=Ext.decode(response.responseText),this.readRecords(data)}catch(ex){return error=new Ext.data.ResultSet({total:0,count:0,records:[],success:!1,message:ex.message}),this.fireEvent("exception",this,response,error),Ext.Logger.warn("Unable to parse the JSON returned by the server"),error}},buildExtractors:function(){var me=this,metaProp=me.metaProperty;me.callParent(arguments),me.root?me.getRoot=me.createAccessor(me.root):me.getRoot=Ext.identityFn,metaProp&&(me.getMeta=me.createAccessor(metaProp))},extractData:function(root){var length,i,recordName=this.record,data=[];if(recordName)for(length=root.length,!length&&Ext.isObject(root)&&(length=1,root=[root]),i=0;i<length;i++)data[i]=root[i][recordName];else data=root;return this.callParent([data])},createAccessor:function(){var re=/[\[\.]/;return function(expr){if(Ext.isEmpty(expr))return Ext.emptyFn;if(Ext.isFunction(expr))return expr;if(!0!==this.useSimpleAccessors){var i=String(expr).search(re);if(i>=0)return Ext.functionFactory("obj","return obj"+(i>0?".":"")+expr)}return function(obj){return obj[expr]}}}(),createFieldAccessExpression:function(){var re=/[\[\.]/;return function(field,fieldVarName,dataName){var result,operatorIndex,mapping=field.mapping,hasMap=mapping||0===mapping,map=hasMap?mapping:field.name;if(!1!==mapping){if("function"==typeof map)result=fieldVarName+".mapping("+dataName+", this)";else if(!0===this.useSimpleAccessors||(operatorIndex=String(map).search(re))<0)hasMap&&!isNaN(map)||(map='"'+map+'"'),result=dataName+"["+map+"]";else if(0===operatorIndex)result=dataName+map;else{for(var parts=map.split("."),len=parts.length,i=1,tempResult=dataName+"."+parts[0],buffer=[tempResult];i<len;i++)tempResult+="."+parts[i],buffer.push(tempResult);result=buffer.join(" && ")}return result}}}()});Ext.define("Ext.data.writer.Writer",{alias:"writer.base",alternateClassName:["Ext.data.DataWriter","Ext.data.Writer"],writeAllFields:!0,nameProperty:"name",writeRecordId:!0,isWriter:!0,constructor:function(config){Ext.apply(this,config)},write:function(request){for(var operation=request.operation,records=operation.records||[],len=records.length,i=0,data=[];i<len;i++)data.push(this.getRecordData(records[i],operation));return this.writeRecords(request,data)},getRecordData:function(record,operation){var changes,field,key,mappedIdProperty,f,fLen,isPhantom=!0===record.phantom,writeAll=this.writeAllFields||isPhantom,fields=record.fields,fieldItems=fields.items,data={},clientIdProperty=record.clientIdProperty;if(writeAll)for(fLen=fieldItems.length,f=0;f<fLen;f++)field=fieldItems[f],field.persist&&this.writeValue(data,field,record);else if("destroy"===operation.action)this.writeValue(data,record.idField,record);else{changes=record.getChanges();for(key in changes)changes.hasOwnProperty(key)&&(field=fields.get(key),field.persist&&this.writeValue(data,field,record))}return isPhantom?clientIdProperty&&operation&&operation.records.length>1&&(data[clientIdProperty]=record.internalId):this.writeRecordId&&(mappedIdProperty=fields.get(record.idProperty)[this.nameProperty]||record.idProperty,data[mappedIdProperty]=record.getId()),data},writeValue:function(data,field,record){var name=field[this.nameProperty],dateFormat=this.dateFormat||field.dateWriteFormat||field.dateFormat,value=record.get(field.name);null==name&&(name=field.name),field.serialize?data[name]=field.serialize(value,record):field.type===Ext.data.Types.DATE&&dateFormat&&Ext.isDate(value)?data[name]=Ext.Date.format(value,dateFormat):data[name]=value}});Ext.define("Ext.data.writer.Json",{extend:"Ext.data.writer.Writer",alternateClassName:"Ext.data.JsonWriter",alias:"writer.json",root:void 0,encode:!1,allowSingle:!0,expandData:!1,getExpandedData:function(data){for(var item,prop,nameParts,j,tempObj,dataLength=data.length,i=0;i<dataLength;i++){item=data[i];for(prop in item)if(item.hasOwnProperty(prop)&&(nameParts=prop.split("."),(j=nameParts.length-1)>0)){for(tempObj=item[prop];j>0;j--)tempObj=function(name,value){var o={};return o[name]=value,o}(nameParts[j],tempObj);item[nameParts[0]]=item[nameParts[0]]||{},Ext.Object.merge(item[nameParts[0]],tempObj),delete item[prop]}}return data},writeRecords:function(request,data){var root=this.root;return this.expandData&&(data=this.getExpandedData(data)),this.allowSingle&&1===data.length&&(data=data[0]),this.encode?root?request.params[root]=Ext.encode(data):Ext.Error.raise("Must specify a root when using encode"):(request.jsonData=request.jsonData||{},root?request.jsonData[root]=data:request.jsonData=data),request}});Ext.define("Ext.data.proxy.Proxy",{alias:"proxy.proxy",alternateClassName:["Ext.data.DataProxy","Ext.data.Proxy"],requires:["Ext.data.reader.Json","Ext.data.writer.Json"],uses:["Ext.data.Batch","Ext.data.Operation","Ext.data.Model"],mixins:{observable:"Ext.util.Observable"},batchOrder:"create,update,destroy",batchActions:!0,defaultReaderType:"json",defaultWriterType:"json",isProxy:!0,isSynchronous:!1,constructor:function(config){var me=this;config=config||{},me.proxyConfig=config,me.mixins.observable.constructor.call(me,config),void 0===me.model||me.model instanceof Ext.data.Model?(me.reader&&me.setReader(me.reader),me.writer&&me.setWriter(me.writer)):me.setModel(me.model)},setModel:function(model,setOnStore){var me=this;me.model=Ext.ModelManager.getModel(model),me.setReader(this.reader),me.setWriter(this.writer),setOnStore&&me.store&&me.store.setModel(me.model)},getModel:function(){return this.model},setReader:function(reader){var me=this,needsCopy=!0,current=me.reader;return void 0!==reader&&"string"!=typeof reader||(reader={type:reader},needsCopy=!1),reader.isReader?reader.setModel(me.model):(needsCopy&&(reader=Ext.apply({},reader)),Ext.applyIf(reader,{proxy:me,model:me.model,type:me.defaultReaderType}),reader=Ext.createByAlias("reader."+reader.type,reader)),reader!==current&&reader.onMetaChange&&(reader.onMetaChange=Ext.Function.createSequence(reader.onMetaChange,this.onMetaChange,this)),me.reader=reader,me.reader},getReader:function(){return this.reader},onMetaChange:function(meta){this.fireEvent("metachange",this,meta)},setWriter:function(writer){var me=this,needsCopy=!0;return void 0!==writer&&"string"!=typeof writer||(writer={type:writer},needsCopy=!1),writer.isWriter||(needsCopy&&(writer=Ext.apply({},writer)),Ext.applyIf(writer,{model:me.model,type:me.defaultWriterType}),writer=Ext.createByAlias("writer."+writer.type,writer)),me.writer=writer,me.writer},getWriter:function(){return this.writer},create:Ext.emptyFn,read:Ext.emptyFn,update:Ext.emptyFn,destroy:Ext.emptyFn,batch:function(options,listeners){var batch,records,actions,aLen,action,a,r,rLen,record,me=this,useBatch=me.batchActions;for(void 0===options.operations&&(options={operations:options,listeners:listeners}),options.batch?Ext.isDefined(options.batch.runOperation)&&(batch=Ext.applyIf(options.batch,{proxy:me,listeners:{}})):options.batch={proxy:me,listeners:options.listeners||{}},batch||(batch=new Ext.data.Batch(options.batch)),batch.on("complete",Ext.bind(me.onBatchComplete,me,[options],0)),actions=me.batchOrder.split(","),aLen=actions.length,a=0;a<aLen;a++)if(action=actions[a],records=options.operations[action])if(useBatch)batch.add(new Ext.data.Operation({action:action,records:records}));else for(rLen=records.length,r=0;r<rLen;r++)record=records[r],batch.add(new Ext.data.Operation({action:action,records:[record]}));return batch.start(),batch},onBatchComplete:function(batchOptions,batch){var scope=batchOptions.scope||this;batch.hasException?Ext.isFunction(batchOptions.failure)&&Ext.callback(batchOptions.failure,scope,[batch,batchOptions]):Ext.isFunction(batchOptions.success)&&Ext.callback(batchOptions.success,scope,[batch,batchOptions]),Ext.isFunction(batchOptions.callback)&&Ext.callback(batchOptions.callback,scope,[batch,batchOptions])},clone:function(){return new this.self(this.proxyConfig)}});Ext.define("Ext.data.Operation",{synchronous:!0,action:void 0,filters:void 0,sorters:void 0,groupers:void 0,start:void 0,limit:void 0,batch:void 0,callback:void 0,scope:void 0,started:!1,running:!1,complete:!1,success:void 0,exception:!1,error:void 0,actionCommitRecordsRe:/^(?:create|update)$/i,actionSkipSyncRe:/^destroy$/i,constructor:function(config){Ext.apply(this,config||{})},commitRecords:function(serverRecords){var mc,index,clientRecords,serverRec,clientRec,i,len,modifiedFields,recordModifiedFields,me=this,commitRecords=me.actionCommitRecordsRe.test(me.action);if(!me.actionSkipSyncRe.test(me.action)&&(clientRecords=me.records)&&clientRecords.length){if(commitRecords&&(recordModifiedFields=[]),clientRecords.length>1)if("update"==me.action||clientRecords[0].clientIdProperty)for(mc=new Ext.util.MixedCollection,mc.addAll(serverRecords),index=clientRecords.length;index--;)clientRec=clientRecords[index],serverRec=mc.findBy(me.matchClientRec,clientRec),modifiedFields=clientRec.copyFrom(serverRec),commitRecords&&recordModifiedFields.push(modifiedFields);else for(i=0,len=clientRecords.length;i<len;++i)clientRec=clientRecords[i],serverRec=serverRecords[i],clientRec&&serverRec&&(modifiedFields=me.updateRecord(clientRec,serverRec),commitRecords&&recordModifiedFields.push(modifiedFields));else modifiedFields=me.updateRecord(clientRecords[0],serverRecords[0]),commitRecords&&(recordModifiedFields[0]=modifiedFields);if(commitRecords)for(index=clientRecords.length;index--;)clientRecords[index].commit(!1,recordModifiedFields[index])}},updateRecord:function(clientRec,serverRec){return serverRec&&(clientRec.phantom||clientRec.getId()===serverRec.getId())?clientRec.copyFrom(serverRec):[]},matchClientRec:function(record){var clientRec=this,clientRecordId=clientRec.getId();return!(!clientRecordId||record.getId()!==clientRecordId)||record.internalId===clientRec.internalId},setStarted:function(){this.started=!0,this.running=!0},setCompleted:function(){this.complete=!0,this.running=!1},setSuccessful:function(){this.success=!0},setException:function(error){this.exception=!0,this.success=!1,this.running=!1,this.error=error},hasException:function(){return!0===this.exception},getError:function(){return this.error},getRecords:function(){var resultSet=this.getResultSet();return this.records||(resultSet?resultSet.records:null)},getResultSet:function(){return this.resultSet},isStarted:function(){return!0===this.started},isRunning:function(){return!0===this.running},isComplete:function(){return!0===this.complete},wasSuccessful:function(){return this.isComplete()&&!0===this.success},setBatch:function(batch){this.batch=batch},allowWrite:function(){return"read"!=this.action}});Ext.define("Ext.data.AbstractStore",{requires:["Ext.util.MixedCollection","Ext.data.proxy.Proxy","Ext.data.Operation","Ext.util.Filter"],mixins:{observable:"Ext.util.Observable",sortable:"Ext.util.Sortable"},statics:{create:function(store){return store.isStore||(store.type||(store.type="store"),store=Ext.createByAlias("store."+store.type,store)),store}},onClassExtended:function(cls,data,hooks){var onBeforeClassCreated,model=data.model;"string"==typeof model&&(onBeforeClassCreated=hooks.onBeforeCreated,hooks.onBeforeCreated=function(){var me=this,args=arguments;Ext.require(model,function(){onBeforeClassCreated.apply(me,args)})})},remoteSort:!1,remoteFilter:!1,autoLoad:void 0,autoSync:!1,batchUpdateMode:"operation",filterOnLoad:!0,sortOnLoad:!0,implicitModel:!1,defaultProxyType:"memory",isDestroyed:!1,isStore:!0,sortRoot:"data",constructor:function(config){var filters,me=this;Ext.apply(me,config),me.removed=[],me.mixins.observable.constructor.apply(me,arguments);var configModel=me.model;if(me.model=Ext.ModelManager.getModel(me.model),Ext.applyIf(me,{modelDefaults:null}),!me.model&&me.fields&&(me.model=Ext.define("Ext.data.Store.ImplicitModel-"+(me.storeId||Ext.id()),{extend:"Ext.data.Model",fields:me.fields,proxy:me.proxy||me.defaultProxyType}),delete me.fields,me.implicitModel=!0),!me.model&&!1!==me.useModelWarning){var logMsg=[Ext.getClassName(me)||"Store"," created with no model."];"string"==typeof configModel&&logMsg.push(" The name '",configModel,"'"," does not correspond to a valid model."),Ext.log.warn(logMsg.join(""))}me.setProxy(me.proxy||me.model.getProxy()),me.id&&!me.storeId&&(me.storeId=me.id,delete me.id),me.storeId&&Ext.data.StoreManager.register(me),me.mixins.sortable.initSortable.call(me),filters=me.decodeFilters(me.filters),me.filters=new Ext.util.MixedCollection,me.filters.addAll(filters)},setProxy:function(proxy){var me=this,model=me.model;return proxy instanceof Ext.data.proxy.Proxy?proxy.setModel(model):(Ext.isString(proxy)?proxy={type:proxy,model:model}:proxy.model||(proxy=Ext.apply({model:model},proxy)),proxy=Ext.createByAlias("proxy."+proxy.type,proxy)),me.disableMetaChangeEvent||proxy.on("metachange",me.onMetaChange,me),me.proxy=proxy,me.proxy},getProxy:function(){return this.proxy},onMetaChange:function(proxy,meta){this.fireEvent("metachange",this,meta)},create:function(data,options){var operation,me=this,instance=Ext.ModelManager.create(Ext.applyIf(data,me.modelDefaults),me.model.modelName);return options=options||{},Ext.applyIf(options,{action:"create",records:[instance]}),operation=new Ext.data.Operation(options),me.proxy.create(operation,me.onProxyWrite,me),instance},read:function(){return this.load.apply(this,arguments)},update:function(options){var operation,me=this;return options=options||{},Ext.applyIf(options,{action:"update",records:me.getUpdatedRecords()}),operation=new Ext.data.Operation(options),me.proxy.update(operation,me.onProxyWrite,me)},onProxyWrite:function(operation){var me=this,success=operation.wasSuccessful(),records=operation.getRecords();switch(operation.action){case"create":me.onCreateRecords(records,operation,success);break;case"update":me.onUpdateRecords(records,operation,success);break;case"destroy":me.onDestroyRecords(records,operation,success)}success&&(me.fireEvent("write",me,operation),me.fireEvent("datachanged",me),me.fireEvent("refresh",me)),Ext.callback(operation.callback,operation.scope||me,[records,operation,success])},onCreateRecords:Ext.emptyFn,onUpdateRecords:Ext.emptyFn,onDestroyRecords:function(records,operation,success){success&&(this.removed=[])},destroy:function(options){var operation,me=this;return options=options||{},Ext.applyIf(options,{action:"destroy",records:me.getRemovedRecords()}),operation=new Ext.data.Operation(options),me.proxy.destroy(operation,me.onProxyWrite,me)},onBatchOperationComplete:function(batch,operation){return this.onProxyWrite(operation)},onBatchComplete:function(batch,operation){var i,me=this,operations=batch.operations,length=operations.length;for(me.suspendEvents(),i=0;i<length;i++)me.onProxyWrite(operations[i]);me.resumeEvents(),me.fireEvent("datachanged",me),me.fireEvent("refresh",me)},onBatchException:function(batch,operation){},filterNew:function(item){return!0===item.phantom&&item.isValid()},getNewRecords:function(){return[]},getUpdatedRecords:function(){return[]},getModifiedRecords:function(){return[].concat(this.getNewRecords(),this.getUpdatedRecords())},filterUpdated:function(item){return!0===item.dirty&&!0!==item.phantom&&item.isValid()},getRemovedRecords:function(){return this.removed},filter:function(filters,value){},decodeFilters:function(filters){Ext.isArray(filters)||(filters=void 0===filters?[]:[filters]);var config,i,length=filters.length,Filter=Ext.util.Filter;for(i=0;i<length;i++)(config=filters[i])instanceof Filter||(Ext.apply(config,{root:"data"}),config.fn&&(config.filterFn=config.fn),"function"==typeof config&&(config={filterFn:config}),filters[i]=new Filter(config));return filters},clearFilter:function(supressEvent){},isFiltered:function(){},filterBy:function(fn,scope){},sync:function(options){var me=this,operations={},toCreate=me.getNewRecords(),toUpdate=me.getUpdatedRecords(),toDestroy=me.getRemovedRecords(),needsSync=!1;return toCreate.length>0&&(operations.create=toCreate,needsSync=!0),toUpdate.length>0&&(operations.update=toUpdate,needsSync=!0),toDestroy.length>0&&(operations.destroy=toDestroy,needsSync=!0),needsSync&&!1!==me.fireEvent("beforesync",operations)&&(options=options||{},me.proxy.batch(Ext.apply(options,{operations:operations,listeners:me.getBatchListeners()}))),me},getBatchListeners:function(){var me=this,listeners={scope:me,exception:me.onBatchException};return"operation"==me.batchUpdateMode?listeners.operationcomplete=me.onBatchOperationComplete:listeners.complete=me.onBatchComplete,listeners},save:function(){return this.sync.apply(this,arguments)},load:function(options){var me=this,operation={action:"read"};return me.remoteFilter&&(operation.filters=me.filters.items),me.remoteSort&&(operation.sorters=me.getSorters()),Ext.apply(operation,options),me.lastOptions=operation,operation=new Ext.data.Operation(operation),!1!==me.fireEvent("beforeload",me,operation)&&(me.loading=!0,me.proxy.read(operation,me.onProxyLoad,me)),me},reload:function(options){var o=Ext.apply({},options,this.lastOptions);return this.load(o)},afterEdit:function(record,modifiedFieldNames){var i,shouldSync,me=this;if(me.autoSync&&!me.autoSyncSuspended){for(i=modifiedFieldNames.length;i--;)if(record.fields.get(modifiedFieldNames[i]).persist){shouldSync=!0;break}shouldSync&&me.sync()}me.onUpdate(record,Ext.data.Model.EDIT,modifiedFieldNames),me.fireEvent("update",me,record,Ext.data.Model.EDIT,modifiedFieldNames)},afterReject:function(record){this.onUpdate(record,Ext.data.Model.REJECT,null),this.fireEvent("update",this,record,Ext.data.Model.REJECT,null)},afterCommit:function(record,modifiedFieldNames){modifiedFieldNames||(modifiedFieldNames=null),this.onUpdate(record,Ext.data.Model.COMMIT,modifiedFieldNames),this.fireEvent("update",this,record,Ext.data.Model.COMMIT,modifiedFieldNames)},onUpdate:Ext.emptyFn,onIdChanged:function(model,oldId,newId,oldInternalId){this.fireEvent("idchanged",this,model,oldId,newId,oldInternalId)},destroyStore:function(){var implicitModelName,me=this;me.isDestroyed||(me.clearListeners(),me.storeId&&Ext.data.StoreManager.unregister(me),me.clearData(),me.data=me.tree=me.sorters=me.filters=me.groupers=null,me.reader&&me.reader.destroyReader(),me.proxy=me.reader=me.writer=null,me.isDestroyed=!0,me.implicitModel?(implicitModelName=Ext.getClassName(me.model),Ext.undefine(implicitModelName),Ext.ModelManager.unregisterType(implicitModelName)):me.model=null)},getState:function(){var hasState,result,me=this,hasGroupers=!!me.groupers,groupers=[],sorters=[],filters=[];if(hasGroupers&&me.groupers.each(function(g){groupers[groupers.length]=g.serialize(),hasState=!0}),me.sorters&&me.sorters.each(function(s){hasGroupers&&!me.groupers.contains(s)&&(sorters[sorters.length]=s.serialize(),hasState=!0)}),me.filters&&me.statefulFilters&&me.filters.each(function(f){filters[filters.length]=f.serialize(),hasState=!0}),hasState)return result={},groupers.length&&(result.groupers=groupers),sorters.length&&(result.sorters=sorters),filters.length&&(result.filters=filters),result},applyState:function(state){var locallySorted,me=this,hasSorters=!!me.sorters,hasGroupers=!!me.groupers,hasFilters=!!me.filters;hasGroupers&&state.groupers&&(me.groupers.clear(),me.groupers.addAll(me.decodeGroupers(state.groupers))),hasSorters&&state.sorters&&(me.sorters.clear(),me.sorters.addAll(me.decodeSorters(state.sorters))),hasFilters&&state.filters&&(me.filters.clear(),me.filters.addAll(me.decodeFilters(state.filters))),hasSorters&&hasGroupers&&me.sorters.insert(0,me.groupers.getRange()),me.autoLoad&&(me.remoteSort||me.remoteGroup||me.remoteFilter)&&(!0===me.autoLoad?me.reload():me.reload(me.autoLoad)),hasFilters&&me.filters.length&&!me.remoteFilter&&(me.filter(),locallySorted=me.sortOnFilter),hasSorters&&me.sorters.length&&!me.remoteSort&&!locallySorted&&me.sort()},doSort:function(sorterFn){var me=this;me.remoteSort?me.load():(me.data.sortBy(sorterFn),me.fireEvent("datachanged",me),me.fireEvent("refresh",me)),me.fireEvent("sort",me,me.sorters.getRange())},clearData:Ext.emptyFn,getCount:Ext.emptyFn,getById:Ext.emptyFn,removeAll:Ext.emptyFn,isLoading:function(){return!!this.loading},suspendAutoSync:function(){this.autoSyncSuspended=!0},resumeAutoSync:function(){this.autoSyncSuspended=!1}});Ext.define("Ext.app.domain.Store",{extend:"Ext.app.EventDomain",singleton:!0,requires:["Ext.data.AbstractStore"],type:"store",idProperty:"storeId",constructor:function(){var me=this;me.callParent(),me.monitor(Ext.data.AbstractStore)}});Ext.define("Ext.app.Controller",{requires:["Ext.app.EventBus","Ext.ModelManager","Ext.data.StoreManager","Ext.ComponentManager","Ext.app.domain.Global","Ext.app.domain.Component","Ext.app.domain.Store"],uses:["Ext.app.domain.Controller"],mixins:{observable:"Ext.util.Observable"},statics:{strings:{model:{getter:"getModel",upper:"Model"},view:{getter:"getView",upper:"View"},controller:{getter:"getController",upper:"Controller"},store:{getter:"getStore",upper:"Store"}},controllerRegex:/^(.*)\.controller\./,createGetter:function(baseGetter,name){return function(){return this[baseGetter](name)}},getGetterName:function(name,kindUpper){var index,fn="get",parts=name.split("."),numParts=parts.length;for(index=0;index<numParts;index++)fn+=Ext.String.capitalize(parts[index]);return fn+=kindUpper},processDependencies:function(cls,requires,namespace,kind,names){if(names&&names.length){var o,absoluteName,shortName,name,j,subLn,getterName,getter,me=this,strings=me.strings[kind];for(Ext.isArray(names)||(names=[names]),j=0,subLn=names.length;j<subLn;j++)name=names[j],o=me.getFullName(name,kind,namespace),absoluteName=o.absoluteName,shortName=o.shortName,requires.push(absoluteName),getterName=me.getGetterName(shortName,strings.upper),cls[getterName]=getter=me.createGetter(strings.getter,name),"controller"!==kind&&(getter["Ext.app.getter"]=!0)}},getFullName:function(name,kind,namespace){var sep,absoluteName,shortName=name;return(sep=name.indexOf("@"))>0?(shortName=name.substring(0,sep),absoluteName=name.substring(sep+1)+"."+shortName):name.indexOf(".")>0&&(Ext.ClassManager.isCreated(name)||Ext.Loader.isAClassNameWithAKnownPrefix(name))?absoluteName=name:(namespace||Ext.log.warn("Cannot find namespace for "+kind+" "+name+", assuming it is fully qualified class name"),namespace?(absoluteName=namespace+"."+kind+"."+name,shortName=name):absoluteName=name),{absoluteName:absoluteName,shortName:shortName}}},application:null,onClassExtended:function(cls,data,hooks){var onBeforeClassCreated=hooks.onBeforeCreated;hooks.onBeforeCreated=function(cls,data){var className,namespace,requires,proto,match,Controller=Ext.app.Controller,ctrlRegex=Controller.controllerRegex,requires=[];proto=cls.prototype,className=Ext.getClassName(cls),namespace=data.$namespace||Ext.app.getNamespace(className)||(match=ctrlRegex.exec(className))&&match[1],namespace?proto.$namespace=namespace:Ext.log.warn("Missing namespace for "+className+", please define it in namespaces property of your Application class."),Controller.processDependencies(proto,requires,namespace,"model",data.models),Controller.processDependencies(proto,requires,namespace,"view",data.views),Controller.processDependencies(proto,requires,namespace,"store",data.stores),Controller.processDependencies(proto,requires,namespace,"controller",data.controllers),Ext.require(requires,Ext.Function.pass(onBeforeClassCreated,arguments,this))}},constructor:function(config){var me=this;me.mixins.observable.constructor.call(me,config),me.refs&&me.ref(me.refs),me.eventbus=Ext.app.EventBus,me.initAutoGetters()},initAutoGetters:function(){var prop,fn,proto=this.self.prototype;for(prop in proto)(fn=proto[prop])&&fn["Ext.app.getter"]&&fn.call(this)},doInit:function(app){var me=this;me._initialized||(me.init(app),me._initialized=!0)},finishInit:function(app){var controller,i,l,me=this,controllers=me.controllers;if(me._initialized&&controllers&&controllers.length)for(i=0,l=controllers.length;i<l;i++)controller=me.getController(controllers[i]),controller.finishInit(app)},init:Ext.emptyFn,onLaunch:Ext.emptyFn,ref:function(refs){var info,ref,fn,me=this,i=0,length=refs.length;for(refs=Ext.Array.from(refs),me.references=me.references||[];i<length;i++)info=refs[i],ref=info.ref,fn="get"+Ext.String.capitalize(ref),me[fn]||(me[fn]=Ext.Function.pass(me.getRef,[ref,info],me)),me.references.push(ref.toLowerCase())},addRef:function(refs){this.ref(refs)},getRef:function(ref,info,config){var me=this,refCache=me.refCache||(me.refCache={}),cached=refCache[ref];return info=info||{},config=config||{},Ext.apply(info,config),info.forceCreate?Ext.ComponentManager.create(info,"component"):(cached||(info.selector&&(refCache[ref]=cached=Ext.ComponentQuery.query(info.selector)[0]),!cached&&info.autoCreate&&(refCache[ref]=cached=Ext.ComponentManager.create(info,"component")),cached&&cached.on("beforedestroy",function(){refCache[ref]=null})),cached)},hasRef:function(ref){var references=this.references;return references&&-1!==Ext.Array.indexOf(references,ref.toLowerCase())},control:function(selectors,listeners,controller){var obj,me=this,ctrl=controller;Ext.isString(selectors)?(obj={},obj[selectors]=listeners):(obj=selectors,ctrl=listeners),me.eventbus.control(obj,ctrl||me)},listen:function(to,controller){this.eventbus.listen(to,controller||this)},getController:function(id){var me=this,app=me.application;return id===me.id?me:app&&app.getController(id)},getStore:function(name){var storeId,store;return storeId=-1==name.indexOf("@")?name:name.split("@")[0],store=Ext.StoreManager.get(storeId),store||(name=Ext.app.Controller.getFullName(name,"store",this.$namespace))&&(store=Ext.create(name.absoluteName,{storeId:storeId})),store},getModel:function(model){var name=Ext.app.Controller.getFullName(model,"model",this.$namespace);return name&&Ext.ModelManager.getModel(name.absoluteName)},getView:function(view){var name=Ext.app.Controller.getFullName(view,"view",this.$namespace);return name&&Ext.ClassManager.get(name.absoluteName)},getApplication:function(){return this.application}});Ext.define("Ext.container.DockingContainer",{requires:["Ext.util.MixedCollection","Ext.Element"],isDockingContainer:!0,defaultDockWeights:{top:{render:1,visual:1},left:{render:3,visual:5},right:{render:5,visual:7},bottom:{render:7,visual:3}},dockOrder:{top:-1,left:-1,right:1,bottom:1},horizontalDocks:0,addDocked:function(items,pos){var item,length,me=this,i=0;for(items=me.prepareItems(items),length=items.length;i<length;i++)item=items[i],item.dock=item.dock||"top","left"!==item.dock&&"right"!==item.dock||me.horizontalDocks++,void 0!==pos?(i+=pos,me.dockedItems.insert(i,item)):me.dockedItems.add(item),item.onAdded(me,i),me.hasListeners.dockedadd&&me.fireEvent("dockedadd",me,item,i),me.onDockedAdd!==Ext.emptyFn&&me.onDockedAdd(item);return me.rendered&&!me.suspendLayout&&me.updateLayout(),items},destroyDockedItems:function(){var c,dockedItems=this.dockedItems;if(dockedItems)for(;c=dockedItems.first();)this.removeDocked(c,!0)},doRenderDockedItems:function(out,renderData,after){var items,tree,me=renderData.$comp,layout=me.componentLayout;layout.getDockedItems&&!renderData.$skipDockedItems&&(items=layout.getDockedItems("render",!after),(tree=items&&layout.getItemsRenderTree(items))&&Ext.DomHelper.generateMarkup(tree,out))},getDockedComponent:function(comp){return Ext.isObject(comp)&&(comp=comp.getItemId()),this.dockedItems.get(comp)},getDockedItems:function(selector,beforeBody){var dockedItems=this.getComponentLayout().getDockedItems("render",beforeBody);return selector&&dockedItems.length&&(dockedItems=Ext.ComponentQuery.query(selector,dockedItems)),dockedItems},getDockingRefItems:function(deep,containerItems){var items,selector=deep&&"*,* *",dockedItems=this.getDockedItems(selector,!0);return dockedItems.push.apply(dockedItems,containerItems),items=this.getDockedItems(selector,!1),dockedItems.push.apply(dockedItems,items),dockedItems},initDockingItems:function(){var me=this,items=me.dockedItems;me.dockedItems=new Ext.util.AbstractMixedCollection(!1,me.getComponentId),items&&me.addDocked(items)},insertDocked:function(pos,items){this.addDocked(items,pos)},onDockedAdd:Ext.emptyFn,onDockedRemove:Ext.emptyFn,removeDocked:function(item,autoDestroy){var layout,hasLayout,me=this;return autoDestroy=!0===autoDestroy||!1!==autoDestroy&&me.autoDestroy,me.dockedItems.contains(item)?("left"!==item.dock&&"right"!==item.dock||me.horizontalDocks--,layout=me.componentLayout,hasLayout=layout&&me.rendered,hasLayout&&layout.onRemove(item),me.dockedItems.remove(item),item.onRemoved(item.destroying||autoDestroy),me.onDockedRemove(item),autoDestroy?item.destroy():hasLayout&&layout.afterRemove(item),me.hasListeners.dockedremove&&me.fireEvent("dockedremove",me,item),me.destroying||me.suspendLayout||me.updateLayout(),item):item},setupDockingRenderTpl:function(renderTpl){renderTpl.renderDockedItems=this.doRenderDockedItems}});Ext.define("Ext.toolbar.Fill",{extend:"Ext.Component",alias:"widget.tbfill",alternateClassName:"Ext.Toolbar.Fill",ariaRole:"presentation",isFill:!0,flex:1});Ext.define("Ext.layout.container.boxOverflow.None",{alternateClassName:"Ext.layout.boxOverflow.None",constructor:function(layout,config){this.layout=layout,Ext.apply(this,config)},handleOverflow:Ext.emptyFn,clearOverflow:Ext.emptyFn,beginLayout:Ext.emptyFn,beginLayoutCycle:Ext.emptyFn,calculate:function(ownerContext){var overflow,me=this,plan=ownerContext.state.boxPlan;plan&&plan.tooNarrow?(overflow=me.handleOverflow(ownerContext))&&overflow.reservedSpace&&me.layout.publishInnerCtSize(ownerContext,overflow.reservedSpace):me.clearOverflow()},completeLayout:Ext.emptyFn,finishedLayout:function(ownerContext){var hiddens,hiddenCount,me=this,owner=me.layout.owner;owner.hasListeners.overflowchange&&(hiddens=owner.query(">[hidden]"),(hiddenCount=hiddens.length)!==me.lastHiddenCount&&(owner.fireEvent("overflowchange",me.lastHiddenCount,hiddenCount,hiddens),me.lastHiddenCount=hiddenCount))},onRemove:Ext.emptyFn,getItem:function(item){return this.layout.owner.getComponent(item)},getOwnerType:function(owner){return owner.isToolbar?"toolbar":owner.isTabBar?"tabbar":owner.isMenu?"menu":owner.getXType()},getPrefixConfig:Ext.emptyFn,getSuffixConfig:Ext.emptyFn,getOverflowCls:function(){return""}});Ext.define("Ext.toolbar.Item",{extend:"Ext.Component",alias:"widget.tbitem",alternateClassName:"Ext.Toolbar.Item",enable:Ext.emptyFn,disable:Ext.emptyFn,focus:Ext.emptyFn});Ext.define("Ext.toolbar.Separator",{extend:"Ext.toolbar.Item",alias:"widget.tbseparator",alternateClassName:"Ext.Toolbar.Separator",baseCls:Ext.baseCSSPrefix+"toolbar-separator",focusable:!1,ariaRole:"separator"});Ext.define("Ext.button.Manager",{singleton:!0,alternateClassName:"Ext.ButtonToggleManager",groups:{},pressedButton:null,buttonSelector:"."+Ext.baseCSSPrefix+"btn",init:function(){var me=this;me.initialized||(Ext.getDoc().on({keydown:me.onDocumentKeyDown,mouseup:me.onDocumentMouseUp,scope:me}),me.initialized=!0)},onDocumentKeyDown:function(e){var btn,k=e.getKey();k!==e.SPACE&&k!==e.ENTER||(btn=e.getTarget(this.buttonSelector))&&Ext.getCmp(btn.id).onClick(e)},onButtonMousedown:function(button,e){var pressed=this.pressedButton;pressed&&pressed.onMouseUp(e),this.pressedButton=button},onDocumentMouseUp:function(e){var pressed=this.pressedButton;pressed&&(pressed.onMouseUp(e),this.pressedButton=null)},toggleGroup:function(btn,state){if(state){var i,g=this.groups[btn.toggleGroup],length=g.length;for(i=0;i<length;i++)g[i]!==btn&&g[i].toggle(!1)}},register:function(btn){var me=this,groups=this.groups,group=groups[btn.toggleGroup];me.init(),btn.toggleGroup&&(group||(group=groups[btn.toggleGroup]=[]),group.push(btn),btn.on("toggle",me.toggleGroup,me))},unregister:function(btn){if(btn.toggleGroup){var me=this,group=me.groups[btn.toggleGroup];group&&(Ext.Array.remove(group,btn),btn.un("toggle",me.toggleGroup,me))}},getPressed:function(group){var len,g=this.groups[group],i=0;if(g)for(len=g.length;i<len;i++)if(!0===g[i].pressed)return g[i];return null}});Ext.define("Ext.menu.Manager",{singleton:!0,requires:["Ext.util.MixedCollection","Ext.util.KeyMap"],alternateClassName:"Ext.menu.MenuMgr",uses:["Ext.menu.Menu"],menuSelector:"."+Ext.baseCSSPrefix+"menu",menus:{},groups:{},attached:!1,lastShow:new Date,init:function(){var me=this;me.active=new Ext.util.MixedCollection,Ext.getDoc().addKeyListener(27,function(){me.active.length>0&&me.hideAll()},me)},hideAll:function(){var menus,m,mLen,active=this.active;if(active&&active.length>0){for(menus=Ext.Array.slice(active.items),mLen=menus.length,m=0;m<mLen;m++)menus[m].hide();return!0}return!1},onHide:function(m){var me=this,active=me.active;active.remove(m),active.length<1&&(Ext.getDoc().un("mousedown",me.onMouseDown,me),me.attached=!1)},onShow:function(m){var me=this,active=me.active,attached=me.attached;me.lastShow=new Date,active.add(m),attached||(Ext.getDoc().on("mousedown",me.onMouseDown,me,{buffer:Ext.isIE9m?10:void 0}),me.attached=!0),m.toFront()},onBeforeHide:function(m){m.activeChild&&m.activeChild.hide(),m.autoHideTimer&&(clearTimeout(m.autoHideTimer),delete m.autoHideTimer)},onBeforeShow:function(m){var active=this.active,parentMenu=m.parentMenu;active.remove(m),parentMenu||m.allowOtherMenus?parentMenu&&parentMenu.activeChild&&m!=parentMenu.activeChild&&parentMenu.activeChild.hide():this.hideAll()},onMouseDown:function(e){var me=this,active=me.active,lastShow=me.lastShow,doHide=!0;Ext.Date.getElapsed(lastShow)>50&&active.length>0&&!e.getTarget(me.menuSelector)&&(Ext.isIE9m&&!Ext.getDoc().contains(e.target)&&(doHide=!1),doHide&&me.hideAll())},register:function(menu){var me=this;me.active||me.init(),menu.floating&&(me.menus[menu.id]=menu,menu.on({beforehide:me.onBeforeHide,hide:me.onHide,beforeshow:me.onBeforeShow,show:me.onShow,scope:me}))},get:function(menu){var menus=this.menus;return"string"==typeof menu?menus?menus[menu]:null:menu.isMenu?menu:Ext.isArray(menu)?new Ext.menu.Menu({items:menu}):Ext.ComponentManager.create(menu,"menu")},unregister:function(menu){var me=this,menus=me.menus,active=me.active;delete menus[menu.id],active.remove(menu),menu.un({beforehide:me.onBeforeHide,hide:me.onHide,beforeshow:me.onBeforeShow,show:me.onShow,scope:me})},registerCheckable:function(menuItem){var groups=this.groups,groupId=menuItem.group;groupId&&(groups[groupId]||(groups[groupId]=[]),groups[groupId].push(menuItem))},unregisterCheckable:function(menuItem){var groups=this.groups,groupId=menuItem.group;groupId&&Ext.Array.remove(groups[groupId],menuItem)},onCheckChange:function(menuItem,state){var group,ln,curr,groups=this.groups,groupId=menuItem.group,i=0;if(groupId&&state)for(group=groups[groupId],ln=group.length;i<ln;i++)(curr=group[i])!=menuItem&&curr.setChecked(!1)}});Ext.define("Ext.util.ClickRepeater",{extend:"Ext.util.Observable",constructor:function(el,config){var me=this;me.el=Ext.get(el),me.el.unselectable(),Ext.apply(me,config),me.callParent(),me.addEvents("mousedown","click","mouseup"),me.disabled||(me.disabled=!0,me.enable()),me.handler&&me.on("click",me.handler,me.scope||me)},interval:20,delay:250,preventDefault:!0,stopDefault:!1,timer:0,enable:function(){this.disabled&&(this.el.on("mousedown",this.handleMouseDown,this),Ext.isIE&&!(Ext.isIE10p||Ext.isStrict&&Ext.isIE9)&&this.el.on("dblclick",this.handleDblClick,this),(this.preventDefault||this.stopDefault)&&this.el.on("click",this.eventOptions,this)),this.disabled=!1},disable:function(force){!force&&this.disabled||(clearTimeout(this.timer),this.pressedCls&&this.el.removeCls(this.pressedCls),Ext.getDoc().un("mouseup",this.handleMouseUp,this),this.el.removeAllListeners()),this.disabled=!0},setDisabled:function(disabled){this[disabled?"disable":"enable"]()},eventOptions:function(e){this.preventDefault&&e.preventDefault(),this.stopDefault&&e.stopEvent()},destroy:function(){this.disable(!0),Ext.destroy(this.el),this.clearListeners()},handleDblClick:function(e){clearTimeout(this.timer),this.el.blur(),this.fireEvent("mousedown",this,e),this.fireEvent("click",this,e)},handleMouseDown:function(e){clearTimeout(this.timer),this.el.blur(),this.pressedCls&&this.el.addCls(this.pressedCls),this.mousedownTime=new Date,Ext.getDoc().on("mouseup",this.handleMouseUp,this),this.el.on("mouseout",this.handleMouseOut,this),this.fireEvent("mousedown",this,e),this.fireEvent("click",this,e),this.accelerate&&(this.delay=400),e=new Ext.EventObjectImpl(e),this.timer=Ext.defer(this.click,this.delay||this.interval,this,[e])},click:function(e){this.fireEvent("click",this,e),this.timer=Ext.defer(this.click,this.accelerate?this.easeOutExpo(Ext.Date.getElapsed(this.mousedownTime),400,-390,12e3):this.interval,this,[e])},easeOutExpo:function(t,b,c,d){return t==d?b+c:c*(1-Math.pow(2,-10*t/d))+b},handleMouseOut:function(){clearTimeout(this.timer),this.pressedCls&&this.el.removeCls(this.pressedCls),this.el.on("mouseover",this.handleMouseReturn,this)},handleMouseReturn:function(){this.el.un("mouseover",this.handleMouseReturn,this),this.pressedCls&&this.el.addCls(this.pressedCls),this.click()},handleMouseUp:function(e){clearTimeout(this.timer),this.el.un("mouseover",this.handleMouseReturn,this),this.el.un("mouseout",this.handleMouseOut,this),Ext.getDoc().un("mouseup",this.handleMouseUp,this),this.pressedCls&&this.el.removeCls(this.pressedCls),this.fireEvent("mouseup",this,e)}});Ext.define("Ext.layout.component.Button",{alias:["layout.button"],extend:"Ext.layout.component.Auto",type:"button",htmlRE:/<.*>/,beginLayout:function(ownerContext){var me=this,owner=me.owner,text=owner.text;me.callParent(arguments),ownerContext.btnWrapContext=ownerContext.getEl("btnWrap"),ownerContext.btnElContext=ownerContext.getEl("btnEl"),ownerContext.btnInnerElContext=ownerContext.getEl("btnInnerEl"),ownerContext.btnIconElContext=ownerContext.getEl("btnIconEl"),text&&me.htmlRE.test(text)&&(ownerContext.isHtmlText=!0,owner.btnInnerEl.setStyle("line-height","normal"),owner.btnInnerEl.setStyle("padding-top",""))},beginLayoutCycle:function(ownerContext){var owner=this.owner,lastWidthModel=this.lastWidthModel;this.callParent(arguments),lastWidthModel&&!this.lastWidthModel.shrinkWrap&&ownerContext.widthModel.shrinkWrap&&(owner.btnWrap.setStyle("height",""),owner.btnEl.setStyle("height",""),owner.btnInnerEl.setStyle("line-height",""))},calculate:function(ownerContext){var ownerHeight,contentHeight,btnElHeight,innerElHeight,me=this,owner=me.owner,btnElContext=ownerContext.btnElContext,btnInnerElContext=ownerContext.btnInnerElContext,btnWrapContext=ownerContext.btnWrapContext,mmax=Math.max;me.callParent(arguments),ownerContext.heightModel.shrinkWrap?(btnElHeight=owner.btnEl.getHeight(),ownerContext.isHtmlText&&(me.centerInnerEl(ownerContext,btnElHeight),me.ieCenterIcon(ownerContext,btnElHeight))):(ownerHeight=ownerContext.getProp("height"),ownerHeight?(contentHeight=ownerHeight-ownerContext.getFrameInfo().height-ownerContext.getPaddingInfo().height,btnElHeight=contentHeight,(owner.menu||owner.split)&&"bottom"===owner.arrowAlign&&(btnElHeight-=btnWrapContext.getPaddingInfo().bottom),innerElHeight=btnElHeight,!(owner.icon||owner.iconCls||owner.glyph)||"top"!==owner.iconAlign&&"bottom"!==owner.iconAlign||(innerElHeight-=btnInnerElContext.getPaddingInfo().height),btnWrapContext.setProp("height",mmax(0,contentHeight)),btnElContext.setProp("height",mmax(0,btnElHeight)),ownerContext.isHtmlText?me.centerInnerEl(ownerContext,btnElHeight):btnInnerElContext.setProp("line-height",mmax(0,innerElHeight)+"px"),me.ieCenterIcon(ownerContext,btnElHeight)):0!==ownerHeight&&(me.done=!1))},centerInnerEl:function(ownerContext,btnElHeight){var me=this,btnInnerElContext=ownerContext.btnInnerElContext,innerElHeight=me.owner.btnInnerEl.getHeight();ownerContext.heightModel.shrinkWrap&&btnElHeight<innerElHeight?ownerContext.btnElContext.setHeight(innerElHeight):btnElHeight>innerElHeight&&btnInnerElContext.setProp("padding-top",Math.round((btnElHeight-innerElHeight)/2)+btnInnerElContext.getPaddingInfo().top)},ieCenterIcon:function(ownerContext,btnElHeight){var iconAlign=this.owner.iconAlign;!Ext.isIEQuirks&&!Ext.isIE6||"left"!==iconAlign&&"right"!==iconAlign||ownerContext.btnIconElContext.setHeight(btnElHeight)},publishInnerWidth:function(ownerContext,width){this.owner.getFrameInfo().table&&ownerContext.btnInnerElContext.setWidth(width-ownerContext.getFrameInfo().width-ownerContext.getPaddingInfo().width-ownerContext.btnWrapContext.getPaddingInfo().width)}});Ext.define("Ext.util.TextMetrics",{statics:{shared:null,measure:function(el,text,fixedWidth){var me=this,shared=me.shared;return shared||(shared=me.shared=new me(el,fixedWidth)),shared.bind(el),shared.setFixedWidth(fixedWidth||"auto"),shared.getSize(text)},destroy:function(){var me=this;Ext.destroy(me.shared),me.shared=null}},constructor:function(bindTo,fixedWidth){var me=this,measure=Ext.getBody().createChild({"data-sticky":!0,role:"presentation",cls:Ext.baseCSSPrefix+"textmetrics"});me.measure=measure,bindTo&&me.bind(bindTo),measure.position("absolute"),measure.setLocalXY(-1e3,-1e3),measure.hide(),fixedWidth&&measure.setWidth(fixedWidth)},getSize:function(text){var size,measure=this.measure;return measure.update(text),size=measure.getSize(),measure.update(""),size},bind:function(el){var me=this;me.el=Ext.get(el),me.measure.setStyle(me.el.getStyles("font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"))},setFixedWidth:function(width){this.measure.setWidth(width)},getWidth:function(text){return this.measure.dom.style.width="auto",this.getSize(text).width},getHeight:function(text){return this.getSize(text).height},destroy:function(){var me=this;me.measure.remove(),delete me.el,delete me.measure}},function(){Ext.Element.addMethods({getTextWidth:function(text,min,max){return Ext.Number.constrain(Ext.util.TextMetrics.measure(this.dom,Ext.value(text,this.dom.innerHTML,!0)).width,min||0,max||1e6)}})});Ext.define("Ext.button.Button",{alias:"widget.button",extend:"Ext.Component",requires:["Ext.button.Manager","Ext.menu.Manager","Ext.util.ClickRepeater","Ext.layout.component.Button","Ext.util.TextMetrics","Ext.util.KeyMap"],mixins:{queryable:"Ext.Queryable"},alternateClassName:"Ext.Button",isButton:!0,componentLayout:"button",hidden:!1,disabled:!1,pressed:!1,tabIndex:0,enableToggle:!1,menuAlign:"tl-bl?",showEmptyMenu:!1,textAlign:"center",clickEvent:"click",preventDefault:!0,handleMouseEvents:!0,tooltipType:"qtip",baseCls:Ext.baseCSSPrefix+"btn",pressedCls:"pressed",overCls:"over",focusCls:"focus",menuActiveCls:"menu-active",hrefTarget:"_blank",ariaRole:"button",childEls:["btnEl","btnWrap","btnInnerEl","btnIconEl"],renderTpl:['<span id="{id}-btnWrap" role="presentation" class="{baseCls}-wrap','<tpl if="splitCls"> {splitCls}</tpl>','{childElCls}" unselectable="on">','<span id="{id}-btnEl" class="{baseCls}-button" role="presentation">','<span id="{id}-btnInnerEl" class="{baseCls}-inner {innerCls}','{childElCls}" unselectable="on">',"{text}","</span>",'<span role="presentation" id="{id}-btnIconEl" class="{baseCls}-icon-el {iconCls}','{childElCls} {glyphCls}" unselectable="on" style="','<tpl if="iconUrl">background-image:url({iconUrl});</tpl>','<tpl if="glyph && glyphFontFamily">font-family:{glyphFontFamily};</tpl>">','<tpl if="glyph">&#{glyph};</tpl><tpl if="iconCls || iconUrl">&#160;</tpl>',"</span>","</span>","</span>",'<tpl if="closable">','<span id="{id}-closeEl" role="presentation"',' class="{baseCls}-close-btn"','<tpl if="closeText">',' title="{closeText}" aria-label="{closeText}"',"</tpl>",">","</span>","</tpl>"],scale:"small",allowedScales:["small","medium","large"],iconAlign:"left",arrowAlign:"right",arrowCls:"arrow",maskOnDisable:!1,shrinkWrap:3,frame:!0,hasFrameTable:function(){return this.href&&this.frameTable},frameTableListener:function(){this.disabled||this.doNavigate()},doNavigate:function(){"_blank"===this.hrefTarget?window.open(this.href,this.hrefTarget):location.href=this.href},_triggerRegion:{},initComponent:function(){var me=this;me.autoEl={tag:"a",hidefocus:"on",unselectable:"on"},me.addCls(Ext.baseCSSPrefix+"unselectable"),me.callParent(arguments),me.addEvents("click","toggle","mouseover","mouseout","menushow","menuhide","menutriggerover","menutriggerout","textchange","iconchange","glyphchange"),me.menu&&(me.split=!0,me.menu=Ext.menu.Manager.get(me.menu),me.menu.ownerButton=me),me.url&&(me.href=me.url),me.href&&!me.hasOwnProperty("preventDefault")&&(me.preventDefault=!1),Ext.isString(me.toggleGroup)&&""!==me.toggleGroup&&(me.enableToggle=!0),me.html&&!me.text&&(me.text=me.html,delete me.html),me.glyphCls=me.baseCls+"-glyph"},getActionEl:function(){return this.el},getFocusEl:function(){return this.el},onDisable:function(){this.callParent(arguments)},setComponentCls:function(){var me=this,cls=me.getComponentCls();Ext.isEmpty(me.oldCls)||(me.removeClsWithUI(me.oldCls),me.removeClsWithUI(me.pressedCls)),me.oldCls=cls,me.addClsWithUI(cls)},getComponentCls:function(){var cls,me=this;return cls=me.iconCls||me.icon||me.glyph?[me.text?"icon-text-"+me.iconAlign:"icon"]:me.text?["noicon"]:[],me.pressed&&(cls[cls.length]=me.pressedCls),cls},beforeRender:function(){var me=this,autoEl=me.autoEl,href=me.getHref(),hrefTarget=me.hrefTarget;me.disabled||(autoEl.tabIndex=me.tabIndex),href&&(autoEl.href=href,hrefTarget&&(autoEl.target=hrefTarget)),me.callParent(),me.oldCls=me.getComponentCls(),me.addClsWithUI(me.oldCls),Ext.applyIf(me.renderData,me.getTemplateArgs())},onRender:function(){var addOnclick,btn,btnListeners,me=this;me.doc=Ext.getDoc(),me.callParent(arguments),btn=me.el,me.tooltip&&me.setTooltip(me.tooltip,!0),me.handleMouseEvents?(btnListeners={scope:me,mouseover:me.onMouseOver,mouseout:me.onMouseOut,mousedown:me.onMouseDown},me.split&&(btnListeners.mousemove=me.onMouseMove)):btnListeners={scope:me},me.menu&&(me.mon(me.menu,{scope:me,show:me.onMenuShow,hide:me.onMenuHide}),me.keyMap=new Ext.util.KeyMap({target:me.el,key:Ext.EventObject.DOWN,handler:me.onDownKey,scope:me})),me.repeat?me.mon(new Ext.util.ClickRepeater(btn,Ext.isObject(me.repeat)?me.repeat:{}),"click",me.onRepeatClick,me):btnListeners[me.clickEvent]?addOnclick=!0:btnListeners[me.clickEvent]=me.onClick,me.mon(btn,btnListeners),me.hasFrameTable()&&me.mon(me.frameTable,"click",me.frameTableListener,me),addOnclick&&me.mon(btn,me.clickEvent,me.onClick,me),Ext.button.Manager.register(me)},getTemplateArgs:function(){var glyphParts,me=this,glyph=me.glyph,glyphFontFamily=Ext._glyphFontFamily;return"string"==typeof glyph&&(glyphParts=glyph.split("@"),glyph=glyphParts[0],glyphFontFamily=glyphParts[1]),{innerCls:me.getInnerCls(),splitCls:me.getSplitCls(),iconUrl:me.icon,iconCls:me.iconCls,glyph:glyph,glyphCls:glyph?me.glyphCls:"",glyphFontFamily:glyphFontFamily,text:me.text||"&#160;",closeText:me.closeText}},setHref:function(href){this.href=href,this.el.dom.href=this.getHref()},getHref:function(){var me=this,href=me.href;return!!href&&Ext.urlAppend(href,Ext.Object.toQueryString(Ext.apply({},me.params,me.baseParams)))},setParams:function(params){this.params=params,this.el.dom.href=this.getHref()},getSplitCls:function(){var me=this;return me.split?me.baseCls+"-"+me.arrowCls+" "+me.baseCls+"-"+me.arrowCls+"-"+me.arrowAlign:""},getInnerCls:function(){return this.textAlign?this.baseCls+"-inner-"+this.textAlign:""},setIcon:function(icon){icon=icon||"";var me=this,btnIconEl=me.btnIconEl,oldIcon=me.icon||"";return me.icon=icon,icon!=oldIcon&&(btnIconEl&&(btnIconEl.setStyle("background-image",icon?"url("+icon+")":""),me.setComponentCls(),me.didIconStateChange(oldIcon,icon)&&me.updateLayout()),me.fireEvent("iconchange",me,oldIcon,icon)),me},setIconCls:function(cls){cls=cls||"";var me=this,btnIconEl=me.btnIconEl,oldCls=me.iconCls||"";return me.iconCls=cls,oldCls!=cls&&(btnIconEl&&(btnIconEl.removeCls(oldCls),btnIconEl.addCls(cls),me.setComponentCls(),me.didIconStateChange(oldCls,cls)&&me.updateLayout()),me.fireEvent("iconchange",me,oldCls,cls)),me},setGlyph:function(glyph){glyph=glyph||0;var fontFamily,glyphParts,me=this,btnIconEl=me.btnIconEl,oldGlyph=me.glyph;return me.glyph=glyph,btnIconEl&&("string"==typeof glyph&&(glyphParts=glyph.split("@"),glyph=glyphParts[0],fontFamily=glyphParts[1]||Ext._glyphFontFamily),glyph?oldGlyph!=glyph&&(btnIconEl.dom.innerHTML="&#"+glyph+";"):btnIconEl.dom.innerHTML="",fontFamily&&btnIconEl.setStyle("font-family",fontFamily)),me.fireEvent("glyphchange",me,me.glyph,oldGlyph),me},setTooltip:function(tooltip,initial){var me=this;return me.rendered?(initial&&tooltip||me.clearTip(),tooltip&&(Ext.quickTipsActive&&Ext.isObject(tooltip)?(Ext.tip.QuickTipManager.register(Ext.apply({target:me.el.id},tooltip)),me.tooltip=tooltip):me.el.dom.setAttribute(me.getTipAttr(),tooltip))):me.tooltip=tooltip,me},setTextAlign:function(align){var me=this,btnEl=me.btnEl;return btnEl&&(btnEl.removeCls(me.baseCls+"-inner-"+me.textAlign),btnEl.addCls(me.baseCls+"-inner-"+align)),me.textAlign=align,me},getTipAttr:function(){return"qtip"==this.tooltipType?"data-qtip":"title"},getRefItems:function(deep){var items,menu=this.menu;return menu&&(items=menu.getRefItems(deep),items.unshift(menu)),items||[]},clearTip:function(){var me=this,el=me.el;Ext.quickTipsActive&&Ext.isObject(me.tooltip)?Ext.tip.QuickTipManager.unregister(el):el.dom.removeAttribute(me.getTipAttr())},beforeDestroy:function(){var me=this;me.rendered&&me.clearTip(),me.menu&&!1!==me.destroyMenu&&Ext.destroy(me.menu),Ext.destroy(me.btnInnerEl,me.repeater),me.callParent()},onDestroy:function(){var me=this;me.rendered&&(me.doc.un("mouseover",me.monitorMouseOver,me),delete me.doc,Ext.destroy(me.keyMap),delete me.keyMap),Ext.button.Manager.unregister(me),me.callParent()},setHandler:function(handler,scope){return this.handler=handler,this.scope=scope,this},setText:function(text){text=text||"";var me=this,oldText=me.text||"";return text!=oldText&&(me.text=text,me.rendered&&(me.btnInnerEl.update(text||"&#160;"),me.setComponentCls(),Ext.isStrict&&Ext.isIE8&&me.el.repaint(),me.updateLayout()),me.fireEvent("textchange",me,oldText,text)),me},didIconStateChange:function(old,current){var currentEmpty=Ext.isEmpty(current);return Ext.isEmpty(old)?!currentEmpty:currentEmpty},getText:function(){return this.text},toggle:function(state,suppressEvent){var me=this;return state=void 0===state?!me.pressed:!!state,state!==me.pressed&&(me.rendered&&me[state?"addClsWithUI":"removeClsWithUI"](me.pressedCls),me.pressed=state,suppressEvent||(me.fireEvent("toggle",me,state),Ext.callback(me.toggleHandler,me.scope||me,[me,state]))),me},maybeShowMenu:function(){var me=this;!me.menu||me.hasVisibleMenu()||me.ignoreNextClick||me.showMenu(!0)},showMenu:function(fromEvent){var me=this,menu=me.menu;return me.rendered&&(me.tooltip&&Ext.quickTipsActive&&"title"!=me.getTipAttr()&&Ext.tip.QuickTipManager.getQuickTip().cancelShow(me.el),menu.isVisible()&&menu.hide(),(!fromEvent||me.showEmptyMenu||menu.items.getCount()>0)&&menu.showBy(me.el,me.menuAlign)),me},hideMenu:function(){return this.hasVisibleMenu()&&this.menu.hide(),this},hasVisibleMenu:function(){var menu=this.menu;return menu&&menu.rendered&&menu.isVisible()},onRepeatClick:function(repeat,e){this.onClick(e)},onClick:function(e){var me=this;me.doPreventDefault(e),"keydown"!==e.type&&0!==e.button||me.disabled||(me.doToggle(),me.maybeShowMenu(),me.fireHandler(e))},doPreventDefault:function(e){(this.preventDefault||this.disabled&&this.getHref()&&e)&&e.preventDefault()},fireHandler:function(e){var me=this,handler=me.handler;!1!==me.fireEvent("click",me,e)&&handler&&handler.call(me.scope||me,me,e)},doToggle:function(){var me=this;!me.enableToggle||!1===me.allowDepress&&me.pressed||me.toggle()},onMouseOver:function(e){var me=this;me.disabled||e.within(me.el,!0,!0)||me.onMouseEnter(e)},onMouseOut:function(e){var me=this;e.within(me.el,!0,!0)||(me.overMenuTrigger&&me.onMenuTriggerOut(e),me.onMouseLeave(e))},onMouseMove:function(e){var overPosition,triggerRegion,me=this,el=me.el,over=me.overMenuTrigger;me.split&&(overPosition="right"===me.arrowAlign?e.getX()-me.getX():e.getY()-el.getY(),triggerRegion=me.getTriggerRegion(),overPosition>triggerRegion.begin&&overPosition<triggerRegion.end?over||me.onMenuTriggerOver(e):over&&me.onMenuTriggerOut(e))},getTriggerRegion:function(){var me=this,region=me._triggerRegion,triggerSize=me.getTriggerSize(),btnSize="right"===me.arrowAlign?me.getWidth():me.getHeight();return region.begin=btnSize-triggerSize,region.end=btnSize,region},getTriggerSize:function(){var side,sideFirstLetter,me=this,size=me.triggerSize;return null==size&&(side=me.arrowAlign,sideFirstLetter=side.charAt(0),size=me.triggerSize=me.el.getFrameWidth(sideFirstLetter)+me.getBtnWrapFrameWidth(sideFirstLetter),me.frameSize&&(size=me.triggerSize+=me.frameSize[side])),size},getBtnWrapFrameWidth:function(side){return this.btnWrap.getFrameWidth(side)},addOverCls:function(){this.disabled||this.addClsWithUI(this.overCls)},removeOverCls:function(){this.removeClsWithUI(this.overCls)},onMouseEnter:function(e){this.fireEvent("mouseover",this,e)},onMouseLeave:function(e){this.fireEvent("mouseout",this,e)},onMenuTriggerOver:function(e){var me=this,arrowTip=me.arrowTooltip;me.overMenuTrigger=!0,me.split&&arrowTip&&me.btnWrap.dom.setAttribute(me.getTipAttr(),arrowTip),me.fireEvent("menutriggerover",me,me.menu,e)},onMenuTriggerOut:function(e){var me=this;delete me.overMenuTrigger,me.split&&me.arrowTooltip&&me.btnWrap.dom.setAttribute(me.getTipAttr(),""),me.fireEvent("menutriggerout",me,me.menu,e)},enable:function(silent){var me=this;return me.callParent(arguments),me.removeClsWithUI("disabled"),me.rendered&&me.el.dom.setAttribute("tabIndex",me.tabIndex),me},disable:function(silent){var me=this;return me.callParent(arguments),me.addClsWithUI("disabled"),me.removeClsWithUI(me.overCls),me.rendered&&me.el.dom.removeAttribute("tabIndex"),me.btnInnerEl&&Ext.isIE7m&&me.btnInnerEl.repaint(),me},setScale:function(scale){var me=this,ui=me.ui.replace("-"+me.scale,"");if(!Ext.Array.contains(me.allowedScales,scale))throw"#setScale: scale must be an allowed scale ("+me.allowedScales.join(", ")+")";me.scale=scale,me.setUI(ui)},setUI:function(ui){var me=this;me.scale&&!ui.match(me.scale)&&(ui=ui+"-"+me.scale),me.callParent([ui])},onMouseDown:function(e){var me=this;Ext.isIE&&me.getFocusEl().focus(),me.disabled||0!==e.button||(Ext.button.Manager.onButtonMousedown(me,e),me.addClsWithUI(me.pressedCls))},onMouseUp:function(e){var me=this;me.isDestroyed||0!==e.button||me.pressed||me.removeClsWithUI(me.pressedCls)},onMenuShow:function(e){var me=this;me.ignoreNextClick=0,me.addClsWithUI(me.menuActiveCls),me.fireEvent("menushow",me,me.menu)},onMenuHide:function(e){var me=this;me.removeClsWithUI(me.menuActiveCls),me.ignoreNextClick=Ext.defer(me.restoreClick,250,me),me.fireEvent("menuhide",me,me.menu),me.focus()},restoreClick:function(){this.ignoreNextClick=0},onDownKey:function(k,e){var me=this;if(me.menu&&!me.disabled)return me.showMenu(),e.stopEvent(),!1}});Ext.define("Ext.layout.container.boxOverflow.Menu",{extend:"Ext.layout.container.boxOverflow.None",requires:["Ext.toolbar.Separator","Ext.button.Button"],alternateClassName:"Ext.layout.boxOverflow.Menu",noItemsMenuText:'<div class="'+Ext.baseCSSPrefix+'toolbar-no-items" role="menuitem">(None)</div>',constructor:function(layout){var me=this;me.callParent(arguments),me.triggerButtonCls=me.triggerButtonCls||Ext.baseCSSPrefix+"box-menu-after",me.menuItems=[]},beginLayout:function(ownerContext){this.callParent(arguments),this.clearOverflow(ownerContext)},beginLayoutCycle:function(ownerContext,firstCycle){this.callParent(arguments),firstCycle||(this.clearOverflow(ownerContext),this.layout.cacheChildItems(ownerContext))},onRemove:function(comp){Ext.Array.remove(this.menuItems,comp)},getSuffixConfig:function(){var me=this,layout=me.layout,owner=layout.owner,oid=owner.id;return me.menu=new Ext.menu.Menu({listeners:{scope:me,beforeshow:me.beforeMenuShow}}),me.menuTrigger=new Ext.button.Button({id:oid+"-menu-trigger",cls:Ext.layout.container.Box.prototype.innerCls+" "+me.triggerButtonCls+" "+Ext.baseCSSPrefix+"toolbar-item",plain:owner.usePlainButtons,ownerCt:owner,ownerLayout:layout,iconCls:Ext.baseCSSPrefix+me.getOwnerType(owner)+"-more-icon",ui:owner instanceof Ext.toolbar.Toolbar?"default-toolbar":"default",menu:me.menu,showEmptyMenu:!0,getSplitCls:function(){return""}}),me.menuTrigger.getRenderTree()},getOverflowCls:function(){return Ext.baseCSSPrefix+this.layout.direction+"-box-overflow-body"},handleOverflow:function(ownerContext){var me=this,layout=me.layout,names=layout.names,plan=ownerContext.state.boxPlan,posArgs=[null,null];return me.showTrigger(ownerContext),"vertical"!==me.layout.direction&&(posArgs[names.heightIndex]=(plan.maxSize-me.menuTrigger[names.getHeight]())/2,me.menuTrigger.setPosition.apply(me.menuTrigger,posArgs)),{reservedSpace:me.triggerTotalWidth}},captureChildElements:function(){var me=this,menuTrigger=me.menuTrigger,names=me.layout.names;menuTrigger.rendering&&(menuTrigger.finishRender(),me.triggerTotalWidth=menuTrigger[names.getWidth]()+menuTrigger.el.getMargin(names.parallelMargins))},_asLayoutRoot:{isRoot:!0},clearOverflow:function(ownerContext){var item,me=this,items=me.menuItems,i=0,length=items.length,owner=me.layout.owner,asLayoutRoot=me._asLayoutRoot;for(owner.suspendLayouts(),me.captureChildElements(),me.hideTrigger(),owner.resumeLayouts();i<length;i++)item=items[i],item.suspendLayouts(),item.show(),item.resumeLayouts(asLayoutRoot);items.length=0},showTrigger:function(ownerContext){var childContext,comp,i,props,me=this,layout=me.layout,owner=layout.owner,names=layout.names,startProp=names.x,sizeProp=names.width,plan=ownerContext.state.boxPlan,available=plan.targetSize[sizeProp],childItems=ownerContext.childItems,len=childItems.length,menuTrigger=me.menuTrigger;for(menuTrigger.suspendLayouts(),menuTrigger.show(),menuTrigger.resumeLayouts(me._asLayoutRoot),available-=me.triggerTotalWidth,owner.suspendLayouts(),me.menuItems.length=0,i=0;i<len;i++)childContext=childItems[i],props=childContext.props,props[startProp]+props[sizeProp]>available&&(comp=childContext.target,me.menuItems.push(comp),comp.hide());owner.resumeLayouts()},hideTrigger:function(){var menuTrigger=this.menuTrigger;menuTrigger&&menuTrigger.hide()},beforeMenuShow:function(menu){var item,prev,me=this,items=me.menuItems,i=0,len=items.length,needsSep=function(group,prev){return group.isXType("buttongroup")&&!(prev instanceof Ext.toolbar.Separator)};for(menu.suspendLayouts(),me.clearMenu(),menu.removeAll();i<len;i++)item=items[i],!i&&item instanceof Ext.toolbar.Separator||(prev&&(needsSep(item,prev)||needsSep(prev,item))&&menu.add("-"),me.addComponentToMenu(menu,item),prev=item);menu.items.length<1&&menu.add(me.noItemsMenuText),menu.resumeLayouts()},createMenuConfig:function(component,hideOnClick){var me=this,config=Ext.apply({},component.initialConfig),group=component.toggleGroup;return Ext.copyTo(config,component,["iconCls","icon","itemId","disabled","handler","scope","menu","tabIndex"]),Ext.apply(config,{text:component.overflowText||component.text,hideOnClick:hideOnClick,destroyMenu:!1,listeners:{}}),component.isFormField?(config.value=component.getValue(),config.listeners.change=function(c,newVal,oldVal){component.setValue(newVal)}):(group||component.enableToggle)&&Ext.apply(config,{hideOnClick:!1,group:group,checked:component.pressed,handler:function(item,e){component.onClick(e)}}),component.isButton&&!component.changeListenersAdded&&(component.on({textchange:me.onButtonAttrChange,iconchange:me.onButtonAttrChange,toggle:me.onButtonToggle}),component.changeListenersAdded=!0),delete config.margin,delete config.ownerCt,delete config.xtype,delete config.id,delete config.itemId,config},onButtonAttrChange:function(btn){var clone=btn.overflowClone;clone.suspendLayouts(),clone.setText(btn.text),clone.setIcon(btn.icon),clone.setIconCls(btn.iconCls),clone.resumeLayouts(!0)},onButtonToggle:function(btn,state){btn.overflowClone.checked!==state&&btn.overflowClone.setChecked(state)},addComponentToMenu:function(menu,component){var i,items,iLen,me=this;if(component instanceof Ext.toolbar.Separator)menu.add("-");else if(component.isComponent)if(component.isXType("splitbutton"))component.overflowClone=menu.add(me.createMenuConfig(component,!0));else if(component.isXType("button"))component.overflowClone=menu.add(me.createMenuConfig(component,!component.menu));else if(component.isXType("buttongroup"))for(items=component.items.items,iLen=items.length,i=0;i<iLen;i++)me.addComponentToMenu(menu,items[i]);else component.overflowClone=menu.add(Ext.create(Ext.getClassName(component),me.createMenuConfig(component)))},clearMenu:function(){var items,i,iLen,item,menu=this.menu;if(menu&&menu.items)for(items=menu.items.items,iLen=items.length,i=0;i<iLen;i++)item=items[i],item.setMenu&&item.setMenu(null)},destroy:function(){var trigger=this.menuTrigger;trigger&&!this.layout.owner.items.contains(trigger)&&delete trigger.ownerCt,Ext.destroy(this.menu,trigger)}});Ext.define("Ext.layout.container.boxOverflow.Scroller",{extend:"Ext.layout.container.boxOverflow.None",requires:["Ext.util.ClickRepeater","Ext.Element"],alternateClassName:"Ext.layout.boxOverflow.Scroller",mixins:{observable:"Ext.util.Observable"},animateScroll:!1,scrollIncrement:20,wheelIncrement:10,scrollRepeatInterval:60,scrollDuration:400,scrollerCls:Ext.baseCSSPrefix+"box-scroller",constructor:function(layout,config){var me=this;me.layout=layout,Ext.apply(me,config||{}),me.mixins.observable.constructor.call(me),me.addEvents("scroll"),me.scrollPosition=0,me.scrollSize=0},getPrefixConfig:function(){var cls,me=this,layout=me.layout,owner=layout.owner;return me.initCSSClasses(),cls=Ext.layout.container.Box.prototype.innerCls+" "+me.beforeCtCls,owner.plain&&(cls+=" "+me.scrollerCls+"-plain"),{role:"presentation",cls:cls,cn:{role:"presentation",id:owner.id+layout.names.beforeScrollerSuffix,cls:me.scrollerCls+" "+me.beforeScrollerCls,style:"display:none"}}},getSuffixConfig:function(){var me=this,layout=me.layout,owner=layout.owner,cls=Ext.layout.container.Box.prototype.innerCls+" "+me.afterCtCls;return owner.plain&&(cls+=" "+me.scrollerCls+"-plain"),{role:"presentation",cls:cls,cn:{role:"presentation",id:owner.id+layout.names.afterScrollerSuffix,cls:me.scrollerCls+" "+me.afterScrollerCls,style:"display:none"}}},getOverflowCls:function(){return Ext.baseCSSPrefix+this.layout.direction+"-box-overflow-body"},initCSSClasses:function(){var me=this,prefix=Ext.baseCSSPrefix,layout=me.layout,names=layout.names,beforeXName=names.beforeX,afterXName=names.afterX,type=me.getOwnerType(layout.owner);me.beforeCtCls=me.beforeCtCls||prefix+"box-scroller-"+beforeXName,me.afterCtCls=me.afterCtCls||prefix+"box-scroller-"+afterXName,me.beforeScrollerCls=me.beforeScrollerCls||prefix+type+"-scroll-"+beforeXName,me.afterScrollerCls=me.afterScrollerCls||prefix+type+"-scroll-"+afterXName},beginLayout:function(ownerContext){this.layout;ownerContext.innerCtScrollPos=this.getScrollPosition(),this.callParent(arguments)},completeLayout:function(ownerContext){var last,me=this,plan=ownerContext.state.boxPlan,names=me.layout.names;plan&&plan.tooNarrow&&(last=ownerContext.childItems[ownerContext.childItems.length-1],me.scrollSize=last.props[names.x]+last.props[names.width],me.updateScrollButtons()),this.callParent(arguments)},finishedLayout:function(ownerContext){var me=this,layout=me.layout,scrollPos=Math.min(me.getMaxScrollPosition(),ownerContext.innerCtScrollPos);layout.innerCt[layout.names.setScrollLeft](scrollPos)},handleOverflow:function(ownerContext){var me=this,methodName=me.layout.names.getWidth;return me.showScrollers(),{reservedSpace:me.beforeCt[methodName]()+me.afterCt[methodName]()}},captureChildElements:function(){var before,after,hoverCls,pressedSuffix,pressedCls,hoverSuffix,me=this,el=me.layout.owner.el;me.beforeCt||(hoverSuffix="-hover",pressedSuffix="-pressed",hoverCls=me.scrollerCls+hoverSuffix,pressedCls=me.scrollerCls+pressedSuffix,before=me.beforeScroller=el.getById(me.layout.owner.id+"-before-scroller"),after=me.afterScroller=el.getById(me.layout.owner.id+"-after-scroller"),me.beforeCt=before.up(""),me.afterCt=after.up(""),me.createWheelListener(),before.addClsOnOver(hoverCls),before.addClsOnOver(me.beforeScrollerCls+hoverSuffix),before.addClsOnClick(pressedCls),before.addClsOnClick(me.beforeScrollerCls+pressedSuffix),after.addClsOnOver(hoverCls),after.addClsOnOver(me.afterScrollerCls+hoverSuffix),after.addClsOnClick(pressedCls),after.addClsOnClick(me.afterScrollerCls+pressedSuffix),before.setVisibilityMode(Ext.Element.DISPLAY),after.setVisibilityMode(Ext.Element.DISPLAY),me.beforeRepeater=new Ext.util.ClickRepeater(before,{interval:me.scrollRepeatInterval,handler:me.scrollLeft,scope:me}),me.afterRepeater=new Ext.util.ClickRepeater(after,{interval:me.scrollRepeatInterval,handler:me.scrollRight,scope:me}))},createWheelListener:function(){var me=this;me.layout.innerCt.on({mousewheel:function(e){me.scrollBy(me.getWheelDelta(e)*me.wheelIncrement*-1,!1)},stopEvent:!0})},getWheelDelta:function(e){return e.getWheelDelta()},clearOverflow:function(){this.hideScrollers()},showScrollers:function(){var me=this;me.captureChildElements(),me.beforeScroller.show(),me.afterScroller.show(),me.layout.owner.addClsWithUI("vertical"===me.layout.direction?"vertical-scroller":"scroller")},hideScrollers:function(){var me=this;void 0!==me.beforeScroller&&(me.beforeScroller.hide(),me.afterScroller.hide(),me.layout.owner.removeClsWithUI("vertical"===me.layout.direction?"vertical-scroller":"scroller"))},destroy:function(){var me=this;Ext.destroy(me.beforeRepeater,me.afterRepeater,me.beforeScroller,me.afterScroller,me.beforeCt,me.afterCt)},scrollBy:function(delta,animate){this.scrollTo(this.getScrollPosition()+delta,animate)},getScrollAnim:function(){return{duration:this.scrollDuration,callback:this.updateScrollButtons,scope:this}},updateScrollButtons:function(){var beforeMeth,afterMeth,beforeCls,afterCls,disabledCls,me=this;null!=me.beforeScroller&&null!=me.afterScroller&&(beforeMeth=me.atExtremeBefore()?"addCls":"removeCls",afterMeth=me.atExtremeAfter()?"addCls":"removeCls",disabledCls=me.scrollerCls+"-disabled",beforeCls=[disabledCls,me.beforeScrollerCls+"-disabled"],afterCls=[disabledCls,me.afterScrollerCls+"-disabled"],me.beforeScroller[beforeMeth](beforeCls),me.afterScroller[afterMeth](afterCls),me.scrolling=!1)},scrollLeft:function(){this.scrollBy(-this.scrollIncrement,!1)},scrollRight:function(){this.scrollBy(this.scrollIncrement,!1)},getScrollPosition:function(){var me=this,layout=me.layout;return isNaN(me.scrollPosition)?layout.innerCt[layout.names.getScrollLeft]():me.scrollPosition},getMaxScrollPosition:function(){var me=this,layout=me.layout,maxScrollPos=me.scrollSize-layout.innerCt[layout.names.getWidth]();return maxScrollPos<0?0:maxScrollPos},atExtremeBefore:function(){return!this.getScrollPosition()},atExtremeAfter:function(){return this.getScrollPosition()>=this.getMaxScrollPosition()},scrollTo:function(position,animate){var me=this,layout=me.layout,names=layout.names,oldPosition=me.getScrollPosition(),newPosition=Ext.Number.constrain(position,0,me.getMaxScrollPosition());newPosition==oldPosition||me.scrolling||(me.scrollPosition=NaN,void 0===animate&&(animate=me.animateScroll),layout.innerCt[names.scrollTo](names.beforeScrollX,newPosition,!!animate&&me.getScrollAnim()),animate?me.scrolling=!0:me.updateScrollButtons(),me.fireEvent("scroll",me,newPosition,!!animate&&me.getScrollAnim()))},scrollToItem:function(item,animate){var visibility,box,newPos,me=this,layout=me.layout,owner=layout.owner,names=layout.names;void 0!==(item=me.getItem(item))&&(item==owner.items.first()?newPos=0:item===owner.items.last()?newPos=me.getMaxScrollPosition():(visibility=me.getItemVisibility(item),visibility.fullyVisible||(box=item.getBox(!1,!0),newPos=box[names.x],visibility.hiddenEnd&&(newPos-=me.layout.innerCt[names.getWidth]()-box[names.width]))),void 0!==newPos&&me.scrollTo(newPos,animate))},getItemVisibility:function(item){var me=this,box=me.getItem(item).getBox(!0,!0),layout=me.layout,names=layout.names,itemStart=box[names.x],itemEnd=itemStart+box[names.width],scrollStart=me.getScrollPosition(),scrollEnd=scrollStart+layout.innerCt[names.getWidth]();return{hiddenStart:itemStart<scrollStart,hiddenEnd:itemEnd>scrollEnd,fullyVisible:itemStart>scrollStart&&itemEnd<scrollEnd}}});Ext.define("Ext.util.Offset",{statics:{fromObject:function(obj){return new this(obj.x,obj.y)}},constructor:function(x,y){return this.x=null==x||isNaN(x)?0:x,this.y=null==y||isNaN(y)?0:y,this},copy:function(){return new Ext.util.Offset(this.x,this.y)},copyFrom:function(p){this.x=p.x,this.y=p.y},toString:function(){return"Offset["+this.x+","+this.y+"]"},equals:function(offset){return offset instanceof this.statics()||Ext.Error.raise("Offset must be an instance of Ext.util.Offset"),this.x==offset.x&&this.y==offset.y},round:function(to){if(isNaN(to))this.x=Math.round(this.x),this.y=Math.round(this.y);else{var factor=Math.pow(10,to);this.x=Math.round(this.x*factor)/factor,this.y=Math.round(this.y*factor)/factor}},isZero:function(){return 0==this.x&&0==this.y}});Ext.define("Ext.util.Region",{requires:["Ext.util.Offset"],statics:{getRegion:function(el){return Ext.fly(el).getRegion()},from:function(o){return new this(o.top,o.right,o.bottom,o.left)}},constructor:function(t,r,b,l){var me=this;me.y=me.top=me[1]=t,me.right=r,me.bottom=b,me.x=me.left=me[0]=l},contains:function(region){var me=this;return region.x>=me.x&&region.right<=me.right&&region.y>=me.y&&region.bottom<=me.bottom},intersect:function(region){var me=this,t=Math.max(me.y,region.y),r=Math.min(me.right,region.right),b=Math.min(me.bottom,region.bottom),l=Math.max(me.x,region.x);return b>t&&r>l&&new this.self(t,r,b,l)},union:function(region){var me=this,t=Math.min(me.y,region.y),r=Math.max(me.right,region.right),b=Math.max(me.bottom,region.bottom),l=Math.min(me.x,region.x);return new this.self(t,r,b,l)},constrainTo:function(r){var me=this,constrain=Ext.Number.constrain;return me.top=me.y=constrain(me.top,r.y,r.bottom),me.bottom=constrain(me.bottom,r.y,r.bottom),me.left=me.x=constrain(me.left,r.x,r.right),me.right=constrain(me.right,r.x,r.right),me},adjust:function(t,r,b,l){var me=this;return me.top=me.y+=t,me.left=me.x+=l,me.right+=r,me.bottom+=b,me},getOutOfBoundOffset:function(axis,p){if(Ext.isObject(axis)){p=axis;var d=new Ext.util.Offset;return d.x=this.getOutOfBoundOffsetX(p.x),d.y=this.getOutOfBoundOffsetY(p.y),d}return"x"==axis?this.getOutOfBoundOffsetX(p):this.getOutOfBoundOffsetY(p)},getOutOfBoundOffsetX:function(p){return p<=this.x?this.x-p:p>=this.right?this.right-p:0},getOutOfBoundOffsetY:function(p){return p<=this.y?this.y-p:p>=this.bottom?this.bottom-p:0},isOutOfBound:function(axis,p){return Ext.isObject(axis)?(p=axis,this.isOutOfBoundX(p.x)||this.isOutOfBoundY(p.y)):"x"==axis?this.isOutOfBoundX(p):this.isOutOfBoundY(p)},isOutOfBoundX:function(p){return p<this.x||p>this.right},isOutOfBoundY:function(p){return p<this.y||p>this.bottom},restrict:function(axis,p,factor){if(Ext.isObject(axis)){var newP;return factor=p,p=axis,newP=p.copy?p.copy():{x:p.x,y:p.y},newP.x=this.restrictX(p.x,factor),newP.y=this.restrictY(p.y,factor),newP}return"x"==axis?this.restrictX(p,factor):this.restrictY(p,factor)},restrictX:function(p,factor){return factor||(factor=1),p<=this.x?p-=(p-this.x)*factor:p>=this.right&&(p-=(p-this.right)*factor),p},restrictY:function(p,factor){return factor||(factor=1),p<=this.y?p-=(p-this.y)*factor:p>=this.bottom&&(p-=(p-this.bottom)*factor),p},getSize:function(){return{width:this.right-this.x,height:this.bottom-this.y}},copy:function(){return new this.self(this.y,this.right,this.bottom,this.x)},copyFrom:function(p){var me=this;return me.top=me.y=me[1]=p.y,me.right=p.right,me.bottom=p.bottom,me.left=me.x=me[0]=p.x,this},toString:function(){return"Region["+this.top+","+this.right+","+this.bottom+","+this.left+"]"},translateBy:function(x,y){1==arguments.length&&(y=x.y,x=x.x);var me=this;return me.top=me.y+=y,me.right+=x,me.bottom+=y,me.left=me.x+=x,me},round:function(){var me=this;return me.top=me.y=Math.round(me.y),me.right=Math.round(me.right),me.bottom=Math.round(me.bottom),me.left=me.x=Math.round(me.x),me},equals:function(region){return this.top==region.top&&this.right==region.right&&this.bottom==region.bottom&&this.left==region.left}});Ext.define("Ext.dd.DragDropManager",{singleton:!0,requires:["Ext.util.Region"],uses:["Ext.tip.QuickTipManager"],alternateClassName:["Ext.dd.DragDropMgr","Ext.dd.DDM"],ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:!0,stopPropagation:!0,initialized:!1,locked:!1,init:function(){this.initialized=!0},POINT:0,INTERSECT:1,mode:0,notifyOccluded:!1,dragCls:Ext.baseCSSPrefix+"dd-drag-current",_execOnAll:function(sMethod,args){var i,j,oDD,item,ids=this.ids;for(i in ids)if(ids.hasOwnProperty(i)){item=ids[i];for(j in item)if(item.hasOwnProperty(j)){if(oDD=item[j],!this.isTypeOfDD(oDD))continue;oDD[sMethod].apply(oDD,args)}}},_onLoad:function(){this.init();var Event=Ext.EventManager;Event.on(document,"mouseup",this.handleMouseUp,this,!0),Event.on(document,"mousemove",this.handleMouseMove,this,!0),Event.on(window,"unload",this._onUnload,this,!0),Event.on(window,"resize",this._onResize,this,!0)},_onResize:function(e){this._execOnAll("resetConstraints",[])},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},isLocked:function(){return this.locked},locationCache:{},useCache:!0,clickPixelThresh:3,clickTimeThresh:350,dragThreshMet:!1,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,sGroup){this.initialized||this.init(),this.ids[sGroup]||(this.ids[sGroup]={}),this.ids[sGroup][oDD.id]=oDD},removeDDFromGroup:function(oDD,sGroup){this.ids[sGroup]||(this.ids[sGroup]={});var obj=this.ids[sGroup];obj&&obj[oDD.id]&&delete obj[oDD.id]},_remove:function(oDD,clearGroup){if(!this.clearingAll){var g,ids=this.ids,groups=oDD.groups;for(g in groups)groups.hasOwnProperty(g)&&(clearGroup?delete ids[g]:ids[g]&&delete ids[g][oDD.id]);delete this.handleIds[oDD.id]}},regHandle:function(sDDId,sHandleId){this.handleIds[sDDId]||(this.handleIds[sDDId]={}),this.handleIds[sDDId][sHandleId]=sHandleId},isDragDrop:function(id){return!!this.getDDById(id)},getRelated:function(p_oDD,bTargetsOnly){var i,j,dd,oDDs=[];for(i in p_oDD.groups)for(j in this.ids[i])dd=this.ids[i][j],this.isTypeOfDD(dd)&&(bTargetsOnly&&!dd.isTarget||(oDDs[oDDs.length]=dd));return oDDs},isLegalTarget:function(oDD,oTargetDD){var i,len,targets=this.getRelated(oDD,!0);for(i=0,len=targets.length;i<len;++i)if(targets[i].id==oTargetDD.id)return!0;return!1},isTypeOfDD:function(oDD){return oDD&&oDD.__ygDragDrop},isHandle:function(sDDId,sHandleId){return this.handleIds[sDDId]&&this.handleIds[sDDId][sHandleId]},getDDById:function(id){var i,dd;for(i in this.ids)if((dd=this.ids[i][id])instanceof Ext.dd.DDTarget)return dd;return null},handleMouseDown:function(e,oDD){var el,me=this;Ext.quickTipsActive&&Ext.tip.QuickTipManager.ddDisable(),me.dragCurrent&&me.handleMouseUp(e),me.mousedownEvent=e.clone(),me.currentTarget=e.getTarget(),me.dragCurrent=oDD,el=oDD.getEl(),Ext.isIE9m&&el.setCapture&&el.setCapture(),me.startX=e.getPageX(),me.startY=e.getPageY(),me.deltaX=me.startX-el.offsetLeft,me.deltaY=me.startY-el.offsetTop,me.dragThreshMet=!1,me.clickTimeout=setTimeout(function(){me.startDrag(me.startX,me.startY)},me.clickTimeThresh)},startDrag:function(x,y){var dragEl,me=this,current=me.dragCurrent;clearTimeout(me.clickTimeout),current&&(current.b4StartDrag(x,y),current.startDrag(x,y),(dragEl=current.getDragEl())&&Ext.fly(dragEl).addCls(me.dragCls)),me.dragThreshMet=!0},handleMouseUp:function(e){var me=this;Ext.quickTipsActive&&Ext.tip.QuickTipManager.ddEnable(),me.dragCurrent&&(Ext.isIE&&document.releaseCapture&&document.releaseCapture(),clearTimeout(me.clickTimeout),me.dragThreshMet&&me.fireEvents(e,!0),me.stopDrag(e),me.stopEvent(e))},stopEvent:function(e){this.stopPropagation&&e.stopPropagation(),this.preventDefault&&e.preventDefault()},stopDrag:function(e){var dragEl,me=this,current=me.dragCurrent;current&&(me.dragThreshMet&&(dragEl=current.getDragEl(),dragEl&&Ext.fly(dragEl).removeCls(me.dragCls),current.b4EndDrag(e),current.endDrag(e)),me.dragCurrent.onMouseUp(e)),me.dragCurrent=null,me.dragOvers={}},handleMouseMove:function(e){var diffX,diffY,me=this,current=me.dragCurrent;return!current||(me.dragThreshMet||(diffX=Math.abs(me.startX-e.getPageX()),diffY=Math.abs(me.startY-e.getPageY()),(diffX>me.clickPixelThresh||diffY>me.clickPixelThresh)&&me.startDrag(me.startX,me.startY)),me.dragThreshMet&&(current.b4Drag(e),current.onDrag(e),current.moveOnly||me.fireEvents(e,!1)),me.stopEvent(e),!0)},fireEvents:function(e,isDrop){var dragEl,oldDragElTop,overTarget,overTargetEl,xy,needsSort,i,len,sGroup,me=this,dragCurrent=me.dragCurrent,mousePoint=e.getPoint(),allTargets=[],oldOvers=[],outEvts=[],overEvts=[],dropEvts=[],enterEvts=[];if(dragCurrent&&!dragCurrent.isLocked()){me.notifyOccluded||Ext.supports.PointerEvents&&!Ext.isIE10m&&!Ext.isOpera||dragCurrent.deltaX<0||dragCurrent.deltaY<0||(dragEl=dragCurrent.getDragEl(),oldDragElTop=dragEl.style.top,dragEl.style.top="-10000px",xy=e.getXY(),e.target=document.elementFromPoint(xy[0],xy[1]),dragEl.style.top=oldDragElTop);for(i in me.dragOvers)overTarget=me.dragOvers[i],me.isTypeOfDD(overTarget)&&(me.notifyOccluded?this.isOverTarget(mousePoint,overTarget,me.mode)||outEvts.push(overTarget):e.within(overTarget.getEl())||outEvts.push(overTarget),oldOvers[i]=!0,delete me.dragOvers[i]);for(sGroup in dragCurrent.groups)if("string"==typeof sGroup)for(i in me.ids[sGroup])if(overTarget=me.ids[sGroup][i],me.isTypeOfDD(overTarget)&&(overTargetEl=overTarget.getEl())&&overTarget.isTarget&&!overTarget.isLocked()&&Ext.fly(overTargetEl).isVisible(!0)&&(overTarget!=dragCurrent||!1===dragCurrent.ignoreSelf))if(me.notifyOccluded)-1!==(overTarget.zIndex=me.getZIndex(overTargetEl))&&(needsSort=!0),allTargets.push(overTarget);else if(e.within(overTarget.getEl())){allTargets.push(overTarget);break}for(needsSort&&Ext.Array.sort(allTargets,me.byZIndex),i=0,len=allTargets.length;i<len&&(overTarget=allTargets[i],!me.isOverTarget(mousePoint,overTarget,me.mode)||(isDrop?dropEvts.push(overTarget):(oldOvers[overTarget.id]?overEvts.push(overTarget):enterEvts.push(overTarget),me.dragOvers[overTarget.id]=overTarget),me.notifyOccluded));i++);if(me.mode)outEvts.length&&(dragCurrent.b4DragOut(e,outEvts),dragCurrent.onDragOut(e,outEvts)),enterEvts.length&&dragCurrent.onDragEnter(e,enterEvts),overEvts.length&&(dragCurrent.b4DragOver(e,overEvts),dragCurrent.onDragOver(e,overEvts)),dropEvts.length&&(dragCurrent.b4DragDrop(e,dropEvts),dragCurrent.onDragDrop(e,dropEvts));else{for(i=0,len=outEvts.length;i<len;++i)dragCurrent.b4DragOut(e,outEvts[i].id),dragCurrent.onDragOut(e,outEvts[i].id);for(i=0,len=enterEvts.length;i<len;++i)dragCurrent.onDragEnter(e,enterEvts[i].id);for(i=0,len=overEvts.length;i<len;++i)dragCurrent.b4DragOver(e,overEvts[i].id),dragCurrent.onDragOver(e,overEvts[i].id);for(i=0,len=dropEvts.length;i<len;++i)dragCurrent.b4DragDrop(e,dropEvts[i].id),dragCurrent.onDragDrop(e,dropEvts[i].id)}isDrop&&!dropEvts.length&&dragCurrent.onInvalidDrop(e)}},getZIndex:function(element){var z,body=document.body,zIndex=-1;for(element=Ext.getDom(element);element!==body;)isNaN(z=Number(Ext.fly(element).getStyle("zIndex")))||(zIndex=z),element=element.parentNode;return zIndex},byZIndex:function(d1,d2){return d1.zIndex<d2.zIndex},getBestMatch:function(dds){var i,dd,winner=null,len=dds.length;if(1==len)winner=dds[0];else for(i=0;i<len;++i){if(dd=dds[i],dd.cursorIsOver){winner=dd;break}(!winner||winner.overlap.getArea()<dd.overlap.getArea())&&(winner=dd)}return winner},refreshCache:function(groups){var sGroup,i,oDD,loc;for(sGroup in groups)if("string"==typeof sGroup)for(i in this.ids[sGroup])oDD=this.ids[sGroup][i],this.isTypeOfDD(oDD)&&(loc=this.getLocation(oDD),loc?this.locationCache[oDD.id]=loc:delete this.locationCache[oDD.id])},verifyEl:function(el){if(el){var parent;if(Ext.isIE)try{parent=el.offsetParent}catch(e){}else parent=el.offsetParent;if(parent)return!0}return!1},getLocation:function(oDD){if(!this.isTypeOfDD(oDD))return null;if(oDD.getRegion)return oDD.getRegion();var pos,x1,x2,y1,y2,t,r,b,l,el=oDD.getEl();try{pos=Ext.Element.getXY(el)}catch(e){}return pos?(x1=pos[0],x2=x1+el.offsetWidth,y1=pos[1],y2=y1+el.offsetHeight,t=y1-oDD.padding[0],r=x2+oDD.padding[1],b=y2+oDD.padding[2],l=x1-oDD.padding[3],new Ext.util.Region(t,r,b,l)):null},isOverTarget:function(pt,oTarget,intersect){var dc,pos,el,curRegion,overlap,loc=this.locationCache[oTarget.id];return loc&&this.useCache||(loc=this.getLocation(oTarget),this.locationCache[oTarget.id]=loc),!!loc&&(oTarget.cursorIsOver=loc.contains(pt),(dc=this.dragCurrent)&&dc.getTargetCoord&&(intersect||dc.constrainX||dc.constrainY)?(oTarget.overlap=null,pos=dc.getTargetCoord(pt.x,pt.y),el=dc.getDragEl(),curRegion=new Ext.util.Region(pos.y,pos.x+el.offsetWidth,pos.y+el.offsetHeight,pos.x),!!(overlap=curRegion.intersect(loc))&&(oTarget.overlap=overlap,!!intersect||oTarget.cursorIsOver)):oTarget.cursorIsOver)},_onUnload:function(e,me){Ext.dd.DragDropManager.unregAll()},unregAll:function(){var i,me=this,cache=me.elementCache;me.dragCurrent&&(me.stopDrag(),me.dragCurrent=null),me.clearingAll=!0,me._execOnAll("unreg",[]),delete me.clearingAll;for(i in cache)delete cache[i];me.elementCache={},me.ids={},me.handleIds={}},elementCache:{},getElWrapper:function(id){var oWrapper=this.elementCache[id];return oWrapper&&oWrapper.el||(oWrapper=this.elementCache[id]=new this.ElementWrapper(Ext.getDom(id))),oWrapper},getElement:function(id){return Ext.getDom(id)},getCss:function(id){var el=Ext.getDom(id);return el?el.style:null},ElementWrapper:function(el){this.el=el||null,this.id=this.el&&el.id,this.css=this.el&&el.style},getPosX:function(el){return Ext.Element.getX(el)},getPosY:function(el){return Ext.Element.getY(el)},swapNode:function(n1,n2){if(n1.swapNode)n1.swapNode(n2);else{var p=n2.parentNode,s=n2.nextSibling;s==n1?p.insertBefore(n1,n2):n2==n1.nextSibling?p.insertBefore(n2,n1):(n1.parentNode.replaceChild(n2,n1),p.insertBefore(n1,s))}},getScroll:function(){var doc=window.document,docEl=doc.documentElement,body=doc.body,top=0,left=0;return Ext.isGecko4?(top=window.scrollYOffset,left=window.scrollXOffset):docEl&&(docEl.scrollTop||docEl.scrollLeft)?(top=docEl.scrollTop,left=docEl.scrollLeft):body&&(top=body.scrollTop,left=body.scrollLeft),{top:top,left:left}},getStyle:function(el,styleProp){return Ext.fly(el).getStyle(styleProp)},getScrollTop:function(){return this.getScroll().top},getScrollLeft:function(){return this.getScroll().left},moveToEl:function(moveEl,targetEl){var aCoord=Ext.Element.getXY(targetEl);Ext.Element.setXY(moveEl,aCoord)},numericSort:function(a,b){return a-b},_timeoutCount:0,_addListeners:function(){document?this._onLoad():this._timeoutCount<=2e3&&(setTimeout(this._addListeners,10),document&&document.body&&(this._timeoutCount+=1))},handleWasClicked:function(node,id){if(this.isHandle(id,node.id))return!0;for(var p=node.parentNode;p;){if(this.isHandle(id,p.id))return!0;p=p.parentNode}return!1}},function(){this._addListeners()});Ext.define("Ext.layout.container.Box",{alias:["layout.box"],extend:"Ext.layout.container.Container",alternateClassName:"Ext.layout.BoxLayout",requires:["Ext.layout.container.boxOverflow.None","Ext.layout.container.boxOverflow.Menu","Ext.layout.container.boxOverflow.Scroller","Ext.util.Format","Ext.dd.DragDropManager"],defaultMargins:{top:0,right:0,bottom:0,left:0},padding:0,pack:"start",flex:void 0,stretchMaxPartner:void 0,alignRoundingMethod:"round",type:"box",scrollOffset:0,itemCls:Ext.baseCSSPrefix+"box-item",targetCls:Ext.baseCSSPrefix+"box-layout-ct",targetElCls:Ext.baseCSSPrefix+"box-target",innerCls:Ext.baseCSSPrefix+"box-inner",availableSpaceOffset:0,reserveOffset:!0,manageMargins:!0,createsInnerCt:!0,childEls:["innerCt","targetEl"],renderTpl:["{%var oc,l=values.$comp.layout,oh=l.overflowHandler;","if (oh.getPrefixConfig!==Ext.emptyFn) {","if(oc=oh.getPrefixConfig())dh.generateMarkup(oc, out)","}%}",'<div id="{ownerId}-innerCt" class="{[l.innerCls]} {[oh.getOverflowCls()]}" role="presentation">','<div id="{ownerId}-targetEl" class="{targetElCls}" role="presentation">',"{%this.renderBody(out, values)%}","</div>","</div>","{%if (oh.getSuffixConfig!==Ext.emptyFn) {","if(oc=oh.getSuffixConfig())dh.generateMarkup(oc, out)","}%}",{disableFormats:!0,definitions:"var dh=Ext.DomHelper;"}],constructor:function(config){var type,me=this;me.callParent(arguments),me.flexSortFn=Ext.Function.bind(me.flexSort,me),me.initOverflowHandler(),"string"!=(type=typeof me.padding)&&"number"!=type||(me.padding=Ext.util.Format.parseBox(me.padding),me.padding.height=me.padding.top+me.padding.bottom,me.padding.width=me.padding.left+me.padding.right)},_percentageRe:/^\s*(\d+(?:\.\d*)?)\s*[%]\s*$/,getItemSizePolicy:function(item,ownerSizeModel){var me=this,policy=me.sizePolicy,align=me.align,flex=item.flex,key=align,names=me.names,width=item[names.width],height=item[names.height],percentageRe=me._percentageRe,percentageWidth=percentageRe.test(width),isStretch="stretch"==align,isStretchMax="stretchmax"==align,constrain=me.constrainAlign;return!ownerSizeModel&&(isStretch||flex||percentageWidth||constrain&&!isStretchMax)&&(ownerSizeModel=me.owner.getSizeModel()),isStretch?!percentageRe.test(height)&&ownerSizeModel[names.height].shrinkWrap&&(key="stretchmax"):isStretchMax||(key=percentageRe.test(height)?"stretch":constrain&&!ownerSizeModel[names.height].shrinkWrap?"stretchmax":""),(flex||percentageWidth)&&(ownerSizeModel[names.width].shrinkWrap||(policy=policy.flex)),policy[key]},flexSort:function(a,b){var aMin,bMin,aMax,bMax,hasMin,hasMax,maxWidthName=this.names.maxWidth,minWidthName=this.names.minWidth,aTarget=a.target,bTarget=b.target,result=0;return aMax=aTarget[maxWidthName]||1/0,bMax=bTarget[maxWidthName]||1/0,aMin=aTarget[minWidthName]||0,bMin=bTarget[minWidthName]||0,hasMin=isFinite(aMin)||isFinite(bMin),hasMax=isFinite(aMax)||isFinite(bMax),(hasMin||hasMax)&&(hasMax&&(result=aMax-bMax),0===result&&hasMin&&(result=bMin-aMin)),result},isItemBoxParent:function(itemContext){return!0},isItemShrinkWrap:function(item){return!0},roundFlex:function(width){return Math.ceil(width)},beginCollapse:function(child){var me=this;"vertical"===me.direction&&child.collapsedVertical()?(child.collapseMemento.capture(["flex"]),delete child.flex):"horizontal"===me.direction&&child.collapsedHorizontal()&&(child.collapseMemento.capture(["flex"]),delete child.flex)},beginExpand:function(child){child.collapseMemento.restore(["flex"])},beginLayout:function(ownerContext){var me=this,owner=me.owner,smp=owner.stretchMaxPartner,style=me.innerCt.dom.style,names=me.names;ownerContext.boxNames=names,me.overflowHandler.beginLayout(ownerContext),"string"==typeof smp&&(smp=Ext.getCmp(smp)||owner.query(smp)[0]),ownerContext.stretchMaxPartner=smp&&ownerContext.context.getCmp(smp),me.callParent(arguments),ownerContext.innerCtContext=ownerContext.getEl("innerCt",me),me.scrollParallel=owner.scrollFlags[names.x],me.scrollPerpendicular=owner.scrollFlags[names.y],me.scrollParallel&&(me.scrollPos=owner.getTargetEl().dom[names.scrollLeft]),style.width="",style.height=""},beginLayoutCycle:function(ownerContext,firstCycle){var me=this,align=me.align,names=ownerContext.boxNames,pack=me.pack,heightModelName=names.heightModel;me.overflowHandler.beginLayoutCycle(ownerContext,firstCycle),me.callParent(arguments),ownerContext.parallelSizeModel=ownerContext[names.widthModel],ownerContext.perpendicularSizeModel=ownerContext[heightModelName],ownerContext.boxOptions={align:align={stretch:"stretch"==align,stretchmax:"stretchmax"==align,center:align==names.center,bottom:align==names.afterY},pack:pack={center:"center"==pack,end:"end"==pack}},align.stretch&&ownerContext.perpendicularSizeModel.shrinkWrap&&(align.stretchmax=!0,align.stretch=!1),align.nostretch=!(align.stretch||align.stretchmax),ownerContext.parallelSizeModel.shrinkWrap&&(pack.center=pack.end=!1),me.cacheFlexes(ownerContext),me.targetEl.setWidth(2e4)},cacheFlexes:function(ownerContext){for(var child,childContext,flex,match,me=this,names=ownerContext.boxNames,widthModelName=names.widthModel,heightModelName=names.heightModel,nostretch=ownerContext.boxOptions.align.nostretch,totalFlex=0,childItems=ownerContext.childItems,i=childItems.length,flexedItems=[],minWidth=0,minWidthName=names.minWidth,percentageRe=me._percentageRe,percentageWidths=0,percentageHeights=0;i--;)childContext=childItems[i],child=childContext.target,childContext[widthModelName].calculated&&(childContext.flex=flex=child.flex,flex?(totalFlex+=flex,flexedItems.push(childContext),minWidth+=child[minWidthName]||0):(match=percentageRe.exec(child[names.width]),childContext.percentageParallel=parseFloat(match[1])/100,++percentageWidths)),nostretch&&childContext[heightModelName].calculated&&(match=percentageRe.exec(child[names.height]),childContext.percentagePerpendicular=parseFloat(match[1])/100,++percentageHeights);ownerContext.flexedItems=flexedItems,ownerContext.flexedMinSize=minWidth,ownerContext.totalFlex=totalFlex,ownerContext.percentageWidths=percentageWidths,ownerContext.percentageHeights=percentageHeights,Ext.Array.sort(flexedItems,me.flexSortFn)},calculate:function(ownerContext){var me=this,targetSize=me.getContainerSize(ownerContext),names=ownerContext.boxNames,state=ownerContext.state,plan=state.boxPlan||(state.boxPlan={}),targetContext=ownerContext.targetContext;plan.targetSize=targetSize,state.parallelDone||(state.parallelDone=me.calculateParallel(ownerContext,names,plan)),state.perpendicularDone||(state.perpendicularDone=me.calculatePerpendicular(ownerContext,names,plan)),state.parallelDone&&state.perpendicularDone?(!me.owner.dock||!Ext.isIE7m&&!Ext.isIEQuirks||me.owner.width||me.horizontal||(plan.isIEVerticalDock=!0,plan.calculatedWidth=plan.maxSize+ownerContext.getPaddingInfo().width+ownerContext.getFrameInfo().width,targetContext!==ownerContext&&(plan.calculatedWidth+=targetContext.getPaddingInfo().width)),me.publishInnerCtSize(ownerContext,me.reserveOffset?me.availableSpaceOffset:0),me.done&&ownerContext.boxOptions.align.stretchmax&&!state.stretchMaxDone&&(me.calculateStretchMax(ownerContext,names,plan),state.stretchMaxDone=!0),me.overflowHandler.calculate(ownerContext)):me.done=!1},calculateParallel:function(ownerContext,names,plan){var i,childMargins,remainingWidth,remainingFlex,childContext,flex,flexedWidth,contentWidth,mayNeedScrollbarAdjust,childWidth,percentageSpace,me=this,widthName=names.width,childItems=ownerContext.childItems,beforeXName=names.beforeX,afterXName=names.afterX,setWidthName=names.setWidth,childItemsLength=childItems.length,flexedItems=ownerContext.flexedItems,flexedItemsLength=flexedItems.length,pack=ownerContext.boxOptions.pack,padding=me.padding,targetSize=plan.targetSize,containerWidth=targetSize[widthName],totalMargin=0,left=padding[beforeXName],nonFlexWidth=left+padding[afterXName]+me.scrollOffset+(me.reserveOffset?me.availableSpaceOffset:0),scrollbarWidth=Ext.getScrollbarSize()[names.width];if(!ownerContext.parallelSizeModel.shrinkWrap&&!targetSize[names.gotWidth])return!1;if(scrollbarWidth&&me.scrollPerpendicular&&ownerContext.parallelSizeModel.shrinkWrap&&!ownerContext.boxOptions.align.stretch&&!ownerContext.perpendicularSizeModel.shrinkWrap){if(!ownerContext.state.perpendicularDone)return!1;mayNeedScrollbarAdjust=!0}for(i=0;i<childItemsLength;++i)if(childContext=childItems[i],childMargins=childContext.marginInfo||childContext.getMarginInfo(),totalMargin+=childMargins[widthName],!childContext[names.widthModel].calculated&&(childWidth=childContext.getProp(widthName),nonFlexWidth+=childWidth,isNaN(nonFlexWidth)))return!1;if(nonFlexWidth+=totalMargin,ownerContext.percentageWidths){if(percentageSpace=containerWidth-totalMargin,isNaN(percentageSpace))return!1;for(i=0;i<childItemsLength;++i)childContext=childItems[i],childContext.percentageParallel&&(childWidth=Math.ceil(percentageSpace*childContext.percentageParallel),childWidth=childContext.setWidth(childWidth),nonFlexWidth+=childWidth)}if(ownerContext.parallelSizeModel.shrinkWrap)plan.availableSpace=0,plan.tooNarrow=!1;else if(plan.availableSpace=containerWidth-nonFlexWidth,plan.tooNarrow=plan.availableSpace<ownerContext.flexedMinSize,plan.tooNarrow&&Ext.getScrollbarSize()[names.height]&&me.scrollParallel&&ownerContext.state.perpendicularDone)for(ownerContext.state.perpendicularDone=!1,i=0;i<childItemsLength;++i)childItems[i].invalidate();for(contentWidth=nonFlexWidth,remainingWidth=plan.availableSpace,remainingFlex=ownerContext.totalFlex,i=0;i<flexedItemsLength;i++)childContext=flexedItems[i],flex=childContext.flex,flexedWidth=me.roundFlex(flex/remainingFlex*remainingWidth),flexedWidth=childContext[setWidthName](flexedWidth),contentWidth+=flexedWidth,remainingWidth=Math.max(0,remainingWidth-flexedWidth),remainingFlex-=flex;for(pack.center?(left+=remainingWidth/2)<0&&(left=0):pack.end&&(left+=remainingWidth),i=0;i<childItemsLength;++i)childContext=childItems[i],childMargins=childContext.marginInfo,left+=childMargins[beforeXName],childContext.setProp(names.x,left),left+=childMargins[afterXName]+childContext.props[widthName];return contentWidth+=ownerContext.targetContext.getPaddingInfo()[widthName],ownerContext.state.contentWidth=contentWidth,mayNeedScrollbarAdjust&&ownerContext.peek(names.contentHeight)>plan.targetSize[names.height]&&(contentWidth+=scrollbarWidth,ownerContext[names.hasOverflowY]=!0,ownerContext.target.componentLayout[names.setWidthInDom]=!0,ownerContext[names.invalidateScrollY]=Ext.isStrict&&Ext.isIE8),ownerContext[names.setContentWidth](contentWidth),!0},calculatePerpendicular:function(ownerContext,names,plan){var childTop,i,childHeight,childMargins,diff,height,childContext,stretchMaxPartner,stretchMaxChildren,shrinkWrapParallelOverflow,percentagePerpendicular,me=this,heightShrinkWrap=ownerContext.perpendicularSizeModel.shrinkWrap,targetSize=plan.targetSize,childItems=ownerContext.childItems,childItemsLength=childItems.length,mmax=Math.max,heightName=names.height,setHeightName=names.setHeight,beforeYName=names.beforeY,topPositionName=names.y,padding=me.padding,top=padding[beforeYName],availHeight=targetSize[heightName]-top-padding[names.afterY],align=ownerContext.boxOptions.align,isStretch=align.stretch,isStretchMax=align.stretchmax,isCenter=align.center,isBottom=align.bottom,constrain=me.constrainAlign,maxHeight=0,hasPercentageSizes=0,onBeforeInvalidateChild=me.onBeforeConstrainInvalidateChild,onAfterInvalidateChild=me.onAfterConstrainInvalidateChild,scrollbarHeight=Ext.getScrollbarSize().height;if((isStretch||(isCenter||isBottom)&&!heightShrinkWrap)&&isNaN(availHeight))return!1;if(!isStretch&&!ownerContext.parallelSizeModel.shrinkWrap&&!ownerContext.state.parallelDone&&me.scrollParallel)return!1;if(me.scrollParallel&&plan.tooNarrow&&(heightShrinkWrap?shrinkWrapParallelOverflow=!0:(availHeight-=scrollbarHeight,plan.targetSize[heightName]-=scrollbarHeight)),isStretch)height=availHeight;else{for(i=0;i<childItemsLength;i++){if(childContext=childItems[i],childMargins=(childContext.marginInfo||childContext.getMarginInfo())[heightName],percentagePerpendicular=childContext.percentagePerpendicular){if(++hasPercentageSizes,heightShrinkWrap)continue;childHeight=percentagePerpendicular*availHeight-childMargins,childHeight=childContext[names.setHeight](childHeight)}else childHeight=childContext.getProp(heightName);if(!heightShrinkWrap&&constrain&&childContext[names.heightModel].shrinkWrap&&childHeight>availHeight&&(childContext.invalidate({before:onBeforeInvalidateChild,after:onAfterInvalidateChild,layout:me,childHeight:availHeight,names:names}),ownerContext.state.parallelDone=!1),isNaN(maxHeight=mmax(maxHeight,childHeight+childMargins,childContext.target[names.minHeight]||0)))return!1}if(shrinkWrapParallelOverflow&&(maxHeight+=scrollbarHeight,ownerContext[names.hasOverflowX]=!0,ownerContext.target.componentLayout[names.setHeightInDom]=!0,ownerContext[names.invalidateScrollX]=Ext.isStrict&&Ext.isIE8),(stretchMaxPartner=ownerContext.stretchMaxPartner)&&(ownerContext.setProp("maxChildHeight",maxHeight),(stretchMaxChildren=stretchMaxPartner.childItems)&&stretchMaxChildren.length&&(maxHeight=mmax(maxHeight,stretchMaxPartner.getProp("maxChildHeight")),isNaN(maxHeight))))return!1;ownerContext[names.setContentHeight](maxHeight+me.padding[heightName]+ownerContext.targetContext.getPaddingInfo()[heightName]),shrinkWrapParallelOverflow&&(maxHeight-=scrollbarHeight),plan.maxSize=maxHeight,isStretchMax?height=maxHeight:(isCenter||isBottom||hasPercentageSizes)&&(height=constrain?heightShrinkWrap?maxHeight:availHeight:heightShrinkWrap?maxHeight:mmax(availHeight,maxHeight),height-=ownerContext.innerCtContext.getBorderInfo()[heightName])}for(i=0;i<childItemsLength;i++)childContext=childItems[i],childMargins=childContext.marginInfo||childContext.getMarginInfo(),childTop=top+childMargins[beforeYName],isStretch?childContext[setHeightName](height-childMargins[heightName]):(percentagePerpendicular=childContext.percentagePerpendicular,heightShrinkWrap&&percentagePerpendicular&&(childMargins=childContext.marginInfo||childContext.getMarginInfo(),childHeight=percentagePerpendicular*height-childMargins[heightName],childHeight=childContext.setHeight(childHeight)),isCenter?(diff=height-childContext.props[heightName])>0&&(childTop=top+Math[me.alignRoundingMethod](diff/2)):isBottom&&(childTop=mmax(0,height-childTop-childContext.props[heightName]))),childContext.setProp(topPositionName,childTop);return!0},onBeforeConstrainInvalidateChild:function(childContext,options){var heightModelName=options.names.heightModel;childContext[heightModelName].constrainedMin||(childContext[heightModelName]=Ext.layout.SizeModel.calculated)},onAfterConstrainInvalidateChild:function(childContext,options){var names=options.names;childContext.setProp(names.beforeY,0),childContext[names.heightModel].calculated&&childContext[names.setHeight](options.childHeight)},calculateStretchMax:function(ownerContext,names,plan){var childContext,props,i,childHeight,me=this,heightName=names.height,widthName=names.width,childItems=ownerContext.childItems,length=childItems.length,height=plan.maxSize,onBeforeStretchMaxInvalidateChild=me.onBeforeStretchMaxInvalidateChild,onAfterStretchMaxInvalidateChild=me.onAfterStretchMaxInvalidateChild;for(i=0;i<length;++i)childContext=childItems[i],props=childContext.props,((childHeight=height-childContext.getMarginInfo()[heightName])!=props[heightName]||childContext[names.heightModel].constrained)&&childContext.invalidate({before:onBeforeStretchMaxInvalidateChild,after:onAfterStretchMaxInvalidateChild,layout:me,childWidth:props[widthName],childHeight:childHeight,childX:props.x,childY:props.y,names:names})},onBeforeStretchMaxInvalidateChild:function(childContext,options){var heightModelName=options.names.heightModel;childContext[heightModelName].constrainedMax||(childContext[heightModelName]=Ext.layout.SizeModel.calculated)},onAfterStretchMaxInvalidateChild:function(childContext,options){var names=options.names,childHeight=options.childHeight,childWidth=options.childWidth;childContext.setProp("x",options.childX),childContext.setProp("y",options.childY),childContext[names.heightModel].calculated&&childContext[names.setHeight](childHeight),childContext[names.widthModel].calculated&&childContext[names.setWidth](childWidth)},completeLayout:function(ownerContext){var dom,el,overflowX,overflowY,styles,me=this,names=ownerContext.boxNames,invalidateScrollX=ownerContext.invalidateScrollX,invalidateScrollY=ownerContext.invalidateScrollY;me.overflowHandler.completeLayout(ownerContext),(invalidateScrollX||invalidateScrollY)&&(el=me.getTarget(),dom=el.dom,styles=dom.style,invalidateScrollX&&(overflowX=el.getStyle("overflowX"),"auto"==overflowX?(overflowX=styles.overflowX,styles.overflowX="scroll"):invalidateScrollX=!1),invalidateScrollY&&(overflowY=el.getStyle("overflowY"),"auto"==overflowY?(overflowY=styles.overflowY,styles.overflowY="scroll"):invalidateScrollY=!1),(invalidateScrollX||invalidateScrollY)&&(dom.scrollWidth,invalidateScrollX&&(styles.overflowX=overflowX),invalidateScrollY&&(styles.overflowY=overflowY))),me.scrollParallel&&(me.owner.getTargetEl().dom[names.scrollLeft]=me.scrollPos)},finishedLayout:function(ownerContext){this.overflowHandler.finishedLayout(ownerContext),this.callParent(arguments),this.targetEl.setWidth(ownerContext.innerCtContext.props.width)},publishInnerCtSize:function(ownerContext,reservedSpace){var innerCtHeight,me=this,names=ownerContext.boxNames,heightName=names.height,widthName=names.width,align=ownerContext.boxOptions.align,dock=me.owner.dock,padding=me.padding,plan=ownerContext.state.boxPlan,targetSize=plan.targetSize,height=targetSize[heightName],innerCtContext=ownerContext.innerCtContext,innerCtWidth=(ownerContext.parallelSizeModel.shrinkWrap||plan.tooNarrow&&me.scrollParallel?ownerContext.state.contentWidth-ownerContext.targetContext.getPaddingInfo()[widthName]:targetSize[widthName])-(reservedSpace||0);align.stretch?innerCtHeight=height:(innerCtHeight=plan.maxSize+padding[names.beforeY]+padding[names.afterY]+innerCtContext.getBorderInfo()[heightName],ownerContext.perpendicularSizeModel.shrinkWrap||!align.center&&!align.bottom||(innerCtHeight=Math.max(height,innerCtHeight))),innerCtContext[names.setWidth](innerCtWidth),innerCtContext[names.setHeight](innerCtHeight),isNaN(innerCtWidth+innerCtHeight)&&(me.done=!1),!plan.calculatedWidth||"left"!=dock&&"right"!=dock||ownerContext.setWidth(plan.calculatedWidth,!0,!0)},onRemove:function(comp,isDestroying){var el,me=this,names=me.names;me.callParent(arguments),me.overflowHandler&&me.overflowHandler.onRemove(comp),comp.layoutMarginCap==me.id&&delete comp.layoutMarginCap,me.owner.destroying||isDestroying||!comp.rendered||(el=comp.getEl(),el.setStyle(names.beforeY,""),el.setStyle(names.beforeX,""))},initOverflowHandler:function(){var handlerType,constructor,me=this,handler=me.overflowHandler;"string"==typeof handler&&(handler={type:handler}),handlerType="None",handler&&void 0!==handler.type&&(handlerType=handler.type),constructor=Ext.layout.container.boxOverflow[handlerType],constructor[me.type]&&(constructor=constructor[me.type]),me.overflowHandler=Ext.create("Ext.layout.container.boxOverflow."+handlerType,me,handler)},getRenderTarget:function(){return this.targetEl},getElementTarget:function(){return this.innerCt},calculateChildBox:Ext.deprecated(),calculateChildBoxes:Ext.deprecated(),updateChildBoxes:Ext.deprecated(),destroy:function(){var me=this;Ext.destroy(me.innerCt,me.overflowHandler),me.flexSortFn=me.innerCt=null,me.callParent(arguments)},getRenderData:function(){var data=this.callParent();return data.targetElCls=this.targetElCls,data}});Ext.define("Ext.layout.container.HBox",{alias:["layout.hbox"],extend:"Ext.layout.container.Box",alternateClassName:"Ext.layout.HBoxLayout",align:"top",constrainAlign:!1,type:"hbox",direction:"horizontal",horizontal:!0,names:{beforeX:"left",beforeScrollX:"left",beforeScrollerSuffix:"-before-scroller",afterScrollerSuffix:"-after-scroller",leftCap:"Left",afterX:"right",width:"width",contentWidth:"contentWidth",minWidth:"minWidth",maxWidth:"maxWidth",widthCap:"Width",widthModel:"widthModel",widthIndex:0,x:"x",scrollLeft:"scrollLeft",overflowX:"overflowX",hasOverflowX:"hasOverflowX",invalidateScrollX:"invalidateScrollX",parallelMargins:"lr",center:"middle",beforeY:"top",afterY:"bottom",height:"height",contentHeight:"contentHeight",minHeight:"minHeight",maxHeight:"maxHeight",heightCap:"Height",heightModel:"heightModel",heightIndex:1,y:"y",overflowY:"overflowY",hasOverflowY:"hasOverflowY",invalidateScrollY:"invalidateScrollY",perpendicularMargins:"tb",getWidth:"getWidth",getHeight:"getHeight",setWidth:"setWidth",setHeight:"setHeight",gotWidth:"gotWidth",gotHeight:"gotHeight",setContentWidth:"setContentWidth",setContentHeight:"setContentHeight",setWidthInDom:"setWidthInDom",setHeightInDom:"setHeightInDom",getScrollLeft:"getScrollLeft",setScrollLeft:"setScrollLeft",scrollTo:"scrollTo"},sizePolicy:{flex:{"":{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},stretch:{readsWidth:0,readsHeight:0,setsWidth:1,setsHeight:1},stretchmax:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:1}},"":{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:0},stretch:{readsWidth:1,readsHeight:0,setsWidth:0,setsHeight:1},stretchmax:{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:1}}});Ext.define("Ext.layout.container.VBox",{alias:["layout.vbox"],extend:"Ext.layout.container.Box",alternateClassName:"Ext.layout.VBoxLayout",align:"left",constrainAlign:!1,type:"vbox",direction:"vertical",horizontal:!1,names:{beforeX:"top",beforeScrollX:"top",beforeScrollerSuffix:"-before-scroller",afterScrollerSuffix:"-after-scroller",leftCap:"Top",afterX:"bottom",width:"height",contentWidth:"contentHeight",minWidth:"minHeight",maxWidth:"maxHeight",widthCap:"Height",widthModel:"heightModel",widthIndex:1,x:"y",scrollLeft:"scrollTop",overflowX:"overflowY",hasOverflowX:"hasOverflowY",invalidateScrollX:"invalidateScrollY",parallelMargins:"tb",center:"center",beforeY:"left",afterY:"right",height:"width",contentHeight:"contentWidth",minHeight:"minWidth",maxHeight:"maxWidth",heightCap:"Width",heightModel:"widthModel",heightIndex:0,y:"x",overflowY:"overflowX",hasOverflowY:"hasOverflowX",invalidateScrollY:"invalidateScrollX",perpendicularMargins:"lr",getWidth:"getHeight",getHeight:"getWidth",setWidth:"setHeight",setHeight:"setWidth",gotWidth:"gotHeight",gotHeight:"gotWidth",setContentWidth:"setContentHeight",setContentHeight:"setContentWidth",setWidthInDom:"setHeightInDom",setHeightInDom:"setWidthInDom",getScrollLeft:"getScrollTop",setScrollLeft:"setScrollTop",scrollTo:"scrollTo"},sizePolicy:{flex:{"":{readsWidth:1,readsHeight:0,setsWidth:0,setsHeight:1},stretch:{readsWidth:0,readsHeight:0,setsWidth:1,setsHeight:1},stretchmax:{readsWidth:1,readsHeight:0,setsWidth:1,setsHeight:1}},"":{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:0},stretch:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},stretchmax:{readsWidth:1,readsHeight:1,setsWidth:1,setsHeight:0}}});Ext.define("Ext.toolbar.Toolbar",{extend:"Ext.container.Container",requires:["Ext.toolbar.Fill","Ext.layout.container.HBox","Ext.layout.container.VBox"],uses:["Ext.toolbar.Separator"],alias:"widget.toolbar",alternateClassName:"Ext.Toolbar",isToolbar:!0,baseCls:Ext.baseCSSPrefix+"toolbar",ariaRole:"toolbar",defaultType:"button",vertical:!1,enableOverflow:!1,menuTriggerCls:Ext.baseCSSPrefix+"toolbar-more-icon",trackMenus:!0,itemCls:Ext.baseCSSPrefix+"toolbar-item",statics:{shortcuts:{"-":"tbseparator"," ":"tbspacer"},shortcutsHV:{0:{"->":{xtype:"tbfill",height:0}},1:{"->":{xtype:"tbfill",width:0}}}},initComponent:function(){var me=this;!me.layout&&me.enableOverflow&&(me.layout={overflowHandler:"Menu"}),"right"!==me.dock&&"left"!==me.dock||(me.vertical=!0),me.layout=Ext.applyIf(Ext.isString(me.layout)?{type:me.layout}:me.layout||{},{type:me.vertical?"vbox":"hbox",align:me.vertical?"stretchmax":"middle"}),me.vertical&&me.addClsWithUI("vertical"),"footer"===me.ui&&(me.ignoreBorderManagement=!0),me.callParent(),me.addEvents("overflowchange")},getRefItems:function(deep){var handler,me=this,items=me.callParent(arguments),layout=me.layout;return deep&&me.enableOverflow&&(handler=layout.overflowHandler)&&handler.menu&&(items=items.concat(handler.menu.getRefItems(deep))),items},lookupComponent:function(c){var args=arguments;if("string"==typeof c){var T=Ext.toolbar.Toolbar,shortcut=T.shortcutsHV[this.vertical?1:0][c]||T.shortcuts[c];c="string"==typeof shortcut?{xtype:shortcut}:shortcut?Ext.apply({},shortcut):{xtype:"tbtext",text:c},this.applyDefaults(c),args=[c]}return this.callParent(args)},applyDefaults:function(c){return Ext.isString(c)||(c=this.callParent(arguments)),c},trackMenu:function(item,remove){if(this.trackMenus&&item.menu){var method=remove?"mun":"mon",me=this;me[method](item,"mouseover",me.onButtonOver,me),me[method](item,"menushow",me.onButtonMenuShow,me),me[method](item,"menuhide",me.onButtonMenuHide,me)}},onBeforeAdd:function(component){var me=this,isButton=component.isButton;isButton&&me.defaultButtonUI&&"default"===component.ui&&!component.hasOwnProperty("ui")?component.ui=me.defaultButtonUI:(isButton||component.isFormField)&&"footer"!==me.ui&&(component.ui=component.ui+"-toolbar",component.addCls(component.baseCls+"-toolbar")),component instanceof Ext.toolbar.Separator&&component.setUI(me.vertical?"vertical":"horizontal"),me.callParent(arguments)},onAdd:function(component){this.callParent(arguments),this.trackMenu(component)},onRemove:function(c){this.callParent(arguments),this.trackMenu(c,!0)},getChildItemsToDisable:function(){return this.items.getRange()},onButtonOver:function(btn){this.activeMenuBtn&&this.activeMenuBtn!=btn&&(this.activeMenuBtn.hideMenu(),btn.showMenu(),this.activeMenuBtn=btn)},onButtonMenuShow:function(btn){this.activeMenuBtn=btn},onButtonMenuHide:function(btn){delete this.activeMenuBtn}});Ext.define("Ext.layout.component.Dock",{extend:"Ext.layout.component.Component",alias:"layout.dock",alternateClassName:"Ext.layout.component.AbstractDock",type:"dock",horzAxisProps:{name:"horz",oppositeName:"vert",dockBegin:"left",dockEnd:"right",horizontal:!0,marginBegin:"margin-left",maxSize:"maxWidth",minSize:"minWidth",pos:"x",setSize:"setWidth",shrinkWrapDock:"shrinkWrapDockWidth",size:"width",sizeModel:"widthModel"},vertAxisProps:{name:"vert",oppositeName:"horz",dockBegin:"top",dockEnd:"bottom",horizontal:!1,marginBegin:"margin-top",maxSize:"maxHeight",minSize:"minHeight",pos:"y",setSize:"setHeight",shrinkWrapDock:"shrinkWrapDockHeight",size:"height",sizeModel:"heightModel"},initializedBorders:-1,horizontalCollapsePolicy:{width:!0,x:!0},verticalCollapsePolicy:{height:!0,y:!0},finishRender:function(){var target,items,me=this;me.callParent(),target=me.getRenderTarget(),items=me.getDockedItems(),me.finishRenderItems(target,items)},isItemBoxParent:function(itemContext){return!0},isItemShrinkWrap:function(item){return!0},noBorderClasses:[Ext.baseCSSPrefix+"docked-noborder-top",Ext.baseCSSPrefix+"docked-noborder-right",Ext.baseCSSPrefix+"docked-noborder-bottom",Ext.baseCSSPrefix+"docked-noborder-left"],noBorderClassesSides:{top:Ext.baseCSSPrefix+"docked-noborder-top",right:Ext.baseCSSPrefix+"docked-noborder-right",bottom:Ext.baseCSSPrefix+"docked-noborder-bottom",left:Ext.baseCSSPrefix+"docked-noborder-left"},borderWidthProps:{top:"border-top-width",right:"border-right-width",bottom:"border-bottom-width",left:"border-left-width"},handleItemBorders:function(){var borders,docked,i,ln,item,dock,side,me=this,owner=me.owner,lastItems=me.lastDockedItems,oldBorders=me.borders,currentGeneration=owner.dockedItems.generation,noBorderClassesSides=me.noBorderClassesSides,borderWidthProps=me.borderWidthProps,collapsed=me.collapsed;if(me.initializedBorders!=currentGeneration&&(!owner.border||owner.manageBodyBorders)){for(me.initializedBorders=currentGeneration,me.collapsed=!1,me.lastDockedItems=docked=me.getLayoutItems(),me.collapsed=collapsed,borders={top:[],right:[],bottom:[],left:[]},i=0,ln=docked.length;i<ln;i++)item=docked[i],dock=item.dock,item.ignoreBorderManagement||(borders[dock].satisfied||(borders[dock].push(item),borders[dock].satisfied=!0),borders.top.satisfied||"bottom"===dock||borders.top.push(item),borders.right.satisfied||"left"===dock||borders.right.push(item),borders.bottom.satisfied||"top"===dock||borders.bottom.push(item),borders.left.satisfied||"right"===dock||borders.left.push(item));if(lastItems)for(i=0,ln=lastItems.length;i<ln;i++)item=lastItems[i],item.isDestroyed||item.ignoreBorderManagement||owner.manageBodyBorders||item.removeCls(me.noBorderClasses);if(oldBorders)for(side in oldBorders)owner.manageBodyBorders&&oldBorders[side].satisfied&&owner.setBodyStyle(borderWidthProps[side],"");for(side in borders)if(ln=borders[side].length,owner.manageBodyBorders)borders[side].satisfied&&owner.setBodyStyle(borderWidthProps[side],"1px");else{for(i=0;i<ln;i++)borders[side][i].addCls(noBorderClassesSides[side]);(borders[side].satisfied||owner.bodyBorder)&&!1!==owner.bodyBorder||owner.addBodyCls(noBorderClassesSides[side])}me.borders=borders}},beforeLayoutCycle:function(ownerContext){var collapsedHorz,collapsedVert,me=this,owner=me.owner,shrinkWrap=me.sizeModels.shrinkWrap,shrinkWrapDock=owner.shrinkWrapDock;owner.collapsed&&(owner.collapsedVertical()?(collapsedVert=!0,ownerContext.measureDimensions=1):(collapsedHorz=!0,ownerContext.measureDimensions=2)),ownerContext.collapsedVert=collapsedVert,ownerContext.collapsedHorz=collapsedHorz,collapsedVert?ownerContext.heightModel=shrinkWrap:collapsedHorz&&(ownerContext.widthModel=shrinkWrap),shrinkWrapDock=!0===shrinkWrapDock?3:shrinkWrapDock||0,ownerContext.shrinkWrapDockHeight=1&shrinkWrapDock&&ownerContext.heightModel.shrinkWrap,ownerContext.shrinkWrapDockWidth=2&shrinkWrapDock&&ownerContext.widthModel.shrinkWrap},beginLayout:function(ownerContext){var dockedItems,i,item,itemContext,offsets,collapsed,dock,me=this,owner=me.owner,docked=me.getLayoutItems(),layoutContext=ownerContext.context,dockedItemCount=docked.length;for(me.callParent(arguments),collapsed=owner.getCollapsed(),collapsed!==me.lastCollapsedState&&Ext.isDefined(me.lastCollapsedState)&&(me.owner.collapsed?(ownerContext.isCollapsingOrExpanding=1,owner.addClsWithUI(owner.collapsedCls)):(ownerContext.isCollapsingOrExpanding=2,owner.removeClsWithUI(owner.collapsedCls),ownerContext.lastCollapsedState=me.lastCollapsedState)),me.lastCollapsedState=collapsed,ownerContext.dockedItems=dockedItems=[],i=0;i<dockedItemCount;i++)item=docked[i],item.rendered&&(dock=item.dock,itemContext=layoutContext.getCmp(item),itemContext.dockedAt={x:0,y:0},itemContext.offsets=offsets=Ext.Element.parseBox(item.offsets||0),itemContext.horizontal="top"==dock||"bottom"==dock,offsets.width=offsets.left+offsets.right,offsets.height=offsets.top+offsets.bottom,dockedItems.push(itemContext));ownerContext.bodyContext=ownerContext.getEl("body")},beginLayoutCycle:function(ownerContext){var i,item,dock,me=this,docked=ownerContext.dockedItems,len=docked.length,owner=me.owner,frameBody=owner.frameBody,lastHeightModel=me.lastHeightModel;for(me.callParent(arguments),me.owner.manageHeight?me.lastBodyDisplay&&(owner.body.dom.style.display=me.lastBodyDisplay=""):("inline-block"!==me.lastBodyDisplay&&(owner.body.dom.style.display=me.lastBodyDisplay="inline-block"),lastHeightModel&&lastHeightModel.shrinkWrap&&!ownerContext.heightModel.shrinkWrap&&(owner.body.dom.style.marginBottom="")),ownerContext.widthModel.auto&&(ownerContext.widthModel.shrinkWrap&&owner.el.setWidth(null),owner.body.setWidth(null),frameBody&&frameBody.setWidth(null)),ownerContext.heightModel.auto&&(owner.body.setHeight(null),frameBody&&frameBody.setHeight(null)),ownerContext.collapsedVert?ownerContext.setContentHeight(0):ownerContext.collapsedHorz&&ownerContext.setContentWidth(0),i=0;i<len;i++)if(item=docked[i].target,"right"==(dock=item.dock))item.setLocalX(0);else if("left"!=dock)continue},calculate:function(ownerContext){var framing,horz,vert,forward,backward,me=this,measure=me.measureAutoDimensions(ownerContext,ownerContext.measureDimensions),state=ownerContext.state,horzDone=state.horzDone,vertDone=state.vertDone,bodyContext=ownerContext.bodyContext;for(ownerContext.borderInfo||ownerContext.getBorderInfo(),ownerContext.paddingInfo||ownerContext.getPaddingInfo(),ownerContext.frameInfo||ownerContext.getFrameInfo(),bodyContext.borderInfo||bodyContext.getBorderInfo(),bodyContext.paddingInfo||bodyContext.getPaddingInfo(),ownerContext.frameBorder||((framing=ownerContext.framing)?(ownerContext.frameBorder=framing.border,ownerContext.framePadding=framing.padding):(ownerContext.frameBorder=ownerContext.borderInfo,ownerContext.framePadding=ownerContext.paddingInfo)),horz=!horzDone&&me.createAxis(ownerContext,measure.contentWidth,ownerContext.widthModel,me.horzAxisProps,ownerContext.collapsedHorz),vert=!vertDone&&me.createAxis(ownerContext,measure.contentHeight,ownerContext.heightModel,me.vertAxisProps,ownerContext.collapsedVert),forward=0,backward=ownerContext.dockedItems.length;backward--;++forward)horz&&me.dockChild(ownerContext,horz,backward,forward),vert&&me.dockChild(ownerContext,vert,backward,forward);horz&&me.finishAxis(ownerContext,horz)&&(state.horzDone=horzDone=horz),vert&&me.finishAxis(ownerContext,vert)&&(state.vertDone=vertDone=vert),horzDone&&vertDone&&me.finishConstraints(ownerContext,horzDone,vertDone)?me.finishPositions(ownerContext,horzDone,vertDone):me.done=!1},createAxis:function(ownerContext,contentSize,sizeModel,axisProps,collapsedAxis){var bodyContext,framing,padding,end,me=this,begin=0,owner=me.owner,maxSize=owner[axisProps.maxSize],minSize=owner[axisProps.minSize]||0,dockBegin=axisProps.dockBegin,dockEnd=axisProps.dockEnd,posProp=axisProps.pos,sizeProp=axisProps.size,hasMaxSize=null!=maxSize,shrinkWrap=sizeModel.shrinkWrap;return shrinkWrap?collapsedAxis?end=0:(bodyContext=ownerContext.bodyContext,end=contentSize+bodyContext.borderInfo[sizeProp]):(framing=ownerContext.frameBorder,padding=ownerContext.framePadding,begin=framing[dockBegin]+padding[dockBegin],end=ownerContext.getProp(sizeProp)-(framing[dockEnd]+padding[dockEnd])),{shrinkWrap:sizeModel.shrinkWrap,sizeModel:sizeModel,initialBegin:begin,begin:begin,end:end,collapsed:collapsedAxis,horizontal:axisProps.horizontal,ignoreFrameBegin:null,ignoreFrameEnd:null,initialSize:end-begin,maxChildSize:0,hasMinMaxConstraints:(minSize||hasMaxSize)&&sizeModel.shrinkWrap,minSize:minSize,maxSize:hasMaxSize?maxSize:1e9,bodyPosProp:me.owner.manageHeight?posProp:axisProps.marginBegin,dockBegin:dockBegin,dockEnd:dockEnd,posProp:posProp,sizeProp:sizeProp,setSize:axisProps.setSize,shrinkWrapDock:ownerContext[axisProps.shrinkWrapDock],sizeModelName:axisProps.sizeModel,dockedPixelsEnd:0}},dockChild:function(ownerContext,axis,backward,forward){var pos,size,me=this,itemContext=ownerContext.dockedItems[axis.shrinkWrap?backward:forward],item=itemContext.target,dock=item.dock,sizeProp=axis.sizeProp;item.ignoreParentFrame&&ownerContext.isCollapsingOrExpanding&&itemContext.clearMarginCache(),itemContext.marginInfo||itemContext.getMarginInfo(),dock==axis.dockBegin?pos=axis.shrinkWrap?me.dockOutwardBegin(ownerContext,itemContext,item,axis):me.dockInwardBegin(ownerContext,itemContext,item,axis):dock==axis.dockEnd?pos=axis.shrinkWrap?me.dockOutwardEnd(ownerContext,itemContext,item,axis):me.dockInwardEnd(ownerContext,itemContext,item,axis):axis.shrinkWrapDock?(size=itemContext.getProp(sizeProp)+itemContext.marginInfo[sizeProp],axis.maxChildSize=Math.max(axis.maxChildSize,size),pos=0):pos=me.dockStretch(ownerContext,itemContext,item,axis),itemContext.dockedAt[axis.posProp]=pos},dockInwardBegin:function(ownerContext,itemContext,item,axis){var delta,size,dock,pos=axis.begin,sizeProp=axis.sizeProp,ignoreParentFrame=item.ignoreParentFrame;return ignoreParentFrame&&(axis.ignoreFrameBegin=itemContext,dock=item.dock,delta=ownerContext.frameBorder[dock],pos-=delta+ownerContext.framePadding[dock]),item.overlay||(size=itemContext.getProp(sizeProp)+itemContext.marginInfo[sizeProp],axis.begin+=size,ignoreParentFrame&&(axis.begin-=delta)),pos},dockInwardEnd:function(ownerContext,itemContext,item,axis){var frameEnd,sizeProp=axis.sizeProp,size=itemContext.getProp(sizeProp)+itemContext.marginInfo[sizeProp],pos=axis.end-size;return item.overlay||(axis.end=pos),item.ignoreParentFrame&&(axis.ignoreFrameEnd=itemContext,frameEnd=ownerContext.frameBorder[item.dock],pos+=frameEnd+ownerContext.framePadding[item.dock],axis.end+=frameEnd),pos},dockOutwardBegin:function(ownerContext,itemContext,item,axis){var size,pos=axis.begin,sizeProp=axis.sizeProp;return axis.collapsed?axis.ignoreFrameBegin=axis.ignoreFrameEnd=itemContext:item.ignoreParentFrame&&(axis.ignoreFrameBegin=itemContext),item.overlay||(size=itemContext.getProp(sizeProp)+itemContext.marginInfo[sizeProp],pos-=size,axis.begin=pos),pos},dockOutwardEnd:function(ownerContext,itemContext,item,axis){var size,pos=axis.end,sizeProp=axis.sizeProp;return size=itemContext.getProp(sizeProp)+itemContext.marginInfo[sizeProp],axis.collapsed?axis.ignoreFrameBegin=axis.ignoreFrameEnd=itemContext:item.ignoreParentFrame&&(axis.ignoreFrameEnd=itemContext),item.overlay||(axis.end=pos+size,axis.dockedPixelsEnd+=size),pos},dockStretch:function(ownerContext,itemContext,item,axis){var margin,size,dock=item.dock,sizeProp=axis.sizeProp,horizontal="top"==dock||"bottom"==dock,border=ownerContext.frameBorder,offsets=itemContext.offsets,padding=ownerContext.framePadding,endProp=horizontal?"right":"bottom",startProp=horizontal?"left":"top",pos=axis.begin+offsets[startProp];return!1!==item.stretch&&(size=axis.end-pos-offsets[endProp],item.ignoreParentFrame&&(pos-=padding[startProp]+border[startProp],size+=padding[sizeProp]+border[sizeProp]),margin=itemContext.marginInfo,size-=margin[sizeProp],itemContext[axis.setSize](size)),pos},finishAxis:function(ownerContext,axis){if(isNaN(axis.maxChildSize))return!1;var bodyPos,bodySize,delta,dirty,axisBegin=axis.begin,size=axis.end-axisBegin,collapsed=axis.collapsed,setSizeMethod=axis.setSize,beginName=axis.dockBegin,endName=axis.dockEnd,padding=ownerContext.framePadding,border=ownerContext.frameBorder,borderBegin=border[beginName],framing=ownerContext.framing,framingBegin=framing&&framing[beginName],paddingBegin=collapsed?0:padding[beginName],sizeProp=axis.sizeProp,ignoreFrameBegin=axis.ignoreFrameBegin,ignoreFrameEnd=axis.ignoreFrameEnd,bodyContext=ownerContext.bodyContext,extraPaddingBegin=Math.max(borderBegin+paddingBegin-framingBegin,0);return axis.shrinkWrap?(bodySize=axis.initialSize,framing?(delta=-axisBegin+borderBegin+paddingBegin,bodyPos=delta-framingBegin-extraPaddingBegin):(bodyPos=-axisBegin,delta=bodyPos+paddingBegin),collapsed||(size+=padding[sizeProp]),ignoreFrameBegin?(delta-=borderBegin,bodyPos-=borderBegin,ignoreFrameBegin.dockedAt[axis.posProp]-=paddingBegin):size+=borderBegin,collapsed||(ignoreFrameEnd?ignoreFrameEnd.dockedAt[axis.posProp]+=padding[endName]:size+=border[endName]),axis.size=size,axis.horizontal||this.owner.manageHeight||(dirty=!1)):(framing?(delta=0,bodyPos=axisBegin-framingBegin-extraPaddingBegin):(delta=-borderBegin,bodyPos=axisBegin-paddingBegin-borderBegin),bodySize=size),axis.delta=delta,bodyContext[setSizeMethod](bodySize,dirty),bodyContext.setProp(axis.bodyPosProp,bodyPos),!isNaN(size)},beforeInvalidateShrinkWrapDock:function(itemContext,options){var sizeModelName=options.axis.sizeModelName;itemContext[sizeModelName].constrainedMin||(itemContext[sizeModelName]=Ext.layout.SizeModel.calculated)},afterInvalidateShrinkWrapDock:function(itemContext,options){var pos,axis=options.axis,me=options.layout;itemContext[axis.sizeModelName].calculated&&(pos=me.dockStretch(options.ownerContext,itemContext,itemContext.target,axis),itemContext.setProp(axis.posProp,axis.delta+pos))},finishConstraints:function(ownerContext,horz,vert){var dirty,height,width,heightModel,widthModel,size,minSize,maxSize,maxChildSize,desiredSize,me=this,sizeModels=me.sizeModels,publishWidth=horz.shrinkWrap,publishHeight=vert.shrinkWrap,owner=me.owner;if(publishWidth&&(size=horz.size,minSize=horz.collapsed?0:horz.minSize,maxSize=horz.maxSize,maxChildSize=horz.maxChildSize,desiredSize=Math.max(size,maxChildSize),desiredSize>maxSize?(widthModel=sizeModels.constrainedMax,width=maxSize):desiredSize<minSize?(widthModel=sizeModels.constrainedMin,width=minSize):size<maxChildSize?(widthModel=sizeModels.constrainedDock,owner.dockConstrainedWidth=width=maxChildSize):width=size),publishHeight&&(size=vert.size,minSize=vert.collapsed?0:vert.minSize,maxSize=vert.maxSize,maxChildSize=vert.maxChildSize,desiredSize=Math.max(size,maxChildSize+size-vert.initialSize),desiredSize>maxSize?(heightModel=sizeModels.constrainedMax,height=maxSize):desiredSize<minSize?(heightModel=sizeModels.constrainedMin,height=minSize):size<maxChildSize?(heightModel=sizeModels.constrainedDock,owner.dockConstrainedHeight=height=maxChildSize):(ownerContext.collapsedVert||owner.manageHeight||(dirty=!1,ownerContext.bodyContext.setProp("margin-bottom",vert.dockedPixelsEnd)),height=size)),widthModel||heightModel){if(widthModel&&heightModel&&widthModel.constrainedMax&&heightModel.constrainedByMin)return ownerContext.invalidate({widthModel:widthModel}),!1;if(!ownerContext.widthModel.calculatedFromShrinkWrap&&!ownerContext.heightModel.calculatedFromShrinkWrap)return ownerContext.invalidate({widthModel:widthModel,heightModel:heightModel}),!1}else me.invalidateAxes(ownerContext,horz,vert);return publishWidth&&(ownerContext.setWidth(width),widthModel&&(ownerContext.widthModel=widthModel)),publishHeight&&(ownerContext.setHeight(height,dirty),heightModel&&(ownerContext.heightModel=heightModel)),!0},invalidateAxes:function(ownerContext,horz,vert){var dockedItems,len,i,itemContext,itemSize,isHorz,axis,sizeProp,before=this.beforeInvalidateShrinkWrapDock,after=this.afterInvalidateShrinkWrapDock,horzSize=horz.end-horz.begin,vertSize=vert.initialSize,invalidateHorz=horz.shrinkWrapDock&&horz.maxChildSize<=horzSize,invalidateVert=vert.shrinkWrapDock&&vert.maxChildSize<=vertSize;if(invalidateHorz||invalidateVert)for(invalidateVert&&(vert.begin=vert.initialBegin,vert.end=vert.begin+vert.initialSize),dockedItems=ownerContext.dockedItems,i=0,len=dockedItems.length;i<len;++i)itemContext=dockedItems[i],isHorz=itemContext.horizontal,axis=null,invalidateHorz&&isHorz?(sizeProp=horz.sizeProp,itemSize=horzSize,axis=horz):invalidateVert&&!isHorz&&(sizeProp=vert.sizeProp,itemSize=vertSize,axis=vert),axis&&(itemSize-=itemContext.getMarginInfo()[sizeProp])!==itemContext.props[sizeProp]&&itemContext.invalidate({before:before,after:after,axis:axis,ownerContext:ownerContext,layout:this})},finishPositions:function(ownerContext,horz,vert){var index,itemContext,dockedItems=ownerContext.dockedItems,length=dockedItems.length,deltaX=horz.delta,deltaY=vert.delta;for(index=0;index<length;++index)itemContext=dockedItems[index],itemContext.setProp("x",deltaX+itemContext.dockedAt.x),itemContext.setProp("y",deltaY+itemContext.dockedAt.y)},finishedLayout:function(ownerContext){var me=this,target=ownerContext.target;me.callParent(arguments),ownerContext.animatePolicy||(1===ownerContext.isCollapsingOrExpanding?target.afterCollapse(!1):2===ownerContext.isCollapsingOrExpanding&&target.afterExpand(!1))},getAnimatePolicy:function(ownerContext){var lastCollapsedState,policy,me=this;return 1==ownerContext.isCollapsingOrExpanding?lastCollapsedState=me.lastCollapsedState:2==ownerContext.isCollapsingOrExpanding&&(lastCollapsedState=ownerContext.lastCollapsedState),"left"==lastCollapsedState||"right"==lastCollapsedState?policy=me.horizontalCollapsePolicy:"top"!=lastCollapsedState&&"bottom"!=lastCollapsedState||(policy=me.verticalCollapsePolicy),policy},getDockedItems:function(order,beforeBody){var renderOrder,dock,dockedItems,i,isBefore,length,me=this,renderedOnly="visual"===order,all=renderedOnly?Ext.ComponentQuery.query("[rendered]",me.owner.dockedItems.items):me.owner.dockedItems.items,sort=all&&all.length&&!1!==order;if(null==beforeBody)dockedItems=sort&&!renderedOnly?all.slice():all;else{for(dockedItems=[],i=0,length=all.length;i<length;++i)dock=all[i].dock,isBefore="top"==dock||"left"==dock,(beforeBody?isBefore:!isBefore)&&dockedItems.push(all[i]);sort=sort&&dockedItems.length}return sort&&(renderOrder="render"==(order=order||"render"),Ext.Array.sort(dockedItems,function(a,b){var aw,bw;return!renderOrder||(aw=me.owner.dockOrder[a.dock])===(bw=me.owner.dockOrder[b.dock])||aw+bw?(aw=me.getItemWeight(a,order),bw=me.getItemWeight(b,order),void 0!==aw&&void 0!==bw?aw-bw:0):aw-bw})),dockedItems||[]},getItemWeight:function(item,order){var weight=item.weight||this.owner.defaultDockWeights[item.dock];return weight[order]||weight},getLayoutItems:function(){var items,itemCount,item,i,result,me=this;if(me.owner.collapsed)result=me.owner.getCollapsedDockedItems();else for(items=me.getDockedItems("visual"),itemCount=items.length,result=[],i=0;i<itemCount;i++)item=items[i],item.hidden||result.push(item);return result},measureContentWidth:function(ownerContext){var bodyContext=ownerContext.bodyContext;return bodyContext.el.getWidth()-bodyContext.getBorderInfo().width},measureContentHeight:function(ownerContext){var bodyContext=ownerContext.bodyContext;return bodyContext.el.getHeight()-bodyContext.getBorderInfo().height},redoLayout:function(ownerContext){var me=this,owner=me.owner;1==ownerContext.isCollapsingOrExpanding?(owner.reExpander&&owner.reExpander.el.show(),owner.addClsWithUI(owner.collapsedCls),ownerContext.redo(!0)):2==ownerContext.isCollapsingOrExpanding&&(owner.removeClsWithUI(owner.collapsedCls),ownerContext.bodyContext.redo())},renderChildren:function(){var me=this,items=me.getDockedItems(),target=me.getRenderTarget();me.handleItemBorders(),me.renderItems(items,target)},renderItems:function(items,target){var i,j,targetChildNode,item,me=this,dockedItemCount=items.length,itemIndex=0,correctPosition=0,staticNodeCount=0,targetNodes=me.getRenderTarget().dom.childNodes,targetChildCount=targetNodes.length;for(i=0,j=0;i<targetChildCount&&(targetChildNode=targetNodes[i],!Ext.fly(targetChildNode).hasCls(Ext.baseCSSPrefix+"resizable-handle"));i++){for(j=0;j<dockedItemCount&&(item=items[j],!item.rendered||item.el.dom!==targetChildNode);j++);j===dockedItemCount&&staticNodeCount++}for(;itemIndex<dockedItemCount;itemIndex++,correctPosition++)item=items[itemIndex],itemIndex!==correctPosition||"right"!==item.dock&&"bottom"!==item.dock||(correctPosition+=staticNodeCount),item&&!item.rendered?me.renderItem(item,target,correctPosition):me.isValidParent(item,target,correctPosition)||me.moveItem(item,target,correctPosition)},undoLayout:function(ownerContext){var me=this,owner=me.owner;1==ownerContext.isCollapsingOrExpanding?(owner.reExpander&&owner.reExpander.el.hide(),owner.removeClsWithUI(owner.collapsedCls),ownerContext.undo(!0)):2==ownerContext.isCollapsingOrExpanding&&(owner.addClsWithUI(owner.collapsedCls),ownerContext.bodyContext.undo())},sizePolicy:{nostretch:{setsWidth:0,setsHeight:0},horz:{shrinkWrap:{setsWidth:1,setsHeight:0,readsWidth:1},stretch:{setsWidth:1,setsHeight:0}},vert:{shrinkWrap:{setsWidth:0,setsHeight:1,readsHeight:1},stretch:{setsWidth:0,setsHeight:1}},stretchV:{setsWidth:0,setsHeight:1},autoStretchH:{readsWidth:1,setsWidth:1,setsHeight:0},autoStretchV:{readsHeight:1,setsWidth:0,setsHeight:1}},getItemSizePolicy:function(item,ownerSizeModel){var dock,vertical,me=this,policy=me.sizePolicy,shrinkWrapDock=me.owner.shrinkWrapDock;return!1===item.stretch?policy.nostretch:(dock=item.dock,vertical="left"==dock||"right"==dock,shrinkWrapDock=!0===shrinkWrapDock?3:shrinkWrapDock||0,vertical?(policy=policy.vert,shrinkWrapDock&=1):(policy=policy.horz,shrinkWrapDock&=2),shrinkWrapDock&&(ownerSizeModel||(ownerSizeModel=me.owner.getSizeModel()),ownerSizeModel[vertical?"height":"width"].shrinkWrap)?policy.shrinkWrap:policy.stretch)},configureItem:function(item,pos){this.callParent(arguments),item.addCls(Ext.baseCSSPrefix+"docked"),item.addClsWithUI(this.getDockCls(item.dock))},getDockCls:function(dock){return"docked-"+dock},afterRemove:function(item){this.callParent(arguments),this.itemCls&&item.el.removeCls(this.itemCls+"-"+item.dock);var dom=item.el.dom;!item.destroying&&dom&&dom.parentNode.removeChild(dom),this.childrenChanged=!0},borderCollapseMap:{},getBorderCollapseTable:function(){var table,me=this,map=me.borderCollapseMap,owner=me.owner,baseCls=owner.baseCls,ui=owner.ui;return map=map[baseCls]||(map[baseCls]={}),table=map[ui],table||(baseCls+="-"+ui+"-outer-border-",map[ui]=table=[0,baseCls+"l",baseCls+"b",baseCls+"bl",baseCls+"r",baseCls+"rl",baseCls+"rb",baseCls+"rbl",baseCls+"t",baseCls+"tl",baseCls+"tb",baseCls+"tbl",baseCls+"tr",baseCls+"trl",baseCls+"trb",baseCls+"trbl"]),table}});Ext.define("Ext.panel.AbstractPanel",{extend:"Ext.container.Container",mixins:{docking:"Ext.container.DockingContainer"},requires:["Ext.util.MixedCollection","Ext.Element","Ext.toolbar.Toolbar"],baseCls:Ext.baseCSSPrefix+"panel",isPanel:!0,contentPaddingProperty:"bodyPadding",shrinkWrapDock:!1,componentLayout:"dock",childEls:["body"],renderTpl:["{% this.renderDockedItems(out,values,0); %}",Ext.isIE7m||Ext.isIEQuirks?'<div style="position:relative;font-size:0;line-height:0;" role="presentation">&nbsp;</div>':"",'<div id="{id}-body" class="{baseCls}-body<tpl if="bodyCls"> {bodyCls}</tpl>',' {baseCls}-body-{ui}<tpl if="uiCls">','<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl>','</tpl>{childElCls}"','<tpl if="bodyRole"> role="{bodyRole}"<tpl else> role="presentation"</tpl>','<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',"{%this.renderContainer(out,values);%}","</div>","{% this.renderDockedItems(out,values,1); %}"],bodyPosProps:{x:"x",y:"y"},border:!0,emptyArray:[],initComponent:function(){this.initBorderProps(),this.callParent()},initBorderProps:function(){var me=this;me.frame&&me.border&&void 0===me.bodyBorder&&(me.bodyBorder=!1),me.frame&&me.border&&(!1===me.bodyBorder||0===me.bodyBorder)&&(me.manageBodyBorders=!0)},beforeDestroy:function(){this.destroyDockedItems(),this.callParent()},initItems:function(){this.callParent(),this.initDockingItems()},initRenderData:function(){var me=this,data=me.callParent();return me.initBodyStyles(),me.protoBody.writeTo(data),delete me.protoBody,data},getComponent:function(comp){var component=this.callParent(arguments);return void 0!==component||Ext.isNumber(comp)||(component=this.getDockedComponent(comp)),component},getProtoBody:function(){var me=this,body=me.protoBody;return body||(me.protoBody=body=new Ext.util.ProtoElement({cls:me.bodyCls,style:me.bodyStyle,clsProp:"bodyCls",styleProp:"bodyStyle",styleIsText:!0})),body},initBodyStyles:function(){var me=this,body=me.getProtoBody();void 0!==me.bodyPadding&&(me.layout.managePadding?body.setStyle("padding",0):body.setStyle("padding",this.unitizeBox(!0===me.bodyPadding?5:me.bodyPadding))),me.initBodyBorder()},initBodyBorder:function(){var me=this;me.frame&&me.bodyBorder&&(Ext.isNumber(me.bodyBorder)||(me.bodyBorder=1),me.getProtoBody().setStyle("border-width",this.unitizeBox(me.bodyBorder)))},getCollapsedDockedItems:function(){var me=this;return!1===me.header||"placeholder"==me.collapseMode?me.emptyArray:[me.getReExpander()]},setBodyStyle:function(style,value){var me=this,body=me.rendered?me.body:me.getProtoBody();return Ext.isFunction(style)&&(style=style()),1==arguments.length?(Ext.isString(style)&&(style=Ext.Element.parseStyles(style)),body.setStyle(style)):body.setStyle(style,value),me},addBodyCls:function(cls){var me=this;return(me.rendered?me.body:me.getProtoBody()).addCls(cls),me},removeBodyCls:function(cls){var me=this;return(me.rendered?me.body:me.getProtoBody()).removeCls(cls),me},addUIClsToElement:function(cls){var me=this,result=me.callParent(arguments);return me.addBodyCls([Ext.baseCSSPrefix+cls,me.baseCls+"-body-"+cls,me.baseCls+"-body-"+me.ui+"-"+cls]),result},removeUIClsFromElement:function(cls){var me=this,result=me.callParent(arguments);return me.removeBodyCls([Ext.baseCSSPrefix+cls,me.baseCls+"-body-"+cls,me.baseCls+"-body-"+me.ui+"-"+cls]),result},addUIToElement:function(){var me=this;me.callParent(arguments),me.addBodyCls(me.baseCls+"-body-"+me.ui)},removeUIFromElement:function(){var me=this;me.callParent(arguments),me.removeBodyCls(me.baseCls+"-body-"+me.ui)},getTargetEl:function(){return this.body},applyTargetCls:function(targetCls){this.getProtoBody().addCls(targetCls)},getRefItems:function(deep){var items=this.callParent(arguments);return this.getDockingRefItems(deep,items)},setupRenderTpl:function(renderTpl){this.callParent(arguments),this.setupDockingRenderTpl(renderTpl)}});Ext.define("Ext.panel.Header",{extend:"Ext.container.Container",uses:["Ext.panel.Tool","Ext.util.CSS","Ext.layout.component.Body","Ext.Img"],alias:"widget.header",isHeader:!0,defaultType:"tool",indicateDrag:!1,weight:-1,componentLayout:"body",childEls:["body"],renderTpl:['<div id="{id}-body" class="{headerCls}-body {baseCls}-body {bodyCls} {bodyTargetCls}','<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl>"','<tpl if="bodyStyle"> style="{bodyStyle}"</tpl> role="presentation">',"{%this.renderContainer(out,values)%}","</div>"],headingTpl:['<span id="{id}-textEl" class="{headerCls}-text {cls}-text {cls}-text-{ui}" unselectable="on"','<tpl if="headerRole">',' role="{headerRole}"',"</tpl>",">{title}</span>"],shrinkWrap:3,titlePosition:0,headerCls:Ext.baseCSSPrefix+"header",initComponent:function(){var me=this,hasPosition=me.hasOwnProperty("titlePosition"),items=me.items,titlePosition=hasPosition?me.titlePosition:items?items.length:0,uiClasses=[me.orientation,me.getDockName()],ownerCt=me.ownerCt;me.addEvents("click","dblclick"),me.indicateDragCls=me.headerCls+"-draggable",me.title=me.title||"&#160;",me.tools=me.tools||[],items=me.items=items?Ext.Array.slice(items):[],me.orientation=me.orientation||"horizontal",me.dock=me.dock?me.dock:"horizontal"==me.orientation?"top":"left",(ownerCt?!1!==ownerCt.border||ownerCt.frame:!1!==me.border)||uiClasses.push(me.orientation+"-noborder"),me.addClsWithUI(uiClasses),me.addCls([me.headerCls,me.headerCls+"-"+me.orientation]),me.indicateDrag&&me.addCls(me.indicateDragCls),(me.iconCls||me.icon||me.glyph)&&(me.initIconCmp(),hasPosition||items.length||++titlePosition,items.push(me.iconCmp)),me.titleCmp=new Ext.Component({ariaRole:"presentation",focusable:!1,noWrap:!0,flex:1,rtl:me.rtl,id:me.id+"_hd",style:me.titleAlign?"text-align:"+me.titleAlign:"",cls:me.headerCls+"-text-container "+me.baseCls+"-text-container "+me.baseCls+"-text-container-"+me.ui,renderTpl:me.getTpl("headingTpl"),renderData:{title:me.title,cls:me.baseCls,headerCls:me.headerCls,headerRole:me.headerRole,ui:me.ui},childEls:["textEl"],autoEl:{unselectable:"on"},listeners:{render:me.onTitleRender,scope:me}}),me.layout="vertical"==me.orientation?{type:"vbox",align:"center",alignRoundingMethod:"ceil"}:{type:"hbox",align:"middle",alignRoundingMethod:"floor"},Ext.Array.push(items,me.tools),me.tools.length=0,me.callParent(),items.length<titlePosition&&(titlePosition=items.length),me.titlePosition=titlePosition,me.insert(titlePosition,me.titleCmp),me.on({dblclick:me.onDblClick,click:me.onClick,element:"el",scope:me})},setTitlePosition:function(index){var me=this;me.titlePosition=index=Math.min(index,me.items.length-1),me.insert(index,me.titleCmp)},initIconCmp:function(){var cfg,me=this,cls=[me.headerCls+"-icon",me.baseCls+"-icon",me.iconCls];me.glyph&&cls.push(me.baseCls+"-glyph"),cfg={focusable:!1,src:Ext.BLANK_IMAGE_URL,cls:cls,baseCls:me.baseCls+"-icon",id:me.id+"-iconEl",iconCls:me.iconCls,glyph:me.glyph},Ext.isEmpty(me.icon)||(delete cfg.iconCls,cfg.src=me.icon),me.iconCmp=new Ext.Img(cfg)},beforeRender:function(){this.protoEl.unselectable(),this.callParent()},afterLayout:function(){var frameBR,frameTR,frameTL,xPos,me=this;"vertical"===me.orientation&&(me.adjustTitlePosition(),frameTR=me.frameTR,frameTR&&(frameBR=me.frameBR,frameTL=me.frameTL,xPos=me.getWidth()-frameTR.getPadding("r")-(frameTL?frameTL.getPadding("l"):me.el.getBorderWidth("l"))+"px",frameBR.setStyle("background-position-x",xPos),frameTR.setStyle("background-position-x",xPos)),Ext.isIE7&&Ext.isStrict&&me.frame&&me.el.repaint())},beforeLayout:function(){this.callParent(),this.syncBeforeAfterTitleClasses()},adjustTitlePosition:function(){var titleEl,titleCmp=this.titleCmp;!Ext.isIE9m&&titleCmp&&(titleEl=titleCmp.el,titleEl.setStyle("left",titleEl.getWidth()+"px"))},onTitleRender:function(){"vertical"===this.orientation&&this.titleCmp.el.setVertical(90)},addUIClsToElement:function(cls){var array,i,me=this,result=me.callParent(arguments),classes=[me.baseCls+"-body-"+cls,me.baseCls+"-body-"+me.ui+"-"+cls];if(me.bodyCls){for(array=me.bodyCls.split(" "),i=0;i<classes.length;i++)Ext.Array.contains(array,classes[i])||array.push(classes[i]);me.bodyCls=array.join(" ")}else me.bodyCls=classes.join(" ");return result},removeUIClsFromElement:function(cls){var array,i,me=this,result=me.callParent(arguments),classes=[me.baseCls+"-body-"+cls,me.baseCls+"-body-"+me.ui+"-"+cls];if(me.bodyCls){for(array=me.bodyCls.split(" "),i=0;i<classes.length;i++)Ext.Array.remove(array,classes[i]);me.bodyCls=array.join(" ")}return result},addUIToElement:function(){var array,cls,me=this;me.callParent(arguments),cls=me.baseCls+"-body-"+me.ui,me.rendered?me.bodyCls?me.body.addCls(me.bodyCls):me.body.addCls(cls):me.bodyCls?(array=me.bodyCls.split(" "),Ext.Array.contains(array,cls)||array.push(cls),me.bodyCls=array.join(" ")):me.bodyCls=cls,me.titleCmp&&me.titleCmp.rendered&&me.titleCmp.addCls(me.baseCls+"-text-container-"+me.ui)},removeUIFromElement:function(){var array,cls,me=this;me.callParent(arguments),cls=me.baseCls+"-body-"+me.ui,me.rendered?me.bodyCls?me.body.removeCls(me.bodyCls):me.body.removeCls(cls):me.bodyCls?(array=me.bodyCls.split(" "),Ext.Array.remove(array,cls),me.bodyCls=array.join(" ")):me.bodyCls=cls,me.titleCmp&&me.titleCmp.rendered&&me.titleCmp.removeCls(me.baseCls+"-text-container-"+me.ui)},onClick:function(e){this.fireClickEvent("click",e)},onDblClick:function(e){this.fireClickEvent("dblclick",e)},fireClickEvent:function(type,e){var toolCls="."+Ext.panel.Tool.prototype.baseCls;e.getTarget(toolCls)||this.fireEvent(type,this,e)},getFocusEl:function(){return this.el},getTargetEl:function(){return this.body||this.frameBody||this.el},applyTargetCls:function(targetCls){this.bodyTargetCls=targetCls},setTitle:function(title){var me=this,titleCmp=me.titleCmp;me.title=title,titleCmp.rendered?(titleCmp.textEl.update(me.title||"&#160;"),titleCmp.updateLayout()):me.titleCmp.on({render:function(){me.setTitle(title)},single:!0})},getMinWidth:function(){var result,l,i,me=this,textEl=me.titleCmp.textEl.dom,tools=me.tools;if(textEl.style.display="inline",result=textEl.offsetWidth,textEl.style.display="",tools&&(l=tools.length))for(i=0;i<l;i++)tools[i].el&&(result+=tools[i].el.dom.offsetWidth);return me.iconCmp&&(result+=me.iconCmp.el.dom.offsetWidth),result+10},setIconCls:function(cls){var me=this,isEmpty=!cls||!cls.length,iconCmp=me.iconCmp;me.iconCls=cls,me.iconCmp||isEmpty?iconCmp&&(isEmpty?(me.iconCmp.destroy(),delete me.iconCmp):(iconCmp.removeCls(iconCmp.iconCls),iconCmp.addCls(cls),iconCmp.iconCls=cls)):(me.initIconCmp(),me.insert(0,me.iconCmp))},setIcon:function(icon){var me=this,isEmpty=!icon||!icon.length,iconCmp=me.iconCmp;me.icon=icon,me.iconCmp||isEmpty?iconCmp&&(isEmpty?(me.iconCmp.destroy(),delete me.iconCmp):iconCmp.setSrc(me.icon)):(me.initIconCmp(),me.insert(0,me.iconCmp))},setGlyph:function(glyph){var me=this,iconCmp=me.iconCmp;me.iconCmp?iconCmp&&(glyph?me.iconCmp.setGlyph(glyph):(me.iconCmp.destroy(),delete me.iconCmp)):(me.initIconCmp(),me.insert(0,me.iconCmp))},getTools:function(){return this.tools.slice()},addTool:function(tool){this.add(Ext.ComponentManager.create(tool,"tool"))},syncBeforeAfterTitleClasses:function(force){var afterCls,beforeCls,i,item,me=this,items=me.items,childItems=items.items,titlePosition=me.titlePosition,itemCount=childItems.length,itemGeneration=items.generation,syncGen=me.syncBeforeAfterGen;if(force||syncGen!==itemGeneration)for(me.syncBeforeAfterGen=itemGeneration,i=0;i<itemCount;++i)item=childItems[i],afterCls=item.afterTitleCls||(item.afterTitleCls=item.baseCls+"-after-title"),beforeCls=item.beforeTitleCls||(item.beforeTitleCls=item.baseCls+"-before-title"),!me.title||i<titlePosition?(syncGen&&item.removeCls(afterCls),item.addCls(beforeCls)):i>titlePosition&&(syncGen&&item.removeCls(beforeCls),item.addCls(afterCls))},onAdd:function(component,index){var tools=this.tools;this.callParent(arguments),component.isTool&&(tools.push(component),tools[component.type]=component)},initRenderData:function(){return Ext.applyIf(this.callParent(),{bodyCls:this.bodyCls,bodyTargetCls:this.bodyTargetCls,headerCls:this.headerCls})},getDockName:function(){return this.dock},getFramingInfoCls:function(){var me=this,cls=me.callParent(),owner=me.ownerCt;return!me.expanding&&owner&&(owner.collapsed||me.isCollapsedExpander)&&(cls+="-"+owner.collapsedCls),cls+"-"+me.dock}});Ext.define("Ext.dd.DragDrop",{requires:["Ext.dd.DragDropManager"],constructor:function(id,sGroup,config){id&&this.init(id,sGroup,config)},id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:!1,lock:function(){this.locked=!0},moveOnly:!1,unlock:function(){this.locked=!1},isTarget:!0,padding:null,_domRef:null,__ygDragDrop:!0,constrainX:!1,constrainY:!1,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:!1,xTicks:null,yTicks:null,primaryButtonOnly:!0,available:!1,hasOuterHandles:!1,b4StartDrag:function(x,y){},startDrag:function(x,y){},b4Drag:function(e){},onDrag:function(e){},onDragEnter:function(e,id){},b4DragOver:function(e){},onDragOver:function(e,id){},b4DragOut:function(e){},onDragOut:function(e,id){},b4DragDrop:function(e){},onDragDrop:function(e,id){},onInvalidDrop:function(e){},b4EndDrag:function(e){},endDrag:function(e){},b4MouseDown:function(e){},onMouseDown:function(e){},onMouseUp:function(e){},onAvailable:function(){},defaultPadding:{left:0,right:0,top:0,bottom:0},constrainTo:function(constrainTo,pad,inContent){Ext.isNumber(pad)&&(pad={left:pad,right:pad,top:pad,bottom:pad}),pad=pad||this.defaultPadding;var c,xy,topSpace,leftSpace,b=Ext.get(this.getEl()).getBox(),ce=Ext.get(constrainTo),s=ce.getScroll(),cd=ce.dom;cd==document.body?c={x:s.left,y:s.top,width:Ext.Element.getViewWidth(),height:Ext.Element.getViewHeight()}:(xy=ce.getXY(),c={x:xy[0],y:xy[1],width:cd.clientWidth,height:cd.clientHeight}),topSpace=b.y-c.y,leftSpace=b.x-c.x,this.resetConstraints(),this.setXConstraint(leftSpace-(pad.left||0),c.width-leftSpace-b.width-(pad.right||0),this.xTickSize),this.setYConstraint(topSpace-(pad.top||0),c.height-topSpace-b.height-(pad.bottom||0),this.yTickSize)},getEl:function(){return this._domRef||(this._domRef=Ext.getDom(this.id)),this._domRef},getDragEl:function(){return Ext.getDom(this.dragElId)},init:function(id,sGroup,config){this.initTarget(id,sGroup,config),Ext.EventManager.on(this.id,"mousedown",this.handleMouseDown,this)},initTarget:function(id,sGroup,config){this.config=config||{},this.DDMInstance=Ext.dd.DragDropManager,this.groups={},"string"!=typeof id&&(id=Ext.id(id)),this.id=id,this.addToGroup(sGroup||"default"),this.handleElId=id,this.setDragElId(id),this.invalidHandleTypes={A:"A"},this.invalidHandleIds={},this.invalidHandleClasses=[],this.applyConfig(),this.handleOnAvailable()},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0],this.isTarget=!1!==this.config.isTarget,this.maintainOffset=this.config.maintainOffset,this.primaryButtonOnly=!1!==this.config.primaryButtonOnly},handleOnAvailable:function(){this.available=!0,this.resetConstraints(),this.onAvailable()},setPadding:function(iTop,iRight,iBot,iLeft){this.padding=iRight||0===iRight?iBot||0===iBot?[iTop,iRight,iBot,iLeft]:[iTop,iRight,iTop,iRight]:[iTop,iTop,iTop,iTop]},setInitPosition:function(diffX,diffY){var dx,dy,p,el=this.getEl();this.DDMInstance.verifyEl(el)&&(dx=diffX||0,dy=diffY||0,p=Ext.Element.getXY(el),this.initPageX=p[0]-dx,this.initPageY=p[1]-dy,this.lastPageX=p[0],this.lastPageY=p[1],this.setStartPosition(p))},setStartPosition:function(pos){var p=pos||Ext.Element.getXY(this.getEl());this.deltaSetXY=null,this.startPageX=p[0],this.startPageY=p[1]},addToGroup:function(sGroup){this.groups[sGroup]=!0,this.DDMInstance.regDragDrop(this,sGroup)},removeFromGroup:function(sGroup){this.groups[sGroup]&&delete this.groups[sGroup],this.DDMInstance.removeDDFromGroup(this,sGroup)},setDragElId:function(id){this.dragElId=id},setHandleElId:function(id){"string"!=typeof id&&(id=Ext.id(id)),this.handleElId=id,this.DDMInstance.regHandle(this.id,id)},setOuterHandleElId:function(id){"string"!=typeof id&&(id=Ext.id(id)),Ext.EventManager.on(id,"mousedown",this.handleMouseDown,this),this.setHandleElId(id),this.hasOuterHandles=!0},unreg:function(){var me=this;Ext.EventManager.un(me.id,"mousedown",me.handleMouseDown,me),me._domRef=null,me.DDMInstance._remove(me,me.autoGroup)},destroy:function(){this.unreg()},isLocked:function(){return this.DDMInstance.isLocked()||this.locked},handleMouseDown:function(e,oDD){var me=this;me.primaryButtonOnly&&0!=e.button||me.isLocked()||(me.DDMInstance.refreshCache(me.groups),(me.hasOuterHandles||me.DDMInstance.isOverTarget(e.getPoint(),me))&&me.clickValidator(e)&&(me.setStartPosition(),me.b4MouseDown(e),me.onMouseDown(e),me.DDMInstance.handleMouseDown(e,me),me.DDMInstance.stopEvent(e)))},clickValidator:function(e){var target=e.getTarget();return this.isValidHandleChild(target)&&(this.id==this.handleElId||this.DDMInstance.handleWasClicked(target,this.id))},addInvalidHandleType:function(tagName){var type=tagName.toUpperCase();this.invalidHandleTypes[type]=type},addInvalidHandleId:function(id){"string"!=typeof id&&(id=Ext.id(id)),this.invalidHandleIds[id]=id},addInvalidHandleClass:function(cssClass){this.invalidHandleClasses.push(cssClass)},removeInvalidHandleType:function(tagName){var type=tagName.toUpperCase();delete this.invalidHandleTypes[type]},removeInvalidHandleId:function(id){"string"!=typeof id&&(id=Ext.id(id)),delete this.invalidHandleIds[id]},removeInvalidHandleClass:function(cssClass){for(var i=0,len=this.invalidHandleClasses.length;i<len;++i)this.invalidHandleClasses[i]==cssClass&&delete this.invalidHandleClasses[i]},isValidHandleChild:function(node){var nodeName,i,len,valid=!0;try{nodeName=node.nodeName.toUpperCase()}catch(e){nodeName=node.nodeName}for(valid=valid&&!this.invalidHandleTypes[nodeName],valid=valid&&!this.invalidHandleIds[node.id],i=0,len=this.invalidHandleClasses.length;valid&&i<len;++i)valid=!Ext.fly(node).hasCls(this.invalidHandleClasses[i]);return valid},setXTicks:function(iStartX,iTickSize){this.xTicks=[],this.xTickSize=iTickSize;var i,tickMap={};for(i=this.initPageX;i>=this.minX;i-=iTickSize)tickMap[i]||(this.xTicks[this.xTicks.length]=i,tickMap[i]=!0);for(i=this.initPageX;i<=this.maxX;i+=iTickSize)tickMap[i]||(this.xTicks[this.xTicks.length]=i,tickMap[i]=!0);Ext.Array.sort(this.xTicks,this.DDMInstance.numericSort)},setYTicks:function(iStartY,iTickSize){this.yTicks=[],this.yTickSize=iTickSize;var i,tickMap={};for(i=this.initPageY;i>=this.minY;i-=iTickSize)tickMap[i]||(this.yTicks[this.yTicks.length]=i,tickMap[i]=!0);for(i=this.initPageY;i<=this.maxY;i+=iTickSize)tickMap[i]||(this.yTicks[this.yTicks.length]=i,tickMap[i]=!0);Ext.Array.sort(this.yTicks,this.DDMInstance.numericSort)},setXConstraint:function(iLeft,iRight,iTickSize){this.leftConstraint=iLeft,this.rightConstraint=iRight,this.minX=this.initPageX-iLeft,this.maxX=this.initPageX+iRight,iTickSize&&this.setXTicks(this.initPageX,iTickSize),this.constrainX=!0},clearConstraints:function(){this.constrainX=!1,this.constrainY=!1,this.clearTicks()},clearTicks:function(){this.xTicks=null,this.yTicks=null,this.xTickSize=0,this.yTickSize=0},setYConstraint:function(iUp,iDown,iTickSize){this.topConstraint=iUp,this.bottomConstraint=iDown,this.minY=this.initPageY-iUp,this.maxY=this.initPageY+iDown,iTickSize&&this.setYTicks(this.initPageY,iTickSize),this.constrainY=!0},resetConstraints:function(){if(this.initPageX||0===this.initPageX){var dx=this.maintainOffset?this.lastPageX-this.initPageX:0,dy=this.maintainOffset?this.lastPageY-this.initPageY:0;this.setInitPosition(dx,dy)}else this.setInitPosition();this.constrainX&&this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize),this.constrainY&&this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize)},getTick:function(val,tickArray){if(tickArray){if(tickArray[0]>=val)return tickArray[0];var i,len,next,diff1,diff2;for(i=0,len=tickArray.length;i<len;++i)if(next=i+1,tickArray[next]&&tickArray[next]>=val)return diff1=val-tickArray[i],diff2=tickArray[next]-val,diff2>diff1?tickArray[i]:tickArray[next];return tickArray[tickArray.length-1]}return val},toString:function(){return"DragDrop "+this.id}});Ext.define("Ext.dd.DD",{extend:"Ext.dd.DragDrop",requires:["Ext.dd.DragDropManager"],constructor:function(id,sGroup,config){id&&this.init(id,sGroup,config)},scroll:!0,autoOffset:function(iPageX,iPageY){var x=iPageX-this.startPageX,y=iPageY-this.startPageY;this.setDelta(x,y)},setDelta:function(iDeltaX,iDeltaY){this.deltaX=iDeltaX,this.deltaY=iDeltaY},setDragElPos:function(iPageX,iPageY){var el=this.getDragEl();this.alignElWithMouse(el,iPageX,iPageY)},alignElWithMouse:function(el,iPageX,iPageY){var vpSize,aCoord,newLeft,newTop,oCoord=this.getTargetCoord(iPageX,iPageY),fly=el.dom?el:Ext.fly(el,"_dd"),elSize=fly.getSize(),EL=Ext.Element;return this.deltaSetXY?(vpSize=this.cachedViewportSize,this.setLocalXY(fly,Math.max(0,Math.min(oCoord.x+this.deltaSetXY[0],vpSize.width-elSize.width)),Math.max(0,Math.min(oCoord.y+this.deltaSetXY[1],vpSize.height-elSize.height)))):(vpSize=this.cachedViewportSize={width:EL.getDocumentWidth(),height:EL.getDocumentHeight()},aCoord=[Math.max(0,Math.min(oCoord.x,vpSize.width-elSize.width)),Math.max(0,Math.min(oCoord.y,vpSize.height-elSize.height))],fly.setXY(aCoord),newLeft=this.getLocalX(fly),newTop=fly.getLocalY(),this.deltaSetXY=[newLeft-oCoord.x,newTop-oCoord.y]),this.cachePosition(oCoord.x,oCoord.y),this.autoScroll(oCoord.x,oCoord.y,el.offsetHeight,el.offsetWidth),oCoord},cachePosition:function(iPageX,iPageY){if(iPageX)this.lastPageX=iPageX,this.lastPageY=iPageY;else{var aCoord=Ext.Element.getXY(this.getEl());this.lastPageX=aCoord[0],this.lastPageY=aCoord[1]}},autoScroll:function(x,y,h,w){if(this.scroll){var clientH=Ext.Element.getViewHeight(),clientW=Ext.Element.getViewWidth(),st=this.DDMInstance.getScrollTop(),sl=this.DDMInstance.getScrollLeft(),bot=h+y,right=w+x,toBot=clientH+st-y-this.deltaY,toRight=clientW+sl-x-this.deltaX,scrAmt=document.all?80:30;bot>clientH&&toBot<40&&window.scrollTo(sl,st+scrAmt),y<st&&st>0&&y-st<40&&window.scrollTo(sl,st-scrAmt),right>clientW&&toRight<40&&window.scrollTo(sl+scrAmt,st),x<sl&&sl>0&&x-sl<40&&window.scrollTo(sl-scrAmt,st)}},getTargetCoord:function(iPageX,iPageY){var x=iPageX-this.deltaX,y=iPageY-this.deltaY;return this.constrainX&&(x<this.minX&&(x=this.minX),x>this.maxX&&(x=this.maxX)),this.constrainY&&(y<this.minY&&(y=this.minY),y>this.maxY&&(y=this.maxY)),x=this.getTick(x,this.xTicks),y=this.getTick(y,this.yTicks),{x:x,y:y}},applyConfig:function(){this.callParent(),this.scroll=!1!==this.config.scroll},b4MouseDown:function(e){this.autoOffset(e.getPageX(),e.getPageY())},b4Drag:function(e){this.setDragElPos(e.getPageX(),e.getPageY())},toString:function(){return"DD "+this.id},getLocalX:function(el){return el.getLocalX()},setLocalXY:function(el,x,y){el.setLocalXY(x,y)}});Ext.define("Ext.dd.DDProxy",{extend:"Ext.dd.DD",statics:{dragElId:"ygddfdiv"},constructor:function(id,sGroup,config){id&&(this.init(id,sGroup,config),this.initFrame())},resizeFrame:!0,centerFrame:!1,createFrame:function(){var div,s,self=this,body=document.body;if(!body||!body.firstChild)return void setTimeout(function(){self.createFrame()},50);(div=this.getDragEl())||(div=document.createElement("div"),div.id=this.dragElId,div.setAttribute("role","presentation"),s=div.style,s.position="absolute",s.visibility="hidden",s.cursor="move",s.border="2px solid #aaa",s.zIndex=999,body.insertBefore(div,body.firstChild))},initFrame:function(){this.createFrame()},applyConfig:function(){this.callParent(),this.resizeFrame=!1!==this.config.resizeFrame,this.centerFrame=this.config.centerFrame,this.setDragElId(this.config.dragElId||Ext.dd.DDProxy.dragElId)},showFrame:function(iPageX,iPageY){var dragEl=(this.getEl(),this.getDragEl()),s=dragEl.style;this._resizeProxy(),this.centerFrame&&this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2)),this.setDragElPos(iPageX,iPageY),Ext.fly(dragEl).show()},_resizeProxy:function(){if(this.resizeFrame){var el=this.getEl();Ext.fly(this.getDragEl()).setSize(el.offsetWidth,el.offsetHeight)}},b4MouseDown:function(e){var x=e.getPageX(),y=e.getPageY();this.autoOffset(x,y),this.setDragElPos(x,y)},b4StartDrag:function(x,y){this.showFrame(x,y)},b4EndDrag:function(e){Ext.fly(this.getDragEl()).hide()},endDrag:function(e){var lel=this.getEl(),del=this.getDragEl();del.style.visibility="",this.beforeMove(),lel.style.visibility="hidden",Ext.dd.DDM.moveToEl(lel,del),del.style.visibility="hidden",lel.style.visibility="",this.afterDrag()},beforeMove:function(){},afterDrag:function(){},toString:function(){return"DDProxy "+this.id}});Ext.define("Ext.dd.StatusProxy",{extend:"Ext.Component",animRepair:!1,childEls:["ghost"],renderTpl:['<div class="'+Ext.baseCSSPrefix+'dd-drop-icon" role="presentation"></div><div id="{id}-ghost" class="'+Ext.baseCSSPrefix+'dd-drag-ghost" role="presentation"></div>'],repairCls:Ext.baseCSSPrefix+"dd-drag-repair",ariaRole:"presentation",constructor:function(config){var me=this;config=config||{},Ext.apply(me,{hideMode:"visibility",hidden:!0,floating:!0,id:me.id||Ext.id(),cls:Ext.baseCSSPrefix+"dd-drag-proxy "+this.dropNotAllowed,shadow:config.shadow||!1,renderTo:Ext.getDetachedBody()}),me.callParent(arguments),this.dropStatus=this.dropNotAllowed},dropAllowed:Ext.baseCSSPrefix+"dd-drop-ok",dropNotAllowed:Ext.baseCSSPrefix+"dd-drop-nodrop",setStatus:function(cssClass){cssClass=cssClass||this.dropNotAllowed,this.dropStatus!=cssClass&&(this.el.replaceCls(this.dropStatus,cssClass),this.dropStatus=cssClass)},reset:function(clearGhost){var me=this,clsPrefix=Ext.baseCSSPrefix+"dd-drag-proxy ";me.el.replaceCls(clsPrefix+me.dropAllowed,clsPrefix+me.dropNotAllowed),me.dropStatus=me.dropNotAllowed,clearGhost&&me.ghost.update("")},update:function(html){"string"==typeof html?this.ghost.update(html):(this.ghost.update(""),html.style.margin="0",this.ghost.dom.appendChild(html));var el=this.ghost.dom.firstChild;el&&Ext.fly(el).setStyle("float","none")},getGhost:function(){return this.ghost},hide:function(clear){this.callParent(),clear&&this.reset(!0)},stop:function(){this.anim&&this.anim.isAnimated&&this.anim.isAnimated()&&this.anim.stop()},sync:function(){this.el.sync()},repair:function(xy,callback,scope){var me=this;me.callback=callback,me.scope=scope,xy&&!1!==me.animRepair?(me.el.addCls(me.repairCls),me.el.hideUnders(!0),me.anim=me.el.animate({duration:me.repairDuration||500,easing:"ease-out",to:{x:xy[0],y:xy[1]},stopAnimation:!0,callback:me.afterRepair,scope:me})):me.afterRepair()},afterRepair:function(){var me=this;me.hide(!0),me.el.removeCls(me.repairCls),"function"==typeof me.callback&&me.callback.call(me.scope||me),delete me.callback,delete me.scope}});Ext.define("Ext.dd.DragSource",{extend:"Ext.dd.DDProxy",requires:["Ext.dd.StatusProxy","Ext.dd.DragDropManager"],dropAllowed:Ext.baseCSSPrefix+"dd-drop-ok",dropNotAllowed:Ext.baseCSSPrefix+"dd-drop-nodrop",animRepair:!0,repairHighlightColor:"c3daf9",constructor:function(el,config){this.el=Ext.get(el),this.dragData||(this.dragData={}),Ext.apply(this,config),this.proxy||(this.proxy=new Ext.dd.StatusProxy({id:this.el.id+"-drag-status-proxy",animRepair:this.animRepair})),this.callParent([this.el.dom,this.ddGroup||this.group,{dragElId:this.proxy.id,resizeFrame:!1,isTarget:!1,scroll:!0===this.scroll}]),this.dragging=!1},getDragData:function(e){return this.dragData},onDragEnter:function(e,id){var status,target=Ext.dd.DragDropManager.getDDById(id);this.cachedTarget=target,!1!==this.beforeDragEnter(target,e,id)&&(target.isNotifyTarget?(status=target.notifyEnter(this,e,this.dragData),this.proxy.setStatus(status)):this.proxy.setStatus(this.dropAllowed),this.afterDragEnter&&this.afterDragEnter(target,e,id))},beforeDragEnter:function(target,e,id){return!0},onDragOver:function(e,id){var status,target=this.cachedTarget||Ext.dd.DragDropManager.getDDById(id);!1!==this.beforeDragOver(target,e,id)&&(target.isNotifyTarget&&(status=target.notifyOver(this,e,this.dragData),this.proxy.setStatus(status)),this.afterDragOver&&this.afterDragOver(target,e,id))},beforeDragOver:function(target,e,id){return!0},onDragOut:function(e,id){var target=this.cachedTarget||Ext.dd.DragDropManager.getDDById(id);!1!==this.beforeDragOut(target,e,id)&&(target.isNotifyTarget&&target.notifyOut(this,e,this.dragData),this.proxy.reset(),this.afterDragOut&&this.afterDragOut(target,e,id)),this.cachedTarget=null},beforeDragOut:function(target,e,id){return!0},onDragDrop:function(e,id){var target=this.cachedTarget||Ext.dd.DragDropManager.getDDById(id);!1!==this.beforeDragDrop(target,e,id)&&(target.isNotifyTarget?!1!==target.notifyDrop(this,e,this.dragData)?this.onValidDrop(target,e,id):this.onInvalidDrop(target,e,id):this.onValidDrop(target,e,id),this.afterDragDrop&&this.afterDragDrop(target,e,id)),delete this.cachedTarget},beforeDragDrop:function(target,e,id){return!0},onValidDrop:function(target,e,id){this.hideProxy(),this.afterValidDrop&&this.afterValidDrop(target,e,id)},getRepairXY:function(e,data){return this.el.getXY()},onInvalidDrop:function(target,e,id){var me=this;e||(e=target,target=null,id=e.getTarget().id),!1!==me.beforeInvalidDrop(target,e,id)&&(me.cachedTarget&&(me.cachedTarget.isNotifyTarget&&me.cachedTarget.notifyOut(me,e,me.dragData),me.cacheTarget=null),me.proxy.repair(me.getRepairXY(e,me.dragData),me.afterRepair,me),me.afterInvalidDrop&&me.afterInvalidDrop(e,id))},afterRepair:function(){var me=this;Ext.enableFx&&me.el.highlight(me.repairHighlightColor),me.dragging=!1},beforeInvalidDrop:function(target,e,id){return!0},handleMouseDown:function(e){if(!this.dragging){var data=this.getDragData(e);data&&!1!==this.onBeforeDrag(data,e)&&(this.dragData=data,this.proxy.stop(),this.callParent(arguments))}},onBeforeDrag:function(data,e){return!0},onStartDrag:Ext.emptyFn,alignElWithMouse:function(){return this.proxy.ensureAttachedToBody(!0),this.callParent(arguments)},startDrag:function(x,y){this.proxy.reset(),this.proxy.hidden=!1,this.dragging=!0,this.proxy.update(""),this.onInitDrag(x,y),this.proxy.show()},onInitDrag:function(x,y){var clone=this.el.dom.cloneNode(!0);return clone.id=Ext.id(),this.proxy.update(clone),this.onStartDrag(x,y),!0},getProxy:function(){return this.proxy},hideProxy:function(){this.proxy.hide(),this.proxy.reset(!0),this.dragging=!1},triggerCacheRefresh:function(){Ext.dd.DDM.refreshCache(this.groups)},b4EndDrag:function(e){},endDrag:function(e){this.onEndDrag(this.dragData,e)},onEndDrag:function(data,e){},autoOffset:function(x,y){this.setDelta(-12,-20)},destroy:function(){this.callParent(),Ext.destroy(this.proxy)}});Ext.define("Ext.panel.Proxy",{alternateClassName:"Ext.dd.PanelProxy",moveOnDrag:!0,constructor:function(panel,config){var me=this;me.panel=panel,me.id=me.panel.id+"-ddproxy",Ext.apply(me,config)},insertProxy:!0,setStatus:Ext.emptyFn,reset:Ext.emptyFn,update:Ext.emptyFn,stop:Ext.emptyFn,sync:Ext.emptyFn,getEl:function(){return this.ghost.el},getGhost:function(){return this.ghost},getProxy:function(){return this.proxy},hide:function(){var me=this;me.ghost&&(me.proxy&&(me.proxy.remove(),delete me.proxy),me.panel.unghost(null,me.moveOnDrag),delete me.ghost)},show:function(){var panelSize,me=this;me.ghost||(panelSize=me.panel.getSize(),me.panel.el.setVisibilityMode(Ext.Element.DISPLAY),me.ghost=me.panel.ghost(),me.insertProxy&&(me.proxy=me.panel.el.insertSibling({role:"presentation",cls:Ext.baseCSSPrefix+"panel-dd-spacer"}),me.proxy.setSize(panelSize)))},repair:function(xy,callback,scope){this.hide(),Ext.callback(callback,scope||this)},moveProxy:function(parentNode,before){this.proxy&&parentNode.insertBefore(this.proxy.dom,before)}});Ext.define("Ext.panel.DD",{extend:"Ext.dd.DragSource",requires:["Ext.panel.Proxy"],constructor:function(panel,cfg){var me=this;me.panel=panel,me.dragData={panel:panel},me.panelProxy=new Ext.panel.Proxy(panel,cfg),me.proxy=me.panelProxy.proxy,me.callParent([panel.el,cfg]),me.setupEl(panel)},setupEl:function(panel){var me=this,header=panel.header,el=panel.body;header&&(me.setHandleElId(header.id),el=header.el),el?(el.setStyle("cursor","move"),me.scroll=!1):panel.on("boxready",me.setupEl,me,{single:!0})},showFrame:Ext.emptyFn,startDrag:Ext.emptyFn,b4StartDrag:function(x,y){this.panelProxy.show()},b4MouseDown:function(e){var x=e.getPageX(),y=e.getPageY();this.autoOffset(x,y)},onInitDrag:function(x,y){return this.onStartDrag(x,y),!0},createFrame:Ext.emptyFn,getDragEl:function(e){var ghost=this.panelProxy.ghost;if(ghost)return ghost.el.dom},endDrag:function(e){this.panelProxy.hide(),this.panel.saveState()},autoOffset:function(x,y){x-=this.startPageX,y-=this.startPageY,this.setDelta(x,y)},onInvalidDrop:function(target,e,id){var me=this;!1!==me.beforeInvalidDrop(target,e,id)&&(me.cachedTarget&&(me.cachedTarget.isNotifyTarget&&me.cachedTarget.notifyOut(me,e,me.dragData),me.cacheTarget=null),me.afterInvalidDrop&&me.afterInvalidDrop(e,id))}});Ext.define("Ext.util.Memento",function(){function captureOne(src,target,prop,prefix){src[prefix?prefix+prop:prop]=target[prop]}function removeOne(src,target,prop){delete src[prop]}function restoreOne(src,target,prop,prefix){var name=prefix?prefix+prop:prop,value=src[name];(value||src.hasOwnProperty(name))&&restoreValue(target,prop,value)}function restoreValue(target,prop,value){Ext.isDefined(value)?target[prop]=value:delete target[prop]}function doMany(doOne,src,target,props,prefix){if(src)if(Ext.isArray(props)){var p,pLen=props.length;for(p=0;p<pLen;p++)doOne(src,target,props[p],prefix)}else doOne(src,target,props,prefix)}return{data:null,target:null,constructor:function(target,props){target&&(this.target=target,props&&this.capture(props))},capture:function(props,target,prefix){var me=this;doMany(captureOne,me.data||(me.data={}),target||me.target,props,prefix)},remove:function(props){doMany(removeOne,this.data,null,props)},restore:function(props,clear,target,prefix){doMany(restoreOne,this.data,target||this.target,props,prefix),!1!==clear&&this.remove(props)},restoreAll:function(clear,target){var prop,me=this,t=target||this.target,data=me.data;for(prop in data)data.hasOwnProperty(prop)&&restoreValue(t,prop,data[prop]);!1!==clear&&delete me.data}}}());Ext.define("Ext.panel.Panel",{extend:"Ext.panel.AbstractPanel",requires:["Ext.panel.Header","Ext.fx.Anim","Ext.util.KeyMap","Ext.panel.DD","Ext.XTemplate","Ext.layout.component.Dock","Ext.util.Memento"],alias:"widget.panel",alternateClassName:"Ext.Panel",collapsedCls:"collapsed",animCollapse:Ext.enableFx,minButtonWidth:75,collapsed:!1,collapseFirst:!0,hideCollapseTool:!1,titleCollapse:void 0,floatable:!0,collapsible:void 0,closable:!1,closeAction:"destroy",placeholderCollapseHideMode:Ext.Element.VISIBILITY,preventHeader:!1,header:void 0,headerPosition:"top",frame:!1,frameHeader:!0,manageHeight:!0,constrain:!1,constrainHeader:!1,initComponent:function(){var me=this;me.addEvents("beforeclose","close","beforeexpand","beforecollapse","expand","collapse","titlechange","iconchange","iconclschange","glyphchange","float","unfloat"),me.collapsible&&me.addStateEvents(["expand","collapse"]),me.unstyled&&me.setUI("plain"),me.frame&&me.setUI(me.ui+"-framed"),me.bridgeToolbars(),me.callParent(),me.collapseDirection=me.collapseDirection||me.headerPosition||Ext.Component.DIRECTION_TOP,me.hiddenOnCollapse=new Ext.dom.CompositeElement},beforeDestroy:function(){var me=this;Ext.destroy(me.placeholder,me.ghostPanel,me.dd),me.callParent()},getFocusEl:function(){return this.el},getHeader:function(){return this.header},setTitle:function(newTitle){var me=this,oldTitle=me.title,header=me.header,reExpander=me.reExpander,placeholder=me.placeholder;me.title=newTitle,header?header.isHeader?header.setTitle(newTitle):header.title=newTitle:me.rendered&&me.updateHeader(),reExpander&&reExpander.setTitle(newTitle),placeholder&&placeholder.setTitle&&placeholder.setTitle(newTitle),me.fireEvent("titlechange",me,newTitle,oldTitle)},setIconCls:function(newIconCls){var me=this,oldIconCls=me.iconCls,header=me.header,placeholder=me.placeholder;me.iconCls=newIconCls,header?header.isHeader?header.setIconCls(newIconCls):header.iconCls=newIconCls:me.updateHeader(),placeholder&&placeholder.setIconCls&&placeholder.setIconCls(newIconCls),me.fireEvent("iconclschange",me,newIconCls,oldIconCls)},setIcon:function(newIcon){var me=this,oldIcon=me.icon,header=me.header,placeholder=me.placeholder;me.icon=newIcon,header?header.isHeader?header.setIcon(newIcon):header.icon=newIcon:me.updateHeader(),placeholder&&placeholder.setIcon&&placeholder.setIcon(newIcon),me.fireEvent("iconchange",me,newIcon,oldIcon)},setGlyph:function(newGlyph){var me=this,oldGlyph=me.glyph,header=me.header,placeholder=me.placeholder;me.glyph=newGlyph,header?header.isHeader?header.setGlyph(newGlyph):header.glyph=newGlyph:me.updateHeader(),placeholder&&placeholder.setGlyph&&placeholder.setIcon(newGlyph),me.fireEvent("glyphchange",me,newGlyph,oldGlyph)},bridgeToolbars:function(){function initToolbar(toolbar,pos,useButtonAlign){return Ext.isArray(toolbar)?toolbar={xtype:"toolbar",items:toolbar}:toolbar.xtype||(toolbar.xtype="toolbar"),toolbar.dock=pos,"left"!=pos&&"right"!=pos||(toolbar.vertical=!0),useButtonAlign&&(toolbar.layout=Ext.applyIf(toolbar.layout||{},{pack:{left:"start",center:"center"}[me.buttonAlign]||"end"})),toolbar}var fbar,fbarDefaults,me=this,docked=[],minButtonWidth=me.minButtonWidth;me.tbar&&(docked.push(initToolbar(me.tbar,"top")),me.tbar=null),me.bbar&&(docked.push(initToolbar(me.bbar,"bottom")),me.bbar=null),me.buttons&&(me.fbar=me.buttons,me.buttons=null),me.fbar&&(fbar=initToolbar(me.fbar,"bottom",!0),fbar.ui="footer",minButtonWidth&&(fbarDefaults=fbar.defaults,fbar.defaults=function(config){var cls,defaults=fbarDefaults||{},isButton=!config.xtype||config.isButton;return isButton||(cls=Ext.ClassManager.getByAlias("widget."+config.xtype))&&(isButton=cls.prototype.isButton),!isButton||"minWidth"in defaults||(defaults=Ext.apply({minWidth:minButtonWidth},defaults)),defaults}),docked.push(fbar),me.fbar=null),me.lbar&&(docked.push(initToolbar(me.lbar,"left")),me.lbar=null),me.rbar&&(docked.push(initToolbar(me.rbar,"right")),me.rbar=null),me.dockedItems?(Ext.isArray(me.dockedItems)||(me.dockedItems=[me.dockedItems]),me.dockedItems=me.dockedItems.concat(docked)):me.dockedItems=docked},isPlaceHolderCollapse:function(){return"placeholder"==this.collapseMode},onBoxReady:function(){this.callParent(),this.collapsed&&this.setHiddenDocked()},beforeRender:function(){var wasCollapsed,me=this;me.callParent(),me.initTools(),me.preventHeader||!1===me.header||me.updateHeader(),me.collapsed&&(me.isPlaceHolderCollapse()?me.hidden||(me.setHiddenState(!0),me.preventCollapseFire=!0,me.placeholderCollapse(),delete me.preventCollapseFire,wasCollapsed=me.collapsed,me.collapsed=!1):(me.beginCollapse(),me.addClsWithUI(me.collapsedCls))),wasCollapsed&&(me.collapsed=wasCollapsed)},initTools:function(){var i,tool,me=this,tools=me.tools;for(me.tools=[],i=tools&&tools.length;i;)--i,me.tools[i]=tool=tools[i],tool.toolOwner=me;!me.collapsible||me.hideCollapseTool||!1===me.header||me.preventHeader||(me.collapseDirection=me.collapseDirection||me.headerPosition||"top",me.collapseTool=me.expandTool=Ext.widget({xtype:"tool",handler:me.toggleCollapse,scope:me}),me.updateCollapseTool(),me.collapseFirst&&me.tools.unshift(me.collapseTool)),me.addTools(),me.closable&&(me.addClsWithUI("closable"),me.addTool(Ext.widget({xtype:"tool",type:"close",handler:Ext.Function.bind(me.close,me,[])}))),me.collapseTool&&!me.collapseFirst&&me.addTool(me.collapseTool)},addTools:Ext.emptyFn,updateCollapseTool:function(){var me=this,collapseTool=me.collapseTool;collapseTool&&(me.collapsed&&!me.isPlaceHolderCollapse()?collapseTool.setType("expand-"+me.getOppositeDirection(me.collapseDirection)):collapseTool.setType("collapse-"+me.collapseDirection))},close:function(){!1!==this.fireEvent("beforeclose",this)&&this.doClose()},doClose:function(){this.fireEvent("close",this),this[this.closeAction]()},updateHeader:function(force){var me=this,header=me.header,title=me.title,tools=me.tools,icon=me.icon||me.iconCls,vertical="left"===me.headerPosition||"right"===me.headerPosition;Ext.isObject(header)||!1!==header&&(force||title||icon||tools&&tools.length||me.collapsible&&!me.titleCollapse)?header&&header.isHeader?header.show():(header=me.header=Ext.widget(Ext.apply({xtype:"header",title:title,titleAlign:me.titleAlign,orientation:vertical?"vertical":"horizontal",dock:me.headerPosition||"top",textCls:me.headerTextCls,iconCls:me.iconCls,icon:me.icon,glyph:me.glyph,baseCls:me.baseCls+"-header",tools:tools,ui:me.ui,id:me.id+"_header",overCls:me.headerOverCls,indicateDrag:me.draggable,frame:(me.frame||me.alwaysFramed)&&me.frameHeader,ignoreParentFrame:me.frame||me.overlapHeader,ignoreBorderManagement:me.frame||me.ignoreHeaderBorderManagement,headerRole:me.headerRole,ownerCt:me,listeners:me.collapsible&&me.titleCollapse?{click:me.toggleCollapse,scope:me}:null},me.header)),me.addDocked(header,0)):header&&header.hide()},setUI:function(ui){var me=this;me.callParent(arguments),me.header&&me.header.rendered&&me.header.setUI(ui)},getDefaultContentTarget:function(){return this.body},getTargetEl:function(){var me=this;return me.body||me.protoBody||me.frameBody||me.el},isVisible:function(deep){var me=this;return me.collapsed&&me.placeholder?me.placeholder.isVisible(deep):me.callParent(arguments)},onHide:function(){var me=this,dd=me.dd;me.floatedFromCollapse&&me.slideOutFloatedPanel(!0),me.draggable&&dd&&dd.endDrag(),me.collapsed&&me.placeholder?me.placeholder.hide():me.callParent(arguments)},onShow:function(){var me=this;me.collapsed&&me.isPlaceHolderCollapse()?(me.setHiddenState(!0),me.placeholderCollapse()):me.callParent(arguments)},onRemoved:function(destroying){var me=this;me.placeholder&&!destroying&&me.ownerCt.remove(me.placeholder,!1),me.callParent(arguments)},addTool:function(tools){Ext.isArray(tools)||(tools=[tools]);var t,tool,me=this,header=me.header,tLen=tools.length;for(t=0;t<tLen;t++)tool=tools[t],tool.toolOwner=me,header&&header.isHeader?header.addTool(tool):me.tools.push(tool);me.updateHeader()},getOppositeDirection:function(d){var c=Ext.Component;switch(d){case c.DIRECTION_TOP:return c.DIRECTION_BOTTOM;case c.DIRECTION_RIGHT:return c.DIRECTION_LEFT;case c.DIRECTION_BOTTOM:return c.DIRECTION_TOP;case c.DIRECTION_LEFT:return c.DIRECTION_RIGHT}},getWidthAuthority:function(){return this.collapsed&&this.collapsedHorizontal()?1:this.callParent()},getHeightAuthority:function(){return this.collapsed&&this.collapsedVertical()?1:this.callParent()},collapsedHorizontal:function(){var dir=this.getCollapsed();return"left"===dir||"right"===dir},collapsedVertical:function(){var dir=this.getCollapsed();return"top"===dir||"bottom"===dir},restoreDimension:function(){var dir=this.collapseDirection;return"top"===dir||"bottom"===dir?"height":"width"},getCollapsed:function(){var me=this;return!0===me.collapsed?me.collapseDirection:me.collapsed},getState:function(){var memento,me=this,state=me.callParent();return state=me.addPropertyToState(state,"collapsed"),me.collapsed&&(memento=me.collapseMemento,memento=memento&&memento.data,me.collapsedVertical()?(state&&delete state.height,memento&&(state=me.addPropertyToState(state,"height",memento.height))):(state&&delete state.width,memento&&(state=me.addPropertyToState(state,"width",memento.width)))),state},findReExpander:function(direction){var comp,i,me=this,c=Ext.Component,dockedItems=me.dockedItems.items,dockedItemCount=dockedItems.length;if("mini"!==me.collapseMode)switch(direction){case c.DIRECTION_TOP:case c.DIRECTION_BOTTOM:for(i=0;i<dockedItemCount;i++)if(comp=dockedItems[i],!comp.hidden&&comp.isHeader&&(!comp.dock||"top"===comp.dock||"bottom"===comp.dock))return comp;break;case c.DIRECTION_LEFT:case c.DIRECTION_RIGHT:for(i=0;i<dockedItemCount;i++)if(comp=dockedItems[i],!comp.hidden&&comp.isHeader&&("left"===comp.dock||"right"===comp.dock))return comp;break;default:throw"Panel#findReExpander must be passed a valid collapseDirection"}},getReExpander:function(direction){var me=this,collapseDir=direction||me.collapseDirection,reExpander=me.reExpander||me.findReExpander(collapseDir);return me.expandDirection=me.getOppositeDirection(collapseDir),reExpander||(me.reExpander=reExpander=me.createReExpander(collapseDir,{dock:collapseDir,cls:Ext.baseCSSPrefix+"docked "+me.baseCls+"-"+me.ui+"-collapsed",isCollapsedExpander:!0}),me.dockedItems.insert(0,reExpander)),reExpander},createReExpander:function(direction,defaults){var me=this,isLeft="left"===direction,isRight="right"===direction,isVertical=isLeft||isRight,ownerCt=me.ownerCt,result=Ext.apply({hideMode:"offsets",title:me.title||"&#160;",titleAlign:me.titleAlign,orientation:isVertical?"vertical":"horizontal",textCls:me.headerTextCls,icon:me.icon,iconCls:me.iconCls,glyph:me.glyph,baseCls:me.self.prototype.baseCls+"-header",ui:me.ui,frame:me.frame&&me.frameHeader,ignoreParentFrame:me.frame||me.overlapHeader,ignoreBorderManagement:me.frame||me.ignoreHeaderBorderManagement,indicateDrag:me.draggable,collapseImmune:!0,headerRole:me.headerRole,ownerCt:ownerCt&&"placeholder"===me.collapseMode?ownerCt:me,ownerLayout:me.componentLayout,margin:me.margin},defaults);return"mini"===me.collapseMode&&(isVertical?result.width=1:result.height=1),me.hideCollapseTool||((isLeft||isRight&&me.isPlaceHolderCollapse())&&(result.titlePosition=1),result.tools=[{xtype:"tool",type:"expand-"+me.getOppositeDirection(direction),uiCls:["top"],handler:me.toggleCollapse,scope:me}]),result=new Ext.panel.Header(result),result.addClsWithUI(me.getHeaderCollapsedClasses(result)),result},getHeaderCollapsedClasses:function(header){var collapsedClasses,me=this,collapsedCls=me.collapsedCls;return collapsedClasses=[collapsedCls,collapsedCls+"-"+header.getDockName()],me.border&&(!me.frame||me.frame&&Ext.supports.CSS3BorderRadius)&&collapsedClasses.push(collapsedCls+"-border-"+header.getDockName()),collapsedClasses},beginCollapse:function(){var reExpander,me=this,lastBox=me.lastBox,rendered=me.rendered,collapseMemento=me.collapseMemento||(me.collapseMemento=new Ext.util.Memento(me)),sizeModel=me.getSizeModel(),header=me.header;collapseMemento.capture(["height","minHeight","width","minWidth"]),lastBox&&collapseMemento.capture(me.restoreDimension(),lastBox,"last."),me.collapsedVertical()?(sizeModel.width.shrinkWrap&&(me.width=rendered?me.getWidth():me.width||me.minWidth||100),delete me.height,me.minHeight=0):me.collapsedHorizontal()&&(sizeModel.height.shrinkWrap&&(me.height=rendered?me.getHeight():me.height||me.minHeight||100),delete me.width,me.minWidth=0),me.ownerCt&&me.ownerCt.getLayout().beginCollapse(me),me.isPlaceHolderCollapse()||!1===header||(header===(reExpander=me.getReExpander())?(header.collapseImmune=!0,header.getHierarchyState().collapseImmune=!0,header.addClsWithUI(me.getHeaderCollapsedClasses(header)),header.rendered&&header.updateFrame()):reExpander.el&&(reExpander.el.show(),reExpander.hidden=!1)),me.resizer&&me.resizer.disable()},beginExpand:function(){var reExpander,me=this,lastBox=me.lastBox,collapseMemento=me.collapseMemento,restoreDimension=me.restoreDimension(),header=me.header;collapseMemento&&(collapseMemento.restore(["minHeight","minWidth",restoreDimension]),lastBox&&collapseMemento.restore(restoreDimension,!0,lastBox,"last.")),me.ownerCt&&me.ownerCt.getLayout().beginExpand(me),me.isPlaceHolderCollapse()||!1===header||(header===(reExpander=me.getReExpander())?(delete header.collapseImmune,delete header.getHierarchyState().collapseImmune,header.removeClsWithUI(me.getHeaderCollapsedClasses(header)),header.rendered&&(header.expanding=!0,header.updateFrame(),delete header.expanding)):(reExpander.hidden=!0,reExpander.el.hide())),me.resizer&&me.resizer.enable()},collapse:function(direction,animate){var me=this,collapseDir=direction||me.collapseDirection,ownerCt=me.ownerCt,layout=me.ownerLayout;return me.isCollapsingOrExpanding?me:(arguments.length<2&&(animate=me.animCollapse),me.collapsed||!1===me.fireEvent("beforecollapse",me,direction,animate)?me:layout&&layout.onBeforeComponentCollapse&&!1===layout.onBeforeComponentCollapse(me)?me:ownerCt&&me.isPlaceHolderCollapse()?me.placeholderCollapse(direction,animate):(me.collapsed=collapseDir,me.beginCollapse(),me.getHierarchyState().collapsed=!0,me.fireHierarchyEvent("collapse"),me.doCollapseExpand(1,animate)))},doCollapseExpand:function(flags,animate){var me=this,originalAnimCollapse=me.animCollapse,ownerLayout=me.ownerLayout;return me.animCollapse=animate,me.isCollapsingOrExpanding=flags,animate&&me.addCls(Ext.baseCSSPrefix+"animating-size"),ownerLayout&&!animate?ownerLayout.onContentChange(me):me.updateLayout({isRoot:!0}),me.animCollapse=originalAnimCollapse,me},afterCollapse:function(animated){var me=this,ownerLayout=me.ownerLayout;me.isCollapsingOrExpanding=0,me.updateCollapseTool(),animated&&me.removeCls(Ext.baseCSSPrefix+"animating-size"),ownerLayout&&animated&&ownerLayout.onContentChange(me),me.setHiddenDocked(),me.fireEvent("collapse",me)},setHiddenDocked:function(){var item,reExpander,me=this,toHide=me.hiddenOnCollapse,items=me.getDockedItems(),len=items.length,i=0;for(!1!==me.header&&(reExpander=me.getReExpander()),toHide.add(me.body);i<len;i++)(item=items[i])&&item!==reExpander&&item.el&&toHide.add(item.el);toHide.setStyle("visibility","hidden")},restoreHiddenDocked:function(){var toShow=this.hiddenOnCollapse;toShow.setStyle("visibility",""),toShow.clear()},getPlaceholder:function(direction){var me=this,collapseDir=direction||me.collapseDirection,listeners=null,placeholder=me.placeholder,floatable=me.floatable,titleCollapse=me.titleCollapse;return placeholder||((floatable||me.collapsible&&titleCollapse)&&(listeners={click:{fn:!titleCollapse&&floatable?me.floatCollapsedPanel:me.toggleCollapse,element:"el",scope:me}}),me.placeholder=placeholder=Ext.widget(me.createReExpander(collapseDir,{id:me.id+"-placeholder",listeners:listeners}))),placeholder.placeholderFor||(placeholder.isComponent||(me.placeholder=placeholder=me.lookupComponent(placeholder)),Ext.applyIf(placeholder,{margins:me.margins,placeholderFor:me}),placeholder.addCls([Ext.baseCSSPrefix+"region-collapsed-placeholder",Ext.baseCSSPrefix+"region-collapsed-"+collapseDir+"-placeholder",me.collapsedCls])),placeholder},placeholderCollapse:function(direction,animate){var slideInDirection,me=this,ownerCt=me.ownerCt,collapseDir=direction||me.collapseDirection,floatCls=Ext.baseCSSPrefix+"border-region-slide-in",placeholder=me.getPlaceholder(collapseDir);return me.isCollapsingOrExpanding=1,me.setHiddenState(!0),me.collapsed=collapseDir,placeholder.rendered?(placeholder.el.dom.parentNode!==me.el.dom.parentNode&&me.el.dom.parentNode.insertBefore(placeholder.el.dom,me.el.dom),placeholder.hidden=!1,placeholder.el.show(),ownerCt.updateLayout()):ownerCt.insert(ownerCt.items.indexOf(me),placeholder),me.rendered?(me.el.setVisibilityMode(me.placeholderCollapseHideMode),animate?(me.el.addCls(floatCls),placeholder.el.hide(),slideInDirection=me.convertCollapseDir(collapseDir),me.el.slideOut(slideInDirection,{preserveScroll:!0,duration:Ext.Number.from(animate,Ext.fx.Anim.prototype.duration),listeners:{afteranimate:function(){me.el.removeCls(floatCls),placeholder.el.show().setStyle("display","none").slideIn(slideInDirection,{easing:"linear",duration:100,listeners:{afteranimate:function(){placeholder.focus(),me.isCollapsingOrExpanding=0,me.fireEvent("collapse",me)}}})}}})):(me.el.hide(),me.isCollapsingOrExpanding=0,me.fireEvent("collapse",me))):(me.isCollapsingOrExpanding=0,me.preventCollapseFire||me.fireEvent("collapse",me)),me},floatCollapsedPanel:function(){var myBox,slideDirection,me=this,placeholder=me.placeholder,ps=placeholder.getSize(),floatCls=Ext.baseCSSPrefix+"border-region-slide-in",collapsed=me.collapsed,layoutOwner=me.ownerCt||me;if(!me.isSliding){if(me.el.hasCls(floatCls))return void me.slideOutFloatedPanel();switch(me.isSliding=!0,placeholder.el.hide(),placeholder.hidden=!0,me.el.show(),me.setHiddenState(!1),me.collapsed=!1,layoutOwner.updateLayout(),myBox=me.getBox(!1,!0),placeholder.el.show(),placeholder.hidden=!1,me.el.hide(),me.setHiddenState(!0),me.collapsed=collapsed,layoutOwner.updateLayout(),me.slideOutTask=me.slideOutTask||new Ext.util.DelayedTask(me.slideOutFloatedPanel,me),placeholder.el.on("mouseleave",me.onMouseLeaveFloated,me),me.el.on("mouseleave",me.onMouseLeaveFloated,me),placeholder.el.on("mouseenter",me.onMouseEnterFloated,me),me.el.on("mouseenter",me.onMouseEnterFloated,me),me.el.addCls(floatCls),me.floated=!0,me.collapseTool&&me.collapseTool.el.hide(),me.collapsed){case"top":me.setLocalXY(myBox.x,myBox.y+ps.height-1);break;case"right":me.setLocalXY(myBox.x-ps.width+1,myBox.y);break;case"bottom":me.setLocalXY(myBox.x,myBox.y-ps.height+1);break;case"left":me.setLocalXY(myBox.x+ps.width-1,myBox.y)}slideDirection=me.convertCollapseDir(me.collapsed),me.floatedFromCollapse=me.collapsed,me.collapsed=!1,me.setHiddenState(!1),me.el.slideIn(slideDirection,{preserveScroll:!0,duration:Ext.Number.from(me.animCollapse,Ext.fx.Anim.prototype.duration),listeners:{afteranimate:function(){me.isSliding=!1,me.fireEvent("float",me)}}})}},onMouseLeaveFloated:function(e){this.slideOutTask.delay(500)},onMouseEnterFloated:function(e){this.slideOutTask.cancel()},isLayoutRoot:function(){return!!this.floatedFromCollapse||this.callParent()},slideOutFloatedPanel:function(preventAnimate){var collapseDirection,me=this,compEl=me.el;me.isSliding||me.isDestroyed||(me.isSliding=!0,me.floated=!1,me.slideOutFloatedPanelBegin(),"string"==typeof me.collapsed&&(collapseDirection=me.convertCollapseDir(me.collapsed)),compEl.slideOut(collapseDirection,{preserveScroll:!0,duration:Ext.Number.from(me.animCollapse,Ext.fx.Anim.prototype.duration),autoEnd:!0===preventAnimate,listeners:{afteranimate:function(){me.slideOutFloatedPanelEnd(),me.el.removeCls(Ext.baseCSSPrefix+"border-region-slide-in")}}}))},slideOutFloatedPanelBegin:function(){var me=this,placeholderEl=me.placeholder.el,el=me.el;me.collapsed=me.floatedFromCollapse,me.setHiddenState(!0),me.floatedFromCollapse=null,placeholderEl.un("mouseleave",me.onMouseLeaveFloated,me),el.un("mouseleave",me.onMouseLeaveFloated,me),placeholderEl.un("mouseenter",me.onMouseEnterFloated,me),el.un("mouseenter",me.onMouseEnterFloated,me)},slideOutFloatedPanelEnd:function(suppressEvents){var me=this;me.collapseTool&&me.collapseTool.el.show(),me.slideOutTask.cancel(),me.isSliding=!1,suppressEvents||me.fireEvent("unfloat",me)},expand:function(animate){var me=this,layout=me.ownerLayout;return me.isCollapsingOrExpanding?me:(arguments.length||(animate=me.animCollapse),me.collapsed||me.floatedFromCollapse?!1===me.fireEvent("beforeexpand",me,animate)?me:layout&&layout.onBeforeComponentExpand&&!1===layout.onBeforeComponentExpand(me)?me:(delete me.getHierarchyState().collapsed,me.isPlaceHolderCollapse()?me.placeholderExpand(animate):(me.restoreHiddenDocked(),me.beginExpand(),me.collapsed=!1,me.doCollapseExpand(2,animate))):me)},placeholderExpand:function(animate){var finalPos,floatedPos,me=this,collapseDir=me.collapsed,floatCls=Ext.baseCSSPrefix+"border-region-slide-in",center=me.ownerLayout?me.ownerLayout.centerRegion:null;return Ext.AbstractComponent.layoutSuspendCount&&(animate=!1),me.floatedFromCollapse&&(floatedPos=me.getPosition(!0),me.slideOutFloatedPanelBegin(),me.slideOutFloatedPanelEnd(),me.floated=!1),animate?(Ext.suspendLayouts(),me.placeholder.hide(),me.el.show(),me.collapsed=!1,me.setHiddenState(!1),center&&!floatedPos&&(center.hidden=!0),Ext.resumeLayouts(!0),center.hidden=!1,me.el.addCls(floatCls),me.isCollapsingOrExpanding=2,floatedPos?(finalPos=me.getXY(),me.setLocalXY(floatedPos[0],floatedPos[1]),me.setXY([finalPos[0],finalPos[1]],{duration:Ext.Number.from(animate,Ext.fx.Anim.prototype.duration),listeners:{afteranimate:function(){me.el.removeCls(floatCls),me.isCollapsingOrExpanding=0,me.fireEvent("expand",me)}}})):(me.el.hide(),me.placeholder.el.show(),me.placeholder.hidden=!1,me.setHiddenState(!1),me.el.slideIn(me.convertCollapseDir(collapseDir),{preserveScroll:!0,duration:Ext.Number.from(animate,Ext.fx.Anim.prototype.duration),listeners:{afteranimate:function(){me.el.removeCls(floatCls),me.placeholder.hide(),me.updateLayout(),me.isCollapsingOrExpanding=0,me.fireEvent("expand",me)}}}))):(me.floated=me.collapsed=!1,me.el.removeCls(floatCls),Ext.suspendLayouts(),me.placeholder.hide(),me.show(),Ext.resumeLayouts(!0),me.fireEvent("expand",me)),me},afterExpand:function(animated){var me=this,ownerLayout=me.ownerLayout;me.isCollapsingOrExpanding=0,me.updateCollapseTool(),animated&&me.removeCls(Ext.baseCSSPrefix+"animating-size"),ownerLayout&&animated&&ownerLayout.onContentChange(me),me.fireEvent("expand",me),me.fireHierarchyEvent("expand")},setBorder:function(border,targetEl){if(!targetEl){var me=this,header=me.header;border=border?!0===border?"1px":me.unitizeBox(border):0,header&&(header.isHeader?header.setBorder(border):header.border=border),me.rendered&&!1!==me.bodyBorder&&me.body.setStyle("border-width",border),me.updateLayout(),me.border=border}},toggleCollapse:function(){return this.collapsed||this.floatedFromCollapse?this.expand():this.collapse()},getKeyMap:function(){return this.keyMap||(this.keyMap=new Ext.util.KeyMap(Ext.apply({target:this.el},this.keys)))},initDraggable:function(){var me=this;me.simpleDrag?me.initSimpleDraggable():me.dd=new Ext.panel.DD(me,Ext.isBoolean(me.draggable)?null:me.draggable)},initSimpleDraggable:function(){var ddConfig,dd,me=this;me.header||me.updateHeader(!0),me.header&&(ddConfig=Ext.applyIf({el:me.el,delegate:"#"+Ext.escapeId(me.header.id)},me.draggable),(me.constrain||me.constrainHeader)&&(ddConfig.constrain=me.constrain,ddConfig.constrainDelegate=me.constrainHeader,ddConfig.constrainTo=me.constrainTo||me.container),dd=me.dd=new Ext.util.ComponentDragger(me,ddConfig),me.relayEvents(dd,["dragstart","drag","dragend"]),me.maximized&&dd.disable())},ghostTools:function(){var t,tLen,tool,tools=[],header=this.header,headerTools=header?header.query("tool[hidden=false]"):[];if(headerTools.length)for(t=0,tLen=headerTools.length;t<tLen;t++)tool=headerTools[t],tools.push({type:tool.type});else tools=[{type:"placeholder"}];return tools},ghost:function(cls){var ghostHeader,tools,i,me=this,ghostPanel=me.ghostPanel,box=me.getBox(),header=me.header;if(ghostPanel?ghostPanel.el.show():me.ghostPanel=ghostPanel=Ext.widget(me.createGhost(cls)),ghostPanel.setHiddenState(!1),ghostPanel.floatParent=me.floatParent,ghostPanel.toFront(),header&&!me.preventHeader){for(ghostHeader=ghostPanel.header,ghostHeader.suspendLayouts(),tools=ghostHeader.query("tool"),i=tools.length;i--;)ghostHeader.remove(tools[i]);ghostPanel.addTool(me.ghostTools()),ghostPanel.setTitle(me.title),ghostHeader.setTitlePosition(header.titlePosition),me.iconCls?ghostPanel.setIconCls(me.iconCls):me.icon?ghostPanel.setIcon(me.icon):me.glyph&&ghostPanel.setGlyph(me.glyph),ghostHeader.addCls(Ext.baseCSSPrefix+"header-ghost"),ghostHeader.resumeLayouts()}return ghostPanel.setPagePosition(box.x,box.y),ghostPanel.setSize(box.width,box.height),me.el.hide(),ghostPanel},createGhost:function(cls){var me=this,header=me.header,frame=me.frame&&!me.alwaysFramed;return{xtype:"panel",hidden:!1,header:header?{titleAlign:header.titleAlign}:null,ui:frame?me.ui.replace(/-framed$/,""):me.ui,id:me.id+"-ghost",renderTo:Ext.getBody(),resizable:!1,floating:{shadow:!1},frame:frame,alwaysFramed:me.alwaysFramed,overlapHeader:me.overlapHeader,headerPosition:me.headerPosition,baseCls:me.baseCls,cls:me.baseCls+"-ghost "+(cls||"")}},unghost:function(show,matchPosition){var me=this,ghostPanel=me.ghostPanel;ghostPanel&&(!1!==show&&(me.el.show(),!1!==matchPosition&&(me.setPagePosition(ghostPanel.getXY()),"offsets"==me.hideMode&&delete me.el.hideModeStyles),Ext.defer(me.focus,10,me)),ghostPanel.el.hide(),ghostPanel.setHiddenState(!0))},beginDrag:function(){this.floatingDescendants&&this.floatingDescendants.hide()},endDrag:function(){this.floatingDescendants&&this.floatingDescendants.show()},initResizable:function(){this.callParent(arguments),this.collapsed&&this.resizer.disable()},convertCollapseDir:function(collapseDir){return collapseDir.substr(0,1)}},function(){this.prototype.animCollapse=Ext.enableFx});Ext.define("Ext.tip.Tip",{extend:"Ext.panel.Panel",alternateClassName:"Ext.Tip",minWidth:40,maxWidth:500,shadow:"sides",defaultAlign:"tl-bl?",constrainPosition:!0,autoRender:!0,hidden:!0,baseCls:Ext.baseCSSPrefix+"tip",floating:{shadow:!0,shim:!0},focusOnToFront:!1,closeAction:"hide",alwaysFramed:!0,frameHeader:!1,initComponent:function(){var me=this;me.floating=Ext.apply({},{shadow:me.shadow,constrain:me.constrainPosition},me.self.prototype.floating),me.callParent(arguments),me.constrain=me.constrain||me.constrainPosition},showAt:function(xy){var me=this;this.callParent(arguments),me.isVisible()&&(me.setPagePosition(xy[0],xy[1]),(me.constrainPosition||me.constrain)&&me.doConstrain(),me.toFront(!0))},initDraggable:function(){var me=this;me.draggable={el:me.getDragEl(),delegate:me.header.el,constrain:me,constrainTo:me.el.dom.parentNode},Ext.Component.prototype.initDraggable.call(me)},ghost:void 0,unghost:void 0});Ext.define("Ext.tip.ToolTip",{extend:"Ext.tip.Tip",alias:"widget.tooltip",alternateClassName:"Ext.ToolTip",autoHide:!0,showDelay:500,hideDelay:200,dismissDelay:5e3,trackMouse:!1,anchorToTarget:!0,anchorOffset:0,targetCounter:0,quickShowInterval:250,ariaRole:"tooltip",initComponent:function(){var me=this;me.callParent(arguments),me.lastActive=new Date,me.setTarget(me.target),me.origAnchor=me.anchor},onRender:function(ct,position){var me=this;me.callParent(arguments),me.anchorCls=Ext.baseCSSPrefix+"tip-anchor-"+me.getAnchorPosition(),me.sticky&&me.el.dom.setAttribute("data-sticky",!0),me.anchorEl=me.el.createChild({role:"presentation",cls:Ext.baseCSSPrefix+"tip-anchor "+me.anchorCls})},setTarget:function(target){var tg,me=this,t=Ext.get(target);me.target&&(tg=Ext.get(me.target),me.mun(tg,"mouseover",me.onTargetOver,me),me.mun(tg,"mouseout",me.onTargetOut,me),me.mun(tg,"mousemove",me.onMouseMove,me)),me.target=t,t&&me.mon(t,{freezeEvent:!0,mouseover:me.onTargetOver,mouseout:me.onTargetOut,mousemove:me.onMouseMove,scope:me}),me.anchor&&(me.anchorTarget=me.target)},onMouseMove:function(e){var xy,me=this,t=me.delegate?e.getTarget(me.delegate):me.triggerElement=!0;t?(me.targetXY=e.getXY(),t===me.triggerElement?!me.hidden&&me.trackMouse&&(xy=me.getTargetXY(),me.constrainPosition&&(xy=me.el.adjustForConstraints(xy,me.el.parent())),me.setPagePosition(xy)):(me.hide(),me.lastActive=new Date(0),me.onTargetOver(e))):!me.closable&&me.isVisible()&&!1!==me.autoHide&&me.hide()},getTargetXY:function(){var mouseOffset,offsets,xy,dw,dh,de,bd,scrollX,scrollY,axy,sz,constrainPosition,me=this;if(me.delegate&&(me.anchorTarget=me.triggerElement),me.anchor){if(me.targetCounter++,offsets=me.getOffsets(),xy=me.anchorToTarget&&!me.trackMouse?me.getAlignToXY(me.anchorTarget,me.getAnchorAlign()):me.targetXY,dw=Ext.Element.getViewWidth()-5,dh=Ext.Element.getViewHeight()-5,de=document.documentElement,bd=document.body,scrollX=(de.scrollLeft||bd.scrollLeft||0)+5,scrollY=(de.scrollTop||bd.scrollTop||0)+5,axy=[xy[0]+offsets[0],xy[1]+offsets[1]],sz=me.getSize(),constrainPosition=me.constrainPosition,me.anchorEl.removeCls(me.anchorCls),me.targetCounter<2&&constrainPosition){if(axy[0]<scrollX)return me.anchorToTarget&&(me.defaultAlign="l-r",me.mouseOffset&&(me.mouseOffset[0]*=-1)),me.anchor="left",me.getTargetXY();if(axy[0]+sz.width>dw)return me.anchorToTarget&&(me.defaultAlign="r-l",me.mouseOffset&&(me.mouseOffset[0]*=-1)),me.anchor="right",me.getTargetXY();if(axy[1]<scrollY)return me.anchorToTarget&&(me.defaultAlign="t-b",me.mouseOffset&&(me.mouseOffset[1]*=-1)),me.anchor="top",me.getTargetXY();if(axy[1]+sz.height>dh)return me.anchorToTarget&&(me.defaultAlign="b-t",me.mouseOffset&&(me.mouseOffset[1]*=-1)),me.anchor="bottom",me.getTargetXY()}return me.anchorCls=Ext.baseCSSPrefix+"tip-anchor-"+me.getAnchorPosition(),me.anchorEl.addCls(me.anchorCls),me.targetCounter=0,axy}return mouseOffset=me.getMouseOffset(),me.targetXY?[me.targetXY[0]+mouseOffset[0],me.targetXY[1]+mouseOffset[1]]:mouseOffset},getMouseOffset:function(){var me=this,offset=me.anchor?[0,0]:[15,18];return me.mouseOffset&&(offset[0]+=me.mouseOffset[0],offset[1]+=me.mouseOffset[1]),offset},getAnchorPosition:function(){var m,me=this;switch(me.anchor?me.tipAnchor=me.anchor.charAt(0):(m=me.defaultAlign.match(/^([a-z]+)-([a-z]+)(\?)?$/),m||Ext.Error.raise('The AnchorTip.defaultAlign value "'+me.defaultAlign+'" is invalid.'),me.tipAnchor=m[1].charAt(0)),me.tipAnchor){case"t":return"top";case"b":return"bottom";case"r":return"right"}return"left"},getAnchorAlign:function(){switch(this.anchor){case"top":return"tl-bl";case"left":return"tl-tr";case"right":return"tr-tl";default:return"bl-tl"}},getOffsets:function(){var mouseOffset,offsets,me=this,ap=me.getAnchorPosition().charAt(0);if(me.anchorToTarget&&!me.trackMouse)switch(ap){case"t":offsets=[0,9];break;case"b":offsets=[0,-13];break;case"r":offsets=[-13,0];break;default:offsets=[9,0]}else switch(ap){case"t":offsets=[-15-me.anchorOffset,30];break;case"b":offsets=[-19-me.anchorOffset,-13-me.el.dom.offsetHeight];break;case"r":offsets=[-15-me.el.dom.offsetWidth,-13-me.anchorOffset];break;default:offsets=[25,-13-me.anchorOffset]}return mouseOffset=me.getMouseOffset(),offsets[0]+=mouseOffset[0],offsets[1]+=mouseOffset[1],offsets},onTargetOver:function(e){var t,me=this,delegate=me.delegate;me.disabled||e.within(me.target.dom,!0)||(t=!delegate||e.getTarget(delegate))&&(me.triggerElement=t,me.triggerEvent=e,me.clearTimer("hide"),me.targetXY=e.getXY(),me.delayShow())},delayShow:function(){var me=this;me.hidden&&!me.showTimer?Ext.Date.getElapsed(me.lastActive)<me.quickShowInterval?me.show():me.showTimer=Ext.defer(me.showFromDelay,me.showDelay,me):me.hidden||!1===me.autoHide||me.show()},showFromDelay:function(){this.fromDelayShow=!0,this.show(),delete this.fromDelayShow},onShowVeto:function(){this.callParent(),delete this.triggerElement,this.clearTimer("show")},onTargetOut:function(e){var me=this,triggerEl=me.triggerElement,target=!0===triggerEl?me.target:triggerEl;me.disabled||!triggerEl||e.within(target,!0)||(me.showTimer&&(me.clearTimer("show"),me.triggerElement=null),!1!==me.autoHide&&me.delayHide())},delayHide:function(){var me=this;me.hidden||me.hideTimer||(me.hideTimer=Ext.defer(me.hide,me.hideDelay,me))},hide:function(){var me=this;me.clearTimer("dismiss"),me.lastActive=new Date,me.anchorEl&&me.anchorEl.hide(),me.callParent(arguments),delete me.triggerElement},show:function(){var me=this;this.callParent(),!1===this.hidden&&(me.setPagePosition(-1e4,-1e4),me.anchor&&(me.anchor=me.origAnchor),me.calledFromShowAt||me.showAt(me.getTargetXY()),me.anchor?(me.syncAnchor(),me.anchorEl.show()):me.anchorEl.hide())},showAt:function(xy){var me=this;me.lastActive=new Date,me.clearTimers(),me.calledFromShowAt=!0,me.isVisible()||this.callParent(arguments),me.isVisible()&&(me.setPagePosition(xy[0],xy[1]),(me.constrainPosition||me.constrain)&&me.doConstrain(),me.toFront(!0),me.el.sync(!0),me.dismissDelay&&!1!==me.autoHide&&(me.dismissTimer=Ext.defer(me.hide,me.dismissDelay,me)),me.anchor?(me.syncAnchor(),me.anchorEl.isVisible()||me.anchorEl.show()):me.anchorEl.hide()),delete me.calledFromShowAt},syncAnchor:function(){var anchorPos,targetPos,offset,me=this;switch(me.tipAnchor.charAt(0)){case"t":anchorPos="b",targetPos="tl",offset=[20+me.anchorOffset,1];break;case"r":anchorPos="l",targetPos="tr",offset=[-1,12+me.anchorOffset];break;case"b":anchorPos="t",targetPos="bl",offset=[20+me.anchorOffset,-1];break;default:anchorPos="r",targetPos="tl",offset=[1,12+me.anchorOffset]}me.anchorEl.alignTo(me.el,anchorPos+"-"+targetPos,offset),me.anchorEl.setStyle("z-index",parseInt(me.el.getZIndex(),10)||1).setVisibilityMode(Ext.Element.DISPLAY)},setPagePosition:function(x,y){var me=this;me.callParent(arguments),me.anchor&&me.syncAnchor()},_timerNames:{},clearTimer:function(name){var me=this,names=me._timerNames,propName=names[name]||(names[name]=name+"Timer"),timer=me[propName];timer&&(clearTimeout(timer),me[propName]=null)},clearTimers:function(){var me=this;me.clearTimer("show"),me.clearTimer("dismiss"),me.clearTimer("hide")},onShow:function(){var me=this;me.callParent(),me.mon(Ext.getDoc(),"mousedown",me.onDocMouseDown,me)},onHide:function(){var me=this;me.callParent(),me.mun(Ext.getDoc(),"mousedown",me.onDocMouseDown,me)},onDocMouseDown:function(e){var me=this;me.closable||e.within(me.el.dom)||(me.disable(),Ext.defer(me.doEnable,100,me))},doEnable:function(){this.isDestroyed||this.enable()},onDisable:function(){this.callParent(),this.clearTimers(),this.hide()},beforeDestroy:function(){var me=this;me.clearTimers(),Ext.destroy(me.anchorEl),delete me.anchorEl,delete me.target,delete me.anchorTarget,delete me.triggerElement,me.callParent()},onDestroy:function(){Ext.getDoc().un("mousedown",this.onDocMouseDown,this),this.callParent()}});Ext.define("Ext.tip.QuickTip",{extend:"Ext.tip.ToolTip",alias:"widget.quicktip",alternateClassName:"Ext.QuickTip",interceptTitles:!1,title:"&#160;",tagConfig:{namespace:"data-",attribute:"qtip",width:"qwidth",target:"target",title:"qtitle",hide:"hide",cls:"qclass",align:"qalign",anchor:"anchor",showDelay:"qshowDelay"},shrinkWrapDock:!0,initComponent:function(){var me=this;me.target=me.target||Ext.getDoc(),me.targets=me.targets||{},me.callParent()},register:function(config){for(var target,j,targetLen,configs=Ext.isArray(config)?config:arguments,i=0,len=configs.length;i<len;i++)if(config=configs[i],target=config.target)if(Ext.isArray(target))for(j=0,targetLen=target.length;j<targetLen;j++)this.targets[Ext.id(target[j])]=config;else this.targets[Ext.id(target)]=config},unregister:function(el){delete this.targets[Ext.id(el)]},cancelShow:function(el){var me=this,activeTarget=me.activeTarget;el=Ext.get(el).dom,me.isVisible()?activeTarget&&activeTarget.el==el&&me.hide():activeTarget&&activeTarget.el==el&&me.clearTimer("show")},getTipCfg:function(e){var cfg,t=e.getTarget(),titleText=t.title;return this.interceptTitles&&titleText&&Ext.isString(titleText)?(t.qtip=titleText,t.removeAttribute("title"),e.preventDefault(),{text:titleText}):(cfg=this.tagConfig,(t=e.getTarget("["+cfg.namespace+cfg.attribute+"]"))?{target:t,text:t.getAttribute(cfg.namespace+cfg.attribute)}:void 0)},onTargetOver:function(e){var hasShowDelay,delay,elTarget,cfg,ns,tipConfig,autoHide,targets,targetEl,value,key,me=this,target=e.getTarget(me.delegate);if(!me.disabled&&(me.targetXY=e.getXY(),target&&1===target.nodeType&&target!=document.documentElement&&target!=document.body)){if(me.activeTarget&&(target==me.activeTarget.el||Ext.fly(me.activeTarget.el).contains(target)))return void(me.targetTextEmpty()?(me.onShowVeto(),delete me.activeTarget):(me.clearTimer("hide"),me.show()));if(target){targets=me.targets;for(key in targets)if(targets.hasOwnProperty(key)&&(value=targets[key],(targetEl=Ext.fly(value.target))&&(targetEl.dom===target||targetEl.contains(target)))){elTarget=targetEl.dom;break}if(elTarget)return me.activeTarget=me.targets[elTarget.id],me.activeTarget.el=target,me.anchor=me.activeTarget.anchor,me.anchor&&(me.anchorTarget=target),hasShowDelay=parseInt(me.activeTarget.showDelay,10),hasShowDelay&&(delay=me.showDelay,me.showDelay=hasShowDelay),me.delayShow(),void(hasShowDelay&&(me.showDelay=delay))}elTarget=Ext.fly(target,"_quicktip-target"),cfg=me.tagConfig,ns=cfg.namespace,tipConfig=me.getTipCfg(e),tipConfig&&(tipConfig.target&&(target=tipConfig.target,elTarget=Ext.fly(target,"_quicktip-target")),autoHide=elTarget.getAttribute(ns+cfg.hide),me.activeTarget={el:target,text:tipConfig.text,width:+elTarget.getAttribute(ns+cfg.width)||null,autoHide:"user"!=autoHide&&"false"!==autoHide,title:elTarget.getAttribute(ns+cfg.title),cls:elTarget.getAttribute(ns+cfg.cls),align:elTarget.getAttribute(ns+cfg.align),showDelay:parseInt(elTarget.getAttribute(ns+cfg.showDelay),10)},me.anchor=elTarget.getAttribute(ns+cfg.anchor),me.anchor&&(me.anchorTarget=target),hasShowDelay=parseInt(me.activeTarget.showDelay,10),hasShowDelay&&(delay=me.showDelay,me.showDelay=hasShowDelay),me.delayShow(),hasShowDelay&&(me.showDelay=delay))}},onTargetOut:function(e){var hasHideDelay,delay,me=this,active=me.activeTarget;active&&e.within(me.activeTarget.el)&&!me.getTipCfg(e)||(me.clearTimer("show"),delete me.activeTarget,!1!==me.autoHide&&(hasHideDelay=active&&parseInt(active.hideDelay,10),hasHideDelay&&(delay=me.hideDelay,me.hideDelay=hasHideDelay),me.delayHide(),hasHideDelay&&(me.hideDelay=delay)))},targetTextEmpty:function(){var el,me=this,target=me.activeTarget,cfg=me.tagConfig;return!(!target||!(el=target.el)||el.getAttribute(cfg.namespace+cfg.attribute)||me.targets[Ext.id(target.target)])},show:function(){var me=this;if(me.fromDelayShow&&me.targetTextEmpty())return me.onShowVeto(),void delete me.activeTarget;me.callParent(arguments)},showAt:function(xy){var dismiss,cls,me=this,target=me.activeTarget,header=me.header;target&&(me.rendered||(me.render(Ext.getBody()),me.activeTarget=target),me.suspendLayouts(),target.title?(me.setTitle(target.title),header.show()):header&&header.hide(),me.update(target.text),me.autoHide=target.autoHide,dismiss=target.dismissDelay,me.dismissDelay=Ext.isNumber(dismiss)?dismiss:me.dismissDelay,target.mouseOffset&&(xy[0]+=target.mouseOffset[0],xy[1]+=target.mouseOffset[1]),cls=me.lastCls,cls&&(me.removeCls(cls),delete me.lastCls),cls=target.cls,cls&&(me.addCls(cls),me.lastCls=cls),me.setWidth(target.width),me.anchor?me.constrainPosition=!1:target.align?(xy=me.getAlignToXY(target.el,target.align),me.constrainPosition=!1):me.constrainPosition=!0,me.resumeLayouts(!0)),me.callParent([xy])},hide:function(){delete this.activeTarget,this.callParent()}});Ext.define("Ext.tip.QuickTipManager",{requires:["Ext.tip.QuickTip"],singleton:!0,alternateClassName:"Ext.QuickTips",disabled:!1,init:function(autoRender,config){var me=this;if(!me.tip){if(!Ext.isReady)return Ext.onReady(function(){Ext.tip.QuickTipManager.init(autoRender,config)}),!1;var tipConfig=Ext.apply({sticky:!0,disabled:me.disabled,id:"ext-quicktips-tip"},config),className=tipConfig.className,xtype=tipConfig.xtype;className?delete tipConfig.className:xtype&&(className="widget."+xtype,delete tipConfig.xtype),!1!==autoRender&&(tipConfig.renderTo=document.body,"BODY"!=tipConfig.renderTo.tagName.toUpperCase()&&Ext.Error.raise({sourceClass:"Ext.tip.QuickTipManager",sourceMethod:"init",msg:"Cannot init QuickTipManager: no document body"})),me.tip=Ext.create(className||"Ext.tip.QuickTip",tipConfig),Ext.quickTipsActive=!0}},destroy:function(){Ext.destroy(this.tip),this.tip=void 0},ddDisable:function(){var me=this,tip=me.tip;tip&&!me.disabled&&tip.disable()},ddEnable:function(){var me=this,tip=me.tip;tip&&!me.disabled&&tip.enable()},enable:function(){var me=this,tip=me.tip;tip&&tip.enable(),me.disabled=!1},disable:function(){var me=this,tip=me.tip;tip&&tip.disable(),me.disabled=!0},isEnabled:function(){var tip=this.tip;return void 0!==tip&&!tip.disabled},getQuickTip:function(){return this.tip},register:function(){var tip=this.tip;tip.register.apply(tip,arguments)},unregister:function(){var tip=this.tip;tip.unregister.apply(tip,arguments)},tips:function(){var tip=this.tip;tip.register.apply(tip,arguments)}});Ext.define("Ext.app.Application",{extend:"Ext.app.Controller",requires:["Ext.tip.QuickTipManager"],scope:void 0,enableQuickTips:!0,appFolder:"app",appProperty:"app",namespaces:[],autoCreateViewport:!1,paths:null,onClassExtended:function(cls,data,hooks){var onBeforeClassCreated,paths,namespace,ns,appFolder,Controller=Ext.app.Controller,proto=cls.prototype,requires=[];if(namespace=data.name||cls.superclass.name,appFolder=data.appFolder||cls.superclass.appFolder,namespace&&(data.$namespace=namespace,Ext.app.addNamespaces(namespace)),data.namespaces&&Ext.app.addNamespaces(data.namespaces),data["paths processed"])delete data["paths processed"];else if(namespace&&appFolder&&Ext.Loader.setPath(namespace,appFolder),paths=data.paths)for(ns in paths)paths.hasOwnProperty(ns)&&Ext.Loader.setPath(ns,paths[ns]);data.autoCreateViewport&&(namespace||Ext.Error.raise("[Ext.app.Application] Can't resolve namespace for "+data.$className+", did you forget to specify 'name' property?"),Controller.processDependencies(proto,requires,namespace,"view",["Viewport"])),requires.length&&(onBeforeClassCreated=hooks.onBeforeCreated,hooks.onBeforeCreated=function(cls,data){var args=Ext.Array.clone(arguments);Ext.require(requires,function(){return onBeforeClassCreated.apply(this,args)})})},constructor:function(config){var me=this;Ext.isEmpty(me.name)&&Ext.Error.raise("[Ext.app.Application] Name property is required"),me.callParent(arguments),me.doInit(me),me.initNamespace(),me.initControllers(),me.onBeforeLaunch(),me.finishInitControllers()},initNamespace:function(){var ns,me=this,appProperty=me.appProperty;(ns=Ext.namespace(me.name))&&(ns.getApplication=function(){return me},appProperty&&(ns[appProperty]?ns[appProperty]!==me&&Ext.log.warn("An existing reference is being overwritten for "+name+"."+appProperty+". See the appProperty config."):ns[appProperty]=me))},initControllers:function(){var me=this,controllers=Ext.Array.from(me.controllers);me.controllers=new Ext.util.MixedCollection;for(var i=0,ln=controllers.length;i<ln;i++)me.getController(controllers[i])},finishInitControllers:function(){var controllers,i,l,me=this;for(controllers=me.controllers.getRange(),i=0,l=controllers.length;i<l;i++)controllers[i].finishInit(me)},launch:Ext.emptyFn,onBeforeLaunch:function(){var controllers,c,cLen,controller,me=this;for(me.enableQuickTips&&me.initQuickTips(),me.autoCreateViewport&&me.initViewport(),me.launch.call(me.scope||me),me.launched=!0,me.fireEvent("launch",me),controllers=me.controllers.items,cLen=controllers.length,c=0;c<cLen;c++)controller=controllers[c],controller.onLaunch(me)},getModuleClassName:function(name,kind){return Ext.app.Controller.getFullName(name,kind,this.name).absoluteName},initQuickTips:function(){Ext.tip.QuickTipManager.init()},initViewport:function(){var viewport=this.getView("Viewport");viewport&&viewport.create()},getController:function(name){var className,controller,me=this,controllers=me.controllers;return controller=controllers.get(name),controller||(className=me.getModuleClassName(name,"controller"),controller=Ext.create(className,{application:me,id:name}),controllers.add(controller),me._initialized&&controller.doInit(me)),controller},getApplication:function(){return this}});Ext.define("Ext.app.domain.Controller",{extend:"Ext.app.EventDomain",singleton:!0,requires:["Ext.app.Controller"],type:"controller",idProperty:"id",constructor:function(){var me=this;me.callParent(),me.monitor(Ext.app.Controller)}});Ext.define("Ext.direct.Provider",{alias:"direct.provider",mixins:{observable:"Ext.util.Observable"},isProvider:!0,constructor:function(config){var me=this;Ext.apply(me,config),Ext.applyIf(me,{id:Ext.id(null,"provider-")}),me.addEvents("connect","disconnect","data","exception"),me.mixins.observable.constructor.call(me,config)},isConnected:function(){return!1},connect:Ext.emptyFn,disconnect:Ext.emptyFn});Ext.define("Ext.app.domain.Direct",{extend:"Ext.app.EventDomain",singleton:!0,requires:["Ext.direct.Provider"],type:"direct",idProperty:"id",constructor:function(){var me=this;me.callParent(),me.monitor(Ext.direct.Provider)}});Ext.define("Ext.button.Split",{alias:"widget.splitbutton",extend:"Ext.button.Button",alternateClassName:"Ext.SplitButton",arrowCls:"split",split:!0,initComponent:function(){this.callParent(),this.addEvents("arrowclick")},setArrowHandler:function(handler,scope){this.arrowHandler=handler,this.scope=scope},onClick:function(e){var me=this;me.doPreventDefault(e),me.disabled||(me.overMenuTrigger?(e.preventDefault(),me.maybeShowMenu(),me.fireEvent("arrowclick",me,e),me.arrowHandler&&me.arrowHandler.call(me.scope||me,me,e)):(me.doToggle(),me.fireHandler(e)))}});Ext.define("Ext.chart.Callout",{constructor:function(config){config.callouts&&(config.callouts.styles=Ext.applyIf(config.callouts.styles||{},{color:"#000",font:"11px Helvetica, sans-serif"}),this.callouts=Ext.apply(this.callouts||{},config.callouts),this.calloutsArray=[])},renderCallouts:function(){if(this.callouts){var i,count,j,p,item,label,storeItem,display,me=this,items=me.items,animate=me.chart.animate,config=me.callouts,styles=config.styles,group=me.calloutsArray,store=me.chart.getChartStore(),len=store.getCount(),ratio=items.length/len,previouslyPlacedCallouts=[];for(i=0,count=0;i<len;i++)for(j=0;j<ratio;j++)if(item=items[count],label=group[count],storeItem=store.getAt(i),(display=!config.filter||config.filter(storeItem))||label){label||(group[count]=label=me.onCreateCallout(storeItem,item,i,display,j,count));for(p in label)label[p]&&label[p].setAttributes&&label[p].setAttributes(styles,!0);if(!display)for(p in label)label[p]&&(label[p].setAttributes?label[p].setAttributes({hidden:!0},!0):label[p].setVisible&&label[p].setVisible(!1));config&&config.renderer&&config.renderer(label,storeItem),me.onPlaceCallout(label,storeItem,item,i,display,animate,j,count,previouslyPlacedCallouts),previouslyPlacedCallouts.push(label),count++}else count++;this.hideCallouts(count)}},onCreateCallout:function(storeItem,item,i,display){var me=this,config=(me.calloutsGroup,me.callouts),styles=config?config.styles:void 0,width=styles?styles.width:0,height=styles?styles.height:0,chart=me.chart,surface=chart.surface,calloutObj={lines:!1};return calloutObj.lines=surface.add(Ext.apply({},{type:"path",path:"M0,0",stroke:me.getLegendColor()||"#555"},styles)),config.items&&(calloutObj.panel=new Ext.Panel({style:"position: absolute;",width:width,height:height,items:config.items,renderTo:chart.el})),calloutObj},hideCallouts:function(index){for(var co,p,calloutsArray=this.calloutsArray,len=calloutsArray.length;len-- >index;){co=calloutsArray[len];for(p in co)co[p]&&co[p].hide(!0)}}});Ext.define("Ext.draw.CompositeSprite",{extend:"Ext.util.MixedCollection",mixins:{animate:"Ext.util.Animate"},autoDestroy:!1,isCompositeSprite:!0,constructor:function(config){var me=this;config=config||{},Ext.apply(me,config),me.addEvents("mousedown","mouseup","mouseover","mouseout","click"),me.id=Ext.id(null,"ext-sprite-group-"),me.callParent()},onClick:function(e){this.fireEvent("click",e)},onMouseUp:function(e){this.fireEvent("mouseup",e)},onMouseDown:function(e){this.fireEvent("mousedown",e)},onMouseOver:function(e){this.fireEvent("mouseover",e)},onMouseOut:function(e){this.fireEvent("mouseout",e)},attachEvents:function(o){var me=this;o.on({scope:me,mousedown:me.onMouseDown,mouseup:me.onMouseUp,mouseover:me.onMouseOver,mouseout:me.onMouseOut,click:me.onClick})},add:function(key,o){var result=this.callParent(arguments);return this.attachEvents(result),result},insert:function(index,key,o){return this.callParent(arguments)},remove:function(o){var me=this;return o.un({scope:me,mousedown:me.onMouseDown,mouseup:me.onMouseUp,mouseover:me.onMouseOver,mouseout:me.onMouseOut,click:me.onClick}),me.callParent(arguments)},getBBox:function(){for(var sprite,bb,i=0,items=this.items,len=this.length,minX=1/0,maxHeight=-1/0,minY=1/0,maxWidth=-1/0;i<len;i++)sprite=items[i],sprite.el&&!sprite.bboxExcluded&&(bb=sprite.getBBox(),minX=Math.min(minX,bb.x),minY=Math.min(minY,bb.y),maxHeight=Math.max(maxHeight,bb.height+bb.y),maxWidth=Math.max(maxWidth,bb.width+bb.x));return{x:minX,y:minY,height:maxHeight-minY,width:maxWidth-minX}},setAttributes:function(attrs,redraw){for(var i=0,items=this.items,len=this.length;i<len;i++)items[i].setAttributes(attrs,redraw);return this},hide:function(redraw){for(var i=0,items=this.items,len=this.length;i<len;i++)items[i].hide(redraw);return this},show:function(redraw){for(var i=0,items=this.items,len=this.length;i<len;i++)items[i].show(redraw);return this},redraw:function(){var me=this,i=0,items=me.items,surface=me.getSurface(),len=me.length;if(surface)for(;i<len;i++)surface.renderItem(items[i]);return me},setStyle:function(obj){for(var item,el,i=0,items=this.items,len=this.length;i<len;i++)item=items[i],(el=item.el)&&el.setStyle(obj)},addCls:function(obj){var i=0,items=this.items,surface=this.getSurface(),len=this.length;if(surface)for(;i<len;i++)surface.addCls(items[i],obj)},removeCls:function(obj){var i=0,items=this.items,surface=this.getSurface(),len=this.length;if(surface)for(;i<len;i++)surface.removeCls(items[i],obj)},getSurface:function(){var first=this.first();return first?first.surface:null},destroy:function(){var item,me=this,surface=me.getSurface(),destroySprites=me.autoDestroy;if(surface)for(;me.getCount()>0;)item=me.first(),me.remove(item),surface.remove(item,destroySprites);me.clearListeners()}});Ext.define("Ext.draw.Surface",{mixins:{observable:"Ext.util.Observable"},requires:["Ext.draw.CompositeSprite"],uses:["Ext.draw.engine.Svg","Ext.draw.engine.Vml","Ext.draw.engine.SvgExporter","Ext.draw.engine.ImageExporter"],separatorRe:/[, ]+/,enginePriority:["Svg","Vml"],statics:{create:function(config,enginePriority){enginePriority=enginePriority||this.prototype.enginePriority;for(var i=0,len=enginePriority.length;i<len;i++)if(Ext.supports[enginePriority[i]])return Ext.create("Ext.draw.engine."+enginePriority[i],config);return!1},save:function(surface,config){config=config||{};var exportTypes={"image/png":"Image","image/jpeg":"Image","image/svg+xml":"Svg"},prefix=exportTypes[config.type]||"Svg";return Ext.draw.engine[prefix+"Exporter"].generate(surface,config)}},availableAttrs:{blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,"dominant-baseline":"auto",fill:"none","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:"",height:0,hidden:!1,href:"http://sencha.com/",opacity:1,path:"M0,0",radius:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"none","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank",text:"","text-anchor":"middle",title:"Ext Draw",width:0,x:0,y:0,zIndex:0},container:void 0,height:352,width:512,x:0,y:0,orderSpritesByZIndex:!0,constructor:function(config){var me=this;config=config||{},Ext.apply(me,config),me.domRef=Ext.getDoc().dom,me.customAttributes={},me.addEvents("mousedown","mouseup","mouseover","mouseout","mousemove","mouseenter","mouseleave","click","dblclick"),me.mixins.observable.constructor.call(me),me.getId(),me.initGradients(),me.initItems(),me.renderTo&&(me.render(me.renderTo),delete me.renderTo),me.initBackground(config.background)},initSurface:Ext.emptyFn,renderItem:Ext.emptyFn,renderItems:Ext.emptyFn,setViewBox:function(x,y,width,height){isFinite(x)&&isFinite(y)&&isFinite(width)&&isFinite(height)&&(this.viewBox={x:x,y:y,width:width,height:height},this.applyViewBox())},addCls:Ext.emptyFn,removeCls:Ext.emptyFn,setStyle:Ext.emptyFn,initGradients:function(){if(this.hasOwnProperty("gradients")){var g,gLen,gradients=this.gradients,fn=this.addGradient;if(gradients)for(g=0,gLen=gradients.length;g<gLen&&!1!==fn.call(this,gradients[g],g,gLen);g++);}},initItems:function(){var items=this.items;this.items=new Ext.draw.CompositeSprite,this.items.autoDestroy=!0,this.groups=new Ext.draw.CompositeSprite,items&&this.add(items)},initBackground:function(config){var gradientId,gradient,me=this,width=me.width,height=me.height;Ext.isString(config)&&(config={fill:config}),config&&(config.gradient?(gradient=config.gradient,gradientId=gradient.id,me.addGradient(gradient),me.background=me.add({type:"rect",isBackground:!0,x:0,y:0,width:width,height:height,fill:"url(#"+gradientId+")",zIndex:-1})):config.fill?me.background=me.add({type:"rect",isBackground:!0,x:0,y:0,width:width,height:height,fill:config.fill,zIndex:-1}):config.image&&(me.background=me.add({type:"image",isBackground:!0,x:0,y:0,width:width,height:height,src:config.image,zIndex:-1})),me.background.bboxExcluded=!0)},setSize:function(w,h){this.applyViewBox()},scrubAttrs:function(sprite){var i,attrs={},exclude={},sattr=sprite.attr;for(i in sattr)this.translateAttrs.hasOwnProperty(i)?(attrs[this.translateAttrs[i]]=sattr[i],exclude[this.translateAttrs[i]]=!0):this.availableAttrs.hasOwnProperty(i)&&!exclude[i]&&(attrs[i]=sattr[i]);return attrs},onClick:function(e){this.processEvent("click",e)},onDblClick:function(e){this.processEvent("dblclick",e)},onMouseUp:function(e){this.processEvent("mouseup",e)},onMouseDown:function(e){this.processEvent("mousedown",e)},onMouseOver:function(e){this.processEvent("mouseover",e)},onMouseOut:function(e){this.processEvent("mouseout",e)},onMouseMove:function(e){this.fireEvent("mousemove",e)},onMouseEnter:Ext.emptyFn,onMouseLeave:Ext.emptyFn,addGradient:Ext.emptyFn,add:function(){var sprite,items,results,i,ln,item,args=Array.prototype.slice.call(arguments),hasMultipleArgs=args.length>1;if(hasMultipleArgs||Ext.isArray(args[0])){for(items=hasMultipleArgs?args:args[0],results=[],i=0,ln=items.length;i<ln;i++)item=items[i],item=this.add(item),results.push(item);return results}return sprite=this.prepareItems(args[0],!0)[0],this.insertByZIndex(sprite),this.onAdd(sprite),sprite},insertByZIndex:function(sprite){var otherZIndex,me=this,sprites=me.items.items,len=sprites.length,ceil=Math.ceil,zIndex=sprite.attr.zIndex,idx=len,high=idx-1,low=0;if(me.orderSpritesByZIndex&&len&&zIndex<sprites[high].attr.zIndex){for(;low<=high;)if(idx=ceil((low+high)/2),(otherZIndex=sprites[idx].attr.zIndex)>zIndex)high=idx-1;else{if(!(otherZIndex<zIndex))break;low=idx+1}for(;idx<len&&sprites[idx].attr.zIndex<=zIndex;)idx++}return me.items.insert(idx,sprite),idx},onAdd:function(sprite){var groups,ln,i,group=sprite.group,draggable=sprite.draggable;if(group){for(groups=[].concat(group),ln=groups.length,i=0;i<ln;i++)group=groups[i],this.getGroup(group).add(sprite);delete sprite.group}draggable&&sprite.initDraggable()},remove:function(sprite,destroySprite){if(sprite){this.items.remove(sprite);var g,groups=[].concat(this.groups.items),gLen=groups.length;for(g=0;g<gLen;g++)groups[g].remove(sprite);sprite.onRemove(),!0===destroySprite&&sprite.destroy()}},removeAll:function(destroySprites){var i,items=this.items.items,ln=items.length;for(i=ln-1;i>-1;i--)this.remove(items[i],destroySprites)},onRemove:Ext.emptyFn,onDestroy:Ext.emptyFn,applyViewBox:function(){var viewBoxX,viewBoxY,viewBoxWidth,viewBoxHeight,relativeHeight,relativeWidth,size,me=this,viewBox=me.viewBox,width=me.width||1,height=me.height||1;viewBox&&(width||height)?(viewBoxX=viewBox.x,viewBoxY=viewBox.y,viewBoxWidth=viewBox.width,viewBoxHeight=viewBox.height,relativeHeight=height/viewBoxHeight,relativeWidth=width/viewBoxWidth,size=Math.min(relativeWidth,relativeHeight),viewBoxWidth*size<width&&(viewBoxX-=(width-viewBoxWidth*size)/2/size),viewBoxHeight*size<height&&(viewBoxY-=(height-viewBoxHeight*size)/2/size),me.viewBoxShift={dx:-viewBoxX,dy:-viewBoxY,scale:size},me.background&&me.background.setAttributes(Ext.apply({},{x:viewBoxX,y:viewBoxY,width:width/size,height:height/size},{hidden:!1}),!0)):me.background&&width&&height&&me.background.setAttributes(Ext.apply({x:0,y:0,width:width,height:height},{hidden:!1}),!0)},getBBox:function(sprite,isWithoutTransform){var realPath=this["getPath"+sprite.type](sprite);return isWithoutTransform?(sprite.bbox.plain=sprite.bbox.plain||Ext.draw.Draw.pathDimensions(realPath),sprite.bbox.plain):(sprite.dirtyTransform&&this.applyTransformations(sprite,!0),sprite.bbox.transform=sprite.bbox.transform||Ext.draw.Draw.pathDimensions(Ext.draw.Draw.mapPath(realPath,sprite.matrix)),sprite.bbox.transform)},transformToViewBox:function(x,y){if(this.viewBoxShift){var me=this,shift=me.viewBoxShift;return[x/shift.scale-shift.dx,y/shift.scale-shift.dy]}return[x,y]},applyTransformations:function(sprite,onlyMatrix){"text"==sprite.type&&(sprite.bbox.transform=0,this.transform(sprite,!1)),sprite.dirtyTransform=!1;var me=this,attr=sprite.attr;null==attr.translation.x&&null==attr.translation.y||me.translate(sprite),null==attr.scaling.x&&null==attr.scaling.y||me.scale(sprite),null!=attr.rotation.degrees&&me.rotate(sprite),sprite.bbox.transform=0,this.transform(sprite,onlyMatrix),sprite.transformations=[]},rotate:function(sprite){var bbox,deg=sprite.attr.rotation.degrees,centerX=sprite.attr.rotation.x,centerY=sprite.attr.rotation.y;Ext.isNumber(centerX)&&Ext.isNumber(centerY)||(bbox=this.getBBox(sprite,!0),centerX=Ext.isNumber(centerX)?centerX:bbox.x+bbox.width/2,centerY=Ext.isNumber(centerY)?centerY:bbox.y+bbox.height/2),sprite.transformations.push({type:"rotate",degrees:deg,x:centerX,y:centerY})},translate:function(sprite){var x=sprite.attr.translation.x||0,y=sprite.attr.translation.y||0;sprite.transformations.push({type:"translate",x:x,y:y})},scale:function(sprite){var bbox,x=sprite.attr.scaling.x||1,y=sprite.attr.scaling.y||1,centerX=sprite.attr.scaling.centerX,centerY=sprite.attr.scaling.centerY;Ext.isNumber(centerX)&&Ext.isNumber(centerY)||(bbox=this.getBBox(sprite,!0),centerX=Ext.isNumber(centerX)?centerX:bbox.x+bbox.width/2,centerY=Ext.isNumber(centerY)?centerY:bbox.y+bbox.height/2),sprite.transformations.push({type:"scale",x:x,y:y,centerX:centerX,centerY:centerY})},rectPath:function(x,y,w,h,r){return r?[["M",x+r,y],["l",w-2*r,0],["a",r,r,0,0,1,r,r],["l",0,h-2*r],["a",r,r,0,0,1,-r,r],["l",2*r-w,0],["a",r,r,0,0,1,-r,-r],["l",0,2*r-h],["a",r,r,0,0,1,r,-r],["z"]]:[["M",x,y],["l",w,0],["l",0,h],["l",-w,0],["z"]]},ellipsePath:function(x,y,rx,ry){return null==ry&&(ry=rx),[["M",x,y],["m",0,-ry],["a",rx,ry,0,1,1,0,2*ry],["a",rx,ry,0,1,1,0,-2*ry],["z"]]},getPathpath:function(el){return el.attr.path},getPathcircle:function(el){var a=el.attr;return this.ellipsePath(a.x,a.y,a.radius,a.radius)},getPathellipse:function(el){var a=el.attr;return this.ellipsePath(a.x,a.y,a.radiusX||a.width/2||0,a.radiusY||a.height/2||0)},getPathrect:function(el){var a=el.attr;return this.rectPath(a.x||0,a.y||0,a.width||0,a.height||0,a.r||0)},getPathimage:function(el){var a=el.attr;return this.rectPath(a.x||0,a.y||0,a.width,a.height)},getPathtext:function(el){var bbox=this.getBBoxText(el);return this.rectPath(bbox.x,bbox.y,bbox.width,bbox.height)},createGroup:function(id){var group=this.groups.get(id);return group||(group=new Ext.draw.CompositeSprite({surface:this}),group.id=id||Ext.id(null,"ext-surface-group-"),this.groups.add(group)),group},getGroup:function(id){var group;return"string"==typeof id?(group=this.groups.get(id))||(group=this.createGroup(id)):group=id,group},prepareItems:function(items,applyDefaults){items=[].concat(items);var item,i,ln;for(i=0,ln=items.length;i<ln;i++)item=items[i],item instanceof Ext.draw.Sprite?item.surface=this:(item.surface=this,items[i]=this.createItem(item));return items},setText:Ext.emptyFn,createItem:Ext.emptyFn,getId:function(){return this.id||(this.id=Ext.id(null,"ext-surface-"))},destroy:function(){var me=this;delete me.domRef,me.background&&me.background.destroy(),me.removeAll(!0),Ext.destroy(me.groups.items)}});Ext.define("Ext.layout.component.Draw",{alias:"layout.draw",extend:"Ext.layout.component.Auto",setHeightInDom:!0,setWidthInDom:!0,type:"draw",measureContentWidth:function(ownerContext){var target=ownerContext.target,paddingInfo=ownerContext.getPaddingInfo(),bbox=this.getBBox(ownerContext);return target.viewBox?ownerContext.heightModel.shrinkWrap?paddingInfo.width:bbox.width/bbox.height*(ownerContext.getProp("contentHeight")-paddingInfo.height)+paddingInfo.width:target.autoSize?bbox.width+paddingInfo.width:bbox.x+bbox.width+paddingInfo.width},measureContentHeight:function(ownerContext){var target=ownerContext.target,paddingInfo=ownerContext.getPaddingInfo(),bbox=this.getBBox(ownerContext);return ownerContext.target.viewBox?ownerContext.widthModel.shrinkWrap?paddingInfo.height:bbox.height/bbox.width*(ownerContext.getProp("contentWidth")-paddingInfo.width)+paddingInfo.height:target.autoSize?bbox.height+paddingInfo.height:bbox.y+bbox.height+paddingInfo.height},getBBox:function(ownerContext){var bbox=ownerContext.surfaceBBox;return bbox||(bbox=ownerContext.target.surface.items.getBBox(),bbox.width===-1/0&&bbox.height===-1/0&&(bbox.width=bbox.height=bbox.x=bbox.y=0),ownerContext.surfaceBBox=bbox),bbox},publishInnerWidth:function(ownerContext,width){ownerContext.setContentWidth(width-ownerContext.getFrameInfo().width,!0)},publishInnerHeight:function(ownerContext,height){ownerContext.setContentHeight(height-ownerContext.getFrameInfo().height,!0)},finishedLayout:function(ownerContext){var props=ownerContext.props,paddingInfo=ownerContext.getPaddingInfo();this.owner.setSurfaceSize(props.contentWidth-paddingInfo.width,props.contentHeight-paddingInfo.height),this.callParent(arguments)}});Ext.define("Ext.draw.Component",{alias:"widget.draw",extend:"Ext.Component",requires:["Ext.draw.Surface","Ext.layout.component.Draw"],enginePriority:["Svg","Vml"],baseCls:Ext.baseCSSPrefix+"surface",componentLayout:"draw",viewBox:!0,shrinkWrap:3,autoSize:!1,suspendSizing:0,initComponent:function(){this.callParent(arguments),this.addEvents("mousedown","mouseup","mousemove","mouseenter","mouseleave","click","dblclick")},onRender:function(){this.callParent(arguments),!1!==this.createSurface()&&this.configureSurfaceSize()},configureSurfaceSize:function(){var bbox,me=this,viewBox=me.viewBox,autoSize=me.autoSize;!viewBox&&!autoSize||me.suspendSizing||(bbox=me.surface.items.getBBox(),viewBox?me.surface.setViewBox(bbox.x,bbox.y,bbox.width,bbox.height):me.autoSizeSurface(bbox))},autoSizeSurface:function(bbox){bbox=bbox||this.surface.items.getBBox(),this.setSurfaceSize(bbox.width,bbox.height)},setSurfaceSize:function(width,height){if(this.surface.setSize(width,height),this.autoSize){var bbox=this.surface.items.getBBox();this.surface.setViewBox(bbox.x,bbox.y-+Ext.isOpera,width,height)}},createSurface:function(){function refire(eventName){return function(e){me.fireEvent(eventName,e)}}var surface,me=this,cfg=Ext.applyIf({renderTo:me.el,height:me.height,width:me.width,items:me.items},me.initialConfig);if(delete cfg.listeners,cfg.gradients||(cfg.gradients=me.gradients),me.initSurfaceCfg(cfg),!(surface=Ext.draw.Surface.create(cfg,me.enginePriority)))return!1;me.surface=surface,surface.owner=me,surface.on({scope:me,mouseup:refire("mouseup"),mousedown:refire("mousedown"),mousemove:refire("mousemove"),mouseenter:refire("mouseenter"),mouseleave:refire("mouseleave"),click:refire("click"),dblclick:refire("dblclick")})},initSurfaceCfg:Ext.emptyFn,onDestroy:function(){Ext.destroy(this.surface),this.callParent(arguments)}});Ext.define("Ext.chart.Highlight",{requires:["Ext.fx.Anim"],highlight:!1,highlightCfg:{fill:"#fdd","stroke-width":5,stroke:"#f55"},constructor:function(config){config.highlight&&"boolean"!=typeof config.highlight&&(this.highlightCfg=Ext.merge({},this.highlightCfg,config.highlight))},highlightItem:function(item){if(item){var p,from,to,pi,me=this,sprite=item.sprite,opts=Ext.merge({},me.highlightCfg,me.highlight),surface=me.chart.surface,animate=me.chart.animate;if(me.highlight&&sprite&&!sprite._highlighted){if(sprite._anim&&(sprite._anim.paused=!0),sprite._highlighted=!0,!sprite._defaults){sprite._defaults=Ext.apply({},sprite.attr),from={},to={};for(p in opts)if(p in sprite._defaults||(sprite._defaults[p]=surface.availableAttrs[p]),from[p]=sprite._defaults[p],to[p]=opts[p],Ext.isObject(opts[p])){from[p]={},to[p]={},Ext.apply(sprite._defaults[p],sprite.attr[p]),Ext.apply(from[p],sprite._defaults[p]);for(pi in sprite._defaults[p])pi in opts[p]?to[p][pi]=opts[p][pi]:to[p][pi]=from[p][pi];for(pi in opts[p])pi in to[p]||(to[p][pi]=opts[p][pi])}sprite._from=from,sprite._to=to,sprite._endStyle=to}animate?sprite._anim=new Ext.fx.Anim({target:sprite,from:sprite._from,to:sprite._to,duration:150}):sprite.setAttributes(sprite._to,!0)}}},unHighlightItem:function(){if(this.highlight&&this.items)for(var obj,p,sprite,me=this,items=me.items,len=items.length,opts=Ext.merge({},me.highlightCfg,me.highlight),animate=me.chart.animate,i=0;i<len;i++)if(items[i]&&(sprite=items[i].sprite)&&sprite._highlighted){sprite._anim&&(sprite._anim.paused=!0),obj={};for(p in opts)Ext.isObject(sprite._defaults[p])?obj[p]=Ext.apply({},sprite._defaults[p]):obj[p]=sprite._defaults[p];animate?(sprite._endStyle=obj,sprite._anim=new Ext.fx.Anim({target:sprite,to:obj,duration:150})):sprite.setAttributes(obj,!0),delete sprite._highlighted}},cleanHighlights:function(){if(this.highlight){var l,group=this.group,markerGroup=this.markerGroup,i=0;for(l=group.getCount();i<l;i++)delete group.getAt(i)._defaults;if(markerGroup)for(l=markerGroup.getCount();i<l;i++)delete markerGroup.getAt(i)._defaults}}});Ext.define("Ext.chart.Label",{requires:["Ext.draw.Color"],colorStringRe:/url\s*\(\s*#([^\/)]+)\s*\)/,constructor:function(config){var me=this;me.label=Ext.applyIf(me.label||{},{display:"none",stackedDisplay:"none",color:"#000",field:"name",minMargin:50,font:"11px Helvetica, sans-serif",orientation:"horizontal",renderer:Ext.identityFn}),"none"!==me.label.display&&(me.labelsGroup=me.chart.surface.getGroup(me.seriesId+"-labels"))},renderLabels:function(){var gradient,i,count,groupIndex,index,j,k,colorStopTotal,colorStopIndex,colorStop,item,label,storeItem,sprite,spriteColor,spriteBrightness,labelColor,colorString,total,totalPositive,totalNegative,topText,bottomText,me=this,chart=me.chart,gradients=chart.gradients,items=me.items,animate=chart.animate,config=me.label,display=config.display,stackedDisplay=config.stackedDisplay,format=config.renderer,color=config.color,field=[].concat(config.field),group=me.labelsGroup,groupLength=(group||0)&&group.length,store=me.chart.getChartStore(),len=store.getCount(),itemLength=(items||0)&&items.length,ratio=itemLength/len,gradientsCount=(gradients||0)&&gradients.length,Color=Ext.draw.Color,hides=[];if("none"!=display&&group){if(0==itemLength)for(;groupLength--;)hides.push(groupLength);else{for(i=0,count=0,groupIndex=0;i<len;i++)for(index=0,j=0;j<ratio;j++){for(item=items[count],label=group.getAt(groupIndex),storeItem=store.getAt(i);this.__excludes&&this.__excludes[index];)index++;if(!item&&label&&(label.hide(!0),groupIndex++),item&&field[j]){if(!label&&!(label=me.onCreateLabel(storeItem,item,i,display)))break;if(label.setAttributes({fill:String(color)},!0),me.onPlaceLabel(label,storeItem,item,i,display,animate,index),groupIndex++,config.contrast&&item.sprite){if(sprite=item.sprite,colorString=animate&&sprite._endStyle?sprite._endStyle.fill:animate&&sprite._to?sprite._to.fill:sprite.attr.fill,colorString=colorString||sprite.attr.fill,spriteColor=Color.fromString(colorString),colorString&&!spriteColor){for(colorString=colorString.match(me.colorStringRe)[1],k=0;k<gradientsCount;k++)if(gradient=gradients[k],gradient.id==colorString){colorStop=0,colorStopTotal=0;for(colorStopIndex in gradient.stops)colorStop++,colorStopTotal+=Color.fromString(gradient.stops[colorStopIndex].color).getGrayscale();spriteBrightness=colorStopTotal/colorStop/255;break}}else spriteBrightness=spriteColor.getGrayscale()/255;label.isOutside&&(spriteBrightness=1),labelColor=Color.fromString(label.attr.fill||label.attr.color).getHSL(),labelColor[2]=spriteBrightness>.5?.2:.8,label.setAttributes({fill:String(Color.fromHSL.apply({},labelColor))},!0)}me.stacked&&stackedDisplay&&(item.totalPositiveValues||item.totalNegativeValues)&&(totalPositive=item.totalPositiveValues||0,totalNegative=item.totalNegativeValues||0,total=totalPositive+totalNegative,"total"==stackedDisplay?topText=format(total):"balances"==stackedDisplay&&(0==totalPositive&&0==totalNegative?topText=format(0):(topText=format(totalPositive),bottomText=format(totalNegative))),topText&&(label=group.getAt(groupIndex),label||(label=me.onCreateLabel(storeItem,item,i,"over")),labelColor=Color.fromString(label.attr.color||label.attr.fill).getHSL(),label.setAttributes({text:topText,style:config.font,fill:String(Color.fromHSL.apply({},labelColor))},!0),me.onPlaceLabel(label,storeItem,item,i,"over",animate,index),groupIndex++),bottomText&&(label=group.getAt(groupIndex),label||(label=me.onCreateLabel(storeItem,item,i,"under")),labelColor=Color.fromString(label.attr.color||label.attr.fill).getHSL(),label.setAttributes({text:bottomText,style:config.font,fill:String(Color.fromHSL.apply({},labelColor))},!0),me.onPlaceLabel(label,storeItem,item,i,"under",animate,index),groupIndex++))}count++,index++}for(groupLength=group.length;groupLength>groupIndex;)hides.push(groupIndex),groupIndex++}me.hideLabels(hides)}},hideLabels:function(hides){var labelsGroup=this.labelsGroup,hlen=!!hides&&hides.length;if(labelsGroup)if(!1===hlen)for(hlen=labelsGroup.getCount();hlen--;)labelsGroup.getAt(hlen).hide(!0);else for(;hlen--;)labelsGroup.getAt(hides[hlen]).hide(!0)}});Ext.define("Ext.chart.TipSurface",{extend:"Ext.draw.Component",spriteArray:!1,renderFirst:!0,constructor:function(config){this.callParent([config]),config.sprites&&(this.spriteArray=[].concat(config.sprites),delete config.sprites)},onRender:function(){var sp,sprites,me=this,i=0,l=0;if(this.callParent(arguments),sprites=me.spriteArray,me.renderFirst&&sprites)for(me.renderFirst=!1,l=sprites.length;i<l;i++)sp=me.surface.add(sprites[i]),sp.setAttributes({hidden:!1},!0)}});Ext.define("Ext.chart.Tip",{requires:["Ext.tip.ToolTip","Ext.chart.TipSurface"],constructor:function(config){var surface,sprites,tipSurface,me=this;config.tips&&(me.tipTimeout=null,me.tipConfig=Ext.apply({},config.tips,{renderer:Ext.emptyFn,constrainPosition:!0,autoHide:!0,shrinkWrapDock:!0}),me.tooltip=new Ext.tip.ToolTip(me.tipConfig),me.chart.surface.on("mousemove",me.tooltip.onMouseMove,me.tooltip),me.chart.surface.on("mouseleave",function(){me.hideTip()}),me.tipConfig.surface&&(surface=me.tipConfig.surface,sprites=surface.sprites,tipSurface=new Ext.chart.TipSurface({id:"tipSurfaceComponent",sprites:sprites}),surface.width&&surface.height&&tipSurface.setSize(surface.width,surface.height),me.tooltip.add(tipSurface),me.spriteTip=tipSurface))},showTip:function(item){var tooltip,spriteTip,tipConfig,trackMouse,sprite,surface,surfaceExt,pos,x,y,me=this;me.tooltip&&(clearTimeout(me.tipTimeout),tooltip=me.tooltip,spriteTip=me.spriteTip,tipConfig=me.tipConfig,trackMouse=tooltip.trackMouse,trackMouse||(tooltip.trackMouse=!0,sprite=item.sprite,surface=sprite.surface,(surfaceExt=Ext.get(surface.getId()))&&(pos=surfaceExt.getXY(),x=pos[0]+(sprite.attr.x||0)+(sprite.attr.translation&&sprite.attr.translation.x||0),y=pos[1]+(sprite.attr.y||0)+(sprite.attr.translation&&sprite.attr.translation.y||0),tooltip.targetXY=[x,y])),spriteTip?tipConfig.renderer.call(tooltip,item.storeItem,item,spriteTip.surface):tipConfig.renderer.call(tooltip,item.storeItem,item),tooltip.delayShow(),tooltip.trackMouse=trackMouse)},hideTip:function(item){var tooltip=this.tooltip;tooltip&&(clearTimeout(this.tipTimeout),this.tipTimeout=setTimeout(function(){tooltip.delayHide()},0))}});Ext.define("Ext.chart.series.Series",{mixins:{observable:"Ext.util.Observable",labels:"Ext.chart.Label",highlights:"Ext.chart.Highlight",tips:"Ext.chart.Tip",callouts:"Ext.chart.Callout"},type:null,title:null,showInLegend:!0,renderer:function(sprite,record,attributes,index,store){return attributes},shadowAttributes:null,animating:!1,nullGutters:{lower:0,upper:0,verticalAxis:void 0},nullPadding:{left:0,right:0,width:0,bottom:0,top:0,height:0},constructor:function(config){var me=this;config&&Ext.apply(me,config),me.shadowGroups=[],me.mixins.labels.constructor.call(me,config),me.mixins.highlights.constructor.call(me,config),me.mixins.tips.constructor.call(me,config),me.mixins.callouts.constructor.call(me,config),me.addEvents({scope:me,itemclick:!0,itemdblclick:!0,itemmouseover:!0,itemmouseout:!0,itemmousedown:!0,itemmouseup:!0,mouseleave:!0,afterdraw:!0,titlechange:!0}),me.mixins.observable.constructor.call(me,config),me.on({scope:me,itemmouseover:me.onItemMouseOver,itemmouseout:me.onItemMouseOut,mouseleave:me.onMouseLeave}),me.style&&Ext.apply(me.seriesStyle,me.style)},initialize:Ext.emptyFn,onRedraw:Ext.emptyFn,eachRecord:function(fn,scope){this.chart.getChartStore().each(fn,scope)},getRecordCount:function(){var chart=this.chart,store=chart.getChartStore();return store?store.getCount():0},isExcluded:function(index){var excludes=this.__excludes;return!(!excludes||!excludes[index])},setBBox:function(noGutter){var clipBox,bbox,me=this,chart=me.chart,chartBBox=chart.chartBBox,maxGutters=noGutter?{left:0,right:0,bottom:0,top:0}:chart.maxGutters;clipBox={x:chartBBox.x,y:chartBBox.y,width:chartBBox.width,height:chartBBox.height},me.clipBox=clipBox,bbox={x:clipBox.x+maxGutters.left-chart.zoom.x*chart.zoom.width,y:clipBox.y+maxGutters.bottom-chart.zoom.y*chart.zoom.height,width:(clipBox.width-(maxGutters.left+maxGutters.right))*chart.zoom.width,height:(clipBox.height-(maxGutters.bottom+maxGutters.top))*chart.zoom.height},me.bbox=bbox},onAnimate:function(sprite,attr){var me=this;return sprite.stopAnimation(),me.animating?sprite.animate(Ext.applyIf(attr,me.chart.animate)):(me.animating=!0,sprite.animate(Ext.apply(Ext.applyIf(attr,me.chart.animate),{callback:function(){me.animating=!1,me.fireEvent("afterrender",me)}})))},getGutters:function(){return this.nullGutters},getPadding:function(){return this.nullPadding},onItemMouseOver:function(item){var me=this;item.series===me&&(me.highlight&&me.highlightItem(item),me.tooltip&&me.showTip(item))},onItemMouseOut:function(item){var me=this;item.series===me&&(me.unHighlightItem(),me.tooltip&&me.hideTip(item))},onMouseLeave:function(){var me=this;me.unHighlightItem(),me.tooltip&&me.hideTip()},getItemForPoint:function(x,y){if(!this.items||!this.items.length||this.seriesIsHidden)return null;var i,ln,me=this,items=me.items,bbox=me.bbox;if(!Ext.draw.Draw.withinBox(x,y,bbox))return null;for(i=0,ln=items.length;i<ln;i++)if(items[i]&&this.isItemInPoint(x,y,items[i],i))return items[i];return null},isItemInPoint:function(x,y,item,i){return!1},hideAll:function(){var item,len,i,j,l,sprite,shadows,me=this,items=me.items;for(me.seriesIsHidden=!0,me._prevShowMarkers=me.showMarkers,me.showMarkers=!1,me.hideLabels(0),i=0,len=items.length;i<len;i++)if(item=items[i],sprite=item.sprite,sprite&&sprite.setAttributes({hidden:!0},!0),sprite&&sprite.shadows)for(shadows=sprite.shadows,j=0,l=shadows.length;j<l;++j)shadows[j].setAttributes({hidden:!0},!0)},showAll:function(){var me=this,prevAnimate=me.chart.animate;me.chart.animate=!1,me.seriesIsHidden=!1,me.showMarkers=me._prevShowMarkers,me.drawSeries(),me.chart.animate=prevAnimate},hide:function(){if(this.items){var i,j,lsh,ln,shadows,me=this,items=me.items;if(items&&items.length){for(i=0,ln=items.length;i<ln;++i)if(items[i].sprite&&(items[i].sprite.hide(!0),shadows=items[i].shadows||items[i].sprite.shadows))for(j=0,lsh=shadows.length;j<lsh;++j)shadows[j].hide(!0);me.hideLabels()}}},getLegendColor:function(index){var fill,stroke,me=this;if(me.seriesStyle){if(fill=me.seriesStyle.fill,stroke=me.seriesStyle.stroke,fill&&"none"!=fill)return fill;if(stroke)return stroke}return me.colorArrayStyle?me.colorArrayStyle[me.themeIdx%me.colorArrayStyle.length]:"#000"},visibleInLegend:function(index){var excludes=this.__excludes;return excludes?!excludes[index]:!this.seriesIsHidden},setTitle:function(index,title){var me=this,oldTitle=me.title;Ext.isString(index)&&(title=index,index=0),Ext.isArray(oldTitle)?oldTitle[index]=title:me.title=title,me.fireEvent("titlechange",title,index)}});Ext.define("Ext.container.Monitor",{target:null,selector:"",scope:null,addHandler:null,removeHandler:null,disabled:0,constructor:function(config){Ext.apply(this,config)},bind:function(target){var me=this;me.target=target,target.on("beforedestroy",me.disable,me),me.onContainerAdd(target)},unbind:function(){var me=this,target=me.target;target&&target.un("beforedestroy",me.disable,me),me.items=null},disable:function(){++this.disabled},enable:function(){this.disabled>0&&--this.disabled},handleAdd:function(ct,comp){this.disabled||(comp.is(this.selector)&&this.onItemAdd(comp.ownerCt,comp),comp.isQueryable&&this.onContainerAdd(comp))},onItemAdd:function(ct,comp){var me=this,items=me.items,handler=me.addHandler;me.disabled||(handler&&handler.call(me.scope||comp,comp),items&&items.add(comp))},onItemRemove:function(ct,comp){var me=this,items=me.items,handler=me.removeHandler;me.disabled||(handler&&handler.call(me.scope||comp,comp),items&&items.remove(comp))},onContainerAdd:function(ct,preventChildren){var items,len,i,comp,me=this,handleAdd=me.handleAdd,handleRemove=me.handleRemove;if(ct.isContainer&&(ct.on("add",handleAdd,me),ct.on("dockedadd",handleAdd,me),ct.on("remove",handleRemove,me),ct.on("dockedremove",handleRemove,me)),!0!==preventChildren)for(items=ct.query(me.selector),i=0,len=items.length;i<len;++i)comp=items[i],me.onItemAdd(comp.ownerCt,comp);for(items=ct.query(">container"),i=0,len=items.length;i<len;++i)me.onContainerAdd(items[i],!0)},handleRemove:function(ct,comp){var me=this;me.disabled||(comp.is(me.selector)&&me.onItemRemove(ct,comp),comp.isQueryable&&me.onContainerRemove(ct,comp))},onContainerRemove:function(ct,comp){var items,i,len,item,me=this;if(comp.isDestroyed||comp.destroying||!comp.isContainer)me.invalidateItems();else{for(me.removeCtListeners(comp),items=comp.query(me.selector),i=0,len=items.length;i<len;++i)item=items[i],me.onItemRemove(item.ownerCt,item);for(items=comp.query("container"),i=0,len=items.length;i<len;++i)me.removeCtListeners(items[i])}},removeCtListeners:function(comp){var me=this;comp.un("add",me.handleAdd,me),comp.un("dockedadd",me.handleAdd,me),comp.un("remove",me.handleRemove,me),comp.un("dockedremove",me.handleRemove,me)},getItems:function(){var me=this,items=me.items;return items||(items=me.items=new Ext.util.MixedCollection,items.addAll(me.target.query(me.selector))),items},invalidateItems:function(){this.items=null}});Ext.define("Ext.container.Viewport",{extend:"Ext.container.Container",alias:"widget.viewport",requires:["Ext.EventManager"],alternateClassName:"Ext.Viewport",isViewport:!0,ariaRole:"application",preserveElOnDestroy:!0,viewportCls:Ext.baseCSSPrefix+"viewport",initComponent:function(){var me=this,html=document.body.parentNode,el=me.el=Ext.getBody();Ext.getScrollbarSize(),me.width=me.height=void 0,me.callParent(arguments),Ext.fly(html).addCls(me.viewportCls),me.autoScroll&&(Ext.fly(html).setStyle(me.getOverflowStyle()),delete me.autoScroll),el.setHeight=el.setWidth=Ext.emptyFn,el.dom.scroll="no",me.allowDomMove=!1,me.renderTo=me.el},applyTargetCls:function(targetCls){this.el.addCls(targetCls)},onRender:function(){var me=this;me.callParent(arguments),me.width=Ext.Element.getViewportWidth(),me.height=Ext.Element.getViewportHeight()},afterFirstLayout:function(){var me=this;me.callParent(arguments),setTimeout(function(){Ext.EventManager.onWindowResize(me.fireResize,me)},1)},fireResize:function(width,height){width==this.width&&height==this.height||this.setSize(width,height)},initHierarchyState:function(hierarchyState){this.callParent([this.hierarchyState=Ext.rootHierarchyState])},beforeDestroy:function(){var me=this;me.removeUIFromElement(),me.el.removeCls(me.baseCls),Ext.fly(document.body.parentNode).removeCls(me.viewportCls),me.callParent()}});Ext.define("Ext.data.IdGenerator",{isGenerator:!0,constructor:function(config){var me=this;Ext.apply(me,config),me.id&&(Ext.data.IdGenerator.all[me.id]=me)},getRecId:function(rec){return rec.modelName+"-"+rec.internalId},statics:{all:{},get:function(config){var generator,id,type;if("string"==typeof config)id=type=config,config=null;else{if(config.isGenerator)return config;id=config.id||config.type,type=config.type}return generator=this.all[id],generator||(generator=Ext.create("idgen."+type,config)),generator}}});Ext.define("Ext.data.SortTypes",{singleton:!0,none:Ext.identityFn,stripTagsRE:/<\/?[^>]+>/gi,asText:function(s){return String(s).replace(this.stripTagsRE,"")},asUCText:function(s){return String(s).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(s){return String(s).toUpperCase()},asDate:function(s){return s?Ext.isDate(s)?s.getTime():Date.parse(String(s)):0},asFloat:function(s){var val=parseFloat(String(s).replace(/,/g,""));return isNaN(val)?0:val},asInt:function(s){var val=parseInt(String(s).replace(/,/g,""),10);return isNaN(val)?0:val}});Ext.define("Ext.data.Types",{singleton:!0,requires:["Ext.data.SortTypes"]},function(){var st=Ext.data.SortTypes;Ext.apply(Ext.data.Types,{stripRe:/[\$,%]/g,AUTO:{sortType:st.none,type:"auto"},STRING:{convert:function(v){var defaultValue=this.useNull?null:"";return void 0===v||null===v?defaultValue:String(v)},sortType:st.asUCString,type:"string"},INT:{convert:function(v){return"number"==typeof v?parseInt(v):void 0!==v&&null!==v&&""!==v?parseInt(String(v).replace(Ext.data.Types.stripRe,""),10):this.useNull?null:0},sortType:st.none,type:"int"},FLOAT:{convert:function(v){return"number"==typeof v?v:void 0!==v&&null!==v&&""!==v?parseFloat(String(v).replace(Ext.data.Types.stripRe,""),10):this.useNull?null:0},sortType:st.none,type:"float"},BOOL:{convert:function(v){return"boolean"==typeof v?v:!this.useNull||void 0!==v&&null!==v&&""!==v?"true"===v||1==v:null},sortType:st.none,type:"bool"},DATE:{convert:function(v){var parsed,df=this.dateReadFormat||this.dateFormat;return v?v instanceof Date?v:df?Ext.Date.parse(v,df):(parsed=Date.parse(v),parsed?new Date(parsed):null):null},sortType:st.asDate,type:"date"}}),Ext.apply(Ext.data.Types,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})});Ext.define("Ext.data.Field",{requires:["Ext.data.Types","Ext.data.SortTypes"],alias:"data.field",isField:!0,constructor:function(config){var st,me=this,types=Ext.data.Types;Ext.isString(config)&&(config={name:config}),Ext.apply(me,config),st=me.sortType,me.type?Ext.isString(me.type)&&(me.type=types[me.type.toUpperCase()]||types.AUTO):me.type=types.AUTO,Ext.isString(st)?me.sortType=Ext.data.SortTypes[st]:Ext.isEmpty(st)&&(me.sortType=me.type.sortType),config.hasOwnProperty("convert")?me.convert||!me.type.convert||config.hasOwnProperty("defaultValue")||(me.defaultValue=me.type.convert(me.defaultValue)):me.convert=me.type.convert,config.convert&&(me.hasCustomConvert=!0)},dateFormat:null,dateReadFormat:null,dateWriteFormat:null,useNull:!1,defaultValue:"",mapping:null,sortType:null,sortDir:"ASC",allowBlank:!0,persist:!0});Ext.define("Ext.data.Errors",{extend:"Ext.util.MixedCollection",isValid:function(){return 0===this.length},getByField:function(fieldName){var error,i,errors=[];for(i=0;i<this.length;i++)error=this.items[i],error.field==fieldName&&errors.push(error);return errors}});Ext.define("Ext.data.validations",{singleton:!0,presenceMessage:"must be present",lengthMessage:"is the wrong length",formatMessage:"is the wrong format",inclusionMessage:"is not included in the list of acceptable values",exclusionMessage:"is not an acceptable value",emailMessage:"is not a valid email address",emailRe:/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,presence:function(config,value){return 1===arguments.length&&(value=config),!!value||0===value||!1===value},length:function(config,value){if(void 0===value||null===value)return!1;var length=value.length,min=config.min,max=config.max;return!(min&&length<min||max&&length>max)},email:function(config,email){return Ext.data.validations.emailRe.test(email)},format:function(config,value){return!(!config.matcher||!config.matcher.test(value))},inclusion:function(config,value){return config.list&&-1!=Ext.Array.indexOf(config.list,value)},exclusion:function(config,value){return config.list&&-1==Ext.Array.indexOf(config.list,value)}});Ext.define("Ext.data.Model",{alternateClassName:"Ext.data.Record",mixins:{observable:"Ext.util.Observable"},requires:["Ext.ModelManager","Ext.data.IdGenerator","Ext.data.Field","Ext.data.Errors","Ext.data.Operation","Ext.data.validations","Ext.util.MixedCollection"],compareConvertFields:function(f1,f2){var f1SpecialConvert=f1.convert&&f1.type&&f1.convert!==f1.type.convert,f2SpecialConvert=f2.convert&&f2.type&&f2.convert!==f2.type.convert;return f1SpecialConvert&&!f2SpecialConvert?1:!f1SpecialConvert&&f2SpecialConvert?-1:0},itemNameFn:function(item){return item.name},onClassExtended:function(cls,data,hooks){var onBeforeClassCreated=hooks.onBeforeCreated;hooks.onBeforeCreated=function(cls,data){var field,associationConfig,i,ln,me=this,name=Ext.getClassName(cls),prototype=cls.prototype,superCls=cls.prototype.superclass,validations=data.validations||[],fields=data.fields||[],associationsConfigs=data.associations||[],addAssociations=function(items,type){var len,item,i=0;if(items)for(items=Ext.Array.from(items),len=items.length;i<len;++i)item=items[i],Ext.isObject(item)||(item={model:item}),item.type=type,associationsConfigs.push(item)},idgen=data.idgen,fieldsMixedCollection=new Ext.util.MixedCollection(!1,prototype.itemNameFn),associationsMixedCollection=new Ext.util.MixedCollection(!1,prototype.itemNameFn),superValidations=superCls.validations,superFields=superCls.fields,superAssociations=superCls.associations,dependencies=[],idProperty="idProperty"in data?data.idProperty:prototype.idProperty,idField=idProperty?idProperty.isField?idProperty:new Ext.data.Field(idProperty):null,idFieldDefined=!1,onFieldAddReplace=function(arg0,arg1,arg2){var newField,pos;fieldsMixedCollection.events.add.firing?(pos=arg0,newField=arg1):(newField=arg2,pos=arg1.originalIndex),newField.originalIndex=pos,idField&&(newField.mapping&&newField.mapping===idField.mapping||newField.name===idField.name)&&(prototype.idField=newField,idFieldDefined=!0,newField.defaultValue=void 0)},clsProxy=data.proxy,fieldConvertSortFn=function(){fieldsMixedCollection.sortBy(prototype.compareConvertFields)};for(cls.modelName=name,prototype.modelName=name,superValidations&&(validations=superValidations.concat(validations)),data.validations=validations,superFields&&(fields=superFields.items.concat(fields)),fieldsMixedCollection.on({add:onFieldAddReplace,replace:onFieldAddReplace}),i=0,ln=fields.length;i<ln;++i)field=fields[i],fieldsMixedCollection.add(field.isField?field:new Ext.data.Field(field));for(idField&&!idFieldDefined&&(prototype.idField=idField,idField.defaultValue=void 0,fieldsMixedCollection.add(idField)),fieldConvertSortFn(),fieldsMixedCollection.on({add:fieldConvertSortFn,replace:fieldConvertSortFn}),data.fields=fieldsMixedCollection,idgen&&(data.idgen=Ext.data.IdGenerator.get(idgen)),addAssociations(data.belongsTo,"belongsTo"),delete data.belongsTo,addAssociations(data.hasMany,"hasMany"),delete data.hasMany,addAssociations(data.hasOne,"hasOne"),delete data.hasOne,superAssociations&&(associationsConfigs=superAssociations.items.concat(associationsConfigs)),i=0,ln=associationsConfigs.length;i<ln;++i)dependencies.push("association."+associationsConfigs[i].type.toLowerCase());clsProxy?clsProxy.isProxy||dependencies.push("proxy."+(clsProxy.type||clsProxy)):cls.prototype.proxy||(cls.prototype.proxy=cls.prototype.defaultProxyType,dependencies.push("proxy."+cls.prototype.defaultProxyType)),Ext.require(dependencies,function(){for(Ext.ModelManager.registerType(name,cls),i=0,ln=associationsConfigs.length;i<ln;++i)associationConfig=associationsConfigs[i],associationConfig.isAssociation?associationConfig=Ext.applyIf({ownerModel:name,associatedModel:associationConfig.model},associationConfig.initialConfig):Ext.apply(associationConfig,{ownerModel:name,associatedModel:associationConfig.model}),void 0===Ext.ModelManager.getModel(associationConfig.model)?Ext.ModelManager.registerDeferredAssociation(associationConfig):associationsMixedCollection.add(Ext.data.association.Association.create(associationConfig));data.associations=associationsMixedCollection,onBeforeClassCreated.call(me,cls,data,hooks),clsProxy&&clsProxy.isProxy&&cls.setProxy(clsProxy),Ext.ModelManager.onModelDefined(cls)})}},inheritableStatics:{setProxy:function(proxy){return proxy.isProxy||("string"==typeof proxy&&(proxy={type:proxy}),proxy=Ext.createByAlias("proxy."+proxy.type,proxy)),proxy.setModel(this),this.proxy=this.prototype.proxy=proxy,proxy},getProxy:function(){var proxy=this.proxy;return proxy||(proxy=this.prototype.proxy,proxy.isProxy&&(proxy=proxy.clone()),this.setProxy(proxy))},setFields:function(fields,idProperty,clientIdProperty){var newField,idField,len,i,me=this,idFieldDefined=!1,proto=me.prototype,prototypeFields=proto.fields,superFields=proto.superclass.fields;for(idProperty&&(proto.idProperty=idProperty,idField=idProperty.isField?idProperty:new Ext.data.Field(idProperty)),clientIdProperty&&(proto.clientIdProperty=clientIdProperty),prototypeFields?prototypeFields.clear():prototypeFields=me.prototype.fields=new Ext.util.MixedCollection(!1,function(field){return field.name}),superFields&&(fields=superFields.items.concat(fields)),i=0,len=fields.length;i<len;i++)newField=new Ext.data.Field(fields[i]),idField&&(newField.mapping&&newField.mapping===idField.mapping||newField.name===idField.name)&&(idFieldDefined=!0,newField.defaultValue=void 0),prototypeFields.add(newField);return idField&&!idFieldDefined&&(idField.defaultValue=void 0,prototypeFields.add(idField)),me.fields=prototypeFields,prototypeFields},getFields:function(){return this.prototype.fields.items},load:function(id,config){config=Ext.apply({},config),config=Ext.applyIf(config,{action:"read",id:id});var callback,operation=new Ext.data.Operation(config),scope=config.scope||this;callback=function(operation){var record=null,success=operation.wasSuccessful();success?(record=operation.getRecords()[0],record.hasId()||record.setId(id),Ext.callback(config.success,scope,[record,operation])):Ext.callback(config.failure,scope,[record,operation]),Ext.callback(config.callback,scope,[record,operation,success])},this.getProxy().read(operation,callback,this)}},statics:{PREFIX:"ext-record",AUTO_ID:1,EDIT:"edit",REJECT:"reject",COMMIT:"commit",id:function(rec){var id=[this.PREFIX,"-",this.AUTO_ID++].join("");return rec.phantom=!0,rec.internalId=id,id}},idgen:{isGenerator:!0,type:"default",generate:function(){return null},getRecId:function(rec){return rec.modelName+"-"+rec.internalId}},editing:!1,dirty:!1,persistenceProperty:"data",evented:!1,isModel:!0,phantom:!1,idProperty:"id",clientIdProperty:null,defaultProxyType:"ajax",emptyData:[],constructor:function(data,id,raw,convertedData){var hasId,fields,length,field,name,value,newId,persistenceProperty,i,me=this,passedId=id||0===id,idProperty=me.idProperty,idField=me.idField;if(me.raw=raw||data,me.modified={},"data"!==me.persistenceProperty&&Ext.log.warn(this.$className,"The persistenceProperty will be deprecated, all data will be stored in the underlying data property."),persistenceProperty=me[me.persistenceProperty]=convertedData||{},me.data=me[me.persistenceProperty],me.mixins.observable.constructor.call(me),!convertedData)if(data?!passedId&&idProperty&&(id=data[idProperty],hasId=id||0===id):data=me.emptyData,fields=me.fields.items,length=fields.length,i=0,Ext.isArray(data))for(;i<length;i++)field=fields[i],name=field.name,value=data[field.originalIndex],void 0===value&&(value=field.defaultValue),field.convert&&(value=field.convert(value,me)),void 0!==value&&(persistenceProperty[name]=value);else for(;i<length;i++)field=fields[i],name=field.name,value=data[name],void 0===value&&(value=field.defaultValue),field.convert&&(value=field.convert(value,me)),void 0!==value&&(persistenceProperty[name]=value);me.stores=[],passedId?(hasId=!0,persistenceProperty[idProperty]=idField&&idField.convert?idField.convert(id):id):hasId||null!=(newId=me.idgen.generate())&&(me.preventInternalUpdate=!0,me.setId(newId),delete me.preventInternalUpdate),me.internalId=hasId?id:Ext.data.Model.id(me),"function"==typeof me.init&&me.init(),me.id=me.idgen.getRecId(me)},get:function(field){return this[this.persistenceProperty][field]},_singleProp:{},set:function(fieldName,newValue){var currentValue,field,idChanged,key,modifiedFieldNames,name,oldId,newId,value,values,me=this,data=me[me.persistenceProperty],fields=me.fields,modified=me.modified,single="string"==typeof fieldName;single?(values=me._singleProp,values[fieldName]=newValue):values=fieldName;for(name in values)if(values.hasOwnProperty(name)){if(value=values[name],fields&&(field=fields.get(name))&&field.convert&&(value=field.convert(value,me)),currentValue=data[name],me.isEqual(currentValue,value))continue;if(data[name]=value,(modifiedFieldNames||(modifiedFieldNames=[])).push(name),field&&field.persist)if(modified.hasOwnProperty(name)){if(me.isEqual(modified[name],value)){delete modified[name],me.dirty=!1;for(key in modified)if(modified.hasOwnProperty(key)){me.dirty=!0;break}}}else me.dirty=!0,modified[name]=currentValue;name==me.idProperty&&(idChanged=!0,oldId=currentValue,newId=value)}return single&&delete values[fieldName],idChanged&&me.changeId(oldId,newId),!me.editing&&modifiedFieldNames&&me.afterEdit(modifiedFieldNames),modifiedFieldNames||null},copyFrom:function(sourceRecord){var field,myData,sourceData,name,value,me=this,fields=me.fields.items,fieldCount=fields.length,modifiedFieldNames=[],i=0,idProperty=me.idProperty;if(sourceRecord){for(myData=me[me.persistenceProperty],sourceData=sourceRecord[sourceRecord.persistenceProperty];i<fieldCount;i++)field=fields[i],(name=field.name)!=idProperty&&(void 0===(value=sourceData[name])||me.isEqual(myData[name],value)||(myData[name]=value,modifiedFieldNames.push(name)));me.phantom&&!sourceRecord.phantom&&(me.beginEdit(),me.setId(sourceRecord.getId()),me.endEdit(!0),me.commit(!0))}return modifiedFieldNames},isEqual:function(a,b){return a instanceof Date&&b instanceof Date?a.getTime()===b.getTime():a===b},beginEdit:function(){var key,data,o,me=this;if(!me.editing){me.editing=!0,me.dirtySave=me.dirty,o=me[me.persistenceProperty],data=me.dataSave={};for(key in o)o.hasOwnProperty(key)&&(data[key]=o[key]);o=me.modified,data=me.modifiedSave={};for(key in o)o.hasOwnProperty(key)&&(data[key]=o[key])}},cancelEdit:function(){var me=this;me.editing&&(me.editing=!1,me.modified=me.modifiedSave,me[me.persistenceProperty]=me.dataSave,me.dirty=me.dirtySave,me.modifiedSave=me.dataSave=me.dirtySave=null)},endEdit:function(silent,modifiedFieldNames){var dataSave,me=this;silent=!0===silent,me.editing&&(me.editing=!1,dataSave=me.dataSave,me.modifiedSave=me.dataSave=me.dirtySave=null,silent||(modifiedFieldNames||(modifiedFieldNames=me.getModifiedFieldNames(dataSave)),(me.dirty||modifiedFieldNames.length>0)&&me.afterEdit(modifiedFieldNames)))},getModifiedFieldNames:function(saved){var key,me=this,data=me[me.persistenceProperty],modified=[];saved=saved||me.dataSave;for(key in data)data.hasOwnProperty(key)&&(me.isEqual(data[key],saved[key])||modified.push(key));return modified},getChanges:function(){var field,modified=this.modified,changes={};for(field in modified)modified.hasOwnProperty(field)&&(changes[field]=this.get(field));return changes},isModified:function(fieldName){return this.modified.hasOwnProperty(fieldName)},setDirty:function(){var field,name,f,me=this,fields=me.fields.items,fLen=fields.length;for(me.dirty=!0,f=0;f<fLen;f++)field=fields[f],field.persist&&(name=field.name,me.modified[name]=me.get(name))},markDirty:function(){return Ext.log.warn("Ext.data.Model: markDirty has been deprecated. Use setDirty instead."),this.setDirty.apply(this,arguments)},reject:function(silent){var field,me=this,modified=me.modified;for(field in modified)modified.hasOwnProperty(field)&&"function"!=typeof modified[field]&&(me[me.persistenceProperty][field]=modified[field]);me.dirty=!1,me.editing=!1,me.modified={},!0!==silent&&me.afterReject()},commit:function(silent,modifiedFieldNames){var me=this;me.phantom=me.dirty=me.editing=!1,me.modified={},!0!==silent&&me.afterCommit(modifiedFieldNames)},copy:function(newId){var me=this;return new me.self(me.raw,newId,null,Ext.apply({},me[me.persistenceProperty]))},setProxy:function(proxy){return proxy.isProxy||("string"==typeof proxy&&(proxy={type:proxy}),proxy=Ext.createByAlias("proxy."+proxy.type,proxy)),proxy.setModel(this.self),this.proxy=proxy,proxy},getProxy:function(){return this.hasOwnProperty("proxy")?this.proxy:this.self.getProxy()},validate:function(){var length,validation,field,type,i,errors=new Ext.data.Errors,validations=this.validations,validators=Ext.data.validations;if(validations)for(length=validations.length,i=0;i<length;i++)validation=validations[i],field=validation.field||validation.name,type=validation.type,validators[type](validation,this.get(field))||errors.add({field:field,message:validation.message||validators[type+"Message"]});return errors},isValid:function(){return this.validate().isValid()},save:function(options){options=Ext.apply({},options);var storeCount,store,operation,callback,me=this,action=me.phantom?"create":"update",scope=options.scope||me,stores=me.stores,i=0;return Ext.apply(options,{records:[me],action:action}),operation=new Ext.data.Operation(options),callback=function(operation){var success=operation.wasSuccessful();if(success){for(storeCount=stores.length;i<storeCount;i++)store=stores[i],store.fireEvent("write",store,operation),store.fireEvent("datachanged",store);Ext.callback(options.success,scope,[me,operation])}else Ext.callback(options.failure,scope,[me,operation]);Ext.callback(options.callback,scope,[me,operation,success])},me.getProxy()[action](operation,callback,me),me},destroy:function(options){options=Ext.apply({records:[this],action:"destroy"},options);var stores,storeCount,store,args,operation,callback,me=this,isNotPhantom=!0!==me.phantom,scope=options.scope||me,i=0;return operation=new Ext.data.Operation(options),callback=function(operation){if(args=[me,operation],stores=Ext.Array.clone(me.stores),operation.wasSuccessful()){for(storeCount=stores.length;i<storeCount;i++)store=stores[i],store.remove?store.remove(me,!0):store.fireEvent("bulkremove",store,[me],[store.indexOf(me)],!1),isNotPhantom&&store.fireEvent("write",store,operation);me.clearListeners(),Ext.callback(options.success,scope,args)}else Ext.callback(options.failure,scope,args);Ext.callback(options.callback,scope,args)},isNotPhantom?me.getProxy().destroy(operation,callback,me):(operation.complete=operation.success=!0,operation.resultSet=me.getProxy().reader.nullResultSet,callback(operation)),me},getId:function(){return this.get(this.idField.name)},getObservableId:function(){return this.id},setId:function(id){this.set(this.idProperty,id)},changeId:function(oldId,newId){var hasOldId,hasId,oldInternalId,me=this;me.preventInternalUpdate||(hasOldId=me.hasId(oldId),hasId=me.hasId(newId),oldInternalId=me.internalId,me.phantom=!hasId,(hasId!==hasOldId||hasId&&hasOldId)&&(me.internalId=hasId?newId:Ext.data.Model.id(me)),me.fireEvent("idchanged",me,oldId,newId,oldInternalId),me.callStore("onIdChanged",oldId,newId,oldInternalId))},hasId:function(id){return 0===arguments.length&&(id=this.getId()),!(!id&&0!==id)},join:function(store){var me=this;me.stores.length?Ext.Array.include(this.stores,store):me.stores[0]=store,this.store=this.stores[0]},unjoin:function(store){Ext.Array.remove(this.stores,store),this.store=this.stores[0]||null},afterEdit:function(modifiedFieldNames){this.callStore("afterEdit",modifiedFieldNames)},afterReject:function(){this.callStore("afterReject")},afterCommit:function(modifiedFieldNames){this.callStore("afterCommit",modifiedFieldNames)},callStore:function(fn){var store,args=Ext.Array.clone(arguments),stores=this.stores,i=0,len=stores.length;for(args[0]=this;i<len;++i)(store=stores[i])&&Ext.isFunction(store[fn])&&store[fn].apply(store,args)},getData:function(includeAssociated){var name,f,me=this,fields=me.fields.items,fLen=fields.length,data={};for(f=0;f<fLen;f++)name=fields[f].name,data[name]=me.get(name);return!0===includeAssociated&&Ext.apply(data,me.getAssociatedData()),data},getAssociatedData:function(){return this.prepareAssociatedData({},1)},prepareAssociatedData:function(seenKeys,depth){var associatedStore,associatedRecords,associatedRecord,o,index,result,seenDepth,associationId,associatedRecordCount,association,i,j,type,name,me=this,associations=me.associations.items,associationCount=associations.length,associationData={},toRead=[],toReadKey=[],toReadIndex=[];for(i=0;i<associationCount;i++)if(association=associations[i],associationId=association.associationId,!(seenDepth=seenKeys[associationId])||seenDepth===depth)if(seenKeys[associationId]=depth,type=association.type,name=association.name,"hasMany"==type){if(associatedStore=me[association.storeName],associationData[name]=[],associatedStore&&associatedStore.getCount()>0)for(associatedRecords=associatedStore.data.items,associatedRecordCount=associatedRecords.length,j=0;j<associatedRecordCount;j++)associatedRecord=associatedRecords[j],associationData[name][j]=associatedRecord.getData(),toRead.push(associatedRecord),toReadKey.push(name),toReadIndex.push(j)}else"belongsTo"!=type&&"hasOne"!=type||void 0!==(associatedRecord=me[association.instanceName])&&(associationData[name]=associatedRecord.getData(),toRead.push(associatedRecord),toReadKey.push(name),toReadIndex.push(-1));for(i=0,associatedRecordCount=toRead.length;i<associatedRecordCount;++i)associatedRecord=toRead[i],o=associationData[toReadKey[i]],index=toReadIndex[i],result=associatedRecord.prepareAssociatedData(seenKeys,depth+1),-1===index?Ext.apply(o,result):Ext.apply(o[index],result);return associationData}});Ext.define("Ext.data.proxy.Server",{extend:"Ext.data.proxy.Proxy",alias:"proxy.server",alternateClassName:"Ext.data.ServerProxy",uses:["Ext.data.Request"],pageParam:"page",startParam:"start",limitParam:"limit",groupParam:"group",groupDirectionParam:"groupDir",sortParam:"sort",filterParam:"filter",directionParam:"dir",idParam:"id",simpleSortMode:!1,simpleGroupMode:!1,noCache:!0,cacheString:"_dc",timeout:3e4,constructor:function(config){var me=this;config=config||{},me.callParent([config]),me.extraParams=config.extraParams||{},me.api=Ext.apply({},config.api||me.api),me.nocache=me.noCache},create:function(){return this.doRequest.apply(this,arguments)},read:function(){return this.doRequest.apply(this,arguments)},update:function(){return this.doRequest.apply(this,arguments)},destroy:function(){return this.doRequest.apply(this,arguments)},setExtraParam:function(name,value){this.extraParams[name]=value},buildRequest:function(operation){var request,me=this,params=operation.params=Ext.apply({},operation.params,me.extraParams);return Ext.applyIf(params,me.getParams(operation)),void 0!==operation.id&&void 0===params[me.idParam]&&(params[me.idParam]=operation.id),request=new Ext.data.Request({params:params,action:operation.action,records:operation.records,operation:operation,url:operation.url,proxy:me}),request.url=me.buildUrl(request),operation.request=request,request},processResponse:function(success,operation,request,response,callback,scope){var reader,result,me=this;!0===success?(reader=me.getReader(),reader.applyDefaults="read"===operation.action,result=reader.read(me.extractResponseData(response)),!1!==result.success?(Ext.apply(operation,{response:response,resultSet:result}),operation.commitRecords(result.records),operation.setCompleted(),operation.setSuccessful()):(operation.setException(result.message),me.fireEvent("exception",this,response,operation))):(me.setException(operation,response),me.fireEvent("exception",this,response,operation)),"function"==typeof callback&&callback.call(scope||me,operation),me.afterRequest(request,success)},setException:function(operation,response){operation.setException({status:response.status,statusText:response.statusText})},extractResponseData:Ext.identityFn,applyEncoding:function(value){return Ext.encode(value)},encodeSorters:function(sorters){for(var min=[],length=sorters.length,i=0;i<length;i++)min[i]={property:sorters[i].property,direction:sorters[i].direction};return this.applyEncoding(min)},encodeFilters:function(filters){for(var min=[],length=filters.length,i=0;i<length;i++)min[i]={property:filters[i].property,value:filters[i].value};return this.applyEncoding(min)},getParams:function(operation){var hasGroups,index,me=this,params={},isDef=Ext.isDefined,groupers=operation.groupers,sorters=operation.sorters,filters=operation.filters,page=operation.page,start=operation.start,limit=operation.limit,simpleSortMode=me.simpleSortMode,simpleGroupMode=me.simpleGroupMode,pageParam=me.pageParam,startParam=me.startParam,limitParam=me.limitParam,groupParam=me.groupParam,groupDirectionParam=me.groupDirectionParam,sortParam=me.sortParam,filterParam=me.filterParam,directionParam=me.directionParam;return pageParam&&isDef(page)&&(params[pageParam]=page),startParam&&isDef(start)&&(params[startParam]=start),limitParam&&isDef(limit)&&(params[limitParam]=limit),hasGroups=groupParam&&groupers&&groupers.length>0,hasGroups&&(simpleGroupMode?(params[groupParam]=groupers[0].property,params[groupDirectionParam]=groupers[0].direction||"ASC"):params[groupParam]=me.encodeSorters(groupers)),sortParam&&sorters&&sorters.length>0&&(simpleSortMode?(index=0,sorters.length>1&&hasGroups&&(index=1),params[sortParam]=sorters[index].property,params[directionParam]=sorters[index].direction):params[sortParam]=me.encodeSorters(sorters)),filterParam&&filters&&filters.length>0&&(params[filterParam]=me.encodeFilters(filters)),params},buildUrl:function(request){var me=this,url=me.getUrl(request);return url||Ext.Error.raise("You are using a ServerProxy but have not supplied it with a url."),me.noCache&&(url=Ext.urlAppend(url,Ext.String.format("{0}={1}",me.cacheString,Ext.Date.now()))),url},getUrl:function(request){return request.url||this.api[request.action]||this.url},doRequest:function(operation,callback,scope){Ext.Error.raise("The doRequest function has not been implemented on your Ext.data.proxy.Server subclass. See src/data/ServerProxy.js for details")},afterRequest:Ext.emptyFn,onDestroy:function(){Ext.destroy(this.reader,this.writer)}});Ext.define("Ext.data.proxy.Ajax",{requires:["Ext.Ajax"],extend:"Ext.data.proxy.Server",alias:"proxy.ajax",alternateClassName:["Ext.data.HttpProxy","Ext.data.AjaxProxy"],actionMethods:{create:"POST",read:"GET",update:"POST",destroy:"POST"},defaultActionMethods:{create:"POST",read:"GET",update:"POST",destroy:"POST"},binary:!1,paramsAsJson:!1,doRequest:function(operation,callback,scope){var me=this,writer=me.getWriter(),request=me.buildRequest(operation),method=me.getMethod(request);return operation.allowWrite()&&(request=writer.write(request)),Ext.apply(request,{binary:me.binary,headers:me.headers,timeout:me.timeout,scope:me,callback:me.createRequestCallback(request,operation,callback,scope),method:method,disableCaching:!1}),"GET"!==method.toUpperCase()&&me.paramsAsJson&&(request=Ext.apply({jsonData:request.params},request),delete request.params),Ext.Ajax.request(request),request},getMethod:function(request){var method,actions=this.actionMethods,action=request.action;return actions&&(method=actions[action]),method||this.defaultActionMethods[action]},createRequestCallback:function(request,operation,callback,scope){var me=this;return function(options,success,response){me.processResponse(success,operation,request,response,callback,scope)}}});Ext.define("Ext.data.proxy.Client",{extend:"Ext.data.proxy.Proxy",alternateClassName:"Ext.data.ClientProxy",isSynchronous:!0,clear:function(){Ext.Error.raise("The Ext.data.proxy.Client subclass that you are using has not defined a 'clear' function. See src/data/ClientProxy.js for details.")}});Ext.define("Ext.data.proxy.Memory",{extend:"Ext.data.proxy.Client",alias:"proxy.memory",alternateClassName:"Ext.data.MemoryProxy",constructor:function(config){this.callParent([config]),this.setReader(this.reader)},updateOperation:function(operation,callback,scope){var i=0,recs=operation.getRecords(),len=recs.length;for(i;i<len;i++)recs[i].commit();operation.setCompleted(),operation.setSuccessful(),Ext.callback(callback,scope||this,[operation])},create:function(){this.updateOperation.apply(this,arguments)},update:function(){this.updateOperation.apply(this,arguments)},destroy:function(){this.updateOperation.apply(this,arguments)},read:function(operation,callback,scope){var me=this,resultSet=operation.resultSet=me.getReader().read(me.data),records=resultSet.records,sorters=operation.sorters,groupers=operation.groupers,filters=operation.filters;operation.setCompleted(),resultSet.success&&(filters&&filters.length&&(records=resultSet.records=Ext.Array.filter(records,Ext.util.Filter.createFilterFn(filters)),resultSet.total=records.length),groupers&&groupers.length&&(sorters=sorters?sorters.concat(groupers):sorters),sorters&&sorters.length&&(resultSet.records=Ext.Array.sort(records,Ext.util.Sortable.createComparator(sorters))),me.enablePaging&&void 0!==operation.start&&void 0!==operation.limit&&(operation.start>=resultSet.total?(resultSet.success=!1,resultSet.count=0,resultSet.records=[]):(resultSet.records=Ext.Array.slice(resultSet.records,operation.start,operation.start+operation.limit),resultSet.count=resultSet.records.length))),resultSet.success?operation.setSuccessful():me.fireEvent("exception",me,null,operation),Ext.callback(callback,scope||me,[operation])},clear:Ext.emptyFn});Ext.define("Ext.util.LruCache",{extend:"Ext.util.HashMap",constructor:function(config){Ext.apply(this,config),this.callParent([config])},add:function(key,newValue){var entry,me=this,existingKey=me.findKey(newValue);return existingKey?(me.unlinkEntry(entry=me.map[existingKey]),entry.prev=me.last,entry.next=null):entry={prev:me.last,next:null,key:key,value:newValue},me.last?me.last.next=entry:me.first=entry,me.last=entry,me.callParent([key,entry]),me.prune(),newValue},insertBefore:function(key,newValue,sibling){var existingKey,entry,me=this;return(sibling=this.map[this.findKey(sibling)])?(existingKey=me.findKey(newValue),existingKey?me.unlinkEntry(entry=me.map[existingKey]):entry={prev:sibling.prev,next:sibling,key:key,value:newValue},sibling.prev?entry.prev.next=entry:me.first=entry,entry.next=sibling,sibling.prev=entry,me.prune(),newValue):me.add(key,newValue)},get:function(key){var entry=this.map[key];if(entry)return entry.next&&this.moveToEnd(entry),entry.value},removeAtKey:function(key){return this.unlinkEntry(this.map[key]),this.callParent(arguments)},clear:function(initial){return this.first=this.last=null,this.callParent(arguments)},unlinkEntry:function(entry){entry&&(entry.next?entry.next.prev=entry.prev:this.last=entry.prev,entry.prev?entry.prev.next=entry.next:this.first=entry.next,entry.prev=entry.next=null)},moveToEnd:function(entry){this.unlinkEntry(entry),(entry.prev=this.last)?this.last.next=entry:this.first=entry,this.last=entry},getArray:function(isKey){for(var arr=[],entry=this.first;entry;)arr.push(isKey?entry.key:entry.value),entry=entry.next;return arr},each:function(fn,scope,reverse){var me=this,entry=reverse?me.last:me.first,length=me.length;for(scope=scope||me;entry&&!1!==fn.call(scope,entry.key,entry.value,length);)entry=reverse?entry.prev:entry.next;return me},findKey:function(value){var key,map=this.map;for(key in map)if(map.hasOwnProperty(key)&&map[key].value===value)return key},clone:function(){var key,newCache=new this.self(this.initialConfig),map=this.map;newCache.suspendEvents();for(key in map)map.hasOwnProperty(key)&&newCache.add(key,map[key].value);return newCache.resumeEvents(),newCache},prune:function(){var me=this,purgeCount=me.maxSize?me.length-me.maxSize:0;if(purgeCount>0)for(;me.first&&purgeCount;purgeCount--)me.removeAtKey(me.first.key)}});Ext.define("Ext.data.PageMap",{extend:"Ext.util.LruCache",clear:function(initial){var me=this;me.pageMapGeneration=(me.pageMapGeneration||0)+1,me.callParent(arguments)},forEach:function(fn,scope){var i,j,pageNumber,page,pageSize,me=this,pageNumbers=Ext.Object.getKeys(me.map),pageCount=pageNumbers.length;for(i=0;i<pageCount;i++)pageNumbers[i]=Number(pageNumbers[i]);for(Ext.Array.sort(pageNumbers),scope=scope||me,i=0;i<pageCount;i++)for(pageNumber=pageNumbers[i],page=me.getPage(pageNumber),pageSize=page.length,j=0;j<pageSize;j++)if(!1===fn.call(scope,page[j],(pageNumber-1)*me.pageSize+j))return},findBy:function(fn,scope){var me=this,result=null;return scope=scope||me,me.forEach(function(rec,index){if(fn.call(scope,rec,index))return result=rec,!1}),result},findIndexBy:function(fn,scope){var me=this,result=-1;return scope=scope||me,me.forEach(function(rec,index){if(fn.call(scope,rec))return result=index,!1}),result},getPageFromRecordIndex:function(){return Ext.data.Store.prototype.getPageFromRecordIndex.apply(this,arguments)},addAll:function(records){this.getCount()&&Ext.Error.raise("Cannot addAll to a non-empty PageMap"),this.addPage(1,records)},addPage:function(pageNumber,records){var startIdx,page,me=this,lastPage=pageNumber+Math.floor((records.length-1)/me.pageSize);for(startIdx=0;pageNumber<=lastPage;pageNumber++,startIdx+=me.pageSize)page=Ext.Array.slice(records,startIdx,startIdx+me.pageSize),me.add(pageNumber,page),me.fireEvent("pageAdded",pageNumber,page)},getCount:function(){var result=this.callParent();return result&&(result=(result-1)*this.pageSize+this.last.value.length),result},indexOf:function(record){return record?record.index:-1},insert:function(){Ext.Error.raise("insert operation not suppported into buffered Store")},remove:function(){Ext.Error.raise("remove operation not suppported from buffered Store")},removeAt:function(){Ext.Error.raise("removeAt operation not suppported from buffered Store")},getPage:function(pageNumber){return this.get(pageNumber)},hasRange:function(start,end){for(var pageNumber=this.getPageFromRecordIndex(start),endPageNumber=this.getPageFromRecordIndex(end);pageNumber<=endPageNumber;pageNumber++)if(!this.hasPage(pageNumber))return!1;return!0},hasPage:function(pageNumber){return!!this.get(pageNumber)},getAt:function(index){return this.getRange(index,index)[0]},getRange:function(start,end){this.hasRange(start,end)||Ext.Error.raise("PageMap asked for range which it does not have");for(var sliceBegin,sliceEnd,doSlice,len,me=this,startPageNumber=me.getPageFromRecordIndex(start),endPageNumber=me.getPageFromRecordIndex(end),dataStart=(startPageNumber-1)*me.pageSize,dataEnd=endPageNumber*me.pageSize-1,pageNumber=startPageNumber,result=[],i=0;pageNumber<=endPageNumber;pageNumber++)pageNumber==startPageNumber?(sliceBegin=start-dataStart,doSlice=!0):(sliceBegin=0,doSlice=!1),pageNumber==endPageNumber&&(sliceEnd=me.pageSize-(dataEnd-end),doSlice=!0),doSlice?Ext.Array.push(result,Ext.Array.slice(me.getPage(pageNumber),sliceBegin,sliceEnd)):Ext.Array.push(result,me.getPage(pageNumber));for(len=result.length;i<len;i++)result[i].index=start++;return result}});Ext.define("Ext.data.Group",{extend:"Ext.util.Observable",key:void 0,dirty:!0,constructor:function(){this.callParent(arguments),this.records=[]},contains:function(record){return-1!==Ext.Array.indexOf(this.records,record)},add:function(records){Ext.Array.push(this.records,records),this.dirty=!0},remove:function(records){Ext.isArray(records)||(records=[records]);var i,len=records.length;for(i=0;i<len;++i)Ext.Array.remove(this.records,records[i]);this.dirty=!0},isDirty:function(){return this.dirty},hasAggregate:function(){return!!this.aggregate},setDirty:function(){this.dirty=!0},commit:function(){this.dirty=!1},isCollapsed:function(){return this.collapsed},getAggregateRecord:function(forceNew){var Model,me=this;return!0!==forceNew&&!me.dirty&&me.aggregate||(Model=me.store.model,me.aggregate=new Model,me.aggregate.isSummary=!0),me.aggregate}});Ext.define("Ext.data.Store",{extend:"Ext.data.AbstractStore",alias:"store.store",requires:["Ext.data.StoreManager","Ext.data.Model","Ext.data.proxy.Ajax","Ext.data.proxy.Memory","Ext.data.reader.Json","Ext.data.writer.Json","Ext.data.PageMap","Ext.data.Group"],uses:["Ext.ModelManager","Ext.util.Grouper"],remoteSort:!1,remoteFilter:!1,remoteGroup:!1,groupField:void 0,groupDir:"ASC",trailingBufferZone:25,leadingBufferZone:200,pageSize:void 0,currentPage:1,clearOnPageLoad:!0,loading:!1,sortOnFilter:!0,buffered:!1,purgePageCount:5,clearRemovedOnLoad:!0,defaultPageSize:25,defaultViewSize:100,addRecordsOptions:{addRecords:!0},statics:{recordIdFn:function(record){return record.internalId},recordIndexFn:function(record){return record.index},grouperIdFn:function(grouper){return grouper.id||grouper.property},groupIdFn:function(group){return group.key}},constructor:function(config){config=Ext.apply({},config);var proxy,data,me=this,groupers=config.groupers||me.groupers,groupField=config.groupField||me.groupField;data=config.data||me.data,data&&(me.inlineData=data,delete config.data),!groupers&&groupField&&(groupers=[{property:groupField,direction:config.groupDir||me.groupDir}],(config.getGroupString||me.getGroupString!==Ext.data.Store.prototype.getGroupString)&&(groupers[0].getGroupString=function(record){return me.getGroupString(record)})),delete config.groupers,me.groupers=new Ext.util.MixedCollection(!1,Ext.data.Store.grouperIdFn),me.groupers.addAll(me.decodeGroupers(groupers)),me.groups=new Ext.util.MixedCollection(!1,Ext.data.Store.groupIdFn),me.callParent([config]),me.buffered?(me.data=new Ext.data.PageMap({store:me,keyFn:Ext.data.Store.recordIdFn,pageSize:me.pageSize,maxSize:me.purgePageCount,listeners:{clear:me.onPageMapClear,scope:me}}),me.pageRequests={},me.remoteSort=me.remoteGroup=me.remoteFilter=!0,me.sortOnLoad=!1,me.filterOnLoad=!1):me.data=new Ext.util.MixedCollection({getKey:Ext.data.Store.recordIdFn,maintainIndices:!0}),me.remoteGroup&&(me.remoteSort=!0),me.sorters.insert(0,me.groupers.getRange()),proxy=me.proxy,data=me.inlineData,me.buffered||me.pageSize||(me.pageSize=me.defaultPageSize),data?(proxy instanceof Ext.data.proxy.Memory?(proxy.data=data,me.read()):me.add.apply(me,[data]),me.sorters.items.length&&!me.remoteSort&&me.group(null,null,!0),delete me.inlineData):me.autoLoad&&Ext.defer(me.load,1,me,["object"==typeof me.autoLoad?me.autoLoad:void 0])},onBeforeSort:function(){var groupers=this.groupers;groupers.getCount()>0&&this.sort(groupers.items,"prepend",!1)},decodeGroupers:function(groupers){Ext.isArray(groupers)||(groupers=void 0===groupers?[]:[groupers]);var config,i,length=groupers.length,Grouper=Ext.util.Grouper,result=[];for(i=0;i<length;i++)config=groupers[i],config instanceof Grouper?result.push(config):(Ext.isString(config)&&(config={property:config}),config=Ext.apply({root:"data",direction:"ASC"},config),config.fn&&(config.sorterFn=config.fn),"function"==typeof config&&(config={sorterFn:config}),result.push(new Grouper(config)));return result},group:function(groupers,direction,suppressEvent){var grouper,newGroupers,me=this;groupers&&(me.sorters.removeAll(me.groupers.items),Ext.isArray(groupers)?newGroupers=groupers:Ext.isObject(groupers)?newGroupers=[groupers]:Ext.isString(groupers)&&(grouper=me.groupers.get(groupers),grouper?void 0===direction?grouper.toggle():grouper.setDirection(direction):(grouper={property:groupers,direction:direction||"ASC"},newGroupers=[grouper])),newGroupers&&newGroupers.length&&(me.groupers.clear(),me.groupers.addAll(me.decodeGroupers(newGroupers))),me.sorters.insert(0,me.groupers.items)),me.remoteGroup?me.buffered?(me.data.clear(),me.loadPage(1,{groupChange:!0})):me.load({scope:me,callback:suppressEvent?null:me.fireGroupChange}):(me.doSort(me.generateComparator()),me.constructGroups(),suppressEvent||me.fireGroupChange())},getGroupField:function(){var group,first=this.groupers.first();return first&&(group=first.property),group},constructGroups:function(){var groupValue,i,group,rec,me=this,data=this.data.items,len=data.length,groups=me.groups;if(groups.clear(),me.isGrouped())for(i=0;i<len;++i)rec=data[i],groupValue=me.getGroupString(rec),group=groups.get(groupValue),group||(group=new Ext.data.Group({key:groupValue,store:me}),groups.add(group)),group.add(rec)},clearGrouping:function(){var g,me=this,groupers=me.groupers.items,gLen=groupers.length;for(g=0;g<gLen;g++)me.sorters.remove(groupers[g]);me.groupers.clear(),me.remoteGroup?me.buffered?(me.data.clear(),me.loadPage(1,{groupChange:!0})):me.load({scope:me,callback:me.fireGroupChange}):(me.groups.clear(),me.sorters.length?me.sort():(me.fireEvent("datachanged",me),me.fireEvent("refresh",me)),me.fireGroupChange())},isGrouped:function(){return this.groupers.getCount()>0},fireGroupChange:function(){this.fireEvent("groupchange",this,this.groupers)},getGroups:function(requestGroupString){var record,groupStr,group,i,records=this.data.items,length=records.length,groups=[],pointers={};for(i=0;i<length;i++)record=records[i],groupStr=this.getGroupString(record),group=pointers[groupStr],void 0===group&&(group={name:groupStr,children:[]},groups.push(group),pointers[groupStr]=group),group.children.push(record);return requestGroupString?pointers[requestGroupString]:groups},getGroupsForGrouper:function(records,grouper){var oldValue,newValue,record,group,i,length=records.length,groups=[];for(i=0;i<length;i++)record=records[i],newValue=grouper.getGroupString(record),newValue!==oldValue&&(group={name:newValue,grouper:grouper,records:[]},groups.push(group)),group.records.push(record),oldValue=newValue;return groups},getGroupsForGrouperIndex:function(records,grouperIndex){var i,me=this,groupers=me.groupers,grouper=groupers.getAt(grouperIndex),groups=me.getGroupsForGrouper(records,grouper),length=groups.length;if(grouperIndex+1<groupers.length)for(i=0;i<length;i++)groups[i].children=me.getGroupsForGrouperIndex(groups[i].records,grouperIndex+1);for(i=0;i<length;i++)groups[i].depth=grouperIndex;return groups},getGroupData:function(sort){var me=this;return!1!==sort&&me.sort(),me.getGroupsForGrouperIndex(me.data.items,0)},getGroupString:function(instance){var group=this.groupers.first();return group?group.getGroupString(instance):""},insert:function(index,records){var i,len,record,out,me=this,sync=!1,defaults=me.modelDefaults;if(out=Ext.isIterable(records)?[]:records=[records],len=records.length){for(i=0;i<len;i++)record=records[i],record.isModel||(record=me.createModel(record)),out[i]=record,defaults&&record.set(defaults),record.join(me),sync=sync||!0===record.phantom;me.data.insert(index,out),me.snapshot&&me.snapshot.addAll(out),me.requireSort&&(me.suspendEvents(),me.sort(),me.resumeEvents()),me.isGrouped()&&me.updateGroupsOnAdd(out),me.fireEvent("add",me,out,index),me.fireEvent("datachanged",me),me.autoSync&&sync&&!me.autoSyncSuspended&&me.sync()}return out},updateGroupsOnAdd:function(records){var i,groupName,group,rec,me=this,groups=me.groups,len=records.length;for(i=0;i<len;++i)rec=records[i],groupName=me.getGroupString(rec),group=groups.getByKey(groupName),group||(group=groups.add(new Ext.data.Group({key:groupName,store:me}))),group.add(rec)},updateGroupsOnRemove:function(records){var i,groupName,group,rec,me=this,groups=me.groups,len=records.length;for(i=0;i<len;++i)rec=records[i],groupName=me.getGroupString(rec),(group=groups.getByKey(groupName))&&(group.remove(rec),0===group.records.length&&groups.remove(group))},updateGroupsOnUpdate:function(record,modifiedFieldNames){var len,i,items,group,me=this,groupField=me.getGroupField(),groupName=me.getGroupString(record),groups=me.groups;if(modifiedFieldNames&&Ext.Array.contains(modifiedFieldNames,groupField)){for(me.buffered&&Ext.Error.raise({msg:"Cannot move records between groups in a buffered store record"}),items=groups.items,i=0,len=items.length;i<len;++i)if(group=items[i],group.contains(record)){group.remove(record);break}group=groups.getByKey(groupName),group||(group=groups.add(new Ext.data.Group({key:groupName,store:me}))),group.add(record),me.data.remove(record),me.data.insert(me.data.findInsertionIndex(record,me.generateComparator()),record)}else groups.getByKey(groupName).setDirty()},add:function(arg){var records,length,isSorted,me=this;return me.buffered&&Ext.Error.raise({msg:"add method may not be called on a buffered store"}),records=Ext.isArray(arg)?arg:arguments,length=records.length,(isSorted=!me.remoteSort&&me.sorters&&me.sorters.items.length)&&1===length?[me.addSorted(me.createModel(records[0]))]:(isSorted&&(me.requireSort=!0),records=me.insert(me.data.length,records),delete me.requireSort,records)},addSorted:function(record){var me=this,index=me.data.findInsertionIndex(record,me.generateComparator());return me.insert(index,record),record},createModel:function(record){return record.isModel||(record=Ext.ModelManager.create(record,this.model)),record},onUpdate:function(record,type,modifiedFieldNames){this.isGrouped()&&this.updateGroupsOnUpdate(record,modifiedFieldNames)},each:function(fn,scope){var record,d,data=this.data.items,dLen=data.length;for(d=0;d<dLen&&(record=data[d],!1!==fn.call(scope||record,record,d,dLen));d++);},remove:function(records,isMove,silent){isMove=!0===isMove;var length,item,isNotPhantom,index,record,removeRange,removeCount,me=this,sync=!1,snapshot=me.snapshot,data=me.data,i=0,info=[],allRecords=[],indexes=[],fireRemoveEvent=!silent&&me.hasListeners.remove;if(records.isModel?(records=[records],length=1):Ext.isIterable(records)?length=records.length:"object"==typeof records&&(removeRange=!0,i=records.start,length=records.end+1,removeCount=length-i),!removeRange){for(i=0;i<length;++i)record=records[i],"number"==typeof record?(index=record,record=data.getAt(index)):index=me.indexOf(record),record&&index>-1&&info.push({record:record,index:index}),snapshot&&snapshot.remove(record);info=Ext.Array.sort(info,function(o1,o2){var index1=o1.index,index2=o2.index;return index1===o2.index2?0:index1<index2?-1:1}),i=0,length=info.length}if(length){for(;i<length;i++)removeRange?(record=data.getAt(i),index=i):(item=info[i],record=item.record,index=item.index),allRecords.push(record),indexes.push(index),isNotPhantom=!0!==record.phantom,!isMove&&isNotPhantom&&(record.removedFrom=index,me.removed.push(record)),record.unjoin(me),index-=i,sync=sync||isNotPhantom,removeRange||(data.removeAt(index),fireRemoveEvent&&me.fireEvent("remove",me,record,index,!!isMove));removeRange&&data.removeRange(records.start,removeCount),silent||(me.fireEvent("bulkremove",me,allRecords,indexes,!!isMove),me.fireEvent("datachanged",me)),!isMove&&me.autoSync&&sync&&!me.autoSyncSuspended&&me.sync()}},removeAt:function(index,count){var me=this,storeCount=me.getCount();index<=storeCount&&(1===arguments.length?me.remove([index]):count&&me.remove({start:index,end:Math.min(index+count,storeCount)-1}))},removeAll:function(silent){var me=this,snapshot=me.snapshot,data=me.data;snapshot&&snapshot.removeAll(data.getRange()),me.buffered?data&&(silent&&me.suspendEvent("clear"),data.clear(),silent&&me.resumeEvent("clear")):(me.remove({start:0,end:me.getCount()-1},!1,silent),!0!==silent&&me.fireEvent("clear",me))},load:function(options){var me=this;return options="function"==typeof options?{callback:options}:Ext.apply({},options),me.remoteGroup&&!options.groupers&&me.groupers.items.length&&(options.groupers=me.groupers.items),options.page=options.page||me.currentPage,options.start=void 0!==options.start?options.start:(options.page-1)*me.pageSize,options.limit=options.limit||me.pageSize,options.addRecords=options.addRecords||!1,me.buffered?(options.limit=me.viewSize||me.defaultViewSize,options.loadCallback=options.callback,delete options.callback,me.loadToPrefetch(options)):me.callParent([options])},reload:function(options){var startIdx,endIdx,startPage,endPage,i,waitForReload,bufferZone,records,me=this;if(options||(options={}),!me.buffered)return me.callParent(arguments);if(delete me.totalCount,me.data.clear(!0),waitForReload=function(){me.rangeCached(startIdx,endIdx)&&(me.loading=!1,me.data.un("pageAdded",waitForReload),records=me.data.getRange(startIdx,endIdx),me.fireEvent("load",me,records,!0))},bufferZone=Math.ceil((me.leadingBufferZone+me.trailingBufferZone)/2),me.lastRequestStart?(startIdx=me.lastRequestStart,endIdx=me.lastRequestEnd):(startIdx=options.start||0,endIdx=startIdx+(options.count||me.pageSize)-1),startPage=me.getPageFromRecordIndex(Math.max(startIdx-bufferZone,0)),endPage=me.getPageFromRecordIndex(endIdx+bufferZone),!1!==me.fireEvent("beforeload",me,options))for(me.loading=!0,me.data.on("pageAdded",waitForReload),i=startPage;i<=endPage;i++)me.prefetchPage(i,options)},onProxyLoad:function(operation){var me=this,resultSet=operation.getResultSet(),records=operation.getRecords(),successful=operation.wasSuccessful();me.isDestroyed||(resultSet&&(me.totalCount=resultSet.total),me.loading=!1,successful&&me.loadRecords(records,operation),me.hasListeners.load&&me.fireEvent("load",me,records,successful),me.hasListeners.read&&me.fireEvent("read",me,records,successful),Ext.callback(operation.callback,operation.scope||me,[records,operation,successful]))},getNewRecords:function(){return(this.snapshot||this.data).filterBy(this.filterNew).items},getUpdatedRecords:function(){return(this.snapshot||this.data).filterBy(this.filterUpdated).items},filter:function(filters,value){Ext.isString(filters)&&(filters={property:filters,value:value});var i,me=this,decoded=me.decodeFilters(filters),doLocalSort=me.sorters.length&&me.sortOnFilter&&!me.remoteSort,length=decoded.length;for(i=0;i<length;i++)me.filters.replace(decoded[i]);filters=me.filters.items,filters.length&&(me.remoteFilter?(delete me.totalCount,me.buffered?(me.data.clear(),me.loadPage(1)):(me.currentPage=1,me.load())):(me.snapshot=me.snapshot||me.data.clone(),me.data=me.snapshot.filter(filters),me.constructGroups(),doLocalSort?me.sort():(me.fireEvent("datachanged",me),me.fireEvent("refresh",me))),me.fireEvent("filterchange",me,filters))},clearFilter:function(suppressEvent){var me=this;if(me.filters.clear(),me.remoteFilter){if(suppressEvent)return;delete me.totalCount,me.buffered?(me.data.clear(),me.loadPage(1)):(me.currentPage=1,me.load())}else me.isFiltered()&&(me.data=me.snapshot,delete me.snapshot,me.constructGroups(),!0!==suppressEvent&&(me.fireEvent("datachanged",me),me.fireEvent("refresh",me)));me.fireEvent("filterchange",me,me.filters.items)},removeFilter:function(toRemove,applyFilters){var me=this;!me.remoteFilter&&me.isFiltered()&&(toRemove instanceof Ext.util.Filter?me.filters.remove(toRemove):me.filters.removeAtKey(toRemove),!1!==applyFilters?me.filters.length?me.filter():me.clearFilter():me.fireEvent("filterchange",me,me.filters.items))},addFilter:function(filters,applyFilters){var decoded,i,length,me=this;for(decoded=me.decodeFilters(filters),length=decoded.length,i=0;i<length;i++)me.filters.replace(decoded[i]);!1!==applyFilters&&me.filters.length?me.filter():me.fireEvent("filterchange",me,me.filters.items)},isFiltered:function(){var snapshot=this.snapshot;return!(!snapshot||snapshot===this.data)},filterBy:function(fn,scope){var me=this;me.snapshot=me.snapshot||me.data.clone(),me.data=me.queryBy(fn,scope||me),me.fireEvent("datachanged",me),me.fireEvent("refresh",me)},queryBy:function(fn,scope){var me=this;return(me.snapshot||me.data).filterBy(fn,scope||me)},query:function(property,value,anyMatch,caseSensitive,exactMatch){var me=this,queryFn=me.createFilterFn(property,value,anyMatch,caseSensitive,exactMatch),results=me.queryBy(queryFn);return results||(results=new Ext.util.MixedCollection),results},loadData:function(data,append){var i,length=data.length,newData=[];for(i=0;i<length;i++)newData.push(this.createModel(data[i]));this.loadRecords(newData,append?this.addRecordsOptions:void 0)},loadRawData:function(data,append){var me=this,result=me.proxy.reader.read(data),records=result.records;result.success&&(me.totalCount=result.total,me.loadRecords(records,append?me.addRecordsOptions:void 0))},loadRecords:function(records,options){var start,addRecords,me=this,i=0,length=records.length,snapshot=me.snapshot;if(options&&(start=options.start,addRecords=options.addRecords),addRecords?snapshot&&snapshot.addAll(records):(delete me.snapshot,me.clearData(!0)),me.data.addAll(records),void 0!==start)for(;i<length;i++)records[i].index=start+i,records[i].join(me);else for(;i<length;i++)records[i].join(me);me.suspendEvents(),me.filterOnLoad&&!me.remoteFilter&&me.filter(),me.sortOnLoad&&!me.remoteSort&&me.sort(void 0,void 0,void 0,!0),me.resumeEvents(),me.isGrouped()&&me.constructGroups(),me.fireEvent("datachanged",me),me.fireEvent("refresh",me)},loadPage:function(page,options){var me=this;if(me.currentPage=page,options=Ext.apply({page:page,start:(page-1)*me.pageSize,limit:me.pageSize,addRecords:!me.clearOnPageLoad},options),me.buffered)return options.limit=me.viewSize||me.defaultViewSize,options.loadCallback=options.callback,delete options.callback,me.loadToPrefetch(options);me.read(options)},nextPage:function(options){this.loadPage(this.currentPage+1,options)},previousPage:function(options){this.loadPage(this.currentPage-1,options)},clearData:function(isLoad){var records,i,me=this;if(!me.buffered&&me.data)for(records=me.data.items,i=records.length;i--;)records[i].unjoin(me);me.data&&me.data.clear(),(!0!==isLoad||me.clearRemovedOnLoad)&&(me.removed.length=0)},loadToPrefetch:function(options){var i,records,dataSetSize,operation,me=this,prefetchOptions=options,startIdx=options.start,endIdx=options.start+options.limit-1,loadEndIdx=Math.min(endIdx,options.start+(me.viewSize||options.limit)-1),startPage=me.getPageFromRecordIndex(Math.max(startIdx-me.trailingBufferZone,0)),endPage=me.getPageFromRecordIndex(endIdx+me.leadingBufferZone),waitForRequestedRange=function(){me.rangeCached(startIdx,loadEndIdx)&&(me.loading=!1,records=me.data.getRange(startIdx,loadEndIdx),me.data.un("pageAdded",waitForRequestedRange),me.hasListeners.guaranteedrange&&me.guaranteeRange(startIdx,loadEndIdx,options.callback,options.scope),options.loadCallback&&options.loadCallback.call(options.scope||me,records,operation,!0),options.callback&&options.callback.call(options.scope||me,records,startIdx,endIdx,options),me.fireEvent("datachanged",me),me.fireEvent("refresh",me),me.fireEvent("load",me,records,!0),options.groupChange&&me.fireGroupChange())};!isNaN(me.pageSize)&&me.pageSize||Ext.Error.raise("Buffered store configured without a pageSize",me),!1!==me.fireEvent("beforeload",me,options)&&(delete me.totalCount,me.loading=!0,options.callback&&(prefetchOptions=Ext.apply({},options),delete prefetchOptions.callback),me.on("prefetch",function(store,records,successful,op){if(successful)if(operation=op,dataSetSize=me.getTotalCount())for(me.data.on("pageAdded",waitForRequestedRange),loadEndIdx=Math.min(loadEndIdx,dataSetSize-1),endPage=me.getPageFromRecordIndex(Math.min(loadEndIdx+me.leadingBufferZone,dataSetSize-1)),i=startPage+1;i<=endPage;++i)me.prefetchPage(i,prefetchOptions);else me.fireEvent("datachanged",me),me.fireEvent("refresh",me),me.fireEvent("load",me,records,!0);else me.fireEvent("load",me,records,!1)},null,{single:!0}),me.prefetchPage(startPage,prefetchOptions))},prefetch:function(options){var proxy,operation,me=this,pageSize=me.pageSize;return pageSize?(me.lastPageSize&&pageSize!=me.lastPageSize&&Ext.Error.raise("pageSize cannot be dynamically altered"),me.data.pageSize||(me.data.pageSize=pageSize)):me.pageSize=me.data.pageSize=pageSize=options.limit,me.lastPageSize=pageSize,options.page||(options.page=me.getPageFromRecordIndex(options.start),options.start=(options.page-1)*pageSize,options.limit=Math.ceil(options.limit/pageSize)*pageSize),me.pageRequests[options.page]||(options=Ext.apply({action:"read",filters:me.filters.items,sorters:me.sorters.items,groupers:me.groupers.items,pageMapGeneration:me.data.pageMapGeneration},options),operation=new Ext.data.Operation(options),!1!==me.fireEvent("beforeprefetch",me,operation)&&(proxy=me.proxy,me.pageRequests[options.page]=proxy.read(operation,me.onProxyPrefetch,me),proxy.isSynchronous&&delete me.pageRequests[options.page])),me},onPageMapClear:function(){var req,page,me=this,loadingFlag=me.wasLoading,reqs=me.pageRequests;me.data.events.pageadded&&me.data.events.pageadded.clearListeners(),me.loading=!0,me.totalCount=0;for(page in reqs)reqs.hasOwnProperty(page)&&(req=reqs[page],delete reqs[page],delete req.callback);me.fireEvent("clear",me),me.loading=loadingFlag},prefetchPage:function(page,options){var me=this,pageSize=me.pageSize||me.defaultPageSize,start=(page-1)*me.pageSize,total=me.totalCount;void 0!==total&&me.getCount()===total||me.prefetch(Ext.applyIf({page:page,start:start,limit:pageSize},options))},onProxyPrefetch:function(operation){var me=this,resultSet=operation.getResultSet(),records=operation.getRecords(),successful=operation.wasSuccessful(),page=operation.page;operation.pageMapGeneration===me.data.pageMapGeneration&&(resultSet&&(me.totalCount=resultSet.total,me.fireEvent("totalcountchange",me.totalCount)),void 0!==page&&delete me.pageRequests[page],me.loading=!1,me.fireEvent("prefetch",me,records,successful,operation),successful&&me.cachePage(records,operation.page),Ext.callback(operation.callback,operation.scope||me,[records,operation,successful]))},cachePage:function(records,page){var i,me=this,len=records.length;for(Ext.isDefined(me.totalCount)||(me.totalCount=records.length,me.fireEvent("totalcountchange",me.totalCount)),i=0;i<len;i++)records[i].join(me);me.data.addPage(page,records)},rangeCached:function(start,end){return this.data&&this.data.hasRange(start,end)},pageCached:function(page){return this.data&&this.data.hasPage(page)},pagePending:function(page){return!!this.pageRequests[page]},rangeSatisfied:function(start,end){return this.rangeCached(start,end)},getPageFromRecordIndex:function(index){return Math.floor(index/this.pageSize)+1},onGuaranteedRange:function(options){var range,me=this,totalCount=me.getTotalCount(),start=options.prefetchStart,end=options.prefetchEnd>totalCount-1?totalCount-1:options.prefetchEnd;end=Math.max(0,end),start>end&&Ext.log({level:"warn",msg:"Start ("+start+") was greater than end ("+end+") for the range of records requested ("+start+"-"+options.prefetchEnd+")"+(this.storeId?' from store "'+this.storeId+'"':"")}),range=me.data.getRange(start,end),!1!==options.fireEvent&&me.fireEvent("guaranteedrange",range,start,end,options),options.callback&&options.callback.call(options.scope||me,range,start,end,options)},guaranteeRange:function(start,end,callback,scope,options){options=Ext.apply({callback:callback,scope:scope},options),this.getRange(start,end,options)},prefetchRange:function(start,end){var startPage,endPage,page,me=this;if(!me.rangeCached(start,end))for(startPage=me.getPageFromRecordIndex(start),endPage=me.getPageFromRecordIndex(end),me.data.maxSize=me.purgePageCount?endPage-startPage+1+me.purgePageCount:0,page=startPage;page<=endPage;page++)me.pageCached(page)||me.prefetchPage(page)},primeCache:function(start,end,direction){var me=this;-1===direction?(start=Math.max(start-me.leadingBufferZone,0),end=Math.min(end+me.trailingBufferZone,me.totalCount-1)):1===direction?(start=Math.max(Math.min(start-me.trailingBufferZone,me.totalCount-me.pageSize),0),end=Math.min(end+me.leadingBufferZone,me.totalCount-1)):(start=Math.min(Math.max(Math.floor(start-(me.leadingBufferZone+me.trailingBufferZone)/2),0),me.totalCount-me.pageSize),end=Math.min(Math.max(Math.ceil(end+(me.leadingBufferZone+me.trailingBufferZone)/2),0),me.totalCount-1)),me.prefetchRange(start,end)},sort:function(sorters){var me=this;return sorters&&me.buffered&&me.remoteSort&&me.data.clear(),me.callParent(arguments)},doSort:function(sorterFn){var range,ln,i,me=this;if(me.remoteSort)me.buffered?(me.data.clear(),me.loadPage(1)):me.load();else{if(me.buffered&&Ext.Error.raise({msg:"Local sorting may not be used on a buffered store"}),me.data.sortBy(sorterFn),!me.buffered)for(range=me.getRange(),ln=range.length,i=0;i<ln;i++)range[i].index=i;me.fireEvent("datachanged",me),me.fireEvent("refresh",me)}},find:function(property,value,start,anyMatch,caseSensitive,exactMatch){var fn=this.createFilterFn(property,value,anyMatch,caseSensitive,exactMatch);return fn?this.data.findIndexBy(fn,null,start):-1},findRecord:function(){var me=this,index=me.find.apply(me,arguments);return-1!==index?me.getAt(index):null},createFilterFn:function(property,value,anyMatch,caseSensitive,exactMatch){return!Ext.isEmpty(value)&&(value=Ext.util.AbstractMixedCollection.prototype.createValueMatcher(value,anyMatch,caseSensitive,exactMatch),function(r){return value.test(r.data[property])})},findExact:function(property,value,start){return this.data.findIndexBy(function(rec){return rec.isEqual(rec.get(property),value)},this,start)},findBy:function(fn,scope,start){return this.data.findIndexBy(fn,scope,start)},collect:function(dataIndex,allowNull,bypassFilter){var me=this;return(!0===bypassFilter&&me.snapshot?me.snapshot:me.data).collect(dataIndex,"data",allowNull)},getCount:function(){return this.data.getCount()},getTotalCount:function(){return this.totalCount||0},getAt:function(index){return this.data.getAt(index)},getRange:function(start,end,options){options&&options.cb&&(options.callback=options.cb,Ext.Error.raise({msg:"guaranteeRange options.cb is deprecated, use options.callback"}));var requiredStart,requiredEnd,pageAddHandler,result,me=this,maxIndex=me.totalCount-1,lastRequestStart=me.lastRequestStart;return options=Ext.apply({prefetchStart:start,prefetchEnd:end},options),me.buffered?(end=end>=me.totalCount?maxIndex:end,requiredStart=0===start?0:start-1,requiredEnd=end===maxIndex?end:end+1,me.lastRequestStart=start,me.lastRequestEnd=end,me.rangeCached(requiredStart,requiredEnd)?(me.onGuaranteedRange(options),result=me.data.getRange(start,end)):(me.fireEvent("cachemiss",me,start,end),pageAddHandler=function(page,records){me.rangeCached(requiredStart,requiredEnd)&&(me.fireEvent("cachefilled",me,start,end),me.data.un("pageAdded",pageAddHandler),me.onGuaranteedRange(options))},me.data.on("pageAdded",pageAddHandler),me.prefetchRange(start,end)),me.primeCache(start,end,start<lastRequestStart?-1:1)):(result=me.data.getRange(start,end),options.callback&&options.callback.call(options.scope||me,result,start,end,options)),result},getById:function(id){var result=(this.snapshot||this.data).findBy(function(record){return record.getId()===id});return this.buffered&&!result&&Ext.Error.raise("getById called for ID that is not present in local cache"),result},getByInternalId:function(internalId){var result;return this.buffered?(result=(this.snapshot||this.data).findBy(function(record){return record.internalId===internalId}))||Ext.Error.raise("getByInternalId called for internalId that is not present in local cache"):result=this.data.get(internalId),result},indexOf:function(record){return this.data.indexOf(record)},indexOfTotal:function(record){var index=record.index;return index||0===index?index:this.indexOf(record)},indexOfId:function(id){return this.indexOf(this.getById(id))},first:function(grouped){var me=this;return grouped&&me.isGrouped()?me.aggregate(function(records){return records.length?records[0]:void 0},me,!0):me.data.first()},last:function(grouped){var me=this;return grouped&&me.isGrouped()?me.aggregate(function(records){var len=records.length;return len?records[len-1]:void 0},me,!0):me.data.last()},sum:function(field,grouped){var me=this;return grouped&&me.isGrouped()?me.aggregate(me.getSum,me,!0,[field]):me.getSum(me.data.items,field)},getSum:function(records,field){for(var total=0,i=0,len=records.length;i<len;++i)total+=records[i].get(field);return total},count:function(grouped){var me=this;return grouped&&me.isGrouped()?me.aggregate(function(records){return records.length},me,!0):me.getCount()},min:function(field,grouped){var me=this;return grouped&&me.isGrouped()?me.aggregate(me.getMin,me,!0,[field]):me.getMin(me.data.items,field)},getMin:function(records,field){var value,min,i=1,len=records.length;for(len>0&&(min=records[0].get(field));i<len;++i)(value=records[i].get(field))<min&&(min=value);return min},max:function(field,grouped){var me=this;return grouped&&me.isGrouped()?me.aggregate(me.getMax,me,!0,[field]):me.getMax(me.data.items,field)},getMax:function(records,field){var value,max,i=1,len=records.length;for(len>0&&(max=records[0].get(field));i<len;++i)(value=records[i].get(field))>max&&(max=value);return max},average:function(field,grouped){var me=this;return grouped&&me.isGrouped()?me.aggregate(me.getAverage,me,!0,[field]):me.getAverage(me.data.items,field)},getAverage:function(records,field){var i=0,len=records.length,sum=0;if(records.length>0){for(;i<len;++i)sum+=records[i].get(field);return sum/len}return 0},aggregate:function(fn,scope,grouped,args){if(args=args||[],grouped&&this.isGrouped()){var group,i,groups=this.getGroups(),len=groups.length,out={};for(i=0;i<len;++i)group=groups[i],out[group.name]=this.getAggregate(fn,scope||this,group.children,args);return out}return this.getAggregate(fn,scope,this.data.items,args)},getAggregate:function(fn,scope,records,args){return args=args||[],fn.apply(scope||this,[records].concat(args))},onIdChanged:function(rec,oldId,newId,oldInternalId){var snapshot=this.snapshot;snapshot&&snapshot.updateKey(oldInternalId,newId),this.data.updateKey(oldInternalId,newId),this.callParent(arguments)},commitChanges:function(){for(var me=this,recs=me.getModifiedRecords(),len=recs.length,i=0;i<len;i++)recs[i].commit();me.removed.length=0},filterNewOnly:function(item){return!0===item.phantom},getRejectRecords:function(){return Ext.Array.push(this.data.filterBy(this.filterNewOnly).items,this.getUpdatedRecords())},rejectChanges:function(){for(var rec,me=this,recs=me.getRejectRecords(),len=recs.length,i=0;i<len;i++)rec=recs[i],rec.reject(),rec.phantom&&me.remove(rec);for(recs=me.removed,len=recs.length,i=len-1;i>=0;i--)rec=recs[i],me.insert(rec.removedFrom||0,rec),rec.reject();me.removed.length=0}},function(){Ext.regStore("ext-empty-store",{fields:[],proxy:"memory"})});Ext.define("Ext.data.reader.Array",{extend:"Ext.data.reader.Json",alternateClassName:"Ext.data.ArrayReader",alias:"reader.array",totalProperty:void 0,successProperty:void 0,createFieldAccessExpression:function(field,fieldVarName,dataName){var result,index=null==field.mapping?field.originalIndex:field.mapping;return"function"==typeof index?result=fieldVarName+".mapping("+dataName+", this)":(isNaN(index)&&(index='"'+index+'"'),result=dataName+"["+index+"]"),result}});Ext.define("Ext.data.ArrayStore",{extend:"Ext.data.Store",alias:"store.array",requires:["Ext.data.proxy.Memory","Ext.data.reader.Array"],constructor:function(config){config=Ext.apply({proxy:{type:"memory",reader:"array"}},config),this.callParent([config])},loadData:function(data,append){if(!0===this.expandData){for(var r=[],i=0,ln=data.length;i<ln;i++)r[r.length]=[data[i]];data=r}this.callParent([data,append])}},function(){Ext.data.SimpleStore=Ext.data.ArrayStore});Ext.define("Ext.data.Batch",{mixins:{observable:"Ext.util.Observable"},autoStart:!1,pauseOnException:!1,current:-1,total:0,isRunning:!1,isComplete:!1,hasException:!1,constructor:function(config){var me=this;me.mixins.observable.constructor.call(me,config),me.operations=[],me.exceptions=[]},add:function(operation){return this.total++,operation.setBatch(this),this.operations.push(operation),this},start:function(index){var me=this;return me.isRunning?me:(me.exceptions.length=0,me.hasException=!1,me.isRunning=!0,me.runOperation(Ext.isDefined(index)?index:me.current+1))},retry:function(){return this.start(this.current)},runNextOperation:function(){return this.runOperation(this.current+1)},pause:function(){return this.isRunning=!1,this},runOperation:function(index){var onProxyReturn,me=this,operations=me.operations,operation=operations[index];return void 0===operation?(me.isRunning=!1,me.isComplete=!0,me.fireEvent("complete",me,operations[operations.length-1])):(me.current=index,onProxyReturn=function(operation){var hasException=operation.hasException();hasException&&(me.hasException=!0,me.exceptions.push(operation),me.fireEvent("exception",me,operation)),hasException&&me.pauseOnException?me.pause():(operation.setCompleted(),me.fireEvent("operationcomplete",me,operation),me.runNextOperation())},operation.setStarted(),me.proxy[operation.action](operation,onProxyReturn,me)),me}});Ext.define("Ext.direct.Manager",{singleton:!0,requires:["Ext.util.MixedCollection","Ext.app.domain.Direct"],mixins:{observable:"Ext.util.Observable"},exceptions:{TRANSPORT:"xhr",PARSE:"parse",DATA:"data",LOGIN:"login",SERVER:"exception"},constructor:function(){var me=this;me.addEvents("event","exception"),me.transactions=new Ext.util.MixedCollection,me.providers=new Ext.util.MixedCollection,me.mixins.observable.constructor.call(me)},addProvider:function(provider){var i,len,me=this,args=arguments,relayers=me.relayers||(me.relayers={});{if(!(args.length>1))return provider.isProvider||(provider=Ext.create("direct."+provider.type+"provider",provider)),me.providers.add(provider),provider.on("data",me.onProviderData,me),provider.relayedEvents&&(relayers[provider.id]=me.relayEvents(provider,provider.relayedEvents)),provider.isConnected()||provider.connect(),provider;for(i=0,len=args.length;i<len;++i)me.addProvider(args[i])}},getProvider:function(id){return id.isProvider?id:this.providers.get(id)},removeProvider:function(provider){var id,me=this,providers=me.providers,relayers=me.relayers;return provider=provider.isProvider?provider:providers.get(provider),provider?(provider.un("data",me.onProviderData,me),id=provider.id,relayers[id]&&(relayers[id].destroy(),delete relayers[id]),providers.remove(provider),provider):null},addTransaction:function(transaction){return this.transactions.add(transaction),transaction},removeTransaction:function(transaction){var me=this;return transaction=me.getTransaction(transaction),me.transactions.remove(transaction),transaction},getTransaction:function(transaction){return"object"==typeof transaction?transaction:this.transactions.get(transaction)},onProviderData:function(provider,event){var i,len,me=this;if(Ext.isArray(event))for(i=0,len=event.length;i<len;++i)me.onProviderData(provider,event[i]);else event.name&&"event"!=event.name&&"exception"!=event.name?me.fireEvent(event.name,event):!1===event.status&&me.fireEvent("exception",event),me.fireEvent("event",event,provider)},parseMethod:function(fn){if(Ext.isString(fn)){for(var parts=fn.split("."),i=0,len=parts.length,current=Ext.global;current&&i<len;)current=current[parts[i]],++i;fn=Ext.isFunction(current)?current:null}return fn||null}},function(){Ext.Direct=Ext.direct.Manager});Ext.define("Ext.data.NodeInterface",{requires:["Ext.data.Field","Ext.data.writer.Json"],statics:{decorate:function(modelClass){var idName,idField,idType;"string"==typeof modelClass?modelClass=Ext.ModelManager.getModel(modelClass):modelClass.isModel&&(modelClass=Ext.ModelManager.getModel(modelClass.modelName)),modelClass.prototype.isNode||(idName=modelClass.prototype.idProperty,idField=modelClass.prototype.fields.get(idName),idType=modelClass.prototype.fields.get(idName).type.type,modelClass.override(this.getPrototypeBody()),this.applyFields(modelClass,[{name:"parentId",type:idType,defaultValue:null,useNull:idField.useNull},{name:"index",type:"int",defaultValue:-1,persist:!1,convert:null},{name:"depth",type:"int",defaultValue:0,persist:!1,convert:null},{name:"expanded",type:"bool",defaultValue:!1,persist:!1,convert:null},{name:"expandable",type:"bool",defaultValue:!0,persist:!1,convert:null},{name:"checked",type:"auto",defaultValue:null,persist:!1,convert:null},{name:"leaf",type:"bool",defaultValue:!1},{name:"cls",type:"string",defaultValue:"",persist:!1,convert:null},{name:"iconCls",type:"string",defaultValue:"",persist:!1,convert:null},{name:"icon",type:"string",defaultValue:"",persist:!1,convert:null},{name:"root",type:"boolean",defaultValue:!1,persist:!1,convert:null},{name:"isLast",type:"boolean",defaultValue:!1,persist:!1,convert:null},{name:"isFirst",type:"boolean",defaultValue:!1,persist:!1,convert:null},{name:"allowDrop",type:"boolean",defaultValue:!0,persist:!1,convert:null},{name:"allowDrag",type:"boolean",defaultValue:!0,persist:!1,convert:null},{name:"loaded",type:"boolean",defaultValue:!1,persist:!1,convert:null},{name:"loading",type:"boolean",defaultValue:!1,persist:!1,convert:null},{name:"href",type:"string",defaultValue:"",persist:!1,convert:null},{name:"hrefTarget",type:"string",defaultValue:"",persist:!1,convert:null},{name:"qtip",type:"string",defaultValue:"",persist:!1,convert:null},{name:"qtitle",type:"string",defaultValue:"",persist:!1,convert:null},{name:"qshowDelay",type:"int",defaultValue:0,persist:!1,convert:null},{name:"children",type:"auto",defaultValue:null,persist:!1,convert:null}]))},applyFields:function(modelClass,addFields){var addField,i,modelPrototype=modelClass.prototype,fields=modelPrototype.fields,keys=fields.keys,ln=addFields.length;for(i=0;i<ln;i++)addField=addFields[i],Ext.Array.contains(keys,addField.name)||fields.add(new Ext.data.Field(addField))},getPrototypeBody:function(){var bubbledEvents={idchanged:!0,append:!0,remove:!0,bulkremove:!0,move:!0,insert:!0,beforeappend:!0,beforeremove:!0,beforemove:!0,beforeinsert:!0,expand:!0,collapse:!0,beforeexpand:!0,beforecollapse:!0,sort:!0,rootchange:!0};return{isNode:!0,constructor:function(){var me=this;return me.callParent(arguments),me.firstChild=me.lastChild=me.parentNode=me.previousSibling=me.nextSibling=null,me.childNodes=[],me},createNode:function(node){return node.isModel||(node=Ext.ModelManager.create(node,this.modelName)),node.childNodes||(node.firstChild=node.lastChild=node.parentNode=node.previousSibling=node.nextSibling=null,node.childNodes=[]),node},isLeaf:function(){return!0===this.get("leaf")},setFirstChild:function(node){this.firstChild=node},setLastChild:function(node){this.lastChild=node},updateInfo:function(commit,info){var i,propName,newValue,field,currentValue,key,settingIndexInNewParent,persistentField,me=this,oldDepth=me.data.depth,childInfo={},children=me.childNodes,childCount=children.length,phantom=me.phantom,dataObject=me[me.persistenceProperty],fields=me.fields,modified=me.modified,newParentId=info.parentId;info||Ext.Error.raise("NodeInterface expects update info to be passed");for(propName in info)if(field=fields.get(propName),newValue=info[propName],persistentField=field&&field.persist,currentValue=dataObject[propName],((settingIndexInNewParent=persistentField&&"index"===propName&&-1!==currentValue&&newParentId&&newParentId!==modified.parentId)||!me.isEqual(currentValue,newValue))&&(dataObject[propName]=newValue,persistentField))if(!settingIndexInNewParent&&modified.hasOwnProperty(propName)){if(me.isEqual(modified[propName],newValue)){delete modified[propName],me.dirty=!1;for(key in modified)if(modified.hasOwnProperty(key)){me.dirty=!0;break}}}else me.dirty=!0,modified[propName]=currentValue;if(commit&&(me.commit(),me.phantom=phantom),me.data.depth!==oldDepth)for(childInfo={depth:me.data.depth+1},i=0;i<childCount;i++)children[i].updateInfo(commit,childInfo)},isLast:function(){return this.get("isLast")},isFirst:function(){return this.get("isFirst")},hasChildNodes:function(){return!this.isLeaf()&&this.childNodes.length>0},isExpandable:function(){var me=this;return!!me.get("expandable")&&!(me.isLeaf()||me.isLoaded()&&!me.phantom&&!me.hasChildNodes())},triggerUIUpdate:function(){this.afterEdit([])},appendChild:function(node,suppressEvents,commit){var i,ln,index,oldParent,previousSibling,me=this,childInfo={isLast:!0,parentId:me.getId(),depth:(me.data.depth||0)+1};if(!Ext.isArray(node)){if(node=me.createNode(node),!0!==suppressEvents&&!1===me.fireEventArgs("beforeappend",[me,node]))return!1;if(index=me.childNodes.length,oldParent=node.parentNode){if(!0!==suppressEvents&&!1===node.fireEventArgs("beforemove",[node,oldParent,me,index]))return!1;oldParent.removeChild(node,!1,!1,!0)}return Ext.suspendLayouts(),index=me.childNodes.length,0===index&&me.setFirstChild(node),me.childNodes[index]=node,node.parentNode=me,node.nextSibling=null,me.setLastChild(node),previousSibling=me.childNodes[index-1],previousSibling?(node.previousSibling=previousSibling,previousSibling.nextSibling=node,previousSibling.updateInfo(commit,{isLast:!1}),previousSibling.triggerUIUpdate()):node.previousSibling=null,childInfo.isFirst=0===index,childInfo.index=index,node.updateInfo(commit,childInfo),me.isLoaded()?1===me.childNodes.length&&me.triggerUIUpdate():me.set("loaded",!0),index&&me.childNodes[index-1].isExpanded()&&me.childNodes[index-1].cascadeBy(me.triggerUIUpdate),!node.isLeaf()&&node.phantom&&node.set("loaded",!0),Ext.resumeLayouts(!0),!0!==suppressEvents&&(me.fireEventArgs("append",[me,node,index]),oldParent&&node.fireEventArgs("move",[node,oldParent,me,index])),node}for(me.callStore("suspendAutoSync"),i=0,ln=node.length-1;i<ln;i++)me.appendChild(node[i],suppressEvents,commit);me.callStore("resumeAutoSync"),me.appendChild(node[ln],suppressEvents,commit)},getOwnerTree:function(){for(var store,node=this;node.parentNode;)node=node.parentNode;if((store=node.store)&&(store.treeStore&&(store=store.treeStore),store.tree))return store.ownerTree},removeChild:function(node,destroy,suppressEvents,isMove){var i,childCount,previousSibling,me=this,index=me.indexOf(node);if(-1===index||!0!==suppressEvents&&!1===me.fireEventArgs("beforeremove",[me,node,!!isMove]))return!1;if(Ext.suspendLayouts(),Ext.Array.erase(me.childNodes,index,1),me.firstChild===node&&me.setFirstChild(node.nextSibling),me.lastChild===node&&me.setLastChild(node.previousSibling),previousSibling=node.previousSibling,previousSibling&&(node.previousSibling.nextSibling=node.nextSibling),node.nextSibling)for(node.nextSibling.previousSibling=node.previousSibling,0===index&&node.nextSibling.updateInfo(!1,{isFirst:!0}),i=index,childCount=me.childNodes.length;i<childCount;i++)me.childNodes[i].updateInfo(!1,{index:i});else previousSibling&&(previousSibling.updateInfo(!1,{isLast:!0}),previousSibling.isExpanded()?previousSibling.cascadeBy(me.triggerUIUpdate):previousSibling.triggerUIUpdate());return me.childNodes.length||me.triggerUIUpdate(),Ext.resumeLayouts(!0),!0!==suppressEvents&&(node.removeContext={parentNode:node.parentNode,previousSibling:node.previousSibling,nextSibling:node.nextSibling},node.previousSibling=node.nextSibling=node.parentNode=null,me.fireEventArgs("remove",[me,node,!!isMove]),node.removeContext=null),destroy?node.destroy(!0):node.clear(),node},copy:function(newId,deep){var i,me=this,result=me.callParent(arguments),len=me.childNodes?me.childNodes.length:0;if(deep)for(i=0;i<len;i++)result.appendChild(me.childNodes[i].copy(void 0,!0));return result},clear:function(destroy){var me=this;me.parentNode=me.previousSibling=me.nextSibling=null,destroy&&(me.firstChild=me.lastChild=null)},destroy:function(silent){var n,me=this,options=me.destroyOptions,nodes=me.childNodes,nLen=nodes.length;if(!0===silent){for(me.clear(!0),n=0;n<nLen;n++)nodes[n].destroy(!0);me.childNodes=null,delete me.destroyOptions,me.callParent([options])}else me.destroyOptions=silent,me.remove(!0)},insertBefore:function(node,refNode,suppressEvents){var childCount,previousSibling,i,me=this,index=me.indexOf(refNode),oldParent=node.parentNode,refIndex=index;if(!refNode)return me.appendChild(node);if(node===refNode)return!1;if(node=me.createNode(node),!0!==suppressEvents&&!1===me.fireEventArgs("beforeinsert",[me,node,refNode]))return!1;if(oldParent===me&&me.indexOf(node)<index&&refIndex--,oldParent){if(!0!==suppressEvents&&!1===node.fireEventArgs("beforemove",[node,oldParent,me,index,refNode]))return!1;oldParent.removeChild(node,!1,!1,!0)}for(0===refIndex&&me.setFirstChild(node),Ext.Array.splice(me.childNodes,refIndex,0,node),node.parentNode=me,node.nextSibling=refNode,refNode.previousSibling=node,previousSibling=me.childNodes[refIndex-1],previousSibling?(node.previousSibling=previousSibling,previousSibling.nextSibling=node):node.previousSibling=null,node.updateInfo(!1,{parentId:me.getId(),index:refIndex,isFirst:0===refIndex,isLast:!1,depth:(me.data.depth||0)+1}),i=refIndex+1,childCount=me.childNodes.length;i<childCount;i++)me.childNodes[i].updateInfo(!1,{index:i});return me.isLoaded()?1===me.childNodes.length&&me.triggerUIUpdate():me.set("loaded",!0),!node.isLeaf()&&node.phantom&&node.set("loaded",!0),!0!==suppressEvents&&(me.fireEventArgs("insert",[me,node,refNode]),oldParent&&node.fireEventArgs("move",[node,oldParent,me,refIndex,refNode])),node},insertChild:function(index,node){var sibling=this.childNodes[index];return sibling?this.insertBefore(node,sibling):this.appendChild(node)},remove:function(destroy,suppressEvents){var me=this,parentNode=me.parentNode;return parentNode?parentNode.removeChild(me,destroy,suppressEvents):destroy&&me.destroy(!0),me},removeAll:function(destroy,suppressEvents,fromParent){var node,me=this,childNodes=me.childNodes,i=0,len=childNodes.length;if(len){for(me.fireEventArgs("bulkremove",[me,childNodes,!1]);i<len;++i)node=childNodes[i],node.removeContext={parentNode:node.parentNode,previousSibling:node.previousSibling,nextSibling:node.nextSibling},node.previousSibling=node.nextSibling=node.parentNode=null,me.fireEventArgs("remove",[me,node,!1]),node.removeContext=null,destroy?node.destroy(!0):node.removeAll(!1,suppressEvents,!0);return me.firstChild=me.lastChild=null,fromParent?me.childNodes=null:(me.childNodes.length=0,me.triggerUIUpdate()),me}},getChildAt:function(index){return this.childNodes[index]},replaceChild:function(newChild,oldChild,suppressEvents){var s=oldChild?oldChild.nextSibling:null;return this.removeChild(oldChild,!1,suppressEvents),this.insertBefore(newChild,s,suppressEvents),oldChild},indexOf:function(child){return Ext.Array.indexOf(this.childNodes,child)},indexOfId:function(id){for(var childNodes=this.childNodes,len=childNodes.length,i=0;i<len;++i)if(childNodes[i].getId()===id)return i;return-1},getPath:function(field,separator){field=field||this.idProperty,separator=separator||"/";for(var path=[this.get(field)],parent=this.parentNode;parent;)path.unshift(parent.get(field)),parent=parent.parentNode;return separator+path.join(separator)},getDepth:function(){return this.get("depth")},bubble:function(fn,scope,args){for(var p=this;p&&!1!==fn.apply(scope||p,args||[p]);)p=p.parentNode},cascade:function(){return Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.data.Node: cascade has been deprecated. Please use cascadeBy instead."),this.cascadeBy.apply(this,arguments)},cascadeBy:function(fn,scope,args){if(!1!==fn.apply(scope||this,args||[this])){var i,childNodes=this.childNodes,length=childNodes.length;for(i=0;i<length;i++)childNodes[i].cascadeBy(fn,scope,args)}},eachChild:function(fn,scope,args){var i,childNodes=this.childNodes,length=childNodes.length;for(i=0;i<length&&!1!==fn.apply(scope||this,args||[childNodes[i]]);i++);},findChild:function(attribute,value,deep){return this.findChildBy(function(){return this.get(attribute)==value},null,deep)},findChildBy:function(fn,scope,deep){for(var n,res,cs=this.childNodes,len=cs.length,i=0;i<len;i++){if(n=cs[i],!0===fn.call(scope||n,n))return n;if(deep&&null!==(res=n.findChildBy(fn,scope,deep)))return res}return null},contains:function(node){return node.isAncestor(this)},isAncestor:function(node){for(var p=this.parentNode;p;){if(p===node)return!0;p=p.parentNode}return!1},sort:function(sortFn,recursive,suppressEvent){var i,n,cs=this.childNodes,ln=cs.length,info={isFirst:!0};if(ln>0){for(Ext.Array.sort(cs,sortFn),this.setFirstChild(cs[0]),this.setLastChild(cs[ln-1]),i=0;i<ln;i++)n=cs[i],n.previousSibling=cs[i-1],n.nextSibling=cs[i+1],info.isLast=i===ln-1,info.index=i,n.updateInfo(!1,info),info.isFirst=!1,recursive&&!n.isLeaf()&&n.sort(sortFn,!0,!0);!0!==suppressEvent&&this.fireEventArgs("sort",[this,cs])}},isExpanded:function(){return this.get("expanded")},isLoaded:function(){return this.get("loaded")},isLoading:function(){return this.get("loading")},isRoot:function(){return!this.parentNode},isVisible:function(){for(var parent=this.parentNode;parent;){if(!parent.isExpanded())return!1;parent=parent.parentNode}return!0},expand:function(recursive,callback,scope){var owner,me=this;me.isLeaf()?Ext.callback(callback,scope||me):me.isLoading()?me.on("expand",function(){me.expand(recursive,callback,scope)},me,{single:!0}):me.isExpanded()?recursive?(owner=me.getOwnerTree(),me.expandChildren(!0,!!owner&&owner.singleExpand,callback,scope)):Ext.callback(callback,scope||me,[me.childNodes]):me.fireEventArgs("beforeexpand",[me,me.onChildNodesAvailable,me,[recursive,callback,scope]])},onChildNodesAvailable:function(records,recursive,callback,scope){var owner,me=this;Ext.suspendLayouts(),me.set("expanded",!0),me.fireEventArgs("expand",[me,me.childNodes,!1]),recursive?(owner=me.getOwnerTree(),me.expandChildren(!0,!!owner&&owner.singleExpand,callback,scope)):Ext.callback(callback,scope||me,[me.childNodes]),Ext.resumeLayouts(!0)},expandChildren:function(recursive,singleExpand,callback,scope){var i,node,me=this,allNodes=me.childNodes,expandNodes=[],ln=singleExpand?Math.min(allNodes.length,1):allNodes.length;for(i=0;i<ln;++i)node=allNodes[i],node.isLeaf()||(expandNodes[expandNodes.length]=node);for(ln=expandNodes.length,i=0;i<ln;++i)expandNodes[i].expand(recursive);callback&&Ext.callback(callback,scope||me,[me.childNodes])},collapse:function(recursive,callback,scope){var i,collapseChildren,me=this,expanded=me.isExpanded(),len=me.childNodes.length;if(!me.isLeaf()&&(!expanded&&recursive||!1!==me.fireEventArgs("beforecollapse",[me]))){if(Ext.suspendLayouts(),me.isExpanded())recursive&&(collapseChildren=function(){for(i=0;i<len;i++)me.childNodes[i].setCollapsed(!0)},callback=callback?Ext.Function.createSequence(collapseChildren,callback):collapseChildren),me.set("expanded",!1),me.fireEventArgs("collapse",[me,me.childNodes,!1,callback?Ext.Function.bind(callback,scope,[me.childNodes]):null,null]),callback=null;else if(recursive)for(i=0;i<len;i++)me.childNodes[i].setCollapsed(!0);Ext.resumeLayouts(!0)}Ext.callback(callback,scope||me,[me.childNodes])},setCollapsed:function(recursive){var i,me=this,len=me.childNodes.length;if(!me.isLeaf()&&!1!==me.fireEventArgs("beforecollapse",[me,Ext.emptyFn])&&(me.data.expanded=!1,me.fireEventArgs("collapse",[me,me.childNodes,!1,null,null]),recursive))for(i=0;i<len;i++)me.childNodes[i].setCollapsed(!0)},collapseChildren:function(recursive,callback,scope){var i,node,me=this,allNodes=me.childNodes,ln=allNodes.length,collapseNodes=[];for(i=0;i<ln;++i)node=allNodes[i],!node.isLeaf()&&node.isLoaded()&&node.isExpanded()&&collapseNodes.push(node);if(ln=collapseNodes.length)for(i=0;i<ln;++i)node=collapseNodes[i],i===ln-1?node.collapse(recursive,callback,scope):node.collapse(recursive);else Ext.callback(callback,scope)},fireEventArgs:function(eventName,args){var result,eventSource,tree,treeStore,rootNode,fireEventArgs=Ext.data.Model.prototype.fireEventArgs;if(bubbledEvents[eventName]){for(eventSource=this;!1!==result&&eventSource;eventSource=(rootNode=eventSource).parentNode)eventSource.hasListeners[eventName]&&(result=fireEventArgs.call(eventSource,eventName,args));return tree=rootNode.rootOf,!1!==result&&tree&&(treeStore=tree.treeStore,treeStore&&treeStore.hasListeners[eventName]&&(result=treeStore.fireEventArgs.call(treeStore,eventName,args)),!1!==result&&tree.hasListeners[eventName]&&(result=tree.fireEventArgs.call(tree,eventName,args))),result}return fireEventArgs.apply(this,arguments)},serialize:function(){var children,i,result=Ext.data.writer.Json.prototype.getRecordData(this),childNodes=this.childNodes,len=childNodes.length;if(len>0){for(children=[],i=0;i<len;i++)children.push(childNodes[i].serialize());result.children=children}return result}}}}});Ext.define("Ext.data.NodeStore",{extend:"Ext.data.Store",alias:"store.node",requires:["Ext.data.NodeInterface"],isNodeStore:!0,node:null,recursive:!1,rootVisible:!1,isExpandingOrCollapsing:0,constructor:function(config){var node,me=this;config=config||{},Ext.apply(me,config),Ext.isDefined(me.proxy)&&Ext.Error.raise("A NodeStore cannot be bound to a proxy. Instead bind it to a record decorated with the NodeInterface by setting the node config."),me.useModelWarning=!1,config.proxy={type:"proxy"},me.callParent([config]),(node=me.node)&&(me.node=null,me.setNode(node))},getTotalCount:function(){return this.getCount()},setNode:function(node){var me=this;me.node&&me.node!=node&&(me.mun(me.node,{expand:me.onNodeExpand,collapse:me.onNodeCollapse,append:me.onNodeAppend,insert:me.onNodeInsert,bulkremove:me.onBulkRemove,remove:me.onNodeRemove,sort:me.onNodeSort,scope:me}),me.node=null),node&&(Ext.data.NodeInterface.decorate(node.self),me.removeAll(),me.rootVisible?me.add(node):node.isExpanded()||!1===me.treeStore.autoLoad||node.expand(),me.mon(node,{expand:me.onNodeExpand,collapse:me.onNodeCollapse,append:me.onNodeAppend,insert:me.onNodeInsert,bulkremove:me.onBulkRemove,remove:me.onNodeRemove,sort:me.onNodeSort,scope:me}),me.node=node,node.isExpanded()&&node.isLoaded()&&me.onNodeExpand(node,node.childNodes,!0))},onNodeSort:function(node,childNodes){var me=this;(-1!==me.indexOf(node)||node===me.node&&!me.rootVisible&&node.isExpanded())&&(Ext.suspendLayouts(),me.onNodeCollapse(node,childNodes,!0),me.onNodeExpand(node,childNodes,!0),Ext.resumeLayouts(!0))},onNodeExpand:function(parent,records,suppressEvent){var me=this,insertIndex=me.indexOf(parent)+1,toAdd=[];suppressEvent||me.fireEvent("beforeexpand",parent,records,insertIndex),me.handleNodeExpand(parent,records,toAdd),me.insert(insertIndex,toAdd),suppressEvent||me.fireEvent("expand",parent,records)},handleNodeExpand:function(parent,records,toAdd){var i,record,me=this,ln=records?records.length:0;if((me.recursive||parent===me.node)&&(parent===this.node||me.isVisible(parent))&&ln)for(i=0;i<ln;i++)record=records[i],toAdd.push(record),record.isExpanded()&&(record.isLoaded()?me.handleNodeExpand(record,record.childNodes,toAdd):(record.set("expanded",!1),record.expand()))},onBulkRemove:function(parent,childNodes,isMove){this.onNodeCollapse(parent,childNodes,!0)},onNodeCollapse:function(parent,records,suppressEvent,callback,scope){var node,lastNodeIndexPlus,sibling,found,me=this,collapseIndex=me.indexOf(parent)+1;if(me.recursive||parent===me.node){if(suppressEvent||me.fireEvent("beforecollapse",parent,records,collapseIndex,callback,scope),records.length&&me.data.contains(records[0])){for(node=parent;node.parentNode;){if(sibling=node.nextSibling){found=!0,lastNodeIndexPlus=me.indexOf(sibling);break}node=node.parentNode}found||(lastNodeIndexPlus=me.getCount()),me.removeAt(collapseIndex,lastNodeIndexPlus-collapseIndex)}suppressEvent||me.fireEvent("collapse",parent,records,collapseIndex)}},onNodeAppend:function(parent,node,index){var refNode,sibling,me=this;if(me.isVisible(node)){if(0===index)refNode=parent;else{for(sibling=node.previousSibling;sibling.isExpanded()&&sibling.lastChild;)sibling=sibling.lastChild;refNode=sibling}me.insert(me.indexOf(refNode)+1,node),!node.isLeaf()&&node.isExpanded()&&(node.isLoaded()?me.onNodeExpand(node,node.childNodes,!0):me.treeStore.fillCount||(node.set("expanded",!1),node.expand()))}},onNodeInsert:function(parent,node,refNode){var me=this,index=this.indexOf(refNode);-1!=index&&me.isVisible(node)&&(me.insert(index,node),!node.isLeaf()&&node.isExpanded()&&(node.isLoaded()?me.onNodeExpand(node,node.childNodes,!0):(node.set("expanded",!1),node.expand())))},onNodeRemove:function(parent,node,isMove){var me=this;-1!=me.indexOf(node)&&(!node.isLeaf()&&node.isExpanded()&&(node.parentNode=node.removeContext.parentNode,node.nextSibling=node.removeContext.nextSibling,me.onNodeCollapse(node,node.childNodes,!0),node.parentNode=node.nextSibling=null),me.remove(node))},isVisible:function(node){for(var parent=node.parentNode;parent;){if(parent===this.node&&parent.data.expanded)return!0;if(!parent.data.expanded)return!1;parent=parent.parentNode}return!1}});Ext.define("Ext.data.Request",{action:void 0,params:void 0,method:"GET",url:void 0,constructor:function(config){Ext.apply(this,config)}});Ext.define("Ext.data.Tree",{alias:"data.tree",mixins:{observable:"Ext.util.Observable"},root:null,constructor:function(root){var me=this;me.mixins.observable.constructor.call(me),root&&me.setRootNode(root),me.on({scope:me,idchanged:me.onNodeIdChanged,insert:me.onNodeInsert,append:me.onNodeAppend,remove:me.onNodeRemove})},getRootNode:function(){return this.root},setRootNode:function(node){var me=this;return me.root=node,node.rootOf?node.rootOf.removeRootNode():node.parentNode&&node.parentNode.removeChild(node),node.rootOf=me,!1!==node.fireEventArgs("beforeappend",[null,node])&&(node.set("root",!0),node.updateInfo(!0,{isFirst:!0,isLast:!0,depth:0,index:0,parentId:null}),me.nodeHash={},node.fireEvent("append",null,node),node.fireEvent("rootchange",node)),node},removeRootNode:function(){var me=this,root=me.root;return root.set("root",!1),root.fireEvent("remove",null,root,!1),root.fireEvent("rootchange",null),root.rootOf=me.root=null,root},flatten:function(){return Ext.Object.getValues(this.nodeHash)},onNodeInsert:function(parent,node){this.registerNode(node,!0)},onNodeAppend:function(parent,node){this.registerNode(node,!0)},onNodeRemove:function(parent,node){this.unregisterNode(node,!0)},onNodeIdChanged:function(node,oldId,newId,oldInternalId){var nodeHash=this.nodeHash;nodeHash[node.internalId]=node,delete nodeHash[oldInternalId]},getNodeById:function(id){return this.nodeHash[id]},registerNode:function(node,includeChildren){var children,length,i,me=this;if(me.nodeHash[node.internalId]=node,!0===includeChildren)for(children=node.childNodes,length=children.length,i=0;i<length;i++)me.registerNode(children[i],!0)},unregisterNode:function(node,includeChildren){var children,length,i,me=this;if(delete me.nodeHash[node.internalId],!0===includeChildren)for(children=node.childNodes,length=children.length,i=0;i<length;i++)me.unregisterNode(children[i],!0)},sort:function(sorterFn,recursive){this.getRootNode().sort(sorterFn,recursive)},filter:function(filters,recursive){this.getRootNode().filter(filters,recursive)}});Ext.define("Ext.data.TreeModel",{extend:"Ext.data.Model",requires:["Ext.data.NodeInterface"]},function(){Ext.data.NodeInterface.decorate(this)});Ext.define("Ext.data.TreeStore",{extend:"Ext.data.AbstractStore",alias:"store.tree",requires:["Ext.util.Sorter","Ext.data.Tree","Ext.data.NodeInterface"],clearOnLoad:!0,clearRemovedOnLoad:!0,nodeParam:"node",defaultRootId:"root",defaultRootText:"Root",defaultRootProperty:"children",rootProperty:"children",fillCount:0,folderSort:!1,constructor:function(config){var root,fields,defaultRoot,me=this;config=Ext.apply({},config),fields=config.fields||me.fields,fields||(config.fields=[{name:"text",type:"string"}],(defaultRoot=config.defaultRootProperty||me.defaultRootProperty)!==me.defaultRootProperty&&config.fields.push({name:defaultRoot,type:"auto",defaultValue:null,persist:!1})),me.callParent([config]),me.tree=new Ext.data.Tree,me.tree.treeStore=me,me.tree.on({scope:me,remove:me.onNodeRemove,beforeexpand:me.onBeforeNodeExpand,append:me.onNodeAdded,insert:me.onNodeAdded,sort:me.onNodeSort}),me.onBeforeSort(),root=me.root,root&&(delete me.root,me.setRootNode(root)),Ext.isDefined(me.nodeParameter)&&(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.data.TreeStore: nodeParameter has been deprecated. Please use nodeParam instead."),me.nodeParam=me.nodeParameter,delete me.nodeParameter)},setProxy:function(proxy){var reader,needsRoot;return proxy instanceof Ext.data.proxy.Proxy?needsRoot=Ext.isEmpty(proxy.getReader().root):Ext.isString(proxy)?needsRoot=!0:(reader=proxy.reader,needsRoot=!(reader&&!Ext.isEmpty(reader.root))),proxy=this.callParent(arguments),proxy.idParam=this.nodeParam,needsRoot&&(reader=proxy.getReader(),reader.root=this.defaultRootProperty,reader.buildExtractors(!0)),proxy},onBeforeSort:function(){this.folderSort&&this.sort({property:"leaf",direction:"ASC"},"prepend",!1)},onBeforeNodeExpand:function(node,callback,scope,args){var reader,dataRoot,data,callbackArgs,me=this;node.isLoaded()?(callbackArgs=[node.childNodes],args&&callbackArgs.push.apply(callbackArgs,args),Ext.callback(callback,scope||node,callbackArgs)):(dataRoot=data=(node.raw||node[node.persistenceProperty])[(reader=me.getProxy().getReader()).root])?(me.fillNode(node,reader.extractData(dataRoot)),delete data[reader.root],callbackArgs=[node.childNodes],args&&callbackArgs.push.apply(callbackArgs,args),Ext.callback(callback,scope||node,callbackArgs)):node.isLoading()?me.on("load",function(){callbackArgs=[node.childNodes],args&&callbackArgs.push.apply(callbackArgs,args),Ext.callback(callback,scope||node,callbackArgs)},me,{single:!0,priority:1001}):me.read({node:node,internalCallback:function(){delete me.lastOptions.internalCallback,callbackArgs=[node.childNodes],args&&callbackArgs.push.apply(callbackArgs,args),Ext.callback(callback,scope||node,callbackArgs)}})},getNewRecords:function(){return Ext.Array.filter(this.tree.flatten(),this.filterNew)},getUpdatedRecords:function(){return Ext.Array.filter(this.tree.flatten(),this.filterUpdated)},onNodeRemove:function(parent,node,isMove){var me=this;node.unjoin(me),node.phantom||isMove||Ext.Array.include(me.removed,node),!me.autoSync||me.autoSyncSuspended||isMove||me.sync()},onNodeAdded:function(parent,node){var dataRoot,me=this,proxy=me.getProxy(),reader=proxy.getReader(),data=node.raw||node[node.persistenceProperty];Ext.Array.remove(me.removed,node),node.join(me),node.isLeaf()||me.lazyFill||(dataRoot=reader.getRoot(data))&&(me.fillNode(node,reader.extractData(dataRoot)),delete data[reader.root]),me.autoSync&&!me.autoSyncSuspended&&(node.phantom||node.dirty)&&me.sync()},onNodeSort:function(){this.autoSync&&!this.autoSyncSuspended&&this.sync()},setRootNode:function(root,preventLoad){var me=this,model=me.model,idProperty=model.prototype.idProperty;return root=root||{},root.isModel?root.isModel&&!root.isNode&&Ext.data.NodeInterface.decorate(model):(root=Ext.apply({},root),Ext.applyIf(root,{id:me.defaultRootId,text:me.defaultRootText,allowDrag:!1}),void 0===root[idProperty]&&(root[idProperty]=me.defaultRootId),Ext.data.NodeInterface.decorate(model),root=Ext.ModelManager.create(root,model)),me.getProxy().getReader().buildExtractors(!0),me.tree.setRootNode(root),!0===preventLoad||root.isLoaded()||!0!==me.autoLoad&&!root.isExpanded()||(root.data.expanded=!1,root.expand()),root},getRootNode:function(){return this.tree.getRootNode()},getNodeById:function(id){return this.tree.getNodeById(id)},getById:function(id){return this.getNodeById(id)},load:function(options){options=options||{},options.params=options.params||{};var operation,me=this,node=options.node||me.tree.getRootNode();options.callback,options.scope;return node||(node=me.setRootNode({expanded:!0},!0)),options.id=node.getId(),options=Ext.apply({action:"read",filters:me.filters.items,sorters:me.getSorters(),node:options.node||node},options),me.lastOptions=options,operation=new Ext.data.Operation(options),!1!==me.fireEvent("beforeload",me,operation)&&(me.clearOnLoad&&(me.clearRemovedOnLoad&&me.clearRemoved(node),me.tree.un("remove",me.onNodeRemove,me),node.removeAll(!1),me.tree.on("remove",me.onNodeRemove,me)),me.loading=!0,me.proxy.read(operation,me.onProxyLoad,me)),me.loading&&node&&node.set("loading",!0),me},clearRemoved:function(node){var removedNode,targetNode,targetId,me=this,removed=me.removed,id=node.getId(),removedLength=removed.length,i=removedLength,recordsToClear={},newRemoved=[],removedHash={};if(node===me.getRootNode())return void(me.removed=[]);for(;i--;)removedNode=removed[i],removedHash[removedNode.getId()]=removedNode;for(i=removedLength;i--;){for(removedNode=removed[i],targetNode=removedNode;targetNode&&targetNode.getId()!==id;)targetId=targetNode.get("parentId"),targetNode=targetNode.parentNode||me.getNodeById(targetId)||removedHash[targetId];targetNode&&(recordsToClear[removedNode.getId()]=removedNode)}for(i=0;i<removedLength;i++)removedNode=removed[i],recordsToClear[removedNode.getId()]||newRemoved.push(removedNode);me.removed=newRemoved},fillNode:function(node,newNodes){var i,sortCollection,node1,node2,rootFill,me=this,ln=newNodes?newNodes.length:0,sorters=me.sorters,needsIndexSort=!1,performLocalSort=ln&&me.sortOnLoad&&!me.remoteSort&&sorters&&sorters.items&&sorters.items.length;for(i=1;i<ln&&(node1=newNodes[i],node2=newNodes[i-1],!(needsIndexSort=node1[node1.persistenceProperty].index!=node2[node2.persistenceProperty].index));i++);return performLocalSort?(needsIndexSort&&me.sorters.insert(0,me.indexSorter),sortCollection=new Ext.util.MixedCollection,sortCollection.addAll(newNodes),sortCollection.sort(me.sorters.items),newNodes=sortCollection.items,me.sorters.remove(me.indexSorter)):needsIndexSort&&Ext.Array.sort(newNodes,me.sortByIndex),node.set("loaded",!0),rootFill=0===me.fillCount,rootFill&&me.fireEvent("beforefill",me,node,newNodes),++me.fillCount,newNodes.length&&node.appendChild(newNodes,void 0,!0),rootFill&&me.fireEvent("fillcomplete",me,node,newNodes),--me.fillCount,newNodes},sortByIndex:function(node1,node2){return node1[node1.persistenceProperty].index-node2[node2.persistenceProperty].index},onIdChanged:function(model,oldId,newId,oldInternalId){this.tree.onNodeIdChanged(model,oldId,newId,oldInternalId),this.callParent(arguments)},onProxyLoad:function(operation){var me=this,successful=operation.wasSuccessful(),records=operation.getRecords(),node=operation.node,scope=operation.scope||me,args=[records,operation,successful];me.loading=!1,node.set("loading",!1),successful&&(me.clearOnLoad||(records=me.cleanRecords(node,records)),records=me.fillNode(node,records)),Ext.callback(operation.internalCallback,scope,args),me.fireEvent("read",me,operation.node,records,successful),me.fireEvent("load",me,operation.node,records,successful),Ext.callback(operation.callback,scope,args)},cleanRecords:function(node,records){for(var rec,nodeHash={},childNodes=node.childNodes,i=0,len=childNodes.length,out=[];i<len;++i)nodeHash[childNodes[i].getId()]=!0;for(i=0,len=records.length;i<len;++i)rec=records[i],nodeHash[rec.getId()]||out.push(rec);return out},removeAll:function(){var root=this.getRootNode();root&&root.destroy(!0),this.fireEvent("clear",this)},doSort:function(sorterFn){var me=this;me.remoteSort?me.load():(me.tree.sort(sorterFn,!0),me.fireEvent("datachanged",me),me.fireEvent("refresh",me)),me.fireEvent("sort",me,me.sorters.getRange())}},function(){var proto=this.prototype;proto.indexSorter=new Ext.util.Sorter({sorterFn:proto.sortByIndex})});Ext.define("Ext.data.association.BelongsTo",{extend:"Ext.data.association.Association",alternateClassName:"Ext.data.BelongsToAssociation",alias:"association.belongsto",constructor:function(config){this.callParent(arguments);var me=this,ownerProto=me.ownerModel.prototype,associatedName=me.associatedName,getterName=me.getterName||"get"+associatedName,setterName=me.setterName||"set"+associatedName;Ext.applyIf(me,{name:associatedName,foreignKey:associatedName.toLowerCase()+"_id",instanceName:associatedName+"BelongsToInstance",associationKey:associatedName.toLowerCase()}),ownerProto[getterName]=me.createGetter(),ownerProto[setterName]=me.createSetter()},createSetter:function(){var me=this,foreignKey=me.foreignKey,instanceName=me.instanceName;return function(value,options,scope){var setByRecord=value&&value.isModel,valueToSet=setByRecord?value.getId():value;if(setByRecord?this[instanceName]=value:this[instanceName]instanceof Ext.data.Model&&!this.isEqual(this.get(foreignKey),valueToSet)&&delete this[instanceName],this.set(foreignKey,valueToSet),Ext.isFunction(options)&&(options={callback:options,scope:scope||this}),Ext.isObject(options))return this.save(options)}},createGetter:function(){var me=this,associatedName=me.associatedName,associatedModel=me.associatedModel,foreignKey=me.foreignKey,primaryKey=me.primaryKey,instanceName=me.instanceName;return function(options,scope){options=options||{};var success,instance,args,model=this,foreignKeyId=model.get(foreignKey);return!0===options.reload||void 0===model[instanceName]?(instance=Ext.ModelManager.create({},associatedName),instance.set(primaryKey,foreignKeyId),"function"==typeof options&&(options={callback:options,scope:scope||model}),success=options.success,options.success=function(rec){model[instanceName]=rec,success&&success.apply(this,arguments)},associatedModel.load(foreignKeyId,options),model[instanceName]=instance,instance):(instance=model[instanceName],args=[instance],scope=scope||options.scope||model,Ext.callback(options,scope,args),Ext.callback(options.success,scope,args),Ext.callback(options.failure,scope,args),Ext.callback(options.callback,scope,args),instance)}},read:function(record,reader,associationData){record[this.instanceName]=reader.read([associationData]).records[0]}});Ext.define("Ext.util.Inflector",{singleton:!0,plurals:[[/(quiz)$/i,"$1zes"],[/^(ox)$/i,"$1en"],[/([m|l])ouse$/i,"$1ice"],[/(matr|vert|ind)ix|ex$/i,"$1ices"],[/(x|ch|ss|sh)$/i,"$1es"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/(hive)$/i,"$1s"],[/(?:([^f])fe|([lr])f)$/i,"$1$2ves"],[/sis$/i,"ses"],[/([ti])um$/i,"$1a"],[/(buffal|tomat|potat)o$/i,"$1oes"],[/(bu)s$/i,"$1ses"],[/(alias|status|sex)$/i,"$1es"],[/(octop|vir)us$/i,"$1i"],[/(ax|test)is$/i,"$1es"],[/^person$/,"people"],[/^man$/,"men"],[/^(child)$/,"$1ren"],[/s$/i,"s"],[/$/,"s"]],singulars:[[/(quiz)zes$/i,"$1"],[/(matr)ices$/i,"$1ix"],[/(vert|ind)ices$/i,"$1ex"],[/^(ox)en/i,"$1"],[/(alias|status)es$/i,"$1"],[/(octop|vir)i$/i,"$1us"],[/(cris|ax|test)es$/i,"$1is"],[/(shoe)s$/i,"$1"],[/(o)es$/i,"$1"],[/(bus)es$/i,"$1"],[/([m|l])ice$/i,"$1ouse"],[/(x|ch|ss|sh)es$/i,"$1"],[/(m)ovies$/i,"$1ovie"],[/(s)eries$/i,"$1eries"],[/([^aeiouy]|qu)ies$/i,"$1y"],[/([lr])ves$/i,"$1f"],[/(tive)s$/i,"$1"],[/(hive)s$/i,"$1"],[/([^f])ves$/i,"$1fe"],[/(^analy)ses$/i,"$1sis"],[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i,"$1$2sis"],[/([ti])a$/i,"$1um"],[/(n)ews$/i,"$1ews"],[/people$/i,"person"],[/s$/i,""]],uncountable:["sheep","fish","series","species","money","rice","information","equipment","grass","mud","offspring","deer","means"],singular:function(matcher,replacer){this.singulars.unshift([matcher,replacer])},plural:function(matcher,replacer){this.plurals.unshift([matcher,replacer])},clearSingulars:function(){this.singulars=[]},clearPlurals:function(){this.plurals=[]},isTransnumeral:function(word){return-1!=Ext.Array.indexOf(this.uncountable,word)},pluralize:function(word){if(this.isTransnumeral(word))return word;var tuple,regex,i,plurals=this.plurals,length=plurals.length;for(i=0;i<length;i++)if(tuple=plurals[i],(regex=tuple[0])==word||regex.test&&regex.test(word))return word.replace(regex,tuple[1]);return word},singularize:function(word){if(this.isTransnumeral(word))return word;var tuple,regex,i,singulars=this.singulars,length=singulars.length;for(i=0;i<length;i++)if(tuple=singulars[i],(regex=tuple[0])==word||regex.test&&regex.test(word))return word.replace(regex,tuple[1]);return word},classify:function(word){return Ext.String.capitalize(this.singularize(word))},ordinalize:function(number){var parsed=parseInt(number,10),mod10=parsed%10,mod100=parsed%100;if(11<=mod100&&mod100<=13)return number+"th";switch(mod10){case 1:return number+"st";case 2:return number+"nd";case 3:return number+"rd";default:return number+"th"}}},function(){var singular,irregulars={alumnus:"alumni",cactus:"cacti",focus:"foci",nucleus:"nuclei",radius:"radii",stimulus:"stimuli",ellipsis:"ellipses",paralysis:"paralyses",oasis:"oases",appendix:"appendices",index:"indexes",beau:"beaux",bureau:"bureaux",tableau:"tableaux",woman:"women",child:"children",man:"men",corpus:"corpora",criterion:"criteria",curriculum:"curricula",genus:"genera",memorandum:"memoranda",phenomenon:"phenomena",foot:"feet",goose:"geese",tooth:"teeth",antenna:"antennae",formula:"formulae",nebula:"nebulae",vertebra:"vertebrae",vita:"vitae"};for(singular in irregulars)this.plural(singular,irregulars[singular]),this.singular(irregulars[singular],singular)});Ext.define("Ext.data.association.HasMany",{extend:"Ext.data.association.Association",alternateClassName:"Ext.data.HasManyAssociation",requires:["Ext.util.Inflector"],alias:"association.hasmany",constructor:function(config){var ownerProto,name,me=this;me.callParent(arguments),me.name=me.name||Ext.util.Inflector.pluralize(me.associatedName.toLowerCase()),ownerProto=me.ownerModel.prototype,name=me.name,Ext.applyIf(me,{storeName:name+"Store",foreignKey:me.ownerName.toLowerCase()+"_id"}),ownerProto[name]=me.createStore()},createStore:function(){var that=this,associatedModel=that.associatedModel,storeName=that.storeName,foreignKey=that.foreignKey,primaryKey=that.primaryKey,filterProperty=that.filterProperty,autoLoad=that.autoLoad,storeConfig=that.storeConfig||{};return function(){var config,filter,id,me=this,modelDefaults={};return void 0===me[storeName]&&(id=me.get(primaryKey),filterProperty?filter={property:filterProperty,value:me.get(filterProperty),exactMatch:!0}:me.hasId(id)&&(filter={property:foreignKey,value:id,exactMatch:!0}),modelDefaults[foreignKey]=me.get(primaryKey),config=Ext.apply({},storeConfig,{model:associatedModel,filters:filter?[filter]:void 0,remoteFilter:!1,modelDefaults:modelDefaults,disableMetaChangeEvent:!0}),me[storeName]=Ext.data.AbstractStore.create(config),autoLoad&&me[storeName].load()),me[storeName]}},read:function(record,reader,associationData){var inverse,items,iLen,i,store=record[this.name]();if(store.add(reader.read(associationData).records),inverse=this.associatedModel.prototype.associations.findBy(function(assoc){return"belongsTo"===assoc.type&&assoc.associatedName===record.$className}))for(items=store.data.items,iLen=items.length,i=0;i<iLen;i++)items[i][inverse.instanceName]=record}});Ext.define("Ext.data.proxy.Rest",{extend:"Ext.data.proxy.Ajax",alternateClassName:"Ext.data.RestProxy",alias:"proxy.rest",actionMethods:{create:"POST",read:"GET",update:"PUT",destroy:"DELETE"},defaultActionMethods:{create:"POST",read:"GET",update:"PUT",destroy:"DELETE"},appendId:!0,batchActions:!1,buildUrl:function(request){var me=this,operation=request.operation,records=operation.records||[],record=records[0],format=me.format,url=me.getUrl(request),id=record?record.getId():operation.id;return me.appendId&&me.isValidId(id)&&(url.match(/\/$/)||(url+="/"),url+=id),format&&(url.match(/\.$/)||(url+="."),url+=format),request.url=url,me.callParent(arguments)},isValidId:function(id){return id||0===id}});Ext.define("Ext.dd.DDTarget",{extend:"Ext.dd.DragDrop",constructor:function(id,sGroup,config){id&&this.initTarget(id,sGroup,config)},getDragEl:Ext.emptyFn,isValidHandleChild:Ext.emptyFn,startDrag:Ext.emptyFn,endDrag:Ext.emptyFn,onDrag:Ext.emptyFn,onDragDrop:Ext.emptyFn,onDragEnter:Ext.emptyFn,onDragOut:Ext.emptyFn,onDragOver:Ext.emptyFn,onInvalidDrop:Ext.emptyFn,onMouseDown:Ext.emptyFn,onMouseUp:Ext.emptyFn,setXConstraint:Ext.emptyFn,setYConstraint:Ext.emptyFn,resetConstraints:Ext.emptyFn,clearConstraints:Ext.emptyFn,clearTicks:Ext.emptyFn,setInitPosition:Ext.emptyFn,setDragElId:Ext.emptyFn,setHandleElId:Ext.emptyFn,setOuterHandleElId:Ext.emptyFn,addInvalidHandleClass:Ext.emptyFn,addInvalidHandleId:Ext.emptyFn,addInvalidHandleType:Ext.emptyFn,removeInvalidHandleClass:Ext.emptyFn,removeInvalidHandleId:Ext.emptyFn,removeInvalidHandleType:Ext.emptyFn,toString:function(){return"DDTarget "+this.id}});Ext.define("Ext.dd.DragTracker",{uses:["Ext.util.Region"],mixins:{observable:"Ext.util.Observable"},active:!1,trackOver:!1,tolerance:5,autoStart:!1,constructor:function(config){var me=this;Ext.apply(me,config),me.addEvents("mouseover","mouseout","mousedown","mouseup","mousemove","beforedragstart","dragstart","dragend","drag"),me.dragRegion=new Ext.util.Region(0,0,0,0),me.el&&me.initEl(me.el),me.mixins.observable.constructor.call(me),me.disabled&&me.disable()},initEl:function(el){var me=this;me.el=Ext.get(el),me.handle=Ext.get(me.delegate),me.delegate=me.handle?void 0:me.delegate,me.handle||(me.handle=me.el),me.handleListeners={scope:me,delegate:me.delegate,mousedown:me.onMouseDown},(me.trackOver||me.overCls)&&Ext.apply(me.handleListeners,{mouseover:me.onMouseOver,mouseout:me.onMouseOut}),me.mon(me.handle,me.handleListeners)},disable:function(){this.disabled=!0},enable:function(){this.disabled=!1},destroy:function(){var me=this;me.active&&me.endDrag({}),me.clearListeners(),me.mun(me.handle,me.handleListeners),me.el=me.handle=null},onMouseOver:function(e,target){var me=this;me.disabled||(Ext.EventManager.contains(e)||me.delegate)&&(me.mouseIsOut=!1,me.overCls&&me.el.addCls(me.overCls),me.fireEvent("mouseover",me,e,me.delegate?e.getTarget(me.delegate,target):me.handle))},onMouseOut:function(e){var me=this;me.mouseIsDown?me.mouseIsOut=!0:(me.overCls&&me.el.removeCls(me.overCls),me.fireEvent("mouseout",me,e))},onMouseDown:function(e,target){var el,me=this;me.disabled||e.dragTracked||(me.dragTarget=me.delegate?target:me.handle.dom,me.startXY=me.lastXY=e.getXY(),me.startRegion=Ext.fly(me.dragTarget).getRegion(),!1!==me.fireEvent("mousedown",me,e)&&!1!==me.fireEvent("beforedragstart",me,e)&&!1!==me.onBeforeStart(e)&&(me.mouseIsDown=!0,e.dragTracked=!0,el=me.el.dom,Ext.isIE&&el.setCapture&&el.setCapture(),!1!==me.preventDefault&&e.preventDefault(),Ext.getDoc().on({scope:me,mouseup:me.onMouseUp,mousemove:me.onMouseMove,selectstart:me.stopSelect}),me.autoStart&&(me.timer=Ext.defer(me.triggerStart,!0===me.autoStart?1e3:me.autoStart,me,[e]))))},onMouseMove:function(e,target){var me=this,xy=e.getXY(),s=me.startXY;if(e.preventDefault(),me.lastXY=xy,!me.active){if(!(Math.max(Math.abs(s[0]-xy[0]),Math.abs(s[1]-xy[1]))>me.tolerance))return;me.triggerStart(e)}!1===me.fireEvent("mousemove",me,e)?me.onMouseUp(e):(me.onDrag(e),me.fireEvent("drag",me,e))},onMouseUp:function(e){var me=this;me.mouseIsDown=!1,me.mouseIsOut&&(me.mouseIsOut=!1,me.onMouseOut(e)),e.preventDefault(),Ext.isIE&&document.releaseCapture&&document.releaseCapture(),me.fireEvent("mouseup",me,e),me.endDrag(e)},endDrag:function(e){var me=this,wasActive=me.active;Ext.getDoc().un({mousemove:me.onMouseMove,mouseup:me.onMouseUp,selectstart:me.stopSelect,scope:me}),me.clearStart(),me.active=!1,wasActive&&(me.onEnd(e),me.fireEvent("dragend",me,e)),me._constrainRegion=Ext.EventObject.dragTracked=null},triggerStart:function(e){var me=this;me.clearStart(),me.active=!0,me.onStart(e),me.fireEvent("dragstart",me,e)},clearStart:function(){var timer=this.timer;timer&&(clearTimeout(timer),this.timer=null)},stopSelect:function(e){return e.stopEvent(),!1},onBeforeStart:function(e){},onStart:function(xy){},onDrag:function(e){},onEnd:function(e){},getDragTarget:function(){return this.dragTarget},getDragCt:function(){return this.el},getConstrainRegion:function(){var me=this;if(me.constrainTo){if(me.constrainTo instanceof Ext.util.Region)return me.constrainTo;me._constrainRegion||(me._constrainRegion=Ext.fly(me.constrainTo).getViewRegion())}else me._constrainRegion||(me._constrainRegion=me.getDragCt().getViewRegion());return me._constrainRegion},getXY:function(constrain){return constrain?this.constrainModes[constrain](this,this.lastXY):this.lastXY},getOffset:function(constrain){var xy=this.getXY(constrain),s=this.startXY;return[xy[0]-s[0],xy[1]-s[1]]},constrainModes:{point:function(me,xy){var dr=me.dragRegion,constrainTo=me.getConstrainRegion();return constrainTo?(dr.x=dr.left=dr[0]=dr.right=xy[0],dr.y=dr.top=dr[1]=dr.bottom=xy[1],dr.constrainTo(constrainTo),[dr.left,dr.top]):xy},dragTarget:function(me,xy){var adjust,s=me.startXY,dr=me.startRegion.copy(),constrainTo=me.getConstrainRegion();return constrainTo?(dr.translateBy(xy[0]-s[0],xy[1]-s[1]),dr.right>constrainTo.right&&(xy[0]+=adjust=constrainTo.right-dr.right,dr.left+=adjust),dr.left<constrainTo.left&&(xy[0]+=constrainTo.left-dr.left),dr.bottom>constrainTo.bottom&&(xy[1]+=adjust=constrainTo.bottom-dr.bottom,dr.top+=adjust),dr.top<constrainTo.top&&(xy[1]+=constrainTo.top-dr.top),xy):xy}}});Ext.define("Ext.dd.DragZone",{extend:"Ext.dd.DragSource",constructor:function(el,config){var me=this,scroll=me.containerScroll;me.callParent([el,config]),scroll&&(el=me.scrollEl||el,el=Ext.get(el),Ext.isObject(scroll)&&(el.ddScrollConfig=scroll),Ext.dd.ScrollManager.register(el))},getDragData:function(e){return Ext.dd.Registry.getHandleFromEvent(e)},onInitDrag:function(x,y){return this.proxy.update(this.dragData.ddel.cloneNode(!0)),this.onStartDrag(x,y),!0},getRepairXY:function(e){return Ext.fly(this.dragData.ddel).getXY()},destroy:function(){this.callParent(),this.containerScroll&&Ext.dd.ScrollManager.unregister(this.scrollEl||this.el)}});Ext.define("Ext.dd.ScrollManager",{singleton:!0,requires:["Ext.dd.DragDropManager"],constructor:function(){var ddm=Ext.dd.DragDropManager;ddm.fireEvents=Ext.Function.createSequence(ddm.fireEvents,this.onFire,this),ddm.stopDrag=Ext.Function.createSequence(ddm.stopDrag,this.onStop,this),this.doScroll=Ext.Function.bind(this.doScroll,this),this.ddmInstance=ddm,this.els={},this.dragEl=null,this.proc={}},onStop:function(e){var sm=Ext.dd.ScrollManager;sm.dragEl=null,sm.clearProc()},triggerRefresh:function(){this.ddmInstance.dragCurrent&&this.ddmInstance.refreshCache(this.ddmInstance.dragCurrent.groups)},doScroll:function(){if(this.ddmInstance.dragCurrent){var proc=this.proc,procEl=proc.el,ddScrollConfig=proc.el.ddScrollConfig,inc=ddScrollConfig&&ddScrollConfig.increment?ddScrollConfig.increment:this.increment;(ddScrollConfig&&"animate"in ddScrollConfig?ddScrollConfig.animate:this.animate)?procEl.scroll(proc.dir,inc,!0,this.animDuration,this.triggerRefresh):procEl.scroll(proc.dir,inc)&&this.triggerRefresh()}},clearProc:function(){var proc=this.proc;proc.id&&clearInterval(proc.id),proc.id=0,proc.el=null,proc.dir=""},startProc:function(el,dir){this.clearProc(),this.proc.el=el,this.proc.dir=dir;var group=el.ddScrollConfig?el.ddScrollConfig.ddGroup:void 0,freq=el.ddScrollConfig&&el.ddScrollConfig.frequency?el.ddScrollConfig.frequency:this.frequency;void 0!==group&&this.ddmInstance.dragCurrent.ddGroup!=group||(this.proc.id=setInterval(this.doScroll,freq))},onFire:function(e,isDrop){if(!isDrop&&this.ddmInstance.dragCurrent){this.dragEl&&this.dragEl==this.ddmInstance.dragCurrent||(this.dragEl=this.ddmInstance.dragCurrent,this.refreshCache());var id,el,r,c,pt=e.getPoint(),proc=this.proc,els=this.els;for(id in els)if(el=els[id],r=el._region,c=el.ddScrollConfig?el.ddScrollConfig:this,r&&r.contains(pt)&&el.isScrollable()){if(r.bottom-pt.y<=c.vthresh)return void(proc.el!=el&&this.startProc(el,"down"));if(r.right-pt.x<=c.hthresh)return void(proc.el!=el&&this.startProc(el,"right"));if(pt.y-r.top<=c.vthresh)return void(proc.el!=el&&this.startProc(el,"up"));if(pt.x-r.left<=c.hthresh)return void(proc.el!=el&&this.startProc(el,"left"))}this.clearProc()}},register:function(el){if(Ext.isArray(el))for(var i=0,len=el.length;i<len;i++)this.register(el[i]);else el=Ext.get(el),this.els[el.id]=el},unregister:function(el){if(Ext.isArray(el))for(var i=0,len=el.length;i<len;i++)this.unregister(el[i]);else el=Ext.get(el),delete this.els[el.id]},vthresh:25,hthresh:25,increment:100,frequency:500,animate:!0,animDuration:.4,ddGroup:void 0,refreshCache:function(){var id,els=this.els;for(id in els)"object"==typeof els[id]&&(els[id]._region=els[id].getRegion())}});Ext.define("Ext.dd.DropTarget",{extend:"Ext.dd.DDTarget",requires:["Ext.dd.ScrollManager"],constructor:function(el,config){this.el=Ext.get(el),Ext.apply(this,config),this.containerScroll&&Ext.dd.ScrollManager.register(this.el),this.callParent([this.el.dom,this.ddGroup||this.group,{isTarget:!0}])},dropAllowed:Ext.baseCSSPrefix+"dd-drop-ok",dropNotAllowed:Ext.baseCSSPrefix+"dd-drop-nodrop",isTarget:!0,isNotifyTarget:!0,notifyEnter:function(dd,e,data){return this.overClass&&this.el.addCls(this.overClass),this.dropAllowed},notifyOver:function(dd,e,data){return this.dropAllowed},notifyOut:function(dd,e,data){this.overClass&&this.el.removeCls(this.overClass)},notifyDrop:function(dd,e,data){return!1},destroy:function(){this.callParent(),this.containerScroll&&Ext.dd.ScrollManager.unregister(this.el)}});Ext.define("Ext.dd.Registry",{singleton:!0,constructor:function(){this.elements={},this.handles={},this.autoIdSeed=0},getId:function(el,autogen){if("string"==typeof el)return el;var id=el.id;return id||!1===autogen||(id="extdd-"+ ++this.autoIdSeed,el.id=id),id},register:function(el,data){if(data=data||{},"string"==typeof el&&(el=document.getElementById(el)),data.ddel=el,this.elements[this.getId(el)]=data,!1!==data.isHandle&&(this.handles[data.ddel.id]=data),data.handles){var i,len,hs=data.handles;for(i=0,len=hs.length;i<len;i++)this.handles[this.getId(hs[i])]=data}},unregister:function(el){var hs,i,len,id=this.getId(el,!1),data=this.elements[id];if(data&&(delete this.elements[id],data.handles))for(hs=data.handles,i=0,len=hs.length;i<len;i++)delete this.handles[this.getId(hs[i],!1)]},getHandle:function(id){return"string"!=typeof id&&(id=id.id),this.handles[id]},getHandleFromEvent:function(e){var t=e.getTarget();return t?this.handles[t.id]:null},getTarget:function(id){return"string"!=typeof id&&(id=id.id),this.elements[id]},getTargetFromEvent:function(e){var t=e.getTarget();return t?this.elements[t.id]||this.handles[t.id]:null}});Ext.define("Ext.dd.DropZone",{extend:"Ext.dd.DropTarget",requires:["Ext.dd.Registry"],getTargetFromEvent:function(e){return Ext.dd.Registry.getTargetFromEvent(e)},onNodeEnter:function(n,dd,e,data){},onNodeOver:function(n,dd,e,data){return this.dropAllowed},onNodeOut:function(n,dd,e,data){},onNodeDrop:function(n,dd,e,data){return!1},onContainerOver:function(dd,e,data){return this.dropNotAllowed},onContainerDrop:function(dd,e,data){return!1},notifyEnter:function(dd,e,data){return this.dropNotAllowed},notifyOver:function(dd,e,data){var n=this.getTargetFromEvent(e);return n?(this.lastOverNode!=n&&(this.lastOverNode&&this.onNodeOut(this.lastOverNode,dd,e,data),this.onNodeEnter(n,dd,e,data),this.lastOverNode=n),this.onNodeOver(n,dd,e,data)):(this.lastOverNode&&(this.onNodeOut(this.lastOverNode,dd,e,data),this.lastOverNode=null),this.onContainerOver(dd,e,data))},notifyOut:function(dd,e,data){this.lastOverNode&&(this.onNodeOut(this.lastOverNode,dd,e,data),this.lastOverNode=null)},notifyDrop:function(dd,e,data){var me=this,n=me.getTargetFromEvent(e),result=n?me.onNodeDrop(n,dd,e,data):me.onContainerDrop(dd,e,data);return me.lastOverNode&&(me.onNodeOut(me.lastOverNode,dd,e,data),me.lastOverNode=null),result},triggerCacheRefresh:function(){Ext.dd.DDM.refreshCache(this.groups)}});Ext.define("Ext.direct.Event",{alias:"direct.event",status:!0,constructor:function(config){Ext.apply(this,config)},getName:function(){return this.name},getData:function(){return this.data}});Ext.define("Ext.direct.RemotingEvent",{extend:"Ext.direct.Event",alias:"direct.rpc",getTransaction:function(){var me=this;return me.transaction||Ext.direct.Manager.getTransaction(me.tid)}});Ext.define("Ext.direct.ExceptionEvent",{extend:"Ext.direct.RemotingEvent",alias:"direct.exception",status:!1});Ext.define("Ext.dom.Layer",{extend:"Ext.Element",uses:["Ext.Shadow"],alternateClassName:"Ext.Layer",statics:{shims:[]},isLayer:!0,localXYNames:{get:"getLocalXY",set:"setLocalXY"},constructor:function(config,existingEl){config=config||{};var me=this,dh=Ext.DomHelper,cp=config.parentEl,pel=cp?Ext.getDom(cp):document.body,hm=config.hideMode,cls=Ext.baseCSSPrefix+(!config.fixed||Ext.isIE6||Ext.isIEQuirks?"layer":"fixed-layer");me.el=me,existingEl&&(me.dom=Ext.getDom(existingEl)),me.dom?(me.addCls(cls),me.dom.parentNode||pel.appendChild(me.dom)):me.dom=dh.append(pel,config.dh||{tag:"div",cls:cls}),config.preventSync&&(me.preventSync=!0),config.id?me.id=me.dom.id=config.id:me.id=Ext.id(me.dom),Ext.Element.addToCache(me),config.cls&&me.addCls(config.cls),me.constrain=!1!==config.constrain,hm?(me.setVisibilityMode(Ext.Element[hm.toUpperCase()]),me.visibilityMode==Ext.Element.ASCLASS&&(me.visibilityCls=config.visibilityCls)):config.useDisplay?me.setVisibilityMode(Ext.Element.DISPLAY):me.setVisibilityMode(Ext.Element.VISIBILITY),config.shadow?(me.shadowOffset=config.shadowOffset||4,me.shadow=new Ext.Shadow({offset:me.shadowOffset,mode:config.shadow,fixed:config.fixed}),me.disableShadow()):me.shadowOffset=0,me.useShim=!1!==config.shim&&Ext.useShims,!0===config.hidden?me.hide():!1===config.hidden&&me.show()},getZIndex:function(){return parseInt((this.getShim()||this).getStyle("z-index"),10)},getShim:function(){var shim,pn,me=this;return me.useShim?(me.shim||(shim=me.self.shims.shift(),shim||(shim=me.createShim(),shim.dom.setAttribute("data-sticky",!0),shim.enableDisplayMode("block"),shim.hide()),pn=me.dom.parentNode,shim.dom.parentNode!=pn&&pn.insertBefore(shim.dom,me.dom),me.shim=shim),me.shim):null},hideShim:function(){var me=this;me.shim&&(me.shim.setDisplayed(!1),me.self.shims.push(me.shim),delete me.shim)},disableShadow:function(){var me=this;me.shadow&&!me.shadowDisabled&&(me.shadowDisabled=!0,me.shadow.hide(),me.lastShadowOffset=me.shadowOffset,me.shadowOffset=0)},enableShadow:function(show){var me=this;me.shadow&&me.shadowDisabled&&(me.shadowDisabled=!1,me.shadowOffset=me.lastShadowOffset,delete me.lastShadowOffset,show&&me.sync(!0))},sync:function(doShow){var shadowPos,shimStyle,shadowSize,shim,xy,x,y,w,h,shimIndex,me=this,shadow=me.shadow;if(!me.preventSync)return!me.updating&&me.isVisible()&&(shadow||me.useShim)&&(shim=me.getShim(),xy=me[me.localXYNames.get](),x=xy[0],y=xy[1],w=me.dom.offsetWidth,h=me.dom.offsetHeight,shadow&&!me.shadowDisabled?(doShow&&!shadow.isVisible()?shadow.show(me):shadow.realign(x,y,w,h),shim&&(shimIndex=shim.getStyle("z-index"),shimIndex>me.zindex&&me.shim.setStyle("z-index",me.zindex-2),shim.show(),shadow.isVisible()?(shadowPos=shadow.el.getXY(),shimStyle=shim.dom.style,shadowSize=shadow.el.getSize(),Ext.supports.CSS3BoxShadow&&(shadowSize.height+=6,shadowSize.width+=4,shadowPos[0]-=2,shadowPos[1]-=4),shimStyle.left=shadowPos[0]+"px",shimStyle.top=shadowPos[1]+"px",shimStyle.width=shadowSize.width+"px",shimStyle.height=shadowSize.height+"px"):(shim.setSize(w,h),shim[me.localXYNames.set](x,y)))):shim&&(shimIndex=shim.getStyle("z-index"),shimIndex>me.zindex&&me.shim.setStyle("z-index",me.zindex-2),shim.show(),shim.setSize(w,h),shim[me.localXYNames.set](x,y))),me},remove:function(){this.hideUnders(),this.callParent()},beginUpdate:function(){this.updating=!0},endUpdate:function(){this.updating=!1,this.sync(!0)},hideUnders:function(){this.shadow&&this.shadow.hide(),this.hideShim()},constrainXY:function(){if(this.constrain){var vw=Ext.Element.getViewWidth(),vh=Ext.Element.getViewHeight(),s=Ext.getDoc().getScroll(),xy=this.getXY(),x=xy[0],y=xy[1],so=this.shadowOffset,w=this.dom.offsetWidth+so,h=this.dom.offsetHeight+so,moved=!1;x+w>vw+s.left&&(x=vw-w-so,moved=!0),y+h>vh+s.top&&(y=vh-h-so,moved=!0),x<s.left&&(x=s.left,moved=!0),y<s.top&&(y=s.top,moved=!0),moved&&(Ext.Layer.superclass.setXY.call(this,[x,y]),this.sync())}return this},getConstrainOffset:function(){return this.shadowOffset},setVisible:function(visible,animate,duration,callback,easing){var cb,me=this;return cb=function(){visible&&me.sync(!0),callback&&callback()},visible||me.hideUnders(!0),me.callParent([visible,animate,duration,callback,easing]),animate||cb(),me},beforeFx:function(){return this.beforeAction(),this.callParent(arguments)},afterFx:function(){this.callParent(arguments),this.sync(this.isVisible())},beforeAction:function(){!this.updating&&this.shadow&&this.shadow.hide()},setLeft:function(left){return this.callParent(arguments),this.sync()},setTop:function(top){return this.callParent(arguments),this.sync()},setLeftTop:function(left,top){return this.callParent(arguments),this.sync()},setLocalX:function(){return this.callParent(arguments),this.sync()},setLocalXY:function(){return this.callParent(arguments),this.sync()},setLocalY:function(){return this.callParent(arguments),this.sync()},setXY:function(xy,animate,duration,callback,easing){var me=this;return callback=me.createCB(callback),me.fixDisplay(),me.beforeAction(),me.callParent([xy,animate,duration,callback,easing]),animate||callback(),me},createCB:function(callback){var me=this,showShadow=me.shadow&&me.shadow.isVisible();return function(){me.constrainXY(),me.sync(showShadow),callback&&callback()}},setX:function(x,animate,duration,callback,easing){return this.setXY([x,this.getY()],animate,duration,callback,easing),this},setY:function(y,animate,duration,callback,easing){return this.setXY([this.getX(),y],animate,duration,callback,easing),this},setSize:function(w,h,animate,duration,callback,easing){var me=this;return callback=me.createCB(callback),me.beforeAction(),me.callParent([w,h,animate,duration,callback,easing]),animate||callback(),me},setWidth:function(w,animate,duration,callback,easing){var me=this;return callback=me.createCB(callback),me.beforeAction(),me.callParent([w,animate,duration,callback,easing]),animate||callback(),me},setHeight:function(h,animate,duration,callback,easing){var me=this;return callback=me.createCB(callback),me.beforeAction(),me.callParent([h,animate,duration,callback,easing]),animate||callback(),me},setBounds:function(x,y,width,height,animate,duration,callback,easing){var me=this;return callback=me.createCB(callback),me.beforeAction(),animate?me.callParent([x,y,width,height,animate,duration,callback,easing]):(Ext.Layer.superclass.setXY.call(me,[x,y]),Ext.Layer.superclass.setSize.call(me,width,height),callback()),me},setZIndex:function(zindex){var me=this;return me.zindex=zindex,me.getShim()&&me.shim.setStyle("z-index",zindex++),me.shadow&&me.shadow.setZIndex(zindex++),me.setStyle("z-index",zindex)},onOpacitySet:function(opacity){var shadow=this.shadow;shadow&&shadow.setOpacity(opacity)}});Ext.define("Ext.draw.Matrix",{requires:["Ext.draw.Draw"],constructor:function(a,b,c,d,e,f){this.matrix=null!=a?[[a,c,e],[b,d,f],[0,0,1]]:[[1,0,0],[0,1,0],[0,0,1]]},add:function(a,b,c,d,e,f){var x,y,z,res,me=this,out=[[],[],[]],matrix=[[a,c,e],[b,d,f],[0,0,1]];for(x=0;x<3;x++)for(y=0;y<3;y++){for(res=0,z=0;z<3;z++)res+=me.matrix[x][z]*matrix[z][y];out[x][y]=res}me.matrix=out},prepend:function(a,b,c,d,e,f){var x,y,z,res,me=this,out=[[],[],[]],matrix=[[a,c,e],[b,d,f],[0,0,1]];for(x=0;x<3;x++)for(y=0;y<3;y++){for(res=0,z=0;z<3;z++)res+=matrix[x][z]*me.matrix[z][y];out[x][y]=res}me.matrix=out},invert:function(){var matrix=this.matrix,a=matrix[0][0],b=matrix[1][0],c=matrix[0][1],d=matrix[1][1],e=matrix[0][2],f=matrix[1][2],x=a*d-b*c;return new Ext.draw.Matrix(d/x,-b/x,-c/x,a/x,(c*f-d*e)/x,(b*e-a*f)/x)},clone:function(){var matrix=this.matrix,a=matrix[0][0],b=matrix[1][0],c=matrix[0][1],d=matrix[1][1],e=matrix[0][2],f=matrix[1][2];return new Ext.draw.Matrix(a,b,c,d,e,f)},translate:function(x,y){this.prepend(1,0,0,1,x,y)},scale:function(x,y,cx,cy){var me=this;null==y&&(y=x),me.add(x,0,0,y,cx*(1-x),cy*(1-y))},rotate:function(a,x,y){a=Ext.draw.Draw.rad(a);var me=this,cos=+Math.cos(a).toFixed(9),sin=+Math.sin(a).toFixed(9);me.add(cos,sin,-sin,cos,x-cos*x+sin*y,-sin*x+y-cos*y)},x:function(x,y){var matrix=this.matrix;return x*matrix[0][0]+y*matrix[0][1]+matrix[0][2]},y:function(x,y){var matrix=this.matrix;return x*matrix[1][0]+y*matrix[1][1]+matrix[1][2]},get:function(i,j){return+this.matrix[i][j].toFixed(4)},toString:function(){var me=this;return[me.get(0,0),me.get(0,1),me.get(1,0),me.get(1,1),0,0].join()},toSvg:function(){var me=this;return"matrix("+[me.get(0,0),me.get(1,0),me.get(0,1),me.get(1,1),me.get(0,2),me.get(1,2)].join()+")"},toFilter:function(dx,dy){var me=this;return dx=dx||0,dy=dy||0,"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', filterType='bilinear', M11="+me.get(0,0)+", M12="+me.get(0,1)+", M21="+me.get(1,0)+", M22="+me.get(1,1)+", Dx="+(me.get(0,2)+dx)+", Dy="+(me.get(1,2)+dy)+")"},offset:function(){var matrix=this.matrix;return[(matrix[0][2]||0).toFixed(4),(matrix[1][2]||0).toFixed(4)]},split:function(){function norm(a){return a[0]*a[0]+a[1]*a[1]}function normalize(a){var mag=Math.sqrt(norm(a));a[0]/=mag,a[1]/=mag}var row,matrix=this.matrix,out={translateX:matrix[0][2],translateY:matrix[1][2]};return row=[[matrix[0][0],matrix[0][1]],[matrix[1][1],matrix[1][1]]],out.scaleX=Math.sqrt(norm(row[0])),normalize(row[0]),out.shear=row[0][0]*row[1][0]+row[0][1]*row[1][1],row[1]=[row[1][0]-row[0][0]*out.shear,row[1][1]-row[0][1]*out.shear],out.scaleY=Math.sqrt(norm(row[1])),normalize(row[1]),out.shear/=out.scaleY,out.rotate=Math.asin(-row[0][1]),out.isSimple=!(+out.shear.toFixed(9)||out.scaleX.toFixed(9)!=out.scaleY.toFixed(9)&&out.rotate),out}});Ext.define("Ext.draw.SpriteDD",{extend:"Ext.dd.DragSource",constructor:function(sprite,cfg){var me=this,el=sprite.el;me.sprite=sprite,me.el=el,me.dragData={el:el,sprite:sprite},me.callParent([el,cfg]),me.sprite.setStyle("cursor","move")},showFrame:Ext.emptyFn,createFrame:Ext.emptyFn,getDragEl:function(e){return this.el},getRegion:function(){var pos,x1,x2,y1,y2,bbox,sprite,me=this,el=me.el;sprite=me.sprite,bbox=sprite.getBBox();try{pos=Ext.Element.getXY(el)}catch(e){}return pos?(x1=pos[0],x2=x1+bbox.width,y1=pos[1],y2=y1+bbox.height,new Ext.util.Region(y1,x2,y2,x1)):null},startDrag:function(x,y){var me=this;me.sprite.attr;me.prev=me.sprite.surface.transformToViewBox(x,y)},onDrag:function(e){var dx,dy,xy=e.getXY(),me=this,sprite=me.sprite,attr=sprite.attr;xy=me.sprite.surface.transformToViewBox(xy[0],xy[1]),dx=xy[0]-me.prev[0],dy=xy[1]-me.prev[1],sprite.setAttributes({translate:{x:attr.translation.x+dx,y:attr.translation.y+dy}},!0),me.prev=xy},setDragElPos:function(){return!1}});Ext.define("Ext.draw.Sprite",{mixins:{observable:"Ext.util.Observable",animate:"Ext.util.Animate"},requires:["Ext.draw.SpriteDD"],dirty:!1,dirtyHidden:!1,dirtyTransform:!1,dirtyPath:!0,dirtyFont:!0,zIndexDirty:!0,isSprite:!0,zIndex:0,fontProperties:["font","font-size","font-weight","font-style","font-family","text-anchor","text"],pathProperties:["x","y","d","path","height","width","radius","r","rx","ry","cx","cy"],constructor:function(config){var me=this;config=Ext.merge({},config||{}),me.id=Ext.id(null,"ext-sprite-"),me.transformations=[],Ext.copyTo(this,config,"surface,group,type,draggable"),me.bbox={},me.attr={zIndex:0,translation:{x:null,y:null},rotation:{degrees:null,x:null,y:null},scaling:{x:null,y:null,cx:null,cy:null}},delete config.surface,delete config.group,delete config.type,delete config.draggable,me.setAttributes(config),me.addEvents("beforedestroy","destroy","render","mousedown","mouseup","mouseover","mouseout","mousemove","click"),me.mixins.observable.constructor.apply(this,arguments)},initDraggable:function(){var me=this;me.el||me.surface.createSpriteElement(me),me.dd=new Ext.draw.SpriteDD(me,Ext.isBoolean(me.draggable)?null:me.draggable),me.on("beforedestroy",me.dd.destroy,me.dd)},setAttributes:function(attrs,redraw){var attr,i,newTranslation,translation,newRotate,rotation,newScaling,scaling,me=this,fontProps=me.fontProperties,fontPropsLength=fontProps.length,pathProps=me.pathProperties,pathPropsLength=pathProps.length,hasSurface=!!me.surface,custom=hasSurface&&me.surface.customAttributes||{},spriteAttrs=me.attr,dirtyBBox=!1;attrs=Ext.apply({},attrs);for(attr in custom)attrs.hasOwnProperty(attr)&&"function"==typeof custom[attr]&&Ext.apply(attrs,custom[attr].apply(me,[].concat(attrs[attr])));for(!!attrs.hidden!=!!spriteAttrs.hidden&&(me.dirtyHidden=!0),i=0;i<pathPropsLength;i++)if((attr=pathProps[i])in attrs&&attrs[attr]!==spriteAttrs[attr]){me.dirtyPath=!0,dirtyBBox=!0;break}"zIndex"in attrs&&(me.zIndexDirty=!0),"text"in attrs&&(me.dirtyFont=!0,dirtyBBox=!0,attrs.text=me.transformText(attrs.text));for(i=0;i<fontPropsLength;i++)if((attr=fontProps[i])in attrs&&attrs[attr]!==spriteAttrs[attr]){me.dirtyFont=!0,dirtyBBox=!0;break}return newTranslation=attrs.translation||attrs.translate,delete attrs.translate,delete attrs.translation,translation=spriteAttrs.translation,newTranslation&&("x"in newTranslation&&newTranslation.x!==translation.x||"y"in newTranslation&&newTranslation.y!==translation.y)&&(me.dirtyTransform=!0,translation.x=newTranslation.x,translation.y=newTranslation.y),newRotate=attrs.rotation||attrs.rotate,rotation=spriteAttrs.rotation,delete attrs.rotate,delete attrs.rotation,newRotate&&("x"in newRotate&&newRotate.x!==rotation.x||"y"in newRotate&&newRotate.y!==rotation.y||"degrees"in newRotate&&newRotate.degrees!==rotation.degrees)&&(me.dirtyTransform=!0,rotation.x=newRotate.x,rotation.y=newRotate.y,rotation.degrees=newRotate.degrees),newScaling=attrs.scaling||attrs.scale,scaling=spriteAttrs.scaling,delete attrs.scale,delete attrs.scaling,newScaling&&("x"in newScaling&&newScaling.x!==scaling.x||"y"in newScaling&&newScaling.y!==scaling.y||"cx"in newScaling&&newScaling.cx!==scaling.cx||"cy"in newScaling&&newScaling.cy!==scaling.cy)&&(me.dirtyTransform=!0,scaling.x=newScaling.x,scaling.y=newScaling.y,scaling.cx=newScaling.cx,scaling.cy=newScaling.cy),!me.dirtyTransform&&dirtyBBox&&(null!==spriteAttrs.scaling.x&&null!==spriteAttrs.scaling.y&&null!==spriteAttrs.rotation.y&&null!==spriteAttrs.rotation.y||(me.dirtyTransform=!0)),Ext.apply(spriteAttrs,attrs),me.dirty=!0,!0===redraw&&hasSurface&&me.redraw(),this},transformText:Ext.identityFn,getBBox:function(){return this.surface.getBBox(this)},setText:function(text){return this.surface.setText(this,text)},hide:function(redraw){return this.setAttributes({hidden:!0},redraw),this},show:function(redraw){return this.setAttributes({hidden:!1},redraw),this},remove:function(){return!!this.surface&&(this.surface.remove(this),!0)},onRemove:function(){this.surface.onRemove(this)},destroy:function(){var me=this;!1!==me.fireEvent("beforedestroy",me)&&(me.remove(),me.surface.onDestroy(me),me.clearListeners(),me.fireEvent("destroy"))},redraw:function(){var owner,me=this,changed=!me.el||me.dirty,surface=me.surface;return surface.renderItem(me),changed&&(owner=surface.owner,!me.isBackground&&owner&&(owner.viewBox||owner.autoSize)&&owner.configureSurfaceSize()),this},setStyle:function(){return this.el.setStyle.apply(this.el,arguments),this},addCls:function(obj){return this.surface.addCls(this,obj),this},removeCls:function(obj){return this.surface.removeCls(this,obj),this}});Ext.define("Ext.draw.engine.ImageExporter",{singleton:!0,defaultUrl:"http://svg.sencha.io",supportedTypes:["image/png","image/jpeg"],widthParam:"width",heightParam:"height",typeParam:"type",svgParam:"svg",formCls:Ext.baseCSSPrefix+"hide-display",generate:function(surface,config){config=config||{};var form,me=this,type=config.type;return-1!==Ext.Array.indexOf(me.supportedTypes,type)&&(form=Ext.getBody().createChild({tag:"form",method:"POST",action:config.url||me.defaultUrl,cls:me.formCls,children:[{tag:"input",type:"hidden",name:config.widthParam||me.widthParam,value:config.width||surface.width},{tag:"input",type:"hidden",name:config.heightParam||me.heightParam,value:config.height||surface.height},{tag:"input",type:"hidden",name:config.typeParam||me.typeParam,value:type},{tag:"input",type:"hidden",name:config.svgParam||me.svgParam}]}),form.last(null,!0).value=Ext.draw.engine.SvgExporter.generate(surface),form.dom.submit(),form.remove(),!0)}});Ext.define("Ext.draw.engine.Svg",{extend:"Ext.draw.Surface",requires:["Ext.draw.Draw","Ext.draw.Sprite","Ext.draw.Matrix","Ext.Element"],engine:"Svg",trimRe:/^\s+|\s+$/g,spacesRe:/\s+/,xlink:"http://www.w3.org/1999/xlink",translateAttrs:{radius:"r",radiusX:"rx",radiusY:"ry",path:"d",lineWidth:"stroke-width",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",strokeLinejoin:"stroke-linejoin"},parsers:{},minDefaults:{circle:{cx:0,cy:0,r:0,fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},ellipse:{cx:0,cy:0,rx:0,ry:0,fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},rect:{x:0,y:0,width:0,height:0,rx:0,ry:0,fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},text:{x:0,y:0,"text-anchor":"start","font-family":null,"font-size":null,"font-weight":null,"font-style":null,fill:"#000",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},path:{d:"M0,0",fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},image:{x:0,y:0,width:0,height:0,preserveAspectRatio:"none",opacity:null}},createSvgElement:function(type,attrs){var key,el=this.domRef.createElementNS("http://www.w3.org/2000/svg",type);if(attrs)for(key in attrs)el.setAttribute(key,String(attrs[key]));return el},createSpriteElement:function(sprite){var el=this.createSvgElement(sprite.type);return el.id=sprite.id,el.style&&(el.style.webkitTapHighlightColor="rgba(0,0,0,0)"),sprite.el=Ext.get(el),this.applyZIndex(sprite),sprite.matrix=new Ext.draw.Matrix,sprite.bbox={plain:0,transform:0},this.applyAttrs(sprite),this.applyTransformations(sprite),sprite.fireEvent("render",sprite),el},getBBoxText:function(sprite){var bb,height,width,i,ln,el,bbox={};if(sprite&&sprite.el){el=sprite.el.dom;try{return bbox=el.getBBox()}catch(e){}for(bbox={x:bbox.x,y:1/0,width:0,height:0},ln=el.getNumberOfChars(),i=0;i<ln;i++)bb=el.getExtentOfChar(i),bbox.y=Math.min(bb.y,bbox.y),height=bb.y+bb.height-bbox.y,bbox.height=Math.max(bbox.height,height),width=bb.x+bb.width-bbox.x,bbox.width=Math.max(bbox.width,width);return bbox}},hide:function(){Ext.get(this.el).hide()},show:function(){Ext.get(this.el).show()},hidePrim:function(sprite){this.addCls(sprite,Ext.baseCSSPrefix+"hide-visibility")},showPrim:function(sprite){this.removeCls(sprite,Ext.baseCSSPrefix+"hide-visibility")},getDefs:function(){return this._defs||(this._defs=this.createSvgElement("defs"))},transform:function(sprite,matrixOnly){for(var transform,type,matrix=new Ext.draw.Matrix,transforms=sprite.transformations,transformsLength=transforms.length,i=0;i<transformsLength;i++)transform=transforms[i],type=transform.type,"translate"==type?matrix.translate(transform.x,transform.y):"rotate"==type?matrix.rotate(transform.degrees,transform.x,transform.y):"scale"==type&&matrix.scale(transform.x,transform.y,transform.centerX,transform.centerY);sprite.matrix=matrix,matrixOnly||sprite.el.set({transform:matrix.toSvg()})},setSize:function(width,height){var me=this,el=me.el;width=+width||me.width,height=+height||me.height,me.width=width,me.height=height,el.setSize(width,height),el.set({width:width,height:height}),me.callParent([width,height])},getRegion:function(){var svgXY=this.el.getXY(),rectXY=this.bgRect.getXY(),max=Math.max,x=max(svgXY[0],rectXY[0]),y=max(svgXY[1],rectXY[1]);return{left:x,top:y,right:x+this.width,bottom:y+this.height}},onRemove:function(sprite){sprite.el&&(sprite.el.destroy(),delete sprite.el),this.callParent(arguments)},setViewBox:function(x,y,width,height){isFinite(x)&&isFinite(y)&&isFinite(width)&&isFinite(height)&&(this.callParent(arguments),this.el.dom.setAttribute("viewBox",[x,y,width,height].join(" ")))},render:function(container){var el,defs,bgRect,webkitRect,me=this;me.el||(cfg={xmlns:"http://www.w3.org/2000/svg",version:1.1,width:me.width||0,height:me.height||0},me.forceLtr&&(cfg.direction="ltr"),el=me.createSvgElement("svg",cfg),defs=me.getDefs(),bgRect=me.createSvgElement("rect",{width:"100%",height:"100%",fill:"#000",stroke:"none",opacity:0}),Ext.isSafari3&&(webkitRect=me.createSvgElement("rect",{x:-10,y:-10,width:"110%",height:"110%",fill:"none",stroke:"#000"})),el.appendChild(defs),Ext.isSafari3&&el.appendChild(webkitRect),el.appendChild(bgRect),container.appendChild(el),me.el=Ext.get(el),me.bgRect=Ext.get(bgRect),Ext.isSafari3&&(me.webkitRect=Ext.get(webkitRect),me.webkitRect.hide()),me.el.on({scope:me,mouseup:me.onMouseUp,mousedown:me.onMouseDown,mouseover:me.onMouseOver,mouseout:me.onMouseOut,mousemove:me.onMouseMove,mouseenter:me.onMouseEnter,mouseleave:me.onMouseLeave,click:me.onClick,dblclick:me.onDblClick})),me.renderAll()},onMouseEnter:function(e){this.el.parent().getRegion().contains(e.getPoint())&&this.fireEvent("mouseenter",e)},onMouseLeave:function(e){this.el.parent().getRegion().contains(e.getPoint())||this.fireEvent("mouseleave",e)},processEvent:function(name,e){var sprite,target=e.getTarget();this.surface;this.fireEvent(name,e),"tspan"==target.nodeName&&target.parentNode&&(target=target.parentNode),(sprite=this.items.get(target.id))&&sprite.fireEvent(name,sprite,e)},tuneText:function(sprite,attrs){var height,text,i,ln,factor,x,tspans=(sprite.el.dom,[]);if(attrs.hasOwnProperty("text")&&(text=sprite.tspans&&Ext.Array.map(sprite.tspans,function(t){return t.textContent}).join(""),sprite.tspans&&attrs.text==text?tspans=sprite.tspans||[]:(tspans=this.setText(sprite,attrs.text),sprite.tspans=tspans)),tspans.length){for(height=this.getBBoxText(sprite).height,x=sprite.el.dom.getAttribute("x"),i=0,ln=tspans.length;i<ln;i++)factor=Ext.isFF3_0||Ext.isFF3_5?2:4,tspans[i].setAttribute("x",x),tspans[i].setAttribute("dy",i?1.2*height:height/factor);sprite.dirty=!0}},setText:function(sprite,textString){for(var tspan,text,i,ln,texts,me=this,el=sprite.el.dom,tspans=[];el.firstChild;)el.removeChild(el.firstChild);for(texts=String(textString).split("\n"),i=0,ln=texts.length;i<ln;i++)(text=texts[i])&&(tspan=me.createSvgElement("tspan"),tspan.appendChild(document.createTextNode(Ext.htmlDecode(text))),el.appendChild(tspan),tspans[i]=tspan);return tspans},renderAll:function(){this.items.each(this.renderItem,this)},renderItem:function(sprite){this.el&&(sprite.el||this.createSpriteElement(sprite),sprite.zIndexDirty&&this.applyZIndex(sprite),sprite.dirty&&(this.applyAttrs(sprite),sprite.dirtyTransform&&this.applyTransformations(sprite)))},redraw:function(sprite){sprite.dirty=sprite.zIndexDirty=!0,this.renderItem(sprite)},applyAttrs:function(sprite){var groups,i,ln,attrs,key,style,me=this,el=sprite.el,group=sprite.group,sattr=sprite.attr,parsers=me.parsers,gradientsMap=me.gradientsMap||{},safariFix=Ext.isSafari&&!Ext.isStrict;if(group){for(groups=[].concat(group),ln=groups.length,i=0;i<ln;i++)group=groups[i],me.getGroup(group).add(sprite);delete sprite.group}attrs=me.scrubAttrs(sprite)||{},sprite.bbox.plain=0,sprite.bbox.transform=0,"circle"==sprite.type||"ellipse"==sprite.type?(attrs.cx=attrs.cx||attrs.x,attrs.cy=attrs.cy||attrs.y):"rect"==sprite.type?attrs.rx=attrs.ry=attrs.r:"path"==sprite.type&&attrs.d&&(attrs.d=Ext.draw.Draw.pathToString(Ext.draw.Draw.pathToAbsolute(attrs.d))),sprite.dirtyPath=!1,attrs["clip-rect"]&&(me.setClip(sprite,attrs),delete attrs["clip-rect"]),"text"==sprite.type&&attrs.font&&sprite.dirtyFont&&el.set({style:"font: "+attrs.font}),"image"==sprite.type&&el.dom.setAttributeNS(me.xlink,"href",attrs.src),Ext.applyIf(attrs,me.minDefaults[sprite.type]),sprite.dirtyHidden&&(sattr.hidden?me.hidePrim(sprite):me.showPrim(sprite),sprite.dirtyHidden=!1);for(key in attrs)if(attrs.hasOwnProperty(key)&&null!=attrs[key]){if(safariFix&&"color|stroke|fill".indexOf(key)>-1&&attrs[key]in gradientsMap&&(attrs[key]=gradientsMap[attrs[key]]),"hidden"==key&&"text"==sprite.type)continue;key in parsers?el.dom.setAttribute(key,parsers[key](attrs[key],sprite,me)):el.dom.setAttribute(key,attrs[key])}"text"==sprite.type&&me.tuneText(sprite,attrs),sprite.dirtyFont=!1,style=sattr.style,style&&el.setStyle(style),sprite.dirty=!1,Ext.isSafari3&&(me.webkitRect.show(),setTimeout(function(){me.webkitRect.hide()}))},setClip:function(sprite,params){var clipEl,clipPath,me=this,rect=params["clip-rect"];rect&&(sprite.clip&&sprite.clip.parentNode.parentNode.removeChild(sprite.clip.parentNode),clipEl=me.createSvgElement("clipPath"),clipPath=me.createSvgElement("rect"),clipEl.id=Ext.id(null,"ext-clip-"),clipPath.setAttribute("x",rect.x),clipPath.setAttribute("y",rect.y),clipPath.setAttribute("width",rect.width),clipPath.setAttribute("height",rect.height),clipEl.appendChild(clipPath),me.getDefs().appendChild(clipEl),sprite.el.dom.setAttribute("clip-path","url(#"+clipEl.id+")"),sprite.clip=clipPath)},applyZIndex:function(sprite){var prevEl,me=this,items=me.items,idx=items.indexOf(sprite),el=sprite.el;if(me.el.dom.childNodes[idx+2]!==el.dom){if(idx>0)do{prevEl=items.getAt(--idx).el}while(!prevEl&&idx>0);el.insertAfter(prevEl||me.bgRect)}sprite.zIndexDirty=!1},createItem:function(config){var sprite=new Ext.draw.Sprite(config);return sprite.surface=this,sprite},addGradient:function(gradient){gradient=Ext.draw.Draw.parseGradient(gradient);var gradientEl,stop,stopEl,i,gradientsMap,me=this,ln=gradient.stops.length,vector=gradient.vector,usePlain=Ext.isSafari&&!Ext.isStrict;if(gradientsMap=me.gradientsMap||{},usePlain)gradientsMap["url(#"+gradient.id+")"]=gradient.stops[0].color;else for("linear"==gradient.type?(gradientEl=me.createSvgElement("linearGradient"),gradientEl.setAttribute("x1",vector[0]),gradientEl.setAttribute("y1",vector[1]),gradientEl.setAttribute("x2",vector[2]),gradientEl.setAttribute("y2",vector[3])):(gradientEl=me.createSvgElement("radialGradient"),gradientEl.setAttribute("cx",gradient.centerX),gradientEl.setAttribute("cy",gradient.centerY),gradientEl.setAttribute("r",gradient.radius),Ext.isNumber(gradient.focalX)&&Ext.isNumber(gradient.focalY)&&(gradientEl.setAttribute("fx",gradient.focalX),gradientEl.setAttribute("fy",gradient.focalY))),gradientEl.id=gradient.id,me.getDefs().appendChild(gradientEl),i=0;i<ln;i++)stop=gradient.stops[i],stopEl=me.createSvgElement("stop"),stopEl.setAttribute("offset",stop.offset+"%"),stopEl.setAttribute("stop-color",stop.color),stopEl.setAttribute("stop-opacity",stop.opacity),gradientEl.appendChild(stopEl);me.gradientsMap=gradientsMap},hasCls:function(sprite,className){return className&&-1!=(" "+(sprite.el.dom.getAttribute("class")||"")+" ").indexOf(" "+className+" ")},addCls:function(sprite,className){var i,len,v,el=sprite.el,cls=[],curCls=el.getAttribute("class")||"";if(Ext.isArray(className)){for(i=0,len=className.length;i<len;i++)"string"==typeof(v=className[i])&&-1==(" "+curCls+" ").indexOf(" "+v+" ")&&cls.push(v);cls.length&&el.set({class:" "+cls.join(" ")})}else"string"!=typeof className||this.hasCls(sprite,className)||el.set({class:curCls+" "+className})},removeCls:function(sprite,className){var i,idx,len,cls,elClasses,me=this,el=sprite.el,curCls=el.getAttribute("class")||"";if(Ext.isArray(className)||(className=[className]),curCls){for(elClasses=curCls.replace(me.trimRe," ").split(me.spacesRe),i=0,len=className.length;i<len;i++)"string"==typeof(cls=className[i])&&(cls=cls.replace(me.trimRe,""),-1!=(idx=Ext.Array.indexOf(elClasses,cls))&&Ext.Array.erase(elClasses,idx,1));el.set({class:elClasses.join(" ")})}},destroy:function(){var me=this;me.callParent(),me.el&&me.el.remove(),me._defs&&Ext.get(me._defs).destroy(),me.bgRect&&Ext.get(me.bgRect).destroy(),me.webkitRect&&Ext.get(me.webkitRect).destroy(),delete me.el}});Ext.define("Ext.draw.engine.SvgExporter",function(){var surface,len,width,height,commaRe=/,/g,fontRegex=/(-?\d*\.?\d*){1}(em|ex|px|in|cm|mm|pt|pc|%)\s('*.*'*)/,rgbColorRe=/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/g,rgbaColorRe=/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,([\d\.]+)\)/g,init=function(s){surface=s,len=surface.length,width=surface.width,height=surface.height},spriteProcessor={path:function(sprite){var p,pLen,attr=sprite.attr,path=attr.path,pathString="";if(Ext.isArray(path[0]))for(pLen=path.length,p=0;p<pLen;p++)pathString+=path[p].join(" ");else pathString=Ext.isArray(path)?path.join(" "):path.replace(commaRe," ");return"<path "+toPropertyString({d:pathString,fill:attr.fill||"none",stroke:attr.stroke,"fill-opacity":attr.opacity,"stroke-width":attr["stroke-width"],"stroke-opacity":attr["stroke-opacity"],"z-index":attr.zIndex,transform:sprite.matrix.toSvg()})+"/>"},text:function(sprite){var attr=sprite.attr,match=fontRegex.exec(attr.font),size=match&&match[1]||"12",family=match&&match[3]||"Arial",text=attr.text,factor=Ext.isFF3_0||Ext.isFF3_5?2:4,tspanString="";return sprite.getBBox(),tspanString+='<tspan x="'+(attr.x||"")+'" dy="',tspanString+=size/factor+'">',tspanString+=Ext.htmlEncode(text)+"</tspan>","<text "+toPropertyString({x:attr.x,y:attr.y,"font-size":size,"font-family":family,"font-weight":attr["font-weight"],"text-anchor":attr["text-anchor"],fill:attr.fill||"#000","fill-opacity":attr.opacity,transform:sprite.matrix.toSvg()})+">"+tspanString+"</text>"},rect:function(sprite){var attr=sprite.attr;return"<rect "+toPropertyString({x:attr.x,y:attr.y,rx:attr.rx,ry:attr.ry,width:attr.width,height:attr.height,fill:attr.fill||"none","fill-opacity":attr.opacity,stroke:attr.stroke,"stroke-opacity":attr["stroke-opacity"],"stroke-width":attr["stroke-width"],transform:sprite.matrix&&sprite.matrix.toSvg()})+"/>"},circle:function(sprite){var attr=sprite.attr;return"<circle "+toPropertyString({cx:attr.x,cy:attr.y,r:attr.radius,fill:attr.translation.fill||attr.fill||"none","fill-opacity":attr.opacity,stroke:attr.stroke,"stroke-opacity":attr["stroke-opacity"],"stroke-width":attr["stroke-width"],transform:sprite.matrix.toSvg()})+" />"},image:function(sprite){var attr=sprite.attr;return"<image "+toPropertyString({x:attr.x-(attr.width/2>>0),y:attr.y-(attr.height/2>>0),width:attr.width,height:attr.height,"xlink:href":attr.src,transform:sprite.matrix.toSvg()})+" />"}},svgHeader=function(){var svg='<?xml version="1.0" standalone="yes"?>';return svg+='<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'},svgContent=function(){var item,itemsLen,items,gradient,getSvgString,colorstops,stop,coll,keys,colls,k,kLen,key,i,stopsLen,sortedItems,za,zb,svg='<svg width="'+width+'px" height="'+height+'px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">',defs="";if(items=surface.items.items,itemsLen=items.length,getSvgString=function(node){for(var attrLength,j,child,attr,tagName,attrItem,childs=node.childNodes,childLength=childs.length,i=0,svgString="";i<childLength;i++){for(child=childs[i],attr=child.attributes,tagName=child.tagName,svgString+="<"+tagName,j=0,attrLength=attr.length;j<attrLength;j++)attrItem=attr.item(j),svgString+=" "+attrItem.name+'="'+attrItem.value+'"';svgString+=">",child.childNodes.length>0&&(svgString+=getSvgString(child)),svgString+="</"+tagName+">"}return svgString},surface.getDefs)defs=getSvgString(surface.getDefs());else for(coll=surface.gradientsColl,coll&&(keys=coll.keys,colls=coll.items,k=0,kLen=keys.length);k<kLen;k++){key=keys[k],colls[k],gradient=surface.gradientsColl.getByKey(key),defs+='<linearGradient id="'+key+'" x1="0" y1="0" x2="1" y2="1">';var color=gradient.colors.replace(rgbColorRe,"rgb($1|$2|$3)");for(color=color.replace(rgbaColorRe,"rgba($1|$2|$3|$4)"),colorstops=color.split(","),i=0,stopsLen=colorstops.length;i<stopsLen;i++)stop=colorstops[i].split(" "),color=Ext.draw.Color.fromString(stop[1].replace(/\|/g,",")),defs+='<stop offset="'+stop[0]+'" stop-color="'+color.toString()+'" stop-opacity="1"></stop>';defs+="</linearGradient>"}for(svg+="<defs>"+defs+"</defs>",svg+=spriteProcessor.rect({attr:{width:"100%",height:"100%",fill:"#fff",stroke:"none",opacity:"0"}}),sortedItems=new Array(itemsLen),i=0;i<itemsLen;i++)sortedItems[i]=i;for(sortedItems.sort(function(a,b){return za=items[a].attr.zIndex||0,zb=items[b].attr.zIndex||0,za==zb?a-b:za-zb}),i=0;i<itemsLen;i++)item=items[sortedItems[i]],item.attr.hidden||(svg+=spriteProcessor[item.type](item));return svg+="</svg>"},toPropertyString=function(obj){var key,propString="";for(key in obj)obj.hasOwnProperty(key)&&null!=obj[key]&&(propString+=key+'="'+obj[key]+'" ');return propString};return{singleton:!0,generate:function(surface,config){return config=config||{},init(surface),svgHeader()+svgContent()}}});Ext.define("Ext.draw.engine.Vml",{extend:"Ext.draw.Surface",requires:["Ext.draw.Draw","Ext.draw.Color","Ext.draw.Sprite","Ext.draw.Matrix","Ext.Element"],engine:"Vml",map:{M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},bitesRe:/([clmz]),?([^clmz]*)/gi,valRe:/-?[^,\s\-]+/g,fillUrlRe:/^url\(\s*['"]?([^\)]+?)['"]?\s*\)$/i,pathlike:/^(path|rect)$/,NonVmlPathRe:/[ahqstv]/gi,partialPathRe:/[clmz]/g,fontFamilyRe:/^['"]+|['"]+$/g,baseVmlCls:Ext.baseCSSPrefix+"vml-base",vmlGroupCls:Ext.baseCSSPrefix+"vml-group",spriteCls:Ext.baseCSSPrefix+"vml-sprite",measureSpanCls:Ext.baseCSSPrefix+"vml-measure-span",zoom:21600,coordsize:1e3,coordorigin:"0 0",zIndexShift:0,orderSpritesByZIndex:!1,path2vml:function(path){var res,pa,p,r,i,ii,j,jj,me=this,nonVML=me.NonVmlPathRe,map=me.map,val=me.valRe,zoom=me.zoom,bites=me.bitesRe,command=Ext.Function.bind(Ext.draw.Draw.pathToAbsolute,Ext.draw.Draw);if(String(path).match(nonVML))command=Ext.Function.bind(Ext.draw.Draw.path2curve,Ext.draw.Draw);else if(!String(path).match(me.partialPathRe))return res=String(path).replace(bites,function(all,command,args){var vals=[],isMove="m"==command.toLowerCase(),res=map[command];return args.replace(val,function(value){isMove&&2===vals.length&&(res+=vals+map["m"==command?"l":"L"],vals=[]),vals.push(Math.round(value*zoom))}),res+vals});for(pa=command(path),res=[],i=0,ii=pa.length;i<ii;i++){for(p=pa[i],r=pa[i][0].toLowerCase(),"z"==r&&(r="x"),j=1,jj=p.length;j<jj;j++)r+=Math.round(p[j]*me.zoom)+(j!=jj-1?",":"");res.push(r)}return res.join(" ")},translateAttrs:{radius:"r",radiusX:"rx",radiusY:"ry",lineWidth:"stroke-width",fillOpacity:"fill-opacity",strokeOpacity:"stroke-opacity",strokeLinejoin:"stroke-linejoin"},minDefaults:{circle:{fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},ellipse:{cx:0,cy:0,rx:0,ry:0,fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},rect:{x:0,y:0,width:0,height:0,rx:0,ry:0,fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},text:{x:0,y:0,"text-anchor":"start",font:'10px "Arial"',fill:"#000",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},path:{d:"M0,0",fill:"none",stroke:null,"stroke-width":null,opacity:null,"fill-opacity":null,"stroke-opacity":null},image:{x:0,y:0,width:0,height:0,preserveAspectRatio:"none",opacity:null}},onMouseEnter:function(e){this.fireEvent("mouseenter",e)},onMouseLeave:function(e){this.fireEvent("mouseleave",e)},processEvent:function(name,e){var sprite,target=e.getTarget();this.surface;this.fireEvent(name,e),(sprite=this.items.get(target.id))&&sprite.fireEvent(name,sprite,e)},createSpriteElement:function(sprite){var path,skew,textPath,me=this,attr=sprite.attr,type=sprite.type,zoom=me.zoom,vml=sprite.vml||(sprite.vml={}),el=(Math.round,"image"===type?me.createNode("image"):me.createNode("shape"));return el.coordsize=zoom+" "+zoom,el.coordorigin=attr.coordorigin||"0 0",Ext.get(el).addCls(me.spriteCls),"text"==type&&(vml.path=path=me.createNode("path"),path.textpathok=!0,vml.textpath=textPath=me.createNode("textpath"),textPath.on=!0,el.appendChild(textPath),el.appendChild(path)),el.id=sprite.id,sprite.el=Ext.get(el),sprite.el.setStyle("zIndex",-me.zIndexShift),me.el.appendChild(el),"image"!==type&&(skew=me.createNode("skew"),skew.on=!0,el.appendChild(skew),sprite.skew=skew),sprite.matrix=new Ext.draw.Matrix,sprite.bbox={plain:null,transform:null},this.applyAttrs(sprite),this.applyTransformations(sprite),sprite.fireEvent("render",sprite),sprite.el},getBBoxText:function(sprite){var vml=sprite.vml;return{x:vml.X+(vml.bbx||0)-vml.W/2,y:vml.Y-vml.H/2,width:vml.W,height:vml.H}},applyAttrs:function(sprite){var style,groups,i,ln,scrubbedAttrs,cx,cy,rx,ry,me=this,group=(sprite.vml,sprite.group),spriteAttr=sprite.attr,el=sprite.el,dom=el.dom;if(group){for(groups=[].concat(group),ln=groups.length,i=0;i<ln;i++)group=groups[i],me.getGroup(group).add(sprite);delete sprite.group}scrubbedAttrs=me.scrubAttrs(sprite)||{},sprite.zIndexDirty&&me.setZIndex(sprite),Ext.applyIf(scrubbedAttrs,me.minDefaults[sprite.type]),"image"==sprite.type&&(Ext.apply(sprite.attr,{x:scrubbedAttrs.x,y:scrubbedAttrs.y,width:scrubbedAttrs.width,height:scrubbedAttrs.height}),el.setStyle({width:scrubbedAttrs.width+"px",height:scrubbedAttrs.height+"px"}),dom.src=scrubbedAttrs.src),dom.href&&(dom.href=scrubbedAttrs.href),dom.title&&(dom.title=scrubbedAttrs.title),dom.target&&(dom.target=scrubbedAttrs.target),dom.cursor&&(dom.cursor=scrubbedAttrs.cursor),sprite.dirtyHidden&&(scrubbedAttrs.hidden?me.hidePrim(sprite):me.showPrim(sprite),sprite.dirtyHidden=!1),sprite.dirtyPath&&("circle"==sprite.type||"ellipse"==sprite.type?(cx=scrubbedAttrs.x,cy=scrubbedAttrs.y,rx=scrubbedAttrs.rx||scrubbedAttrs.r||0,ry=scrubbedAttrs.ry||scrubbedAttrs.r||0,dom.path=Ext.String.format("ar{0},{1},{2},{3},{4},{1},{4},{1}",Math.round((cx-rx)*me.zoom),Math.round((cy-ry)*me.zoom),Math.round((cx+rx)*me.zoom),Math.round((cy+ry)*me.zoom),Math.round(cx*me.zoom)),sprite.dirtyPath=!1):"text"!==sprite.type&&"image"!==sprite.type&&(sprite.attr.path=scrubbedAttrs.path=me.setPaths(sprite,scrubbedAttrs)||scrubbedAttrs.path,dom.path=me.path2vml(scrubbedAttrs.path),sprite.dirtyPath=!1)),"clip-rect"in scrubbedAttrs&&me.setClip(sprite,scrubbedAttrs),"text"==sprite.type&&me.setTextAttributes(sprite,scrubbedAttrs),(scrubbedAttrs.opacity||scrubbedAttrs["stroke-opacity"]||scrubbedAttrs.fill)&&me.setFill(sprite,scrubbedAttrs),(scrubbedAttrs.stroke||scrubbedAttrs["stroke-opacity"]||scrubbedAttrs.fill)&&me.setStroke(sprite,scrubbedAttrs),style=spriteAttr.style,style&&el.setStyle(style),sprite.dirty=!1},setZIndex:function(sprite){var items,iLen,item,i,me=this,zIndex=sprite.attr.zIndex,shift=me.zIndexShift;if(zIndex<shift){for(items=me.items.items,iLen=items.length,i=0;i<iLen;i++)(zIndex=items[i].attr.zIndex)&&zIndex<shift&&(shift=zIndex);for(me.zIndexShift=shift,i=0;i<iLen;i++)item=items[i],item.el&&item.el.setStyle("zIndex",item.attr.zIndex-shift),item.zIndexDirty=!1}else sprite.el&&(sprite.el.setStyle("zIndex",zIndex-shift),sprite.zIndexDirty=!1)},setPaths:function(sprite,params){var spriteAttr=sprite.attr;sprite.attr["stroke-width"];return sprite.bbox.plain=null,sprite.bbox.transform=null,"circle"==sprite.type?(spriteAttr.rx=spriteAttr.ry=params.r,Ext.draw.Draw.ellipsePath(sprite)):"ellipse"==sprite.type?(spriteAttr.rx=params.rx,spriteAttr.ry=params.ry,Ext.draw.Draw.ellipsePath(sprite)):"rect"==sprite.type?(spriteAttr.rx=spriteAttr.ry=params.r,Ext.draw.Draw.rectPath(sprite)):!("path"!=sprite.type||!spriteAttr.path)&&Ext.draw.Draw.pathToAbsolute(spriteAttr.path)},setFill:function(sprite,params){var gradient,fillUrl,rotation,angle,me=this,el=sprite.el.dom,fillEl=el.fill,newfill=!1;fillEl||(fillEl=el.fill=me.createNode("fill"),newfill=!0),Ext.isArray(params.fill)&&(params.fill=params.fill[0]),"none"==params.fill?fillEl.on=!1:("number"==typeof params.opacity&&(fillEl.opacity=params.opacity),"number"==typeof params["fill-opacity"]&&(fillEl.opacity=params["fill-opacity"]),fillEl.on=!0,"string"==typeof params.fill&&(fillUrl=params.fill.match(me.fillUrlRe),fillUrl?(fillUrl=fillUrl[1],"#"==fillUrl.charAt(0)&&(gradient=me.gradientsColl.getByKey(fillUrl.substring(1))),gradient?(rotation=params.rotation,angle=-(gradient.angle+270+(rotation?rotation.degrees:0))%360,0===angle&&(angle=180),fillEl.angle=angle,fillEl.type="gradient",fillEl.method="sigma",fillEl.colors?fillEl.colors.value=gradient.colors:fillEl.colors=gradient.colors):(fillEl.src=fillUrl,fillEl.type="tile")):(fillEl.color=Ext.draw.Color.toHex(params.fill),fillEl.src="",fillEl.type="solid"))),newfill&&el.appendChild(fillEl)},setStroke:function(sprite,params){var width,opacity,me=this,el=sprite.el.dom,strokeEl=sprite.strokeEl,newStroke=!1;strokeEl||(strokeEl=sprite.strokeEl=me.createNode("stroke"),newStroke=!0),Ext.isArray(params.stroke)&&(params.stroke=params.stroke[0]),params.stroke&&"none"!=params.stroke&&0!=params.stroke&&0!=params["stroke-width"]?(strokeEl.on=!0,params.stroke&&!params.stroke.match(me.fillUrlRe)&&(strokeEl.color=Ext.draw.Color.toHex(params.stroke)),strokeEl.dashstyle=params["stroke-dasharray"]?"dash":"solid",strokeEl.joinstyle=params["stroke-linejoin"],strokeEl.endcap=params["stroke-linecap"]||"round",strokeEl.miterlimit=params["stroke-miterlimit"]||8,width=.75*parseFloat(params["stroke-width"]||1),opacity=params["stroke-opacity"]||1,Ext.isNumber(width)&&width<1?(strokeEl.weight=1,strokeEl.opacity=opacity*width):(strokeEl.weight=width,strokeEl.opacity=opacity)):strokeEl.on=!1,newStroke&&el.appendChild(strokeEl)},setClip:function(sprite,params){var me=this,clipEl=(sprite.el,sprite.clipEl),rect=String(params["clip-rect"]).split(me.separatorRe);clipEl||(clipEl=sprite.clipEl=me.el.insertFirst(Ext.getDoc().dom.createElement("div")),clipEl.addCls(Ext.baseCSSPrefix+"vml-sprite")),4==rect.length?(rect[2]=+rect[2]+ +rect[0],rect[3]=+rect[3]+ +rect[1],clipEl.setStyle("clip",Ext.String.format("rect({1}px {2}px {3}px {0}px)",rect[0],rect[1],rect[2],rect[3])),clipEl.setSize(me.el.width,me.el.height)):clipEl.setStyle("clip","")},setTextAttributes:function(sprite,params){var fontProp,paramProp,me=this,vml=sprite.vml,textStyle=vml.textpath.style,spanCacheStyle=me.span.style,zoom=me.zoom,fontObj=(Math.round,{fontSize:"font-size",fontWeight:"font-weight",fontStyle:"font-style"});if(sprite.dirtyFont){params.font&&(textStyle.font=spanCacheStyle.font=params.font),params["font-family"]&&(textStyle.fontFamily='"'+params["font-family"].split(",")[0].replace(me.fontFamilyRe,"")+'"',spanCacheStyle.fontFamily=params["font-family"]);for(fontProp in fontObj)(paramProp=params[fontObj[fontProp]])&&(textStyle[fontProp]=spanCacheStyle[fontProp]=paramProp);me.setText(sprite,params.text),vml.textpath.string&&(me.span.innerHTML=String(vml.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br/>")),vml.W=me.span.offsetWidth,vml.H=me.span.offsetHeight+2,"middle"==params["text-anchor"]?textStyle["v-text-align"]="center":"end"==params["text-anchor"]?(textStyle["v-text-align"]="right",vml.bbx=-Math.round(vml.W/2)):(textStyle["v-text-align"]="left",vml.bbx=Math.round(vml.W/2))}vml.X=params.x,vml.Y=params.y,vml.path.v=Ext.String.format("m{0},{1}l{2},{1}",Math.round(vml.X*zoom),Math.round(vml.Y*zoom),Math.round(vml.X*zoom)+1),sprite.bbox.plain=null,sprite.bbox.transform=null,sprite.dirtyFont=!1},setText:function(sprite,text){sprite.vml.textpath.string=Ext.htmlDecode(text)},hide:function(){this.el.hide()},show:function(){this.el.show()},hidePrim:function(sprite){sprite.el.addCls(Ext.baseCSSPrefix+"hide-visibility")},showPrim:function(sprite){sprite.el.removeCls(Ext.baseCSSPrefix+"hide-visibility")},setSize:function(width,height){var me=this;width=width||me.width,height=height||me.height,me.width=width,me.height=height,me.el&&(void 0!=width&&me.el.setWidth(width),void 0!=height&&me.el.setHeight(height)),me.callParent(arguments)},applyViewBox:function(){var items,iLen,i,me=this,viewBox=me.viewBox,width=me.width,height=me.height;if(me.callParent(),viewBox&&(width||height))for(items=me.items.items,iLen=items.length,i=0;i<iLen;i++)me.applyTransformations(items[i])},onAdd:function(item){this.callParent(arguments),this.el&&this.renderItem(item)},onRemove:function(sprite){sprite.el&&(sprite.el.remove(),delete sprite.el),this.callParent(arguments)},render:function(container){var el,me=this,doc=Ext.getDoc().dom;if(!me.createNode)try{doc.namespaces.rvml||doc.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),me.createNode=function(tagName){return doc.createElement("<rvml:"+tagName+' class="rvml">')}}catch(e){me.createNode=function(tagName){return doc.createElement("<"+tagName+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}me.el||(el=doc.createElement("div"),me.el=Ext.get(el),me.el.addCls(me.baseVmlCls),me.span=doc.createElement("span"),Ext.get(me.span).addCls(me.measureSpanCls),el.appendChild(me.span),me.el.setSize(me.width||0,me.height||0),container.appendChild(el),me.el.on({scope:me,mouseup:me.onMouseUp,mousedown:me.onMouseDown,mouseover:me.onMouseOver,mouseout:me.onMouseOut,mousemove:me.onMouseMove,mouseenter:me.onMouseEnter,mouseleave:me.onMouseLeave,click:me.onClick,dblclick:me.onDblClick})),me.renderAll()},renderAll:function(){this.items.each(this.renderItem,this)},redraw:function(sprite){sprite.dirty=!0,this.renderItem(sprite)},renderItem:function(sprite){this.el&&(sprite.el||this.createSpriteElement(sprite),sprite.dirty&&(this.applyAttrs(sprite),sprite.dirtyTransform&&this.applyTransformations(sprite)))},rotationCompensation:function(deg,dx,dy){var matrix=new Ext.draw.Matrix;return matrix.rotate(-deg,.5,.5),{x:matrix.x(dx,dy),y:matrix.y(dx,dy)}},transform:function(sprite,matrixOnly){for(var transform,type,offset,me=this,bbox=me.getBBox(sprite,!0),matrix=(bbox.x,bbox.width,bbox.y,bbox.height,new Ext.draw.Matrix),transforms=sprite.transformations,transformsLength=transforms.length,i=0,deltaDegrees=0,deltaScaleX=1,deltaScaleY=1,el=sprite.el,dom=el.dom,domStyle=dom.style,skew=(me.zoom,sprite.skew),shift=me.viewBoxShift;i<transformsLength;i++)transform=transforms[i],type=transform.type,"translate"==type?matrix.translate(transform.x,transform.y):"rotate"==type?(matrix.rotate(transform.degrees,transform.x,transform.y),deltaDegrees+=transform.degrees):"scale"==type&&(matrix.scale(transform.x,transform.y,transform.centerX,transform.centerY),deltaScaleX*=transform.x,deltaScaleY*=transform.y);sprite.matrix=matrix.clone(),matrixOnly||(shift&&matrix.prepend(shift.scale,0,0,shift.scale,shift.dx*shift.scale,shift.dy*shift.scale),"image"!=sprite.type&&skew?(skew.origin="0,0",skew.matrix=matrix.toString(),offset=matrix.offset(),offset[0]>32767?offset[0]=32767:offset[0]<-32768&&(offset[0]=-32768),offset[1]>32767?offset[1]=32767:offset[1]<-32768&&(offset[1]=-32768),skew.offset=offset):(domStyle.filter=matrix.toFilter(),domStyle.left=Math.min(matrix.x(bbox.x,bbox.y),matrix.x(bbox.x+bbox.width,bbox.y),matrix.x(bbox.x,bbox.y+bbox.height),matrix.x(bbox.x+bbox.width,bbox.y+bbox.height))+"px",domStyle.top=Math.min(matrix.y(bbox.x,bbox.y),matrix.y(bbox.x+bbox.width,bbox.y),matrix.y(bbox.x,bbox.y+bbox.height),matrix.y(bbox.x+bbox.width,bbox.y+bbox.height))+"px"))},createItem:function(config){return Ext.create("Ext.draw.Sprite",config)},getRegion:function(){return this.el.getRegion()},addCls:function(sprite,className){sprite&&sprite.el&&sprite.el.addCls(className)},removeCls:function(sprite,className){sprite&&sprite.el&&sprite.el.removeCls(className)},addGradient:function(gradient){var keys,items,iLen,key,item,i,gradients=this.gradientsColl||(this.gradientsColl=Ext.create("Ext.util.MixedCollection")),colors=[],stops=Ext.create("Ext.util.MixedCollection");for(stops.addAll(gradient.stops),stops.sortByKey("ASC",function(a,b){return a=parseInt(a,10),b=parseInt(b,10),a>b?1:a<b?-1:0}),keys=stops.keys,items=stops.items,iLen=keys.length,i=0;i<iLen;i++)key=keys[i],item=items[i],colors.push(key+"% "+item.color);gradients.add(gradient.id,{colors:colors.join(","),angle:gradient.angle})},destroy:function(){var me=this;me.callParent(arguments),me.el&&me.el.remove(),delete me.el}});Ext.define("Ext.flash.Component",{extend:"Ext.Component",alternateClassName:"Ext.FlashComponent",alias:"widget.flash",flashVersion:"9.0.115",backgroundColor:"#ffffff",wmode:"opaque",swfWidth:"100%",swfHeight:"100%",expressInstall:!1,renderTpl:['<div id="{swfId}" role="presentation"></div>'],initComponent:function(){"swfobject"in window||Ext.Error.raise("The SWFObject library is not loaded. Ext.flash.Component requires SWFObject version 2.2 or later: http://code.google.com/p/swfobject/"),this.url||Ext.Error.raise('The "url" config is required for Ext.flash.Component'),this.callParent(),this.addEvents("success","failure")},beforeRender:function(){this.callParent(),Ext.applyIf(this.renderData,{swfId:this.getSwfId()})},afterRender:function(){var me=this,flashParams=Ext.apply({},me.flashParams),flashVars=Ext.apply({},me.flashVars);me.callParent(),flashParams=Ext.apply({allowScriptAccess:"always",bgcolor:me.backgroundColor,wmode:me.wmode},flashParams),flashVars=Ext.apply({allowedDomain:document.location.hostname},flashVars),new swfobject.embedSWF(me.url,me.getSwfId(),me.swfWidth,me.swfHeight,me.flashVersion,me.expressInstall?me.statics.EXPRESS_INSTALL_URL:void 0,flashVars,flashParams,me.flashAttributes,Ext.bind(me.swfCallback,me))},swfCallback:function(e){var me=this;e.success?(me.swf=Ext.get(e.ref),me.onSuccess(),me.fireEvent("success",me)):(me.onFailure(),me.fireEvent("failure",me))},getSwfId:function(){return this.swfId||(this.swfId="extswf"+this.getAutoId())},onSuccess:function(){this.swf.setStyle("visibility","inherit")},onFailure:Ext.emptyFn,beforeDestroy:function(){var me=this,swf=me.swf;swf&&(swfobject.removeSWF(me.getSwfId()),Ext.destroy(swf),delete me.swf),me.callParent()},statics:{EXPRESS_INSTALL_URL:"http://swfobject.googlecode.com/svn/trunk/swfobject/expressInstall.swf"}});Ext.define("Ext.form.action.Action",{alternateClassName:"Ext.form.Action",submitEmptyText:!0,constructor:function(config){config&&Ext.apply(this,config);var params=config.params;Ext.isString(params)&&(this.params=Ext.Object.fromQueryString(params))},run:Ext.emptyFn,onFailure:function(response){this.response=response,this.failureType=Ext.form.action.Action.CONNECT_FAILURE,this.form.afterAction(this,!1)},processResponse:function(response){return this.response=response,!response.responseText&&!response.responseXML||(this.result=this.handleResponse(response))},getUrl:function(){return this.url||this.form.url},getMethod:function(){return(this.method||this.form.method||"POST").toUpperCase()},getParams:function(){return Ext.apply({},this.params,this.form.baseParams)},createCallback:function(){var me=this,form=me.form;return{success:me.onSuccess,failure:me.onFailure,scope:me,timeout:1e3*this.timeout||1e3*form.timeout,upload:form.fileUpload?me.onSuccess:void 0}},statics:{CLIENT_INVALID:"client",SERVER_INVALID:"server",CONNECT_FAILURE:"connect",LOAD_FAILURE:"load"}});Ext.define("Ext.form.action.Load",{extend:"Ext.form.action.Action",requires:["Ext.data.Connection"],alternateClassName:"Ext.form.Action.Load",alias:"formaction.load",type:"load",run:function(){Ext.Ajax.request(Ext.apply(this.createCallback(),{method:this.getMethod(),url:this.getUrl(),headers:this.headers,params:this.getParams()}))},onSuccess:function(response){var result=this.processResponse(response),form=this.form;if(!0===result||!result.success||!result.data)return this.failureType=Ext.form.action.Action.LOAD_FAILURE,void form.afterAction(this,!1);form.clearInvalid(),form.setValues(result.data),form.afterAction(this,!0)},handleResponse:function(response){var rs,data,reader=this.form.reader;return reader?(rs=reader.read(response),data=rs.records&&rs.records[0]?rs.records[0].data:null,{success:rs.success,data:data}):Ext.decode(response.responseText)}});Ext.define("Ext.form.action.Submit",{extend:"Ext.form.action.Action",alternateClassName:"Ext.form.Action.Submit",alias:"formaction.submit",type:"submit",run:function(){var me=this,form=me.form;!1===me.clientValidation||form.isValid()?me.doSubmit():(me.failureType=Ext.form.action.Action.CLIENT_INVALID,form.afterAction(me,!1))},doSubmit:function(){var formInfo,me=this,ajaxOptions=Ext.apply(me.createCallback(),{url:me.getUrl(),method:me.getMethod(),headers:me.headers}),form=me.form,jsonSubmit=me.jsonSubmit||form.jsonSubmit,paramsProp=jsonSubmit?"jsonData":"params";form.hasUpload()?(formInfo=me.buildForm(),ajaxOptions.form=formInfo.formEl,ajaxOptions.isUpload=!0):ajaxOptions[paramsProp]=me.getParams(jsonSubmit),Ext.Ajax.request(ajaxOptions),formInfo&&me.cleanup(formInfo)},cleanup:function(formInfo){var i,field,formEl=formInfo.formEl,uploadEls=formInfo.uploadEls,uploadFields=formInfo.uploadFields,len=uploadFields.length;for(i=0;i<len;++i)field=uploadFields[i],field.clearOnSubmit||field.restoreInput(uploadEls[i]);formEl&&Ext.removeNode(formEl)},getParams:function(useModelValues){var configParams=this.callParent(),fieldParams=this.form.getValues(!1,!1,!1!==this.submitEmptyText,useModelValues,!0);return Ext.apply({},fieldParams,configParams)},buildForm:function(){var formSpec,formEl,i,field,key,value,v,vLen,el,me=this,fieldsSpec=[],basicForm=me.form,params=me.getParams(),uploadFields=[],uploadEls=[],fields=basicForm.getFields().items,len=fields.length;for(i=0;i<len;++i)field=fields[i],field.isFileUpload()&&uploadFields.push(field);for(key in params)if(params.hasOwnProperty(key))if(value=params[key],Ext.isArray(value))for(vLen=value.length,v=0;v<vLen;v++)fieldsSpec.push(me.getFieldConfig(key,value[v]));else fieldsSpec.push(me.getFieldConfig(key,value));for(formSpec={tag:"form",role:"presentation",action:me.getUrl(),method:me.getMethod(),target:me.target||"_self",style:"display:none",cn:fieldsSpec},uploadFields.length&&(formSpec.encoding=formSpec.enctype="multipart/form-data"),formEl=Ext.DomHelper.append(Ext.getBody(),formSpec),len=uploadFields.length,i=0;i<len;++i)el=uploadFields[i].extractFileInput(),formEl.appendChild(el),uploadEls.push(el);return{formEl:formEl,uploadFields:uploadFields,uploadEls:uploadEls}},getFieldConfig:function(name,value){return{tag:"input",type:"hidden",name:name,value:Ext.String.htmlEncode(value)}},onSuccess:function(response){var form=this.form,success=!0,result=this.processResponse(response);!0===result||result.success||(result.errors&&form.markInvalid(result.errors),this.failureType=Ext.form.action.Action.SERVER_INVALID,success=!1),form.afterAction(this,success)},handleResponse:function(response){var rs,errors,i,len,records,result,form=this.form,errorReader=form.errorReader;if(errorReader){if(rs=errorReader.read(response),records=rs.records,errors=[],records)for(i=0,len=records.length;i<len;i++)errors[i]=records[i].data;errors.length<1&&(errors=null),result={success:rs.success,errors:errors}}else try{result=Ext.decode(response.responseText)}catch(e){result={success:!1,errors:[]}}return result}});Ext.define("Ext.util.ComponentDragger",{extend:"Ext.dd.DragTracker",autoStart:500,constructor:function(comp,config){this.comp=comp,this.initialConstrainTo=config.constrainTo,this.callParent([config])},onStart:function(e){var me=this,comp=me.comp;me.startPosition=comp.getXY(),comp.ghost&&!comp.liveDrag&&(me.proxy=comp.ghost(),me.dragTarget=me.proxy.header.el),(me.constrain||me.constrainDelegate)&&(me.constrainTo=me.calculateConstrainRegion()),comp.beginDrag&&comp.beginDrag()},calculateConstrainRegion:function(){var constrainEl,delegateRegion,elRegion,me=this,comp=me.comp,constrainTo=me.initialConstrainTo,constraintInsets=comp.constraintInsets,dragEl=me.proxy?me.proxy.el:comp.el,shadowSize=!me.constrainDelegate&&dragEl.shadow&&comp.constrainShadow&&!dragEl.shadowDisabled?dragEl.shadow.getShadowSize():0;return constrainTo instanceof Ext.util.Region?constrainTo=constrainTo.copy():(constrainEl=Ext.fly(constrainTo),constrainTo=constrainEl.getViewRegion(),constrainTo.right=constrainTo.left+constrainEl.dom.clientWidth),constraintInsets&&(constraintInsets=Ext.isObject(constraintInsets)?constraintInsets:Ext.Element.parseBox(constraintInsets),constrainTo.adjust(constraintInsets.top,constraintInsets.right,constraintInsets.bottom,constraintInsets.length)),shadowSize&&constrainTo.adjust(shadowSize[0],-shadowSize[1],-shadowSize[2],shadowSize[3]),me.constrainDelegate||(delegateRegion=Ext.fly(me.dragTarget).getRegion(),elRegion=dragEl.getRegion(),constrainTo.adjust(delegateRegion.top-elRegion.top,delegateRegion.right-elRegion.right,delegateRegion.bottom-elRegion.bottom,delegateRegion.left-elRegion.left)),constrainTo},onDrag:function(e){var me=this,comp=me.proxy&&!me.comp.liveDrag?me.proxy:me.comp,offset=me.getOffset(me.constrain||me.constrainDelegate?"dragTarget":null);comp.setPagePosition(me.startPosition[0]+offset[0],me.startPosition[1]+offset[1])},onEnd:function(e){var comp=this.comp;comp.isDestroyed||comp.destroying||(this.proxy&&!comp.liveDrag&&comp.unghost(),comp.endDrag&&comp.endDrag())}});Ext.define("Ext.window.Window",{extend:"Ext.panel.Panel",alternateClassName:"Ext.Window",requires:["Ext.util.ComponentDragger","Ext.util.Region","Ext.EventManager"],alias:"widget.window",baseCls:Ext.baseCSSPrefix+"window",resizable:!0,draggable:!0,constrain:!1,constrainHeader:!1,plain:!1,minimizable:!1,maximizable:!1,minHeight:50,minWidth:50,expandOnShow:!0,collapsible:!1,closable:!0,hidden:!0,autoRender:!0,hideMode:"offsets",floating:!0,itemCls:Ext.baseCSSPrefix+"window-item",initialAlphaNum:/^[a-z0-9]/,overlapHeader:!0,ignoreHeaderBorderManagement:!0,alwaysFramed:!0,isRootCfg:{isRoot:!0},isWindow:!0,ariaRole:"dialog",initComponent:function(){var me=this;me.frame=!1,me.callParent(),me.addEvents("resize","maximize","minimize","restore"),me.plain&&me.addClsWithUI("plain"),me.addStateEvents(["maximize","restore","resize","dragend"])},getElConfig:function(){var elConfig,me=this;return elConfig=me.callParent(),elConfig.tabIndex=-1,elConfig},getState:function(){var pos,me=this,state=me.callParent()||{},maximized=!!me.maximized,ghostBox=me.ghostBox;return state.maximized=maximized,pos=maximized?me.restorePos:ghostBox?[ghostBox.x,ghostBox.y]:me.getPosition(),Ext.apply(state,{size:maximized?me.restoreSize:me.getSize(),pos:pos}),state},applyState:function(state){var me=this;state&&(me.maximized=state.maximized,me.maximized?(me.hasSavedRestore=!0,me.restoreSize=state.size,me.restorePos=state.pos):Ext.apply(me,{width:state.size.width,height:state.size.height,x:state.pos[0],y:state.pos[1]}))},onRender:function(ct,position){var me=this;me.callParent(arguments),me.focusEl=me.el,me.maximizable&&me.header.on({scope:me,dblclick:me.toggleMaximize})},afterRender:function(){var keyMap,me=this,header=me.header;me.callParent(),me.maximized&&(me.maximized=!1,me.maximize(),header&&header.removeCls(header.indicateDragCls)),me.closable?(keyMap=me.getKeyMap(),keyMap.on(27,me.onEsc,me)):keyMap=me.keyMap,keyMap&&me.hidden&&keyMap.disable()},initDraggable:function(){this.initSimpleDraggable()},initResizable:function(){this.callParent(arguments),this.maximized&&this.resizer.disable()},onEsc:function(k,e){Ext.FocusManager&&Ext.FocusManager.enabled&&Ext.FocusManager.focusedCmp!==this||(e.stopEvent(),this.close())},beforeDestroy:function(){var me=this;me.rendered&&(delete this.animateTarget,me.hide(),Ext.destroy(me.keyMap)),me.callParent()},addTools:function(){var me=this;me.callParent(),me.minimizable&&me.addTool({type:"minimize",handler:Ext.Function.bind(me.minimize,me,[])}),me.maximizable&&(me.addTool({type:"maximize",handler:Ext.Function.bind(me.maximize,me,[])}),me.addTool({type:"restore",handler:Ext.Function.bind(me.restore,me,[]),hidden:!0}))},getFocusEl:function(){return this.getDefaultFocus()},getDefaultFocus:function(){var result,selector,me=this,defaultComp=me.defaultButton||me.defaultFocus;return void 0!==defaultComp&&(Ext.isNumber(defaultComp)?result=me.query("button")[defaultComp]:Ext.isString(defaultComp)?(selector=defaultComp,selector.match(me.initialAlphaNum)&&(result=me.down("#"+selector)),result||(result=me.down(selector))):defaultComp.focus&&(result=defaultComp)),result||me.el},onFocus:function(){var focusDescendant,me=this;Ext.FocusManager&&Ext.FocusManager.enabled||(focusDescendant=me.getDefaultFocus())===me?me.callParent(arguments):focusDescendant.focus()},onShow:function(){var me=this;me.callParent(arguments),me.expandOnShow&&me.expand(!1),me.syncMonitorWindowResize(),me.keyMap&&me.keyMap.enable()},doClose:function(){var me=this;me.hidden?(me.fireEvent("close",me),"destroy"==me.closeAction&&this.destroy()):me.hide(me.animateTarget,me.doClose,me)},afterHide:function(){var me=this;me.syncMonitorWindowResize(),me.keyMap&&me.keyMap.disable(),me.callParent(arguments)},onWindowResize:function(){var sizeModel,me=this;me.maximized?me.fitContainer():(sizeModel=me.getSizeModel(),(sizeModel.width.natural||sizeModel.height.natural)&&me.updateLayout(),me.doConstrain())},minimize:function(){return this.fireEvent("minimize",this),this},resumeHeaderLayout:function(changed){this.header.resumeLayouts(changed?this.isRootCfg:null)},afterCollapse:function(){var me=this,header=me.header,tools=me.tools;header&&me.maximizable&&(header.suspendLayouts(),tools.maximize.hide(),tools.restore.hide(),this.resumeHeaderLayout(!0)),me.resizer&&me.resizer.disable(),me.callParent(arguments)},afterExpand:function(){var changed,me=this,header=me.header,tools=me.tools;header&&(header.suspendLayouts(),me.maximized?(tools.restore.show(),changed=!0):me.maximizable&&(tools.maximize.show(),changed=!0),this.resumeHeaderLayout(changed)),me.resizer&&me.resizer.enable(),me.callParent(arguments)},maximize:function(animate){var changed,me=this,header=me.header,tools=me.tools,width=me.width,height=me.height;return me.maximized||(me.expand(!1),me.hasSavedRestore||(me.restoreSize={width:Ext.isNumber(width)?width:null,height:Ext.isNumber(height)?height:null},me.restorePos=me.getPosition(!0)),header&&(header.suspendLayouts(),tools.maximize&&(tools.maximize.hide(),changed=!0),tools.restore&&(tools.restore.show(),changed=!0),me.collapseTool&&(me.collapseTool.hide(),changed=!0),me.resumeHeaderLayout(changed)),me.el.disableShadow(),me.dd&&(me.dd.disable(),header&&header.removeCls(header.indicateDragCls)),me.resizer&&me.resizer.disable(),me.el.addCls(Ext.baseCSSPrefix+"window-maximized"),me.container.addCls(Ext.baseCSSPrefix+"window-maximized-ct"),me.syncMonitorWindowResize(),me.fitContainer(animate=animate||me.animateTarget?{callback:function(){me.maximized=!0,me.fireEvent("maximize",me)}}:null),animate||(me.maximized=!0,me.fireEvent("maximize",me))),me},restore:function(animate){var changed,me=this,tools=me.tools,header=me.header,newBox=me.restoreSize;return me.maximized&&(me.hasSavedRestore=null,me.removeCls(Ext.baseCSSPrefix+"window-maximized"),header&&(header.suspendLayouts(),tools.restore&&(tools.restore.hide(),changed=!0),tools.maximize&&(tools.maximize.show(),changed=!0),me.collapseTool&&(me.collapseTool.show(),changed=!0),me.resumeHeaderLayout(changed)),newBox.x=me.restorePos[0],newBox.y=me.restorePos[1],me.setBox(newBox,animate=animate||me.animateTarget?{callback:function(){me.el.enableShadow(!0),me.maximized=!1,me.fireEvent("restore",me)}}:null),me.restorePos=me.restoreSize=null,me.dd&&(me.dd.enable(),header&&header.addCls(header.indicateDragCls)),me.resizer&&me.resizer.enable(),me.container.removeCls(Ext.baseCSSPrefix+"window-maximized-ct"),me.syncMonitorWindowResize(),animate||(me.el.enableShadow(!0),me.maximized=!1,me.fireEvent("restore",me))),me},syncMonitorWindowResize:function(){var me=this,currentlyMonitoring=me._monitoringResize,yes=me.monitorResize||me.constrain||me.constrainHeader||me.maximized,veto=me.hidden||me.destroying||me.isDestroyed;yes&&!veto?currentlyMonitoring||(Ext.EventManager.onWindowResize(me.onWindowResize,me,{delay:1}),me._monitoringResize=!0):currentlyMonitoring&&(Ext.EventManager.removeResizeListener(me.onWindowResize,me),me._monitoringResize=!1)},toggleMaximize:function(){return this[this.maximized?"restore":"maximize"]()},createGhost:function(){var ghost=this.callParent(arguments);return ghost.xtype="window",ghost}});Ext.define("Ext.form.Labelable",{requires:["Ext.XTemplate"],isLabelable:!0,autoEl:{tag:"table",cellpadding:0,role:"presentation"},childEls:["labelCell","labelEl","bodyEl","sideErrorCell","errorEl","inputRow"],labelableRenderTpl:['<tr role="presentation" id="{id}-inputRow" <tpl if="inFormLayout">id="{id}"</tpl> class="{inputRowCls}">','<tpl if="labelOnLeft">','<td role="presentation" id="{id}-labelCell" style="{labelCellStyle}" {labelCellAttrs}>',"{beforeLabelTpl}",'<label id="{id}-labelEl" {labelAttrTpl}','<tpl if="inputId && !(boxLabel && !fieldLabel)"> for="{inputId}"</tpl>',' class="{labelCls}"','<tpl if="labelStyle"> style="{labelStyle}"</tpl>',' unselectable="on"',">","{beforeLabelTextTpl}",'<tpl if="fieldLabel">{fieldLabel}','<tpl if="labelSeparator">','<span role="separator">{labelSeparator}</span>',"</tpl>","</tpl>","{afterLabelTextTpl}","</label>","{afterLabelTpl}","</td>","</tpl>",'<td role="presentation" class="{baseBodyCls} {fieldBodyCls} {extraFieldBodyCls}" id="{id}-bodyEl" colspan="{bodyColspan}" role="presentation">',"{beforeBodyEl}","<tpl if=\"labelAlign=='top'\">","{beforeLabelTpl}",'<div role="presentation" id="{id}-labelCell" style="{labelCellStyle}">','<label id="{id}-labelEl" {labelAttrTpl}<tpl if="inputId"> for="{inputId}"</tpl> class="{labelCls}"','<tpl if="labelStyle"> style="{labelStyle}"</tpl>',' unselectable="on"',">","{beforeLabelTextTpl}",'<tpl if="fieldLabel">{fieldLabel}','<tpl if="labelSeparator">','<span role="separator">{labelSeparator}</span>',"</tpl>","</tpl>","{afterLabelTextTpl}","</label>","</div>","{afterLabelTpl}","</tpl>","{beforeSubTpl}","{[values.$comp.getSubTplMarkup(values)]}","{afterSubTpl}","<tpl if=\"msgTarget==='side'\">","{afterBodyEl}","</td>","<td role=\"presentation\" id=\"{id}-sideErrorCell\" vAlign=\"{[values.labelAlign==='top' && !values.hideLabel ? 'bottom' : 'middle']}\" style=\"{[values.autoFitErrors ? 'display:none' : '']}\" width=\"{errorIconWidth}\">",'<div role="alert" aria-live="polite" id="{id}-errorEl" class="{errorMsgCls}" style="display:none"></div>',"</td>","<tpl elseif=\"msgTarget=='under'\">",'<div role="alert" aria-live="polite" id="{id}-errorEl" class="{errorMsgClass}" colspan="2" style="display:none"></div>',"{afterBodyEl}","</td>","</tpl>","</tr>",{disableFormats:!0}],activeErrorsTpl:void 0,htmlActiveErrorsTpl:['<tpl if="errors && errors.length">','<ul class="{listCls}">','<tpl if="Ext.enableAria">','<tpl if="fieldLabel"><div>{fieldLabel}</div></tpl>',"</tpl>",'<tpl for="errors"><li>{.}</li></tpl>',"</ul>","</tpl>"],plaintextActiveErrorsTpl:['<tpl if="errors && errors.length">','<tpl if="Ext.enableAria">','<tpl if="fieldLabel">{fieldLabel}\n</tpl>',"</tpl>",'<tpl for="errors"><tpl if="xindex &gt; 1">\n</tpl>{.}</tpl>',"</tpl>"],isFieldLabelable:!0,formItemCls:Ext.baseCSSPrefix+"form-item",labelCls:Ext.baseCSSPrefix+"form-item-label",errorMsgCls:Ext.baseCSSPrefix+"form-error-msg",baseBodyCls:Ext.baseCSSPrefix+"form-item-body",inputRowCls:Ext.baseCSSPrefix+"form-item-input-row",fieldBodyCls:"",clearCls:Ext.baseCSSPrefix+"clear",invalidCls:Ext.baseCSSPrefix+"form-invalid",fieldLabel:void 0,labelAlign:"left",labelWidth:100,labelPad:5,labelSeparator:":",hideLabel:!1,hideEmptyLabel:!0,preventMark:!1,autoFitErrors:!0,msgTarget:"qtip",noWrap:!0,labelableInsertions:["beforeBodyEl","afterBodyEl","beforeLabelTpl","afterLabelTpl","beforeSubTpl","afterSubTpl","beforeLabelTextTpl","afterLabelTextTpl","labelAttrTpl"],labelableRenderProps:["allowBlank","id","labelAlign","fieldBodyCls","extraFieldBodyCls","baseBodyCls","clearCls","labelSeparator","msgTarget","inputRowCls"],initLabelable:function(){var me=this,padding=me.padding;padding&&(me.padding=void 0,me.extraMargins=Ext.Element.parseBox(padding)),me.activeErrorsTpl||("title"==me.msgTarget?me.activeErrorsTpl=me.plaintextActiveErrorsTpl:me.activeErrorsTpl=me.htmlActiveErrorsTpl),me.addCls(Ext.plainTableCls),me.addCls(me.formItemCls),me.lastActiveError="",me.addEvents("errorchange"),me.enableBubble("errorchange")},trimLabelSeparator:function(){var me=this,separator=me.labelSeparator,label=me.fieldLabel||"";return label.substr(label.length-1)===separator?label.slice(0,-1):label},getFieldLabel:function(){return this.trimLabelSeparator()},setFieldLabel:function(label){label=label||"";var me=this,separator=me.labelSeparator,labelEl=me.labelEl;me.fieldLabel=label,me.rendered&&(Ext.isEmpty(label)&&me.hideEmptyLabel?labelEl.parent().setDisplayed("none"):(separator&&(label=me.trimLabelSeparator()+separator),labelEl.update(label),labelEl.parent().setDisplayed("")),me.updateLayout())},getInsertionRenderData:function(data,names){for(var name,value,i=names.length;i--;)name=names[i],value=this[name],value&&"string"!=typeof value&&(value.isTemplate||(value=Ext.XTemplate.getTpl(this,name)),value=value.apply(data)),data[name]=value||"";return data},getLabelableRenderData:function(){var data,tempEl,me=this,topLabel="top"===me.labelAlign;return Ext.form.Labelable.errorIconWidth||(tempEl=Ext.getBody().createChild({style:"position:absolute",cls:Ext.baseCSSPrefix+"form-invalid-icon"}),Ext.form.Labelable.errorIconWidth=tempEl.getWidth()+tempEl.getMargin("l"),tempEl.remove()),data=Ext.copyTo({inFormLayout:me.ownerLayout&&"form"===me.ownerLayout.type,inputId:me.getInputId(),labelOnLeft:!topLabel,hideLabel:!me.hasVisibleLabel(),fieldLabel:me.getFieldLabel(),labelCellStyle:me.getLabelCellStyle(),labelCellAttrs:me.getLabelCellAttrs(),labelCls:me.getLabelCls(),labelStyle:me.getLabelStyle(),bodyColspan:me.getBodyColspan(),externalError:!me.autoFitErrors,errorMsgCls:me.getErrorMsgCls(),errorIconWidth:Ext.form.Labelable.errorIconWidth,boxLabel:me.boxLabel},me,me.labelableRenderProps,!0),me.getInsertionRenderData(data,me.labelableInsertions),data},xhooks:{beforeRender:function(){var me=this;me.setFieldDefaults(me.getHierarchyState().fieldDefaults),me.ownerLayout&&me.addCls(Ext.baseCSSPrefix+me.ownerLayout.type+"-form-item")},onRender:function(){var margins,side,me=this,style={};if(me.extraMargins){margins=me.el.getMargin();for(side in margins)margins.hasOwnProperty(side)&&(style["margin-"+side]=margins[side]+me.extraMargins[side]+"px");me.el.setStyle(style)}}},hasVisibleLabel:function(){return!this.hideLabel&&!(this.hideEmptyLabel&&!this.getFieldLabel())},getLabelWidth:function(){var me=this;return me.hasVisibleLabel()?me.labelWidth+me.labelPad:0},getBodyColspan:function(){var result,me=this;return result="side"!==me.msgTarget||me.autoFitErrors&&!me.hasActiveError()?2:1,"top"===me.labelAlign||me.hasVisibleLabel()||result++,result},getLabelCls:function(){var labelCls=this.labelCls+" "+Ext.dom.Element.unselectableCls,labelClsExtra=this.labelClsExtra;return labelClsExtra?labelCls+" "+labelClsExtra:labelCls},getLabelCellStyle:function(){var me=this;return me.hideLabel||!me.getFieldLabel()&&me.hideEmptyLabel?"display:none;":""},getErrorMsgCls:function(){var me=this,hideLabelCell=me.hideLabel||!me.fieldLabel&&me.hideEmptyLabel;return me.errorMsgCls+(hideLabelCell||"top"!==me.labelAlign?"":" "+Ext.baseCSSPrefix+"lbl-top-err-icon")},getLabelCellAttrs:function(){var me=this,labelAlign=me.labelAlign,result="";return"top"!==labelAlign&&(result='valign="top" halign="'+labelAlign+'" width="'+(me.labelWidth+me.labelPad)+'"'),result+' class="'+Ext.baseCSSPrefix+'field-label-cell"'},getLabelStyle:function(){var me=this,labelPad=me.labelPad,labelStyle="";return"top"!==me.labelAlign&&(me.labelWidth&&(labelStyle="width:"+me.labelWidth+"px;"),labelPad&&(labelStyle+="margin-right:"+labelPad+"px;")),labelStyle+(me.labelStyle||"")},getSubTplMarkup:function(){return""},getInputId:function(){return""},getActiveError:function(){return this.activeError||""},hasActiveError:function(){return!!this.getActiveError()},setActiveError:function(msg){this.setActiveErrors(msg)},getActiveErrors:function(){return this.activeErrors||[]},setActiveErrors:function(errors){var tpl,me=this;errors=Ext.Array.from(errors),tpl=me.getTpl("activeErrorsTpl"),me.activeErrors=errors,me.activeError=tpl.apply({fieldLabel:me.fieldLabel,errors:errors,listCls:Ext.plainListCls}),me.renderActiveError()},unsetActiveError:function(){delete this.activeError,delete this.activeErrors,this.renderActiveError()},renderActiveError:function(){var me=this,activeError=me.getActiveError(),hasError=!!activeError;activeError!==me.lastActiveError&&(me.fireEvent("errorchange",me,activeError),me.lastActiveError=activeError),!me.rendered||me.isDestroyed||me.preventMark||(me.el[hasError?"addCls":"removeCls"](me.invalidCls),me.errorEl&&(me.errorEl.dom.innerHTML=activeError))},setFieldDefaults:function(defaults){var key;for(key in defaults)this.hasOwnProperty(key)||(this[key]=defaults[key])}});Ext.define("Ext.form.field.Field",{isFormField:!0,disabled:!1,submitValue:!0,validateOnChange:!0,suspendCheckChange:0,initField:function(){this.addEvents("change","validitychange","dirtychange"),this.initValue();var badNames=["tagName","nodeName","children","childNodes"],name=this.name;name&&Ext.Array.indexOf(badNames,name)>-1&&Ext.log.warn(['It is recommended to not use "',name,'" as a field name, because it ',"can cause naming collisions during form submission."].join(""))},initValue:function(){var me=this;me.value=me.transformOriginalValue(me.value),me.originalValue=me.lastValue=me.value,me.suspendCheckChange++,me.setValue(me.value),me.suspendCheckChange--},transformOriginalValue:Ext.identityFn,getName:function(){return this.name},getValue:function(){return this.value},setValue:function(value){var me=this;return me.value=value,me.checkChange(),me},isEqual:function(value1,value2){return String(value1)===String(value2)},isEqualAsString:function(value1,value2){return String(Ext.value(value1,""))===String(Ext.value(value2,""))},getSubmitData:function(){var me=this,data=null;return!me.disabled&&me.submitValue&&(data={},data[me.getName()]=""+me.getValue()),data},getModelData:function(includeEmptyText,isSubmitting){var me=this,data=null;return me.disabled||!me.submitValue&&isSubmitting||(data={},data[me.getName()]=me.getValue()),data},reset:function(){var me=this;me.beforeReset(),me.setValue(me.originalValue),me.clearInvalid(),delete me.wasValid},beforeReset:Ext.emptyFn,resetOriginalValue:function(){this.originalValue=this.getValue(),this.checkDirty()},checkChange:function(){var newVal,oldVal,me=this;me.suspendCheckChange||(newVal=me.getValue(),oldVal=me.lastValue,!me.isDestroyed&&me.didValueChange(newVal,oldVal)&&(me.lastValue=newVal,me.fireEvent("change",me,newVal,oldVal),me.onChange(newVal,oldVal)))},didValueChange:function(newVal,oldVal){return!this.isEqual(newVal,oldVal)},onChange:function(newVal,oldVal){this.validateOnChange&&this.validate(),this.checkDirty()},isDirty:function(){var me=this;return!me.disabled&&!me.isEqual(me.getValue(),me.originalValue)},checkDirty:function(){var me=this,isDirty=me.isDirty();isDirty!==me.wasDirty&&(me.fireEvent("dirtychange",me,isDirty),me.onDirtyChange(isDirty),me.wasDirty=isDirty)},onDirtyChange:Ext.emptyFn,getErrors:function(value){return[]},isValid:function(){var me=this;return me.disabled||Ext.isEmpty(me.getErrors())},validate:function(){var me=this,isValid=me.isValid();return isValid!==me.wasValid&&(me.wasValid=isValid,me.fireEvent("validitychange",me,isValid)),isValid},batchChanges:function(fn){try{this.suspendCheckChange++,fn()}catch(e){throw e}finally{this.suspendCheckChange--}this.checkChange()},isFileUpload:function(){return!1},extractFileInput:function(){return null},markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn});Ext.define("Ext.layout.component.field.Field",{extend:"Ext.layout.component.Auto",alias:"layout.field",uses:["Ext.tip.QuickTip","Ext.util.TextMetrics","Ext.util.CSS"],type:"field",naturalSizingProp:"size",beginLayout:function(ownerContext){var me=this,owner=me.owner;me.callParent(arguments),ownerContext.labelStrategy=me.getLabelStrategy(),ownerContext.errorStrategy=me.getErrorStrategy(),ownerContext.labelContext=ownerContext.getEl("labelEl"),ownerContext.bodyCellContext=ownerContext.getEl("bodyEl"),ownerContext.inputContext=ownerContext.getEl("inputEl"),ownerContext.errorContext=ownerContext.getEl("errorEl"),Ext.isIE7m&&Ext.isStrict&&ownerContext.inputContext&&(me.ieInputWidthAdjustment=ownerContext.inputContext.getPaddingInfo().width+ownerContext.inputContext.getBorderInfo().width),ownerContext.labelStrategy.prepare(ownerContext,owner),ownerContext.errorStrategy.prepare(ownerContext,owner)},beginLayoutCycle:function(ownerContext){var width,me=this,owner=me.owner,widthModel=ownerContext.widthModel,ownerNaturalSize=owner[me.naturalSizingProp];me.callParent(arguments),widthModel.shrinkWrap?me.beginLayoutShrinkWrap(ownerContext):widthModel.natural?("number"!=typeof ownerNaturalSize||owner.inputWidth?me.beginLayoutShrinkWrap(ownerContext):me.beginLayoutFixed(ownerContext,width=6.5*ownerNaturalSize+20,"px"),ownerContext.setWidth(width,!1)):me.beginLayoutFixed(ownerContext,"100","%")},beginLayoutFixed:function(ownerContext,width,suffix){var owner=ownerContext.target,inputEl=owner.inputEl,inputWidth=owner.inputWidth;owner.el.setStyle("table-layout","fixed"),owner.bodyEl.setStyle("width",width+suffix),inputEl&&(inputWidth?inputEl.setStyle("width",inputWidth+"px"):inputEl.setStyle("width",owner.stretchInputElFixed?"100%":"")),ownerContext.isFixed=!0},beginLayoutShrinkWrap:function(ownerContext){var owner=ownerContext.target,inputEl=owner.inputEl,inputWidth=owner.inputWidth;inputEl&&inputEl.dom&&(inputEl.dom.removeAttribute("size"),inputWidth?inputEl.setStyle("width",inputWidth+"px"):inputEl.setStyle("width","")),owner.el.setStyle("table-layout","auto"),owner.bodyEl.setStyle("width","")},finishedLayout:function(ownerContext){var owner=this.owner;this.callParent(arguments),ownerContext.labelStrategy.finishedLayout(ownerContext,owner),ownerContext.errorStrategy.finishedLayout(ownerContext,owner)},calculateOwnerHeightFromContentHeight:function(ownerContext,contentHeight){return contentHeight},measureContentHeight:function(ownerContext){return ownerContext.el.getHeight()},measureContentWidth:function(ownerContext){return ownerContext.el.getWidth()},measureLabelErrorHeight:function(ownerContext){return ownerContext.labelStrategy.getHeight(ownerContext)+ownerContext.errorStrategy.getHeight(ownerContext)},onFocus:function(){this.getErrorStrategy().onFocus(this.owner)},getLabelStrategy:function(){var me=this,strategies=me.labelStrategies;return strategies[me.owner.labelAlign]||strategies.base},getErrorStrategy:function(){var me=this,owner=me.owner,strategies=me.errorStrategies,msgTarget=owner.msgTarget;return!owner.preventMark&&Ext.isString(msgTarget)?strategies[msgTarget]||strategies.elementId:strategies.none},labelStrategies:function(){var base={prepare:function(ownerContext,owner){var cls=owner.labelCls+"-"+owner.labelAlign,labelEl=owner.labelEl;labelEl&&labelEl.addCls(cls)},getHeight:function(){return 0},finishedLayout:Ext.emptyFn};return{base:base,top:Ext.applyIf({getHeight:function(ownerContext){var labelContext=ownerContext.labelContext,props=labelContext.props,height=props.height;return void 0===height&&(props.height=height=labelContext.el.getHeight()+labelContext.getMarginInfo().height),height}},base),left:base,right:base}}(),errorStrategies:function(){function showTip(owner){var target,tip=Ext.layout.component.field.Field.tip;tip&&tip.isVisible()&&(target=tip.activeTarget)&&target.el===owner.getActionEl().dom&&tip.toFront(!0)}var iconWidth,applyIf=Ext.applyIf,emptyFn=Ext.emptyFn,iconCls=Ext.baseCSSPrefix+"form-invalid-icon",base={prepare:function(ownerContext,owner){var el=owner.errorEl;el&&el.setDisplayed(!1)},getHeight:function(){return 0},onFocus:emptyFn,finishedLayout:emptyFn};return{none:base,side:applyIf({prepare:function(ownerContext,owner){var tempEl,errorEl=owner.errorEl,sideErrorCell=owner.sideErrorCell,displayError=owner.hasActiveError();iconWidth||(iconWidth=(tempEl=Ext.getBody().createChild({style:"position:absolute",cls:iconCls})).getWidth(),tempEl.remove()),errorEl.addCls(iconCls),errorEl.set({"data-errorqtip":owner.getActiveError()||""}),owner.autoFitErrors?errorEl.setDisplayed(displayError):errorEl.setVisible(displayError),sideErrorCell&&owner.autoFitErrors&&sideErrorCell.setDisplayed(displayError),owner.bodyEl.dom.colSpan=owner.getBodyColspan(),Ext.layout.component.field.Field.initTip()},onFocus:showTip},base),under:applyIf({prepare:function(ownerContext,owner){var errorEl=owner.errorEl,cls=Ext.baseCSSPrefix+"form-invalid-under";errorEl.addCls(cls),errorEl.setDisplayed(owner.hasActiveError())},getHeight:function(ownerContext){var errorContext,props,height=0;return ownerContext.target.hasActiveError()&&(errorContext=ownerContext.errorContext,props=errorContext.props,void 0===(height=props.height)&&(props.height=height=errorContext.el.getHeight())),height}},base),qtip:applyIf({prepare:function(ownerContext,owner){Ext.layout.component.field.Field.initTip(),owner.getActionEl().dom.setAttribute("data-errorqtip",owner.getActiveError()||"")},onFocus:showTip},base),title:applyIf({prepare:function(ownerContext,owner){owner.getActionEl().dom.setAttribute("title",owner.getActiveError()||"")}},base),elementId:applyIf({prepare:function(ownerContext,owner){var targetEl=Ext.fly(owner.msgTarget);targetEl&&(targetEl.dom.innerHTML=owner.getActiveError()||"",targetEl.setDisplayed(owner.hasActiveError()))}},base)}}(),statics:{initTip:function(){var tip=this.tip;tip||(tip=this.tip=Ext.create("Ext.tip.QuickTip",{sticky:!0,ui:"form-invalid"}),tip.tagConfig=Ext.apply({},{attribute:"errorqtip"},tip.tagConfig))},destroyTip:function(){var tip=this.tip;tip&&(tip.destroy(),delete this.tip)}}});Ext.define("Ext.form.field.Base",{extend:"Ext.Component",mixins:{labelable:"Ext.form.Labelable",field:"Ext.form.field.Field"},alias:"widget.field",alternateClassName:["Ext.form.Field","Ext.form.BaseField"],requires:["Ext.util.DelayedTask","Ext.XTemplate","Ext.layout.component.field.Field"],fieldSubTpl:['<input id="{id}" type="{type}" role="{role}" {inputAttrTpl}',' size="1"','<tpl if="name"> name="{name}"</tpl>','<tpl if="value"> value="{[Ext.util.Format.htmlEncode(values.value)]}"</tpl>','<tpl if="placeholder"> placeholder="{placeholder}"</tpl>','{%if (values.maxLength !== undefined){%} maxlength="{maxLength}"{%}%}','<tpl if="readOnly"> readonly="readonly"</tpl>','<tpl if="disabled"> disabled="disabled"</tpl>','<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>','<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',' class="{fieldCls} {typeCls} {editableCls} {inputCls}" autocomplete="off"/>',{disableFormats:!0}],subTplInsertions:["inputAttrTpl"],inputType:"text",invalidText:"The value in this field is invalid",fieldCls:Ext.baseCSSPrefix+"form-field",focusCls:"form-focus",dirtyCls:Ext.baseCSSPrefix+"form-dirty",checkChangeEvents:Ext.isIE&&(!document.documentMode||document.documentMode<9)?["change","propertychange","keyup"]:["change","input","textInput","keyup","dragdrop"],checkChangeBuffer:50,componentLayout:"field",readOnly:!1,readOnlyCls:Ext.baseCSSPrefix+"form-readonly",validateOnBlur:!0,hasFocus:!1,baseCls:Ext.baseCSSPrefix+"field",maskOnDisable:!1,stretchInputElFixed:!0,initComponent:function(){var me=this;me.callParent(),me.subTplData=me.subTplData||{},me.addEvents("specialkey","writeablechange"),me.initLabelable(),me.initField(),me.name||(me.name=me.getInputId()),me.readOnly&&me.addCls(me.readOnlyCls),me.addCls(Ext.baseCSSPrefix+"form-type-"+me.inputType)},getInputId:function(){return this.inputId||(this.inputId=this.id+"-inputEl")},getSubTplData:function(){var data,me=this,type=me.inputType,inputId=me.getInputId();return data=Ext.apply({id:inputId,cmpId:me.id,name:me.name||inputId,disabled:me.disabled,readOnly:me.readOnly,value:me.getRawValue(),type:type,fieldCls:me.fieldCls,fieldStyle:me.getFieldStyle(),tabIdx:me.tabIndex,inputCls:me.inputCls,typeCls:Ext.baseCSSPrefix+"form-"+("password"===type?"text":type),role:me.ariaRole},me.subTplData),me.getInsertionRenderData(data,me.subTplInsertions),data},applyRenderSelectors:function(){var me=this;me.callParent(),me.addChildEls("inputEl"),me.inputEl=me.el.getById(me.getInputId())},getSubTplMarkup:function(){return this.getTpl("fieldSubTpl").apply(this.getSubTplData())},initRenderTpl:function(){var me=this;return me.hasOwnProperty("renderTpl")||(me.renderTpl=me.getTpl("labelableRenderTpl")),me.callParent()},initRenderData:function(){return Ext.applyIf(this.callParent(),this.getLabelableRenderData())},setFieldStyle:function(style){var me=this,inputEl=me.inputEl;inputEl&&inputEl.applyStyles(style),me.fieldStyle=style},getFieldStyle:function(){var style=this.fieldStyle;return Ext.isObject(style)?Ext.DomHelper.generateStyles(style,null,!0):style||""},onRender:function(){this.callParent(arguments),this.renderActiveError()},getFocusEl:function(){return this.inputEl},isFileUpload:function(){return"file"===this.inputType},getSubmitData:function(){var val,me=this,data=null;return!me.disabled&&me.submitValue&&null!==(val=me.getSubmitValue())&&(data={},data[me.getName()]=val),data},getSubmitValue:function(){return this.processRawValue(this.getRawValue())},getRawValue:function(){var me=this,v=me.inputEl?me.inputEl.getValue():Ext.value(me.rawValue,"");return me.rawValue=v,v},setRawValue:function(value){var me=this;return value=Ext.value(me.transformRawValue(value),""),me.rawValue=value,me.inputEl&&(me.inputEl.dom.value=value),value},transformRawValue:Ext.identityFn,valueToRaw:function(value){return""+Ext.value(value,"")},rawToValue:Ext.identityFn,processRawValue:Ext.identityFn,getValue:function(){var me=this,val=me.rawToValue(me.processRawValue(me.getRawValue()));return me.value=val,val},setValue:function(value){var me=this;return me.setRawValue(me.valueToRaw(value)),me.mixins.field.setValue.call(me,value)},onBoxReady:function(){var me=this;me.callParent(),me.setReadOnlyOnBoxReady&&me.setReadOnly(me.readOnly)},onDisable:function(){var me=this,inputEl=me.inputEl;me.callParent(),inputEl&&(inputEl.dom.disabled=!0,me.hasActiveError()&&(me.clearInvalid(),me.needsValidateOnEnable=!0))},onEnable:function(){var me=this,inputEl=me.inputEl;me.callParent(),inputEl&&(inputEl.dom.disabled=!1,me.needsValidateOnEnable&&(delete me.needsValidateOnEnable,me.forceValidation=!0,me.isValid(),delete me.forceValidation))},setReadOnly:function(readOnly){var me=this,inputEl=me.inputEl;readOnly=!!readOnly,me[readOnly?"addCls":"removeCls"](me.readOnlyCls),me.readOnly=readOnly,inputEl?inputEl.dom.readOnly=readOnly:me.rendering&&(me.setReadOnlyOnBoxReady=!0),me.fireEvent("writeablechange",me,readOnly)},fireKey:function(e){e.isSpecialKey()&&this.fireEvent("specialkey",this,new Ext.EventObjectImpl(e))},initEvents:function(){var onChangeTask,onChangeEvent,e,event,me=this,inputEl=me.inputEl,events=me.checkChangeEvents,eLen=events.length;if(inputEl)for(me.mon(inputEl,Ext.EventManager.getKeyEvent(),me.fireKey,me),onChangeTask=new Ext.util.DelayedTask(me.checkChange,me),me.onChangeEvent=onChangeEvent=function(){onChangeTask.delay(me.checkChangeBuffer)},e=0;e<eLen;e++)event=events[e],"propertychange"===event&&(me.usesPropertychange=!0),me.mon(inputEl,event,onChangeEvent);me.callParent()},doComponentLayout:function(){var me=this,inputEl=me.inputEl,usesPropertychange=me.usesPropertychange,onChangeEvent=me.onChangeEvent;usesPropertychange&&me.mun(inputEl,"propertychange",onChangeEvent),me.callParent(arguments),usesPropertychange&&me.mon(inputEl,"propertychange",onChangeEvent)},onDirtyChange:function(isDirty){this[isDirty?"addCls":"removeCls"](this.dirtyCls)},isValid:function(){var me=this,disabled=me.disabled;return me.forceValidation||!disabled?me.validateValue(me.processRawValue(me.getRawValue())):disabled},validateValue:function(value){var me=this,errors=me.getErrors(value),isValid=Ext.isEmpty(errors);return me.preventMark||(isValid?me.clearInvalid():me.markInvalid(errors)),isValid},markInvalid:function(errors){var active,me=this,oldMsg=me.getActiveError();me.setActiveErrors(Ext.Array.from(errors)),active=me.getActiveError(),oldMsg!==active&&me.setError(active)},clearInvalid:function(){var me=this,hadError=me.hasActiveError();delete me.needsValidateOnEnable,me.unsetActiveError(),hadError&&me.setError("")},setError:function(active){var prop,me=this,msgTarget=me.msgTarget;me.rendered&&("title"==msgTarget||"qtip"==msgTarget?(me.rendered&&(prop="qtip"==msgTarget?"data-errorqtip":"title"),me.getActionEl().dom.setAttribute(prop,active||"")):me.updateLayout())},renderActiveError:function(){var me=this,hasError=me.hasActiveError();me.inputEl&&me.inputEl[hasError?"addCls":"removeCls"](me.invalidCls+"-field"),me.mixins.labelable.renderActiveError.call(me)},getActionEl:function(){return this.inputEl||this.el}});Ext.define("Ext.form.field.VTypes",function(){var alpha=/^[a-zA-Z_]+$/,alphanum=/^[a-zA-Z0-9_]+$/,email=/^(")?(?:[^\."])(?:(?:[\.])?(?:[\w\-!#$%&'*+\/=?^_`{|}~]))*\1@(\w[\-\w]*\.){1,5}([A-Za-z]){2,6}$/,url=/(((^https?)|(^ftp)):\/\/((([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\\/+@&#;`~=%!]*)(\.\w{2,})?)*)|(localhost|LOCALHOST))\/?)/i;return{singleton:!0,alternateClassName:"Ext.form.VTypes",email:function(v){return email.test(v)},emailText:'This field should be an e-mail address in the format "user@example.com"',emailMask:/[\w.\-@'"!#$%&'*+\/=?^_`{|}~]/i,url:function(v){return url.test(v)},urlText:'This field should be a URL in the format "http://www.example.com"',alpha:function(v){return alpha.test(v)},alphaText:"This field should only contain letters and _",alphaMask:/[a-z_]/i,alphanum:function(v){return alphanum.test(v)},alphanumText:"This field should only contain letters, numbers and _",alphanumMask:/[a-z0-9_]/i}}());Ext.define("Ext.layout.component.field.Text",{extend:"Ext.layout.component.field.Field",alias:"layout.textfield",requires:["Ext.util.TextMetrics"],type:"textfield",setWidthInDom:!0,canGrowWidth:!0,beginLayoutCycle:function(ownerContext){this.callParent(arguments),ownerContext.heightModel.shrinkWrap&&ownerContext.inputContext.el.setStyle("height","")},measureContentWidth:function(ownerContext){var inputEl,value,calcWidth,max,min,me=this,owner=me.owner,width=me.callParent(arguments),inputContext=ownerContext.inputContext;return owner.grow&&me.canGrowWidth&&!ownerContext.state.growHandled&&(inputEl=owner.inputEl,value=Ext.util.Format.htmlEncode(inputEl.dom.value||(owner.hasFocus?"":owner.emptyText)||""),value+=owner.growAppend,calcWidth=inputEl.getTextWidth(value)+inputContext.getFrameInfo().width,max=owner.growMax,min=Math.min(max,width),max=Math.max(owner.growMin,max,min),calcWidth=Ext.Number.constrain(calcWidth,owner.growMin,max),inputContext.setWidth(calcWidth),ownerContext.state.growHandled=!0,inputContext.domBlock(me,"width"),width=NaN),width},publishInnerHeight:function(ownerContext,height){ownerContext.inputContext.setHeight(height-this.measureLabelErrorHeight(ownerContext))},beginLayoutFixed:function(ownerContext,width,suffix){var me=this,ieInputWidthAdjustment=me.ieInputWidthAdjustment;ieInputWidthAdjustment&&(me.adjustIEInputPadding(ownerContext),"px"===suffix&&(width-=ieInputWidthAdjustment)),me.callParent(arguments)},adjustIEInputPadding:function(ownerContext){this.owner.bodyEl.setStyle("padding-right",this.ieInputWidthAdjustment+"px")}});Ext.define("Ext.form.field.Text",{extend:"Ext.form.field.Base",alias:"widget.textfield",requires:["Ext.form.field.VTypes","Ext.layout.component.field.Text"],alternateClassName:["Ext.form.TextField","Ext.form.Text"],size:20,growMin:30,growMax:800,growAppend:"W",allowBlank:!0,validateBlank:!1,allowOnlyWhitespace:!0,minLength:0,maxLength:Number.MAX_VALUE,minLengthText:"The minimum length for this field is {0}",maxLengthText:"The maximum length for this field is {0}",blankText:"This field is required",regexText:"",emptyCls:Ext.baseCSSPrefix+"form-empty-field",requiredCls:Ext.baseCSSPrefix+"form-required-field",componentLayout:"textfield",valueContainsPlaceholder:!1,ariaRole:"textbox",initComponent:function(){var me=this;!1===me.allowOnlyWhitespace&&(me.allowBlank=!1),me.callParent(),me.addEvents("autosize","keydown","keyup","keypress"),me.addStateEvents("change"),me.setGrowSizePolicy()},setGrowSizePolicy:function(){this.grow&&(this.shrinkWrap|=1)},initEvents:function(){var me=this,el=me.inputEl;me.callParent(),(me.selectOnFocus||me.emptyText)&&me.mon(el,"mousedown",me.onMouseDown,me),(me.maskRe||me.vtype&&!0!==me.disableKeyFilter&&(me.maskRe=Ext.form.field.VTypes[me.vtype+"Mask"]))&&me.mon(el,"keypress",me.filterKeys,me),me.enableKeyEvents&&me.mon(el,{scope:me,keyup:me.onKeyUp,keydown:me.onKeyDown,keypress:me.onKeyPress})},isEqual:function(value1,value2){return this.isEqualAsString(value1,value2)},onChange:function(newVal,oldVal){this.callParent(arguments),this.autoSize()},getSubTplData:function(){var placeholder,me=this,value=me.getRawValue(),isEmpty=me.emptyText&&value.length<1,maxLength=me.maxLength;return me.enforceMaxLength?maxLength===Number.MAX_VALUE&&(maxLength=void 0):maxLength=void 0,isEmpty&&(Ext.supports.Placeholder?placeholder=me.emptyText:(value=me.emptyText,me.valueContainsPlaceholder=!0)),Ext.apply(me.callParent(),{maxLength:maxLength,readOnly:me.readOnly,placeholder:placeholder,value:value,fieldCls:me.fieldCls+(isEmpty&&(placeholder||value)?" "+me.emptyCls:"")+(me.allowBlank?"":" "+me.requiredCls)})},afterRender:function(){this.autoSize(),this.callParent()},onMouseDown:function(e){var me=this;me.hasFocus||me.mon(me.inputEl,"mouseup",Ext.emptyFn,me,{single:!0,preventDefault:!0})},processRawValue:function(value){var newValue,me=this,stripRe=me.stripCharsRe;return stripRe&&(newValue=value.replace(stripRe,""))!==value&&(me.setRawValue(newValue),value=newValue),value},onDisable:function(){this.callParent(),Ext.isIE&&(this.inputEl.dom.unselectable="on")},onEnable:function(){this.callParent(),Ext.isIE&&(this.inputEl.dom.unselectable="")},onKeyDown:function(e){this.fireEvent("keydown",this,e)},onKeyUp:function(e){this.fireEvent("keyup",this,e)},onKeyPress:function(e){this.fireEvent("keypress",this,e)},reset:function(){this.callParent(),this.applyEmptyText()},applyEmptyText:function(){var isEmpty,me=this,emptyText=me.emptyText;me.rendered&&emptyText&&(isEmpty=me.getRawValue().length<1&&!me.hasFocus,Ext.supports.Placeholder?me.inputEl.dom.placeholder=emptyText:isEmpty&&(me.setRawValue(emptyText),me.valueContainsPlaceholder=!0),isEmpty&&me.inputEl.addCls(me.emptyCls),me.autoSize())},afterFirstLayout:function(){if(this.callParent(),Ext.isIE&&this.disabled){var el=this.inputEl;el&&(el.dom.unselectable="on")}},beforeFocus:function(){var isEmpty,me=this,inputEl=me.inputEl,emptyText=me.emptyText;me.callParent(arguments),emptyText&&!Ext.supports.Placeholder&&inputEl.dom.value===me.emptyText&&me.valueContainsPlaceholder?(me.setRawValue(""),isEmpty=!0,inputEl.removeCls(me.emptyCls),me.valueContainsPlaceholder=!1):Ext.supports.Placeholder&&inputEl.removeCls(me.emptyCls),(me.selectOnFocus||isEmpty)&&(Ext.isWebKit?(me.inputFocusTask||(me.inputFocusTask=new Ext.util.DelayedTask(me.focusInput,me)),me.inputFocusTask.delay(1)):me.focusInput())},focusInput:function(){var input=this.inputEl;input&&(input=input.dom)&&input.select()},onFocus:function(){var me=this;me.callParent(arguments),me.emptyText&&me.autoSize()},postBlur:function(){var task=this.inputFocusTask;this.callParent(arguments),this.applyEmptyText(),task&&task.cancel()},filterKeys:function(e){if(!e.ctrlKey||e.altKey){var key=e.getKey(),charCode=String.fromCharCode(e.getCharCode());(Ext.isGecko||Ext.isOpera)&&(e.isNavKeyPress()||key===e.BACKSPACE||key===e.DELETE&&-1===e.button)||(Ext.isGecko||Ext.isOpera||!e.isSpecialKey()||charCode)&&(this.maskRe.test(charCode)||e.stopEvent())}},getState:function(){return this.addPropertyToState(this.callParent(),"value")},applyState:function(state){this.callParent(arguments),state.hasOwnProperty("value")&&this.setValue(state.value)},getRawValue:function(){var me=this,v=me.callParent();return v===me.emptyText&&me.valueContainsPlaceholder&&(v=""),v},setValue:function(value){var me=this,inputEl=me.inputEl;return inputEl&&me.emptyText&&!Ext.isEmpty(value)&&(inputEl.removeCls(me.emptyCls),me.valueContainsPlaceholder=!1),me.callParent(arguments),me.applyEmptyText(),me},getErrors:function(value){var msg,trimmed,isBlank,me=this,errors=me.callParent(arguments),validator=me.validator,vtype=me.vtype,vtypes=Ext.form.field.VTypes,regex=me.regex,format=Ext.String.format;if(value=value||me.processRawValue(me.getRawValue()),Ext.isFunction(validator)&&!0!==(msg=validator.call(me,value))&&errors.push(msg),trimmed=me.allowOnlyWhitespace?value:Ext.String.trim(value),trimmed.length<1||value===me.emptyText&&me.valueContainsPlaceholder){if(me.allowBlank||errors.push(me.blankText),!me.validateBlank)return errors;isBlank=!0}return!isBlank&&value.length<me.minLength&&errors.push(format(me.minLengthText,me.minLength)),value.length>me.maxLength&&errors.push(format(me.maxLengthText,me.maxLength)),vtype&&(vtypes[vtype](value,me)||errors.push(me.vtypeText||vtypes[vtype+"Text"])),regex&&!regex.test(value)&&errors.push(me.regexText||me.invalidText),errors},selectText:function(start,end){var range,me=this,v=me.getRawValue(),doFocus=!0,el=me.inputEl.dom;v.length>0&&(start=void 0===start?0:start,end=void 0===end?v.length:end,el.setSelectionRange?el.setSelectionRange(start,end):el.createTextRange&&(range=el.createTextRange(),range.moveStart("character",start),range.moveEnd("character",end-v.length),range.select()),doFocus=Ext.isGecko||Ext.isOpera),doFocus&&me.focus()},autoSize:function(){var me=this;me.grow&&me.rendered&&(me.autoSizing=!0,me.updateLayout())},afterComponentLayout:function(){var width,me=this;me.callParent(arguments),me.autoSizing&&(width=me.inputEl.getWidth())!==me.lastInputWidth&&(me.fireEvent("autosize",me,width),me.lastInputWidth=width,delete me.autoSizing)},onDestroy:function(){var me=this;me.callParent(),me.inputFocusTask&&(me.inputFocusTask.cancel(),me.inputFocusTask=null)}});Ext.define("Ext.layout.component.field.TextArea",{extend:"Ext.layout.component.field.Text",alias:"layout.textareafield",type:"textareafield",canGrowWidth:!1,naturalSizingProp:"cols",beginLayout:function(ownerContext){this.callParent(arguments),ownerContext.target.inputEl.setStyle("height","")},measureContentHeight:function(ownerContext){var inputContext,inputEl,value,curWidth,calcHeight,me=this,owner=me.owner,height=me.callParent(arguments);return owner.grow&&!ownerContext.state.growHandled&&(inputContext=ownerContext.inputContext,inputEl=owner.inputEl,curWidth=inputEl.getWidth(!0),value=Ext.util.Format.htmlEncode(inputEl.dom.value)||"&#160;",value+=owner.growAppend,value=value.replace(/\n/g,"<br/>"),calcHeight=Ext.util.TextMetrics.measure(inputEl,value,curWidth).height+inputContext.getBorderInfo().height+inputContext.getPaddingInfo().height,calcHeight=Ext.Number.constrain(calcHeight,owner.growMin,owner.growMax),inputContext.setHeight(calcHeight),ownerContext.state.growHandled=!0,inputContext.domBlock(me,"height"),height=NaN),height}});Ext.define("Ext.form.field.TextArea",{extend:"Ext.form.field.Text",alias:["widget.textareafield","widget.textarea"],alternateClassName:"Ext.form.TextArea",requires:["Ext.XTemplate","Ext.layout.component.field.TextArea","Ext.util.DelayedTask"],fieldSubTpl:['<textarea id="{id}" role="{role}" {inputAttrTpl}','<tpl if="name"> name="{name}"</tpl>','<tpl if="rows"> rows="{rows}" </tpl>','<tpl if="cols"> cols="{cols}" </tpl>','<tpl if="placeholder"> placeholder="{placeholder}"</tpl>','<tpl if="size"> size="{size}"</tpl>','<tpl if="maxLength !== undefined"> maxlength="{maxLength}"</tpl>','<tpl if="readOnly"> readonly="readonly"</tpl>','<tpl if="disabled"> disabled="disabled"</tpl>','<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>',' class="{fieldCls} {typeCls} {inputCls}" ','<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',' autocomplete="off">\n','<tpl if="value">{[Ext.util.Format.htmlEncode(values.value)]}</tpl>',"</textarea>",{disableFormats:!0}],growMin:60,growMax:1e3,growAppend:"\n-",cols:20,rows:4,enterIsSpecial:!1,preventScrollbars:!1,componentLayout:"textareafield",setGrowSizePolicy:Ext.emptyFn,returnRe:/\r/g,inputCls:Ext.baseCSSPrefix+"form-textarea",getSubTplData:function(){var me=this,fieldStyle=me.getFieldStyle(),ret=me.callParent();return me.grow&&me.preventScrollbars&&(ret.fieldStyle=(fieldStyle||"")+";overflow:hidden;height:"+me.growMin+"px"),Ext.applyIf(ret,{cols:me.cols,rows:me.rows}),ret},afterRender:function(){var me=this;me.callParent(arguments),me.needsMaxCheck=me.enforceMaxLength&&me.maxLength!==Number.MAX_VALUE&&!Ext.supports.TextAreaMaxLength,me.needsMaxCheck&&me.inputEl.on("paste",me.onPaste,me)},transformRawValue:function(value){return this.stripReturns(value)},transformOriginalValue:function(value){return this.stripReturns(value)},getValue:function(){return this.stripReturns(this.callParent())},valueToRaw:function(value){return value=this.stripReturns(value),this.callParent([value])},stripReturns:function(value){return value&&"string"==typeof value&&(value=value.replace(this.returnRe,"")),value},onPaste:function(e){var me=this;me.pasteTask||(me.pasteTask=new Ext.util.DelayedTask(me.pasteCheck,me)),me.pasteTask.delay(1)},pasteCheck:function(){var me=this,value=me.getValue(),max=me.maxLength;value.length>max&&(value=value.substr(0,max),me.setValue(value))},fireKey:function(e){var value,me=this,key=e.getKey();e.isSpecialKey()&&(me.enterIsSpecial||key!==e.ENTER||e.hasModifier())&&me.fireEvent("specialkey",me,e),!me.needsMaxCheck||key===e.BACKSPACE||key===e.DELETE||e.isNavKeyPress()||me.isCutCopyPasteSelectAll(e,key)||(value=me.getValue(),value.length>=me.maxLength&&e.stopEvent())},isCutCopyPasteSelectAll:function(e,key){return!!e.ctrlKey&&(key===e.A||key===e.C||key===e.V||key===e.X)},autoSize:function(){var height,me=this;me.grow&&me.rendered&&(me.updateLayout(),(height=me.inputEl.getHeight())!==me.lastInputHeight&&(me.fireEvent("autosize",me,height),me.lastInputHeight=height))},beforeDestroy:function(){var task=this.pasteTask;task&&(task.cancel(),this.pasteTask=null),this.callParent()}});Ext.define("Ext.form.field.Display",{extend:"Ext.form.field.Base",alias:"widget.displayfield",requires:["Ext.util.Format","Ext.XTemplate"],alternateClassName:["Ext.form.DisplayField","Ext.form.Display"],ariaRole:"textbox",fieldSubTpl:['<div id="{id}" role="{role}" {inputAttrTpl}','<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',' class="{fieldCls}">{value}</div>',{compiled:!0,disableFormats:!0}],readOnly:!0,fieldCls:Ext.baseCSSPrefix+"form-display-field",fieldBodyCls:Ext.baseCSSPrefix+"form-display-field-body",htmlEncode:!1,noWrap:!1,validateOnChange:!1,initEvents:Ext.emptyFn,submitValue:!1,valueToRaw:function(value){return value||0===value?value:""},isDirty:function(){return!1},isValid:function(){return!0},validate:function(){return!0},getRawValue:function(){return this.rawValue},setRawValue:function(value){var me=this;return value=Ext.value(value,""),me.rawValue=value,me.rendered&&(me.inputEl.dom.innerHTML=me.getDisplayValue(),me.updateLayout()),value},getDisplayValue:function(){var me=this,value=this.getRawValue();return me.renderer?me.renderer.call(me.scope||me,value,me):me.htmlEncode?Ext.util.Format.htmlEncode(value):value},getSubTplData:function(){var ret=this.callParent(arguments);return ret.value=this.getDisplayValue(),ret}});Ext.define("Ext.layout.container.Anchor",{alias:"layout.anchor",extend:"Ext.layout.container.Auto",alternateClassName:"Ext.layout.AnchorLayout",type:"anchor",defaultAnchor:"100%",parseAnchorRE:/^(r|right|b|bottom)$/i,manageOverflow:!0,beginLayoutCycle:function(ownerContext){var anchorSpec,childContext,childItems,i,length,me=this,dimensions=0;for(me.callParent(arguments),childItems=ownerContext.childItems,length=childItems.length,i=0;i<length&&(childContext=childItems[i],!(anchorSpec=childContext.target.anchorSpec)||(childContext.widthModel.calculated&&anchorSpec.right&&(dimensions|=1),childContext.heightModel.calculated&&anchorSpec.bottom&&(dimensions|=2),3!=dimensions));++i);ownerContext.anchorDimensions=dimensions,me.sanityCheck(ownerContext)},calculateItems:function(ownerContext,containerSize){var anchorSpec,childContext,childMargins,height,i,width,me=this,childItems=ownerContext.childItems,length=childItems.length,gotHeight=containerSize.gotHeight,gotWidth=containerSize.gotWidth,ownerHeight=containerSize.height,ownerWidth=containerSize.width,knownDimensions=(gotWidth?1:0)|(gotHeight?2:0),anchorDimensions=ownerContext.anchorDimensions;if(!anchorDimensions)return!0;for(i=0;i<length;i++)childContext=childItems[i],childMargins=childContext.getMarginInfo(),anchorSpec=childContext.target.anchorSpec,gotWidth&&childContext.widthModel.calculated&&(width=anchorSpec.right(ownerWidth)-childMargins.width,width=me.adjustWidthAnchor(width,childContext),childContext.setWidth(width)),gotHeight&&childContext.heightModel.calculated&&(height=anchorSpec.bottom(ownerHeight)-childMargins.height,height=me.adjustHeightAnchor(height,childContext),childContext.setHeight(height));return(knownDimensions&anchorDimensions)===anchorDimensions},sanityCheck:function(ownerContext){var anchorSpec,comp,childContext,i,length,shrinkWrapWidth=ownerContext.widthModel.shrinkWrap,shrinkWrapHeight=ownerContext.heightModel.shrinkWrap,children=ownerContext.childItems;for(i=0,length=children.length;i<length;++i)childContext=children[i],comp=childContext.target,(anchorSpec=comp.anchorSpec)&&(childContext.widthModel.calculated&&anchorSpec.right&&shrinkWrapWidth&&Ext.log({level:"warn",msg:"Right anchor on "+comp.id+" in shrinkWrap width container"}),childContext.heightModel.calculated&&anchorSpec.bottom&&shrinkWrapHeight&&Ext.log({level:"warn",msg:"Bottom anchor on "+comp.id+" in shrinkWrap height container"}))},anchorFactory:{offset:function(delta){return function(v){return v+delta}},ratio:function(ratio){return function(v){return Math.floor(v*ratio)}},standard:function(diff){return function(v){return v-diff}}},parseAnchor:function(a,start,cstart){if(a&&"none"!=a){var delta,factory=this.anchorFactory;if(this.parseAnchorRE.test(a))return factory.standard(cstart-start);if(-1!=a.indexOf("%"))return factory.ratio(.01*parseFloat(a.replace("%","")));if(delta=parseInt(a,10),!isNaN(delta))return factory.offset(delta)}return null},adjustWidthAnchor:function(value,childContext){return value},adjustHeightAnchor:function(value,childContext){return value},configureItem:function(item){var anchorsArray,anchorWidth,anchorHeight,me=this,owner=me.owner,anchor=item.anchor;me.callParent(arguments),item.anchor||!item.items||Ext.isNumber(item.width)||Ext.isIE6&&Ext.isStrict||(item.anchor=anchor=me.defaultAnchor),owner.anchorSize?"number"==typeof owner.anchorSize?anchorWidth=owner.anchorSize:(anchorWidth=owner.anchorSize.width,anchorHeight=owner.anchorSize.height):(anchorWidth=owner.initialConfig.width,anchorHeight=owner.initialConfig.height),anchor&&(anchorsArray=anchor.split(" "),item.anchorSpec={right:me.parseAnchor(anchorsArray[0],item.initialConfig.width,anchorWidth),bottom:me.parseAnchor(anchorsArray[1],item.initialConfig.height,anchorHeight)})},sizePolicy:{$:{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:0},b:{readsWidth:1,readsHeight:0,setsWidth:0,setsHeight:1},r:{$:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},b:{readsWidth:0,readsHeight:0,setsWidth:1,setsHeight:1}}},getItemSizePolicy:function(item){var sizeModel,anchorSpec=item.anchorSpec,key="$",policy=this.sizePolicy;return anchorSpec&&(sizeModel=this.owner.getSizeModel(),anchorSpec.right&&!sizeModel.width.shrinkWrap&&(policy=policy.r),anchorSpec.bottom&&!sizeModel.height.shrinkWrap&&(key="b")),policy[key]}});Ext.define("Ext.window.MessageBox",{extend:"Ext.window.Window",requires:["Ext.toolbar.Toolbar","Ext.form.field.Text","Ext.form.field.TextArea","Ext.form.field.Display","Ext.button.Button","Ext.layout.container.Anchor","Ext.layout.container.HBox","Ext.ProgressBar"],alias:"widget.messagebox",OK:1,YES:2,NO:4,CANCEL:8,OKCANCEL:9,YESNO:6,YESNOCANCEL:14,INFO:Ext.baseCSSPrefix+"message-box-info",WARNING:Ext.baseCSSPrefix+"message-box-warning",QUESTION:Ext.baseCSSPrefix+"message-box-question",ERROR:Ext.baseCSSPrefix+"message-box-error",hideMode:"offsets",closeAction:"hide",resizable:!1,title:"&#160;",defaultMinWidth:250,defaultMaxWidth:600,defaultMinHeight:110,defaultMaxHeight:500,minWidth:null,maxWidth:null,minHeight:null,maxHeight:null,constrain:!0,cls:[Ext.baseCSSPrefix+"message-box",Ext.baseCSSPrefix+"hide-offsets"],layout:{type:"vbox",align:"stretch"},shrinkWrapDock:!0,defaultTextHeight:75,minProgressWidth:250,minPromptWidth:250,buttonText:{ok:"OK",yes:"Yes",no:"No",cancel:"Cancel"},buttonIds:["ok","yes","no","cancel"],titleText:{confirm:"Confirm",prompt:"Prompt",wait:"Loading...",alert:"Attention"},iconHeight:35,iconWidth:50,ariaRole:"alertdialog",makeButton:function(btnIdx){var btnId=this.buttonIds[btnIdx];return new Ext.button.Button({handler:this.btnCallback,itemId:btnId,scope:this,text:this.buttonText[btnId],minWidth:75})},btnCallback:function(btn){var value,field,me=this;(me.cfg.prompt||me.cfg.multiline)&&(field=me.cfg.multiline?me.textArea:me.textField,value=field.getValue(),field.reset()),me.hide(),me.userCallback(btn.itemId,value,me.cfg)},hide:function(){var me=this,cls=me.cfg.cls;me.progressBar.reset(),cls&&me.removeCls(cls),me.callParent(arguments)},constructor:function(cfg){var me=this;me.callParent(arguments),me.minWidth=me.defaultMinWidth=me.minWidth||me.defaultMinWidth,me.maxWidth=me.defaultMaxWidth=me.maxWidth||me.defaultMaxWidth,me.minHeight=me.defaultMinHeight=me.minHeight||me.defaultMinHeight,me.maxHeight=me.defaultMaxHeight=me.maxHeight||me.defaultMaxHeight},initComponent:function(cfg){var i,button,me=this,baseId=me.id;for(me.title="&#160;",me.topContainer=new Ext.container.Container({layout:"hbox",padding:10,style:{overflow:"hidden"},items:[me.iconComponent=new Ext.Component({width:me.iconWidth,height:me.iconHeight}),me.promptContainer=new Ext.container.Container({flex:1,layout:"anchor",items:[me.msg=new Ext.form.field.Display({id:baseId+"-displayfield",cls:me.baseCls+"-text"}),me.textField=new Ext.form.field.Text({id:baseId+"-textfield",anchor:"100%",enableKeyEvents:!0,listeners:{keydown:me.onPromptKey,scope:me}}),me.textArea=new Ext.form.field.TextArea({id:baseId+"-textarea",anchor:"100%",height:75})]})]}),me.progressBar=new Ext.ProgressBar({id:baseId+"-progressbar",margin:"0 10 10 10"}),me.items=[me.topContainer,me.progressBar],me.msgButtons=[],i=0;i<4;i++)button=me.makeButton(i),me.msgButtons[button.itemId]=button,me.msgButtons.push(button);me.bottomTb=new Ext.toolbar.Toolbar({id:baseId+"-toolbar",ui:"footer",dock:"bottom",layout:{pack:"center"},items:[me.msgButtons[0],me.msgButtons[1],me.msgButtons[2],me.msgButtons[3]]}),me.dockedItems=[me.bottomTb],me.on("close",me.onClose,me),me.callParent()},onClose:function(){var btn=this.header.child("[type=close]");btn.itemId="cancel",this.btnCallback(btn),delete btn.itemId},onPromptKey:function(textField,e){var me=this;e.keyCode!==e.RETURN&&10!==e.keyCode||(me.msgButtons.ok.isVisible()?me.msgButtons.ok.handler.call(me,me.msgButtons.ok):me.msgButtons.yes.isVisible()&&me.msgButtons.yes.handler.call(me,me.msgButtons.yes))},reconfigure:function(cfg){var resizeTracker,width,height,i,textArea,textField,msg,progressBar,msgButtons,me=this,buttons=0,hideToolbar=!0,oldButtonText=me.buttonText,resizer=me.resizer;for(me.updateButtonText(),cfg=cfg||{},me.cfg=cfg,cfg.width&&(width=cfg.width),cfg.height&&(height=cfg.height),me.minWidth=cfg.minWidth||me.defaultMinWidth,me.maxWidth=cfg.maxWidth||me.defaultMaxWidth,me.minHeight=cfg.minHeight||me.defaultMinHeight,me.maxHeight=cfg.maxHeight||me.defaultMaxHeight,resizer&&(resizeTracker=resizer.resizeTracker,resizer.minWidth=resizeTracker.minWidth=me.minWidth,resizer.maxWidth=resizeTracker.maxWidth=me.maxWidth,resizer.minHeight=resizeTracker.minHeight=me.minHeight,resizer.maxHeight=resizeTracker.maxHeight=me.maxHeight),delete me.defaultFocus,cfg.defaultFocus&&(me.defaultFocus=cfg.defaultFocus),me.animateTarget=cfg.animateTarget||void 0,me.modal=!1!==cfg.modal,me.setTitle(cfg.title||""),me.setIconCls(cfg.iconCls||""),Ext.isObject(cfg.buttons)?(me.buttonText=cfg.buttons,buttons=0):(me.buttonText=cfg.buttonText||me.buttonText,buttons=Ext.isNumber(cfg.buttons)?cfg.buttons:0),buttons|=me.updateButtonText(),me.buttonText=oldButtonText,Ext.suspendLayouts(),delete me.width,delete me.height,(width||height)&&(width&&me.setWidth(width),height&&me.setHeight(height)),me.hidden=!1,me.rendered||me.render(Ext.getBody()),me.closable=!1!==cfg.closable&&!cfg.wait,me.header.child("[type=close]").setVisible(me.closable),cfg.title||me.closable||cfg.iconCls?me.header.show():me.header.hide(),me.liveDrag=!cfg.proxyDrag,me.userCallback=Ext.Function.bind(cfg.callback||cfg.fn||Ext.emptyFn,cfg.scope||Ext.global),me.setIcon(cfg.icon,cfg.iconWidth,cfg.iconHeight),msg=me.msg,cfg.msg?(msg.setValue(cfg.msg),msg.show()):msg.hide(),textArea=me.textArea,textField=me.textField,cfg.prompt||cfg.multiline?(me.multiline=cfg.multiline,cfg.multiline?(textArea.setValue(cfg.value),textArea.setHeight(cfg.defaultTextHeight||me.defaultTextHeight),textArea.show(),textField.hide(),me.defaultFocus=textArea):(textField.setValue(cfg.value),textArea.hide(),textField.show(),me.defaultFocus=textField)):(textArea.hide(),textField.hide()),progressBar=me.progressBar,cfg.progress||cfg.wait?(progressBar.show(),me.updateProgress(0,cfg.progressText),!0===cfg.wait&&progressBar.wait(cfg.waitConfig)):progressBar.hide(),msgButtons=me.msgButtons,i=0;i<4;i++)buttons&Math.pow(2,i)?(me.defaultFocus||(me.defaultFocus=msgButtons[i]),msgButtons[i].show(),hideToolbar=!1):msgButtons[i].hide();hideToolbar?me.bottomTb.hide():me.bottomTb.show(),Ext.resumeLayouts(!0)},updateButtonText:function(){var btnId,btn,me=this,buttonText=me.buttonText,buttons=0;for(btnId in buttonText)buttonText.hasOwnProperty(btnId)&&(btn=me.msgButtons[btnId])&&(me.cfg&&me.cfg.buttonText&&(buttons|=Math.pow(2,Ext.Array.indexOf(me.buttonIds,btnId))),btn.text!=buttonText[btnId]&&btn.setText(buttonText[btnId]));return buttons},show:function(cfg){var visibleFocusables,me=this;return Ext.AbstractComponent.layoutSuspendCount?(Ext.on({resumelayouts:function(){me.show(cfg)},single:!0}),me):(me.reconfigure(cfg),cfg.cls&&me.addCls(cfg.cls),visibleFocusables=me.query("textfield:not([hidden]),textarea:not([hidden]),button:not([hidden])"),me.preventFocusOnActivate=!visibleFocusables.length,me.hidden=!0,me.callParent(),me)},onShow:function(){this.callParent(arguments),this.center()},updateText:function(text){this.msg.setValue(text)},setIcon:function(icon,width,height){var me=this,iconCmp=me.iconComponent,cls=me.messageIconCls;return cls&&iconCmp.removeCls(cls),icon?(iconCmp.show(),iconCmp.setSize(width||me.iconWidth,height||me.iconHeight),iconCmp.addCls(Ext.baseCSSPrefix+"dlg-icon"),iconCmp.addCls(me.messageIconCls=icon)):(iconCmp.removeCls(Ext.baseCSSPrefix+"dlg-icon"),iconCmp.hide()),me},updateProgress:function(value,progressText,msg){return this.progressBar.updateProgress(value,progressText),msg&&this.updateText(msg),this},onEsc:function(){!1!==this.closable&&this.callParent(arguments)},confirm:function(cfg,msg,fn,scope){return Ext.isString(cfg)&&(cfg={title:cfg,icon:this.QUESTION,msg:msg,buttons:this.YESNO,callback:fn,scope:scope}),this.show(cfg)},prompt:function(cfg,msg,fn,scope,multiline,value){return Ext.isString(cfg)&&(cfg={prompt:!0,title:cfg,minWidth:this.minPromptWidth,msg:msg,buttons:this.OKCANCEL,callback:fn,scope:scope,multiline:multiline,value:value}),this.show(cfg)},wait:function(cfg,title,config){return Ext.isString(cfg)&&(cfg={title:title,msg:cfg,closable:!1,wait:!0,modal:!0,minWidth:this.minProgressWidth,waitConfig:config}),this.show(cfg)},alert:function(cfg,msg,fn,scope){return Ext.isString(cfg)&&(cfg={title:cfg,msg:msg,buttons:this.OK,fn:fn,scope:scope,minWidth:this.minWidth}),this.show(cfg)},progress:function(cfg,msg,progressText){return Ext.isString(cfg)&&(cfg={title:cfg,msg:msg,progress:!0,progressText:progressText}),this.show(cfg)}},function(){Ext.MessageBox=Ext.Msg=new this});Ext.define("Ext.form.Basic",{extend:"Ext.util.Observable",alternateClassName:"Ext.form.BasicForm",requires:["Ext.util.MixedCollection","Ext.form.action.Load","Ext.form.action.Submit","Ext.window.MessageBox","Ext.data.Errors","Ext.util.DelayedTask"],constructor:function(owner,config){var reader,me=this;me.owner=owner,me.checkValidityTask=new Ext.util.DelayedTask(me.checkValidity,me),me.checkDirtyTask=new Ext.util.DelayedTask(me.checkDirty,me),me.monitor=new Ext.container.Monitor({selector:"[isFormField]:not([excludeForm])",scope:me,addHandler:me.onFieldAdd,removeHandler:me.onFieldRemove}),me.monitor.bind(owner),Ext.apply(me,config),Ext.isString(me.paramOrder)&&(me.paramOrder=me.paramOrder.split(/[\s,|]/)),reader=me.reader,reader&&!reader.isReader&&("string"==typeof reader&&(reader={type:reader}),me.reader=Ext.createByAlias("reader."+reader.type,reader)),reader=me.errorReader,reader&&!reader.isReader&&("string"==typeof reader&&(reader={type:reader}),me.errorReader=Ext.createByAlias("reader."+reader.type,reader)),me.addEvents("beforeaction","actionfailed","actioncomplete","validitychange","dirtychange"),me.callParent()},initialize:function(){this.initialized=!0,this.onValidityChange(!this.hasInvalidField())},timeout:30,paramsAsHash:!1,waitTitle:"Please Wait...",trackResetOnLoad:!1,wasDirty:!1,destroy:function(){var me=this,mon=me.monitor;mon&&(mon.unbind(),me.monitor=null),me.clearListeners(),me.checkValidityTask.cancel(),me.checkDirtyTask.cancel(),me.isDestroyed=!0},onFieldAdd:function(field){var me=this;me.mon(field,"validitychange",me.checkValidityDelay,me),me.mon(field,"dirtychange",me.checkDirtyDelay,me),me.initialized&&me.checkValidityDelay()},onFieldRemove:function(field){var me=this;me.mun(field,"validitychange",me.checkValidityDelay,me),me.mun(field,"dirtychange",me.checkDirtyDelay,me),me.initialized&&me.checkValidityDelay()},getFields:function(){return this.monitor.getItems()},getBoundItems:function(){var boundItems=this._boundItems;return boundItems&&0!==boundItems.getCount()||(boundItems=this._boundItems=new Ext.util.MixedCollection,boundItems.addAll(this.owner.query("[formBind]"))),boundItems},hasInvalidField:function(){return!!this.getFields().findBy(function(field){var isValid,preventMark=field.preventMark;return field.preventMark=!0,isValid=field.isValid(),field.preventMark=preventMark,!isValid})},isValid:function(){var invalid,me=this;return Ext.suspendLayouts(),invalid=me.getFields().filterBy(function(field){return!field.validate()}),Ext.resumeLayouts(!0),invalid.length<1},checkValidity:function(){var valid,me=this;me.isDestroyed||(valid=!me.hasInvalidField())!==me.wasValid&&(me.onValidityChange(valid),me.fireEvent("validitychange",me,valid),me.wasValid=valid)},checkValidityDelay:function(){this.checkValidityTask.delay(10)},onValidityChange:function(valid){var items,i,iLen,cmp,boundItems=this.getBoundItems();if(boundItems)for(items=boundItems.items,iLen=items.length,i=0;i<iLen;i++)cmp=items[i],cmp.disabled===valid&&cmp.setDisabled(!valid)},isDirty:function(){return!!this.getFields().findBy(function(f){return f.isDirty()})},checkDirtyDelay:function(){this.checkDirtyTask.delay(10)},checkDirty:function(){var dirty,me=this;me.isDestroyed||(dirty=this.isDirty())!==this.wasDirty&&(this.fireEvent("dirtychange",this,dirty),this.wasDirty=dirty)},hasUpload:function(){return!!this.getFields().findBy(function(f){return f.isFileUpload()})},doAction:function(action,options){return Ext.isString(action)&&(action=Ext.ClassManager.instantiateByAlias("formaction."+action,Ext.apply({},options,{form:this}))),!1!==this.fireEvent("beforeaction",this,action)&&(this.beforeAction(action),Ext.defer(action.run,100,action)),this},submit:function(options){options=options||{};var action,me=this;return action=options.standardSubmit||me.standardSubmit?"standardsubmit":me.api?"directsubmit":"submit",me.doAction(action,options)},load:function(options){return this.doAction(this.api?"directload":"load",options)},updateRecord:function(record){if(!(record=record||this._record))return Ext.Error.raise("A record is required."),this;for(var name,fields=record.fields.items,values=this.getFieldValues(),obj={},i=0,len=fields.length;i<len;++i)name=fields[i].name,values.hasOwnProperty(name)&&(obj[name]=values[name]);return record.beginEdit(),record.set(obj),record.endEdit(),this},loadRecord:function(record){return this._record=record,this.setValues(record.getData())},getRecord:function(){return this._record},beforeAction:function(action){var f,field,waitMsgTarget,me=this,waitMsg=action.waitMsg,maskCls=Ext.baseCSSPrefix+"mask-loading",fields=me.getFields().items,fLen=fields.length;for(f=0;f<fLen;f++)field=fields[f],field.isFormField&&field.syncValue&&field.syncValue();waitMsg&&(waitMsgTarget=me.waitMsgTarget,!0===waitMsgTarget?me.owner.el.mask(waitMsg,maskCls):waitMsgTarget?(waitMsgTarget=me.waitMsgTarget=Ext.get(waitMsgTarget),waitMsgTarget.mask(waitMsg,maskCls)):(me.floatingAncestor=me.owner.up("[floating]"),me.floatingAncestor&&(me.savePreventFocusOnActivate=me.floatingAncestor.preventFocusOnActivate,me.floatingAncestor.preventFocusOnActivate=!0),Ext.MessageBox.wait(waitMsg,action.waitTitle||me.waitTitle)))},afterAction:function(action,success){var me=this;if(action.waitMsg){var messageBox=Ext.MessageBox,waitMsgTarget=me.waitMsgTarget;!0===waitMsgTarget?me.owner.el.unmask():waitMsgTarget?waitMsgTarget.unmask():messageBox.hide()}me.floatingAncestor&&(me.floatingAncestor.preventFocusOnActivate=me.savePreventFocusOnActivate),success?(action.reset&&me.reset(),Ext.callback(action.success,action.scope||action,[me,action]),me.fireEvent("actioncomplete",me,action)):(Ext.callback(action.failure,action.scope||action,[me,action]),me.fireEvent("actionfailed",me,action))},findField:function(id){return this.getFields().findBy(function(f){return f.id===id||f.getName()===id})},markInvalid:function(errors){function mark(fieldId,msg){var field=me.findField(fieldId);field&&field.markInvalid(msg)}var e,eLen,error,value,key,me=this;if(Ext.isArray(errors))for(eLen=errors.length,e=0;e<eLen;e++)error=errors[e],mark(error.id,error.msg);else if(errors instanceof Ext.data.Errors)for(eLen=errors.items.length,e=0;e<eLen;e++)error=errors.items[e],mark(error.field,error.message);else for(key in errors)errors.hasOwnProperty(key)&&(value=errors[key],mark(key,value));return this},setValues:function(values){function setVal(fieldId,val){var field=me.findField(fieldId);field&&(field.setValue(val),me.trackResetOnLoad&&field.resetOriginalValue())}var v,vLen,val,me=this;if(Ext.suspendLayouts(),Ext.isArray(values))for(vLen=values.length,v=0;v<vLen;v++)val=values[v],setVal(val.id,val.value);else Ext.iterate(values,setVal);return Ext.resumeLayouts(!0),this},getValues:function(asString,dirtyOnly,includeEmptyText,useDataValues,isSubmitting){var field,data,val,bucket,name,f,values={},fields=this.getFields().items,fLen=fields.length,isArray=Ext.isArray;for(f=0;f<fLen;f++)if(field=fields[f],(!dirtyOnly||field.isDirty())&&(data=field[useDataValues?"getModelData":"getSubmitData"](includeEmptyText,isSubmitting),Ext.isObject(data)))for(name in data)data.hasOwnProperty(name)&&(val=data[name],includeEmptyText&&""===val&&(val=field.emptyText||""),field.isRadio?values[name]=values[name]||val:values.hasOwnProperty(name)?(bucket=values[name],isArray(bucket)||(bucket=values[name]=[bucket]),isArray(val)?values[name]=bucket.concat(val):bucket.push(val)):values[name]=val);return asString&&(values=Ext.Object.toQueryString(values)),values},getFieldValues:function(dirtyOnly){return this.getValues(!1,dirtyOnly,!1,!0)},clearInvalid:function(){Ext.suspendLayouts();var f,me=this,fields=me.getFields().items,fLen=fields.length;for(f=0;f<fLen;f++)fields[f].clearInvalid();return Ext.resumeLayouts(!0),me},reset:function(resetRecord){Ext.suspendLayouts();var f,me=this,fields=me.getFields().items,fLen=fields.length;for(f=0;f<fLen;f++)fields[f].reset();return Ext.resumeLayouts(!0),!0===resetRecord&&delete me._record,me},applyToFields:function(obj){var f,fields=this.getFields().items,fLen=fields.length;for(f=0;f<fLen;f++)Ext.apply(fields[f],obj);return this},applyIfToFields:function(obj){var f,fields=this.getFields().items,fLen=fields.length;for(f=0;f<fLen;f++)Ext.applyIf(fields[f],obj);return this}});Ext.define("Ext.form.FieldAncestor",{requires:["Ext.container.Monitor"],xhooks:{initHierarchyState:function(hierarchyState){this.fieldDefaults&&(hierarchyState.fieldDefaults?hierarchyState.fieldDefaults=Ext.apply(Ext.Object.chain(hierarchyState.fieldDefaults),this.fieldDefaults):hierarchyState.fieldDefaults=this.fieldDefaults)}},initFieldAncestor:function(){var me=this;me.addEvents("fieldvaliditychange","fielderrorchange"),me.monitor=new Ext.container.Monitor({scope:me,selector:"[isFormField]:not([excludeForm])",addHandler:me.onChildFieldAdd,removeHandler:me.onChildFieldRemove}),me.initFieldDefaults()},initMonitor:function(){this.monitor.bind(this)},onChildFieldAdd:function(field){var me=this;me.mon(field,"errorchange",me.handleFieldErrorChange,me),me.mon(field,"validitychange",me.handleFieldValidityChange,me)},onChildFieldRemove:function(field){var me=this;me.mun(field,"errorchange",me.handleFieldErrorChange,me),me.mun(field,"validitychange",me.handleFieldValidityChange,me)},initFieldDefaults:function(){this.fieldDefaults||(this.fieldDefaults={})},handleFieldValidityChange:function(field,isValid){var me=this;field!==me&&(me.fireEvent("fieldvaliditychange",me,field,isValid),me.onFieldValidityChange(field,isValid))},handleFieldErrorChange:function(labelable,activeError){var me=this;labelable!==me&&(me.fireEvent("fielderrorchange",me,labelable,activeError),me.onFieldErrorChange(labelable,activeError))},onFieldValidityChange:Ext.emptyFn,onFieldErrorChange:Ext.emptyFn,beforeDestroy:function(){this.monitor.unbind(),this.callParent()}});Ext.define("Ext.layout.component.field.FieldContainer",{extend:"Ext.layout.component.field.Field",alias:"layout.fieldcontainer",type:"fieldcontainer",waitForOuterHeightInDom:!0,waitForOuterWidthInDom:!0,beginLayout:function(ownerContext){var owner=this.owner;this.callParent(arguments),ownerContext.hasRawContent=!0,owner.bodyEl.setStyle("height",""),owner.containerEl.setStyle("height",""),ownerContext.containerElContext=ownerContext.getEl("containerEl")},measureContentHeight:function(ownerContext){return ownerContext.hasDomProp("containerLayoutDone")?this.callParent(arguments):NaN},measureContentWidth:function(ownerContext){return ownerContext.hasDomProp("containerLayoutDone")?this.callParent(arguments):NaN},publishInnerWidth:function(ownerContext,width){var bodyContext=ownerContext.bodyCellContext,innerWidth=bodyContext.el.getWidth();bodyContext.setWidth(innerWidth,!1),ownerContext.containerElContext.setWidth(innerWidth,!1)},publishInnerHeight:function(ownerContext,height){var bodyContext=ownerContext.bodyCellContext,containerElContext=ownerContext.containerElContext;height-=this.measureLabelErrorHeight(ownerContext),bodyContext.setHeight(height),containerElContext.setHeight(height)}});Ext.define("Ext.form.FieldContainer",{extend:"Ext.container.Container",mixins:{labelable:"Ext.form.Labelable",fieldAncestor:"Ext.form.FieldAncestor"},requires:"Ext.layout.component.field.FieldContainer",alias:"widget.fieldcontainer",componentLayout:"fieldcontainer",componentCls:Ext.baseCSSPrefix+"form-fieldcontainer",customOverflowEl:"containerEl",childEls:["containerEl"],combineLabels:!1,labelConnector:", ",combineErrors:!1,maskOnDisable:!1,invalidCls:"",fieldSubTpl:['<div id="{id}-containerEl" class="{containerElCls}" role="presentation">',"{%this.renderContainer(out,values)%}","</div>"],initComponent:function(){var me=this;me.initLabelable(),me.initFieldAncestor(),me.callParent(),me.initMonitor()},getOverflowEl:function(){return this.containerEl},onAdd:function(item){var me=this;item.isLabelable&&Ext.isGecko&&"absolute"===me.layout.type&&!me.hideLabel&&"top"!==me.labelAlign&&(item.x+=me.labelWidth+me.labelPad),me.callParent(arguments),item.isLabelable&&me.combineLabels&&(item.oldHideLabel=item.hideLabel,item.hideLabel=!0),me.updateLabel()},onRemove:function(item,isDestroying){var me=this;me.callParent(arguments),isDestroying||(item.isLabelable&&me.combineLabels&&(item.hideLabel=item.oldHideLabel),me.updateLabel())},initRenderTpl:function(){var me=this;return me.hasOwnProperty("renderTpl")||(me.renderTpl=me.getTpl("labelableRenderTpl")),me.callParent()},initRenderData:function(){var me=this,data=me.callParent();return data.containerElCls=me.containerElCls,Ext.applyIf(data,me.getLabelableRenderData())},getFieldLabel:function(){var label=this.fieldLabel||"";return!label&&this.combineLabels&&(label=Ext.Array.map(this.query("[isFieldLabelable]"),function(field){return field.getFieldLabel()}).join(this.labelConnector)),label},getSubTplData:function(){var ret=this.initRenderData();return Ext.apply(ret,this.subTplData),ret},getSubTplMarkup:function(){var me=this,tpl=me.getTpl("fieldSubTpl");return tpl.renderContent||me.setupRenderTpl(tpl),tpl.apply(me.getSubTplData())},updateLabel:function(){var me=this;me.labelEl&&me.setFieldLabel(me.getFieldLabel())},onFieldErrorChange:function(field,activeError){if(this.combineErrors){var me=this,oldError=me.getActiveError(),invalidFields=Ext.Array.filter(me.query("[isFormField]"),function(field){return field.hasActiveError()}),newErrors=me.getCombinedErrors(invalidFields);newErrors?me.setActiveErrors(newErrors):me.unsetActiveError(),oldError!==me.getActiveError()&&me.doComponentLayout()}},getCombinedErrors:function(invalidFields){var f,field,activeErrors,a,aLen,error,label,errors=[],fLen=invalidFields.length;for(f=0;f<fLen;f++)for(field=invalidFields[f],activeErrors=field.getActiveErrors(),aLen=activeErrors.length,a=0;a<aLen;a++)error=activeErrors[a],label=field.getFieldLabel(),errors.push((label?label+": ":"")+error);return errors},getTargetEl:function(){return this.containerEl},applyTargetCls:function(targetCls){var containerElCls=this.containerElCls;this.containerElCls=containerElCls?containerElCls+" "+targetCls:targetCls}});Ext.define("Ext.layout.container.CheckboxGroup",{extend:"Ext.layout.container.Container",alias:["layout.checkboxgroup"],autoFlex:!0,type:"checkboxgroup",createsInnerCt:!0,childEls:["innerCt"],renderTpl:['<table id="{ownerId}-innerCt" class="'+Ext.plainTableCls+'" cellpadding="0"','role="presentation" style="{tableStyle}">','<tbody role="presentation"><tr role="presentation">','<tpl for="columns">','<td class="{parent.colCls}" valign="top" style="{style}" role="presentation">',"{% this.renderColumn(out,parent,xindex-1) %}","</td>","</tpl>","</tr></tbody></table>"],lastOwnerItemsGeneration:null,beginLayout:function(ownerContext){var columns,numCols,i,width,cwidth,me=this,totalFlex=0,flexedCols=0,autoFlex=me.autoFlex,innerCtStyle=me.innerCt.dom.style;if(me.callParent(arguments),columns=me.columnNodes,ownerContext.innerCtContext=ownerContext.getEl("innerCt",me),ownerContext.widthModel.shrinkWrap)innerCtStyle.tableLayout="auto",innerCtStyle.width="";else{if(numCols=columns.length,me.columnsArray){for(i=0;i<numCols;i++)(width=me.owner.columns[i])<1&&(totalFlex+=width,flexedCols++);for(i=0;i<numCols;i++)width=me.owner.columns[i],cwidth=width<1?width/totalFlex*100+"%":width+"px",columns[i].style.width=cwidth}else for(i=0;i<numCols;i++)cwidth=autoFlex?1/numCols*100+"%":"",columns[i].style.width=cwidth,flexedCols++;flexedCols?flexedCols<numCols?(innerCtStyle.tableLayout="fixed",innerCtStyle.width="100%"):(innerCtStyle.tableLayout="auto",innerCtStyle.width=autoFlex?"100%":""):(innerCtStyle.tableLayout="fixed",innerCtStyle.width="")}},cacheElements:function(){var me=this;me.callParent(),me.rowEl=me.innerCt.down("tr"),me.columnNodes=me.rowEl.dom.childNodes},calculate:function(ownerContext){var targetContext,widthShrinkWrap,heightShrinkWrap,shrinkWrap,table,targetPadding,me=this;ownerContext.getDomProp("containerChildrenSizeDone")?(targetContext=ownerContext.innerCtContext,widthShrinkWrap=ownerContext.widthModel.shrinkWrap,heightShrinkWrap=ownerContext.heightModel.shrinkWrap,shrinkWrap=heightShrinkWrap||widthShrinkWrap,table=targetContext.el.dom,targetPadding=shrinkWrap&&targetContext.getPaddingInfo(),widthShrinkWrap&&ownerContext.setContentWidth(table.offsetWidth+targetPadding.width,!0),heightShrinkWrap&&ownerContext.setContentHeight(table.offsetHeight+targetPadding.height,!0)):me.done=!1},doRenderColumn:function(out,renderData,columnIndex){var item,itemIndex,rowCount,increment,tree,me=renderData.$layout,owner=me.owner,columnCount=renderData.columnCount,items=owner.items.items,itemCount=items.length;for(owner.vertical?(rowCount=Math.ceil(itemCount/columnCount),itemIndex=columnIndex*rowCount,itemCount=Math.min(itemCount,itemIndex+rowCount),increment=1):(itemIndex=columnIndex,increment=columnCount);itemIndex<itemCount;itemIndex+=increment)item=items[itemIndex],me.configureItem(item),tree=item.getRenderTree(),Ext.DomHelper.generateMarkup(tree,out)},getColumnCount:function(){var me=this,owner=me.owner,ownerColumns=owner.columns;return me.columnsArray?ownerColumns.length:Ext.isNumber(ownerColumns)?ownerColumns:owner.items.length},getItemSizePolicy:function(item){return this.autoSizePolicy},getRenderData:function(){var i,width,column,cwidth,me=this,data=me.callParent(),owner=me.owner,columns=me.getColumnCount(),autoFlex=me.autoFlex,totalFlex=0,flexedCols=0;if(me.columnsArray)for(i=0;i<columns;i++)(width=me.owner.columns[i])<1&&(totalFlex+=width,flexedCols++);for(data.colCls=owner.groupCls,data.columnCount=columns,data.columns=[],i=0;i<columns;i++)column=data.columns[i]={},me.columnsArray?(width=me.owner.columns[i],cwidth=width<1?width/totalFlex*100+"%":width+"px",column.style="width:"+cwidth):(column.style="width:"+1/columns*100+"%",flexedCols++);return data.tableStyle=flexedCols?flexedCols<columns?"table-layout:fixed;width:100%":autoFlex?"table-layout:auto;width:100%":"table-layout:auto;":"table-layout:fixed;",data},initLayout:function(){var me=this,owner=me.owner;me.columnsArray=Ext.isArray(owner.columns),me.autoColumns=!owner.columns||"auto"===owner.columns,me.vertical=owner.vertical,me.callParent()},isValidParent:function(){return!0},setupRenderTpl:function(renderTpl){this.callParent(arguments),renderTpl.renderColumn=this.doRenderColumn},renderChildren:function(){var me=this,generation=me.owner.items.generation;me.lastOwnerItemsGeneration!==generation&&(me.lastOwnerItemsGeneration=generation,me.renderItems(me.getLayoutItems()))},renderItems:function(items){var i,item,rowCount,columnCount,rowIndex,columnIndex,me=this,itemCount=items.length;if(itemCount){for(Ext.suspendLayouts(),me.autoColumns&&me.addMissingColumns(itemCount),columnCount=me.columnNodes.length,rowCount=Math.ceil(itemCount/columnCount),i=0;i<itemCount;i++)item=items[i],rowIndex=me.getRenderRowIndex(i,rowCount,columnCount),columnIndex=me.getRenderColumnIndex(i,rowCount,columnCount),item.rendered?me.isItemAtPosition(item,rowIndex,columnIndex)||me.moveItem(item,rowIndex,columnIndex):me.renderItem(item,rowIndex,columnIndex);me.autoColumns&&me.removeExceedingColumns(itemCount),Ext.resumeLayouts(!0)}},isItemAtPosition:function(item,rowIndex,columnIndex){return item.el.dom===this.getNodeAt(rowIndex,columnIndex)},getRenderColumnIndex:function(itemIndex,rowCount,columnCount){return this.vertical?Math.floor(itemIndex/rowCount):itemIndex%columnCount},getRenderRowIndex:function(itemIndex,rowCount,columnCount){return this.vertical?itemIndex%rowCount:Math.floor(itemIndex/columnCount)},getNodeAt:function(rowIndex,columnIndex){return this.columnNodes[columnIndex].childNodes[rowIndex]},addMissingColumns:function(itemsCount){var missingColumnsCount,row,cls,i,me=this,existingColumnsCount=me.columnNodes.length;if(existingColumnsCount<itemsCount)for(missingColumnsCount=itemsCount-existingColumnsCount,row=me.rowEl,cls=me.owner.groupCls,i=0;i<missingColumnsCount;i++)row.createChild({cls:cls,tag:"td",vAlign:"top",role:"presentation"})},removeExceedingColumns:function(itemsCount){var exceedingColumnsCount,row,i,me=this,existingColumnsCount=me.columnNodes.length;if(existingColumnsCount>itemsCount)for(exceedingColumnsCount=existingColumnsCount-itemsCount,row=me.rowEl,i=0;i<exceedingColumnsCount;i++)row.last().remove()},renderItem:function(item,rowIndex,columnIndex){var me=this;me.configureItem(item),item.render(Ext.get(me.columnNodes[columnIndex]),rowIndex),me.afterRenderItem(item)},moveItem:function(item,rowIndex,columnIndex){var me=this,column=me.columnNodes[columnIndex],targetNode=column.childNodes[rowIndex];column.insertBefore(item.el.dom,targetNode||null)}});Ext.define("Ext.form.CheckboxManager",{extend:"Ext.util.MixedCollection",singleton:!0,getByName:function(name,formId){return this.filterBy(function(item){return item.name==name&&item.getFormId()==formId})}});Ext.define("Ext.form.field.Checkbox",{extend:"Ext.form.field.Base",alias:["widget.checkboxfield","widget.checkbox"],alternateClassName:"Ext.form.Checkbox",requires:["Ext.XTemplate","Ext.form.CheckboxManager"],componentLayout:"field",stretchInputElFixed:!1,childEls:["boxLabelEl"],fieldSubTpl:['<div class="{wrapInnerCls} {noBoxLabelCls}" role="presentation">','<tpl if="labelAlignedBefore">',"{beforeBoxLabelTpl}",'<label id="{cmpId}-boxLabelEl" {boxLabelAttrTpl} class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">',"{beforeBoxLabelTextTpl}","{boxLabel}","{afterBoxLabelTextTpl}","</label>","{afterBoxLabelTpl}","</tpl>",'<input type="button" id="{id}" role="{role}" {inputAttrTpl}','<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>','<tpl if="disabled"> disabled="disabled"</tpl>','<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',' class="{fieldCls} {typeCls} {inputCls} {childElCls} {afterLabelCls}" autocomplete="off" hidefocus="true" />','<tpl if="boxLabel && !labelAlignedBefore">',"{beforeBoxLabelTpl}",'<label id="{cmpId}-boxLabelEl" {boxLabelAttrTpl} class="{boxLabelCls} {boxLabelCls}-{boxLabelAlign}" for="{id}">',"{beforeBoxLabelTextTpl}","{boxLabel}","{afterBoxLabelTextTpl}","</label>","{afterBoxLabelTpl}","</tpl>","</div>",{disableFormats:!0,compiled:!0}],subTplInsertions:["beforeBoxLabelTpl","afterBoxLabelTpl","beforeBoxLabelTextTpl","afterBoxLabelTextTpl","boxLabelAttrTpl","inputAttrTpl"],isCheckbox:!0,focusCls:"form-checkbox-focus",extraFieldBodyCls:Ext.baseCSSPrefix+"form-cb-wrap",checked:!1,checkedCls:Ext.baseCSSPrefix+"form-cb-checked",boxLabelCls:Ext.baseCSSPrefix+"form-cb-label",boxLabelAlign:"after",afterLabelCls:Ext.baseCSSPrefix+"form-cb-after",wrapInnerCls:Ext.baseCSSPrefix+"form-cb-wrap-inner",noBoxLabelCls:Ext.baseCSSPrefix+"form-cb-wrap-inner-no-box-label",inputValue:"on",checkChangeEvents:[],inputType:"checkbox",ariaRole:"checkbox",onRe:/^on$/i,inputCls:Ext.baseCSSPrefix+"form-cb",initComponent:function(){var me=this,value=me.value;void 0!==value&&(me.checked=me.isChecked(value,me.inputValue)),me.callParent(arguments),me.getManager().add(me)},initValue:function(){var me=this,checked=!!me.checked;me.originalValue=me.lastValue=checked,me.setValue(checked)},getElConfig:function(){var me=this;return me.isChecked(me.rawValue,me.inputValue)&&me.addCls(me.checkedCls),me.callParent()},getSubTplData:function(){var me=this,boxLabel=me.boxLabel,boxLabelAlign=me.boxLabelAlign,labelAlignedBefore=boxLabel&&"before"===boxLabelAlign;return Ext.apply(me.callParent(),{disabled:me.readOnly||me.disabled,wrapInnerCls:me.wrapInnerCls,boxLabel:boxLabel,boxLabelCls:me.boxLabelCls,boxLabelAlign:boxLabelAlign,labelAlignedBefore:labelAlignedBefore,afterLabelCls:labelAlignedBefore?me.afterLabelCls:"",noBoxLabelCls:boxLabel?"":me.noBoxLabelCls,role:me.ariaRole})},initEvents:function(){var me=this;me.callParent(),me.mon(me.inputEl,"click",me.onBoxClick,me)},setBoxLabel:function(boxLabel){var me=this;me.boxLabel=boxLabel,me.rendered&&me.boxLabelEl.update(boxLabel)},onBoxClick:function(e){var me=this;me.disabled||me.readOnly||this.setValue(!this.checked)},getRawValue:function(){return this.checked},getValue:function(){return this.checked},getSubmitValue:function(){var unchecked=this.uncheckedValue,uncheckedVal=Ext.isDefined(unchecked)?unchecked:null;return this.checked?this.inputValue:uncheckedVal},isChecked:function(rawValue,inputValue){return!0===rawValue||"true"===rawValue||"1"===rawValue||1===rawValue||((Ext.isString(rawValue)||Ext.isNumber(rawValue))&&inputValue?rawValue==inputValue:this.onRe.test(rawValue))},setRawValue:function(value){var me=this,inputEl=me.inputEl,checked=me.isChecked(value,me.inputValue);return inputEl&&me[checked?"addCls":"removeCls"](me.checkedCls),me.checked=me.rawValue=checked,checked},setValue:function(checked){var boxes,i,len,box,me=this;if(Ext.isArray(checked))for(boxes=me.getManager().getByName(me.name,me.getFormId()).items,len=boxes.length,i=0;i<len;++i)box=boxes[i],box.setValue(Ext.Array.contains(checked,box.inputValue));else me.callParent(arguments);return me},valueToRaw:function(value){return value},onChange:function(newVal,oldVal){var me=this,handler=me.handler;handler&&handler.call(me.scope||me,me,newVal),me.callParent(arguments)},resetOriginalValue:function(fromBoxInGroup){var boxes,len,i,me=this;if(!fromBoxInGroup)for(boxes=me.getManager().getByName(me.name,me.getFormId()).items,len=boxes.length,i=0;i<len;++i)boxes[i]!==me&&boxes[i].resetOriginalValue(!0);me.callParent()},beforeDestroy:function(){this.callParent(),this.getManager().removeAtKey(this.id)},getManager:function(){return Ext.form.CheckboxManager},onEnable:function(){var me=this,inputEl=me.inputEl;me.callParent(),inputEl&&(inputEl.dom.disabled=me.readOnly)},setReadOnly:function(readOnly){var me=this,inputEl=me.inputEl;inputEl&&(inputEl.dom.disabled=!!readOnly||me.disabled),me.callParent(arguments)},getFormId:function(){var form,me=this;return me.formId||(form=me.up("form"))&&(me.formId=form.id),me.formId}});Ext.define("Ext.form.CheckboxGroup",{extend:"Ext.form.FieldContainer",mixins:{field:"Ext.form.field.Field"},alias:"widget.checkboxgroup",requires:["Ext.layout.container.CheckboxGroup","Ext.form.field.Checkbox","Ext.form.field.Base"],columns:"auto",vertical:!1,allowBlank:!0,blankText:"You must select at least one item in this group",defaultType:"checkboxfield",groupCls:Ext.baseCSSPrefix+"form-check-group",extraFieldBodyCls:Ext.baseCSSPrefix+"form-checkboxgroup-body",layout:"checkboxgroup",componentCls:Ext.baseCSSPrefix+"form-checkboxgroup",ariaRole:"group",initComponent:function(){var me=this;me.callParent(),me.initField()},initValue:function(){var me=this,valueCfg=me.value;me.originalValue=me.lastValue=valueCfg||me.getValue(),valueCfg&&me.setValue(valueCfg)},onAdd:function(item){var items,len,i,me=this;if(item.isCheckbox)me.mon(item,"change",me.checkChange,me);else if(item.isContainer)for(items=item.items.items,i=0,len=items.length;i<len;i++)me.onAdd(items[i]);me.callParent(arguments)},onRemove:function(item){var items,len,i,me=this;if(item.isCheckbox)me.mun(item,"change",me.checkChange,me);else if(item.isContainer)for(items=item.items.items,i=0,len=items.length;i<len;i++)me.onRemove(items[i]);me.callParent(arguments)},isEqual:function(value1,value2){var toQueryString=Ext.Object.toQueryString;return toQueryString(value1)===toQueryString(value2)},getErrors:function(){var errors=[];return!this.allowBlank&&Ext.isEmpty(this.getChecked())&&errors.push(this.blankText),errors},getBoxes:function(query){return this.query("[isCheckbox]"+(query||""))},eachBox:function(fn,scope){Ext.Array.forEach(this.getBoxes(),fn,scope||this)},getChecked:function(){return this.getBoxes("[checked]")},isDirty:function(){var b,boxes=this.getBoxes(),bLen=boxes.length;for(b=0;b<bLen;b++)if(boxes[b].isDirty())return!0},setReadOnly:function(readOnly){var b,boxes=this.getBoxes(),bLen=boxes.length;for(b=0;b<bLen;b++)boxes[b].setReadOnly(readOnly);this.readOnly=readOnly},reset:function(){var me=this,hadError=me.hasActiveError(),preventMark=me.preventMark;me.preventMark=!0,me.batchChanges(function(){var b,boxes=me.getBoxes(),bLen=boxes.length;for(b=0;b<bLen;b++)boxes[b].reset()}),me.preventMark=preventMark,me.unsetActiveError(),hadError&&me.updateLayout()},resetOriginalValue:function(){var b,me=this,boxes=me.getBoxes(),bLen=boxes.length;for(b=0;b<bLen;b++)boxes[b].resetOriginalValue();me.originalValue=me.getValue(),me.checkDirty()},setValue:function(value){var b,box,name,cbValue,me=this,boxes=me.getBoxes(),bLen=boxes.length;return me.batchChanges(function(){for(b=0;b<bLen;b++)box=boxes[b],name=box.getName(),cbValue=!1,value&&value.hasOwnProperty(name)&&(cbValue=Ext.isArray(value[name])?Ext.Array.contains(value[name],box.inputValue):value[name]),box.setValue(cbValue)}),me},getValue:function(){var b,box,name,inputValue,bucket,values={},boxes=this.getBoxes(),bLen=boxes.length;for(b=0;b<bLen;b++)box=boxes[b],name=box.getName(),inputValue=box.inputValue,box.getValue()&&(values.hasOwnProperty(name)?(bucket=values[name],Ext.isArray(bucket)||(bucket=values[name]=[bucket]),bucket.push(inputValue)):values[name]=inputValue);return values},getSubmitData:function(){return null},getModelData:function(){return null},validate:function(){var errors,isValid,wasValid,me=this;return me.disabled?isValid=!0:(errors=me.getErrors(),isValid=Ext.isEmpty(errors),wasValid=me.wasValid,isValid?me.unsetActiveError():me.setActiveError(errors)),isValid!==wasValid&&(me.wasValid=isValid,me.fireEvent("validitychange",me,isValid),me.updateLayout()),isValid}},function(){this.borrow(Ext.form.field.Base,["markInvalid","clearInvalid","setError"])});Ext.define("Ext.form.FieldSet",{extend:"Ext.container.Container",mixins:{fieldAncestor:"Ext.form.FieldAncestor"},alias:"widget.fieldset",uses:["Ext.form.field.Checkbox","Ext.panel.Tool","Ext.layout.container.Anchor","Ext.layout.component.FieldSet"],collapsed:!1,toggleOnTitleClick:!0,baseCls:Ext.baseCSSPrefix+"fieldset",layout:"anchor",componentLayout:"fieldset",ariaRole:null,autoEl:"fieldset",childEls:["body"],renderTpl:["{%this.renderLegend(out,values);%}",'<div id="{id}-body" class="{baseCls}-body {bodyTargetCls}" role="presentation"<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',"{%this.renderContainer(out,values);%}","</div>"],stateEvents:["collapse","expand"],maskOnDisable:!1,beforeDestroy:function(){var me=this,legend=me.legend;legend&&(delete legend.ownerCt,legend.destroy(),me.legend=null),me.callParent()},initComponent:function(){var me=this,baseCls=me.baseCls;me.initFieldAncestor(),me.callParent(),me.layout.managePadding=me.layout.manageOverflow=!1,me.addEvents("beforeexpand","beforecollapse","expand","collapse"),me.collapsed&&(me.addCls(baseCls+"-collapsed"),me.collapse()),(me.title||me.checkboxToggle||me.collapsible)&&(me.addTitleClasses(),me.legend=Ext.widget(me.createLegendCt())),me.initMonitor()},initPadding:function(targetEl){var bodyPadding,me=this,body=me.getProtoBody(),padding=me.padding;void 0!==padding&&((Ext.isIEQuirks||Ext.isIE8m)&&(padding=me.parseBox(padding),bodyPadding=Ext.Element.parseBox(0),bodyPadding.top=padding.top,padding.top=0,body.setStyle("padding",me.unitizeBox(bodyPadding))),targetEl.setStyle("padding",me.unitizeBox(padding)))},getProtoBody:function(){var me=this,body=me.protoBody;return body||(me.protoBody=body=new Ext.util.ProtoElement({styleProp:"bodyStyle",styleIsText:!0})),body},initRenderData:function(){var me=this,data=me.callParent();return data.bodyTargetCls=me.bodyTargetCls,me.protoBody.writeTo(data),delete me.protoBody,data},getState:function(){var state=this.callParent();return state=this.addPropertyToState(state,"collapsed")},afterCollapse:Ext.emptyFn,afterExpand:Ext.emptyFn,collapsedHorizontal:function(){return!0},collapsedVertical:function(){return!0},createLegendCt:function(){var me=this,items=[],legend={xtype:"container",baseCls:me.baseCls+"-header",id:me.id+"-legend",autoEl:"legend",ariaRole:null,ariaLabelledBy:"."+me.baseCls+"-header-text",items:items,ownerCt:me,shrinkWrap:!0,ownerLayout:me.componentLayout};return me.checkboxToggle?items.push(me.createCheckboxCmp()):me.collapsible&&items.push(me.createToggleCmp()),items.push(me.createTitleCmp()),legend},createTitleCmp:function(){var me=this,cfg={xtype:"component",html:me.title,cls:me.baseCls+"-header-text",id:me.id+"-legendTitle"};return me.collapsible&&me.toggleOnTitleClick&&(cfg.listeners={click:{element:"el",scope:me,fn:me.toggle}},cfg.cls+=" "+me.baseCls+"-header-text-collapsible"),me.titleCmp=Ext.widget(cfg)},createCheckboxCmp:function(){var me=this;return me.checkboxCmp=Ext.widget({xtype:"checkbox",hideEmptyLabel:!0,name:me.checkboxName||me.id+"-checkbox",cls:me.baseCls+"-header-checkbox",id:me.id+"-legendChk",checked:!me.collapsed,msgTarget:"none",listeners:{change:me.onCheckChange,scope:me}}),me.checkboxCmp},createToggleCmp:function(){var me=this;return me.toggleCmp=Ext.widget({xtype:"tool",height:15,width:15,type:"toggle",handler:me.toggle,id:me.id+"-legendToggle",scope:me}),me.toggleCmp},doRenderLegend:function(out,renderData){var tree,me=renderData.$comp,legend=me.legend;legend&&(legend.ownerLayout.configureItem(legend),tree=legend.getRenderTree(),Ext.DomHelper.generateMarkup(tree,out))},finishRender:function(){var legend=this.legend;this.callParent(),legend&&legend.finishRender()},getCollapsed:function(){return!!this.collapsed&&"top"},getCollapsedDockedItems:function(){var legend=this.legend;return legend?[legend]:[]},setTitle:function(title){var me=this,legend=me.legend;me.baseCls;return me.title=title,me.rendered?(legend||(me.legend=legend=Ext.widget(me.createLegendCt()),me.addTitleClasses(),legend.ownerLayout.configureItem(legend),legend.render(me.el,0)),me.titleCmp.update(title)):legend?me.titleCmp.update(title):(me.addTitleClasses(),me.legend=Ext.widget(me.createLegendCt())),me},addTitleClasses:function(){var me=this,title=me.title,baseCls=me.baseCls;title&&me.addCls(baseCls+"-with-title"),(title||me.checkboxToggle||me.collapsible)&&me.addCls(baseCls+"-with-legend")},applyTargetCls:function(targetCls){this.bodyTargetCls=targetCls},getTargetEl:function(){return this.body||this.frameBody||this.el},getDefaultContentTarget:function(){return this.body},expand:function(){return this.setExpanded(!0)},collapse:function(){return this.setExpanded(!1)},setExpanded:function(expanded){var me=this,checkboxCmp=me.checkboxCmp,operation=expanded?"expand":"collapse";return me.rendered&&!1===me.fireEvent("before"+operation,me)||(expanded=!!expanded,checkboxCmp&&checkboxCmp.setValue(expanded),expanded?me.removeCls(me.baseCls+"-collapsed"):me.addCls(me.baseCls+"-collapsed"),me.collapsed=!expanded,expanded?delete me.getHierarchyState().collapsed:me.getHierarchyState().collapsed=!0,me.rendered&&(me.updateLayout({isRoot:!1}),me.fireEvent(operation,me))),me},getRefItems:function(deep){var refItems=this.callParent(arguments),legend=this.legend;return legend&&(refItems.unshift(legend),deep&&refItems.unshift.apply(refItems,legend.getRefItems(!0))),refItems},toggle:function(){this.setExpanded(!!this.collapsed)},onCheckChange:function(cmp,checked){this.setExpanded(checked)},setupRenderTpl:function(renderTpl){this.callParent(arguments),renderTpl.renderLegend=this.doRenderLegend}});Ext.define("Ext.form.Label",{extend:"Ext.Component",alias:"widget.label",requires:["Ext.util.Format"],autoEl:"label",maskOnDisable:!1,getElConfig:function(){var me=this;return me.html=me.text?Ext.util.Format.htmlEncode(me.text):me.html||"",Ext.apply(me.callParent(),{htmlFor:me.forId||""})},setText:function(text,encode){var me=this;return encode=!1!==encode,encode?(me.text=text,delete me.html):(me.html=text,delete me.text),me.rendered&&(me.el.dom.innerHTML=!1!==encode?Ext.util.Format.htmlEncode(text):text,me.updateLayout()),me}});Ext.define("Ext.form.Panel",{extend:"Ext.panel.Panel",mixins:{fieldAncestor:"Ext.form.FieldAncestor"},alias:"widget.form",alternateClassName:["Ext.FormPanel","Ext.form.FormPanel"],requires:["Ext.form.Basic","Ext.util.TaskRunner"],layout:"anchor",ariaRole:"form",basicFormConfigs:["api","baseParams","errorReader","jsonSubmit","method","paramOrder","paramsAsHash","reader","standardSubmit","timeout","trackResetOnLoad","url","waitMsgTarget","waitTitle"],initComponent:function(){var me=this;me.frame&&(me.border=!1),me.initFieldAncestor(),me.callParent(),me.relayEvents(me.form,["beforeaction","actionfailed","actioncomplete","validitychange","dirtychange"]),me.pollForChanges&&me.startPolling(me.pollInterval||500)},initItems:function(){this.callParent(),this.initMonitor(),this.form=this.createForm()},afterFirstLayout:function(){this.callParent(arguments),this.form.initialize()},createForm:function(){for(var prop,cfg={},props=this.basicFormConfigs,len=props.length,i=0;i<len;++i)prop=props[i],cfg[prop]=this[prop];return new Ext.form.Basic(this,cfg)},getForm:function(){return this.form},loadRecord:function(record){return this.getForm().loadRecord(record)},getRecord:function(){return this.getForm().getRecord()},updateRecord:function(record){return this.getForm().updateRecord(record)},getValues:function(asString,dirtyOnly,includeEmptyText,useDataValues){return this.getForm().getValues(asString,dirtyOnly,includeEmptyText,useDataValues)},isDirty:function(){return this.form.isDirty()},isValid:function(){return this.form.isValid()},hasInvalidField:function(){return this.form.hasInvalidField()},beforeDestroy:function(){this.stopPolling(),this.form.destroy(),this.callParent()},load:function(options){this.form.load(options)},submit:function(options){this.form.submit(options)},startPolling:function(interval){this.stopPolling();var task=new Ext.util.TaskRunner(interval);task.start({interval:0,run:this.checkChange,scope:this}),this.pollTask=task},stopPolling:function(){var task=this.pollTask;task&&(task.stopAll(),delete this.pollTask)},checkChange:function(){var f,fields=this.form.getFields().items,fLen=fields.length;for(f=0;f<fLen;f++)fields[f].checkChange()}});Ext.define("Ext.form.RadioManager",{extend:"Ext.util.MixedCollection",singleton:!0,getByName:function(name,formId){return this.filterBy(function(item){return item.name==name&&item.getFormId()==formId})},getWithValue:function(name,value,formId){return this.filterBy(function(item){return item.name==name&&item.inputValue==value&&item.getFormId()==formId})},getChecked:function(name,formId){return this.findBy(function(item){return item.name==name&&item.checked&&item.getFormId()==formId})}});Ext.define("Ext.form.field.Radio",{extend:"Ext.form.field.Checkbox",alias:["widget.radiofield","widget.radio"],alternateClassName:"Ext.form.Radio",requires:["Ext.form.RadioManager"],isRadio:!0,focusCls:"form-radio-focus",inputType:"radio",ariaRole:"radio",formId:null,getGroupValue:function(){var selected=this.getManager().getChecked(this.name,this.getFormId());return selected?selected.inputValue:null},onBoxClick:function(e){var me=this;me.disabled||me.readOnly||this.setValue(!0)},onRemoved:function(){this.callParent(arguments),this.formId=null},setValue:function(v){var active,me=this;return Ext.isBoolean(v)?me.callParent(arguments):(active=me.getManager().getWithValue(me.name,v,me.getFormId()).getAt(0))&&active.setValue(!0),me},getSubmitValue:function(){return this.checked?this.inputValue:null},getModelData:function(){var o=this.callParent(arguments);return o&&(o[this.getName()]=this.getSubmitValue()),o},onChange:function(newVal,oldVal){var r,rLen,radio,radios,me=this;if(me.callParent(arguments),newVal)for(radios=me.getManager().getByName(me.name,me.getFormId()).items,rLen=radios.length,r=0;r<rLen;r++)(radio=radios[r])!==me&&radio.setValue(!1)},getManager:function(){return Ext.form.RadioManager}});Ext.define("Ext.form.RadioGroup",{extend:"Ext.form.CheckboxGroup",alias:"widget.radiogroup",requires:["Ext.form.field.Radio"],allowBlank:!0,blankText:"You must select one item in this group",defaultType:"radiofield",groupCls:Ext.baseCSSPrefix+"form-radio-group",ariaRole:"radiogroup",getBoxes:function(query){return this.query("[isRadio]"+(query||""))},checkChange:function(){var value=this.getValue(),key=Ext.Object.getKeys(value)[0];Ext.isArray(value[key])||this.callParent(arguments)},setValue:function(value){var cbValue,first,formId,radios,i,len,name;if(Ext.isObject(value))for(name in value)if(value.hasOwnProperty(name))for(cbValue=value[name],first=this.items.first(),formId=first?first.getFormId():null,radios=Ext.form.RadioManager.getWithValue(name,cbValue,formId).items,len=radios.length,i=0;i<len;++i)radios[i].setValue(!0);return this}});Ext.define("Ext.layout.component.field.Trigger",{alias:"layout.triggerfield",extend:"Ext.layout.component.field.Field",type:"triggerfield",setWidthInDom:!0,borderWidths:{},beginLayout:function(ownerContext){var flags,me=this,owner=me.owner;ownerContext.triggerWrap=ownerContext.getEl("triggerWrap"),me.callParent(arguments),(flags=owner.getTriggerStateFlags())!=owner.lastTriggerStateFlags&&(owner.lastTriggerStateFlags=flags,me.updateEditState())},beginLayoutCycle:function(ownerContext){this.callParent(arguments),ownerContext.widthModel.shrinkWrap&&!this.owner.inputWidth&&ownerContext.inputContext.el.setStyle("width","")},beginLayoutFixed:function(ownerContext,width,suffix){var me=this,owner=ownerContext.target,ieInputWidthAdjustment=me.ieInputWidthAdjustment||0,inputWidth="100%",triggerWrap=owner.triggerWrap;me.callParent(arguments),owner.inputCell.setStyle("width","100%"),ieInputWidthAdjustment&&(me.adjustIEInputPadding(ownerContext),"px"===suffix&&(inputWidth=owner.inputWidth?owner.inputWidth-me.getExtraWidth(ownerContext):width-ieInputWidthAdjustment-me.getExtraWidth(ownerContext),inputWidth+="px")),owner.inputEl.setStyle("width",inputWidth),inputWidth=owner.inputWidth,inputWidth?triggerWrap.setStyle("width",inputWidth+ieInputWidthAdjustment+"px"):triggerWrap.setStyle("width",width+suffix),triggerWrap.setStyle("table-layout","fixed")},adjustIEInputPadding:function(ownerContext){this.owner.inputCell.setStyle("padding-right",this.ieInputWidthAdjustment+"px")},getExtraWidth:function(ownerContext){var me=this,owner=me.owner,borderWidths=me.borderWidths,ui=owner.ui+owner.triggerEl.getCount();return ui in borderWidths||(borderWidths[ui]=ownerContext.triggerWrap.getBorderInfo().width),borderWidths[ui]+owner.getTriggerWidth()},beginLayoutShrinkWrap:function(ownerContext){var owner=ownerContext.target,inputWidth=owner.inputWidth,triggerWrap=owner.triggerWrap;this.callParent(arguments),inputWidth?(triggerWrap.setStyle("width",inputWidth+"px"),inputWidth=inputWidth-this.getExtraWidth(ownerContext)+"px",owner.inputEl.setStyle("width",inputWidth),owner.inputCell.setStyle("width",inputWidth)):(owner.inputCell.setStyle("width",""),owner.inputEl.setStyle("width",""),triggerWrap.setStyle("width",""),triggerWrap.setStyle("table-layout","auto"))},getTextWidth:function(){var value,me=this,owner=me.owner,inputEl=owner.inputEl;return value=(inputEl.dom.value||(owner.hasFocus?"":owner.emptyText)||"")+owner.growAppend,inputEl.getTextWidth(value)},publishOwnerWidth:function(ownerContext,width){var owner=this.owner;this.callParent(arguments),owner.grow||owner.inputWidth||(width-=this.getExtraWidth(ownerContext),"top"!=owner.labelAlign&&(width-=owner.getLabelWidth()),ownerContext.inputContext.setWidth(width))},publishInnerHeight:function(ownerContext,height){ownerContext.inputContext.setHeight(height-this.measureLabelErrorHeight(ownerContext))},measureContentWidth:function(ownerContext){var calcWidth,max,min,me=this,owner=me.owner,width=me.callParent(arguments),inputContext=ownerContext.inputContext;return owner.grow&&!ownerContext.state.growHandled?(calcWidth=me.getTextWidth()+ownerContext.inputContext.getFrameInfo().width,max=owner.growMax,min=Math.min(max,width),max=Math.max(owner.growMin,max,min),calcWidth=Ext.Number.constrain(calcWidth,owner.growMin,max),inputContext.setWidth(calcWidth),ownerContext.state.growHandled=!0,inputContext.domBlock(me,"width"),width=NaN):owner.inputWidth||(width-=me.getExtraWidth(ownerContext)),width},updateEditState:function(){var displayed,readOnly,me=this,owner=me.owner,inputEl=owner.inputEl,noeditCls=Ext.baseCSSPrefix+"trigger-noedit";me.owner.readOnly?(inputEl.addCls(noeditCls),readOnly=!0,displayed=!1):(me.owner.editable?(inputEl.removeCls(noeditCls),readOnly=!1):(inputEl.addCls(noeditCls),readOnly=!0),displayed=!me.owner.hideTrigger),owner.triggerCell.setDisplayed(displayed),inputEl.dom.readOnly=readOnly}});Ext.define("Ext.form.field.Trigger",{extend:"Ext.form.field.Text",alias:["widget.triggerfield","widget.trigger"],requires:["Ext.dom.Helper","Ext.util.ClickRepeater","Ext.layout.component.field.Trigger"],alternateClassName:["Ext.form.TriggerField","Ext.form.TwinTriggerField","Ext.form.Trigger"],childEls:[{name:"triggerCell",select:"."+Ext.baseCSSPrefix+"trigger-cell"},{name:"triggerEl",select:"."+Ext.baseCSSPrefix+"form-trigger"},"triggerWrap","inputCell"],triggerBaseCls:Ext.baseCSSPrefix+"form-trigger",triggerWrapCls:Ext.baseCSSPrefix+"form-trigger-wrap",triggerNoEditCls:Ext.baseCSSPrefix+"trigger-noedit",hideTrigger:!1,editable:!0,readOnly:!1,repeatTriggerClick:!1,autoSize:Ext.emptyFn,monitorTab:!0,mimicing:!1,triggerIndexRe:/trigger-index-(\d+)/,extraTriggerCls:"",componentLayout:"triggerfield",initComponent:function(){this.wrapFocusCls=this.triggerWrapCls+"-focus",this.callParent(arguments)},getSubTplMarkup:function(values){var me=this,childElCls=values.childElCls,field=me.callParent(arguments);return['<table id="',me.id,'-triggerWrap" class="',Ext.baseCSSPrefix,"form-trigger-wrap",childElCls,'" cellpadding="0" cellspacing="0" role="presentation">','<tbody role="presentation">','<tr role="presentation">','<td id="',me.id,'-inputCell" class="',Ext.baseCSSPrefix,"form-trigger-input-cell",childElCls,'" role="presentation">',field,"</td>",me.getTriggerMarkup(),"</tr>","</tbody>","</table>"].join("")},getSubTplData:function(){var me=this,data=me.callParent(),readOnly=!0===me.readOnly,editable=!1!==me.editable;return Ext.apply(data,{editableCls:readOnly||!editable?" "+me.triggerNoEditCls:"",readOnly:!editable||readOnly})},getLabelableRenderData:function(){var me=this,triggerWrapCls=me.triggerWrapCls,result=me.callParent(arguments);return Ext.applyIf(result,{triggerWrapCls:triggerWrapCls,triggerMarkup:me.getTriggerMarkup()})},getTriggerMarkup:function(){var triggerCls,me=this,i=0,hideTrigger=me.readOnly||me.hideTrigger,triggerBaseCls=me.triggerBaseCls,triggerConfigs=[],unselectableCls=Ext.dom.Element.unselectableCls,style="width:"+me.triggerWidth+"px;"+(hideTrigger?"display:none;":""),cls=me.extraTriggerCls+" "+Ext.baseCSSPrefix+"trigger-cell "+unselectableCls;for(me.trigger1Cls||(me.trigger1Cls=me.triggerCls),i=0;(triggerCls=me["trigger"+(i+1)+"Cls"])||i<1;i++)triggerConfigs.push({tag:"td",role:"presentation",valign:"top",cls:cls,style:style,cn:{cls:[Ext.baseCSSPrefix+"trigger-index-"+i,triggerBaseCls,triggerCls].join(" "),role:"presentation"}});return triggerConfigs[0].cn.cls+=" "+triggerBaseCls+"-first",Ext.DomHelper.markup(triggerConfigs)},disableCheck:function(){return!this.disabled},beforeRender:function(){var tempEl,me=this,triggerBaseCls=me.triggerBaseCls;me.triggerWidth||(tempEl=Ext.getBody().createChild({role:"presentation",style:"position: absolute;",cls:Ext.baseCSSPrefix+"form-trigger"}),Ext.form.field.Trigger.prototype.triggerWidth=tempEl.getWidth(),tempEl.remove()),me.callParent(),triggerBaseCls!=Ext.baseCSSPrefix+"form-trigger"&&me.addChildEls({name:"triggerEl",select:"."+triggerBaseCls}),me.lastTriggerStateFlags=me.getTriggerStateFlags()},onRender:function(){var me=this;me.callParent(arguments),me.doc=Ext.getDoc(),me.initTrigger()},getTriggerWidth:function(){var me=this,totalTriggerWidth=0;return!me.triggerWrap||me.hideTrigger||me.readOnly||(totalTriggerWidth=me.triggerEl.getCount()*me.triggerWidth),totalTriggerWidth},setHideTrigger:function(hideTrigger){hideTrigger!=this.hideTrigger&&(this.hideTrigger=hideTrigger,this.updateLayout())},setEditable:function(editable){editable!=this.editable&&(this.editable=editable,this.updateLayout())},setReadOnly:function(readOnly){var me=this,old=me.readOnly;me.callParent(arguments),readOnly!=old&&me.updateLayout()},initTrigger:function(){var els,len,el,i,idx,cls,me=this,triggerWrap=me.triggerWrap,triggerEl=me.triggerEl,disableCheck=me.disableCheck;for(me.repeatTriggerClick?me.triggerRepeater=new Ext.util.ClickRepeater(triggerWrap,{preventDefault:!0,handler:me.onTriggerWrapClick,listeners:{mouseup:me.onTriggerWrapMouseup,scope:me},scope:me}):me.mon(triggerWrap,{click:me.onTriggerWrapClick,mouseup:me.onTriggerWrapMouseup,scope:me}),triggerEl.setVisibilityMode(Ext.Element.DISPLAY),triggerEl.addClsOnOver(me.triggerBaseCls+"-over",disableCheck,me),els=triggerEl.elements,len=els.length,i=0;i<len;i++)el=els[i],idx=i+1,(cls=me["trigger"+idx+"Cls"])&&(el.addClsOnOver(cls+"-over",disableCheck,me),el.addClsOnClick(cls+"-click",disableCheck,me));triggerEl.addClsOnClick(me.triggerBaseCls+"-click",disableCheck,me)},onDestroy:function(){var me=this;Ext.destroyMembers(me,"triggerRepeater","triggerWrap","triggerEl"),delete me.doc,me.callParent()},onFocus:function(){var me=this;me.callParent(arguments),me.mimicing||(me.bodyEl.addCls(me.wrapFocusCls),me.mimicing=!0,me.mon(me.doc,"mousedown",me.mimicBlur,me,{delay:10}),me.monitorTab&&me.on("specialkey",me.checkTab,me))},checkTab:function(me,e){this.ignoreMonitorTab||e.getKey()!=e.TAB||this.triggerBlur()},getTriggerStateFlags:function(){var me=this,state=0;return me.readOnly&&(state+=1),me.editable&&(state+=2),me.hideTrigger&&(state+=4),state},onBlur:function(){var me=this;me.blurTask;me.blurring&&me.triggerBlur()},mimicBlur:function(e){this.isDestroyed||this.bodyEl.contains(e.target)||!this.validateBlur(e)||this.triggerBlur(e)},triggerBlur:function(e){var me=this;me.mimicing=!1,me.mun(me.doc,"mousedown",me.mimicBlur,me),me.monitorTab&&me.inputEl&&me.un("specialkey",me.checkTab,me),Ext.form.field.Trigger.superclass.onBlur.call(me,e),me.bodyEl&&me.bodyEl.removeCls(me.wrapFocusCls)},validateBlur:function(e){return!0},onTriggerWrapClick:function(){var targetEl,match,triggerClickMethod,event,me=this;!(event=arguments[me.triggerRepeater?1:0])||me.readOnly||me.disabled||(targetEl=event.getTarget("."+me.triggerBaseCls,null),(match=targetEl&&targetEl.className.match(me.triggerIndexRe))&&(triggerClickMethod=me["onTrigger"+(parseInt(match[1],10)+1)+"Click"]||me.onTriggerClick)&&triggerClickMethod.call(me,event))},onTriggerWrapMouseup:Ext.emptyFn,onTriggerClick:Ext.emptyFn});Ext.define("Ext.form.field.Picker",{extend:"Ext.form.field.Trigger",alias:"widget.pickerfield",alternateClassName:"Ext.form.Picker",requires:["Ext.util.KeyNav"],matchFieldWidth:!0,pickerAlign:"tl-bl?",openCls:Ext.baseCSSPrefix+"pickerfield-open",editable:!0,initComponent:function(){this.callParent(),this.addEvents("expand","collapse","select")},initEvents:function(){var me=this;me.callParent(),me.keyNav=new Ext.util.KeyNav(me.inputEl,{down:me.onDownArrow,esc:{handler:me.onEsc,scope:me,defaultEventAction:!1},scope:me,forceKeyDown:!0}),me.editable||me.mon(me.inputEl,"click",me.onTriggerClick,me),Ext.isGecko&&me.inputEl.dom.setAttribute("autocomplete","off")},onEsc:function(e){Ext.isIE&&e.preventDefault(),this.isExpanded&&(this.collapse(),e.stopEvent())},onDownArrow:function(e){this.isExpanded||this.onTriggerClick()},expand:function(){var bodyEl,picker,collapseIf,me=this;!me.rendered||me.isExpanded||me.isDestroyed||(me.expanding=!0,bodyEl=me.bodyEl,picker=me.getPicker(),collapseIf=me.collapseIf,picker.show(),me.isExpanded=!0,me.alignPicker(),bodyEl.addCls(me.openCls),me.mon(Ext.getDoc(),{mousewheel:collapseIf,mousedown:collapseIf,scope:me}),Ext.EventManager.onWindowResize(me.alignPicker,me),me.fireEvent("expand",me),me.onExpand(),delete me.expanding)},onExpand:Ext.emptyFn,alignPicker:function(){var me=this,picker=me.getPicker();me.isExpanded&&(me.matchFieldWidth&&picker.setWidth(me.bodyEl.getWidth()),picker.isFloating()&&me.doAlign())},doAlign:function(){var isAbove,me=this,picker=me.picker;me.picker.alignTo(me.triggerWrap,me.pickerAlign,me.pickerOffset),isAbove=picker.el.getY()<me.inputEl.getY(),me.bodyEl[isAbove?"addCls":"removeCls"](me.openCls+"-above"),picker[isAbove?"addCls":"removeCls"](picker.baseCls+"-above")},collapse:function(){if(this.isExpanded&&!this.isDestroyed){var me=this,openCls=me.openCls,picker=me.picker,doc=Ext.getDoc(),collapseIf=me.collapseIf;picker.hide(),me.isExpanded=!1,me.bodyEl.removeCls([openCls,openCls+"-above"]),picker.el.removeCls(picker.baseCls+"-above"),doc.un("mousewheel",collapseIf,me),doc.un("mousedown",collapseIf,me),Ext.EventManager.removeResizeListener(me.alignPicker,me),me.fireEvent("collapse",me),me.onCollapse()}},onCollapse:Ext.emptyFn,collapseIf:function(e){var me=this;me.isDestroyed||e.within(me.bodyEl,!1,!0)||e.within(me.picker.el,!1,!0)||me.isEventWithinPickerLoadMask(e)||me.collapse()},getPicker:function(){var me=this;return me.picker||(me.picker=me.createPicker())},createPicker:Ext.emptyFn,onTriggerClick:function(){var me=this;me.readOnly||me.disabled||(me.isExpanded?me.collapse():me.expand(),me.inputEl.focus())},triggerBlur:function(){var picker=this.picker;this.callParent(arguments),picker&&picker.isVisible()&&picker.hide()},mimicBlur:function(e){var me=this,picker=me.picker;picker&&(e.within(picker.el,!1,!0)||me.isEventWithinPickerLoadMask(e))||me.callParent(arguments)},onDestroy:function(){var me=this,picker=me.picker;Ext.EventManager.removeResizeListener(me.alignPicker,me),Ext.destroy(me.keyNav),picker&&(delete picker.pickerField,picker.destroy()),me.callParent()},isEventWithinPickerLoadMask:function(e){var loadMask=this.picker.loadMask;return!!loadMask&&(e.within(loadMask.maskEl,!1,!0)||e.within(loadMask.el,!1,!0))}});Ext.define("Ext.selection.Model",{extend:"Ext.util.Observable",alternateClassName:"Ext.AbstractSelectionModel",requires:["Ext.data.StoreManager"],mixins:{bindable:"Ext.util.Bindable"},allowDeselect:void 0,toggleOnClick:!0,selected:null,pruneRemoved:!0,suspendChange:0,constructor:function(cfg){var me=this;cfg=cfg||{},Ext.apply(me,cfg),me.addEvents("selectionchange","focuschange"),me.modes={SINGLE:!0,SIMPLE:!0,MULTI:!0},me.setSelectionMode(cfg.mode||me.mode),me.selected=new Ext.util.MixedCollection(null,me.getSelectionId),me.callParent(arguments)},bindStore:function(store,initial){var me=this;me.mixins.bindable.bindStore.apply(me,arguments),me.store&&!initial&&me.refresh()},getStoreListeners:function(){var me=this;return{add:me.onStoreAdd,clear:me.onStoreClear,bulkremove:me.onStoreRemove,update:me.onStoreUpdate,load:me.onStoreLoad,idchanged:me.onModelIdChanged,refresh:me.onStoreRefresh}},suspendChanges:function(){++this.suspendChange},resumeChanges:function(){this.suspendChange&&--this.suspendChange},selectAll:function(suppressEvent){var me=this,selections=me.store.getRange(),i=0,len=selections.length,start=me.getSelection().length;for(me.suspendChanges();i<len;i++)me.doSelect(selections[i],!0,suppressEvent);me.resumeChanges(),suppressEvent||me.maybeFireSelectionChange(me.getSelection().length!==start)},deselectAll:function(suppressEvent){var i,l,rec,me=this,selections=me.getSelection(),selIndexes={},store=me.store,start=selections.length;for(i=0,l=selections.length;i<l;i++)rec=selections[i],selIndexes[rec.internalId]=store.indexOf(rec);selections=Ext.Array.sort(selections,function(r1,r2){return selIndexes[r1.internalId]<selIndexes[r2.internalId]?-1:1}),me.suspendChanges(),me.doDeselect(selections,suppressEvent),me.resumeChanges(),suppressEvent||me.maybeFireSelectionChange(me.getSelection().length!==start)},selectWithEvent:function(record,e){var toDeselect,i,item,me=this,isSelected=me.isSelected(record),shift=e.shiftKey,ctrl=e.ctrlKey,start=me.selectionStart,selected=me.getSelection(),len=selected.length,allowDeselect=me.allowDeselect;switch(me.selectionMode){case"MULTI":if(shift&&start)me.selectRange(start,record,ctrl);else if(ctrl&&isSelected)me.doDeselect(record,!1);else if(ctrl)me.doSelect(record,!0,!1);else if(isSelected&&!shift&&!ctrl&&len>1){for(toDeselect=[],i=0;i<len;++i)(item=selected[i])!==record&&toDeselect.push(item);me.doDeselect(toDeselect)}else isSelected||me.doSelect(record,!1);break;case"SIMPLE":isSelected?me.doDeselect(record):me.doSelect(record,!0);break;case"SINGLE":allowDeselect&&!ctrl&&(allowDeselect=me.toggleOnClick),allowDeselect&&isSelected?me.doDeselect(record):me.doSelect(record,!1)}shift||(me.isSelected(record)?me.selectionStart=record:me.selectionStart=null)},afterKeyNavigate:function(e,record){var recIdx,fromIdx,me=this,isSelected=me.isSelected(record),from=me.selectionStart&&me.isSelected(me.lastFocused)?me.selectionStart:me.selectionStart=me.lastFocused,key=e.getCharCode(),isSpace=key===e.SPACE,direction=key===e.UP||key===e.PAGE_UP?"up":key===e.DOWN||key===e.DOWN?"down":null;switch(me.selectionMode){case"MULTI":isSpace?e.shiftKey?me.selectRange(from,record,e.ctrlKey):isSelected?(me.doDeselect(record,e.ctrlKey),me.setLastFocused(null),me.setLastFocused(record)):me.doSelect(record,e.ctrlKey):e.shiftKey&&from?(fromIdx=me.store.indexOf(from),recIdx=me.store.indexOf(record),"up"===direction&&fromIdx<=recIdx?me.deselectRange(me.lastFocused,recIdx+1):"down"===direction&&fromIdx>=recIdx?me.deselectRange(me.lastFocused,recIdx-1):from!==record&&me.selectRange(from,record,e.ctrlKey),me.lastSelected=record,me.setLastFocused(record)):e.ctrlKey&&isSelected?me.setLastFocused(record):e.ctrlKey?me.setLastFocused(record):me.doSelect(record,!1);break;case"SIMPLE":isSelected?me.doDeselect(record):me.doSelect(record,!0);break;case"SINGLE":isSpace?isSelected?(me.doDeselect(record),me.setLastFocused(record)):me.doSelect(record):e.ctrlKey?me.setLastFocused(record):me.allowDeselect&&isSelected?me.doDeselect(record):me.doSelect(record,!1)}e.shiftKey||me.isSelected(record)&&(me.selectionStart=record)},selectRange:function(startRow,endRow,keepExisting){var result,i,len,toSelect,toDeselect,idx,rec,me=this,store=me.store,selected=me.selected.items;if(!me.isLocked()){for(result=me.normalizeRowRange(startRow,endRow),startRow=result[0],endRow=result[1],toSelect=[],i=startRow;i<=endRow;i++)me.isSelected(store.getAt(i))||toSelect.push(store.getAt(i));if(!keepExisting){for(toDeselect=[],me.suspendChanges(),i=0,len=selected.length;i<len;++i)rec=selected[i],((idx=store.indexOf(rec))<startRow||idx>endRow)&&toDeselect.push(rec);for(i=0,len=toDeselect.length;i<len;++i)me.doDeselect(toDeselect[i]);me.resumeChanges()}me.doMultiSelect(toSelect,!0)}},deselectRange:function(startRow,endRow){var result,i,toDeselect,record,me=this,store=me.store;if(!me.isLocked()){for(result=me.normalizeRowRange(startRow,endRow),startRow=result[0],endRow=result[1],toDeselect=[],i=startRow;i<=endRow;i++)record=store.getAt(i),me.isSelected(record)&&toDeselect.push(record);me.doDeselect(toDeselect)}},normalizeRowRange:function(startRow,endRow){var tmp,store=this.store;return Ext.isNumber(startRow)||(startRow=store.indexOf(startRow)),startRow=Math.max(0,startRow),Ext.isNumber(endRow)||(endRow=store.indexOf(endRow)),endRow=Math.min(endRow,store.getCount()-1),startRow>endRow&&(tmp=endRow,endRow=startRow,startRow=tmp),[startRow,endRow]},onModelIdChanged:function(store,model,oldId,newId,oldInternalId){this.selected.updateKey(oldInternalId,newId)},select:function(records,keepExisting,suppressEvent){Ext.isDefined(records)&&this.doSelect(records,keepExisting,suppressEvent)},deselect:function(records,suppressEvent){this.doDeselect(records,suppressEvent)},doSelect:function(records,keepExisting,suppressEvent){var record,me=this;if(!me.locked&&me.store){if("number"==typeof records){if(!(record=me.store.getAt(records)))return;records=[record]}"SINGLE"==me.selectionMode&&records?(record=records.length?records[0]:records,me.doSingleSelect(record,suppressEvent)):me.doMultiSelect(records,keepExisting,suppressEvent)}},doMultiSelect:function(records,keepExisting,suppressEvent){var result,i,len,record,commit,me=this,selected=me.selected,change=!1;if(!me.locked){if(records=Ext.isArray(records)?records:[records],len=records.length,!keepExisting&&selected.getCount()>0&&(result=me.deselectDuringSelect(records,selected.getRange(),suppressEvent),result[0]))return void me.maybeFireSelectionChange(result[1]>0&&!suppressEvent);for(commit=function(){selected.add(record),change=!0},i=0;i<len;i++)record=records[i],me.isSelected(record)||(me.lastSelected=record,me.onSelectChange(record,!0,suppressEvent,commit));me.preventFocus||me.setLastFocused(record,suppressEvent),me.maybeFireSelectionChange(change&&!suppressEvent)}},deselectDuringSelect:function(toSelect,selected,suppressEvent){var item,i,me=this,len=selected.length,changed=0,failed=!1;for(me.suspendChanges(),i=0;i<len;++i)item=selected[i],Ext.Array.contains(toSelect,item)||(me.doDeselect(item,suppressEvent)?++changed:failed=!0);return me.resumeChanges(),[failed,changed]},doDeselect:function(records,suppressEvent){var len,record,commit,me=this,selected=me.selected,i=0,attempted=0,accepted=0;if(me.locked||!me.store)return!1;if("number"==typeof records){if(!(record=me.store.getAt(records)))return!1;records=[record]}else Ext.isArray(records)||(records=[records]);for(commit=function(){++accepted,selected.remove(record)},len=records.length,me.suspendChanges();i<len;i++)record=records[i],me.isSelected(record)&&(me.lastSelected===record&&(me.lastSelected=selected.last(),me.lastFocused===record&&me.setLastFocused(null)),++attempted,me.onSelectChange(record,!1,suppressEvent,commit));return me.resumeChanges(),me.maybeFireSelectionChange(accepted>0&&!suppressEvent),accepted===attempted},doSingleSelect:function(record,suppressEvent){var commit,me=this,changed=!1,selected=me.selected;if(!me.locked&&!me.isSelected(record)){if(selected.getCount()){if(me.suspendChanges(),!me.doDeselect(me.lastSelected,suppressEvent))return void me.resumeChanges();me.resumeChanges()}commit=function(){selected.add(record),me.lastSelected=record,changed=!0},me.onSelectChange(record,!0,suppressEvent,commit),changed&&(suppressEvent||me.preventFocus||me.setLastFocused(record),me.maybeFireSelectionChange(!suppressEvent))}},setLastFocused:function(record,supressFocus){var me=this,recordBeforeLast=me.lastFocused;record!==recordBeforeLast&&(me.lastFocused=record,me.onLastFocusChanged(recordBeforeLast,record,supressFocus))},isFocused:function(record){return record===this.getLastFocused()},maybeFireSelectionChange:function(fireEvent){var me=this;fireEvent&&!me.suspendChange&&me.fireEvent("selectionchange",me,me.getSelection())},getLastSelected:function(){return this.lastSelected},getLastFocused:function(){return this.lastFocused},getSelection:function(){return this.selected.getRange()},getSelectionMode:function(){return this.selectionMode},setSelectionMode:function(selMode){selMode=selMode?selMode.toUpperCase():"SINGLE",this.selectionMode=this.modes[selMode]?selMode:"SINGLE"},isLocked:function(){return this.locked},setLocked:function(locked){this.locked=!!locked},isRangeSelected:function(startRow,endRow){var i,result,me=this,store=me.store;for(result=me.normalizeRowRange(startRow,endRow),startRow=result[0],endRow=result[1],i=startRow;i<=endRow;i++)if(!me.isSelected(store.getAt(i)))return!1;return!0},isSelected:function(record){return record=Ext.isNumber(record)?this.store.getAt(record):record,this.selected.contains(record)},hasSelection:function(){return this.selected.getCount()>0},getSelectionId:function(record){return record.internalId},pruneIf:function(){var i,item,me=this,selected=me.selected,toRemove=[],len=selected.length;if(me.pruneRemoved){for(i=0;i<len;i++)item=selected.getAt(i),this.storeHasSelected(item)||toRemove.push(item);if(toRemove.length){for(i=0,len=toRemove.length;i<len;i++)selected.remove(toRemove[i]);me.maybeFireSelectionChange(!0)}}},storeHasSelected:function(record){var records,len,id,i,store=this.store;if(record.hasId()&&store.getById(record.getId()))return!0;for(records=store.data.items,len=records.length,id=record.internalId,i=0;i<len;++i)if(id===records[i].internalId)return!0;return!1},refresh:function(){var rec,selection,change,me=this,store=me.store,toBeSelected=[],toBeReAdded=[],oldSelections=me.getSelection(),len=oldSelections.length,i=0,lastFocused=me.getLastFocused();if(store){for(;i<len&&(selection=oldSelections[i],-1!==store.indexOf(selection)?toBeSelected.push(selection):me.pruneRemoved||(rec=store.getById(selection.getId()),rec?toBeSelected.push(rec):toBeReAdded.push(selection)),"SINGLE"!==me.mode||!toBeReAdded.length);i++);me.selected.getCount()!=toBeSelected.length+toBeReAdded.length&&(change=!0),me.clearSelections(),-1!==store.indexOf(lastFocused)&&me.setLastFocused(lastFocused,!0),toBeSelected.length&&me.doSelect(toBeSelected,!1,!0),toBeReAdded.length&&(me.selected.addAll(toBeReAdded),me.lastSelected||(me.lastSelected=toBeReAdded[toBeReAdded.length-1])),me.maybeFireSelectionChange(change)}},clearSelections:function(){this.selected.clear(),this.lastSelected=null,this.setLastFocused(null)},onStoreAdd:Ext.emptyFn,onStoreClear:function(){this.selected.getCount()>0&&(this.clearSelections(),this.maybeFireSelectionChange(!0))},onStoreRemove:function(store,records,indexes,isMove){var me=this;me.selectionStart&&Ext.Array.contains(records,me.selectionStart)&&(me.selectionStart=null),isMove||me.locked||!me.pruneRemoved||me.deselectDeletedRecords(records)},deselectDeletedRecords:function(records){var i,record,me=this,selected=me.selected,length=records.length,removed=0;for(i=0;i<length;i++)record=records[i],selected.remove(record)&&(me.lastSelected==record&&(me.lastSelected=null),me.getLastFocused()==record&&me.setLastFocused(null),++removed);removed&&me.maybeFireSelectionChange(!0)},getCount:function(){return this.selected.getCount()},onUpdate:Ext.emptyFn,destroy:function(){this.clearListeners()},onStoreUpdate:Ext.emptyFn,onStoreRefresh:Ext.emptyFn,onStoreLoad:Ext.emptyFn,onSelectChange:function(record,isSelected,suppressEvent,commitFn){var me=this,eventName=isSelected?"select":"deselect";!1!==(suppressEvent||me.fireEvent("before"+eventName,me,record))&&!1!==commitFn()&&(suppressEvent||me.fireEvent(eventName,me,record))},onLastFocusChanged:function(oldFocused,newFocused){this.fireEvent("focuschange",this,oldFocused,newFocused)},onEditorKey:Ext.emptyFn,beforeViewRender:function(view){this.views=this.views||[],this.views.push(view),this.bindStore(view.getStore(),!0)},bindComponent:Ext.emptyFn});Ext.define("Ext.selection.DataViewModel",{extend:"Ext.selection.Model",requires:["Ext.util.KeyNav"],deselectOnContainerClick:!0,enableKeyNav:!0,constructor:function(cfg){this.addEvents("beforedeselect","beforeselect","deselect","select"),this.callParent(arguments)},bindComponent:function(view){var me=this,eventListeners={refresh:me.refresh,scope:me};me.view=view,me.bindStore(view.getStore()),eventListeners[view.triggerEvent]=me.onItemClick,eventListeners[view.triggerCtEvent]=me.onContainerClick,view.on(eventListeners),me.enableKeyNav&&me.initKeyNav(view)},onUpdate:function(record){var view=this.view;view&&this.isSelected(record)&&view.onItemSelect(record)},onItemClick:function(view,record,item,index,e){this.selectWithEvent(record,e)},onContainerClick:function(){this.deselectOnContainerClick&&this.deselectAll()},initKeyNav:function(view){var me=this;if(!view.rendered)return void view.on({render:Ext.Function.bind(me.initKeyNav,me,[view]),single:!0});view.el.set({tabIndex:-1}),me.keyNav=new Ext.util.KeyNav({target:view.el,ignoreInputFields:!0,down:Ext.pass(me.onNavKey,[1],me),right:Ext.pass(me.onNavKey,[1],me),left:Ext.pass(me.onNavKey,[-1],me),up:Ext.pass(me.onNavKey,[-1],me),scope:me})},onNavKey:function(step){step=step||1;var idx,me=this,view=me.view,selected=me.getSelection()[0],numRecords=me.view.store.getCount();idx=selected?view.indexOf(view.getNode(selected))+step:0,idx<0?idx=numRecords-1:idx>=numRecords&&(idx=0),me.select(idx)},onSelectChange:function(record,isSelected,suppressEvent,commitFn){var me=this,view=me.view,eventName=isSelected?"select":"deselect";!1!==(suppressEvent||me.fireEvent("before"+eventName,me,record))&&!1!==commitFn()&&(view&&(isSelected?view.onItemSelect(record):view.onItemDeselect(record)),suppressEvent||me.fireEvent(eventName,me,record))},onLastFocusChanged:function(oldFocus,newFocus,suppressFocus){var view=this.view;view&&!suppressFocus&&newFocus&&(view.focusNode(newFocus),this.fireEvent("focuschange",this,oldFocus,newFocus))},destroy:function(){Ext.destroy(this.keyNav),this.callParent()}});Ext.define("Ext.view.AbstractView",{extend:"Ext.Component",requires:["Ext.LoadMask","Ext.data.StoreManager","Ext.CompositeElementLite","Ext.DomQuery","Ext.selection.DataViewModel"],mixins:{bindable:"Ext.util.Bindable"},inheritableStatics:{getRecord:function(node){return this.getBoundView(node).getRecord(node)},getBoundView:function(node){return Ext.getCmp(node.boundView)}},deferInitialRefresh:!0,itemCls:Ext.baseCSSPrefix+"dataview-item",loadingText:"Loading...",loadMask:!0,loadingUseMsg:!0,selectedItemCls:Ext.baseCSSPrefix+"item-selected",emptyText:"",deferEmptyText:!0,trackOver:!1,blockRefresh:!1,preserveScrollOnRefresh:!1,ariaRole:"listbox",itemAriaRole:"option",last:!1,triggerEvent:"itemclick",triggerCtEvent:"containerclick",addCmpEvents:function(){},initComponent:function(){var me=this,isDef=Ext.isDefined,itemTpl=me.itemTpl,memberFn={};itemTpl&&(Ext.isArray(itemTpl)?itemTpl=itemTpl.join(""):Ext.isObject(itemTpl)&&(memberFn=Ext.apply(memberFn,itemTpl.initialConfig),itemTpl=itemTpl.html),me.itemSelector||(me.itemSelector="."+me.itemCls),itemTpl=Ext.String.format('<tpl for="."><div class="{0}" role="{2}">{1}</div></tpl>',me.itemCls,itemTpl,me.itemAriaRole),me.tpl=new Ext.XTemplate(itemTpl,memberFn)),isDef(me.tpl)&&isDef(me.itemSelector)||Ext.Error.raise({sourceClass:"Ext.view.View",tpl:me.tpl,itemSelector:me.itemSelector,msg:"DataView requires both tpl and itemSelector configurations to be defined."}),me.callParent(),me.tpl=me.getTpl("tpl"),(isDef(me.overCls)||isDef(me.overClass))&&(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.view.View: Using the deprecated overCls or overClass configuration. Use overItemCls instead."),me.overItemCls=me.overCls||me.overClass,delete me.overCls,delete me.overClass),(isDef(me.selectedCls)||isDef(me.selectedClass))&&(Ext.isDefined(Ext.global.console)&&Ext.global.console.warn("Ext.view.View: Using the deprecated selectedCls or selectedClass configuration. Use selectedItemCls instead."),me.selectedItemCls=me.selectedCls||me.selectedClass,delete me.selectedCls,delete me.selectedClass),me.overItemCls&&(me.trackOver=!0),me.addEvents("beforerefresh","refresh","viewready","itemupdate","itemadd","itemremove"),me.addCmpEvents(),me.store=Ext.data.StoreManager.lookup(me.store||"ext-empty-store"),me.dataSource||(me.dataSource=me.store),me.bindStore(me.dataSource,!0,"dataSource"),me.all||(me.all=new Ext.CompositeElementLite),me.scrollState={top:0,left:0},me.on({scroll:me.onViewScroll,element:"el",scope:me})},onRender:function(){var me=this,mask=me.loadMask,maskStore=me.getMaskStore(),cfg={target:me,msg:me.loadingText,msgCls:me.loadingCls,useMsg:me.loadingUseMsg,store:maskStore};me.callParent(arguments),mask&&!maskStore.proxy.isSynchronous&&(Ext.isObject(mask)&&(cfg=Ext.apply(cfg,mask)),me.loadMask=new Ext.LoadMask(cfg),me.loadMask.on({scope:me,beforeshow:me.onMaskBeforeShow,hide:me.onMaskHide}))},finishRender:function(){var me=this;me.callParent(arguments),me.up("[collapsed],[hidden]")||me.doFirstRefresh(me.dataSource)},onBoxReady:function(){var me=this;me.callParent(arguments),me.firstRefreshDone||me.doFirstRefresh(me.dataSource)},getMaskStore:function(){return this.store},onMaskBeforeShow:function(){var me=this,loadingHeight=me.loadingHeight;loadingHeight&&loadingHeight>me.getHeight()&&(me.hasLoadingHeight=!0,me.oldMinHeight=me.minHeight,me.minHeight=loadingHeight,me.updateLayout())},onMaskHide:function(){var me=this;!me.destroying&&me.hasLoadingHeight&&(me.minHeight=me.oldMinHeight,me.updateLayout(),delete me.hasLoadingHeight)},beforeRender:function(){this.callParent(arguments),this.getSelectionModel().beforeViewRender(this)},afterRender:function(){this.callParent(arguments),this.getSelectionModel().bindComponent(this)},getSelectionModel:function(){var me=this,mode="SINGLE";return me.simpleSelect?mode="SIMPLE":me.multiSelect&&(mode="MULTI"),me.selModel&&me.selModel.events||(me.selModel=new Ext.selection.DataViewModel(Ext.apply({allowDeselect:me.allowDeselect,mode:mode},me.selModel))),me.selModel.hasRelaySetup||(me.relayEvents(me.selModel,["selectionchange","beforeselect","beforedeselect","select","deselect","focuschange"]),me.selModel.hasRelaySetup=!0),me.disableSelection&&(me.selModel.locked=!0),me.selModel},refresh:function(){var targetEl,targetParent,oldDisplay,nextSibling,dom,records,me=this;me.rendered&&!me.isDestroyed&&(me.hasListeners.beforerefresh&&!1===me.fireEvent("beforerefresh",me)||(targetEl=me.getTargetEl(),records=me.getViewRange(),dom=targetEl.dom,me.preserveScrollOnRefresh||(targetParent=dom.parentNode,oldDisplay=dom.style.display,dom.style.display="none",nextSibling=dom.nextSibling,targetParent.removeChild(dom)),me.refreshCounter?me.clearViewEl():(me.fixedNodes=targetEl.dom.childNodes.length,me.refreshCounter=1),me.tpl.append(targetEl,me.collectData(records,me.all.startIndex)),records.length<1?(this.store.loading||me.deferEmptyText&&!me.hasFirstRefresh||Ext.core.DomHelper.insertHtml("beforeEnd",targetEl.dom,me.emptyText),me.all.clear()):(me.collectNodes(targetEl.dom),me.updateIndexes(0)),me.hasFirstRefresh&&(!1!==me.refreshSelmodelOnRefresh?me.selModel.refresh():me.selModel.pruneIf()),me.hasFirstRefresh=!0,me.preserveScrollOnRefresh||(targetParent.insertBefore(dom,nextSibling),dom.style.display=oldDisplay),this.refreshSize(),me.fireEvent("refresh",me),me.viewReady||(me.viewReady=!0,me.fireEvent("viewready",me))))},collectNodes:function(targetEl){this.all.fill(Ext.query(this.getItemSelector(),Ext.getDom(targetEl)),this.all.startIndex)},getViewRange:function(){return this.dataSource.getRange()},refreshSize:function(){var sizeModel=this.getSizeModel();(sizeModel.height.shrinkWrap||sizeModel.width.shrinkWrap)&&this.updateLayout()},clearViewEl:function(){var me=this,el=me.getTargetEl();if(me.fixedNodes)for(;el.dom.childNodes[me.fixedNodes];)el.dom.removeChild(el.dom.childNodes[me.fixedNodes]);else el.update("");me.refreshCounter++},onViewScroll:Ext.emptyFn,onIdChanged:Ext.emptyFn,saveScrollState:function(){if(this.rendered){var dom=this.el.dom,state=this.scrollState;state.left=dom.scrollLeft,state.top=dom.scrollTop}},restoreScrollState:function(){if(this.rendered){var dom=this.el.dom,state=this.scrollState;dom.scrollLeft=state.left,dom.scrollTop=state.top}},prepareData:function(data,index,record){var associatedData,attr,hasCopied;if(record){associatedData=record.getAssociatedData();for(attr in associatedData)associatedData.hasOwnProperty(attr)&&(hasCopied||(data=Ext.Object.chain(data),hasCopied=!0),data[attr]=associatedData[attr])}return data},collectData:function(records,startIndex){for(var record,data=[],i=0,len=records.length;i<len;i++)record=records[i],data[i]=this.prepareData(record.data,startIndex+i,record);return data},bufferRender:function(records,index){var me=this,div=me.renderBuffer||(me.renderBuffer=document.createElement("div"));return me.tpl.overwrite(div,me.collectData(records,index)),Ext.DomQuery.select(me.getItemSelector(),div)},getNodeContainer:function(){return this.getTargetEl()},onUpdate:function(ds,record){var index,node,me=this;if(me.viewReady&&(index=me.dataSource.indexOf(record))>-1&&(node=me.bufferRender([record],index)[0],me.getNode(record)))return me.all.replaceElement(index,node,!0),me.updateIndexes(index,index),me.selModel.onUpdate(record),me.hasListeners.itemupdate&&me.fireEvent("itemupdate",record,index,node),node},onAdd:function(store,records,index){var nodes,me=this;me.rendered&&(0===me.all.getCount()?(me.refresh(),nodes=me.all.slice()):(nodes=me.doAdd(records,index),!1!==me.refreshSelmodelOnRefresh&&me.selModel.refresh(),me.updateIndexes(index),me.refreshSize()),me.hasListeners.itemadd&&me.fireEvent("itemadd",records,index,nodes))},doAdd:function(records,index){var i,l,nodeContainer,fragment,me=this,nodes=me.bufferRender(records,index,!0),all=me.all,count=all.getCount();if(0===count){for(nodeContainer=this.getNodeContainer(),fragment=document.createDocumentFragment(),i=0,l=nodes.length;i<l;i++)fragment.appendChild(nodes[i]);nodeContainer.appendChild(fragment)}else index<count?0===index?all.item(index).insertSibling(nodes,"before",!0):all.item(index-1).insertSibling(nodes,"after",!0):all.last().insertSibling(nodes,"after",!0);return all.insert(index,nodes),nodes},onRemove:function(ds,records,indexes){var i,record,index,me=this,fireItemRemove=me.hasListeners.itemremove;if(me.all.getCount()){if(0===me.dataSource.getCount()){if(fireItemRemove)for(i=indexes.length-1;i>=0;--i)me.fireEvent("itemremove",records[i],indexes[i]);me.refresh()}else{for(i=indexes.length-1;i>=0;--i)record=records[i],index=indexes[i],me.doRemove(record,index),fireItemRemove&&me.fireEvent("itemremove",record,index);me.updateIndexes(indexes[0])}this.refreshSize()}},doRemove:function(record,index){this.all.removeElement(index,!0)},refreshNode:function(index){this.onUpdate(this.dataSource,this.dataSource.getAt(index))},updateIndexes:function(startIndex,endIndex){var i,nodes=this.all.elements,records=this.getViewRange();for(startIndex=startIndex||0,endIndex=endIndex||(0===endIndex?0:nodes.length-1),i=startIndex;i<=endIndex;i++)nodes[i].viewIndex=i,nodes[i].viewRecordId=records[i].internalId,nodes[i].boundView||(nodes[i].boundView=this.id)},getStore:function(){return this.store},bindStore:function(store,initial,propName){var me=this;me.mixins.bindable.bindStore.apply(me,arguments),initial||me.getSelectionModel().bindStore(store),me.componentLayoutCounter&&me.doFirstRefresh(store)},doFirstRefresh:function(store){var me=this;me.firstRefreshDone=!0,store&&!store.loading&&(me.deferInitialRefresh?me.applyFirstRefresh():me.refresh())},applyFirstRefresh:function(){var me=this;me.isDestroyed||(me.up("[isCollapsingOrExpanding]")?Ext.Function.defer(me.applyFirstRefresh,100,me):Ext.Function.defer(function(){me.isDestroyed||me.refresh()},1))},onUnbindStore:function(store){this.setMaskBind(null)},onBindStore:function(store,initial,propName){this.setMaskBind(store),initial||"store"!==propName||this.bindStore(store,!1,"dataSource")},setMaskBind:function(store){var mask=this.loadMask;mask&&mask.bindStore&&mask.bindStore(store)},getStoreListeners:function(){var me=this;return{idchanged:me.onIdChanged,refresh:me.onDataRefresh,add:me.onAdd,bulkremove:me.onRemove,update:me.onUpdate,clear:me.refresh}},onDataRefresh:function(){this.refreshView()},refreshView:function(){var me=this;me.firstRefreshDone||me.rendered&&!me.up("[collapsed],[isCollapsingOrExpanding],[hidden]")?!0!==me.blockRefresh&&(me.firstRefreshDone=!0,me.refresh()):me.deferInitialRefresh=!1},findItemByChild:function(node){return Ext.fly(node).findParent(this.getItemSelector(),this.getTargetEl())},findTargetByEvent:function(e){return e.getTarget(this.getItemSelector(),this.getTargetEl())},getSelectedNodes:function(){for(var nodes=[],records=this.selModel.getSelection(),ln=records.length,i=0;i<ln;i++)nodes.push(this.getNode(records[i]));return nodes},getRecords:function(nodes){for(var records=[],i=0,len=nodes.length,data=this.dataSource.data;i<len;i++)records[records.length]=data.getByKey(nodes[i].viewRecordId);return records},getRecord:function(node){return this.dataSource.data.getByKey(Ext.getDom(node).viewRecordId)},isSelected:function(node){var r=this.getRecord(node);return this.selModel.isSelected(r)},select:function(records,keepExisting,suppressEvent){this.selModel.select(records,keepExisting,suppressEvent)},deselect:function(records,suppressEvent){this.selModel.deselect(records,suppressEvent)},getNode:function(nodeInfo){return!nodeInfo&&0!==nodeInfo||!this.rendered?null:Ext.isString(nodeInfo)?document.getElementById(nodeInfo):Ext.isNumber(nodeInfo)?this.all.elements[nodeInfo]:nodeInfo.isModel?this.getNodeByRecord(nodeInfo):nodeInfo},getNodeByRecord:function(record){for(var ns=this.all.elements,ln=ns.length,i=0;i<ln;i++)if(ns[i].viewRecordId===record.internalId)return ns[i];return null},getNodes:function(start,end){var all=this.all;return void 0===end?end=all.getCount():end++,all.slice(start||0,end)},indexOf:function(node){return node=this.getNode(node),node||0===node?Ext.isNumber(node.viewIndex)?node.viewIndex:this.all.indexOf(node):-1},onDestroy:function(){var me=this;me.all.clear(),me.callParent(),me.bindStore(null),me.selModel.destroy()},onItemSelect:function(record){var node=this.getNode(record);node&&Ext.fly(node).addCls(this.selectedItemCls)},onItemDeselect:function(record){var node=this.getNode(record);node&&Ext.fly(node).removeCls(this.selectedItemCls)},getItemSelector:function(){return this.itemSelector}},function(){Ext.deprecate("extjs","4.0",function(){Ext.view.AbstractView.override({getSelectionCount:function(){return Ext.global.console&&Ext.global.console.warn("DataView: getSelectionCount will be removed, please interact with the Ext.selection.DataViewModel"),this.selModel.getSelection().length},getSelectedRecords:function(){return Ext.global.console&&Ext.global.console.warn("DataView: getSelectedRecords will be removed, please interact with the Ext.selection.DataViewModel"),this.selModel.getSelection()},select:function(records,keepExisting,supressEvents){Ext.global.console&&Ext.global.console.warn("DataView: select will be removed, please access select through a DataView's SelectionModel, ie: view.getSelectionModel().select()");var sm=this.getSelectionModel();return sm.select.apply(sm,arguments)},clearSelections:function(){return Ext.global.console&&Ext.global.console.warn("DataView: clearSelections will be removed, please access deselectAll through DataView's SelectionModel, ie: view.getSelectionModel().deselectAll()"),this.getSelectionModel().deselectAll()}})})});Ext.define("Ext.view.View",{extend:"Ext.view.AbstractView",alternateClassName:"Ext.DataView",alias:"widget.dataview",deferHighlight:Ext.isIE7m?100:0,mouseOverOutBuffer:20,inputTagRe:/^textarea$|^input$/i,inheritableStatics:{EventMap:{mousedown:"MouseDown",mouseup:"MouseUp",click:"Click",dblclick:"DblClick",contextmenu:"ContextMenu",mouseover:"MouseOver",mouseout:"MouseOut",mouseenter:"MouseEnter",mouseleave:"MouseLeave",keydown:"KeyDown",focus:"Focus"}},initComponent:function(){var me=this;me.callParent(),me.mouseOverOutBuffer?(me.handleMouseOver=Ext.Function.createBuffered(me.handleMouseOver,me.mouseOverOutBuffer,me),me.handleMouseOut=Ext.Function.createBuffered(me.handleMouseOut,me.mouseOverOutBuffer,me),me.lastMouseOverEvent=new Ext.EventObjectImpl,me.lastMouseOutEvent=new Ext.EventObjectImpl):me.deferHighlight&&(me.setHighlightedItem=Ext.Function.createBuffered(me.setHighlightedItem,me.deferHighlight,me))},addCmpEvents:function(){this.addEvents("beforeitemmousedown","beforeitemmouseup","beforeitemmouseenter","beforeitemmouseleave","beforeitemclick","beforeitemdblclick","beforeitemcontextmenu","beforeitemkeydown","itemmousedown","itemmouseup","itemmouseenter","itemmouseleave","itemclick","itemdblclick","itemcontextmenu","itemkeydown","beforecontainermousedown","beforecontainermouseup","beforecontainermouseover","beforecontainermouseout","beforecontainerclick","beforecontainerdblclick","beforecontainercontextmenu","beforecontainerkeydown","containermouseup","containermouseover","containermouseout","containerclick","containerdblclick","containercontextmenu","containerkeydown","selectionchange","beforeselect","beforedeselect","select","deselect","focuschange","highlightitem","unhighlightitem")},getFocusEl:function(){return this.getTargetEl()},afterRender:function(){var me=this,buffer=me.mouseOverOutBuffer;me.callParent(),me.mon(me.getTargetEl(),{scope:me,freezeEvent:!0,click:me.handleEvent,mousedown:me.handleEvent,mouseup:me.handleEvent,dblclick:me.handleEvent,contextmenu:me.handleEvent,keydown:me.handleEvent,mouseover:buffer?me.onMouseOver:me.handleMouseOver,mouseout:buffer?me.onMouseOut:me.handleMouseOut})},onMouseOver:function(e){var me=this;me.lastMouseOverEvent.setEvent(e.browserEvent,!0),me.handleMouseOver(me.lastMouseOverEvent)},onMouseOut:function(e){var me=this;me._mouseOutPending||(me._mouseOutPending=!0,me.lastMouseOutEvent.setEvent(e.browserEvent,!0),me.handleMouseOut(me.lastMouseOutEvent))},handleMouseOver:function(e){var me=this,itemSelector=me.dataRowSelector||me.itemSelector,item=e.getTarget(itemSelector);me.isDestroyed||(item?me.mouseOverItem!==item&&me.el.contains(item)&&(me.mouseOverItem=e.item=item,e.newType="mouseenter",me.handleEvent(e)):(e.item=e.newType=null,me.handleEvent(e)))},handleMouseOut:function(e){var sourceView,me=this,itemSelector=me.dataRowSelector||me.itemSelector,item=e.getTarget(itemSelector);me.isDestroyed||(me._mouseOutPending=!1,item?e.getRelatedTarget(itemSelector)!==item&&me.mouseOverItem===item&&(sourceView=me.self.getBoundView(item),e.item=item,e.newType="mouseleave",sourceView.handleEvent(e),sourceView.mouseOverItem=null):(e.item=e.newType=null,me.handleEvent(e))),e.newType=e.item=null},handleEvent:function(e){var me=this,key="keydown"==e.type&&e.getKey();!1!==me.processUIEvent(e)&&me.processSpecialEvent(e),key===e.SPACE&&(me.inputTagRe.test(e.getTarget().tagName)||e.stopEvent())},processItemEvent:Ext.emptyFn,processContainerEvent:Ext.emptyFn,processSpecialEvent:Ext.emptyFn,processUIEvent:function(e){if(Ext.getBody().isAncestor(e.target)){var index,record,sm,me=this,item=e.getTarget(me.dataRowSelector||me.itemSelector,me.getTargetEl()),map=me.statics().EventMap,type=e.type,newType=e.type;if(e.newType&&(newType=e.newType,item=e.item),item||"keydown"!=type||(sm=me.getSelectionModel(),(record=sm.lastFocused||sm.getLastSelected())&&(item=me.getNode(record,!0))),item){if(record||(record=me.getRecord(item)),index=me.indexInStore?me.indexInStore(record):me.indexOf(item),!record||!1===me.processItemEvent(record,item,index,e))return!1;if(!1===me["onBeforeItem"+map[newType]](record,item,index,e)||!1===me.fireEvent("beforeitem"+newType,me,record,item,index,e)||!1===me["onItem"+map[newType]](record,item,index,e))return!1;me.fireEvent("item"+newType,me,record,item,index,e)}else{if(!1===me.processContainerEvent(e)||!1===me["onBeforeContainer"+map[type]](e)||!1===me.fireEvent("beforecontainer"+type,me,e)||!1===me["onContainer"+map[type]](e))return!1;me.fireEvent("container"+type,me,e)}return!0}},onItemMouseEnter:function(record,item,index,e){this.trackOver&&this.highlightItem(item)},onItemMouseLeave:function(record,item,index,e){this.trackOver&&this.clearHighlight()},onItemMouseDown:Ext.emptyFn,onItemMouseUp:Ext.emptyFn,onItemFocus:Ext.emptyFn,onItemClick:Ext.emptyFn,onItemDblClick:Ext.emptyFn,onItemContextMenu:Ext.emptyFn,onItemKeyDown:Ext.emptyFn,onBeforeItemMouseDown:Ext.emptyFn,onBeforeItemMouseUp:Ext.emptyFn,onBeforeItemFocus:Ext.emptyFn,onBeforeItemMouseEnter:Ext.emptyFn,onBeforeItemMouseLeave:Ext.emptyFn,onBeforeItemClick:Ext.emptyFn,onBeforeItemDblClick:Ext.emptyFn,onBeforeItemContextMenu:Ext.emptyFn,onBeforeItemKeyDown:Ext.emptyFn,onContainerMouseDown:Ext.emptyFn,onContainerMouseUp:Ext.emptyFn,onContainerMouseOver:Ext.emptyFn,onContainerMouseOut:Ext.emptyFn,onContainerClick:Ext.emptyFn,onContainerDblClick:Ext.emptyFn,onContainerContextMenu:Ext.emptyFn,onContainerKeyDown:Ext.emptyFn,onBeforeContainerMouseDown:Ext.emptyFn,onBeforeContainerMouseUp:Ext.emptyFn,onBeforeContainerMouseOver:Ext.emptyFn,onBeforeContainerMouseOut:Ext.emptyFn,onBeforeContainerClick:Ext.emptyFn,onBeforeContainerDblClick:Ext.emptyFn,onBeforeContainerContextMenu:Ext.emptyFn,onBeforeContainerKeyDown:Ext.emptyFn,setHighlightedItem:function(item){var previous,me=this,highlighted=me.highlightedItem,overItemCls=me.overItemCls,beforeOverItemCls=me.beforeOverItemCls;highlighted!=item&&(highlighted&&(Ext.fly(highlighted).removeCls(overItemCls),previous=highlighted.previousSibling,beforeOverItemCls&&previous&&Ext.fly(previous).removeCls(beforeOverItemCls),me.fireEvent("unhighlightitem",me,highlighted)),me.highlightedItem=item,item&&(Ext.fly(item).addCls(me.overItemCls),previous=item.previousSibling,beforeOverItemCls&&previous&&Ext.fly(previous).addCls(beforeOverItemCls),me.fireEvent("highlightitem",me,item)))},highlightItem:function(item){this.setHighlightedItem(item)},clearHighlight:function(){this.setHighlightedItem(void 0)},onUpdate:function(store,record){var node,newNode,highlighted,me=this;me.viewReady&&(node=me.getNode(record),newNode=me.callParent(arguments),(highlighted=me.highlightedItem)&&highlighted===node&&(delete me.highlightedItem,newNode&&me.highlightItem(newNode)))},refresh:function(){this.clearHighlight(),this.callParent(arguments)},focusNode:function(rec){var nodeRegion,me=this,node=me.getNode(rec,!0),el=me.el,adjustmentY=0,adjustmentX=0,elRegion=el.getRegion();elRegion.bottom=elRegion.top+el.dom.clientHeight,elRegion.right=elRegion.left+el.dom.clientWidth,node&&(nodeRegion=Ext.fly(node).getRegion(),nodeRegion.top<elRegion.top?adjustmentY=nodeRegion.top-elRegion.top:nodeRegion.bottom>elRegion.bottom&&(adjustmentY=nodeRegion.bottom-elRegion.bottom),nodeRegion.left<elRegion.left?adjustmentX=nodeRegion.left-elRegion.left:nodeRegion.right>elRegion.right&&(adjustmentX=nodeRegion.right-elRegion.right),(adjustmentX||adjustmentY)&&me.scrollBy(adjustmentX,adjustmentY,!1),el.focus())},bindStore:function(store,initial,propertyName){var dataSource=this[propertyName];dataSource&&dataSource.isFeatureStore?store.isFeatureStore?(this.bindStoreListeners(store),dataSource.bindStore(dataSource.store)):dataSource.bindStore(store):this.callParent(arguments)}});Ext.define("Ext.layout.component.BoundList",{extend:"Ext.layout.component.Auto",alias:"layout.boundlist",type:"component",beginLayout:function(ownerContext){var me=this,owner=me.owner,toolbar=owner.pagingToolbar;me.callParent(arguments),owner.floating&&(ownerContext.savedXY=owner.getXY(),owner.setXY([0,-9999])),toolbar&&(ownerContext.toolbarContext=ownerContext.context.getCmp(toolbar)),ownerContext.listContext=ownerContext.getEl("listEl")},beginLayoutCycle:function(ownerContext){var owner=this.owner;this.callParent(arguments),ownerContext.heightModel.auto&&(owner.el.setHeight("auto"),owner.listEl.setHeight("auto"))},getLayoutItems:function(){var toolbar=this.owner.pagingToolbar;return toolbar?[toolbar]:[]},isValidParent:function(){return!0},finishedLayout:function(ownerContext){var xy=ownerContext.savedXY;this.callParent(arguments),xy&&this.owner.setXY(xy)},measureContentWidth:function(ownerContext){return this.owner.listEl.getWidth()},measureContentHeight:function(ownerContext){return this.owner.listEl.getHeight()},publishInnerHeight:function(ownerContext,height){var toolbar=ownerContext.toolbarContext,toolbarHeight=0;toolbar&&(toolbarHeight=toolbar.getProp("height")),void 0===toolbarHeight?this.done=!1:ownerContext.listContext.setHeight(height-ownerContext.getFrameInfo().height-toolbarHeight)},calculateOwnerHeightFromContentHeight:function(ownerContext){var height=this.callParent(arguments),toolbar=ownerContext.toolbarContext;return toolbar&&(height+=toolbar.getProp("height")),height}});Ext.define("Ext.toolbar.TextItem",{extend:"Ext.toolbar.Item",requires:["Ext.XTemplate"],alias:"widget.tbtext",alternateClassName:"Ext.Toolbar.TextItem",text:"",renderTpl:"{text}",baseCls:Ext.baseCSSPrefix+"toolbar-text",ariaRole:null,beforeRender:function(){var me=this;me.callParent(),Ext.apply(me.renderData,{text:me.text})},setText:function(text){var me=this;me.text=text,me.rendered&&(me.el.update(text),me.updateLayout())}});Ext.define("Ext.form.field.Spinner",{extend:"Ext.form.field.Trigger",alias:"widget.spinnerfield",alternateClassName:"Ext.form.Spinner",requires:["Ext.util.KeyNav"],trigger1Cls:Ext.baseCSSPrefix+"form-spinner-up",trigger2Cls:Ext.baseCSSPrefix+"form-spinner-down",spinUpEnabled:!0,spinDownEnabled:!0,keyNavEnabled:!0,mouseWheelEnabled:!0,repeatTriggerClick:!0,onSpinUp:Ext.emptyFn,onSpinDown:Ext.emptyFn,ariaRole:"spinbutton",triggerTpl:'<td style="{triggerStyle}" class="{triggerCls}" role="presentation"><div class="'+Ext.baseCSSPrefix+"trigger-index-0 "+Ext.baseCSSPrefix+"form-trigger "+Ext.baseCSSPrefix+'form-spinner-up {spinnerUpCls} {childElCls}" role="presentation"></div><div class="'+Ext.baseCSSPrefix+"trigger-index-1 "+Ext.baseCSSPrefix+"form-trigger "+Ext.baseCSSPrefix+'form-spinner-down {spinnerDownCls} {childElCls}" role="presentation"></div></td></tr>',initComponent:function(){this.callParent(),this.addEvents("spin","spinup","spindown")},onRender:function(){var triggers,me=this;me.callParent(arguments),triggers=me.triggerEl,me.spinUpEl=triggers.item(0),me.spinDownEl=triggers.item(1),me.triggerCell=me.spinUpEl.parent(),me.keyNavEnabled&&(me.spinnerKeyNav=new Ext.util.KeyNav(me.inputEl,{scope:me,up:me.spinUp,down:me.spinDown})),me.mouseWheelEnabled&&me.mon(me.bodyEl,"mousewheel",me.onMouseWheel,me)},getSubTplMarkup:function(values){var me=this,childElCls=values.childElCls,field=Ext.form.field.Base.prototype.getSubTplMarkup.apply(me,arguments);return'<table id="'+me.id+'-triggerWrap" class="'+Ext.baseCSSPrefix+"form-trigger-wrap"+childElCls+'" cellpadding="0" cellspacing="0" role="presentation"><tbody role="presentation"><tr role="presentation"><td id="'+me.id+'-inputCell" class="'+Ext.baseCSSPrefix+"form-trigger-input-cell"+childElCls+'" role="presentation">'+field+"</td>"+me.getTriggerMarkup()+"</tbody></table>"},getTriggerMarkup:function(){return this.getTpl("triggerTpl").apply(this.getTriggerData())},getTriggerData:function(){var me=this,hideTrigger=me.readOnly||me.hideTrigger;return{triggerCls:Ext.baseCSSPrefix+"trigger-cell",triggerStyle:hideTrigger?"display:none":"",spinnerUpCls:me.spinUpEnabled?"":me.trigger1Cls+"-disabled",spinnerDownCls:me.spinDownEnabled?"":me.trigger2Cls+"-disabled"}},getTriggerWidth:function(){var me=this,totalTriggerWidth=0;return!me.triggerWrap||me.hideTrigger||me.readOnly||(totalTriggerWidth=me.triggerWidth),totalTriggerWidth},onTrigger1Click:function(){this.spinUp()},onTrigger2Click:function(){this.spinDown()},onTriggerWrapMouseup:function(){this.inputEl.focus()},spinUp:function(){var me=this;me.spinUpEnabled&&!me.disabled&&(me.fireEvent("spin",me,"up"),me.fireEvent("spinup",me),me.onSpinUp())},spinDown:function(){var me=this;me.spinDownEnabled&&!me.disabled&&(me.fireEvent("spin",me,"down"),me.fireEvent("spindown",me),me.onSpinDown())},setSpinUpEnabled:function(enabled){var me=this,wasEnabled=me.spinUpEnabled;me.spinUpEnabled=enabled,wasEnabled!==enabled&&me.rendered&&me.spinUpEl[enabled?"removeCls":"addCls"](me.trigger1Cls+"-disabled")},setSpinDownEnabled:function(enabled){var me=this,wasEnabled=me.spinDownEnabled;me.spinDownEnabled=enabled,wasEnabled!==enabled&&me.rendered&&me.spinDownEl[enabled?"removeCls":"addCls"](me.trigger2Cls+"-disabled")},onMouseWheel:function(e){var delta,me=this;me.hasFocus&&(delta=e.getWheelDelta(),delta>0?me.spinUp():delta<0&&me.spinDown(),e.stopEvent())},onDestroy:function(){Ext.destroyMembers(this,"spinnerKeyNav","spinUpEl","spinDownEl"),this.callParent()}});Ext.define("Ext.form.field.Number",{extend:"Ext.form.field.Spinner",alias:"widget.numberfield",alternateClassName:["Ext.form.NumberField","Ext.form.Number"],allowExponential:!0,allowDecimals:!0,decimalSeparator:null,submitLocaleSeparator:!0,decimalPrecision:2,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.MAX_VALUE,step:1,minText:"The minimum value for this field is {0}",maxText:"The maximum value for this field is {0}",nanText:"{0} is not a valid number",negativeText:"The value cannot be negative",baseChars:"0123456789",autoStripChars:!1,initComponent:function(){var me=this;null===me.decimalSeparator&&(me.decimalSeparator=Ext.util.Format.decimalSeparator),me.callParent(),me.setMinValue(me.minValue),me.setMaxValue(me.maxValue)},getErrors:function(value){var num,me=this,errors=me.callParent(arguments),format=Ext.String.format;return value=Ext.isDefined(value)?value:this.processRawValue(this.getRawValue()),value.length<1?errors:(value=String(value).replace(me.decimalSeparator,"."),isNaN(value)&&errors.push(format(me.nanText,value)),num=me.parseValue(value),0===me.minValue&&num<0?errors.push(this.negativeText):num<me.minValue&&errors.push(format(me.minText,me.minValue)),num>me.maxValue&&errors.push(format(me.maxText,me.maxValue)),errors)},rawToValue:function(rawValue){var value=this.fixPrecision(this.parseValue(rawValue));return null===value&&(value=rawValue||null),value},valueToRaw:function(value){var me=this,decimalSeparator=me.decimalSeparator;return value=me.parseValue(value),value=me.fixPrecision(value),value=Ext.isNumber(value)?value:parseFloat(String(value).replace(decimalSeparator,".")),value=isNaN(value)?"":String(value).replace(".",decimalSeparator)},getSubmitValue:function(){var me=this,value=me.callParent();return me.submitLocaleSeparator||(value=value.replace(me.decimalSeparator,".")),value},onChange:function(){this.toggleSpinners(),this.callParent(arguments)},toggleSpinners:function(){var enabled,me=this,value=me.getValue(),valueIsNull=null===value;(me.spinUpEnabled||me.spinUpDisabledByToggle)&&(enabled=valueIsNull||value<me.maxValue,me.setSpinUpEnabled(enabled,!0)),(me.spinDownEnabled||me.spinDownDisabledByToggle)&&(enabled=valueIsNull||value>me.minValue,me.setSpinDownEnabled(enabled,!0))},setMinValue:function(value){var allowed,me=this;me.minValue=Ext.Number.from(value,Number.NEGATIVE_INFINITY),me.toggleSpinners(),!0!==me.disableKeyFilter&&(allowed=me.baseChars+"",me.allowExponential?allowed+=me.decimalSeparator+"e+-":(me.allowDecimals&&(allowed+=me.decimalSeparator),me.minValue<0&&(allowed+="-")),allowed=Ext.String.escapeRegex(allowed),me.maskRe=new RegExp("["+allowed+"]"),me.autoStripChars&&(me.stripCharsRe=new RegExp("[^"+allowed+"]","gi")))},setMaxValue:function(value){this.maxValue=Ext.Number.from(value,Number.MAX_VALUE),this.toggleSpinners()},parseValue:function(value){return value=parseFloat(String(value).replace(this.decimalSeparator,".")),isNaN(value)?null:value},fixPrecision:function(value){var me=this,nan=isNaN(value),precision=me.decimalPrecision;return nan||!value?nan?"":value:((!me.allowDecimals||precision<=0)&&(precision=0),parseFloat(Ext.Number.toFixed(parseFloat(value),precision)))},beforeBlur:function(){var me=this,v=me.parseValue(me.getRawValue());Ext.isEmpty(v)||me.setValue(v)},setSpinUpEnabled:function(enabled,internal){this.callParent(arguments),internal?this.spinUpDisabledByToggle=!enabled:delete this.spinUpDisabledByToggle},onSpinUp:function(){var me=this;me.readOnly||me.setSpinValue(Ext.Number.constrain(me.getValue()+me.step,me.minValue,me.maxValue))},setSpinDownEnabled:function(enabled,internal){this.callParent(arguments),internal?this.spinDownDisabledByToggle=!enabled:delete this.spinDownDisabledByToggle},onSpinDown:function(){var me=this;me.readOnly||me.setSpinValue(Ext.Number.constrain(me.getValue()-me.step,me.minValue,me.maxValue))},setSpinValue:function(value){var me=this;me.enforceMaxLength&&me.fixPrecision(value).toString().length>me.maxLength||me.setValue(value)}});Ext.define("Ext.toolbar.Paging",{extend:"Ext.toolbar.Toolbar",alias:"widget.pagingtoolbar",alternateClassName:"Ext.PagingToolbar",requires:["Ext.toolbar.TextItem","Ext.form.field.Number"],mixins:{bindable:"Ext.util.Bindable"},displayInfo:!1,prependButtons:!1,displayMsg:"Displaying {0} - {1} of {2}",emptyMsg:"No data to display",beforePageText:"Page",afterPageText:"of {0}",firstText:"First Page",prevText:"Previous Page",nextText:"Next Page",lastText:"Last Page",refreshText:"Refresh",inputItemWidth:30,getPagingItems:function(){var me=this;return[{itemId:"first",tooltip:me.firstText,overflowText:me.firstText,iconCls:Ext.baseCSSPrefix+"tbar-page-first",disabled:!0,handler:me.moveFirst,scope:me},{itemId:"prev",tooltip:me.prevText,overflowText:me.prevText,iconCls:Ext.baseCSSPrefix+"tbar-page-prev",disabled:!0,handler:me.movePrevious,scope:me},"-",me.beforePageText,{xtype:"numberfield",itemId:"inputItem",name:"inputItem",cls:Ext.baseCSSPrefix+"tbar-page-number",allowDecimals:!1,minValue:1,hideTrigger:!0,enableKeyEvents:!0,keyNavEnabled:!1,selectOnFocus:!0,submitValue:!1,isFormField:!1,width:me.inputItemWidth,margins:"-1 2 3 2",listeners:{scope:me,keydown:me.onPagingKeyDown,blur:me.onPagingBlur}},{xtype:"tbtext",itemId:"afterTextItem",text:Ext.String.format(me.afterPageText,1)},"-",{itemId:"next",tooltip:me.nextText,overflowText:me.nextText,iconCls:Ext.baseCSSPrefix+"tbar-page-next",disabled:!0,handler:me.moveNext,scope:me},{itemId:"last",tooltip:me.lastText,overflowText:me.lastText,iconCls:Ext.baseCSSPrefix+"tbar-page-last",disabled:!0,handler:me.moveLast,scope:me},"-",{itemId:"refresh",tooltip:me.refreshText,overflowText:me.refreshText,iconCls:Ext.baseCSSPrefix+"tbar-loading",disabled:me.store.isLoading(),handler:me.doRefresh,scope:me}]},initComponent:function(){var pagingItems,me=this,userItems=me.items||me.buttons||[];me.bindStore(me.store||"ext-empty-store",!0),pagingItems=me.getPagingItems(),me.prependButtons?me.items=userItems.concat(pagingItems):me.items=pagingItems.concat(userItems),delete me.buttons,me.displayInfo&&(me.items.push("->"),me.items.push({xtype:"tbtext",itemId:"displayItem"})),me.callParent(),me.addEvents("change","beforechange")},beforeRender:function(){this.callParent(arguments),this.store.isLoading()||this.onLoad()},updateInfo:function(){var count,msg,me=this,displayItem=me.child("#displayItem"),store=me.store,pageData=me.getPageData();displayItem&&(count=store.getCount(),msg=0===count?me.emptyMsg:Ext.String.format(me.displayMsg,pageData.fromRecord,pageData.toRecord,pageData.total),displayItem.setText(msg))},onLoad:function(){var pageData,currPage,pageCount,afterText,count,isEmpty,item,me=this;if(count=me.store.getCount(),isEmpty=0===count)currPage=0,pageCount=0,afterText=Ext.String.format(me.afterPageText,0);else{if(pageData=me.getPageData(),currPage=pageData.currentPage,pageCount=pageData.pageCount,currPage>pageCount)return void me.store.loadPage(pageCount);afterText=Ext.String.format(me.afterPageText,isNaN(pageCount)?1:pageCount)}Ext.suspendLayouts(),item=me.child("#afterTextItem"),item&&item.setText(afterText),item=me.getInputItem(),item&&item.setDisabled(isEmpty).setValue(currPage),me.setChildDisabled("#first",1===currPage||isEmpty),me.setChildDisabled("#prev",1===currPage||isEmpty),me.setChildDisabled("#next",currPage===pageCount||isEmpty),me.setChildDisabled("#last",currPage===pageCount||isEmpty),me.setChildDisabled("#refresh",!1),me.updateInfo(),Ext.resumeLayouts(!0),me.fireEvent("change",me,pageData)},setChildDisabled:function(selector,disabled){var item=this.child(selector);item&&item.setDisabled(disabled)},getPageData:function(){var store=this.store,totalCount=store.getTotalCount();return{total:totalCount,currentPage:store.currentPage,pageCount:Math.ceil(totalCount/store.pageSize),fromRecord:(store.currentPage-1)*store.pageSize+1,toRecord:Math.min(store.currentPage*store.pageSize,totalCount)}},onLoadError:function(){this.setChildDisabled("#refresh",!1)},getInputItem:function(){return this.child("#inputItem")},readPageFromInput:function(pageData){var v,inputItem=this.getInputItem(),pageNum=!1;return inputItem&&(v=inputItem.getValue(),pageNum=parseInt(v,10),!v||isNaN(pageNum))?(inputItem.setValue(pageData.currentPage),!1):pageNum},onPagingBlur:function(e){var curPage,inputItem=this.getInputItem();inputItem&&(curPage=this.getPageData().currentPage,inputItem.setValue(curPage))},onPagingKeyDown:function(field,e){this.processKeyEvent(field,e)},processKeyEvent:function(field,e){var pageNum,me=this,k=e.getKey(),pageData=me.getPageData(),increment=e.shiftKey?10:1;k==e.RETURN?(e.stopEvent(),!1!==(pageNum=me.readPageFromInput(pageData))&&(pageNum=Math.min(Math.max(1,pageNum),pageData.pageCount))!==pageData.currentPage&&!1!==me.fireEvent("beforechange",me,pageNum)&&me.store.loadPage(pageNum)):k==e.HOME||k==e.END?(e.stopEvent(),pageNum=k==e.HOME?1:pageData.pageCount,field.setValue(pageNum)):k!=e.UP&&k!=e.PAGE_UP&&k!=e.DOWN&&k!=e.PAGE_DOWN||(e.stopEvent(),(pageNum=me.readPageFromInput(pageData))&&(k!=e.DOWN&&k!=e.PAGE_DOWN||(increment*=-1),(pageNum+=increment)>=1&&pageNum<=pageData.pageCount&&field.setValue(pageNum)))},beforeLoad:function(){this.setChildDisabled("#refresh",!0)},moveFirst:function(){return!1!==this.fireEvent("beforechange",this,1)&&(this.store.loadPage(1),!0)},movePrevious:function(){var me=this,store=me.store,prev=store.currentPage-1;return prev>0&&!1!==me.fireEvent("beforechange",me,prev)&&(store.previousPage(),!0)},moveNext:function(){var me=this,store=me.store,total=me.getPageData().pageCount,next=store.currentPage+1;return next<=total&&!1!==me.fireEvent("beforechange",me,next)&&(store.nextPage(),!0)},moveLast:function(){var me=this,last=me.getPageData().pageCount;return!1!==me.fireEvent("beforechange",me,last)&&(me.store.loadPage(last),!0)},doRefresh:function(){var me=this,store=me.store,current=store.currentPage;return!1!==me.fireEvent("beforechange",me,current)&&(store.loadPage(current),!0)},getStoreListeners:function(){return{beforeload:this.beforeLoad,load:this.onLoad,exception:this.onLoadError}},unbind:function(store){this.bindStore(null)},bind:function(store){this.bindStore(store)},onDestroy:function(){this.unbind(),this.callParent()}});Ext.define("Ext.view.BoundList",{extend:"Ext.view.View",alias:"widget.boundlist",alternateClassName:"Ext.BoundList",requires:["Ext.layout.component.BoundList","Ext.toolbar.Paging"],mixins:{queryable:"Ext.Queryable"},pageSize:0,baseCls:Ext.baseCSSPrefix+"boundlist",itemCls:Ext.baseCSSPrefix+"boundlist-item",listItemCls:"",shadow:!1,trackOver:!0,refreshed:0,deferInitialRefresh:!1,componentLayout:"boundlist",childEls:["listEl"],renderTpl:['<div id="{id}-listEl" role="presentation" class="{baseCls}-list-ct ',Ext.dom.Element.unselectableCls,'" style="overflow:auto"></div>',"{%","var me=values.$comp, pagingToolbar=me.pagingToolbar;","if (pagingToolbar) {","pagingToolbar.ownerLayout = me.componentLayout;","Ext.DomHelper.generateMarkup(pagingToolbar.getRenderTree(), out);","}","%}",{disableFormats:!0}],initComponent:function(){var me=this,baseCls=me.baseCls,itemCls=me.itemCls;me.selectedItemCls=baseCls+"-selected",me.trackOver&&(me.overItemCls=baseCls+"-item-over"),me.itemSelector="."+itemCls,me.floating&&me.addCls(baseCls+"-floating"),me.tpl?me.tpl.isTemplate||(me.tpl=new Ext.XTemplate(me.tpl)):me.tpl=new Ext.XTemplate('<ul class="'+Ext.plainListCls+'"><tpl for=".">','<li role="option" unselectable="on" class="'+itemCls+'">'+me.getInnerTpl(me.displayField)+"</li>","</tpl></ul>"),me.pageSize&&(me.pagingToolbar=me.createPagingToolbar()),me.callParent()},beforeRender:function(){var me=this;me.callParent(arguments),me.up("menu")&&me.addCls(Ext.baseCSSPrefix+"menu")},getRefOwner:function(){return this.pickerField||this.callParent()},getRefItems:function(){return this.pagingToolbar?[this.pagingToolbar]:[]},createPagingToolbar:function(){return Ext.widget("pagingtoolbar",{id:this.id+"-paging-toolbar",pageSize:this.pageSize,store:this.dataSource,border:!1,ownerCt:this,ownerLayout:this.getComponentLayout()})},finishRenderChildren:function(){var toolbar=this.pagingToolbar;this.callParent(arguments),toolbar&&toolbar.finishRender()},refresh:function(){var me=this,tpl=me.tpl,toolbar=me.pagingToolbar,rendered=me.rendered;tpl.field=me.pickerField,tpl.store=me.store,me.callParent(),tpl.field=tpl.store=null,rendered&&toolbar&&toolbar.rendered&&!me.preserveScrollOnRefresh&&me.el.appendChild(toolbar.el),rendered&&Ext.isIE6&&Ext.isStrict&&me.listEl.repaint()},bindStore:function(store,initial){var toolbar=this.pagingToolbar;this.callParent(arguments),toolbar&&toolbar.bindStore(store,initial)},getTargetEl:function(){return this.listEl||this.el},getInnerTpl:function(displayField){return"{"+displayField+"}"},onDestroy:function(){Ext.destroyMembers(this,"pagingToolbar","listEl"),this.callParent()}});Ext.define("Ext.view.BoundListKeyNav",{extend:"Ext.util.KeyNav",requires:"Ext.view.BoundList",constructor:function(el,config){var me=this;me.boundList=config.boundList,me.callParent([el,Ext.apply({},config,me.defaultHandlers)])},defaultHandlers:{up:function(){var me=this,boundList=me.boundList,allItems=boundList.all,oldItem=boundList.highlightedItem,oldItemIdx=oldItem?boundList.indexOf(oldItem):-1,newItemIdx=oldItemIdx>0?oldItemIdx-1:allItems.getCount()-1;me.highlightAt(newItemIdx)},down:function(){var me=this,boundList=me.boundList,allItems=boundList.all,oldItem=boundList.highlightedItem,oldItemIdx=oldItem?boundList.indexOf(oldItem):-1,newItemIdx=oldItemIdx<allItems.getCount()-1?oldItemIdx+1:0;me.highlightAt(newItemIdx)},pageup:function(){},pagedown:function(){},home:function(){this.highlightAt(0)},end:function(){var me=this;me.highlightAt(me.boundList.all.getCount()-1)},enter:function(e){this.selectHighlighted(e)}},highlightAt:function(index){var boundList=this.boundList,item=boundList.all.item(index);item&&(item=item.dom,boundList.highlightItem(item),boundList.getTargetEl().scrollChildIntoView(item,!1))},selectHighlighted:function(e){var highlighted,highlightedRec,boundList=this.boundList,selModel=boundList.getSelectionModel();(highlighted=boundList.highlightedItem)&&(highlightedRec=boundList.getRecord(highlighted),e.getKey()!==e.ENTER&&selModel.isSelected(highlightedRec)||selModel.selectWithEvent(highlightedRec,e))}});Ext.define("Ext.layout.component.field.ComboBox",{extend:"Ext.layout.component.field.Trigger",alias:"layout.combobox",requires:["Ext.util.TextMetrics"],type:"combobox",startingWidth:null,getTextWidth:function(){for(var ln,item,width,me=this,owner=me.owner,store=owner.store,field=owner.displayField,storeLn=store.data.length,value="",i=0,n=0;i<storeLn;i++)item=store.getAt(i).data[field],(ln=item.length)>n&&(n=ln,value=item);return width=Math.max(me.callParent(arguments),owner.inputEl.getTextWidth(value+owner.growAppend)),me.startingWidth&&!owner.removingRecords||(me.startingWidth=width,width<owner.growMin&&(owner.defaultListConfig.minWidth=owner.growMin),owner.removingRecords=!1),width<me.startingWidth?me.startingWidth:width}});Ext.define("Ext.form.field.ComboBox",{extend:"Ext.form.field.Picker",requires:["Ext.util.DelayedTask","Ext.EventObject","Ext.view.BoundList","Ext.view.BoundListKeyNav","Ext.data.StoreManager","Ext.layout.component.field.ComboBox"],alternateClassName:"Ext.form.ComboBox",alias:["widget.combobox","widget.combo"],mixins:{bindable:"Ext.util.Bindable"},componentLayout:"combobox",triggerCls:Ext.baseCSSPrefix+"form-arrow-trigger",hiddenName:"",hiddenDataCls:Ext.baseCSSPrefix+"hide-display "+Ext.baseCSSPrefix+"form-data-hidden",ariaRole:"combobox",fieldSubTpl:['<div class="{hiddenDataCls}" role="presentation"></div>','<input id="{id}" type="{type}" role="{role}" {inputAttrTpl} class="{fieldCls} {typeCls} {editableCls}" autocomplete="off"','<tpl if="value"> value="{[Ext.util.Format.htmlEncode(values.value)]}"</tpl>','<tpl if="name"> name="{name}"</tpl>','<tpl if="placeholder"> placeholder="{placeholder}"</tpl>','<tpl if="size"> size="{size}"</tpl>','<tpl if="maxLength !== undefined"> maxlength="{maxLength}"</tpl>','<tpl if="readOnly"> readonly="readonly"</tpl>','<tpl if="disabled"> disabled="disabled"</tpl>','<tpl if="tabIdx"> tabIndex="{tabIdx}"</tpl>','<tpl if="fieldStyle"> style="{fieldStyle}"</tpl>',"/>",{compiled:!0,disableFormats:!0}],getSubTplData:function(){var me=this;return Ext.applyIf(me.subTplData,{hiddenDataCls:me.hiddenDataCls}),me.callParent(arguments)},afterRender:function(){var me=this;me.callParent(arguments),me.setHiddenValue(me.value)},multiSelect:!1,delimiter:", ",displayField:"text",triggerAction:"all",allQuery:"",queryParam:"query",queryMode:"remote",queryCaching:!0,pageSize:0,anyMatch:!1,caseSensitive:!1,autoSelect:!0,typeAhead:!1,typeAheadDelay:250,selectOnTab:!0,forceSelection:!1,growToLongestValue:!0,clearFilterOnBlur:!0,defaultListConfig:{loadingHeight:70,minWidth:70,maxHeight:300,shadow:"sides"},transformInPlace:!0,ignoreSelection:0,removingRecords:null,resizeComboToGrow:function(){var me=this;return me.grow&&me.growToLongestValue},initComponent:function(){var transformSelect,isLocalMode,me=this,isDefined=Ext.isDefined,store=me.store,transform=me.transform,displayTpl=me.displayTpl;Ext.applyIf(me.renderSelectors,{hiddenDataEl:"."+me.hiddenDataCls.split(" ").join(".")}),me.typeAhead&&me.multiSelect&&Ext.Error.raise("typeAhead and multiSelect are mutually exclusive options -- please remove one of them."),me.typeAhead&&!me.editable&&Ext.Error.raise("If typeAhead is enabled the combo must be editable: true -- please change one of those settings."),me.selectOnFocus&&!me.editable&&Ext.Error.raise("If selectOnFocus is enabled the combo must be editable: true -- please change one of those settings."),me.addEvents("beforequery","select","beforeselect","beforedeselect"),transform&&(transformSelect=Ext.getDom(transform))&&(me.store||(store=Ext.Array.map(Ext.Array.from(transformSelect.options),function(option){return[option.value,option.text]})),me.name||(me.name=transformSelect.name),"value"in me||(me.value=transformSelect.value)),me.bindStore(store||"ext-empty-store",!0),store=me.store,store.autoCreated&&(me.queryMode="local",me.valueField=me.displayField="field1",store.expanded||(me.displayField="field2")),isDefined(me.valueField)||(me.valueField=me.displayField),isLocalMode="local"===me.queryMode,isDefined(me.queryDelay)||(me.queryDelay=isLocalMode?10:500),isDefined(me.minChars)||(me.minChars=isLocalMode?0:4),displayTpl?displayTpl.isTemplate||(me.displayTpl=new Ext.XTemplate(displayTpl)):me.displayTpl=new Ext.XTemplate('<tpl for=".">{[typeof values === "string" ? values : values["'+me.displayField+'"]]}<tpl if="xindex < xcount">'+me.delimiter+"</tpl></tpl>"),me.callParent(),me.doQueryTask=new Ext.util.DelayedTask(me.doRawQuery,me),me.store.getCount()>0&&me.setValue(me.value),transformSelect&&(me.transformInPlace&&(me.render(transformSelect.parentNode,transformSelect),delete me.renderTo),Ext.removeNode(transformSelect))},getStore:function(){return this.store},beforeBlur:function(){var me=this,filter=me.queryFilter;me.doQueryTask.cancel(),me.assertValue(),filter&&!filter.disabled&&"local"===me.queryMode&&me.clearFilterOnBlur&&(filter.disabled=!0,me.store.filter())},onFocus:function(){var me=this,filter=me.queryFilter;me.callParent(arguments),!me.duringTriggerClick&&"all"!==me.triggerAction&&filter&&filter.disabled&&"local"===me.queryMode&&me.clearFilterOnBlur&&(delete me.lastQuery,me.doRawQuery())},assertValue:function(){var rec,currentValue,me=this,value=me.getRawValue();me.forceSelection&&(me.multiSelect?value!==me.getDisplayValue()&&me.setValue(me.lastSelection):(rec=me.findRecordByDisplay(value),rec?(currentValue=me.value,me.findRecordByValue(currentValue)||me.select(rec,!0)):me.setValue(me.lastSelection))),me.collapse()},onTypeAhead:function(){var newValue,len,selStart,me=this,displayField=me.displayField,record=me.store.findRecord(displayField,me.getRawValue()),boundList=me.getPicker();record&&(newValue=record.get(displayField),len=newValue.length,selStart=me.getRawValue().length,boundList.highlightItem(boundList.getNode(record)),0!==selStart&&selStart!==len&&(me.setRawValue(newValue),me.selectText(selStart,newValue.length)))},resetToDefault:Ext.emptyFn,beforeReset:function(){var filter=this.queryFilter;this.callParent(),filter&&!filter.disabled&&(filter.disabled=!0,this.store.filter())},onUnbindStore:function(store){var me=this,picker=me.picker,filter=me.queryFilter;filter&&me.store.removeFilter(filter),!store&&picker&&picker.bindStore(null)},onBindStore:function(store,initial){var picker=this.picker;initial||this.resetToDefault(),picker&&picker.bindStore(store)},getStoreListeners:function(){var me=this;return{beforeload:me.onBeforeLoad,clear:me.onClear,datachanged:me.onDataChanged,load:me.onLoad,exception:me.onException,remove:me.onRemove}},onBeforeLoad:function(){++this.ignoreSelection},onDataChanged:function(){var me=this;me.resizeComboToGrow()&&me.updateLayout()},onClear:function(){var me=this;me.resizeComboToGrow()&&(me.removingRecords=!0,me.onDataChanged())},onRemove:function(){var me=this;me.resizeComboToGrow()&&(me.removingRecords=!0)},onException:function(){this.ignoreSelection>0&&--this.ignoreSelection,this.collapse()},onLoad:function(store,records,success){var me=this;me.ignoreSelection>0&&--me.ignoreSelection,success&&!store.lastOptions.rawQuery&&(null==me.value&&me.store.getCount()?me.doAutoSelect():me.setValue(me.value))},doRawQuery:function(){this.doQuery(this.getRawValue(),!1,!0)},doQuery:function(queryString,forceAll,rawQuery){var me=this,queryPlan=me.beforeQuery({query:queryString||"",rawQuery:rawQuery,forceAll:forceAll,combo:me,cancel:!1});return!1!==queryPlan&&!queryPlan.cancel&&(me.queryCaching&&queryPlan.query===me.lastQuery?(me.expand(),"local"===me.queryMode&&me.doAutoSelect()):(me.lastQuery=queryPlan.query,"local"===me.queryMode?me.doLocalQuery(queryPlan):me.doRemoteQuery(queryPlan)),!0)},beforeQuery:function(queryPlan){var me=this;return!1===me.fireEvent("beforequery",queryPlan)?queryPlan.cancel=!0:queryPlan.cancel||queryPlan.query.length<me.minChars&&!queryPlan.forceAll&&(queryPlan.cancel=!0),queryPlan},doLocalQuery:function(queryPlan){var me=this,queryString=queryPlan.query;me.queryFilter||(me.queryFilter=new Ext.util.Filter({id:me.id+"-query-filter",anyMatch:me.anyMatch,caseSensitive:me.caseSensitive,root:"data",property:me.displayField}),me.store.addFilter(me.queryFilter,!1)),queryString||!queryPlan.forceAll?(me.queryFilter.disabled=!1,me.queryFilter.setValue(me.enableRegEx?new RegExp(queryString):queryString)):me.queryFilter.disabled=!0,me.store.filter(),me.store.getCount()?me.expand():me.collapse(),me.afterQuery(queryPlan)},doRemoteQuery:function(queryPlan){var me=this,loadCallback=function(){me.afterQuery(queryPlan)};me.expand(),me.pageSize?me.loadPage(1,{rawQuery:queryPlan.rawQuery,callback:loadCallback}):me.store.load({params:me.getParams(queryPlan.query),rawQuery:queryPlan.rawQuery,callback:loadCallback})},afterQuery:function(queryPlan){var me=this;me.store.getCount()&&(me.typeAhead&&me.doTypeAhead(),me.getRawValue()!==me.getDisplayValue()&&(me.ignoreSelection++,me.picker.getSelectionModel().deselectAll(),me.ignoreSelection--),queryPlan.rawQuery?(me.syncSelection(),me.picker&&!me.picker.getSelectionModel().hasSelection()&&me.doAutoSelect()):me.doAutoSelect())},loadPage:function(pageNum,options){this.store.loadPage(pageNum,Ext.apply({params:this.getParams(this.lastQuery)},options))},onPageChange:function(toolbar,newPage){return this.loadPage(newPage),!1},getParams:function(queryString){var params={},param=this.queryParam;return param&&(params[param]=queryString),params},doAutoSelect:function(){var lastSelected,itemNode,me=this,picker=me.picker;picker&&me.autoSelect&&me.store.getCount()>0&&(lastSelected=picker.getSelectionModel().lastSelected,(itemNode=picker.getNode(lastSelected||0))&&(picker.highlightItem(itemNode),picker.listEl.scrollChildIntoView(itemNode,!1)))},doTypeAhead:function(){var me=this;me.typeAheadTask||(me.typeAheadTask=new Ext.util.DelayedTask(me.onTypeAhead,me)),me.lastKey!=Ext.EventObject.BACKSPACE&&me.lastKey!=Ext.EventObject.DELETE&&me.typeAheadTask.delay(me.typeAheadDelay)},onTriggerClick:function(){var me=this;me.duringTriggerClick=!0,me.readOnly||me.disabled||(me.isExpanded?me.collapse():(me.onFocus({}),"all"===me.triggerAction?me.doQuery(me.allQuery,!0):"last"===me.triggerAction?me.doQuery(me.lastQuery,!0):me.doQuery(me.getRawValue(),!1,!0)),me.inputEl.focus()),delete me.duringTriggerClick},onPaste:function(){var me=this;me.readOnly||me.disabled||!me.editable||me.doQueryTask.delay(me.queryDelay)},onKeyUp:function(e,t){var me=this,key=e.getKey();me.readOnly||me.disabled||!me.editable||(me.lastKey=key,e.isSpecialKey()&&key!=e.BACKSPACE&&key!=e.DELETE||me.doQueryTask.delay(me.queryDelay)),me.enableKeyEvents&&me.callParent(arguments)},initEvents:function(){var me=this;me.callParent(),me.enableKeyEvents||me.mon(me.inputEl,"keyup",me.onKeyUp,me),me.mon(me.inputEl,"paste",me.onPaste,me)},onDestroy:function(){var me=this;me.typeAheadTask&&(me.typeAheadTask.cancel(),me.typeAheadTask=null),Ext.destroy(me.listKeyNav),me.bindStore(null),me.callParent()},onAdded:function(){var me=this;me.callParent(arguments),me.picker&&(me.picker.ownerCt=me.up("[floating]"),me.picker.registerWithOwnerCt())},createPicker:function(){var picker,me=this,pickerCfg=Ext.apply({xtype:"boundlist",pickerField:me,selModel:{mode:me.multiSelect?"SIMPLE":"SINGLE"},floating:!0,hidden:!0,store:me.store,displayField:me.displayField,focusOnToFront:!1,pageSize:me.pageSize,tpl:me.tpl},me.listConfig,me.defaultListConfig);return picker=me.picker=Ext.widget(pickerCfg),me.pageSize&&picker.pagingToolbar.on("beforechange",me.onPageChange,me),me.mon(picker,{itemclick:me.onItemClick,refresh:me.onListRefresh,scope:me}),me.mon(picker.getSelectionModel(),{beforeselect:me.onBeforeSelect,beforedeselect:me.onBeforeDeselect,selectionchange:me.onListSelectionChange,scope:me}),picker},alignPicker:function(){var me=this,picker=me.getPicker(),heightAbove=me.getPosition()[1]-Ext.getBody().getScroll().top,heightBelow=Ext.Element.getViewHeight()-heightAbove-me.getHeight(),space=Math.max(heightAbove,heightBelow);picker.height&&(delete picker.height,picker.updateLayout()),picker.getHeight()>space-5&&picker.setHeight(space-5),me.callParent()},onListRefresh:function(){this.expanding||this.alignPicker(),this.syncSelection()},onItemClick:function(picker,record){var me=this,selection=me.picker.getSelectionModel().getSelection(),valueField=me.valueField;!me.multiSelect&&selection.length&&record.get(valueField)===selection[0].get(valueField)&&(me.displayTplData=[record.data],me.setRawValue(me.getDisplayValue()),me.collapse())},onBeforeSelect:function(list,record){return this.fireEvent("beforeselect",this,record,record.index)},onBeforeDeselect:function(list,record){return this.fireEvent("beforedeselect",this,record,record.index)},onListSelectionChange:function(list,selectedRecords){var me=this,isMulti=me.multiSelect,hasRecords=selectedRecords.length>0;!me.ignoreSelection&&me.isExpanded&&(isMulti||Ext.defer(me.collapse,1,me),(isMulti||hasRecords)&&me.setValue(selectedRecords,!1),hasRecords&&me.fireEvent("select",me,selectedRecords),me.inputEl.focus())},onExpand:function(){var me=this,keyNav=me.listKeyNav,selectOnTab=me.selectOnTab,picker=me.getPicker();keyNav?keyNav.enable():keyNav=me.listKeyNav=new Ext.view.BoundListKeyNav(me.inputEl,{boundList:picker,forceKeyDown:!0,tab:function(e){return selectOnTab&&(this.selectHighlighted(e),me.triggerBlur()),!0},enter:function(e){var selModel=picker.getSelectionModel(),count=selModel.getCount();this.selectHighlighted(e),me.multiSelect||count!==selModel.getCount()||me.collapse()}}),selectOnTab&&(me.ignoreMonitorTab=!0),Ext.defer(keyNav.enable,1,keyNav),me.inputEl.focus()},onCollapse:function(){var me=this,keyNav=me.listKeyNav;keyNav&&(keyNav.disable(),me.ignoreMonitorTab=!1)},select:function(r,assert){var fireSelect,me=this,picker=me.picker;r&&r.isModel&&!0===assert&&picker&&(fireSelect=!picker.getSelectionModel().isSelected(r)),me.setValue(r,!0),fireSelect&&me.fireEvent("select",me,r)},findRecord:function(field,value){var ds=this.store,idx=ds.findExact(field,value);return-1!==idx&&ds.getAt(idx)},findRecordByValue:function(value){return this.findRecord(this.valueField,value)},findRecordByDisplay:function(value){return this.findRecord(this.displayField,value)},setValue:function(value,doSelect){var i,len,record,dataObj,me=this,valueNotFoundText=me.valueNotFoundText,inputEl=me.inputEl,matchedRecords=[],displayTplData=[],processedValue=[];if(me.store.loading)return me.value=value,me.setHiddenValue(me.value),me;for(value=Ext.Array.from(value),i=0,len=value.length;i<len;i++)record=value[i],record&&record.isModel||(record=me.findRecordByValue(record)),record?(matchedRecords.push(record),displayTplData.push(record.data),processedValue.push(record.get(me.valueField))):me.forceSelection?Ext.isDefined(valueNotFoundText)&&displayTplData.push(valueNotFoundText):(processedValue.push(value[i]),dataObj={},dataObj[me.displayField]=value[i],displayTplData.push(dataObj));return me.setHiddenValue(processedValue),me.value=me.multiSelect?processedValue:processedValue[0],Ext.isDefined(me.value)||(me.value=null),me.displayTplData=displayTplData,me.lastSelection=me.valueModels=matchedRecords,inputEl&&me.emptyText&&!Ext.isEmpty(value)&&inputEl.removeCls(me.emptyCls),me.setRawValue(me.getDisplayValue()),me.checkChange(),!1!==doSelect&&me.syncSelection(),me.applyEmptyText(),me},setHiddenValue:function(values){var i,dom,childNodes,input,valueCount,childrenCount,me=this,name=me.hiddenName;if(me.hiddenDataEl&&name){for(values=Ext.Array.from(values),dom=me.hiddenDataEl.dom,childNodes=dom.childNodes,input=childNodes[0],valueCount=values.length,childrenCount=childNodes.length,!input&&valueCount>0&&(me.hiddenDataEl.update(Ext.DomHelper.markup({tag:"input",type:"hidden",name:name})),childrenCount=1,input=dom.firstChild);childrenCount>valueCount;)dom.removeChild(childNodes[0]),--childrenCount;for(;childrenCount<valueCount;)dom.appendChild(input.cloneNode(!0)),++childrenCount;for(i=0;i<valueCount;i++)childNodes[i].value=values[i]}},getDisplayValue:function(){return this.displayTpl.apply(this.displayTplData)},getValue:function(){var me=this,picker=me.picker,rawValue=me.getRawValue(),value=me.value;return me.getDisplayValue()!==rawValue&&(value=rawValue,me.value=me.displayTplData=me.valueModels=null,picker&&(me.ignoreSelection++,picker.getSelectionModel().deselectAll(),me.ignoreSelection--)),value},getSubmitValue:function(){var value=this.getValue();return Ext.isEmpty(value)&&(value=""),value},isEqual:function(v1,v2){var i,len,fromArray=Ext.Array.from;if(v1=fromArray(v1),v2=fromArray(v2),(len=v1.length)!==v2.length)return!1;for(i=0;i<len;i++)if(v2[i]!==v1[i])return!1;return!0},clearValue:function(){this.setValue([])},syncSelection:function(){var selection,selModel,v,value,me=this,picker=me.picker,values=me.valueModels||[],vLen=values.length;if(picker){for(selection=[],v=0;v<vLen;v++)(value=values[v])&&value.isModel&&me.store.indexOf(value)>=0&&selection.push(value);me.ignoreSelection++,selModel=picker.getSelectionModel(),selModel.deselectAll(),selection.length&&selModel.select(selection,void 0,!0),me.ignoreSelection--}},onEditorTab:function(e){var keyNav=this.listKeyNav;this.selectOnTab&&keyNav&&keyNav.selectHighlighted(e)}});Ext.define("Ext.picker.Month",{extend:"Ext.Component",requires:["Ext.XTemplate","Ext.util.ClickRepeater","Ext.Date","Ext.button.Button"],alias:"widget.monthpicker",alternateClassName:"Ext.MonthPicker",childEls:["bodyEl","prevEl","nextEl","buttonsEl","monthEl","yearEl"],renderTpl:['<div id="{id}-bodyEl" class="{baseCls}-body">','<div id="{id}-monthEl" class="{baseCls}-months">','<tpl for="months">','<div class="{parent.baseCls}-item {parent.baseCls}-month">','<a style="{parent.monthStyle}" role="button" hidefocus="on" class="{parent.baseCls}-item-inner" href="#">{.}</a>',"</div>","</tpl>","</div>",'<div id="{id}-yearEl" class="{baseCls}-years">','<div class="{baseCls}-yearnav">','<div class="{baseCls}-yearnav-button-ct">','<a id="{id}-prevEl" class="{baseCls}-yearnav-button {baseCls}-yearnav-prev" href="#" hidefocus="on" role="button"></a>',"</div>",'<div class="{baseCls}-yearnav-button-ct">','<a id="{id}-nextEl" class="{baseCls}-yearnav-button {baseCls}-yearnav-next" href="#" hidefocus="on" role="button"></a>',"</div>","</div>",'<tpl for="years">','<div class="{parent.baseCls}-item {parent.baseCls}-year">','<a hidefocus="on" class="{parent.baseCls}-item-inner" role="button" href="#">{.}</a>',"</div>","</tpl>","</div>",'<div class="'+Ext.baseCSSPrefix+'clear"></div>','<tpl if="showButtons">','<div id="{id}-buttonsEl" class="{baseCls}-buttons">{%',"var me=values.$comp, okBtn=me.okBtn, cancelBtn=me.cancelBtn;","okBtn.ownerLayout = cancelBtn.ownerLayout = me.componentLayout;","okBtn.ownerCt = cancelBtn.ownerCt = me;","Ext.DomHelper.generateMarkup(okBtn.getRenderTree(), out);","Ext.DomHelper.generateMarkup(cancelBtn.getRenderTree(), out);","%}</div>","</tpl>","</div>"],okText:"OK",cancelText:"Cancel",baseCls:Ext.baseCSSPrefix+"monthpicker",showButtons:!0,measureWidth:35,measureMaxHeight:20,smallCls:Ext.baseCSSPrefix+"monthpicker-small",totalYears:10,yearOffset:5,monthOffset:6,initComponent:function(){var me=this;me.selectedCls=me.baseCls+"-selected",me.addEvents("cancelclick","monthclick","monthdblclick","okclick","select","yearclick","yeardblclick"),me.small&&me.addCls(me.smallCls),me.setValue(me.value),me.activeYear=me.getYear((new Date).getFullYear()-4,-4),me.showButtons&&(me.okBtn=new Ext.button.Button({text:me.okText,handler:me.onOkClick,scope:me}),me.cancelBtn=new Ext.button.Button({text:me.cancelText,handler:me.onCancelClick,scope:me})),this.callParent()},beforeRender:function(){var me=this,i=0,months=[],shortName=Ext.Date.getShortMonthName,monthLen=me.monthOffset,margin=me.monthMargin,style="";for(me.padding&&!me.width&&me.cacheWidth(),me.callParent();i<monthLen;++i)months.push(shortName(i),shortName(i+monthLen));Ext.isDefined(margin)&&(style="margin: 0 "+margin+"px;"),Ext.apply(me.renderData,{months:months,years:me.getYears(),showButtons:me.showButtons,monthStyle:style})},cacheWidth:function(){var me=this,padding=me.parseBox(me.padding),widthEl=Ext.getBody().createChild({cls:me.baseCls+" "+me.borderBoxCls,style:"position:absolute;top:-1000px;left:-1000px;",html:"&nbsp;"});me.self.prototype.width=widthEl.getWidth()+padding.left+padding.right,widthEl.remove()},afterRender:function(){var me=this,body=me.bodyEl;me.buttonsEl;me.callParent(),me.mon(body,"click",me.onBodyClick,me),me.mon(body,"dblclick",me.onBodyClick,me),me.years=body.select("."+me.baseCls+"-year a"),me.months=body.select("."+me.baseCls+"-month a"),me.backRepeater=new Ext.util.ClickRepeater(me.prevEl,{handler:Ext.Function.bind(me.adjustYear,me,[-me.totalYears])}),me.prevEl.addClsOnOver(me.baseCls+"-yearnav-prev-over"),me.nextRepeater=new Ext.util.ClickRepeater(me.nextEl,{handler:Ext.Function.bind(me.adjustYear,me,[me.totalYears])}),me.nextEl.addClsOnOver(me.baseCls+"-yearnav-next-over"),me.updateBody(),Ext.isDefined(me.monthMargin)||(Ext.picker.Month.prototype.monthMargin=me.calculateMonthMargin())},calculateMonthMargin:function(){for(var me=this,months=(me.monthEl,me.months),first=months.first(),itemMargin=first.getMargin("l");itemMargin&&me.getLargest()>me.measureMaxHeight;)--itemMargin,months.setStyle("margin","0 "+itemMargin+"px");return itemMargin},getLargest:function(months){var largest=0;return this.months.each(function(item){var h=item.getHeight();h>largest&&(largest=h)}),largest},setValue:function(value){var year,me=this,active=me.activeYear;me.monthOffset;return value?Ext.isDate(value)?me.value=[value.getMonth(),value.getFullYear()]:me.value=[value[0],value[1]]:me.value=[null,null],me.rendered&&(year=me.value[1],null!==year&&(year<active||year>active+me.yearOffset)&&(me.activeYear=year-me.yearOffset+1),me.updateBody()),me},getValue:function(){return this.value},hasSelection:function(){var value=this.value;return null!==value[0]&&null!==value[1]},getYears:function(){for(var me=this,offset=me.yearOffset,start=me.activeYear,end=start+offset,i=start,years=[];i<end;++i)years.push(i,i+offset);return years},updateBody:function(){var year,yearItems,y,yLen,el,me=this,years=me.years,months=me.months,yearNumbers=me.getYears(),cls=me.selectedCls,value=me.getYear(null),month=me.value[0],monthOffset=me.monthOffset;if(me.rendered){for(years.removeCls(cls),months.removeCls(cls),yearItems=years.elements,yLen=yearItems.length,y=0;y<yLen;y++)el=Ext.fly(yearItems[y]),year=yearNumbers[y],el.dom.innerHTML=year,year==value&&el.addCls(cls);null!==month&&(month<monthOffset?month*=2:month=2*(month-monthOffset)+1,months.item(month).addCls(cls))}},getYear:function(defaultValue,offset){var year=this.value[1];return offset=offset||0,null===year?defaultValue:year+offset},onBodyClick:function(e,t){var me=this,isDouble="dblclick"==e.type;e.getTarget("."+me.baseCls+"-month")?(e.stopEvent(),me.onMonthClick(t,isDouble)):e.getTarget("."+me.baseCls+"-year")&&(e.stopEvent(),me.onYearClick(t,isDouble))},adjustYear:function(offset){"number"!=typeof offset&&(offset=this.totalYears),this.activeYear+=offset,this.updateBody()},onOkClick:function(){this.fireEvent("okclick",this,this.value)},onCancelClick:function(){this.fireEvent("cancelclick",this)},onMonthClick:function(target,isDouble){var me=this;me.value[0]=me.resolveOffset(me.months.indexOf(target),me.monthOffset),me.updateBody(),me.fireEvent("month"+(isDouble?"dbl":"")+"click",me,me.value),me.fireEvent("select",me,me.value)},onYearClick:function(target,isDouble){var me=this;me.value[1]=me.activeYear+me.resolveOffset(me.years.indexOf(target),me.yearOffset),me.updateBody(),me.fireEvent("year"+(isDouble?"dbl":"")+"click",me,me.value),me.fireEvent("select",me,me.value)},resolveOffset:function(index,offset){return index%2==0?index/2:offset+Math.floor(index/2)},beforeDestroy:function(){var me=this;me.years=me.months=null,Ext.destroyMembers(me,"backRepeater","nextRepeater","okBtn","cancelBtn"),me.callParent()},finishRenderChildren:function(){var me=this;this.callParent(arguments),this.showButtons&&(me.okBtn.finishRender(),me.cancelBtn.finishRender())},onDestroy:function(){Ext.destroyMembers(this,"okBtn","cancelBtn"),this.callParent()}});Ext.define("Ext.picker.Date",{extend:"Ext.Component",requires:["Ext.XTemplate","Ext.button.Button","Ext.button.Split","Ext.util.ClickRepeater","Ext.util.KeyNav","Ext.EventObject","Ext.fx.Manager","Ext.picker.Month"],alias:"widget.datepicker",alternateClassName:"Ext.DatePicker",childEls:["innerEl","eventEl","prevEl","nextEl","middleBtnEl","footerEl"],border:!0,renderTpl:['<div id="{id}-innerEl" role="grid">','<div role="presentation" class="{baseCls}-header">','<a id="{id}-prevEl" class="{baseCls}-prev {baseCls}-arrow" href="#" role="button" title="{prevText}" hidefocus="on" ></a>','<div class="{baseCls}-month" id="{id}-middleBtnEl">{%this.renderMonthBtn(values, out)%}</div>','<a id="{id}-nextEl" class="{baseCls}-next {baseCls}-arrow" href="#" role="button" title="{nextText}" hidefocus="on" ></a>',"</div>",'<table id="{id}-eventEl" class="{baseCls}-inner" cellspacing="0" role="grid">','<thead role="presentation"><tr role="row">','<tpl for="dayNames">','<th role="columnheader" class="{parent.baseCls}-column-header" title="{.}">','<div class="{parent.baseCls}-column-header-inner">{.:this.firstInitial}</div>',"</th>","</tpl>","</tr></thead>",'<tbody role="presentation"><tr role="row">','<tpl for="days">',"{#:this.isEndOfWeek}",'<td role="gridcell" id="{[Ext.id()]}">','<a role="button" hidefocus="on" class="{parent.baseCls}-date" href="#"></a>',"</td>","</tpl>","</tr></tbody>","</table>",'<tpl if="showToday">','<div id="{id}-footerEl" role="presentation" class="{baseCls}-footer">{%this.renderTodayBtn(values, out)%}</div>',"</tpl>","</div>",{firstInitial:function(value){return Ext.picker.Date.prototype.getDayInitial(value)},isEndOfWeek:function(value){return value--,value%7==0&&0!==value?'</tr><tr role="row">':""},renderTodayBtn:function(values,out){Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(),out)},renderMonthBtn:function(values,out){Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(),out)}}],todayText:"Today",ariaTitle:"Date Picker: {0}",ariaTitleDateFormat:"F d, Y",todayTip:"{0} (Spacebar)",minText:"This date is before the minimum date",maxText:"This date is after the maximum date",disabledDaysText:"Disabled",disabledDatesText:"Disabled",nextText:"Next Month (Control+Right)",prevText:"Previous Month (Control+Left)",monthYearText:"Choose a month (Control+Up/Down to move years)",monthYearFormat:"F Y",startDay:0,showToday:!0,disableAnim:!1,baseCls:Ext.baseCSSPrefix+"datepicker",longDayFormat:"F d, Y",focusOnShow:!1,focusOnSelect:!0,initHour:12,numDays:42,initComponent:function(){var me=this,clearTime=Ext.Date.clearTime;me.selectedCls=me.baseCls+"-selected",me.disabledCellCls=me.baseCls+"-disabled",me.prevCls=me.baseCls+"-prevday",me.activeCls=me.baseCls+"-active",me.cellCls=me.baseCls+"-cell",me.nextCls=me.baseCls+"-prevday",me.todayCls=me.baseCls+"-today",me.format||(me.format=Ext.Date.defaultFormat),me.dayNames||(me.dayNames=Ext.Date.dayNames),me.dayNames=me.dayNames.slice(me.startDay).concat(me.dayNames.slice(0,me.startDay)),me.callParent(),me.value=me.value?clearTime(me.value,!0):clearTime(new Date),me.addEvents("select"),me.initDisabledDays()},beforeRender:function(){var me=this,days=new Array(me.numDays),today=Ext.Date.format(new Date,me.format);me.up("menu")&&me.addCls(Ext.baseCSSPrefix+"menu"),me.padding&&!me.width&&me.cacheWidth(),me.monthBtn=new Ext.button.Split({ownerCt:me,ownerLayout:me.getComponentLayout(),text:"",tooltip:me.monthYearText,listeners:{click:me.doShowMonthPicker,arrowclick:me.doShowMonthPicker,scope:me}}),me.showToday&&(me.todayBtn=new Ext.button.Button({ownerCt:me,ownerLayout:me.getComponentLayout(),text:Ext.String.format(me.todayText,today),tooltip:Ext.String.format(me.todayTip,today),tooltipType:"title",handler:me.selectToday,scope:me})),me.callParent(),Ext.applyIf(me,{renderData:{}}),Ext.apply(me.renderData,{dayNames:me.dayNames,showToday:me.showToday,prevText:me.prevText,nextText:me.nextText,days:days}),me.protoEl.unselectable()},cacheWidth:function(){var me=this,padding=me.parseBox(me.padding),widthEl=Ext.getBody().createChild({cls:me.baseCls+" "+me.borderBoxCls,style:"position:absolute;top:-1000px;left:-1000px;"});me.self.prototype.width=widthEl.getWidth()+padding.left+padding.right,widthEl.remove()},finishRenderChildren:function(){var me=this;me.callParent(),me.monthBtn.finishRender(),me.showToday&&me.todayBtn.finishRender()},onRender:function(container,position){var me=this;me.callParent(arguments),me.cells=me.eventEl.select("tbody td"),me.textNodes=me.eventEl.query("tbody td a"),me.mon(me.eventEl,{scope:me,mousewheel:me.handleMouseWheel,click:{fn:me.handleDateClick,delegate:"a."+me.baseCls+"-date"}})},initEvents:function(){var me=this,eDate=Ext.Date,day=eDate.DAY;me.callParent(),me.prevRepeater=new Ext.util.ClickRepeater(me.prevEl,{handler:me.showPrevMonth,scope:me,preventDefault:!0,stopDefault:!0}),me.nextRepeater=new Ext.util.ClickRepeater(me.nextEl,{handler:me.showNextMonth,scope:me,preventDefault:!0,stopDefault:!0}),me.keyNav=new Ext.util.KeyNav(me.eventEl,Ext.apply({scope:me,left:function(e){e.ctrlKey?me.showPrevMonth():me.update(eDate.add(me.activeDate,day,-1))},right:function(e){e.ctrlKey?me.showNextMonth():me.update(eDate.add(me.activeDate,day,1))},up:function(e){e.ctrlKey?me.showNextYear():me.update(eDate.add(me.activeDate,day,-7))},down:function(e){e.ctrlKey?me.showPrevYear():me.update(eDate.add(me.activeDate,day,7))},pageUp:function(e){e.altKey?me.showPrevYear():me.showPrevMonth()},pageDown:function(e){e.altKey?me.showNextYear():me.showNextMonth()},tab:function(e){return me.doCancelFieldFocus=!0,me.handleTabClick(e),delete me.doCancelFieldFocus,!0},enter:function(e){return e.stopPropagation(),!0},home:function(e){me.update(eDate.getFirstDateOfMonth(me.activeDate))},end:function(e){me.update(eDate.getLastDateOfMonth(me.activeDate))}},me.keyNavConfig)),me.showToday&&(me.todayKeyListener=me.eventEl.addKeyListener(Ext.EventObject.SPACE,me.selectToday,me)),me.update(me.value)},handleTabClick:function(e){var me=this,t=me.getSelectedDate(me.activeDate),handler=me.handler;me.disabled||!t.dateValue||Ext.fly(t.parentNode).hasCls(me.disabledCellCls)||(me.doCancelFocus=!1===me.focusOnSelect,me.setValue(new Date(t.dateValue)),delete me.doCancelFocus,me.fireEvent("select",me,me.value),handler&&handler.call(me.scope||me,me,me.value),me.onSelect())},getSelectedDate:function(date){var c,cell,me=this,t=date.getTime(),cells=me.cells,cls=me.selectedCls,cellItems=cells.elements,cLen=cellItems.length;for(cells.removeCls(cls),c=0;c<cLen;c++)if(cell=Ext.fly(cellItems[c]),cell.dom.firstChild.dateValue==t)return cell.dom.firstChild;return null},initDisabledDays:function(){var len,d,dLen,dI,me=this,dd=me.disabledDates,re="(?:";if(!me.disabledDatesRE&&dd){for(len=dd.length-1,dLen=dd.length,d=0;d<dLen;d++)dI=dd[d],re+=Ext.isDate(dI)?"^"+Ext.String.escapeRegex(Ext.Date.dateFormat(dI,me.format))+"$":dI,d!=len&&(re+="|");me.disabledDatesRE=new RegExp(re+")")}},setDisabledDates:function(dd){var me=this;return Ext.isArray(dd)?(me.disabledDates=dd,me.disabledDatesRE=null):me.disabledDatesRE=dd,me.initDisabledDays(),me.update(me.value,!0),me},setDisabledDays:function(dd){return this.disabledDays=dd,this.update(this.value,!0)},setMinDate:function(dt){return this.minDate=dt,this.update(this.value,!0)},setMaxDate:function(dt){return this.maxDate=dt,this.update(this.value,!0)},setValue:function(value){return this.value=Ext.Date.clearTime(value,!0),this.update(this.value)},getValue:function(){return this.value},getDayInitial:function(value){return value.substr(0,1)},focus:function(){this.update(this.activeDate)},onEnable:function(){this.callParent(),this.setDisabledStatus(!1),this.update(this.activeDate)},onDisable:function(){this.callParent(),this.setDisabledStatus(!0)},setDisabledStatus:function(disabled){var me=this;me.keyNav.setDisabled(disabled),me.prevRepeater.setDisabled(disabled),me.nextRepeater.setDisabled(disabled),me.showToday&&(me.todayKeyListener.setDisabled(disabled),me.todayBtn.setDisabled(disabled))},getActive:function(){return this.activeDate||this.value},runAnimation:function(isHide){var picker=this.monthPicker,options={duration:200,callback:function(){isHide?picker.hide():picker.show()}};isHide?picker.el.slideOut("t",options):picker.el.slideIn("t",options)},hideMonthPicker:function(animate){var me=this,picker=me.monthPicker;return picker&&(me.shouldAnimate(animate)?me.runAnimation(!0):picker.hide()),me},doShowMonthPicker:function(){this.showMonthPicker()},showMonthPicker:function(animate){var picker,me=this,el=me.el;return me.rendered&&!me.disabled&&(picker=me.createMonthPicker(),picker.setValue(me.getActive()),picker.setSize(el.getSize()),picker.setPosition(-el.getBorderWidth("l"),-el.getBorderWidth("t")),me.shouldAnimate(animate)?me.runAnimation(!1):picker.show()),me},shouldAnimate:function(animate){return Ext.isDefined(animate)?animate:!this.disableAnim},createMonthPicker:function(){var me=this,picker=me.monthPicker;return picker||(me.monthPicker=picker=new Ext.picker.Month({renderTo:me.el,floating:!0,padding:me.padding,shadow:!1,small:!1===me.showToday,listeners:{scope:me,cancelclick:me.onCancelClick,okclick:me.onOkClick,yeardblclick:me.onOkClick,monthdblclick:me.onOkClick}}),me.disableAnim||picker.el.setStyle("display","none"),me.on("beforehide",Ext.Function.bind(me.hideMonthPicker,me,[!1]))),picker},onOkClick:function(picker,value){var me=this,month=value[0],year=value[1],date=new Date(year,month,me.getActive().getDate());date.getMonth()!==month&&(date=Ext.Date.getLastDateOfMonth(new Date(year,month,1))),me.setValue(date),me.hideMonthPicker()},onCancelClick:function(){this.selectedUpdate(this.activeDate),this.hideMonthPicker()},showPrevMonth:function(e){return this.setValue(Ext.Date.add(this.activeDate,Ext.Date.MONTH,-1))},showNextMonth:function(e){return this.setValue(Ext.Date.add(this.activeDate,Ext.Date.MONTH,1))},showPrevYear:function(){return this.setValue(Ext.Date.add(this.activeDate,Ext.Date.YEAR,-1))},showNextYear:function(){return this.setValue(Ext.Date.add(this.activeDate,Ext.Date.YEAR,1))},handleMouseWheel:function(e){if(e.stopEvent(),!this.disabled){var delta=e.getWheelDelta();delta>0?this.showPrevMonth():delta<0&&this.showNextMonth()}},handleDateClick:function(e,t){var me=this,handler=me.handler;e.stopEvent(),me.disabled||!t.dateValue||Ext.fly(t.parentNode).hasCls(me.disabledCellCls)||(me.doCancelFocus=!1===me.focusOnSelect,me.setValue(new Date(t.dateValue)),delete me.doCancelFocus,me.fireEvent("select",me,me.value),handler&&handler.call(me.scope||me,me,me.value),me.onSelect())},onSelect:function(){this.hideOnSelect&&this.hide()},selectToday:function(){var me=this,btn=me.todayBtn,handler=me.handler;return btn&&!btn.disabled&&(me.setValue(Ext.Date.clearTime(new Date)),me.fireEvent("select",me,me.value),handler&&handler.call(me.scope||me,me,me.value),me.onSelect()),me},selectedUpdate:function(date){var c,cell,me=this,t=date.getTime(),cells=me.cells,cls=me.selectedCls,cellItems=cells.elements,cLen=cellItems.length;for(cells.removeCls(cls),c=0;c<cLen;c++)if(cell=Ext.fly(cellItems[c]),cell.dom.firstChild.dateValue==t){me.fireEvent("highlightitem",me,cell),cell.addCls(cls),me.isVisible()&&!me.doCancelFocus&&Ext.fly(cell.dom.firstChild).focus(50);break}},fullUpdate:function(date){var prevStart,current,disableToday,tempDate,setCellClass,html,cls,formatValue,value,me=this,cells=me.cells.elements,textNodes=me.textNodes,disabledCls=me.disabledCellCls,eDate=Ext.Date,i=0,extraDays=0,visible=me.isVisible(),newDate=+eDate.clearTime(date,!0),today=+eDate.clearTime(new Date),min=me.minDate?eDate.clearTime(me.minDate,!0):Number.NEGATIVE_INFINITY,max=me.maxDate?eDate.clearTime(me.maxDate,!0):Number.POSITIVE_INFINITY,ddMatch=me.disabledDatesRE,ddText=me.disabledDatesText,ddays=!!me.disabledDays&&me.disabledDays.join(""),ddaysText=me.disabledDaysText,format=me.format,days=eDate.getDaysInMonth(date),firstOfMonth=eDate.getFirstDateOfMonth(date),startingPos=firstOfMonth.getDay()-me.startDay,previousMonth=eDate.add(date,eDate.MONTH,-1),longDayFormat=me.longDayFormat;for(startingPos<0&&(startingPos+=7),days+=startingPos,prevStart=eDate.getDaysInMonth(previousMonth)-startingPos,current=new Date(previousMonth.getFullYear(),previousMonth.getMonth(),prevStart,me.initHour),me.showToday&&(tempDate=eDate.clearTime(new Date),disableToday=tempDate<min||tempDate>max||ddMatch&&format&&ddMatch.test(eDate.dateFormat(tempDate,format))||ddays&&-1!=ddays.indexOf(tempDate.getDay()),me.disabled||(me.todayBtn.setDisabled(disableToday),me.todayKeyListener.setDisabled(disableToday))),setCellClass=function(cell,cls){value=+eDate.clearTime(current,!0),cell.title=eDate.format(current,longDayFormat),cell.firstChild.dateValue=value,value==today&&(cls+=" "+me.todayCls,cell.title=me.todayText,me.todayElSpan=Ext.DomHelper.append(cell.firstChild,{tag:"span",cls:Ext.baseCSSPrefix+"hide-clip",html:me.todayText},!0)),value==newDate&&(cls+=" "+me.selectedCls,me.fireEvent("highlightitem",me,cell),visible&&me.floating&&Ext.fly(cell.firstChild).focus(50)),value<min?(cls+=" "+disabledCls,cell.title=me.minText):value>max?(cls+=" "+disabledCls,cell.title=me.maxText):ddays&&-1!==ddays.indexOf(current.getDay())?(cell.title=ddaysText,cls+=" "+disabledCls):ddMatch&&format&&(formatValue=eDate.dateFormat(current,format),ddMatch.test(formatValue)&&(cell.title=ddText.replace("%0",formatValue),cls+=" "+disabledCls)),cell.className=cls+" "+me.cellCls};i<me.numDays;++i)i<startingPos?(html=++prevStart,cls=me.prevCls):i>=days?(html=++extraDays,cls=me.nextCls):(html=i-startingPos+1,cls=me.activeCls),textNodes[i].innerHTML=html,current.setDate(current.getDate()+1),setCellClass(cells[i],cls);me.monthBtn.setText(Ext.Date.format(date,me.monthYearFormat))},update:function(date,forceRefresh){var me=this,active=me.activeDate;return me.rendered&&(me.activeDate=date,!forceRefresh&&active&&me.el&&active.getMonth()==date.getMonth()&&active.getFullYear()==date.getFullYear()?me.selectedUpdate(date,active):me.fullUpdate(date,active)),me},beforeDestroy:function(){var me=this;me.rendered&&(Ext.destroy(me.todayKeyListener,me.keyNav,me.monthPicker,me.monthBtn,me.nextRepeater,me.prevRepeater,me.todayBtn),delete me.textNodes,delete me.cells.elements),me.callParent()},onShow:function(){this.callParent(arguments),this.focusOnShow&&this.focus()}});Ext.define("Ext.form.field.Date",{extend:"Ext.form.field.Picker",alias:"widget.datefield",requires:["Ext.picker.Date"],alternateClassName:["Ext.form.DateField","Ext.form.Date"],format:"m/d/Y",altFormats:"m/d/Y|n/j/Y|n/j/y|m/j/y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d|n-j|n/j",disabledDaysText:"Disabled",disabledDatesText:"Disabled",minText:"The date in this field must be equal to or after {0}",maxText:"The date in this field must be equal to or before {0}",invalidText:"{0} is not a valid date - it must be in the format {1}",triggerCls:Ext.baseCSSPrefix+"form-date-trigger",showToday:!0,useStrict:void 0,initTime:"12",initTimeFormat:"H",matchFieldWidth:!1,startDay:0,initComponent:function(){var min,max,me=this,isString=Ext.isString;min=me.minValue,max=me.maxValue,isString(min)&&(me.minValue=me.parseDate(min)),isString(max)&&(me.maxValue=me.parseDate(max)),me.disabledDatesRE=null,me.initDisabledDays(),me.callParent()},initValue:function(){var me=this,value=me.value;Ext.isString(value)&&(me.value=me.rawToValue(value)),me.callParent()},initDisabledDays:function(){if(this.disabledDates){var d,date,dd=this.disabledDates,len=dd.length-1,re="(?:",dLen=dd.length;for(d=0;d<dLen;d++)date=dd[d],re+=Ext.isDate(date)?"^"+Ext.String.escapeRegex(date.dateFormat(this.format))+"$":date,d!==len&&(re+="|");this.disabledDatesRE=new RegExp(re+")")}},setDisabledDates:function(dd){var me=this,picker=me.picker;me.disabledDates=dd,me.initDisabledDays(),picker&&picker.setDisabledDates(me.disabledDatesRE)},setDisabledDays:function(dd){var picker=this.picker;this.disabledDays=dd,picker&&picker.setDisabledDays(dd)},setMinValue:function(dt){var me=this,picker=me.picker,minValue=Ext.isString(dt)?me.parseDate(dt):dt;me.minValue=minValue,picker&&(picker.minText=Ext.String.format(me.minText,me.formatDate(me.minValue)),picker.setMinDate(minValue))},setMaxValue:function(dt){var me=this,picker=me.picker,maxValue=Ext.isString(dt)?me.parseDate(dt):dt;me.maxValue=maxValue,picker&&(picker.maxText=Ext.String.format(me.maxText,me.formatDate(me.maxValue)),picker.setMaxDate(maxValue))},getErrors:function(value){var svalue,fvalue,day,time,me=this,format=Ext.String.format,clearTime=Ext.Date.clearTime,errors=me.callParent(arguments),disabledDays=me.disabledDays,disabledDatesRE=me.disabledDatesRE,minValue=me.minValue,maxValue=me.maxValue,len=disabledDays?disabledDays.length:0,i=0;if(null===(value=me.formatDate(value||me.processRawValue(me.getRawValue())))||value.length<1)return errors;if(svalue=value,!(value=me.parseDate(value)))return errors.push(format(me.invalidText,svalue,Ext.Date.unescapeFormat(me.format))),errors;if(time=value.getTime(),minValue&&time<clearTime(minValue).getTime()&&errors.push(format(me.minText,me.formatDate(minValue))),maxValue&&time>clearTime(maxValue).getTime()&&errors.push(format(me.maxText,me.formatDate(maxValue))),disabledDays)for(day=value.getDay();i<len;i++)if(day===disabledDays[i]){errors.push(me.disabledDaysText);break}return fvalue=me.formatDate(value),disabledDatesRE&&disabledDatesRE.test(fvalue)&&errors.push(format(me.disabledDatesText,fvalue)),errors},rawToValue:function(rawValue){return this.parseDate(rawValue)||rawValue||null},valueToRaw:function(value){return this.formatDate(this.parseDate(value))},safeParse:function(value,format){var parsedDate,me=this,utilDate=Ext.Date,result=null,strict=me.useStrict;return utilDate.formatContainsHourInfo(format)?result=utilDate.parse(value,format,strict):(parsedDate=utilDate.parse(value+" "+me.initTime,format+" "+me.initTimeFormat,strict))&&(result=utilDate.clearTime(parsedDate)),result},getSubmitValue:function(){var format=this.submitFormat||this.format,value=this.getValue();return value?Ext.Date.format(value,format):""},parseDate:function(value){if(!value||Ext.isDate(value))return value;var len,me=this,val=me.safeParse(value,me.format),altFormats=me.altFormats,altFormatsArray=me.altFormatsArray,i=0;if(!val&&altFormats)for(altFormatsArray=altFormatsArray||altFormats.split("|"),len=altFormatsArray.length;i<len&&!val;++i)val=me.safeParse(value,altFormatsArray[i]);return val},formatDate:function(date){return Ext.isDate(date)?Ext.Date.dateFormat(date,this.format):date},createPicker:function(){var me=this,format=Ext.String.format;return new Ext.picker.Date({pickerField:me,ownerCt:me.ownerCt,renderTo:document.body,floating:!0,hidden:!0,focusOnShow:!0,minDate:me.minValue,maxDate:me.maxValue,disabledDatesRE:me.disabledDatesRE,disabledDatesText:me.disabledDatesText,disabledDays:me.disabledDays,disabledDaysText:me.disabledDaysText,format:me.format,showToday:me.showToday,startDay:me.startDay,minText:format(me.minText,me.formatDate(me.minValue)),maxText:format(me.maxText,me.formatDate(me.maxValue)),listeners:{scope:me,select:me.onSelect},keyNavConfig:{esc:function(){me.collapse()}}})},onDownArrow:function(e){this.callParent(arguments),this.isExpanded&&this.getPicker().focus()},onSelect:function(m,d){var me=this;me.setValue(d),me.fireEvent("select",me,d),me.collapse()},onExpand:function(){var value=this.getValue();this.picker.setValue(Ext.isDate(value)?value:new Date)},onCollapse:function(){this.focus(!1,60)},beforeBlur:function(){var me=this,v=me.parseDate(me.getRawValue()),focusTask=me.focusTask;focusTask&&focusTask.cancel(),v&&me.setValue(v)}});Ext.define("Ext.form.field.FileButton",{extend:"Ext.button.Button",alias:"widget.filebutton",childEls:["btnEl","btnWrap","btnInnerEl","btnIconEl","fileInputEl"],inputCls:Ext.baseCSSPrefix+"form-file-input",cls:Ext.baseCSSPrefix+"form-file-btn",preventDefault:!1,renderTpl:['<span id="{id}-btnWrap" role="presentation" class="{baseCls}-wrap','<tpl if="splitCls"> {splitCls}</tpl>','{childElCls}" unselectable="on">','<span id="{id}-btnEl" class="{baseCls}-button" role="button">','<span id="{id}-btnInnerEl" class="{baseCls}-inner {innerCls}','{childElCls}" unselectable="on">',"{text}","</span>",'<span role="presentation" id="{id}-btnIconEl" class="{baseCls}-icon-el {iconCls}','{childElCls} {glyphCls}" unselectable="on" style="','<tpl if="iconUrl">background-image:url({iconUrl});</tpl>','<tpl if="glyph && glyphFontFamily">font-family:{glyphFontFamily};</tpl>">','<tpl if="glyph">&#{glyph};</tpl><tpl if="iconCls || iconUrl">&#160;</tpl>',"</span>","</span>","</span>",'<input id="{id}-fileInputEl" class="{childElCls} {inputCls}" type="file" size="1" name="{inputName}" role="{role}">'],getTemplateArgs:function(){var args=this.callParent();return args.inputCls=this.inputCls,args.inputName=this.inputName,args},afterRender:function(){var me=this;me.callParent(arguments),me.fileInputEl.on("change",me.fireChange,me)},fireChange:function(e){this.fireEvent("change",this,e,this.fileInputEl.dom.value)},createFileInput:function(isTemporary){var me=this;me.fileInputEl=me.el.createChild({name:me.inputName,id:isTemporary?void 0:me.id+"-fileInputEl",cls:me.inputCls,tag:"input",type:"file",size:1}),me.fileInputEl.on("change",me.fireChange,me)},reset:function(remove){remove&&this.fileInputEl.remove(),this.createFileInput(!remove)},restoreInput:function(el){this.fileInputEl.remove(),el=Ext.get(el),this.el.appendChild(el),this.fileInputEl=el},onDisable:function(){this.callParent(),this.fileInputEl.dom.disabled=!0},onEnable:function(){this.callParent(),this.fileInputEl.dom.disabled=!1}});Ext.define("Ext.form.field.File",{extend:"Ext.form.field.Trigger",alias:["widget.filefield","widget.fileuploadfield"],alternateClassName:["Ext.form.FileUploadField","Ext.ux.form.FileUploadField","Ext.form.File"],requires:["Ext.form.field.FileButton"],buttonText:"Browse...",buttonOnly:!1,buttonMargin:3,clearOnSubmit:!0,extraFieldBodyCls:Ext.baseCSSPrefix+"form-file-wrap",readOnly:!0,submitValue:!1,triggerNoEditCls:"",componentLayout:"triggerfield",childEls:["browseButtonWrap"],onRender:function(){var inputEl,me=this,id=me.id;me.callParent(arguments),inputEl=me.inputEl,inputEl.dom.name="",me.button=new Ext.form.field.FileButton(Ext.apply({renderTo:id+"-browseButtonWrap",ownerCt:me,ownerLayout:me.componentLayout,id:id+"-button",ui:me.ui,disabled:me.disabled,text:me.buttonText,style:me.buttonOnly?"":me.getButtonMarginProp()+me.buttonMargin+"px",inputName:me.getName(),listeners:{scope:me,change:me.onFileChange}},me.buttonConfig)),me.fileInputEl=me.button.fileInputEl,me.buttonOnly&&me.inputCell.setDisplayed(!1),me.browseButtonWrap.dom.style.width=me.browseButtonWrap.dom.lastChild.offsetWidth+me.button.getEl().getMargin("lr")+"px",Ext.isIE&&me.button.getEl().repaint()},getTriggerMarkup:function(){return'<td id="'+this.id+'-browseButtonWrap" role="presentation"></td>'},onFileChange:function(button,e,value){this.duringFileSelect=!0,Ext.form.field.File.superclass.setValue.call(this,value),delete this.duringFileSelect},didValueChange:function(){return!!this.duringFileSelect},setValue:Ext.emptyFn,reset:function(){var me=this,clear=me.clearOnSubmit;me.rendered&&(me.button.reset(clear),me.fileInputEl=me.button.fileInputEl,clear&&(me.inputEl.dom.value="",Ext.form.field.File.superclass.setValue.call(this,null))),me.callParent()},onShow:function(){this.callParent(),this.button.updateLayout()},onDisable:function(){this.callParent(),this.button.disable()},onEnable:function(){this.callParent(),this.button.enable()},isFileUpload:function(){return!0},extractFileInput:function(){var fileInput,me=this;return me.rendered?(fileInput=me.button.fileInputEl.dom,me.reset()):(fileInput=document.createElement("input"),fileInput.type="file",fileInput.className=Ext.baseCSSPrefix+"hide-display",fileInput.name=me.getName()),fileInput},restoreInput:function(el){if(this.rendered){var button=this.button;button.restoreInput(el),this.fileInputEl=button.fileInputEl}},onDestroy:function(){Ext.destroyMembers(this,"button"),delete this.fileInputEl,this.callParent()},getButtonMarginProp:function(){return"margin-left:"}});Ext.define("Ext.form.field.Hidden",{extend:"Ext.form.field.Base",alias:["widget.hiddenfield","widget.hidden"],alternateClassName:"Ext.form.Hidden",inputType:"hidden",hideLabel:!0,hidden:!0,ariaRole:"presentation",initComponent:function(){this.formItemCls+="-hidden",this.callParent()},isEqual:function(value1,value2){return this.isEqualAsString(value1,value2)},initEvents:Ext.emptyFn,setSize:Ext.emptyFn,setWidth:Ext.emptyFn,setHeight:Ext.emptyFn,setPosition:Ext.emptyFn,setPagePosition:Ext.emptyFn,markInvalid:Ext.emptyFn,clearInvalid:Ext.emptyFn});Ext.define("Ext.picker.Color",{extend:"Ext.Component",requires:"Ext.XTemplate",alias:"widget.colorpicker",alternateClassName:"Ext.ColorPalette",componentCls:Ext.baseCSSPrefix+"color-picker",selectedCls:Ext.baseCSSPrefix+"color-picker-selected",itemCls:Ext.baseCSSPrefix+"color-picker-item",value:null,clickEvent:"click",allowReselect:!1,colors:["000000","993300","333300","003300","003366","000080","333399","333333","800000","FF6600","808000","008000","008080","0000FF","666699","808080","FF0000","FF9900","99CC00","339966","33CCCC","3366FF","800080","969696","FF00FF","FFCC00","FFFF00","00FF00","00FFFF","00CCFF","993366","C0C0C0","FF99CC","FFCC99","FFFF99","CCFFCC","CCFFFF","99CCFF","CC99FF","FFFFFF"],colorRe:/(?:^|\s)color-(.{6})(?:\s|$)/,renderTpl:['<tpl for="colors">','<a href="#" role="button" class="color-{.} {parent.itemCls}" hidefocus="on">','<span class="{parent.itemCls}-inner" style="background:#{.}">&#160;</span>',"</a>","</tpl>"],initComponent:function(){var me=this;me.callParent(arguments),me.addEvents("select"),me.handler&&me.on("select",me.handler,me.scope,!0)},initRenderData:function(){var me=this;return Ext.apply(me.callParent(),{itemCls:me.itemCls,colors:me.colors})},onRender:function(){var me=this,clickEvent=me.clickEvent;me.callParent(arguments),me.mon(me.el,clickEvent,me.handleClick,me,{delegate:"a"}),"click"!=clickEvent&&me.mon(me.el,"click",Ext.emptyFn,me,{delegate:"a",stopEvent:!0})},afterRender:function(){var value,me=this;me.callParent(arguments),me.value&&(value=me.value,me.value=null,me.select(value,!0))},handleClick:function(event,target){var color,me=this;event.stopEvent(),me.disabled||(color=target.className.match(me.colorRe)[1],me.select(color.toUpperCase()))},select:function(color,suppressEvent){var el,me=this,selectedCls=me.selectedCls,value=me.value;if(color=color.replace("#",""),!me.rendered)return void(me.value=color);(color!=value||me.allowReselect)&&(el=me.el,me.value&&el.down("a.color-"+value).removeCls(selectedCls),el.down("a.color-"+color).addCls(selectedCls),me.value=color,!0!==suppressEvent&&me.fireEvent("select",me,color))},clear:function(){var el,me=this,value=me.value;value&&me.rendered&&(el=me.el.down("a.color-"+value),el.removeCls(me.selectedCls)),me.value=null},getValue:function(){return this.value||null}});Ext.define("Ext.picker.Time",{extend:"Ext.view.BoundList",alias:"widget.timepicker",requires:["Ext.data.Store","Ext.Date"],increment:15,format:"g:i A",displayField:"disp",initDate:[2008,0,1],componentCls:Ext.baseCSSPrefix+"timepicker",loadMask:!1,initComponent:function(){var me=this,dateUtil=Ext.Date,clearTime=dateUtil.clearTime,initDate=me.initDate;me.absMin=clearTime(new Date(initDate[0],initDate[1],initDate[2])),me.absMax=dateUtil.add(clearTime(new Date(initDate[0],initDate[1],initDate[2])),"mi",1439),me.store=me.createStore(),me.store.addFilter(me.rangeFilter=new Ext.util.Filter({id:"time-picker-filter"}),!1),me.updateList(),me.callParent()},setMinValue:function(value){this.minValue=value,this.updateList()},setMaxValue:function(value){this.maxValue=value,this.updateList()},normalizeDate:function(date){var initDate=this.initDate;return date.setFullYear(initDate[0],initDate[1],initDate[2]),date},updateList:function(){var me=this,min=me.normalizeDate(me.minValue||me.absMin),max=me.normalizeDate(me.maxValue||me.absMax);me.rangeFilter.setFilterFn(function(record){var date=record.get("date");return date>=min&&date<=max}),me.store.filter()},createStore:function(){for(var me=this,utilDate=Ext.Date,times=[],min=me.absMin,max=me.absMax;min<=max;)times.push({disp:utilDate.dateFormat(min,me.format),date:min}),min=utilDate.add(min,"mi",me.increment);return new Ext.data.Store({fields:["disp","date"],data:times})},focusNode:function(rec){return!1}});Ext.define("Ext.form.field.Time",{extend:"Ext.form.field.ComboBox",alias:"widget.timefield",requires:["Ext.form.field.Date","Ext.picker.Time","Ext.view.BoundListKeyNav","Ext.Date"],alternateClassName:["Ext.form.TimeField","Ext.form.Time"],triggerCls:Ext.baseCSSPrefix+"form-time-trigger",minText:"The time in this field must be equal to or after {0}",maxText:"The time in this field must be equal to or before {0}",invalidText:"{0} is not a valid time",format:"g:i A",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|ha|gA|h a|g a|g A|gi|hi|gia|hia|g|H|gi a|hi a|giA|hiA|gi A|hi A",increment:15,pickerMaxHeight:300,selectOnTab:!0,snapToIncrement:!1,initDate:"1/1/2008",initDateParts:[2008,0,1],initDateFormat:"j/n/Y",ignoreSelection:0,queryMode:"local",displayField:"disp",valueField:"date",initComponent:function(){var me=this,min=me.minValue,max=me.maxValue;min&&me.setMinValue(min),max&&me.setMaxValue(max),me.displayTpl=new Ext.XTemplate('<tpl for=".">{[typeof values === "string" ? values : this.formatDate(values["'+me.displayField+'"])]}<tpl if="xindex < xcount">'+me.delimiter+"</tpl></tpl>",{formatDate:Ext.Function.bind(me.formatDate,me)}),this.callParent()},transformOriginalValue:function(value){return Ext.isDefined(value)?this.rawToValue(value)||value||null:value},isEqual:function(v1,v2){var i,len,fromArray=Ext.Array.from,isEqual=Ext.Date.isEqual;if(v1=fromArray(v1),v2=fromArray(v2),(len=v1.length)!==v2.length)return!1;for(i=0;i<len;i++)if(!isEqual(v2[i],v1[i]))return!1;return!0},setMinValue:function(value){var me=this,picker=me.picker;me.setLimit(value,!0),picker&&picker.setMinValue(me.minValue)},setMaxValue:function(value){var me=this,picker=me.picker;me.setLimit(value,!1),picker&&picker.setMaxValue(me.maxValue)},setLimit:function(value,isMin){var d,val,me=this;Ext.isString(value)?d=me.parseDate(value):Ext.isDate(value)&&(d=value),d?(val=me.getInitDate(),val.setHours(d.getHours(),d.getMinutes(),d.getSeconds(),d.getMilliseconds())):val=null,me[isMin?"minValue":"maxValue"]=val},getInitDate:function(hours,minutes){var parts=this.initDateParts;return new Date(parts[0],parts[1],parts[2],hours||0,minutes||0,0,0)},valueToRaw:function(value){return this.formatDate(this.parseDate(value))},getErrors:function(value){var i,len,date,item,me=this,format=Ext.String.format,errors=me.callParent(arguments),minValue=me.minValue,maxValue=me.maxValue,data=me.displayTplData,raw=me.getRawValue();if(data&&data.length>0)for(i=0,len=data.length;i<len;i++)item=data[i],item=item.date||item.disp,date=me.parseDate(item),date?(minValue&&date<minValue&&errors.push(format(me.minText,me.formatDate(minValue))),maxValue&&date>maxValue&&errors.push(format(me.maxText,me.formatDate(maxValue)))):errors.push(format(me.invalidText,item,Ext.Date.unescapeFormat(me.format)));else raw.length&&!me.parseDate(raw)&&errors.push(format(me.invalidText,raw,Ext.Date.unescapeFormat(me.format)));return errors},formatDate:function(items){var i,len,formatted=[];for(items=Ext.Array.from(items),i=0,len=items.length;i<len;i++)formatted.push(Ext.form.field.Date.prototype.formatDate.call(this,items[i]));return formatted.join(this.delimiter)},parseDate:function(value){var len,me=this,val=value,altFormats=me.altFormats,altFormatsArray=me.altFormatsArray,i=0;if(value&&!Ext.isDate(value)&&!(val=me.safeParse(value,me.format))&&altFormats)for(altFormatsArray=altFormatsArray||altFormats.split("|"),len=altFormatsArray.length;i<len&&!val;++i)val=me.safeParse(value,altFormatsArray[i]);return val&&me.snapToIncrement&&(val=new Date(Ext.Number.snap(val.getTime(),60*me.increment*1e3))),val},safeParse:function(value,format){var parsedDate,me=this,utilDate=Ext.Date,result=null;return utilDate.formatContainsDateInfo(format)?result=utilDate.parse(value,format):(parsedDate=utilDate.parse(me.initDate+" "+value,me.initDateFormat+" "+format))&&(result=parsedDate),result},getSubmitValue:function(){var me=this,format=me.submitFormat||me.format,value=me.getValue();return value?Ext.Date.format(value,format):null},createPicker:function(){var picker,me=this;return me.listConfig=Ext.apply({xtype:"timepicker",selModel:{mode:me.multiSelect?"SIMPLE":"SINGLE"},cls:void 0,minValue:me.minValue,maxValue:me.maxValue,increment:me.increment,format:me.format,maxHeight:me.pickerMaxHeight},me.listConfig),picker=me.callParent(),me.bindStore(picker.store),picker},onItemClick:function(picker,record){var me=this,selected=picker.getSelectionModel().getSelection();!me.multiSelect&&selected.length&&selected.length>0&&(selected=selected[0])&&Ext.Date.isEqual(record.get("date"),selected.get("date"))&&me.collapse()},syncSelection:function(){var selModel,value,values,i,len,item,data,d,dLen,rec,me=this,picker=me.picker,isEqual=Ext.Date.isEqual,toSelect=[];if(picker){if(picker.clearHighlight(),value=me.getValue(),selModel=picker.getSelectionModel(),me.ignoreSelection++,null===value)selModel.deselectAll();else for(values=Ext.Array.from(value),data=picker.store.data.items,dLen=data.length,i=0,len=values.length;i<len;i++)if(item=values[i],Ext.isDate(item)){for(d=0;d<dLen&&(rec=data[d],!isEqual(rec.get("date"),item)||(toSelect.push(rec),me.multiSelect));d++);selModel.select(toSelect)}me.ignoreSelection--}},postBlur:function(){var me=this,val=me.getValue();me.callParent(arguments),me.validateValue(val)&&me.setValue(val)},findRecordByValue:function(value){return"string"==typeof value&&(value=this.parseDate(value)),this.callParent([value])},rawToValue:function(item){var items,values,i,len,me=this;if(me.multiSelect){for(values=[],items=Ext.Array.from(item),i=0,len=items.length;i<len;i++)values.push(me.parseDate(items[i]));return values}return me.parseDate(item)},setValue:function(v){return this.getPicker(),Ext.isDate(v)&&(v=this.getInitDate(v.getHours(),v.getMinutes())),this.callParent([v])},getValue:function(){return this.rawToValue(this.callParent(arguments))}});Ext.define("Ext.grid.CellContext",{isCellContext:!0,constructor:function(view){this.view=view},isEqual:function(other){return!!other&&(this.record===other.record&&this.columnHeader===other.columnHeader)},setPosition:function(row,col){var me=this;return 1===arguments.length&&(row.view&&(me.view=row.view),col=row.column,row=row.row),me.setRow(row),me.setColumn(col),me},setRow:function(row){var me=this;void 0!==row&&("number"==typeof row?(me.row=Math.max(Math.min(row,me.view.dataSource.getCount()-1),0),me.record=me.view.dataSource.getAt(row)):row.isModel?(me.record=row,me.row=me.view.indexOf(row)):row.tagName&&(me.record=me.view.getRecord(row),me.row=me.view.indexOf(me.record)))},setColumn:function(col){var me=this,mgr=me.view.ownerCt.getColumnManager();void 0!==col&&("number"==typeof col?(me.column=col,me.columnHeader=mgr.getHeaderAtIndex(col)):col.isHeader&&(me.columnHeader=col,me.column=mgr.getHeaderIndex(col)))}});Ext.define("Ext.grid.CellEditor",{extend:"Ext.Editor",constructor:function(config){config=Ext.apply({},config),config.field&&(config.field.monitorTab=!1),this.callParent([config])},onShow:function(){var me=this,innerCell=me.boundEl.first();innerCell&&(me.isForTree&&(innerCell=innerCell.child(me.treeNodeSelector)),innerCell.hide()),me.callParent(arguments)},onHide:function(){var me=this,innerCell=me.boundEl.first();innerCell&&(me.isForTree&&(innerCell=innerCell.child(me.treeNodeSelector)),innerCell.show()),me.callParent(arguments)},afterRender:function(){var me=this,field=me.field;me.callParent(arguments),field.isCheckbox&&field.mon(field.inputEl,{mousedown:me.onCheckBoxMouseDown,click:me.onCheckBoxClick,scope:me})},onCheckBoxMouseDown:function(){this.completeEdit=Ext.emptyFn},onCheckBoxClick:function(){delete this.completeEdit,this.field.focus(!1,10)},realign:function(autoSize){var xOffset,me=this,boundEl=me.boundEl,innerCell=boundEl.first(),innerCellTextNode=innerCell.dom.firstChild,width=boundEl.getWidth(),offsets=Ext.Array.clone(me.offsets),grid=me.grid,v="",isEmpty=!innerCellTextNode||3===innerCellTextNode.nodeType&&!Ext.String.trim(v=innerCellTextNode.data).length;me.isForTree&&(xOffset=me.getTreeNodeOffset(innerCell),width-=Math.abs(xOffset),offsets[0]+=xOffset),grid.columnLines&&(width-=boundEl.getBorderWidth("rl")),!0===autoSize&&me.field.setWidth(width),isEmpty&&(innerCell.dom.innerHTML="X"),me.alignTo(innerCell,me.alignment,offsets),isEmpty&&(innerCell.dom.firstChild.data=v)},getTreeNodeOffset:function(innerCell){return innerCell.child(this.treeNodeSelector).getOffsetsTo(innerCell)[0]},onEditorTab:function(e){var field=this.field;field.onEditorTab&&field.onEditorTab(e)},onFieldBlur:function(){this.callParent(arguments),this.selectSameEditor=!1},alignment:"l-l",hideEl:!1,cls:Ext.baseCSSPrefix+"small-editor "+Ext.baseCSSPrefix+"grid-editor "+Ext.baseCSSPrefix+"grid-cell-editor",treeNodeSelector:"."+Ext.baseCSSPrefix+"tree-node-text",shim:!1,shadow:!1});Ext.define("Ext.grid.ColumnComponentLayout",{extend:"Ext.layout.component.Auto",alias:"layout.columncomponent",type:"columncomponent",setWidthInDom:!0,beginLayout:function(ownerContext){this.callParent(arguments),ownerContext.titleContext=ownerContext.getEl("titleEl"),ownerContext.triggerContext=ownerContext.getEl("triggerEl")},beginLayoutCycle:function(ownerContext){var owner=this.owner;this.callParent(arguments),ownerContext.widthModel.shrinkWrap&&owner.el.setWidth(""),owner.titleEl.setStyle({paddingTop:"",paddingBottom:""})},publishInnerHeight:function(ownerContext,outerHeight){if(outerHeight){var textHeight,titleHeight,pt,pb,me=this,owner=me.owner,innerHeight=outerHeight-ownerContext.getBorderInfo().height,availableHeight=innerHeight;if(!owner.noWrap&&!ownerContext.hasDomProp("width"))return void(me.done=!1);ownerContext.hasRawContent?(titleHeight=availableHeight,(textHeight=owner.textEl.getHeight())&&(availableHeight-=textHeight)>0&&(pt=Math.floor(availableHeight/2),pb=availableHeight-pt,ownerContext.titleContext.setProp("padding-top",pt),ownerContext.titleContext.setProp("padding-bottom",pb))):(titleHeight=owner.titleEl.getHeight(),ownerContext.setProp("innerHeight",innerHeight-titleHeight,!1)),(Ext.isIE6||Ext.isIEQuirks)&&ownerContext.triggerContext&&ownerContext.triggerContext.setHeight(titleHeight)}},measureContentHeight:function(ownerContext){return ownerContext.el.dom.offsetHeight},publishOwnerHeight:function(ownerContext,contentHeight){this.callParent(arguments),(Ext.isIE6||Ext.isIEQuirks)&&ownerContext.triggerContext&&ownerContext.triggerContext.setHeight(contentHeight)},publishInnerWidth:function(ownerContext,outerWidth){ownerContext.hasRawContent||ownerContext.setProp("innerWidth",outerWidth-ownerContext.getBorderInfo().width,!1)},calculateOwnerHeightFromContentHeight:function(ownerContext,contentHeight){var result=this.callParent(arguments);return ownerContext.hasRawContent?result:this.owner.noWrap||ownerContext.hasDomProp("width")?contentHeight+this.owner.titleEl.getHeight()+ownerContext.getBorderInfo().height:null},calculateOwnerWidthFromContentWidth:function(ownerContext,contentWidth){var owner=this.owner,padWidth=ownerContext.getPaddingInfo().width,triggerOffset=this.getTriggerOffset(owner,ownerContext);return(owner.isGroupHeader?contentWidth:Math.max(contentWidth,owner.textEl.getWidth()+ownerContext.titleContext.getPaddingInfo().width))+padWidth+triggerOffset},getTriggerOffset:function(owner,ownerContext){var width=0;return ownerContext.widthModel.shrinkWrap&&!owner.menuDisabled&&0===owner.query(">:not([hidden])").length&&(width=owner.self.triggerElWidth),width}});Ext.define("Ext.grid.ColumnLayout",{extend:"Ext.layout.container.HBox",alias:"layout.gridcolumn",type:"gridcolumn",reserveOffset:!1,firstHeaderCls:Ext.baseCSSPrefix+"column-header-first",lastHeaderCls:Ext.baseCSSPrefix+"column-header-last",initLayout:function(){var me=this;void 0===me.scrollbarWidth&&(me.self.prototype.scrollbarWidth=Ext.getScrollbarSize().width),me.grid=this.owner.up("[scrollerOwner]"),me.callParent()},beginLayout:function(ownerContext){var i,item,me=this,owner=me.owner,grid=me.grid,view=grid.view,items=me.getVisibleItems(),len=items.length,firstCls=me.firstHeaderCls,lastCls=me.lastHeaderCls,removeCls=[firstCls,lastCls];for(grid.lockable&&(view=owner.up("tablepanel")===view.normalGrid?view.normalGrid.getView():null),i=0;i<len;i++)item=items[i],item.removeCls(removeCls),0===i&&item.addCls(firstCls),i===len-1&&item.addCls(lastCls);me.callParent(arguments),!owner.isColumn&&me.scrollbarWidth&&!grid.collapsed&&view&&view.rendered&&(ownerContext.viewTable=view.body.dom)&&(ownerContext.viewContext=ownerContext.context.getCmp(view))},roundFlex:function(width){return Math.floor(width)},calculate:function(ownerContext){this.callParent(arguments),ownerContext.state.parallelDone&&ownerContext.setProp("columnWidthsDone",!0),ownerContext.viewContext&&(ownerContext.state.tableHeight=ownerContext.viewTable.offsetHeight)},completeLayout:function(ownerContext){var me=this,owner=me.owner,state=ownerContext.state;me.callParent(arguments),!ownerContext.flexedItems.length&&!state.flexesCalculated&&owner.forceFit&&me.convertWidthsToFlexes(ownerContext)?(me.cacheFlexes(ownerContext),ownerContext.invalidate({state:{flexesCalculated:!0}})):ownerContext.setProp("columnWidthsDone",!0)},convertWidthsToFlexes:function(ownerContext){var childItems,len,i,childContext,item,me=this,totalWidth=0,calculated=me.sizeModels.calculated;for(childItems=ownerContext.childItems,len=childItems.length,i=0;i<len;i++)childContext=childItems[i],item=childContext.target,totalWidth+=childContext.props.width,item.fixed||!1===item.resizable||(item.flex=ownerContext.childItems[i].flex=childContext.props.width,item.width=null,childContext.widthModel=calculated);return totalWidth!==ownerContext.props.width},getContainerSize:function(ownerContext){var result,viewHeight,me=this,viewContext=ownerContext.viewContext;return me.owner.isColumn?result=me.getColumnContainerSize(ownerContext):(result=me.callParent(arguments),viewContext&&!viewContext.heightModel.shrinkWrap&&viewContext.target.componentLayout.ownerContext&&(viewHeight=viewContext.getProp("height"),isNaN(viewHeight)?me.done=!1:ownerContext.state.tableHeight>viewHeight&&(result.width-=me.scrollbarWidth,ownerContext.state.parallelDone=!1,viewContext.invalidate()))),result},getColumnContainerSize:function(ownerContext){var gotWidth,gotHeight,width,height,padding=ownerContext.paddingContext.getPaddingInfo(),got=0,needed=0;return ownerContext.widthModel.shrinkWrap||(++needed,width=ownerContext.getProp("innerWidth"),(gotWidth="number"==typeof width)&&(++got,(width-=padding.width)<0&&(width=0))),ownerContext.heightModel.shrinkWrap||(++needed,height=ownerContext.getProp("innerHeight"),(gotHeight="number"==typeof height)&&(++got,(height-=padding.height)<0&&(height=0))),{width:width,height:height,needed:needed,got:got,gotAll:got==needed,gotWidth:gotWidth,gotHeight:gotHeight}},publishInnerCtSize:function(ownerContext){var view,me=this,size=ownerContext.state.boxPlan.targetSize,cw=ownerContext.peek("contentWidth");return me.owner.tooNarrow=ownerContext.state.boxPlan.tooNarrow,null==cw||me.owner.isColumn||(size.width=cw,view=me.owner.ownerCt.view,view.scrollFlags.y&&(size.width+=me.scrollbarWidth)),me.callParent(arguments)}});Ext.define("Ext.grid.ColumnManager",{alternateClassName:["Ext.grid.ColumnModel"],columns:null,constructor:function(visibleOnly,headerCt,secondHeaderCt){headerCt.isRootHeader||headerCt.isGroupHeader||Ext.Error.raise("ColumnManager must be passed an instantiated HeaderContainer or group header"),this.headerCt=headerCt,secondHeaderCt&&(headerCt.isRootHeader||headerCt.isGroupHeader||Ext.Error.raise("ColumnManager must be passed an instantiated HeaderContainer or group header"),this.secondHeaderCt=secondHeaderCt),this.visibleOnly=!!visibleOnly},getColumns:function(){return this.columns||this.cacheColumns(),this.columns},getHeaderIndex:function(header){return header.isGroupHeader&&(header=this.getHeaderColumns(header)[0]),Ext.Array.indexOf(this.getColumns(),header)},getHeaderAtIndex:function(index){return this.getColumns()[index]||null},getPreviousSibling:function(header){var index=this.getHeaderIndex(header),col=null;return index>0&&(col=this.getColumns()[index-1]),col},getNextSibling:function(header){var col,index=this.getHeaderIndex(header);return-1!==index&&(col=this.getColumns()[index+1]),col||null},getFirst:function(){var columns=this.getColumns();return columns.length>0?columns[0]:null},getLast:function(){var columns=this.getColumns(),len=columns.length;return len>0?columns[len-1]:null},getHeaderById:function(id){var i,header,columns=this.getColumns(),len=columns.length;for(i=0;i<len;++i)if(header=columns[i],header.getItemId()===id)return header;return null},getVisibleHeaderClosestToIndex:function(index){var result=this.getHeaderAtIndex(index);return result&&result.hidden&&(result=result.next(":not([hidden])")||result.prev(":not([hidden])")),result},cacheColumns:function(){var columns=this.getHeaderColumns(this.headerCt),second=this.secondHeaderCt;second&&(columns=columns.concat(this.getHeaderColumns(second))),this.columns=columns},getHeaderColumns:function(header){var result=this.visibleOnly?header.getVisibleGridColumns():header.getGridColumns();return Ext.Array.clone(result)},invalidate:function(){var root=this.rootColumns;this.columns=null,root&&root.invalidate()},destroy:function(){this.columns=this.rootColumns=null}},function(){this.createAlias("indexOf","getHeaderIndex")});Ext.define("Ext.layout.container.Fit",{extend:"Ext.layout.container.Container",alternateClassName:"Ext.layout.FitLayout",alias:"layout.fit",itemCls:Ext.baseCSSPrefix+"fit-item",targetCls:Ext.baseCSSPrefix+"layout-fit",type:"fit",defaultMargins:{top:0,right:0,bottom:0,left:0},manageMargins:!0,sizePolicies:{0:{readsWidth:1,readsHeight:1,setsWidth:0,setsHeight:0},1:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},2:{readsWidth:1,readsHeight:0,setsWidth:0,setsHeight:1},3:{readsWidth:0,readsHeight:0,setsWidth:1,setsHeight:1}},getItemSizePolicy:function(item,ownerSizeModel){var sizeModel=ownerSizeModel||this.owner.getSizeModel(),mode=(sizeModel.width.shrinkWrap?0:1)|(sizeModel.height.shrinkWrap?0:2);return this.sizePolicies[mode]},beginLayoutCycle:function(ownerContext,firstCycle){var c,childItems,i,item,length,margins,minHeight,minWidth,style,me=this,resetHeight=me.lastHeightModel&&me.lastHeightModel.calculated,resetWidth=me.lastWidthModel&&me.lastWidthModel.calculated,resetSizes=resetWidth||resetHeight,maxChildMinHeight=0,maxChildMinWidth=0;for(me.callParent(arguments),resetSizes&&"TD"!=ownerContext.targetContext.el.dom.tagName.toUpperCase()&&(resetSizes=resetWidth=resetHeight=!1),childItems=ownerContext.childItems,length=childItems.length,i=0;i<length;++i)item=childItems[i],firstCycle&&(c=item.target,minHeight=c.minHeight,((minWidth=c.minWidth)||minHeight)&&(margins=item.marginInfo||item.getMarginInfo(),minHeight+=margins.height,minWidth+=margins.height,maxChildMinHeight<minHeight&&(maxChildMinHeight=minHeight),maxChildMinWidth<minWidth&&(maxChildMinWidth=minWidth))),resetSizes&&(style=item.el.dom.style,resetHeight&&(style.height=""),resetWidth&&(style.width=""));firstCycle&&(ownerContext.maxChildMinHeight=maxChildMinHeight,ownerContext.maxChildMinWidth=maxChildMinWidth),c=ownerContext.target,ownerContext.overflowX=!ownerContext.widthModel.shrinkWrap&&ownerContext.maxChildMinWidth&&c.scrollFlags.x||void 0,ownerContext.overflowY=!ownerContext.heightModel.shrinkWrap&&ownerContext.maxChildMinHeight&&c.scrollFlags.y||void 0},calculate:function(ownerContext){var scrollbars,scrollbarSize,padding,i,contentWidth,contentHeight,me=this,childItems=ownerContext.childItems,length=childItems.length,containerSize=me.getContainerSize(ownerContext),info={length:length,ownerContext:ownerContext,targetSize:containerSize},shrinkWrapWidth=ownerContext.widthModel.shrinkWrap,shrinkWrapHeight=ownerContext.heightModel.shrinkWrap,overflowX=ownerContext.overflowX,overflowY=ownerContext.overflowY;for((overflowX||overflowY)&&(scrollbars=me.getScrollbarsNeeded(overflowX&&containerSize.width,overflowY&&containerSize.height,ownerContext.maxChildMinWidth,ownerContext.maxChildMinHeight))&&(scrollbarSize=Ext.getScrollbarSize(),1&scrollbars&&(containerSize.height-=scrollbarSize.height),2&scrollbars&&(containerSize.width-=scrollbarSize.width)),i=0;i<length;++i)info.index=i,me.fitItem(childItems[i],info);(shrinkWrapHeight||shrinkWrapWidth)&&(padding=ownerContext.targetContext.getPaddingInfo(),shrinkWrapWidth&&(overflowY&&!containerSize.gotHeight?me.done=!1:(contentWidth=info.contentWidth+padding.width,2&scrollbars&&(contentWidth+=scrollbarSize.width),ownerContext.setContentWidth(contentWidth)||(me.done=!1))),shrinkWrapHeight&&(overflowX&&!containerSize.gotWidth?me.done=!1:(contentHeight=info.contentHeight+padding.height,1&scrollbars&&(contentHeight+=scrollbarSize.height),ownerContext.setContentHeight(contentHeight)||(me.done=!1))))},fitItem:function(itemContext,info){var me=this;if(itemContext.invalid)return void(me.done=!1);info.margins=itemContext.getMarginInfo(),info.needed=info.got=0,me.fitItemWidth(itemContext,info),me.fitItemHeight(itemContext,info),info.got!=info.needed&&(me.done=!1)},fitItemWidth:function(itemContext,info){var contentWidth,width;info.ownerContext.widthModel.shrinkWrap?(width=itemContext.getProp("width")+info.margins.width,contentWidth=info.contentWidth,info.contentWidth=void 0===contentWidth?width:Math.max(contentWidth,width)):itemContext.widthModel.calculated&&(++info.needed,info.targetSize.gotWidth&&(++info.got,this.setItemWidth(itemContext,info))),this.positionItemX(itemContext,info)},fitItemHeight:function(itemContext,info){var contentHeight,height;info.ownerContext.heightModel.shrinkWrap?(height=itemContext.getProp("height")+info.margins.height,contentHeight=info.contentHeight,info.contentHeight=void 0===contentHeight?height:Math.max(contentHeight,height)):itemContext.heightModel.calculated&&(++info.needed,info.targetSize.gotHeight&&(++info.got,this.setItemHeight(itemContext,info))),this.positionItemY(itemContext,info)},positionItemX:function(itemContext,info){var margins=info.margins;(info.index||margins.left)&&itemContext.setProp("x",margins.left),margins.width&&itemContext.setProp("margin-right",margins.width)},positionItemY:function(itemContext,info){var margins=info.margins;(info.index||margins.top)&&itemContext.setProp("y",margins.top),margins.height&&itemContext.setProp("margin-bottom",margins.height)},setItemHeight:function(itemContext,info){itemContext.setHeight(info.targetSize.height-info.margins.height)},setItemWidth:function(itemContext,info){itemContext.setWidth(info.targetSize.width-info.margins.width)}});Ext.define("Ext.panel.Table",{extend:"Ext.panel.Panel",alias:"widget.tablepanel",requires:["Ext.layout.container.Fit"],uses:["Ext.selection.RowModel","Ext.selection.CellModel","Ext.selection.CheckboxModel","Ext.grid.plugin.BufferedRenderer","Ext.grid.header.Container","Ext.grid.locking.Lockable"],extraBaseCls:Ext.baseCSSPrefix+"grid",extraBodyCls:Ext.baseCSSPrefix+"grid-body",layout:"fit",hasView:!1,viewType:null,selType:"rowmodel",scroll:!0,deferRowRender:!0,sortableColumns:!0,enableLocking:!1,scrollerOwner:!0,enableColumnMove:!0,sealedColumns:!1,enableColumnResize:!0,rowLines:!0,colLinesCls:Ext.baseCSSPrefix+"grid-with-col-lines",rowLinesCls:Ext.baseCSSPrefix+"grid-with-row-lines",noRowLinesCls:Ext.baseCSSPrefix+"grid-no-row-lines",hiddenHeaderCtCls:Ext.baseCSSPrefix+"grid-header-ct-hidden",hiddenHeaderCls:Ext.baseCSSPrefix+"grid-header-hidden",resizeMarkerCls:Ext.baseCSSPrefix+"grid-resize-marker",emptyCls:Ext.baseCSSPrefix+"grid-empty",initComponent:function(){this.viewType||Ext.Error.raise("You must specify a viewType config."),this.headers&&Ext.Error.raise("The headers config is not supported. Please specify columns instead.");var view,i,len,columns,me=this,headerCtCfg=me.columns||me.colModel,store=me.store=Ext.data.StoreManager.lookup(me.store||"ext-empty-store");if(me.columnLines&&me.addBodyCls(me.colLinesCls),me.addBodyCls(me.rowLines?me.rowLinesCls:me.noRowLinesCls),me.addBodyCls(me.extraBodyCls),headerCtCfg||Ext.Error.raise("A column configuration must be specified"),headerCtCfg.isRootHeader?(me.headerCt=headerCtCfg,me.headerCt.forceFit=!!me.forceFit,me.columnManager=headerCtCfg.columnManager,me.visibleColumnManager=headerCtCfg.visibleColumnManager):me.enableLocking||me.hasLockedColumns(headerCtCfg)?(me.self.mixin("lockable",Ext.grid.locking.Lockable),me.injectLockable()):(Ext.isArray(headerCtCfg)&&(headerCtCfg={items:headerCtCfg}),Ext.apply(headerCtCfg,{grid:me,forceFit:me.forceFit,sortable:me.sortableColumns,enableColumnMove:me.enableColumnMove,enableColumnResize:me.enableColumnResize,sealed:me.sealedColumns}),Ext.isDefined(me.enableColumnHide)&&(headerCtCfg.enableColumnHide=me.enableColumnHide),me.headerCt||(me.headerCt=new Ext.grid.header.Container(headerCtCfg))),me.columns=columns=me.headerCt.getGridColumns(),me.scrollTask=new Ext.util.DelayedTask(me.syncHorizontalScroll,me),me.addEvents("reconfigure","viewready"),me.cls=me.cls||" "+me.extraBaseCls,delete me.autoScroll,!me.hasView){if(store.buffered&&!store.remoteSort)for(i=0,len=columns.length;i<len;i++)columns[i].sortable=!1;me.hideHeaders&&(me.headerCt.height=0,me.headerCt.hiddenHeaders=!0,me.headerCt.addCls(me.hiddenHeaderCtCls),me.addCls(me.hiddenHeaderCls),Ext.isIEQuirks&&(me.headerCt.style={display:"none"})),me.relayHeaderCtEvents(me.headerCt),me.features=me.features||[],Ext.isArray(me.features)||(me.features=[me.features]),me.dockedItems=[].concat(me.dockedItems||[]),me.dockedItems.unshift(me.headerCt),me.viewConfig=me.viewConfig||{},view=me.getView(),me.items=[view],me.hasView=!0,me.hideHeaders||view.on({scroll:{fn:me.onHorizontalScroll,element:"el",scope:me}}),me.bindStore(store,!0),me.mon(view,{viewready:me.onViewReady,refresh:me.onRestoreHorzScroll,scope:me})}me.relayEvents(me.view,["beforeitemmousedown","beforeitemmouseup","beforeitemmouseenter","beforeitemmouseleave","beforeitemclick","beforeitemdblclick","beforeitemcontextmenu","itemmousedown","itemmouseup","itemmouseenter","itemmouseleave","itemclick","itemdblclick","itemcontextmenu","beforecellclick","cellclick","beforecelldblclick","celldblclick","beforecellcontextmenu","cellcontextmenu","beforecellmousedown","cellmousedown","beforecellmouseup","cellmouseup","beforecellkeydown","cellkeydown","beforeitemkeydown","itemkeydown","beforecontainermousedown","beforecontainermouseup","beforecontainermousedown","beforecontainermouseover","beforecontainermouseout","beforecontainerclick","beforecontainerdblclick","beforecontainercontextmenu","beforecontainerkeydown","containermouseup","containermousedown","containermouseover","containermouseout","containerclick","containerdblclick","containercontextmenu","containerkeydown","selectionchange","beforeselect","select","beforedeselect","deselect"]),me.callParent(arguments),me.addStateEvents(["columnresize","columnmove","columnhide","columnshow","sortchange","filterchange","groupchange"]),!me.lockable&&me.headerCt&&me.headerCt.on("afterlayout",me.onRestoreHorzScroll,me)},hasLockedColumns:function(columns){var i,len,column;for(Ext.isObject(columns)&&(columns=columns.items),i=0,len=columns.length;i<len;i++)if(column=columns[i],!column.processed&&column.locked)return!0},relayHeaderCtEvents:function(headerCt){this.relayEvents(headerCt,["columnresize","columnmove","columnhide","columnshow","columnschanged","sortchange","headerclick","headercontextmenu","headertriggerclick"])},getState:function(){var me=this,state=me.callParent(),storeState=me.store.getState();return state=me.addPropertyToState(state,"columns",me.headerCt.getColumnsState()),storeState&&(state.storeState=storeState),state},applyState:function(state){var me=this,sorter=state.sort,storeState=state.storeState,store=me.store,columns=state.columns;delete state.columns,me.callParent(arguments),columns&&me.headerCt.applyColumnsState(columns),sorter?store.remoteSort?store.sort({property:sorter.property,direction:sorter.direction,root:sorter.root},null,!1):store.sort(sorter.property,sorter.direction):storeState&&store.applyState(storeState)},getStore:function(){return this.store},getView:function(){var sm,me=this;return me.view||(sm=me.getSelectionModel(),Ext.widget(Ext.apply({grid:me,deferInitialRefresh:!1!==me.deferRowRender,trackOver:!1!==me.trackMouseOver,scroll:me.scroll,xtype:me.viewType,store:me.store,headerCt:me.headerCt,columnLines:me.columnLines,rowLines:me.rowLines,selModel:sm,features:me.features,panel:me,emptyText:me.emptyText||""},me.viewConfig)),me.view.emptyText&&(me.view.emptyText='<div class="'+me.emptyCls+'">'+me.view.emptyText+"</div>"),me.view.getComponentLayout().headerCt=me.headerCt,me.mon(me.view,{uievent:me.processEvent,scope:me}),sm.view=me.view,me.headerCt.view=me.view),me.view},getColumnManager:function(){return this.columnManager},getVisibleColumnManager:function(){return this.visibleColumnManager},getTopLevelColumnManager:function(){var ownerLock=this.ownerLockable;return ownerLock?ownerLock.getColumnManager():this.getColumnManager()},getTopLevelVisibleColumnManager:function(){var ownerLock=this.ownerLockable;return ownerLock?ownerLock.getVisibleColumnManager():this.getVisibleColumnManager()},setAutoScroll:Ext.emptyFn,processEvent:function(type,view,cell,recordIndex,cellIndex,e,record,row){var header,me=this;if(-1!==cellIndex)return header=me.getColumnManager().getHeaderAtIndex(cellIndex),header.processEvent.apply(header,arguments)},determineScrollbars:function(){Ext.log.warn("Obsolete")},invalidateScroller:function(){Ext.log.warn("Obsolete")},scrollByDeltaY:function(yDelta,animate){this.getView().scrollBy(0,yDelta,animate)},scrollByDeltaX:function(xDelta,animate){this.getView().scrollBy(xDelta,0,animate)},afterCollapse:function(){this.saveScrollPos(),this.callParent(arguments)},afterExpand:function(){this.callParent(arguments),this.restoreScrollPos()},saveScrollPos:Ext.emptyFn,restoreScrollPos:Ext.emptyFn,onHeaderResize:function(){this.delayScroll()},onHeaderMove:function(headerCt,header,colsToMove,fromIdx,toIdx){var me=this;!1===me.optimizedColumnMove?me.view.refresh():me.view.moveColumn(fromIdx,toIdx,colsToMove),me.delayScroll()},onHeaderHide:function(headerCt,header){this.view.refresh(),this.delayScroll()},onHeaderShow:function(headerCt,header){this.view.refresh(),this.delayScroll()},onHeadersChanged:function(headerCt,header){var me=this;me.rendered&&!me.reconfiguring&&(me.view.refresh(),me.delayScroll())},delayScroll:function(){var target=this.getScrollTarget().el;target&&this.scrollTask.delay(10,null,null,[target.dom.scrollLeft])},onViewReady:function(){this.fireEvent("viewready",this)},onRestoreHorzScroll:function(){var left=this.scrollLeftPos;left&&this.syncHorizontalScroll(left,!0)},getScrollerOwner:function(){var rootCmp=this;return this.scrollerOwner||(rootCmp=this.up("[scrollerOwner]")),rootCmp},getLhsMarker:function(){var me=this;return me.lhsMarker||(me.lhsMarker=Ext.DomHelper.append(me.el,{role:"presentation",cls:me.resizeMarkerCls},!0))},getRhsMarker:function(){var me=this;return me.rhsMarker||(me.rhsMarker=Ext.DomHelper.append(me.el,{role:"presentation",cls:me.resizeMarkerCls},!0))},getSelectionModel:function(){var applyMode,mode,type,me=this,selModel=me.selModel;return selModel||(selModel={},applyMode=!0),selModel.events||(type=selModel.selType||me.selType,applyMode=!selModel.mode,selModel=me.selModel=Ext.create("selection."+type,selModel)),me.simpleSelect?mode="SIMPLE":me.multiSelect&&(mode="MULTI"),Ext.applyIf(selModel,{allowDeselect:me.allowDeselect}),mode&&applyMode&&selModel.setSelectionMode(mode),selModel.hasRelaySetup||(me.relayEvents(selModel,["selectionchange","beforeselect","beforedeselect","select","deselect"]),selModel.hasRelaySetup=!0),me.disableSelection&&(selModel.locked=!0),selModel},getScrollTarget:function(){var owner=this.getScrollerOwner(),items=owner.query("tableview");return items[1]||items[0]},onHorizontalScroll:function(event,target){this.syncHorizontalScroll(target.scrollLeft)},syncHorizontalScroll:function(left,setBody){var scrollTarget,me=this;setBody=!0===setBody,me.rendered&&(setBody||left!==me.scrollLeftPos)&&(setBody&&(scrollTarget=me.getScrollTarget(),scrollTarget.el.dom.scrollLeft=left),me.headerCt.el.dom.scrollLeft=left,me.scrollLeftPos=left)},onStoreLoad:Ext.emptyFn,getEditorParent:function(){return this.body},bindStore:function(store,initial){var bufferedRenderer,me=this,view=me.getView(),bufferedStore=store&&store.buffered;me.store=store,bufferedRenderer=me.findPlugin("bufferedrenderer"),bufferedRenderer?(me.verticalScroller=bufferedRenderer,bufferedRenderer.store&&bufferedRenderer.bindStore(store)):bufferedStore&&(me.verticalScroller=bufferedRenderer=me.addPlugin(Ext.apply({ptype:"bufferedrenderer"},me.initialConfig.verticalScroller))),view.store!==store&&view.bindStore(store,!1),me.mon(store,{load:me.onStoreLoad,scope:me}),me.storeRelayers=me.relayEvents(store,["filterchange","groupchange"]),bufferedRenderer&&(me.invalidateScrollerOnRefresh=!1),void 0!==me.invalidateScrollerOnRefresh&&(view.preserveScrollOnRefresh=!me.invalidateScrollerOnRefresh)},unbindStore:function(){var me=this,store=me.store;store&&(me.store=null,me.mun(store,{load:me.onStoreLoad,scope:me}),Ext.destroy(me.storeRelayers))},reconfigure:function(store,columns){var originalDeferinitialRefresh,me=this,view=me.getView(),oldStore=me.store,headerCt=me.headerCt,oldColumns=headerCt?headerCt.items.getRange():me.columns;columns&&(columns=Ext.Array.slice(columns)),me.reconfiguring=!0,me.fireEvent("beforereconfigure",me,store,columns,oldStore,oldColumns),me.lockable?me.reconfigureLockable(store,columns):(Ext.suspendLayouts(),columns&&(delete me.scrollLeftPos,headerCt.removeAll(),headerCt.add(columns)),store&&(store=Ext.StoreManager.lookup(store))!==oldStore?(me.store&&me.unbindStore(),originalDeferinitialRefresh=view.deferInitialRefresh,view.deferInitialRefresh=!1,me.bindStore(store),view.deferInitialRefresh=originalDeferinitialRefresh):me.getView().refresh(),headerCt.setSortState(),Ext.resumeLayouts(!0)),me.fireEvent("reconfigure",me,store,columns,oldStore,oldColumns),delete me.reconfiguring},beforeDestroy:function(){var task=this.scrollTask;task&&(task.cancel(),this.scrollTask=null),this.callParent()},onDestroy:function(){var me=this;me.lockable&&me.destroyLockable(),me.callParent(),me.columns=me.storeRelayers=me.columnManager=me.visibleColumnManager=null},destroy:function(){var me=this;me.callParent(),me.isDestroyed&&(me.view=me.selModel=me.headerCt=null)}});Ext.define("Ext.util.CSS",function(){var CSS,rules=null,doc=document,camelRe=/(-[a-z])/gi,camelFn=function(m,a){return a.charAt(1).toUpperCase()};return{singleton:!0,rules:rules,initialized:!1,constructor:function(){CSS=this},createStyleSheet:function(cssText,id){var ss,head=doc.getElementsByTagName("head")[0],styleEl=doc.createElement("style");if(styleEl.setAttribute("type","text/css"),id&&styleEl.setAttribute("id",id),Ext.isIE)head.appendChild(styleEl),ss=styleEl.styleSheet,ss.cssText=cssText;else{try{styleEl.appendChild(doc.createTextNode(cssText))}catch(e){styleEl.cssText=cssText}head.appendChild(styleEl),ss=styleEl.styleSheet?styleEl.styleSheet:styleEl.sheet||doc.styleSheets[doc.styleSheets.length-1]}return CSS.cacheStyleSheet(ss),ss},removeStyleSheet:function(id){var existing=doc.getElementById(id);existing&&existing.parentNode.removeChild(existing)},swapStyleSheet:function(id,url){var ss;CSS.removeStyleSheet(id),ss=doc.createElement("link"),ss.setAttribute("rel","stylesheet"),ss.setAttribute("type","text/css"),ss.setAttribute("id",id),ss.setAttribute("href",url),doc.getElementsByTagName("head")[0].appendChild(ss)},refreshCache:function(){return CSS.getRules(!0)},cacheStyleSheet:function(ss){rules||(rules=CSS.rules={});try{var rule,j,ssRules=ss.cssRules||ss.rules,i=ssRules.length-1,imports=ss.imports,len=imports?imports.length:0;for(j=0;j<len;++j)CSS.cacheStyleSheet(imports[j]);for(;i>=0;--i)rule=ssRules[i],rule.styleSheet&&CSS.cacheStyleSheet(rule.styleSheet),CSS.cacheRule(rule,ss)}catch(e){}},cacheRule:function(cssRule,styleSheet){if(cssRule.styleSheet)return CSS.cacheStyleSheet(cssRule.styleSheet);var selectorCount,j,selectorText=cssRule.selectorText;if(selectorText)for(selectorText=selectorText.split(","),selectorCount=selectorText.length,j=0;j<selectorCount;j++)rules[Ext.String.trim(selectorText[j]).toLowerCase()]={parentStyleSheet:styleSheet,cssRule:cssRule}},getRules:function(refreshCache){var selector,result={};(null===rules||refreshCache)&&CSS.refreshCache();for(selector in rules)result[selector]=rules[selector].cssRule;return result},refreshCache:function(){var ds=doc.styleSheets,i=0,len=ds.length;for(rules=CSS.rules={};i<len;i++)try{ds[i].disabled||CSS.cacheStyleSheet(ds[i])}catch(e){}},getRule:function(selector,refreshCache,rawCache){var i,result;if(rules&&!refreshCache||CSS.refreshCache(),!Ext.isArray(selector))return result=rules[selector.toLowerCase()],result&&!rawCache&&(result=result.cssRule),result||null;for(i=0;i<selector.length;i++)if(rules[selector[i]])return rawCache?rules[selector[i].toLowerCase()]:rules[selector[i].toLowerCase()].cssRule;return null},createRule:function(styleSheet,selector,cssText){var result,ruleSet=styleSheet.cssRules||styleSheet.rules,index=ruleSet.length;return styleSheet.insertRule?styleSheet.insertRule(selector+"{"+cssText+"}",index):styleSheet.addRule(selector,cssText||" "),CSS.cacheRule(result=ruleSet[index],styleSheet),result},updateRule:function(selector,property,value){var rule,i,styles;if(Ext.isArray(selector)){for(i=0;i<selector.length;i++)if(CSS.updateRule(selector[i],property,value))return!0}else if(rule=CSS.getRule(selector)){if(2==arguments.length){styles=Ext.Element.parseStyles(property);for(property in styles)rule.style[property.replace(camelRe,camelFn)]=styles[property]}else rule.style[property.replace(camelRe,camelFn)]=value;return!0}return!1},deleteRule:function(selector){var styleSheet,index,rule=CSS.getRule(selector,!1,!0);rule&&(styleSheet=rule.parentStyleSheet,index=Ext.Array.indexOf(styleSheet.cssRules||styleSheet.rules,rule.cssRule),styleSheet.deleteRule?styleSheet.deleteRule(index):styleSheet.removeRule(index),delete rules[selector])}}});Ext.define("Ext.view.TableLayout",{extend:"Ext.layout.component.Auto",requires:["Ext.util.CSS"],alias:["layout.tableview"],type:"tableview",beginLayout:function(ownerContext){var me=this,otherSide=me.owner.lockingPartner,owner=me.owner;me.callParent(arguments),otherSide&&(me.lockedGrid=me.owner.up("[lockable]"),me.lockedGrid.needsRowHeightSync=!0,ownerContext.lockingPartner||(ownerContext.lockingPartner=ownerContext.context.getItem(otherSide,otherSide.el),ownerContext.lockingPartner&&!ownerContext.lockingPartner.lockingPartner&&(ownerContext.lockingPartner.lockingPartner=ownerContext))),ownerContext.headerContext=ownerContext.context.getCmp(me.headerCt),me.owner.body.dom&&(ownerContext.bodyContext=ownerContext.getEl(me.owner.body)),Ext.isWebKit&&owner.el.select(owner.getBodySelector()).setStyle("table-layout","auto")},calculate:function(ownerContext){var emptyEl,me=this,lockingPartner=me.lockingPartner,owner=me.owner,contentHeight=0;if(ownerContext.headerContext.hasProp("columnWidthsDone")){if(!me.setColumnWidths(ownerContext))return void(me.done=!1);ownerContext.state.columnWidthsSynced=!0,ownerContext.bodyContext&&(emptyEl=me.owner.el.down("."+owner.ownerCt.emptyCls,!0),emptyEl?contentHeight=emptyEl.offsetHeight:(contentHeight=ownerContext.bodyContext.el.dom.offsetHeight,ownerContext.bodyContext.setHeight(contentHeight,!1)),ownerContext.headerContext.state.boxPlan.tooNarrow&&ownerContext.ownerCtContext.sizeModel.height.shrinkWrap&&(contentHeight+=Ext.getScrollbarSize().height),ownerContext.setProp("contentHeight",contentHeight)),lockingPartner&&!lockingPartner.state.columnWidthsSynced?me.done=!1:me.callParent(arguments)}else me.done=!1},measureContentHeight:function(ownerContext){var lockingPartner=ownerContext.lockingPartner;if(!ownerContext.bodyContext||ownerContext.state.columnWidthsSynced&&(!lockingPartner||lockingPartner.state.columnWidthsSynced))return this.callParent(arguments)},setColumnWidths:function(ownerContext){var column,childContext,colWidth,me=this,owner=me.owner,context=ownerContext.context,columns=me.headerCt.getVisibleGridColumns(),i=0,len=columns.length,tableWidth=0,columnLineWidth=0,isContentBox=!Ext.isBorderBox;for(context&&(context.currentLayout=me),i=0;i<len;i++){if(column=columns[i],childContext=context.getCmp(column),colWidth=childContext.props.width,isNaN(colWidth))return childContext.getProp("width"),!1;tableWidth+=colWidth,isContentBox&&owner.columnLines&&(columnLineWidth||(columnLineWidth=context.getCmp(column).borderInfo.width||1),colWidth-=columnLineWidth),owner.body.select(owner.getColumnSizerSelector(column)).setWidth(colWidth)}return owner.el.select(owner.getBodySelector()).setWidth(tableWidth),!0},finishedLayout:function(){var me=this,owner=me.owner;me.callParent(arguments),Ext.isWebKit&&owner.el.select(owner.getBodySelector()).setStyle("table-layout",""),owner.refreshCounter&&me.lockedGrid&&me.lockedGrid.syncRowHeight&&me.lockedGrid.needsRowHeightSync&&(me.lockedGrid.syncRowHeights(),me.lockedGrid.needsRowHeightSync=!1)}});Ext.define("Ext.view.NodeCache",{constructor:function(view){this.view=view,this.clear(),this.el=new Ext.dom.AbstractElement.Fly},clear:function(removeDom){var i,el,me=this,elements=this.elements;if(removeDom)for(i in elements)el=elements[i],el.parentNode.removeChild(el);me.elements={},me.count=me.startIndex=0,me.endIndex=-1},fill:function(newElements,startIndex){var i,me=this,elements=me.elements={},len=newElements.length;for(startIndex||(startIndex=0),i=0;i<len;i++)elements[startIndex+i]=newElements[i];return me.startIndex=startIndex,me.endIndex=startIndex+len-1,me.count=len,this},insert:function(insertPoint,nodes){var i,me=this,elements=me.elements,nodeCount=nodes.length;if(me.count){if((insertPoint>me.endIndex+1||insertPoint+nodes.length-1<me.startIndex)&&Ext.Error.raise("Discontiguous range would result from inserting "+nodes.length+" nodes at "+insertPoint),insertPoint<me.count)for(i=me.endIndex+nodeCount;i>=insertPoint+nodeCount;i--)elements[i]=elements[i-nodeCount],elements[i].setAttribute("data-recordIndex",i);me.endIndex=me.endIndex+nodeCount}else me.startIndex=insertPoint,me.endIndex=insertPoint+nodeCount-1;for(i=0;i<nodeCount;i++,insertPoint++)elements[insertPoint]=nodes[i],elements[insertPoint].setAttribute("data-recordIndex",insertPoint);me.count+=nodeCount},item:function(index,asDom){var el=this.elements[index],result=null;return el&&(result=asDom?this.elements[index]:this.el.attach(this.elements[index])),result},first:function(asDom){return this.item(this.startIndex,asDom)},last:function(asDom){return this.item(this.endIndex,asDom)},getCount:function(){return this.count},slice:function(start,end){var i,elements=this.elements,result=[];for(end=arguments.length<2?this.endIndex:Math.min(this.endIndex,end-1),i=start||this.startIndex;i<=end;i++)result.push(elements[i]);return result},replaceElement:function(el,replacement,domReplace){var elements=this.elements,index="number"==typeof el?el:this.indexOf(el);return index>-1&&(replacement=Ext.getDom(replacement),domReplace&&(el=elements[index],el.parentNode.insertBefore(replacement,el),Ext.removeNode(el),replacement.setAttribute("data-recordIndex",index)),this.elements[index]=replacement),this},indexOf:function(el){var index,elements=this.elements;for(el=Ext.getDom(el),index=this.startIndex;index<=this.endIndex;index++)if(elements[index]===el)return index;return-1},removeRange:function(start,end,removeDom){var el,i,removeCount,fromPos,me=this,elements=me.elements;for(end=void 0===end?me.count:Math.min(me.endIndex+1,end+1),start||(start=0),removeCount=end-start,i=start,fromPos=end;i<me.endIndex;i++,fromPos++)removeDom&&i<end&&Ext.removeNode(elements[i]),fromPos<=me.endIndex?(el=elements[i]=elements[fromPos],el.setAttribute("data-recordIndex",i)):delete elements[i];me.count-=removeCount,me.endIndex-=removeCount},removeElement:function(keys,removeDom){var inKeys,key,el,deleteCount,index,fromIndex,me=this,elements=me.elements,keyIndex=0;if(Ext.isArray(keys)){for(inKeys=keys,keys=[],deleteCount=inKeys.length,keyIndex=0;keyIndex<deleteCount;keyIndex++)key=inKeys[keyIndex],"number"!=typeof key&&(key=me.indexOf(key)),key>=me.startIndex&&key<=me.endIndex&&(keys[keys.length]=key);Ext.Array.sort(keys),deleteCount=keys.length}else{if(keys<me.startIndex||keys>me.endIndex)return;deleteCount=1,keys=[keys]}for(index=fromIndex=keys[0],keyIndex=0;index<=me.endIndex;index++,fromIndex++)keyIndex<deleteCount&&index===keys[keyIndex]&&(fromIndex++,keyIndex++,removeDom&&Ext.removeNode(elements[index])),fromIndex<=me.endIndex&&fromIndex>=me.startIndex?(el=elements[index]=elements[fromIndex],el.setAttribute("data-recordIndex",index)):delete elements[index];me.endIndex-=deleteCount,me.count-=deleteCount},scroll:function(newRecords,direction,removeCount){var i,el,removeEnd,newNodes,me=this,elements=me.elements,recCount=newRecords.length,nodeContainer=me.view.getNodeContainer(),frag=document.createDocumentFragment();if(-1==direction){for(i=me.endIndex-removeCount+1;i<=me.endIndex;i++)el=elements[i],delete elements[i],el.parentNode.removeChild(el);for(me.endIndex-=removeCount,newNodes=me.view.bufferRender(newRecords,me.startIndex-=recCount),i=0;i<recCount;i++)elements[me.startIndex+i]=newNodes[i],frag.appendChild(newNodes[i]);nodeContainer.insertBefore(frag,nodeContainer.firstChild)}else{for(removeEnd=me.startIndex+removeCount,i=me.startIndex;i<removeEnd;i++)el=elements[i],delete elements[i],el.parentNode.removeChild(el);for(me.startIndex=i,newNodes=me.view.bufferRender(newRecords,me.endIndex+1),i=0;i<recCount;i++)elements[me.endIndex+=1]=newNodes[i],frag.appendChild(newNodes[i]);nodeContainer.appendChild(frag)}me.count=me.endIndex-me.startIndex+1}});Ext.define("Ext.view.Table",{extend:"Ext.view.View",alias:"widget.tableview",requires:["Ext.grid.CellContext","Ext.view.TableLayout","Ext.view.NodeCache","Ext.util.DelayedTask","Ext.util.MixedCollection"],componentLayout:"tableview",baseCls:Ext.baseCSSPrefix+"grid-view",unselectableCls:Ext.baseCSSPrefix+"unselectable",firstCls:Ext.baseCSSPrefix+"grid-cell-first",lastCls:Ext.baseCSSPrefix+"grid-cell-last",headerRowSelector:"tr."+Ext.baseCSSPrefix+"grid-header-row",selectedItemCls:Ext.baseCSSPrefix+"grid-row-selected",beforeSelectedItemCls:Ext.baseCSSPrefix+"grid-row-before-selected",selectedCellCls:Ext.baseCSSPrefix+"grid-cell-selected",focusedItemCls:Ext.baseCSSPrefix+"grid-row-focused",beforeFocusedItemCls:Ext.baseCSSPrefix+"grid-row-before-focused",tableFocusedFirstCls:Ext.baseCSSPrefix+"grid-table-focused-first",tableSelectedFirstCls:Ext.baseCSSPrefix+"grid-table-selected-first",tableOverFirstCls:Ext.baseCSSPrefix+"grid-table-over-first",overItemCls:Ext.baseCSSPrefix+"grid-row-over",beforeOverItemCls:Ext.baseCSSPrefix+"grid-row-before-over",altRowCls:Ext.baseCSSPrefix+"grid-row-alt",dirtyCls:Ext.baseCSSPrefix+"grid-dirty-cell",rowClsRe:new RegExp("(?:^|\\s*)"+Ext.baseCSSPrefix+"grid-row-(first|last|alt)(?:\\s+|$)","g"),cellRe:new RegExp(Ext.baseCSSPrefix+"grid-cell-headerId-([^\\s]+)(?:\\s|$)",""),positionBody:!0,trackOver:!0,getRowClass:null,stripeRows:!0,markDirty:!0,ariaRole:"grid",tpl:"{%values.view.tableTpl.applyOut(values, out)%}",tableTpl:["{%",'var view=values.view,tableCls="'+Ext.baseCSSPrefix+'" + view.id + "-table '+Ext.baseCSSPrefix+'grid-table";',"%}",'<table id="{view.id}-table" class="{[tableCls]}" border="0" cellspacing="0" cellpadding="0" style="{tableStyle}" {ariaTableAttr}>',"{[view.renderColumnSizer(out)]}","{[view.renderTHead(values, out)]}","{[view.renderTFoot(values, out)]}",'<tbody id="{view.id}-body" {ariaTbodyAttr}>',"{%","view.renderRows(values.rows, values.viewStartIndex, out);","%}","</tbody>","</table>",{priority:0}],rowTpl:["{%",'var dataRowCls = values.recordIndex === -1 ? "" : " '+Ext.baseCSSPrefix+'grid-data-row";',"%}",'<tr {[values.rowId ? ("id=\\"" + values.rowId + "\\"") : ""]} ','data-boundView="{view.id}" ','data-recordId="{record.internalId}" ','data-recordIndex="{recordIndex}" ','class="{[values.itemClasses.join(" ")]} {[values.rowClasses.join(" ")]}{[dataRowCls]}" ','{rowAttr:attributes} tabIndex="-1" {ariaRowAttr}>','<tpl for="columns">{%',"parent.view.renderCell(values, parent.record, parent.recordIndex, parent.rowIndex, xindex - 1, out, parent)","%}","</tpl>","</tr>",{priority:0}],cellTpl:['<td class="{tdCls}" {tdAttr} {[Ext.aria ? "id=\\"" + Ext.id() + "\\"" : ""]} {ariaCellAttr}>','<div {unselectableAttr} class="'+Ext.baseCSSPrefix+'grid-cell-inner {innerCls}"','style="text-align:{align};<tpl if="style">{style}</tpl>" {ariaCellInnerAttr}>{value}</div>',"</td>",{priority:0}],refreshSelmodelOnRefresh:!1,tableValues:{},rowValues:{itemClasses:[],rowClasses:[]},cellValues:{classes:[Ext.baseCSSPrefix+"grid-cell "+Ext.baseCSSPrefix+"grid-td"]},renderBuffer:document.createElement("div"),constructor:function(config){config.grid.isTree&&(config.baseCls=Ext.baseCSSPrefix+"tree-view"),this.callParent([config])},initComponent:function(){var me=this,scroll=me.scroll;this.addEvents("beforecellclick","cellclick","beforecelldblclick","celldblclick","beforecellcontextmenu","cellcontextmenu","beforecellmousedown","cellmousedown","beforecellmouseup","cellmouseup","beforecellkeydown","cellkeydown"),me.body=new Ext.dom.Element.Fly,me.body.id=me.id+"gridBody",me.autoScroll=void 0,me.trackOver||(me.overItemCls=null,me.beforeOverItemCls=null),!0===scroll||"both"===scroll?me.autoScroll=!0:"horizontal"===scroll?me.overflowX="auto":"vertical"===scroll&&(me.overflowY="auto"),me.selModel.view=me.headerCt.view=me,me.grid.view=me,me.initFeatures(me.grid),delete me.grid,me.itemSelector=me.getItemSelector(),me.all=new Ext.view.NodeCache(me),me.callParent()},getVisibleColumnManager:function(){var owner=this.ownerCt,lock=owner.ownerLockable;return lock?lock.getVisibleColumnManager():owner.getVisibleColumnManager()},moveColumn:function(fromIdx,toIdx,colsToMove){var i,j,rows,len,tr,cells,tables,me=this,fragment=colsToMove>1?document.createDocumentFragment():void 0,destinationCellIdx=toIdx,colCount=me.getGridColumns().length,lastIndex=colCount-1,doFirstLastClasses=(me.firstCls||me.lastCls)&&(0===toIdx||toIdx==colCount||0===fromIdx||fromIdx==lastIndex);if(me.rendered&&toIdx!==fromIdx){for(rows=me.el.query(me.getDataRowSelector()),toIdx>fromIdx&&fragment&&(destinationCellIdx-=colsToMove),i=0,len=rows.length;i<len;i++){if(tr=rows[i],cells=tr.childNodes,doFirstLastClasses){if(1===cells.length){Ext.fly(cells[0]).addCls(me.firstCls),Ext.fly(cells[0]).addCls(me.lastCls);continue}0===fromIdx?(Ext.fly(cells[0]).removeCls(me.firstCls),Ext.fly(cells[1]).addCls(me.firstCls)):fromIdx===lastIndex&&(Ext.fly(cells[lastIndex]).removeCls(me.lastCls),Ext.fly(cells[lastIndex-1]).addCls(me.lastCls)),0===toIdx?(Ext.fly(cells[0]).removeCls(me.firstCls),Ext.fly(cells[fromIdx]).addCls(me.firstCls)):toIdx===colCount&&(Ext.fly(cells[lastIndex]).removeCls(me.lastCls),Ext.fly(cells[fromIdx]).addCls(me.lastCls))}if(fragment){for(j=0;j<colsToMove;j++)fragment.appendChild(cells[fromIdx]);tr.insertBefore(fragment,cells[destinationCellIdx]||null)}else tr.insertBefore(cells[fromIdx],cells[destinationCellIdx]||null)}for(tables=me.el.query(me.getBodySelector()),i=0,len=tables.length;i<len;i++)if(tr=tables[i],fragment){for(j=0;j<colsToMove;j++)fragment.appendChild(tr.childNodes[fromIdx]);tr.insertBefore(fragment,tr.childNodes[destinationCellIdx]||null)}else tr.insertBefore(tr.childNodes[fromIdx],tr.childNodes[destinationCellIdx]||null)}},scrollToTop:Ext.emptyFn,addElListener:function(eventName,fn,scope){this.mon(this,eventName,fn,scope,{element:"el"})},getGridColumns:function(){return this.ownerCt.getVisibleColumnManager().getColumns()},getHeaderAtIndex:function(index){return this.ownerCt.getVisibleColumnManager().getHeaderAtIndex(index)},getCell:function(record,column){var row=this.getNode(record,!0);return Ext.fly(row).down(column.getCellSelector())},getFeature:function(id){var features=this.featuresMC;if(features)return features.get(id)},findFeature:function(ftype){if(this.features)return Ext.Array.findBy(this.features,function(feature){if(feature.ftype===ftype)return!0})},initFeatures:function(grid){var i,features,feature,len,me=this;for(me.tableTpl=Ext.XTemplate.getTpl(this,"tableTpl"),me.rowTpl=Ext.XTemplate.getTpl(this,"rowTpl"),me.cellTpl=Ext.XTemplate.getTpl(this,"cellTpl"),me.featuresMC=new Ext.util.MixedCollection,features=me.features=me.constructFeatures(),len=features?features.length:0,i=0;i<len;i++)feature=features[i],feature.view=me,feature.grid=grid,me.featuresMC.add(feature),feature.init(grid)},renderTHead:function(values,out){var len,i,headers=values.view.headerFns;if(headers)for(i=0,len=headers.length;i<len;++i)headers[i].call(this,values,out)},addHeaderFn:function(){var headers=this.headerFns;headers||(headers=this.headerFns=[]),headers.push(fn)},renderTFoot:function(values,out){var len,i,footers=values.view.footerFns;if(footers)for(i=0,len=footers.length;i<len;++i)footers[i].call(this,values,out)},addFooterFn:function(fn){var footers=this.footerFns;footers||(footers=this.footerFns=[]),footers.push(fn)},addTableTpl:function(newTpl){return this.addTpl("tableTpl",newTpl)},addRowTpl:function(newTpl){return this.addTpl("rowTpl",newTpl)},addCellTpl:function(newTpl){return this.addTpl("cellTpl",newTpl)},addTpl:function(which,newTpl){var tpl,prevTpl,me=this;for(newTpl=Ext.Object.chain(newTpl),newTpl.isTemplate||(newTpl.applyOut=me.tplApplyOut),tpl=me[which];newTpl.priority<tpl.priority;tpl=tpl.nextTpl)prevTpl=tpl;return prevTpl?prevTpl.nextTpl=newTpl:me[which]=newTpl,newTpl.nextTpl=tpl,newTpl},tplApplyOut:function(values,out){this.before&&!1===this.before(values,out)||(this.nextTpl.applyOut(values,out),this.after&&this.after(values,out))},constructFeatures:function(){var feature,result,len,me=this,features=me.features,i=0;if(features)for(result=[],len=features.length;i<len;i++)feature=features[i],feature.isFeature||(feature=Ext.create("feature."+feature.ftype,feature)),result[i]=feature;return result},beforeRender:function(){var me=this;me.callParent(),me.enableTextSelection||me.protoEl.unselectable()},onViewScroll:function(e,t){this.ignoreScroll||(this.callParent(arguments),this.fireEvent("bodyscroll",e,t))},createRowElement:function(record,index){var me=this,div=me.renderBuffer;return me.tpl.overwrite(div,me.collectData([record],index)),Ext.fly(div).down(me.getNodeContainerSelector(),!0).firstChild},bufferRender:function(records,index){var me=this,div=me.renderBuffer;return me.tpl.overwrite(div,me.collectData(records,index)),Ext.Array.toArray(Ext.fly(div).down(me.getNodeContainerSelector(),!0).childNodes)},collectData:function(records,startIndex){return this.rowValues.view=this,{view:this,rows:records,viewStartIndex:startIndex,tableStyle:this.bufferedRenderer?"position:absolute;top:"+this.bufferedRenderer.bodyTop:""}},collectNodes:function(targetEl){this.all.fill(this.getNodeContainer().childNodes,this.all.startIndex)},refreshSize:function(){var grid,me=this,bodySelector=me.getBodySelector();bodySelector&&me.body.attach(me.el.child(bodySelector,!0)),me.hasLoadingHeight||(grid=me.up("tablepanel"),Ext.suspendLayouts(),me.callParent(),grid.updateLayout(),Ext.resumeLayouts(!0))},statics:{getBoundView:function(node){return Ext.getCmp(node.getAttribute("data-boundView"))}},getRecord:function(node){var recordIndex,me=this;if(!me.store.isDestroyed)return node=me.getNode(node),node?!me.hasActiveGrouping()&&(recordIndex=node.getAttribute("data-recordIndex"))&&(recordIndex=parseInt(recordIndex,10))>-1?me.store.data.getAt(recordIndex):me.store.getByInternalId(node.getAttribute("data-recordId")):void 0},indexOf:function(node){return node=this.getNode(node,!1),node||0===node?this.all.indexOf(node):-1},indexInStore:function(node){if(!(node=node.isCollapsedPlaceholder?this.getNode(node):this.getNode(node,!1))&&0!==node)return-1;var recordIndex=node.getAttribute("data-recordIndex");return recordIndex?parseInt(recordIndex,10):this.dataSource.indexOf(this.getRecord(node))},renderRows:function(rows,viewStartIndex,out){var i,rowValues=this.rowValues,rowCount=rows.length;for(rowValues.view=this,rowValues.columns=this.ownerCt.getVisibleColumnManager().getColumns(),i=0;i<rowCount;i++,viewStartIndex++)rowValues.itemClasses.length=rowValues.rowClasses.length=0,this.renderRow(rows[i],viewStartIndex,out);rowValues.view=rowValues.columns=rowValues.record=null},renderColumnSizer:function(out){var i,column,width,columns=this.getGridColumns(),len=columns.length;for(i=0;i<len;i++)column=columns[i],width=column.hidden?0:column.lastBox?column.lastBox.width:Ext.grid.header.Container.prototype.defaultWidth,out.push('<colgroup role="presentation"><col role="presentation" class="',columns[i].getCellId(),'" style="width:'+width+'px"></colgroup>')},renderRow:function(record,rowIdx,out){var cls,me=this,isMetadataRecord=-1===rowIdx,selModel=me.selModel,rowValues=me.rowValues,itemClasses=rowValues.itemClasses,rowClasses=rowValues.rowClasses,rowTpl=me.rowTpl;if(rowValues.record=record,rowValues.recordId=record.internalId,rowValues.recordIndex=me.store.indexOf(record),rowValues.rowIndex=rowIdx,rowValues.rowId=me.getRowId(record),rowValues.itemCls=rowValues.rowCls="",rowValues.columns||(rowValues.columns=me.ownerCt.getVisibleColumnManager().getColumns()),itemClasses.length=rowClasses.length=0,isMetadataRecord||(itemClasses[0]=Ext.baseCSSPrefix+"grid-row",!me.ownerCt.disableSelection&&selModel.isRowSelected&&(selModel.isRowSelected(record)&&itemClasses.push(me.selectedItemCls),me.rowValues.recordIndex<me.store.getTotalCount()-1&&selModel.isRowSelected(me.rowValues.recordIndex+1)&&!me.isRowStyleFirst(rowIdx+1)&&rowClasses.push(me.beforeSelectedItemCls)),me.stripeRows&&rowIdx%2!=0&&rowClasses.push(me.altRowCls),me.getRowClass&&(cls=me.getRowClass(record,rowIdx,null,me.dataSource))&&rowClasses.push(cls)),!out)return rowTpl.apply(rowValues);rowTpl.applyOut(rowValues,out)},renderCell:function(column,record,recordIndex,rowIndex,columnIndex,out){var fullIndex,value,clsInsertPoint,me=this,selModel=me.selModel,cellValues=me.cellValues,classes=cellValues.classes,fieldValue=record.data[column.dataIndex],cellTpl=me.cellTpl;cellValues.record=record,cellValues.column=column,cellValues.recordIndex=recordIndex,cellValues.rowIndex=rowIndex,cellValues.columnIndex=columnIndex,cellValues.cellIndex=columnIndex,cellValues.align=column.align,cellValues.tdCls=column.tdCls,cellValues.innerCls=column.innerCls,cellValues.style=cellValues.tdAttr="",cellValues.unselectableAttr=me.enableTextSelection?"":'unselectable="on"',column.renderer&&column.renderer.call?(fullIndex=me.ownerCt.columnManager.getHeaderIndex(column),value=column.renderer.call(column.scope||me.ownerCt,fieldValue,cellValues,record,recordIndex,fullIndex,me.dataSource,me),cellValues.css&&(record.cssWarning=!0,cellValues.tdCls+=" "+cellValues.css,delete cellValues.css)):value=fieldValue,cellValues.value=null==value||""===value?"&#160;":value,classes[1]=column.getCellId(),clsInsertPoint=2,column.tdCls&&(classes[clsInsertPoint++]=column.tdCls),me.markDirty&&record.isModified(column.dataIndex)&&(classes[clsInsertPoint++]=me.dirtyCls),column.isFirstVisible&&(classes[clsInsertPoint++]=me.firstCls),column.isLastVisible&&(classes[clsInsertPoint++]=me.lastCls),me.enableTextSelection||(classes[clsInsertPoint++]=me.unselectableCls),cellValues.tdCls&&(classes[clsInsertPoint++]=cellValues.tdCls),selModel&&selModel.isCellModel&&selModel.isCellSelected(me,recordIndex,columnIndex)&&(classes[clsInsertPoint++]=me.selectedCellCls),classes.length=clsInsertPoint,cellValues.tdCls=classes.join(" "),cellTpl.applyOut(cellValues,out),cellValues.column=null},getNode:function(nodeInfo,dataRow){var fly,result=this.callParent(arguments);if(result&&result.tagName)if(dataRow){if(!(fly=Ext.fly(result)).is(this.dataRowSelector))return fly.down(this.dataRowSelector,!0)}else if(!1===dataRow&&!(fly=Ext.fly(result)).is(this.itemSelector))return fly.up(this.itemSelector,null,!0);return result},getRowId:function(record){return this.id+"-record-"+record.internalId},constructRowId:function(internalId){return this.id+"-record-"+internalId},getNodeById:function(id,dataRow){return id=this.constructRowId(id),this.retrieveNode(id,dataRow)},getNodeByRecord:function(record,dataRow){var id=this.getRowId(record);return this.retrieveNode(id,dataRow)},retrieveNode:function(id,dataRow){var fly,result=this.el.getById(id,!0),itemSelector=this.itemSelector;return!1===dataRow&&result&&!(fly=Ext.fly(result)).is(itemSelector)?fly.up(itemSelector,null,!0):result},updateIndexes:Ext.emptyFn,bodySelector:"table",nodeContainerSelector:"tbody",itemSelector:"tr."+Ext.baseCSSPrefix+"grid-row",dataRowSelector:"tr."+Ext.baseCSSPrefix+"grid-data-row",cellSelector:"td."+Ext.baseCSSPrefix+"grid-cell",sizerSelector:"col."+Ext.baseCSSPrefix+"grid-cell-headerId",innerSelector:"div."+Ext.baseCSSPrefix+"grid-cell-inner",getNodeContainer:function(){return this.el.down(this.nodeContainerSelector,!0)},getBodySelector:function(){return this.bodySelector+"."+Ext.baseCSSPrefix+this.id+"-table"},getNodeContainerSelector:function(){return this.nodeContainerSelector},getColumnSizerSelector:function(header){return this.sizerSelector+"-"+header.getItemId()},getItemSelector:function(){return this.itemSelector},getDataRowSelector:function(){return this.dataRowSelector},getCellSelector:function(header){return header?header.getCellSelector():this.cellSelector},getCellInnerSelector:function(header){return this.getCellSelector(header)+" "+this.innerSelector},addRowCls:function(rowInfo,cls){var row=this.getNode(rowInfo,!1);row&&Ext.fly(row).addCls(cls)},removeRowCls:function(rowInfo,cls){var row=this.getNode(rowInfo,!1);row&&Ext.fly(row).removeCls(cls)},setHighlightedItem:function(item){var me=this,highlighted=me.highlightedItem;highlighted&&me.el.isAncestor(highlighted)&&me.isRowStyleFirst(highlighted)&&me.toggleRowTableCls(highlighted,me.tableOverFirstCls,!1),item=me.getNode(item,!1),item&&me.isRowStyleFirst(item)&&me.toggleRowTableCls(item,me.tableOverFirstCls,!0),me.callParent(arguments)},onRowSelect:function(rowIdx){var me=this,beforeSelectedItemCls=me.beforeSelectedItemCls;me.addRowCls(rowIdx,me.selectedItemCls),me.isRowStyleFirst(rowIdx)?(me.toggleRowTableCls(rowIdx,me.tableSelectedFirstCls,!0),rowIdx>0&&me.removeRowCls(rowIdx-1,beforeSelectedItemCls)):me.addRowCls(rowIdx-1,beforeSelectedItemCls)},onRowDeselect:function(rowIdx){var me=this;me.removeRowCls(rowIdx,[me.selectedItemCls,me.focusedItemCls]),me.isRowStyleFirst(rowIdx)?me.toggleRowTableCls(rowIdx,[me.tableFocusedFirstCls,me.tableSelectedFirstCls],!1):me.removeRowCls(rowIdx-1,[me.beforeFocusedItemCls,me.beforeSelectedItemCls])},onCellSelect:function(position){var cell=this.getCellByPosition(position);cell&&cell.addCls(this.selectedCellCls)},onCellDeselect:function(position){var cell=this.getCellByPosition(position,!0);cell&&Ext.fly(cell).removeCls(this.selectedCellCls)},getCellByPosition:function(position,returnDom){if(position){var row=this.getNode(position.row,!0),header=this.ownerCt.getColumnManager().getHeaderAtIndex(position.column);if(header&&row)return Ext.fly(row).down(this.getCellSelector(header),returnDom)}return!1},getFocusEl:function(){return this.focusEl},onRowFocus:function(rowIdx,highlight,supressFocus){var me=this;highlight?(me.addRowCls(rowIdx,me.focusedItemCls),me.isRowStyleFirst(rowIdx)?me.toggleRowTableCls(rowIdx,me.tableFocusedFirstCls,!0):me.addRowCls(rowIdx-1,me.beforeFocusedItemCls),supressFocus||me.focusRow(rowIdx)):(me.removeRowCls(rowIdx,me.focusedItemCls),me.isRowStyleFirst(rowIdx)?me.toggleRowTableCls(rowIdx,me.tableFocusedFirstCls,!1):me.removeRowCls(rowIdx-1,me.beforeFocusedItemCls)),!Ext.isIE6&&!Ext.isIE7||me.ownerCt.rowLines||me.repaintRow(rowIdx)},focusRow:function(row,delay){var record,me=this,focusTask=me.getFocusTask();if(delay)return void focusTask.delay(Ext.isNumber(delay)?delay:10,me.focusRow,me,[row,!1]);focusTask.cancel(),me.isVisible(!0)&&(row=me.getNode(row,!0))&&(me.scrollRowIntoView(row),record=me.getRecord(row),me.selModel.setLastFocused(record),me.doFocus(row),me.fireEvent("rowfocus",record,row,me.indexInStore(row)))},scrollRowIntoView:function(row){(row=this.getNode(row,!0))&&Ext.fly(row).scrollIntoView(this.el,!1)},focusCell:function(position,delay){var cell,me=this,focusTask=me.getFocusTask();if(delay)return void focusTask.delay(Ext.isNumber(delay)?delay:10,me.focusCell,me,[position,!1]);focusTask.cancel(),me.isVisible(!0)&&(cell=me.getCellByPosition(position))&&(me.scrollCellIntoView(cell),me.doFocus(me.getNode(position.row)),me.fireEvent("cellfocus",position.record,cell,position))},doFocus:function(rowDom){var scrollLeft,me=this,saveScroll=Ext.isIE;saveScroll&&(scrollLeft=me.el.getScrollLeft(),me.ignoreScroll=!0),(me.focusEl=Ext.get(rowDom)).focus(),saveScroll&&(me.el.setScrollLeft(scrollLeft),me.ignoreScroll=!1)},scrollCellIntoView:function(cell){null!=cell.row&&null!=cell.column&&(cell=this.getCellByPosition(cell)),cell&&Ext.fly(cell).scrollIntoView(this.el,!0)},scrollByDelta:function(delta,dir){dir=dir||"scrollTop";var elDom=this.el.dom;elDom[dir]=elDom[dir]+=delta},isDataRow:function(row){return Ext.fly(row).hasCls(Ext.baseCSSPrefix+"grid-data-row")},syncRowHeights:function(firstRow,secondRow){firstRow=Ext.get(firstRow),secondRow=Ext.get(secondRow),firstRow.dom.style.height=secondRow.dom.style.height="";var me=this,rowTpl=me.rowTpl,firstRowHeight=firstRow.dom.offsetHeight,secondRowHeight=secondRow.dom.offsetHeight;if(firstRowHeight!==secondRowHeight){for(;rowTpl&&(!rowTpl.syncRowHeights||!1!==rowTpl.syncRowHeights(firstRow,secondRow));)rowTpl=rowTpl.nextTpl;firstRowHeight=firstRow.dom.offsetHeight,secondRowHeight=secondRow.dom.offsetHeight,firstRowHeight!==secondRowHeight&&(firstRow=firstRow.down("[data-recordId]")||firstRow,secondRow=secondRow.down("[data-recordId]")||secondRow,firstRow&&secondRow&&(firstRow.dom.style.height=secondRow.dom.style.height="",firstRowHeight=firstRow.dom.offsetHeight,secondRowHeight=secondRow.dom.offsetHeight,firstRowHeight>secondRowHeight?(firstRow.setHeight(firstRowHeight),secondRow.setHeight(firstRowHeight)):secondRowHeight>firstRowHeight&&(firstRow.setHeight(secondRowHeight),secondRow.setHeight(secondRowHeight))))}},onIdChanged:function(store,rec,oldId,newId,oldInternalId){var rowDom,me=this;me.viewReady&&(rowDom=me.getNodeById(oldInternalId))&&(rowDom.setAttribute("data-recordId",rec.internalId),rowDom.id=me.getRowId(rec))},onUpdate:function(store,record,operation,changedFieldNames){var index,oldRow,oldRowDom,oldDataRow,newRowDom,newAttrs,attLen,attName,attrIndex,overItemCls,beforeOverItemCls,focusedItemCls,beforeFocusedItemCls,selectedItemCls,beforeSelectedItemCls,columns,me=this,rowTpl=me.rowTpl;if(me.viewReady&&(oldRowDom=me.getNodeByRecord(record,!1))){if(overItemCls=me.overItemCls,beforeOverItemCls=me.beforeOverItemCls,focusedItemCls=me.focusedItemCls,beforeFocusedItemCls=me.beforeFocusedItemCls,selectedItemCls=me.selectedItemCls,beforeSelectedItemCls=me.beforeSelectedItemCls,index=me.indexInStore(record),oldRow=Ext.fly(oldRowDom,"_internal"),newRowDom=me.createRowElement(record,index),oldRow.hasCls(overItemCls)&&Ext.fly(newRowDom).addCls(overItemCls),oldRow.hasCls(beforeOverItemCls)&&Ext.fly(newRowDom).addCls(beforeOverItemCls),oldRow.hasCls(focusedItemCls)&&Ext.fly(newRowDom).addCls(focusedItemCls),oldRow.hasCls(beforeFocusedItemCls)&&Ext.fly(newRowDom).addCls(beforeFocusedItemCls),oldRow.hasCls(selectedItemCls)&&Ext.fly(newRowDom).addCls(selectedItemCls),oldRow.hasCls(beforeSelectedItemCls)&&Ext.fly(newRowDom).addCls(beforeSelectedItemCls),columns=me.ownerCt.getVisibleColumnManager().getColumns(),Ext.isIE9m&&oldRowDom.mergeAttributes)oldRowDom.mergeAttributes(newRowDom,!0);else for(newAttrs=newRowDom.attributes,attLen=newAttrs.length,attrIndex=0;attrIndex<attLen;attrIndex++)"id"!==(attName=newAttrs[attrIndex].name)&&oldRowDom.setAttribute(attName,newAttrs[attrIndex].value);for(columns.length&&(oldDataRow=me.getNode(oldRowDom,!0))&&me.updateColumns(record,oldDataRow,me.getNode(newRowDom,!0),columns,changedFieldNames);rowTpl&&(!rowTpl.syncContent||!1!==rowTpl.syncContent(oldRowDom,newRowDom));)rowTpl=rowTpl.nextTpl;me.fireEvent("itemupdate",record,index,oldRowDom),me.refreshSize()}},updateColumns:function(record,oldRowDom,newRowDom,columns,changedFieldNames){var newAttrs,attLen,attName,attrIndex,colIndex,column,oldCell,newCell,row,me=this,colCount=columns.length,editingPlugin=me.editingPlugin||me.lockingPartner&&me.ownerCt.ownerLockable.view.editingPlugin,isEditing=editingPlugin&&editingPlugin.editing,cellSelector=me.getCellSelector();if(oldRowDom.mergeAttributes)oldRowDom.mergeAttributes(newRowDom,!0);else for(newAttrs=newRowDom.attributes,attLen=newAttrs.length,attrIndex=0;attrIndex<attLen;attrIndex++)"id"!==(attName=newAttrs[attrIndex].name)&&oldRowDom.setAttribute(attName,newAttrs[attrIndex].value);for(colIndex=0;colIndex<colCount;colIndex++)column=columns[colIndex],me.shouldUpdateCell(record,column,changedFieldNames)&&(cellSelector=me.getCellSelector(column),oldCell=Ext.DomQuery.selectNode(cellSelector,oldRowDom),newCell=Ext.DomQuery.selectNode(cellSelector,newRowDom),isEditing?Ext.fly(oldCell).syncContent(newCell):(row=oldCell.parentNode,row.insertBefore(newCell,oldCell),row.removeChild(oldCell)))},shouldUpdateCell:function(record,column,changedFieldNames){if(column.hasCustomRenderer||!changedFieldNames)return!0;if(changedFieldNames){var i,field,len=changedFieldNames.length;for(i=0;i<len;++i)if((field=changedFieldNames[i])===column.dataIndex||field===record.idProperty)return!0}return!1},refresh:function(){var me=this;me.callParent(arguments),me.headerCt.setSortState(),me.el&&!me.all.getCount()&&me.headerCt&&me.headerCt.tooNarrow&&me.el.createChild({role:"presentation",style:"position:absolute;height:1px;width:1px;left:"+(me.headerCt.getFullWidth()-1)+"px"}),me.refreshSelection()},refreshSelection:function(){var selected,len,i,me=this,selModel=me.selModel;if(selModel.isRowModel)for(selected=selModel.selected.items,len=selected.length,i=0;i<len;i++)me.onRowSelect(me.indexOf(me.getNode(selected[i])));me.selModel.onLastFocusChanged(null,me.selModel.lastFocused,!0)},processItemEvent:function(record,row,rowIndex,e){if(-1!==this.indexInStore(row)){var cellIndex,i,feature,header,me=this,cell=e.getTarget(me.getCellSelector(),row),map=me.statics().EventMap,selModel=me.getSelectionModel(),type=e.type,features=me.features,len=features.length;if("keydown"==type&&!cell&&selModel.getCurrentPosition&&(cell=me.getCellByPosition(selModel.getCurrentPosition(),!0)),cell){if(!cell.parentNode)return!1;header=me.getHeaderByCell(cell),cellIndex=me.ownerCt.getColumnManager().getHeaderIndex(header)}else cellIndex=-1;if((!1===me.fireEvent("uievent",type,me,cell,rowIndex,cellIndex,e,record,row)||!1===me.callParent(arguments))&&selModel.onVetoUIEvent)return selModel.onVetoUIEvent(type,me,cell,rowIndex,cellIndex,e,record,row),!1;for(i=0;i<len;++i)if(feature=features[i],feature.wrapsItem&&!1===feature.vetoEvent(record,row,rowIndex,e))return me.processSpecialEvent(e),!1;return"mouseover"==type||"mouseout"==type||(!cell||!(!1===me["onBeforeCell"+map[type]](cell,cellIndex,record,row,rowIndex,e)||!1===me.fireEvent("beforecell"+type,me,cell,cellIndex,record,row,rowIndex,e)||!1===me["onCell"+map[type]](cell,cellIndex,record,row,rowIndex,e)||!1===me.fireEvent("cell"+type,me,cell,cellIndex,record,row,rowIndex,e)))}return this.processSpecialEvent(e),!1},processSpecialEvent:function(e){var i,feature,prefix,featureTarget,beforeArgs,args,me=this,features=me.features,ln=features.length,type=e.type,panel=me.ownerCt;if(me.callParent(arguments),"mouseover"!=type&&"mouseout"!=type){for(i=0;i<ln;i++)if(feature=features[i],feature.hasFeatureEvent&&(featureTarget=e.getTarget(feature.eventSelector,me.getTargetEl()))&&(prefix=feature.eventPrefix,beforeArgs=feature.getFireEventArgs("before"+prefix+type,me,featureTarget,e),args=feature.getFireEventArgs(prefix+type,me,featureTarget,e),!1===me.fireEvent.apply(me,beforeArgs)||!1===panel.fireEvent.apply(panel,beforeArgs)||!1===me.fireEvent.apply(me,args)||!1===panel.fireEvent.apply(panel,args)))return!1;return!0}},onCellMouseDown:Ext.emptyFn,onCellMouseUp:Ext.emptyFn,onCellClick:Ext.emptyFn,onCellDblClick:Ext.emptyFn,onCellContextMenu:Ext.emptyFn,onCellKeyDown:Ext.emptyFn,onBeforeCellMouseDown:Ext.emptyFn,onBeforeCellMouseUp:Ext.emptyFn,onBeforeCellClick:Ext.emptyFn,onBeforeCellDblClick:Ext.emptyFn,onBeforeCellContextMenu:Ext.emptyFn,onBeforeCellKeyDown:Ext.emptyFn,expandToFit:function(header){this.autoSizeColumn(header)},autoSizeColumn:function(header){if(Ext.isNumber(header)&&(header=this.getGridColumns[header]),header){if(header.isGroupHeader)return void header.autoSize();delete header.flex,header.setWidth(this.getMaxContentWidth(header))}},getMaxContentWidth:function(header){var maxWidth,me=this,cells=me.el.query(header.getCellInnerSelector()),originalWidth=header.getWidth(),i=0,ln=cells.length,columnSizer=me.body.select(me.getColumnSizerSelector(header)),max=Math.max,widthAdjust=0;for(ln>0&&(Ext.supports.ScrollWidthInlinePaddingBug&&(widthAdjust+=me.getCellPaddingAfter(cells[0])),me.columnLines&&(widthAdjust+=Ext.fly(cells[0].parentNode).getBorderWidth("lr"))),columnSizer.setWidth(1),header.titleEl.setStyle("text-overflow","clip"),maxWidth=header.textEl.dom.offsetWidth+header.titleEl.getPadding("lr"),header.titleEl.setStyle("text-overflow","");i<ln;i++)maxWidth=max(maxWidth,cells[i].scrollWidth);return maxWidth+=widthAdjust,maxWidth=max(maxWidth,40),columnSizer.setWidth(originalWidth),maxWidth},getPositionByEvent:function(e){var me=this,cellNode=e.getTarget(me.cellSelector),rowNode=e.getTarget(me.itemSelector),record=me.getRecord(rowNode),header=me.getHeaderByCell(cellNode);return me.getPosition(record,header)},getHeaderByCell:function(cell){if(cell){var match=cell.className.match(this.cellRe);if(match&&match[1])return this.ownerCt.getVisibleColumnManager().getHeaderById(match[1])}return!1},walkCells:function(pos,direction,e,preventWrap,verifierFn,scope){if(!pos)return!1;var me=this,row=pos.row,column=pos.column,rowCount=me.dataSource.getCount(),allCols=me.ownerCt.getColumnManager(),visible=me.ownerCt.getVisibleColumnManager(),firstIndex=allCols.getHeaderIndex(visible.getFirst()),lastIndex=allCols.getHeaderIndex(visible.getLast()),newRow=row,newColumn=column,activeHeader=allCols.getHeaderAtIndex(column);if(!activeHeader||activeHeader.hidden||!rowCount)return!1;switch(e=e||{},direction=direction.toLowerCase()){case"right":if(column===lastIndex){if(preventWrap||row===rowCount-1)return!1;e.ctrlKey||(newRow=me.walkRows(row,1))!==row&&(newColumn=firstIndex)}else newColumn=e.ctrlKey?lastIndex:allCols.getHeaderIndex(visible.getNextSibling(activeHeader));break;case"left":if(column===firstIndex){if(preventWrap||0===row)return!1;e.ctrlKey||(newRow=me.walkRows(row,-1))!==row&&(newColumn=lastIndex)}else newColumn=e.ctrlKey?firstIndex:allCols.getHeaderIndex(visible.getPreviousSibling(activeHeader));break;case"up":if(0===row)return!1;newRow=e.ctrlKey?me.walkRows(-1,1):me.walkRows(row,-1);break;case"down":if(row===rowCount-1)return!1;newRow=e.ctrlKey?me.walkRows(rowCount,-1):me.walkRows(row,1)}return(!verifierFn||!0===verifierFn.call(scope||me,{row:newRow,column:newColumn}))&&(newColumn=allCols.getHeaderAtIndex(newColumn),new Ext.grid.CellContext(me).setPosition(newRow,newColumn))},walkRows:function(startRow,distance){var node,me=this,moved=0,lastValid=startRow,last=(me.dataSource.buffered?me.dataSource.getTotalCount():me.dataSource.getCount())-1,limit=distance<0?0:last,increment=limit?1:-1,result=startRow;do{if(limit?result>=limit:result<=0)return lastValid||limit;result+=increment,(node=Ext.fly(me.getNode(result,!0)))&&node.isVisible(!0)&&(moved+=increment,lastValid=result)}while(moved!==distance);return result},walkRecs:function(startRec,distance){var node,rec,me=this,moved=0,lastValid=startRec,last=(me.store.buffered?me.store.getTotalCount():me.store.getCount())-1,limit=distance<0?0:last,increment=limit?1:-1,testIndex=me.store.indexOf(startRec);do{if(limit?testIndex>=limit:testIndex<=0)return lastValid;testIndex+=increment,rec=me.store.getAt(testIndex),(node=Ext.fly(me.getNodeByRecord(rec,!0)))&&node.isVisible(!0)&&(moved+=increment,lastValid=rec)}while(moved!==distance);return lastValid},getFirstVisibleRowIndex:function(){var me=this,count=me.dataSource.buffered?me.dataSource.getTotalCount():me.dataSource.getCount(),result=me.indexOf(me.all.first())-1;do{if((result+=1)===count)return}while(!Ext.fly(me.getNode(result,!0)).isVisible(!0));return result},getLastVisibleRowIndex:function(){var me=this,result=me.indexOf(me.all.last());do{if(-1===(result-=1))return}while(!Ext.fly(me.getNode(result,!0)).isVisible(!0));return result},getHeaderCt:function(){return this.headerCt},getPosition:function(record,header){return new Ext.grid.CellContext(this).setPosition(record,header)},beforeDestroy:function(){var me=this;me.rendered&&me.el.removeAllListeners(),me.callParent(arguments)},onDestroy:function(){var len,i,me=this,features=me.featuresMC;if(features)for(i=0,len=features.getCount();i<len;++i)features.getAt(i).destroy();me.featuresMC=null,this.callParent(arguments)},onAdd:function(ds,records,index){var nextIndex,isNextRowSelected,isNextRowFocused,me=this,selModel=me.selModel;me.callParent(arguments),me.doStripeRows(index),me.rendered&&selModel.isRowModel&&!records[0].isCollapsedPlaceholder&&(nextIndex=index+records.length,isNextRowSelected=selModel.isRowSelected(nextIndex),isNextRowFocused=me.indexOf(selModel.lastFocused)===nextIndex,(isNextRowSelected||isNextRowFocused)&&me.onRowDeselect(index),isNextRowSelected&&me.onRowSelect(nextIndex),selModel.isRowSelected(index)&&me.onRowSelect(index)),
me.selModel.onLastFocusChanged(null,me.selModel.lastFocused,!0)},onRemove:function(ds,records,indexes){var index,record,me=this,selModel=me.selModel,len=indexes.length,i=0,delta=0;if(me.callParent(arguments),me.doStripeRows(indexes[0]),me.rendered&&selModel.isRowModel&&!records[0].isCollapsedPlaceholder)for(;i<len;i++,delta++)index=indexes[i]-delta,record=me.store.getAt(index),me.onRowDeselect(index),selModel.isRowSelected(record)&&me.getNode(record)&&me.onRowSelect(index);selModel.onLastFocusChanged(null,selModel.lastFocused,!0)},doStripeRows:function(startRow,endRow){var rows,rowsLn,i,row,me=this;if(me.rendered&&me.stripeRows)for(rows=me.getNodes(startRow,endRow),i=0,rowsLn=rows.length;i<rowsLn;i++)row=rows[i],row.className=row.className.replace(me.rowClsRe," "),++startRow%2==0&&(row.className+=" "+me.altRowCls)},repaintRow:function(rowIdx){var tds,i,node=this.getNode(rowIdx);if(node)for(tds=node.childNodes,i=tds.length;i--;)tds[i].className=tds[i].className},getRowStyleTableEl:function(item){var me=this;return item.tagName||(item=this.getNode(item)),(me.hasActiveGrouping()?Ext.fly(item):this.el).down("table."+Ext.baseCSSPrefix+"grid-table")},toggleRowTableCls:function(item,cls,enabled){var table,root,me=this;item.tagName||(item=this.getNode(item)),root=me.isGrouping?Ext.fly(item):this.el,root&&(table=root.down("table."+Ext.baseCSSPrefix+"grid-table")),table&&table[enabled?"addCls":"removeCls"](cls)},isRowStyleFirst:function(item){var index,me=this;return-1!==item&&(item.tagName?index=me.indexOf(item):(index=item,item=this.getNode(item)),!index||me.hasActiveGrouping()&&item&&Ext.fly(item).hasCls(Ext.baseCSSPrefix+"grid-group-row"))},hasActiveGrouping:function(){return this.isGrouping&&this.store.isGrouped()},getCellPaddingAfter:function(cell){return Ext.fly(cell).getPadding("r")},hasVerticalScroll:function(){var first,me=this;return!(me.ownerCt.isLocked||!me.scrollFlags.y)&&(!!(first=me.el.down("table"))&&this.getHeight()<first.getHeight())}});Ext.define("Ext.grid.View",{extend:"Ext.view.Table",alias:"widget.gridview",stripeRows:!0,autoScroll:!0});Ext.define("Ext.grid.Panel",{extend:"Ext.panel.Table",requires:["Ext.grid.View"],alias:["widget.gridpanel","widget.grid"],alternateClassName:["Ext.list.ListView","Ext.ListView","Ext.grid.GridPanel"],viewType:"gridview",lockable:!1,rowLines:!0});Ext.define("Ext.grid.plugin.BufferedRendererTableView",{override:"Ext.view.Table",onAdd:function(store,records,index){var me=this,bufferedRenderer=me.bufferedRenderer,rows=me.all;me.rendered&&bufferedRenderer&&rows.getCount()+records.length>bufferedRenderer.viewSize?index<rows.startIndex+bufferedRenderer.viewSize&&index+records.length>rows.startIndex?me.refreshView():bufferedRenderer.stretchView(me,bufferedRenderer.getScrollHeight()):me.callParent([store,records,index])},onRemove:function(store,records,indices){var storeSize,all,startIndex,me=this,bufferedRenderer=me.bufferedRenderer;me.callParent([store,records,indices]),me.rendered&&bufferedRenderer&&(storeSize=me.dataSource.getCount(),all=me.all,storeSize>all.getCount()?(startIndex=all.startIndex,bufferedRenderer.renderRange(startIndex,Math.min(startIndex+bufferedRenderer.viewSize,storeSize)-1)):bufferedRenderer.stretchView(me,bufferedRenderer.getScrollHeight()))},onDataRefresh:function(){var me=this;me.bufferedRenderer&&(me.all.clear(),me.bufferedRenderer.onStoreClear()),me.callParent()}});Ext.define("Ext.view.DropZone",{extend:"Ext.dd.DropZone",indicatorCls:Ext.baseCSSPrefix+"grid-drop-indicator",indicatorHtml:['<div class="',Ext.baseCSSPrefix,'grid-drop-indicator-left" role="presentation"></div>','<div class="'+Ext.baseCSSPrefix+'grid-drop-indicator-right" role="presentation"></div>'].join(""),constructor:function(config){var me=this;Ext.apply(me,config),me.ddGroup||(me.ddGroup="view-dd-zone-"+me.view.id),me.callParent([me.view.el])},fireViewEvent:function(){var result,me=this;return me.lock(),result=me.view.fireEvent.apply(me.view,arguments),me.unlock(),result},getTargetFromEvent:function(e){var mouseY,nodeList,testNode,i,len,box,node=e.getTarget(this.view.getItemSelector());if(!node)for(mouseY=e.getPageY(),i=0,nodeList=this.view.getNodes(),len=nodeList.length;i<len;i++)if(testNode=nodeList[i],box=Ext.fly(testNode).getBox(),mouseY<=box.bottom)return testNode;return node},getIndicator:function(){var me=this;return me.indicator||(me.indicator=new Ext.Component({ariaRole:"presentation",html:me.indicatorHtml,cls:me.indicatorCls,ownerCt:me.view,floating:!0,shadow:!1})),me.indicator},getPosition:function(e,node){var y=e.getXY()[1],region=Ext.fly(node).getRegion();return region.bottom-y>=(region.bottom-region.top)/2?"before":"after"},containsRecordAtOffset:function(records,record,offset){if(!record)return!1;var view=this.view,recordIndex=view.indexOf(record),nodeBefore=view.getNode(recordIndex+offset,!0),recordBefore=nodeBefore?view.getRecord(nodeBefore):null;return recordBefore&&Ext.Array.contains(records,recordBefore)},positionIndicator:function(node,data,e){var indicatorY,me=this,view=me.view,pos=me.getPosition(e,node),overRecord=view.getRecord(node),draggingRecords=data.records;Ext.Array.contains(draggingRecords,overRecord)||("before"!=pos||me.containsRecordAtOffset(draggingRecords,overRecord,-1))&&("after"!=pos||me.containsRecordAtOffset(draggingRecords,overRecord,1))?me.invalidateDrop():(me.valid=!0,me.overRecord==overRecord&&me.currentPosition==pos||(indicatorY=Ext.fly(node).getY()-view.el.getY()-1,"after"==pos&&(indicatorY+=Ext.fly(node).getHeight()),me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0,indicatorY),me.overRecord=overRecord,me.currentPosition=pos))},invalidateDrop:function(){this.valid&&(this.valid=!1,this.getIndicator().hide())},onNodeOver:function(node,dragZone,e,data){var me=this;return Ext.Array.contains(data.records,me.view.getRecord(node))||me.positionIndicator(node,data,e),me.valid?me.dropAllowed:me.dropNotAllowed},notifyOut:function(node,dragZone,e,data){var me=this;me.callParent(arguments),me.overRecord=me.currentPosition=null,me.valid=!1,me.indicator&&me.indicator.hide()},onContainerOver:function(dd,e,data){var me=this,view=me.view;return view.dataSource.getCount()?me.positionIndicator(view.all.last(),data,e):(me.overRecord=me.currentPosition=null,me.getIndicator().setWidth(Ext.fly(view.el).getWidth()).showAt(0,0),me.valid=!0),me.dropAllowed},onContainerDrop:function(dd,e,data){return this.onNodeDrop(dd,null,e,data)},onNodeDrop:function(targetNode,dragZone,e,data){var me=this,dropHandled=!1,dropHandlers={wait:!1,processDrop:function(){me.invalidateDrop(),me.handleNodeDrop(data,me.overRecord,me.currentPosition),dropHandled=!0,me.fireViewEvent("drop",targetNode,data,me.overRecord,me.currentPosition)},cancelDrop:function(){me.invalidateDrop(),dropHandled=!0}},performOperation=!1;if(me.valid){if(performOperation=me.fireViewEvent("beforedrop",targetNode,data,me.overRecord,me.currentPosition,dropHandlers),dropHandlers.wait)return;!1!==performOperation&&(dropHandled||dropHandlers.processDrop())}return performOperation},destroy:function(){Ext.destroy(this.indicator),delete this.indicator,this.callParent()}});Ext.define("Ext.grid.ViewDropZone",{extend:"Ext.view.DropZone",indicatorHtml:'<div class="'+Ext.baseCSSPrefix+'grid-drop-indicator-left" role="presentation"></div><div class="'+Ext.baseCSSPrefix+'grid-drop-indicator-right" role="presentation"></div>',indicatorCls:Ext.baseCSSPrefix+"grid-drop-indicator",handleNodeDrop:function(data,record,position){var index,records,i,len,view=this.view,store=view.getStore();if(data.copy)for(records=data.records,data.records=[],i=0,len=records.length;i<len;i++)data.records.push(records[i].copy());else data.view.store.remove(data.records,data.view===view);record&&position?(index=store.indexOf(record),"before"!==position&&index++,store.insert(index,data.records)):store.add(data.records),view.getSelectionModel().select(data.records)}});Ext.define("Ext.grid.plugin.HeaderResizer",{extend:"Ext.AbstractPlugin",requires:["Ext.dd.DragTracker","Ext.util.Region"],alias:"plugin.gridheaderresizer",disabled:!1,config:{dynamic:!1},colHeaderCls:Ext.baseCSSPrefix+"column-header",minColWidth:40,maxColWidth:1e3,wResizeCursor:"col-resize",eResizeCursor:"col-resize",init:function(headerCt){this.headerCt=headerCt,headerCt.on("render",this.afterHeaderRender,this,{single:!0})},destroy:function(){var tracker=this.tracker;tracker&&(delete tracker.onBeforeStart,delete tracker.onStart,delete tracker.onDrag,delete tracker.onEnd,tracker.destroy(),this.tracker=null)},afterHeaderRender:function(){var headerCt=this.headerCt,el=headerCt.el;headerCt.mon(el,"mousemove",this.onHeaderCtMouseMove,this),this.tracker=new Ext.dd.DragTracker({disabled:this.disabled,onBeforeStart:Ext.Function.bind(this.onBeforeStart,this),onStart:Ext.Function.bind(this.onStart,this),onDrag:Ext.Function.bind(this.onDrag,this),onEnd:Ext.Function.bind(this.onEnd,this),tolerance:3,autoStart:300,el:el})},onHeaderCtMouseMove:function(e,t){var prevSiblings,headerEl,overHeader,resizeHeader,resizeHeaderOwnerGrid,ownerGrid,me=this;me.headerCt.dragging?me.activeHd&&(me.activeHd.el.dom.style.cursor="",delete me.activeHd):(headerEl=e.getTarget("."+me.colHeaderCls,3,!0))&&(overHeader=Ext.getCmp(headerEl.id),overHeader.isOnLeftEdge(e)?(resizeHeader=overHeader.previousNode("gridcolumn:not([hidden]):not([isGroupHeader])"))&&(ownerGrid=me.headerCt.up("tablepanel"),(resizeHeaderOwnerGrid=resizeHeader.up("tablepanel"))===ownerGrid||ownerGrid.ownerCt.isXType("tablepanel")&&ownerGrid.ownerCt.view.lockedGrid===resizeHeaderOwnerGrid||(resizeHeader=null)):resizeHeader=overHeader.isOnRightEdge(e)?overHeader:null,resizeHeader?(resizeHeader.isGroupHeader&&(prevSiblings=resizeHeader.getGridColumns(),resizeHeader=prevSiblings[prevSiblings.length-1]),!resizeHeader||resizeHeader.fixed||!1===resizeHeader.resizable||me.disabled||(me.activeHd=resizeHeader,overHeader.el.dom.style.cursor=me.eResizeCursor,overHeader.triggerEl&&(overHeader.triggerEl.dom.style.cursor=me.eResizeCursor))):(overHeader.el.dom.style.cursor="",overHeader.triggerEl&&(overHeader.triggerEl.dom.style.cursor=""),me.activeHd=null))},onBeforeStart:function(e){return this.dragHd=this.activeHd,this.dragHd&&!this.headerCt.dragging?(this.tracker.constrainTo=this.getConstrainRegion(),!0):(this.headerCt.dragging=!1,!1)},getConstrainRegion:function(){var nextHd,lockedGrid,me=this,dragHdEl=me.dragHd.el,rightAdjust=0;return me.headerCt.forceFit?(nextHd=me.dragHd.nextNode("gridcolumn:not([hidden]):not([isGroupHeader])"))&&(me.headerInSameGrid(nextHd)||(nextHd=null),rightAdjust=nextHd.getWidth()-me.minColWidth):rightAdjust=(lockedGrid=me.dragHd.up("tablepanel")).isLocked?me.dragHd.up("[scrollerOwner]").getWidth()-lockedGrid.getWidth()-30:me.maxColWidth-dragHdEl.getWidth(),me.adjustConstrainRegion(dragHdEl.getRegion(),0,rightAdjust,0,me.minColWidth)},onStart:function(e){var x,y,gridSection,markerOwner,lhsMarker,rhsMarker,markerHeight,me=this,dragHd=me.dragHd,width=dragHd.el.getWidth(),headerCt=dragHd.getOwnerHeaderCt();me.headerCt.dragging=!0,me.origWidth=width,me.dynamic||(gridSection=markerOwner=headerCt.up("tablepanel"),gridSection.ownerLockable&&(markerOwner=gridSection.ownerLockable),x=me.getLeftMarkerX(markerOwner),lhsMarker=markerOwner.getLhsMarker(),rhsMarker=markerOwner.getRhsMarker(),markerHeight=gridSection.body.getHeight()+headerCt.getHeight(),y=headerCt.getOffsetsTo(markerOwner)[1],lhsMarker.setLocalY(y),rhsMarker.setLocalY(y),lhsMarker.setHeight(markerHeight),rhsMarker.setHeight(markerHeight),me.setMarkerX(lhsMarker,x),me.setMarkerX(rhsMarker,x+width))},onDrag:function(e){var markerOwner,me=this;me.dynamic?me.doResize():(markerOwner=this.headerCt.up("tablepanel"),markerOwner.ownerLockable&&(markerOwner=markerOwner.ownerLockable),this.setMarkerX(this.getMovingMarker(markerOwner),this.calculateDragX(markerOwner)))},getMovingMarker:function(markerOwner){return markerOwner.getRhsMarker()},onEnd:function(e){if(this.headerCt.dragging=!1,this.dragHd){if(!this.dynamic){var markerOwner=this.headerCt.up("tablepanel");markerOwner.ownerLockable&&(markerOwner=markerOwner.ownerLockable),this.setMarkerX(markerOwner.getLhsMarker(),-9999),this.setMarkerX(markerOwner.getRhsMarker(),-9999)}this.doResize()}},doResize:function(){var nextHd,offset,me=this,dragHd=me.dragHd;dragHd&&(offset=me.tracker.getOffset("point"),dragHd.flex&&delete dragHd.flex,Ext.suspendLayouts(),me.adjustColumnWidth(offset[0]),me.headerCt.forceFit&&(nextHd=dragHd.nextNode("gridcolumn:not([hidden]):not([isGroupHeader])"),nextHd&&!me.headerInSameGrid(nextHd)&&(nextHd=null),nextHd&&(delete nextHd.flex,nextHd.setWidth(nextHd.getWidth()-offset[0]))),Ext.resumeLayouts(!0))},headerInSameGrid:function(header){var grid=this.dragHd.up("tablepanel");return!!header.up(grid)},disable:function(){this.disabled=!0,this.tracker&&this.tracker.disable()},enable:function(){this.disabled=!1,this.tracker&&this.tracker.enable()},calculateDragX:function(markerOwner){return this.tracker.getXY("point")[0]-markerOwner.getX()-markerOwner.el.getBorderWidth("l")},getLeftMarkerX:function(markerOwner){return this.dragHd.getX()-markerOwner.getX()-markerOwner.el.getBorderWidth("l")-1},setMarkerX:function(marker,x){marker.setLocalX(x)},adjustConstrainRegion:function(region,t,r,b,l){return region.adjust(t,r,b,l)},adjustColumnWidth:function(offsetX){this.dragHd.setWidth(this.origWidth+offsetX)}});Ext.define("Ext.grid.header.DragZone",{extend:"Ext.dd.DragZone",colHeaderSelector:"."+Ext.baseCSSPrefix+"column-header",colInnerSelector:"."+Ext.baseCSSPrefix+"column-header-inner",maxProxyWidth:120,constructor:function(headerCt){var me=this;me.headerCt=headerCt,me.ddGroup=me.getDDGroup(),me.autoGroup=!0,me.callParent([headerCt.el]),me.proxy.el.addCls(Ext.baseCSSPrefix+"grid-col-dd")},getDDGroup:function(){return"header-dd-zone-"+this.headerCt.up("[scrollerOwner]").id},getDragData:function(e){if(e.getTarget(this.colInnerSelector)){var headerCmp,ddel,header=e.getTarget(this.colHeaderSelector);if(header&&(headerCmp=Ext.getCmp(header.id),!this.headerCt.dragging&&headerCmp.draggable&&!headerCmp.isOnLeftEdge(e)&&!headerCmp.isOnRightEdge(e)))return ddel=document.createElement("div"),ddel.role="presentation",ddel.innerHTML=Ext.getCmp(header.id).text,{ddel:ddel,header:headerCmp}}return!1},onBeforeDrag:function(){return!(this.headerCt.dragging||this.disabled)},onInitDrag:function(){this.headerCt.dragging=!0,this.callParent(arguments)},onDragDrop:function(){this.headerCt.dragging=!1,this.callParent(arguments)},afterRepair:function(){this.callParent(),this.headerCt.dragging=!1},getRepairXY:function(){return this.dragData.header.el.getXY()},disable:function(){this.disabled=!0},enable:function(){this.disabled=!1}});Ext.define("Ext.grid.header.DropZone",{extend:"Ext.dd.DropZone",colHeaderCls:Ext.baseCSSPrefix+"column-header",proxyOffsets:[-4,-9],constructor:function(headerCt){var me=this;me.headerCt=headerCt,me.ddGroup=me.getDDGroup(),me.autoGroup=!0,me.callParent([headerCt.el])},getDDGroup:function(){return"header-dd-zone-"+this.headerCt.up("[scrollerOwner]").id},getTargetFromEvent:function(e){return e.getTarget("."+this.colHeaderCls)},getTopIndicator:function(){return this.topIndicator||(this.self.prototype.topIndicator=Ext.DomHelper.append(Ext.getBody(),{role:"presentation",cls:"col-move-top",html:"&#160;"},!0),this.self.prototype.indicatorXOffset=Math.floor((this.topIndicator.dom.offsetWidth+1)/2)),this.topIndicator},getBottomIndicator:function(){return this.bottomIndicator||(this.self.prototype.bottomIndicator=Ext.DomHelper.append(Ext.getBody(),{role:"presentation",cls:"col-move-bottom",html:"&#160;"},!0)),this.bottomIndicator},getLocation:function(e,t){var pos,x=e.getXY()[0],region=Ext.fly(t).getRegion();return pos=region.right-x<=(region.right-region.left)/2?"after":"before",{pos:pos,header:Ext.getCmp(t.id),node:t}},positionIndicator:function(data,node,e){var nextHd,prevHd,topIndicator,bottomIndicator,topAnchor,bottomAnchor,topXY,bottomXY,headerCtEl,minX,maxX,allDropZones,ln,i,dropZone,me=this,dragHeader=data.header,dropLocation=me.getLocation(e,node),targetHeader=dropLocation.header,pos=dropLocation.pos;if(targetHeader!==me.lastTargetHeader||pos!==me.lastDropPos){if(nextHd=dragHeader.nextSibling("gridcolumn:not([hidden])"),prevHd=dragHeader.previousSibling("gridcolumn:not([hidden])"),me.lastTargetHeader=targetHeader,me.lastDropPos=pos,!targetHeader.draggable&&"before"===pos&&0===targetHeader.getIndex())return!1;if(data.dropLocation=dropLocation,dragHeader!==targetHeader&&("before"===pos&&nextHd!==targetHeader||"after"===pos&&prevHd!==targetHeader)&&!targetHeader.isDescendantOf(dragHeader)){for(allDropZones=Ext.dd.DragDropManager.getRelated(me),ln=allDropZones.length,i=0;i<ln;i++)(dropZone=allDropZones[i])!==me&&dropZone.invalidateDrop&&dropZone.invalidateDrop();me.valid=!0,topIndicator=me.getTopIndicator(),bottomIndicator=me.getBottomIndicator(),"before"===pos?(topAnchor="bc-tl",bottomAnchor="tc-bl"):(topAnchor="bc-tr",bottomAnchor="tc-br"),topXY=topIndicator.getAlignToXY(targetHeader.el,topAnchor),bottomXY=bottomIndicator.getAlignToXY(targetHeader.el,bottomAnchor),headerCtEl=me.headerCt.el,minX=headerCtEl.getX()-me.indicatorXOffset,maxX=headerCtEl.getX()+headerCtEl.getWidth(),topXY[0]=Ext.Number.constrain(topXY[0],minX,maxX),bottomXY[0]=Ext.Number.constrain(bottomXY[0],minX,maxX),topIndicator.setXY(topXY),bottomIndicator.setXY(bottomXY),topIndicator.show(),bottomIndicator.show()}else me.invalidateDrop()}},invalidateDrop:function(){this.valid=!1,this.hideIndicators()},onNodeOver:function(node,dragZone,e,data){var doPosition,to,fromPanel,toPanel,me=this,from=data.header;return data.header.el.dom===node?doPosition=!1:(data.isLock=data.isUnlock=!1,to=me.getLocation(e,node).header,(doPosition=from.ownerCt===to.ownerCt)||from.ownerCt.sealed||to.ownerCt.sealed||(doPosition=!0,fromPanel=from.up("tablepanel"),toPanel=to.up("tablepanel"),data.isLock=toPanel.isLocked&&!fromPanel.isLocked,data.isUnlock=!toPanel.isLocked&&fromPanel.isLocked,(data.isUnlock&&!1===from.lockable||data.isLock&&!from.isLockable())&&(doPosition=!1))),doPosition?me.positionIndicator(data,node,e):me.valid=!1,me.valid?me.dropAllowed:me.dropNotAllowed},hideIndicators:function(){var me=this;me.getTopIndicator().hide(),me.getBottomIndicator().hide(),me.lastTargetHeader=me.lastDropPos=null},onNodeOut:function(){this.hideIndicators()},onNodeDrop:function(node,dragZone,e,data){if(this.valid){var scrollerOwner,savedWidth,dragHeader=data.header,dropLocation=data.dropLocation,targetHeader=dropLocation.header,fromCt=dragHeader.ownerCt,localFromIdx=fromCt.items.indexOf(dragHeader),toCt=targetHeader.ownerCt,localToIdx=toCt.items.indexOf(targetHeader),headerCt=this.headerCt,columns=headerCt.visibleColumnManager,fromIdx=columns.getHeaderIndex(dragHeader),toIdx=columns.getHeaderIndex(targetHeader),colsToMove=dragHeader.isGroupHeader?dragHeader.query(":not([hidden]):not([isGroupHeader])").length:1,sameCt=fromCt===toCt;if("after"===dropLocation.pos&&(localToIdx++,toIdx+=targetHeader.isGroupHeader?targetHeader.query(":not([hidden]):not([isGroupHeader])").length:1),data.isLock)scrollerOwner=fromCt.up("[scrollerOwner]"),scrollerOwner.lock(dragHeader,localToIdx,toCt);else if(data.isUnlock)scrollerOwner=fromCt.up("[scrollerOwner]"),scrollerOwner.unlock(dragHeader,localToIdx,toCt);else{if(this.invalidateDrop(),savedWidth=dragHeader.getWidth(),sameCt&&(localToIdx>localFromIdx&&(localToIdx-=1),localToIdx===localFromIdx))return void headerCt.onHeaderMoved(dragHeader,colsToMove,fromIdx,toIdx);Ext.suspendLayouts(),dragHeader.dropMoving=!0,sameCt?toCt.move(localFromIdx,localToIdx):(fromCt.remove(dragHeader,!1),toCt.insert(localToIdx,dragHeader)),delete dragHeader.dropMoving,toCt.isGroupHeader?sameCt||(dragHeader.savedFlex=dragHeader.flex,delete dragHeader.flex,dragHeader.width=savedWidth):dragHeader.savedFlex&&(dragHeader.flex=dragHeader.savedFlex,delete dragHeader.width),headerCt.purgeCache(),Ext.resumeLayouts(!0),headerCt.onHeaderMoved(dragHeader,colsToMove,fromIdx,toIdx)}}}});Ext.define("Ext.grid.plugin.HeaderReorderer",{extend:"Ext.AbstractPlugin",requires:["Ext.grid.header.DragZone","Ext.grid.header.DropZone"],alias:"plugin.gridheaderreorderer",init:function(headerCt){this.headerCt=headerCt,headerCt.on({render:this.onHeaderCtRender,single:!0,scope:this})},destroy:function(){Ext.destroy(this.dragZone,this.dropZone)},onHeaderCtRender:function(){var me=this;me.dragZone=new Ext.grid.header.DragZone(me.headerCt),me.dropZone=new Ext.grid.header.DropZone(me.headerCt),me.disabled&&me.dragZone.disable()},enable:function(){this.disabled=!1,this.dragZone&&this.dragZone.enable()},disable:function(){this.disabled=!0,this.dragZone&&this.dragZone.disable()}});Ext.define("Ext.grid.header.Container",{extend:"Ext.container.Container",requires:["Ext.grid.ColumnLayout","Ext.grid.plugin.HeaderResizer","Ext.grid.plugin.HeaderReorderer"],uses:["Ext.grid.column.Column","Ext.grid.ColumnManager","Ext.menu.Menu","Ext.menu.CheckItem","Ext.menu.Separator"],border:!0,alias:"widget.headercontainer",baseCls:Ext.baseCSSPrefix+"grid-header-ct",dock:"top",weight:100,defaultType:"gridcolumn",detachOnRemove:!1,defaultWidth:100,sortAscText:"Sort Ascending",sortDescText:"Sort Descending",sortClearText:"Clear Sort",columnsText:"Columns",headerOpenCls:Ext.baseCSSPrefix+"column-header-open",menuSortAscCls:Ext.baseCSSPrefix+"hmenu-sort-asc",menuSortDescCls:Ext.baseCSSPrefix+"hmenu-sort-desc",menuColsIcon:Ext.baseCSSPrefix+"cols-icon",triStateSort:!1,ddLock:!1,dragging:!1,sortable:!0,enableColumnHide:!0,initComponent:function(){var me=this;me.headerCounter=0,me.plugins=me.plugins||[],me.isColumn||(me.enableColumnResize&&(me.resizer=new Ext.grid.plugin.HeaderResizer,me.plugins.push(me.resizer)),me.enableColumnMove&&(me.reorderer=new Ext.grid.plugin.HeaderReorderer,me.plugins.push(me.reorderer))),me.isColumn&&!me.isGroupHeader?me.items&&0!==me.items.length||(me.isContainer=!1,me.layout={type:"container",calculate:Ext.emptyFn}):(me.layout=Ext.apply({type:"gridcolumn",align:"stretch"},me.initialConfig.layout),me.isGroupHeader?(me.visibleColumnManager=new Ext.grid.ColumnManager(!0,me),me.columnManager=new Ext.grid.ColumnManager(!1,me)):(me.isRootHeader=!0,me.columnManager=new Ext.grid.ColumnManager(!1,me),me.visibleColumnManager=new Ext.grid.ColumnManager(!0,me),me.grid&&(me.grid.columnManager=me.columnManager,me.grid.visibleColumnManager=me.visibleColumnManager))),me.defaults=me.defaults||{},Ext.applyIf(me.defaults,{triStateSort:me.triStateSort,sortable:me.sortable}),me.menuTask=new Ext.util.DelayedTask(me.updateMenuDisabledState,me),me.callParent(),me.addEvents("columnresize","headerclick","headercontextmenu","headertriggerclick","columnmove","columnhide","columnshow","columnschanged","sortchange","menucreate")},isLayoutRoot:function(){return!this.hiddenHeaders&&this.callParent()},getOwnerHeaderCt:function(){var me=this;return me.isRootHeader?me:me.up("[isRootHeader]")},onDestroy:function(){var me=this;me.menu&&me.menu.un("hide",me.onMenuHide,me),me.menuTask.cancel(),me.callParent(),Ext.destroy(me.resizer,me.reorderer,me.visibleColumnManager,me.columnManager,me.menu),me.columnManager=me.visibleColumnManager=null},applyColumnsState:function(columns){if(columns&&columns.length){var c,col,columnState,index,me=this,items=me.items.items,count=items.length,i=0,length=columns.length;for(c=0;c<length;c++)for(columnState=columns[c],index=count;index--;)if(col=items[index],col.getStateId&&col.getStateId()==columnState.id){i!==index&&me.moveHeader(index,i),col.applyColumnState&&col.applyColumnState(columnState),++i;break}}},getColumnsState:function(){var state,me=this,columns=[];return me.items.each(function(col){(state=col.getColumnState&&col.getColumnState())&&columns.push(state)}),columns},onAdd:function(c){var me=this;c.headerId||(c.headerId=c.initialConfig.id||Ext.id(null,"header-")),c.getStateId()||(c.stateId=c.initialConfig.id||"h"+ ++me.headerCounter),Ext.global.console&&Ext.global.console.warn&&(me._usedIDs||(me._usedIDs={}),me._usedIDs[c.headerId]&&Ext.global.console.warn(this.$className,"attempted to reuse an existing id",c.headerId),me._usedIDs[c.headerId]=!0),me.callParent(arguments),me.onColumnsChanged(),me.checkMoveNotify(c)},onMove:function(c,fromIdx,toIdx){var me=this;me.callParent(arguments),me.onColumnsChanged(),c.dropMoving||(me.checkMoveNotify(c),me.fireEvent("columnmove",me,c,fromIdx,toIdx))},onRemove:function(c){var me=this,ownerCt=me.ownerCt;me.callParent(arguments),me._usedIDs||(me._usedIDs={}),delete me._usedIDs[c.headerId],me.destroying||(me.onColumnsChanged(),me.checkMoveNotify(c),me.isGroupHeader&&!me.items.getCount()&&ownerCt&&(me.detachComponent(c),Ext.suspendLayouts(),ownerCt.remove(me),Ext.resumeLayouts(!0)))},checkMoveNotify:function(c){var owner,root;c.isGroupHeader||(root=this.getOwnerHeaderCt())&&(owner=root.ownerCt)&&owner.onHeadersChanged(root,c)},onShow:function(){this.callParent(arguments),this.onColumnsChanged()},onColumnsChanged:function(){var headerCt=this;this.purgeHeaderCtCache(headerCt),headerCt&&headerCt.rendered&&headerCt.fireEvent("columnschanged",headerCt)},applyDefaults:function(config){var ret;return config&&!config.isComponent&&"rownumberer"==config.xtype?ret=config:(ret=this.callParent(arguments),config.isGroupHeader||"width"in ret||ret.flex||(ret.width=this.defaultWidth)),ret},setSortState:function(){var hd,store=this.up("[store]").store,first=store.getFirstSorter();first?(hd=this.down("gridcolumn[dataIndex="+first.property+"]"))&&hd.setSortState(first.direction,!1,!0):this.clearOtherSortStates(null)},getHeaderMenu:function(){var item,menu=this.getMenu();return menu&&(item=menu.child("#columnItem"))?item.menu:null},onHeaderVisibilityChange:function(header,visible){var item,me=this,menu=me.getHeaderMenu();me.purgeHeaderCtCache(header.ownerCt),menu&&(item=me.getMenuItemForHeader(menu,header),item&&item.setChecked(visible,!0),menu.isVisible()&&me.menuTask.delay(50))},updateMenuDisabledState:function(menu){var i,item,checkItem,method,me=this,columns=me.query(":not([hidden])"),len=columns.length;for(menu||(menu=me.getMenu()),i=0;i<len;++i)item=columns[i],(checkItem=me.getMenuItemForHeader(menu,item))&&(method=item.isHideable()?"enable":"disable",checkItem.menu&&(method+="CheckChange"),checkItem[method]())},getMenuItemForHeader:function(menu,header){return header?menu.down("menucheckitem[headerId="+header.id+"]"):null},onHeaderShow:function(header){var me=this,gridSection=me.ownerCt;me.forceFit&&delete me.flex,me.onHeaderVisibilityChange(header,!0),header.isGroupHeader||gridSection&&gridSection.onHeaderShow(me,header),me.fireEvent("columnshow",me,header),me.fireEvent("columnschanged",this)},onHeaderHide:function(header){var me=this,gridSection=me.ownerCt;me.onHeaderVisibilityChange(header,!1),header.isGroupHeader||gridSection&&gridSection.onHeaderHide(me,header),me.fireEvent("columnhide",me,header),me.fireEvent("columnschanged",this)},tempLock:function(){this.ddLock=!0,Ext.Function.defer(function(){this.ddLock=!1},200,this)},onHeaderResize:function(header,w,suppressFocus){var me=this,view=me.view,gridSection=me.ownerCt;view&&view.body.dom&&(me.tempLock(),gridSection&&gridSection.onHeaderResize(me,header,w)),me.fireEvent("columnresize",this,header,w)},onHeaderClick:function(header,e,t){header.fireEvent("headerclick",this,header,e,t),this.fireEvent("headerclick",this,header,e,t)},onHeaderContextMenu:function(header,e,t){header.fireEvent("headercontextmenu",this,header,e,t),this.fireEvent("headercontextmenu",this,header,e,t)},onHeaderTriggerClick:function(header,e,t){var me=this;!1!==header.fireEvent("headertriggerclick",me,header,e,t)&&!1!==me.fireEvent("headertriggerclick",me,header,e,t)&&me.showMenuBy(t,header)},showMenuBy:function(t,header){var sortableMth,menu=this.getMenu(),ascItem=menu.down("#ascItem"),descItem=menu.down("#descItem");menu.activeHeader=menu.ownerButton=header,header.setMenuActive(!0),sortableMth=header.sortable?"enable":"disable",ascItem&&ascItem[sortableMth](),descItem&&descItem[sortableMth](),menu.showBy(t)},onMenuHide:function(menu){menu.activeHeader.setMenuActive(!1)},moveHeader:function(fromIdx,toIdx){this.tempLock(),this.onHeaderMoved(this.move(fromIdx,toIdx),1,fromIdx,toIdx)},purgeHeaderCtCache:function(headerCt){for(;headerCt;){if(headerCt.purgeCache(),headerCt.isRootHeader)return;headerCt=headerCt.ownerCt}},purgeCache:function(){var me=this,menu=me.menu,visibleColumnManager=me.visibleColumnManager,columnManager=me.columnManager;me.gridVisibleColumns=me.gridDataColumns=me.hideableColumns=null,visibleColumnManager&&(visibleColumnManager.invalidate(),columnManager.invalidate()),menu&&menu.hidden&&(menu.hide(),menu.destroy(),me.menu=null)},onHeaderMoved:function(header,colsToMove,fromIdx,toIdx){var me=this,gridSection=me.ownerCt;me.rendered&&(gridSection&&gridSection.onHeaderMove&&gridSection.onHeaderMove(me,header,colsToMove,fromIdx,toIdx),me.fireEvent("columnmove",me,header,fromIdx,toIdx))},getMenu:function(){var me=this;return me.menu||(me.menu=new Ext.menu.Menu({hideOnParentHide:!1,items:me.getMenuItems(),listeners:{hide:me.onMenuHide,scope:me}}),me.fireEvent("menucreate",me,me.menu)),me.updateMenuDisabledState(me.menu),me.menu},getMenuItems:function(){var me=this,menuItems=[],hideableColumns=me.enableColumnHide?me.getColumnMenu(me):null;return me.sortable&&(menuItems=[{itemId:"ascItem",text:me.sortAscText,iconCls:me.menuSortAscCls,handler:me.onSortAscClick,scope:me},{itemId:"descItem",text:me.sortDescText,iconCls:me.menuSortDescCls,handler:me.onSortDescClick,scope:me}]),hideableColumns&&hideableColumns.length&&(me.sortable&&menuItems.push("-"),menuItems.push({itemId:"columnItem",text:me.columnsText,iconCls:me.menuColsIcon,menu:hideableColumns,hideOnClick:!1})),menuItems},onSortAscClick:function(){this.getMenu().activeHeader.setSortState("ASC")},onSortDescClick:function(){this.getMenu().activeHeader.setSortState("DESC")},getColumnMenu:function(headerContainer){for(var item,menuItem,menuItems=[],i=0,items=headerContainer.query(">gridcolumn[hideable]"),itemsLn=items.length;i<itemsLn;i++)item=items[i],menuItem=new Ext.menu.CheckItem({text:item.menuText||item.text,checked:!item.hidden,hideOnClick:!1,headerId:item.id,menu:item.isGroupHeader?this.getColumnMenu(item):void 0,checkHandler:this.onColumnCheckChange,scope:this}),menuItems.push(menuItem),item.on({destroy:Ext.Function.bind(menuItem.destroy,menuItem)});return menuItems},onColumnCheckChange:function(checkItem,checked){Ext.getCmp(checkItem.headerId)[checked?"show":"hide"]()},getColumnCount:function(){return this.getGridColumns().length},getFullWidth:function(){for(var header,fullWidth=0,headers=this.getVisibleGridColumns(),headersLn=headers.length,i=0;i<headersLn;i++)header=headers[i],header.getDesiredWidth?fullWidth+=header.getDesiredWidth()||0:fullWidth+=header.getWidth();return fullWidth},clearOtherSortStates:function(activeHeader){for(var headers=this.getGridColumns(),headersLn=headers.length,i=0;i<headersLn;i++)headers[i]!==activeHeader&&headers[i].setSortState(null,!0)},getVisibleGridColumns:function(){if(this.gridVisibleColumns)return this.gridVisibleColumns;var i,allColumns=this.getGridColumns(),result=[],len=allColumns.length;for(i=0;i<len;i++)allColumns[i].hidden||(result[result.length]=allColumns[i]);return this.gridVisibleColumns=result,result},getGridColumns:function(inResult,hiddenAncestor){if(!inResult&&this.gridDataColumns)return this.gridDataColumns;var items,i,len,item,lastVisibleColumn,me=this,result=inResult||[];if(hiddenAncestor=hiddenAncestor||me.hidden,me.items)for(items=me.items.items,i=0,len=items.length;i<len;i++)item=items[i],item.isGroupHeader?item.getGridColumns(result,hiddenAncestor):(item.hiddenAncestor=hiddenAncestor,result.push(item));if(inResult||(me.gridDataColumns=result),!inResult&&len){for(i=0,len=result.length;i<len;i++)item=result[i],item.isFirstVisible=item.isLastVisible=!1,item.hidden||item.hiddenAncestor||(lastVisibleColumn||(item.isFirstVisible=!0),lastVisibleColumn=item);lastVisibleColumn&&(lastVisibleColumn.isLastVisible=!0)}return result},getHideableColumns:function(){var me=this,result=me.hideableColumns;return result||(result=me.hideableColumns=me.query("[hideable]")),result},getHeaderIndex:function(header){return this.columnManager||(this.columnManager=this.getOwnerHeaderCt().columnManager),this.columnManager.getHeaderIndex(header)},getHeaderAtIndex:function(index){return this.columnManager||(this.columnManager=this.getOwnerHeaderCt().columnManager),this.columnManager.getHeaderAtIndex(index)},getVisibleHeaderClosestToIndex:function(index){return this.visibleColumnManager||(this.visibleColumnManager=this.getOwnerHeaderCt().visibleColumnManager),this.visibleColumnManager.getVisibleHeaderClosestToIndex(index)},applyForceFit:function(header){var len,i,item,maxAvailFlexOneColumn,myWidth,me=this,view=me.view,minWidth=Ext.grid.plugin.HeaderResizer.prototype.minColWidth,useMinWidthForFlex=!1,defaultWidth=Ext.grid.header.Container.prototype.defaultWidth,availFlex=me.el.getViewSize().width-(view.el.dom.scrollHeight>view.el.dom.clientHeight?Ext.getScrollbarSize().width:0),totalFlex=0,items=me.getVisibleGridColumns(),hidden=header.hidden;Ext.suspendLayouts(),maxAvailFlexOneColumn=availFlex-(items.length+1)*minWidth,header.flex=null,hidden?(myWidth=header.width||header.savedWidth,header.savedWidth=null):myWidth=view.getMaxContentWidth(header),myWidth>maxAvailFlexOneColumn?(header.width=maxAvailFlexOneColumn,useMinWidthForFlex=!0):(header.width=myWidth,availFlex-=myWidth+defaultWidth,function(){for(i=0,len=items.length;i<len;i++)(item=items[i])!==header&&(item.flex=item.flex||item.width||item.getWidth(),totalFlex+=item.flex,item.width=null)}()),function(){var isCurrentHeader;for(i=0,len=items.length;i<len;i++)item=items[i],isCurrentHeader=item===header,useMinWidthForFlex&&!isCurrentHeader?(item.flex=minWidth,item.width=null):isCurrentHeader||(myWidth=item.flex||defaultWidth,item.flex=Math.max(Math.ceil(myWidth/totalFlex*availFlex),minWidth),item.width=null),item.setWidth(item.width||item.flex)}(),Ext.resumeLayouts(!0)},autoSizeColumn:function(header){var view=this.view;view&&(view.autoSizeColumn(header),this.forceFit&&this.applyForceFit(header))}});Ext.define("Ext.grid.column.Column",{extend:"Ext.grid.header.Container",alias:"widget.gridcolumn",requires:["Ext.util.KeyNav","Ext.grid.ColumnComponentLayout","Ext.grid.ColumnLayout"],alternateClassName:"Ext.grid.Column",baseCls:Ext.baseCSSPrefix+"column-header",hoverCls:Ext.baseCSSPrefix+"column-header-over",handleWidth:4,ariaRole:"columnheader",sortState:null,possibleSortStates:["ASC","DESC"],childEls:["titleEl","triggerEl","textEl"],noWrap:!0,renderTpl:['<div id="{id}-titleEl" role="presentation" {tipMarkup}class="',Ext.baseCSSPrefix,"column-header-inner",'<tpl if="empty"> ',Ext.baseCSSPrefix,'column-header-inner-empty</tpl>">','<span id="{id}-textEl" class="',Ext.baseCSSPrefix,"column-header-text",'{childElCls}">',"{text}","</span>",'<tpl if="!menuDisabled">','<div id="{id}-triggerEl" role="presentation" class="',Ext.baseCSSPrefix,"column-header-trigger",'{childElCls}"></div>',"</tpl>","</div>","{%this.renderContainer(out,values)%}"],dataIndex:null,text:"&#160;",menuText:null,emptyCellText:"&#160;",sortable:!0,resizable:!0,hideable:!0,menuDisabled:!1,renderer:!1,editRenderer:!1,align:"left",draggable:!0,tooltipType:"qtip",initDraggable:Ext.emptyFn,tdCls:"",isHeader:!0,isColumn:!0,ascSortCls:Ext.baseCSSPrefix+"column-header-sort-ASC",descSortCls:Ext.baseCSSPrefix+"column-header-sort-DESC",componentLayout:"columncomponent",groupSubHeaderCls:Ext.baseCSSPrefix+"group-sub-header",groupHeaderCls:Ext.baseCSSPrefix+"group-header",clickTargetName:"titleEl",detachOnRemove:!0,initResizable:Ext.emptyFn,initComponent:function(){var renderer,listeners,me=this;null!=me.header&&(me.text=me.header,me.header=null),me.triStateSort||(me.possibleSortStates.length=2),null!=me.columns?(me.isGroupHeader=!0,me.dataIndex&&Ext.Error.raise("Ext.grid.column.Column: Group header may not accept a dataIndex"),(me.width&&me.width!==Ext.grid.header.Container.prototype.defaultWidth||me.flex)&&Ext.Error.raise("Ext.grid.column.Column: Group header does not support setting explicit widths or flexs. The group header width is calculated by the sum of its children."),me.items=me.columns,me.columns=me.flex=me.width=null,me.cls=(me.cls||"")+" "+me.groupHeaderCls,me.sortable=me.resizable=!1,me.align="center"):me.flex&&(me.minWidth=me.minWidth||Ext.grid.plugin.HeaderResizer.prototype.minColWidth),me.addCls(Ext.baseCSSPrefix+"column-header-align-"+me.align),renderer=me.renderer,renderer?("string"==typeof renderer&&(me.renderer=Ext.util.Format[renderer]),me.hasCustomRenderer=!0):me.defaultRenderer&&(me.scope=me,me.renderer=me.defaultRenderer),me.callParent(arguments),listeners={element:me.clickTargetName,click:me.onTitleElClick,contextmenu:me.onTitleElContextMenu,mouseenter:me.onTitleMouseOver,mouseleave:me.onTitleMouseOut,scope:me},me.resizable&&(listeners.dblclick=me.onTitleElDblClick),me.on(listeners)},initItems:function(){var me=this;me.callParent(arguments),me.isGroupHeader&&(me.hasVisibleChildren()||me.hide())},hasVisibleChildren:function(){var i,items=this.items.items,len=items.length;for(i=0;i<len;++i)if(!items[i].hidden)return!0;return!1},onAdd:function(child){var me=this,ownerHeaderCt=me.getOwnerHeaderCt();child.isColumn&&(child.isSubHeader=!0,child.addCls(this.groupSubHeaderCls)),me.hidden&&(ownerHeaderCt?child.hidden||me.show():child.hide()),me.callParent(arguments)},onRemove:function(child){var me=this;child.isSubHeader&&(child.isSubHeader=!1,child.removeCls(me.groupSubHeaderCls)),me.callParent(arguments),me.isGroupHeader&&!me.hasVisibleChildren()&&me.hide()},initRenderData:function(){var me=this,tipMarkup="",tip=me.tooltip,text=me.text,attr="qtip"==me.tooltipType?"data-qtip":"title";return Ext.isEmpty(tip)||(tipMarkup=attr+'="'+tip+'" '),Ext.applyIf(me.callParent(arguments),{text:text,empty:"&#160;"===text||" "===text||""===text,menuDisabled:me.menuDisabled,tipMarkup:tipMarkup})},applyColumnState:function(state){var me=this;me.applyColumnsState(state.columns),null!=state.hidden&&(me.hidden=state.hidden),null!=state.locked&&(me.locked=state.locked),null!=state.sortable&&(me.sortable=state.sortable),null!=state.width?(me.flex=null,me.width=state.width):null!=state.flex&&(me.width=null,me.flex=state.flex)},getColumnState:function(){var i,me=this,items=me.items.items,iLen=items?items.length:0,columns=[],state={id:me.getStateId()};if(me.savePropsToState(["hidden","sortable","locked","flex","width"],state),me.isGroupHeader){for(i=0;i<iLen;i++)columns.push(items[i].getColumnState());columns.length&&(state.columns=columns)}else me.isSubHeader&&me.ownerCt.hidden&&delete me.hidden;return"width"in state&&delete state.flex,state},getStateId:function(){return this.stateId||this.headerId},setText:function(text){this.text=text,this.rendered&&this.textEl.update(text)},getIndex:function(){return!this.isGroupColumn&&this.getOwnerHeaderCt().getHeaderIndex(this)},getVisibleIndex:function(){return!this.isGroupColumn&&Ext.Array.indexOf(this.getOwnerHeaderCt().getVisibleGridColumns(),this)},beforeRender:function(){var me=this,grid=me.up("tablepanel");me.callParent(),!grid||me.sortable&&!1!==grid.sortableColumns||me.groupable||me.lockable||!1!==grid.enableColumnHide&&me.getOwnerHeaderCt().getHideableColumns().length||(me.menuDisabled=!0),me.protoEl.unselectable()},afterRender:function(){var me=this,triggerEl=me.triggerEl;me.callParent(arguments),Ext.isIE8&&Ext.isStrict||me.mon(me.getFocusEl(),{focus:me.onTitleMouseOver,blur:me.onTitleMouseOut,scope:me}),triggerEl&&void 0===me.self.triggerElWidth&&(triggerEl.setStyle("display","block"),me.self.triggerElWidth=triggerEl.getWidth(),triggerEl.setStyle("display","")),me.keyNav=new Ext.util.KeyNav(me.el,{enter:me.onEnterKey,down:me.onDownKey,scope:me})},afterComponentLayout:function(width,height,oldWidth,oldHeight){var me=this,ownerHeaderCt=me.getOwnerHeaderCt();me.callParent(arguments),ownerHeaderCt&&(null!=oldWidth||me.flex)&&width!==oldWidth&&ownerHeaderCt.onHeaderResize(me,width,!0)},onDestroy:function(){var me=this;Ext.destroy(me.textEl,me.keyNav,me.field),me.keyNav=null,me.callParent(arguments)},onTitleMouseOver:function(){this.titleEl.addCls(this.hoverCls)},onTitleMouseOut:function(){this.titleEl.removeCls(this.hoverCls)},onDownKey:function(e){this.triggerEl&&this.onTitleElClick(e,this.triggerEl.dom||this.el.dom)},onEnterKey:function(e){this.onTitleElClick(e,this.el.dom)},onTitleElDblClick:function(e,t){var prev,leafColumns,me=this;if(me.isOnLeftEdge(e))(prev=me.previousNode("gridcolumn:not([hidden]):not([isGroupHeader])"))&&prev.getOwnerHeaderCt()===me.getOwnerHeaderCt()&&prev.autoSize();else if(me.isOnRightEdge(e)){if(me.isGroupHeader&&e.getPoint().isContainedBy(me.layout.innerCt))return leafColumns=me.query("gridcolumn:not([hidden]):not([isGroupHeader])"),void this.getOwnerHeaderCt().autoSizeColumn(leafColumns[leafColumns.length-1]);me.autoSize()}},autoSize:function(){var leafColumns,numLeaves,i,headerCt,me=this;if(me.isGroupHeader){for(leafColumns=me.query("gridcolumn:not([hidden]):not([isGroupHeader])"),numLeaves=leafColumns.length,headerCt=this.getOwnerHeaderCt(),Ext.suspendLayouts(),i=0;i<numLeaves;i++)headerCt.autoSizeColumn(leafColumns[i]);return void Ext.resumeLayouts(!0)}this.getOwnerHeaderCt().autoSizeColumn(this)},onTitleElClick:function(e,t){var me=this,ownerHeaderCt=me.getOwnerHeaderCt();ownerHeaderCt&&!ownerHeaderCt.ddLock&&(me.triggerEl&&(e.target===me.triggerEl.dom||t===me.triggerEl.dom||e.within(me.triggerEl))?ownerHeaderCt.onHeaderTriggerClick(me,e,t):(e.getKey()||!me.isOnLeftEdge(e)&&!me.isOnRightEdge(e))&&(me.toggleSortState(),ownerHeaderCt.onHeaderClick(me,e,t)))},onTitleElContextMenu:function(e,t){var me=this,ownerHeaderCt=me.getOwnerHeaderCt();ownerHeaderCt&&!ownerHeaderCt.ddLock&&ownerHeaderCt.onHeaderContextMenu(me,e,t)},processEvent:function(type,view,cell,recordIndex,cellIndex,e){return this.fireEvent.apply(this,arguments)},toggleSortState:function(){var idx,nextIdx,me=this;me.sortable&&(idx=Ext.Array.indexOf(me.possibleSortStates,me.sortState),nextIdx=(idx+1)%me.possibleSortStates.length,me.setSortState(me.possibleSortStates[nextIdx]))},doSort:function(state){var tablePanel=this.up("tablepanel"),store=tablePanel.store;tablePanel.ownerLockable&&store.isNodeStore&&(store=tablePanel.ownerLockable.lockedGrid.store),store.sort({property:this.getSortParam(),direction:state})},getSortParam:function(){return this.dataIndex},setSortState:function(state,skipClear,initial){var me=this,ascCls=me.ascSortCls,descCls=me.descSortCls,ownerHeaderCt=me.getOwnerHeaderCt(),oldSortState=me.sortState;if(state=state||null,!me.sorting&&oldSortState!==state&&null!=me.getSortParam()){switch(state&&!initial&&(me.sorting=!0,me.doSort(state),me.sorting=!1),state){case"DESC":me.addCls(descCls),me.removeCls(ascCls);break;case"ASC":me.addCls(ascCls),me.removeCls(descCls);break;default:me.removeCls([ascCls,descCls])}!ownerHeaderCt||me.triStateSort||skipClear||ownerHeaderCt.clearOtherSortStates(me),me.sortState=state,(me.triStateSort||null!=state)&&ownerHeaderCt.fireEvent("sortchange",ownerHeaderCt,me,state)}},isHideable:function(){var result={hideCandidate:this,result:this.hideable};return result.result&&this.ownerCt.bubble(this.hasOtherMenuEnabledChildren,null,[result]),result.result},hasOtherMenuEnabledChildren:function(result){var visibleChildren,count;return this.isXType("headercontainer")?(visibleChildren=this.query(">:not([hidden]):not([menuDisabled])"),count=visibleChildren.length,Ext.Array.contains(visibleChildren,result.hideCandidate)&&count--,!count&&void(result.hideCandidate=this)):(result.result=!1,!1)},isLockable:function(){var result={result:!1!==this.lockable};return result.result&&this.ownerCt.bubble(this.hasMultipleVisibleChildren,null,[result]),result.result},isLocked:function(){return this.locked||!!this.up("[isColumn][locked]","[isRootHeader]")},hasMultipleVisibleChildren:function(result){return this.isXType("headercontainer")?!(this.query(">:not([hidden])").length>1)&&void 0:(result.result=!1,!1)},hide:function(fromOwner){var item,items,len,i,me=this,ownerHeaderCt=me.getOwnerHeaderCt(),owner=me.ownerCt;if(!ownerHeaderCt)return me.callParent(),me;if(me.rendered&&!me.isVisible())return me;if(ownerHeaderCt.forceFit&&(me.visibleSiblingCount=ownerHeaderCt.getVisibleGridColumns().length-1,me.flex&&(me.savedWidth=me.getWidth(),me.flex=null)),owner.isGroupHeader&&!fromOwner&&(items=owner.query(">:not([hidden])"),1===items.length&&items[0]==me))return void me.ownerCt.hide();if(Ext.suspendLayouts(),me.isGroupHeader)for(items=me.items.items,i=0,len=items.length;i<len;i++)item=items[i],item.hidden||item.hide(!0);return me.callParent(),ownerHeaderCt.onHeaderHide(me),Ext.resumeLayouts(!0),me},show:function(fromOwner,fromChild){var items,len,i,item,me=this,ownerHeaderCt=me.getOwnerHeaderCt(),ownerCt=me.ownerCt;if(me.isVisible())return me;if(me.rendered&&ownerHeaderCt.forceFit&&ownerHeaderCt.applyForceFit(me),Ext.suspendLayouts(),me.isSubHeader&&ownerCt.hidden&&ownerCt.show(!1,!0),me.callParent(arguments),me.isGroupHeader&&!0!==fromChild&&!me.query(":not([hidden])").length)for(items=me.items.items,i=0,len=items.length;i<len;i++)item=items[i],item.hidden&&item.show(!0);Ext.resumeLayouts(!0),(ownerCt=me.getOwnerHeaderCt())&&ownerCt.onHeaderShow(me)},getDesiredWidth:function(){var me=this;return me.rendered&&me.componentLayout&&me.componentLayout.lastComponentSize?me.componentLayout.lastComponentSize.width:(me.flex,me.width)},getCellId:function(){return Ext.baseCSSPrefix+"grid-cell-headerId-"+this.getItemId()},getCellSelector:function(){return"."+this.getCellId()},getCellInnerSelector:function(){return this.getCellSelector()+" ."+Ext.baseCSSPrefix+"grid-cell-inner"},isOnLeftEdge:function(e){return e.getXY()[0]-this.getX()<=this.handleWidth},isOnRightEdge:function(e){return this.getX()+this.getWidth()-e.getXY()[0]<=this.handleWidth},setMenuActive:function(isMenuOpen){this.titleEl[isMenuOpen?"addCls":"removeCls"](this.headerOpenCls)}});Ext.define("Ext.grid.column.Action",{extend:"Ext.grid.column.Column",alias:["widget.actioncolumn"],alternateClassName:"Ext.grid.ActionColumn",actionIdRe:new RegExp(Ext.baseCSSPrefix+"action-col-(\\d+)"),altText:"",menuText:"<i>Actions</i>",sortable:!1,innerCls:Ext.baseCSSPrefix+"grid-cell-inner-action-col",constructor:function(config){var hasGetClass,i,len,me=this,cfg=Ext.apply({},config),items=cfg.items||me.items||[me];for(me.origRenderer=cfg.renderer||me.renderer,me.origScope=cfg.scope||me.scope,me.renderer=me.scope=cfg.renderer=cfg.scope=null,cfg.items=null,me.callParent([cfg]),me.items=items,i=0,len=items.length;i<len;++i)if(items[i].getClass){hasGetClass=!0;break}(me.origRenderer||hasGetClass)&&(me.hasCustomRenderer=!0)},defaultRenderer:function(v,meta,record,rowIdx,colIdx,store,view){var item,ret,disabled,tooltip,me=this,prefix=Ext.baseCSSPrefix,scope=me.origScope||me,items=me.items,len=items.length,i=0;for(ret=Ext.isFunction(me.origRenderer)?me.origRenderer.apply(scope,arguments)||"":"",meta.tdCls+=" "+Ext.baseCSSPrefix+"action-col-cell";i<len;i++)item=items[i],disabled=item.disabled||!!item.isDisabled&&item.isDisabled.call(item.scope||scope,view,rowIdx,colIdx,item,record),tooltip=disabled?null:item.tooltip||(item.getTip?item.getTip.apply(item.scope||scope,arguments):null),item.hasActionConfiguration||(item.stopSelection=me.stopSelection,item.disable=Ext.Function.bind(me.disableAction,me,[i],0),item.enable=Ext.Function.bind(me.enableAction,me,[i],0),item.hasActionConfiguration=!0),ret+='<img role="button" alt="'+(item.altText||me.altText)+'" src="'+(item.icon||Ext.BLANK_IMAGE_URL)+'" class="'+prefix+"action-col-icon "+prefix+"action-col-"+String(i)+" "+(disabled?prefix+"item-disabled":" ")+" "+(Ext.isFunction(item.getClass)?item.getClass.apply(item.scope||scope,arguments):item.iconCls||me.iconCls||"")+'"'+(tooltip?' data-qtip="'+tooltip+'"':"")+" />";return ret},enableAction:function(index,silent){var me=this;index?Ext.isNumber(index)||(index=Ext.Array.indexOf(me.items,index)):index=0,me.items[index].disabled=!1,me.up("tablepanel").el.select("."+Ext.baseCSSPrefix+"action-col-"+index).removeCls(me.disabledCls),silent||me.fireEvent("enable",me)},disableAction:function(index,silent){var me=this;index?Ext.isNumber(index)||(index=Ext.Array.indexOf(me.items,index)):index=0,me.items[index].disabled=!0,me.up("tablepanel").el.select("."+Ext.baseCSSPrefix+"action-col-"+index).addCls(me.disabledCls),silent||me.fireEvent("disable",me)},destroy:function(){return delete this.items,delete this.renderer,this.callParent(arguments)},processEvent:function(type,view,cell,recordIndex,cellIndex,e,record,row){var match,item,fn,disabled,me=this,target=e.getTarget(),key="keydown"==type&&e.getKey();if(key&&!Ext.fly(target).findParent(view.getCellSelector())&&(target=Ext.fly(cell).down("."+Ext.baseCSSPrefix+"action-col-icon",!0)),target&&(match=target.className.match(me.actionIdRe))&&(item=me.items[parseInt(match[1],10)],disabled=item.disabled||!!item.isDisabled&&item.isDisabled.call(item.scope||me.origScope||me,view,recordIndex,cellIndex,item,record),item&&!disabled))if("click"==type||key==e.ENTER||key==e.SPACE)(fn=item.handler||me.handler)&&fn.call(item.scope||me.origScope||me,view,recordIndex,cellIndex,item,e,record,row);else if("mousedown"==type&&!1!==item.stopSelection)return!1;return me.callParent(arguments)},cascade:function(fn,scope){fn.call(scope||this,this)},getRefItems:function(){return[]}});Ext.define("Ext.grid.column.Boolean",{extend:"Ext.grid.column.Column",alias:["widget.booleancolumn"],alternateClassName:"Ext.grid.BooleanColumn",trueText:"true",falseText:"false",undefinedText:"&#160;",defaultRenderer:function(value){return void 0===value?this.undefinedText:value&&"false"!==value?this.trueText:this.falseText}});Ext.define("Ext.grid.column.Check",{extend:"Ext.grid.column.Column",alternateClassName:["Ext.ux.CheckColumn","Ext.grid.column.CheckColumn"],alias:"widget.checkcolumn",align:"center",stopSelection:!0,tdCls:Ext.baseCSSPrefix+"grid-cell-checkcolumn",innerCls:Ext.baseCSSPrefix+"grid-cell-inner-checkcolumn",clickTargetName:"el",constructor:function(){this.addEvents("beforecheckchange","checkchange"),this.scope=this,this.callParent(arguments)},processEvent:function(type,view,cell,recordIndex,cellIndex,e,record,row){var me=this,key="keydown"===type&&e.getKey(),mousedown="mousedown"==type;if(me.disabled||!mousedown&&key!=e.ENTER&&key!=e.SPACE)return me.callParent(arguments);var dataIndex=me.dataIndex,checked=!record.get(dataIndex);return!1!==me.fireEvent("beforecheckchange",me,recordIndex,checked)?(record.set(dataIndex,checked),me.fireEvent("checkchange",me,recordIndex,checked),mousedown&&e.stopEvent(),me.stopSelection||view.selModel.selectByPosition({row:recordIndex,column:cellIndex}),!1):!me.stopSelection},onEnable:function(){this.callParent(arguments),this._setDisabled(!1)},onDisable:function(){this._setDisabled(!0)},_setDisabled:function(disabled){var items,me=this,cls=me.disabledCls;items=me.up("tablepanel").el.select(me.getCellSelector()),disabled?items.addCls(cls):items.removeCls(cls)},renderer:function(value,meta){var cssPrefix=Ext.baseCSSPrefix,cls=cssPrefix+"grid-checkcolumn";return this.disabled&&(meta.tdCls+=" "+this.disabledCls),value&&(cls+=" "+cssPrefix+"grid-checkcolumn-checked"),'<img class="'+cls+'" src="'+Ext.BLANK_IMAGE_URL+'"/>'}});Ext.define("Ext.grid.column.Date",{extend:"Ext.grid.column.Column",alias:["widget.datecolumn"],requires:["Ext.Date"],alternateClassName:"Ext.grid.DateColumn",initComponent:function(){this.format||(this.format=Ext.Date.defaultFormat),this.callParent(arguments)},defaultRenderer:function(value){return Ext.util.Format.date(value,this.format)}});Ext.define("Ext.grid.column.Number",{extend:"Ext.grid.column.Column",alias:["widget.numbercolumn"],requires:["Ext.util.Format"],alternateClassName:"Ext.grid.NumberColumn",format:"0,000.00",defaultRenderer:function(value){return Ext.util.Format.number(value,this.format)}});Ext.define("Ext.grid.column.Template",{extend:"Ext.grid.column.Column",alias:["widget.templatecolumn"],requires:["Ext.XTemplate"],alternateClassName:"Ext.grid.TemplateColumn",initComponent:function(){var me=this;me.tpl=!Ext.isPrimitive(me.tpl)&&me.tpl.compile?me.tpl:new Ext.XTemplate(me.tpl),me.hasCustomRenderer=!0,me.callParent(arguments)},defaultRenderer:function(value,meta,record){var data=Ext.apply({},record.data,record.getAssociatedData());return this.tpl.apply(data)}});Ext.define("Ext.grid.feature.Feature",{extend:"Ext.util.Observable",alias:"feature.feature",wrapsItem:!1,isFeature:!0,disabled:!1,hasFeatureEvent:!0,eventPrefix:null,eventSelector:null,view:null,grid:null,constructor:function(config){this.initialConfig=config,this.callParent(arguments)},clone:function(){return new this.self(this.initialConfig)},init:Ext.emptyFn,destroy:function(){this.clearListeners()},getFireEventArgs:function(eventName,view,featureTarget,e){return[eventName,view,featureTarget,e]},vetoEvent:Ext.emptyFn,enable:function(){this.disabled=!1},disable:function(){this.disabled=!0}});Ext.define("Ext.grid.feature.AbstractSummary",{extend:"Ext.grid.feature.Feature",alias:"feature.abstractsummary",summaryRowCls:Ext.baseCSSPrefix+"grid-row-summary",summaryTableCls:Ext.plainTableCls+" "+Ext.baseCSSPrefix+"grid-table",summaryRowSelector:"."+Ext.baseCSSPrefix+"grid-row-summary",summaryRowTpl:{before:function(values,out){if(values.record.isSummary&&this.summaryFeature.showSummaryRow)return this.summaryFeature.outputSummaryRecord(values.record,values,out),!1},priority:1e3},showSummaryRow:!0,init:function(){var me=this;me.view.summaryFeature=me,me.rowTpl=me.view.self.prototype.rowTpl,me.view.addRowTpl(me.summaryRowTpl).summaryFeature=me},toggleSummaryRow:function(visible){this.showSummaryRow=!!visible},outputSummaryRecord:function(summaryRecord,contextValues,out){var i,column,view=contextValues.view,savedRowValues=view.rowValues,columns=contextValues.columns||view.headerCt.getVisibleGridColumns(),colCount=columns.length,values={view:view,record:summaryRecord,rowStyle:"",rowClasses:[this.summaryRowCls],itemClasses:[],recordIndex:-1,rowId:view.getRowId(summaryRecord),columns:columns};for(i=0;i<colCount;i++)column=columns[i],column.savedRenderer=column.renderer,column.summaryRenderer?column.renderer=column.summaryRenderer:column.summaryType||(column.renderer=Ext.emptyFn),column.dataIndex||(column.dataIndex=column.id);for(view.rowValues=values,view.self.prototype.rowTpl.applyOut(values,out),view.rowValues=savedRowValues,i=0;i<colCount;i++)column=columns[i],column.renderer=column.savedRenderer,column.savedRenderer=null},getSummary:function(store,type,field,group){var records=group.records;if(type){if(Ext.isFunction(type))return store.getAggregate(type,null,records,[field]);switch(type){case"count":return records.length;case"min":return store.getMin(records,field);case"max":return store.getMax(records,field);case"sum":return store.getSum(records,field);case"average":return store.getAverage(records,field);default:return""}}},generateSummaryData:function(){var i,group,record,root,summaryRows,hasRemote,convertedSummaryRow,remoteData,me=this,store=me.view.store,groups=store.groups.items,reader=store.proxy.reader,len=groups.length,groupField=me.getGroupField(),data={},lockingPartner=me.lockingPartner;if(me.remoteRoot&&reader.rawData){for(hasRemote=!0,remoteData={},root=reader.root,reader.root=me.remoteRoot,reader.buildExtractors(!0),summaryRows=reader.getRoot(reader.rawData)||[],len=summaryRows.length,reader.convertRecordData||reader.buildExtractors(),i=0;i<len;++i)convertedSummaryRow={},reader.convertRecordData(convertedSummaryRow,summaryRows[i]),remoteData[convertedSummaryRow[groupField]]=convertedSummaryRow;reader.root=root,reader.buildExtractors(!0)}for(i=0;i<len;++i)group=groups[i],hasRemote||group.isDirty()||!group.hasAggregate()?(record=hasRemote?me.populateRemoteRecord(group,remoteData):me.populateRecord(group),lockingPartner&&me.view.ownerCt!==me.view.ownerCt.ownerLockable.normalGrid||group.commit()):record=group.getAggregateRecord(),data[group.key]=record;return data},populateRemoteRecord:function(group,data){var field,record=group.getAggregateRecord(!0),groupData=data[group.key];record.beginEdit();for(field in groupData)groupData.hasOwnProperty(field)&&field!==record.idProperty&&record.set(field,groupData[field]);return record.endEdit(!0),record.commit(!0),record},populateRecord:function(group){var i,column,fieldName,me=this,view=me.grid.ownerLockable?me.grid.ownerLockable.view:me.view,store=me.view.store,record=group.getAggregateRecord(),columns=view.headerCt.getGridColumns(),len=columns.length;for(record.beginEdit(),i=0;i<len;++i)column=columns[i],fieldName=column.dataIndex||column.id,record.set(fieldName,me.getSummary(store,column.summaryType,fieldName,group));return record.endEdit(!0),record.commit(),record}});Ext.define("Ext.grid.feature.GroupStore",{extend:"Ext.util.Observable",isStore:!0,defaultViewSize:100,isFeatureStore:!0,constructor:function(groupingFeature,store){var me=this;me.callParent(),me.groupingFeature=groupingFeature,me.bindStore(store)},bindStore:function(store){var me=this;me.store&&(Ext.destroy(me.storeListeners),me.store=null),store&&(me.storeListeners=store.on({bulkremove:me.onBulkRemove,add:me.onAdd,update:me.onUpdate,refresh:me.onRefresh,clear:me.onClear,scope:me,destroyable:!0}),me.store=store,me.processStore(store))},processStore:function(store){var i,group,groupPlaceholder,me=this,groups=store.getGroups(),groupCount=groups.length,data=me.data,oldGroupCache=me.groupingFeature.groupCache,groupCache=me.groupingFeature.clearGroupCache(),collapseAll=me.groupingFeature.startCollapsed;if(data?data.clear():data=me.data=new Ext.util.MixedCollection(!1,Ext.data.Store.recordIdFn),store.getCount())for(me.groupingFeature.startCollapsed=!1,i=0;i<groupCount;i++)group=groups[i],groupCache[group.name]=group,group.isCollapsed=collapseAll||oldGroupCache[group.name]&&oldGroupCache[group.name].isCollapsed,group.isCollapsed?(group.placeholder=groupPlaceholder=new store.model(null,"group-"+group.name+"-placeholder"),groupPlaceholder.set(store.getGroupField(),group.name),groupPlaceholder.rows=groupPlaceholder.children=group.children,groupPlaceholder.isCollapsedPlaceholder=!0,data.add(groupPlaceholder)):data.insert(me.data.length,group.children)},isCollapsed:function(name){return this.groupingFeature.groupCache[name].isCollapsed},isInCollapsedGroup:function(record){var groupData,store=this.store;return!(!store.isGrouped()||!(groupData=this.groupingFeature.groupCache[record.get(store.getGroupField())]))&&(groupData.isCollapsed||!1)},getCount:function(){return this.data.getCount()},getTotalCount:function(){return this.data.getCount()},rangeCached:function(start,end){return end<this.getCount()},getRange:function(start,end,options){var result=this.data.getRange(start,end);return options&&options.callback&&options.callback.call(options.scope||this,result,start,end,options),result},getAt:function(index){return this.getRange(index,index)[0]},getById:function(id){return this.store.getById(id)},expandGroup:function(group){var startIdx,me=this;"string"==typeof group&&(group=me.groupingFeature.groupCache[group]),group&&group.children.length&&-1!==(startIdx=me.indexOf(group.children[0],!0,!0))&&(group.isCollapsed=!1,me.isExpandingOrCollapsing=1,me.data.removeAt(startIdx),me.fireEvent("bulkremove",me,[me.getGroupPlaceholder(group)],[startIdx]),me.data.insert(startIdx,group.children),me.fireEvent("add",me,group.children,startIdx),me.fireEvent("groupexpand",me,group),me.isExpandingOrCollapsing=0)},collapseGroup:function(group){var startIdx,placeholder,i,j,len,removeIndices,me=this;if("string"==typeof group&&(group=me.groupingFeature.groupCache[group]),group&&(len=group.children.length)&&-1!==(startIdx=me.indexOf(group.children[0],!0))){for(group.isCollapsed=!0,me.isExpandingOrCollapsing=2,me.data.removeRange(startIdx,len),removeIndices=new Array(len),i=0,j=startIdx;i<len;i++,j++)removeIndices[i]=j;me.fireEvent("bulkremove",me,group.children,removeIndices),me.data.insert(startIdx,placeholder=me.getGroupPlaceholder(group)),me.fireEvent("add",me,[placeholder],startIdx),me.fireEvent("groupcollapse",me,group),me.isExpandingOrCollapsing=0}},getGroupPlaceholder:function(group){if(!group.placeholder){var groupPlaceholder=group.placeholder=new this.store.model(null,"group-"+group.name+"-placeholder");groupPlaceholder.set(this.store.getGroupField(),group.name),groupPlaceholder.rows=groupPlaceholder.children=group.children,groupPlaceholder.isCollapsedPlaceholder=!0}return group.placeholder},indexOf:function(record,viewOnly,includeCollapsed){var groups,groupCount,i,group,groupIndex,me=this,result=0;if(record&&(includeCollapsed||!me.isInCollapsedGroup(record)))for(groups=me.store.getGroups(),groupCount=groups.length,i=0;i<groupCount;i++){if(group=groups[i],group.name===this.store.getGroupString(record))return groupIndex=Ext.Array.indexOf(group.children,record),result+groupIndex;result+=viewOnly&&me.isCollapsed(group.name)?1:group.children.length}return-1},indexOfTotal:function(record){return this.store.indexOf(record)},onRefresh:function(store){this.processStore(this.store),this.fireEvent("refresh",this)},onBulkRemove:function(store,records,indices){this.processStore(this.store),this.fireEvent("refresh",this)},onClear:function(store,records,startIndex){this.processStore(this.store),this.fireEvent("clear",this)},onAdd:function(store,records,startIndex){this.processStore(this.store),this.fireEvent("refresh",this)},onUpdate:function(store,record,operation,modifiedFieldNames){var groupInfo,firstRec,lastRec,me=this;if(store.isGrouped()){if(groupInfo=record.group=me.groupingFeature.getRecordGroup(record),modifiedFieldNames&&Ext.Array.contains(modifiedFieldNames,me.groupingFeature.getGroupField()))return me.onRefresh(me.store);groupInfo.isCollapsed?me.fireEvent("update",me,groupInfo.placeholder):(Ext.suspendLayouts(),me.fireEvent("update",me,record,operation,modifiedFieldNames),firstRec=groupInfo.children[0],lastRec=groupInfo.children[groupInfo.children.length-1],firstRec!==record&&(firstRec.group=groupInfo,me.fireEvent("update",me,firstRec,"edit"),delete firstRec.group),lastRec!==record&&lastRec!==firstRec&&me.groupingFeature.showSummaryRow&&(lastRec.group=groupInfo,me.fireEvent("update",me,lastRec,"edit"),delete lastRec.group),Ext.resumeLayouts(!0)),delete record.group}else me.fireEvent("update",me,record,operation,modifiedFieldNames)}});Ext.define("Ext.grid.feature.Grouping",{extend:"Ext.grid.feature.Feature",mixins:{summary:"Ext.grid.feature.AbstractSummary"},requires:["Ext.grid.feature.GroupStore"],alias:"feature.grouping",eventPrefix:"group",groupCls:Ext.baseCSSPrefix+"grid-group-hd",eventSelector:"."+Ext.baseCSSPrefix+"grid-group-hd",refreshData:{},groupInfo:{},wrapsItem:!0,groupHeaderTpl:"{columnName}: {name}",depthToIndent:17,collapsedCls:Ext.baseCSSPrefix+"grid-group-collapsed",hdCollapsedCls:Ext.baseCSSPrefix+"grid-group-hd-collapsed",hdNotCollapsibleCls:Ext.baseCSSPrefix+"grid-group-hd-not-collapsible",collapsibleCls:Ext.baseCSSPrefix+"grid-group-hd-collapsible",ctCls:Ext.baseCSSPrefix+"group-hd-container",groupByText:"Group by this field",showGroupsText:"Show in groups",hideGroupedHeader:!1,startCollapsed:!1,enableGroupingMenu:!0,enableNoGroups:!0,collapsible:!0,expandTip:"Click to expand. CTRL key collapses all others",collapseTip:"Click to collapse. CTRL/click collapses all others",showSummaryRow:!1,tableTpl:{before:function(values){this.groupingFeature.disabled||1===values.rows.length&&values.rows[0].isSummary||this.groupingFeature.setup(values.rows,values.view.rowValues)},after:function(values){this.groupingFeature.disabled||1===values.rows.length&&values.rows[0].isSummary||this.groupingFeature.cleanup(values.rows,values.view.rowValues)},priority:200},groupTpl:["{%","var me = this.groupingFeature;","if (me.disabled) {","values.needsWrap = false;","} else {","me.setupRowData(values.record, values.rowIndex, values);","}","%}",'<tpl if="needsWrap">','<tr {[values.isCollapsedGroup ? ("id=\\"" + values.rowId + "\\"") : ""]} data-boundView="{view.id}" data-recordId="{record.internalId:htmlEncode}" data-recordIndex="{[values.isCollapsedGroup ? -1 : values.recordIndex]}" ','class="{[values.itemClasses.join(" ")]} ',Ext.baseCSSPrefix,'grid-wrap-row<tpl if="!summaryRecord"> ',Ext.baseCSSPrefix,'grid-group-row</tpl>" {ariaRowAttr}>','<td class="',Ext.baseCSSPrefix,'group-hd-container" colspan="{columns.length}" {ariaCellAttr}>','<tpl if="isFirstRow">',"{%",'var groupTitleStyle = (!values.view.lockingPartner || (values.view.ownerCt === values.view.ownerCt.ownerLockable.lockedGrid) || (values.view.lockingPartner.headerCt.getVisibleGridColumns().length === 0)) ? "" : "visibility:hidden";',"%}",'<div id="{groupId}" class="',Ext.baseCSSPrefix,'grid-group-hd {collapsibleCls}" tabIndex="0" hidefocus="on" {ariaCellInnerAttr}>','<div class="',Ext.baseCSSPrefix,'grid-group-title" style="{[groupTitleStyle]}" {ariaGroupTitleAttr}>','{[values.groupHeaderTpl.apply(values.groupInfo, parent) || "&#160;"]}',"</div>","</div>","</tpl>",'<tpl if="summaryRecord || !isCollapsedGroup">','<table class="',Ext.baseCSSPrefix,"{view.id}-table ",Ext.baseCSSPrefix,"grid-table",'<tpl if="summaryRecord"> ',Ext.baseCSSPrefix,'grid-table-summary</tpl>"','border="0" cellspacing="0" cellpadding="0" style="width:100%" {ariaSummaryTableAttr}>',"{[values.view.renderColumnSizer(out)]}",'<tpl if="!isCollapsedGroup">',"{%","values.itemClasses.length = 0;","this.nextTpl.applyOut(values, out, parent);","%}","</tpl>",'<tpl if="summaryRecord">',"{%me.outputSummaryRecord(values.summaryRecord, values, out);%}","</tpl>","</table>","</tpl>","</td>","</tr>","<tpl else>","{%this.nextTpl.applyOut(values, out, parent);%}","</tpl>",{priority:200,syncRowHeights:function(firstRow,secondRow){firstRow=Ext.fly(firstRow,"syncDest"),secondRow=Ext.fly(secondRow,"sycSrc");var secondHd,secondSummaryRow,firstHeight,secondHeight,owner=this.owner,firstHd=firstRow.down(owner.eventSelector,!0),firstSummaryRow=firstRow.down(owner.summaryRowSelector,!0);firstHd&&(secondHd=secondRow.down(owner.eventSelector,!0))&&(firstHd.style.height=secondHd.style.height="",(firstHeight=firstHd.offsetHeight)>(secondHeight=secondHd.offsetHeight)?Ext.fly(secondHd).setHeight(firstHeight):secondHeight>firstHeight&&Ext.fly(firstHd).setHeight(secondHeight)),firstSummaryRow&&(secondSummaryRow=secondRow.down(owner.summaryRowSelector,!0))&&(firstSummaryRow.style.height=secondSummaryRow.style.height="",(firstHeight=firstSummaryRow.offsetHeight)>(secondHeight=secondSummaryRow.offsetHeight)?Ext.fly(secondSummaryRow).setHeight(firstHeight):secondHeight>firstHeight&&Ext.fly(firstSummaryRow).setHeight(secondHeight))},syncContent:function(destRow,sourceRow){destRow=Ext.fly(destRow,"syncDest"),sourceRow=Ext.fly(sourceRow,"sycSrc");var owner=this.owner,destHd=destRow.down(owner.eventSelector,!0),sourceHd=sourceRow.down(owner.eventSelector,!0),destSummaryRow=destRow.down(owner.summaryRowSelector,!0),sourceSummaryRow=sourceRow.down(owner.summaryRowSelector,!0);destHd&&sourceHd&&Ext.fly(destHd).syncContent(sourceHd),destSummaryRow&&sourceSummaryRow&&Ext.fly(destSummaryRow).syncContent(sourceSummaryRow)}}],constructor:function(){this.groupCache={},this.callParent(arguments)},init:function(grid){var me=this,view=me.view;view.store.groupField&&(view.isGrouping=!0),me.lockingPartner&&me.lockingPartner.groupCache&&(me.groupCache=me.lockingPartner.groupCache),me.mixins.summary.init.call(me),me.callParent(arguments),view.headerCt.on({columnhide:me.onColumnHideShow,columnshow:me.onColumnHideShow,columnmove:me.onColumnMove,scope:me}),view.addTableTpl(me.tableTpl).groupingFeature=me,view.addRowTpl(Ext.XTemplate.getTpl(me,"groupTpl")).groupingFeature=me,view.preserveScrollOnRefresh=!0,view.store.buffered?me.collapsible=!1:this.lockingPartner&&this.lockingPartner.dataSource?me.dataSource=view.dataSource=this.lockingPartner.dataSource:me.dataSource=view.dataSource=new Ext.grid.feature.GroupStore(me,view.store),me.grid.on({reconfigure:me.onReconfigure}),view.on({afterrender:me.afterViewRender,scope:me,single:!0})},indexOf:function(record){var storeGroups,i,length,storeGroup,myGroup,groupStart,me=this,store=me.view.store,recordIdx=record.isModel?store.indexOf(record):Math.min(Math.max(record,0),store.getCount()-1),nextGroupStart=0,skippedRecords=0;for(storeGroups=store.getGroups(),i=0,length=storeGroups.length;i<length;i++){if(storeGroup=storeGroups[i],myGroup=me.getGroup(storeGroup.name),groupStart=nextGroupStart,nextGroupStart=groupStart+storeGroup.children.length,recordIdx<nextGroupStart)return recordIdx-skippedRecords;myGroup.isCollapsed&&(skippedRecords+=storeGroup.children.length,skippedRecords-=1)}},isInCollapsedGroup:function(record){var groupData;return!(!this.view.store.isGrouped()||!(groupData=this.getGroup(record)))&&(groupData.isCollapsed||!1)},clearGroupCache:function(){var me=this,groupCache=me.groupCache={};return me.lockingPartner&&(me.lockingPartner.groupCache=groupCache),groupCache},vetoEvent:function(record,row,rowIndex,e){if("mouseover"!==e.type&&"mouseout"!==e.type&&"mouseenter"!==e.type&&"mouseleave"!==e.type&&e.getTarget(this.eventSelector))return!1},enable:function(){var groupToggleMenuItem,me=this,view=me.view,store=view.store;view.isGrouping=!0,me.lastGroupers&&(me.block(),store.group(me.lastGroupers),me.lastGroupers=null,me.unblock()),me.callParent(),groupToggleMenuItem=me.view.headerCt.getMenu().down("#groupToggleMenuItem"),groupToggleMenuItem&&groupToggleMenuItem.setChecked(!0,!0),me.refreshIf()},disable:function(){var groupToggleMenuItem,me=this,view=me.view,store=view.store,lastGroupers=store.groupers.getRange();view.isGrouping=!1,lastGroupers.length&&(me.lastGroupers=lastGroupers,me.block(),store.clearGrouping(),me.unblock()),me.callParent(),groupToggleMenuItem=me.view.headerCt.getMenu().down("#groupToggleMenuItem"),groupToggleMenuItem&&groupToggleMenuItem.setChecked(!1,!0),me.refreshIf()},refreshIf:function(){var ownerCt=this.grid.ownerCt,view=this.view;view.store.remoteGroup||this.blockRefresh||(ownerCt&&ownerCt.lockable?ownerCt.view.refresh():view.refresh())},afterViewRender:function(){var me=this;me.view.on({scope:me,groupclick:me.onGroupClick}),me.enableGroupingMenu&&me.injectGroupingMenu(),me.pruneGroupedHeader(),me.lastGroupers=me.view.store.groupers.getRange(),me.block(),me.onGroupChange(),me.unblock(),me.disabled&&me.disable()},injectGroupingMenu:function(){var me=this,headerCt=me.view.headerCt;headerCt.showMenuBy=me.showMenuBy,headerCt.getMenuItems=me.getMenuItems()},onColumnHideShow:function(headerOwnerCt,header){var items,len,i,view=this.view,headerCt=view.headerCt,menu=headerCt.getMenu(),groupToggleMenuItem=menu.down("#groupMenuItem"),colCount=this.grid.getVisibleColumnManager().getColumns().length;if(groupToggleMenuItem&&(headerCt.getVisibleGridColumns().length>1?groupToggleMenuItem.enable():groupToggleMenuItem.disable()),view.rendered)for(items=view.el.query("."+this.ctCls),i=0,len=items.length;i<len;++i)items[i].colSpan=colCount},onColumnMove:function(){var groups,groupName,group,firstRec,lastRec,me=this,store=me.view.store;if(store.isGrouped()){groups=me.groupCache;for(groupName in groups)groups.hasOwnProperty(groupName)&&(group=groups[groupName],firstRec=group.children[0],lastRec=group.children[group.children.length-1],store.fireEvent("update",store,firstRec,"edit",null),lastRec!==firstRec&&me.showSummaryRow&&store.fireEvent("update",store,lastRec,"edit",null))}},showMenuBy:function(t,header){var menu=this.getMenu(),groupMenuItem=menu.down("#groupMenuItem"),groupMenuMeth=!1===header.groupable||null==header.dataIndex||this.view.headerCt.getVisibleGridColumns().length<2?"disable":"enable",groupToggleMenuItem=menu.down("#groupToggleMenuItem"),isGrouped=this.view.store.isGrouped();groupMenuItem[groupMenuMeth](),groupToggleMenuItem&&(groupToggleMenuItem.setChecked(isGrouped,!0),groupToggleMenuItem[isGrouped?"enable":"disable"]()),Ext.grid.header.Container.prototype.showMenuBy.apply(this,arguments)},getMenuItems:function(){var me=this,groupByText=me.groupByText,disabled=me.disabled||!me.getGroupField(),showGroupsText=me.showGroupsText,enableNoGroups=me.enableNoGroups,getMenuItems=me.view.headerCt.getMenuItems;return function(){var o=getMenuItems.call(this);return o.push("-",{iconCls:Ext.baseCSSPrefix+"group-by-icon",itemId:"groupMenuItem",text:groupByText,handler:me.onGroupMenuItemClick,scope:me}),enableNoGroups&&o.push({itemId:"groupToggleMenuItem",text:showGroupsText,checked:!disabled,checkHandler:me.onGroupToggleMenuItemClick,scope:me}),o}},onGroupMenuItemClick:function(menuItem,e){var me=this,menu=menuItem.parentMenu,hdr=menu.activeHeader,view=me.view,store=view.store;me.lastGroupers=null,me.block(),me.enable(),store.group(hdr.dataIndex),me.pruneGroupedHeader(),me.unblock(),me.refreshIf()},block:function(fromPartner){this.blockRefresh=this.view.blockRefresh=!0,this.lockingPartner&&!fromPartner&&this.lockingPartner.block(!0)},unblock:function(fromPartner){this.blockRefresh=this.view.blockRefresh=!1,this.lockingPartner&&!fromPartner&&this.lockingPartner.unblock(!0)},onGroupToggleMenuItemClick:function(menuItem,checked){this[checked?"enable":"disable"]()},pruneGroupedHeader:function(){var me=this,header=me.getGroupedHeader();me.hideGroupedHeader&&header&&(Ext.suspendLayouts(),me.prunedHeader&&me.prunedHeader!==header&&me.prunedHeader.show(),me.prunedHeader=header,header.hide(),Ext.resumeLayouts(!0))},getHeaderNode:function(groupName){return Ext.get(this.createGroupId(groupName))},getGroup:function(name){name.isModel&&(name=name.get(this.view.store.getGroupField()));var cache=this.groupCache,item=cache[name];return item||(item=cache[name]={isCollapsed:!1}),item},isExpanded:function(groupName){return!this.getGroup(groupName).isCollapsed},expand:function(groupName,focus){this.doCollapseExpand(!1,groupName,focus)},expandAll:function(){var groupName,me=this,groupCache=me.groupCache,lockingPartner=me.lockingPartner;for(groupName in groupCache)groupCache.hasOwnProperty(groupName)&&(groupCache[groupName].isCollapsed=!1);Ext.suspendLayouts(),me.dataSource.onRefresh(),Ext.resumeLayouts(!0);for(groupName in groupCache)groupCache.hasOwnProperty(groupName)&&(me.afterCollapseExpand(!1,groupName),lockingPartner&&lockingPartner.afterCollapseExpand(!1,groupName))},collapse:function(groupName,focus){this.doCollapseExpand(!0,groupName,focus)},isAllCollapsed:function(){var groupName,me=this,groupCache=me.groupCache;for(groupName in groupCache)if(groupCache.hasOwnProperty(groupName)&&!groupCache[groupName].isCollapsed)return!1;return!0},isAllExpanded:function(){var groupName,me=this,groupCache=me.groupCache;for(groupName in groupCache)if(groupCache.hasOwnProperty(groupName)&&groupCache[groupName].isCollapsed)return!1;return!0},collapseAll:function(){var groupName,me=this,groupCache=me.groupCache,lockingPartner=me.lockingPartner;for(groupName in groupCache)groupCache.hasOwnProperty(groupName)&&(groupCache[groupName].isCollapsed=!0);Ext.suspendLayouts(),me.dataSource.onRefresh(),lockingPartner&&!lockingPartner.isAllCollapsed()&&lockingPartner.collapseAll(),Ext.resumeLayouts(!0);for(groupName in groupCache)groupCache.hasOwnProperty(groupName)&&(me.afterCollapseExpand(!0,groupName),lockingPartner&&lockingPartner.afterCollapseExpand(!0,groupName))},doCollapseExpand:function(collapsed,groupName,focus){var me=this,lockingPartner=me.lockingPartner,group=me.groupCache[groupName];group.isCollapsed!=collapsed&&(Ext.suspendLayouts(),collapsed?me.dataSource.collapseGroup(group):me.dataSource.expandGroup(group),Ext.resumeLayouts(!0),me.afterCollapseExpand(collapsed,groupName,focus),lockingPartner&&lockingPartner.afterCollapseExpand(collapsed,groupName,!1))},afterCollapseExpand:function(collapsed,groupName,focus){var header,me=this,view=me.view;header=Ext.get(this.getHeaderNode(groupName)),view.fireEvent(collapsed?"groupcollapse":"groupexpand",view,header,groupName),focus&&header.up(view.getItemSelector()).scrollIntoView(view.el,null,!0)},onGroupChange:function(){var menuItem,visibleGridColumns,groupingByLastVisibleColumn,me=this,field=me.getGroupField();me.hideGroupedHeader&&(me.lastGroupers&&me.lastGroupers.length&&(menuItem=me.getMenuItem(me.lastGroupers[0].property))&&menuItem.setChecked(!0),field&&(visibleGridColumns=me.view.headerCt.getVisibleGridColumns(),groupingByLastVisibleColumn=1===visibleGridColumns.length&&visibleGridColumns[0].dataIndex==field,(menuItem=me.getMenuItem(field))&&!groupingByLastVisibleColumn&&menuItem.setChecked(!1))),me.refreshIf(),me.lastGroupers=me.view.store.groupers.getRange()},getMenuItem:function(dataIndex){var view=this.view,header=view.headerCt.down("gridcolumn[dataIndex="+dataIndex+"]"),menu=view.headerCt.getMenu();return header?menu.down("menuitem[headerId="+header.id+"]"):null},onGroupKey:function(keyCode,event){var me=this,groupName=me.getGroupName(event.target);groupName&&me.onGroupClick(me.view,event.target,groupName,event)},onGroupClick:function(view,rowElement,groupName,e){var g,me=this,groupCache=me.groupCache,groupIsCollapsed=!me.isExpanded(groupName);if(me.collapsible){if(e.ctrlKey){Ext.suspendLayouts();for(g in groupCache)g===groupName?groupIsCollapsed&&me.expand(groupName):me.doCollapseExpand(!0,g,!1);return void Ext.resumeLayouts(!0)}groupIsCollapsed?me.expand(groupName):me.collapse(groupName)}},setupRowData:function(record,idx,rowValues){var grouper,groupName,prev,next,me=this,data=me.refreshData,groupInfo=me.groupInfo,header=data.header,groupField=data.groupField,dataSource=me.view.dataSource;if(rowValues.isCollapsedGroup=!1,rowValues.summaryRecord=null,data.doGrouping){if(grouper=me.view.store.groupers.first(),record.children)return groupName=grouper.getGroupString(record.children[0]),rowValues.isFirstRow=rowValues.isLastRow=!0,rowValues.itemClasses.push(me.hdCollapsedCls),rowValues.isCollapsedGroup=rowValues.needsWrap=!0,rowValues.groupInfo=groupInfo,groupInfo.groupField=groupField,groupInfo.name=groupName,groupInfo.groupValue=record.children[0].get(groupField),groupInfo.columnName=header?header.text:groupField,rowValues.collapsibleCls=me.collapsible?me.collapsibleCls:me.hdNotCollapsibleCls,rowValues.groupId=me.createGroupId(groupName),groupInfo.rows=groupInfo.children=record.children,void(me.showSummaryRow&&(rowValues.summaryRecord=data.summaryData[groupName]));groupName=grouper.getGroupString(record),record.group?(rowValues.isFirstRow=record===record.group.children[0],rowValues.isLastRow=record===record.group.children[record.group.children.length-1]):(rowValues.isFirstRow=0===idx,rowValues.isFirstRow||(prev=dataSource.getAt(idx-1))&&(rowValues.isFirstRow=!prev.isEqual(grouper.getGroupString(prev),groupName)),rowValues.isLastRow=idx==dataSource.getTotalCount()-1,rowValues.isLastRow||(next=dataSource.getAt(idx+1))&&(rowValues.isLastRow=!next.isEqual(grouper.getGroupString(next),groupName))),rowValues.isFirstRow&&(groupInfo.groupField=groupField,groupInfo.name=groupName,groupInfo.groupValue=record.get(groupField),groupInfo.columnName=header?header.text:groupField,rowValues.collapsibleCls=me.collapsible?me.collapsibleCls:me.hdNotCollapsibleCls,rowValues.groupId=me.createGroupId(groupName),me.isExpanded(groupName)||(rowValues.itemClasses.push(me.hdCollapsedCls),rowValues.isCollapsedGroup=!0),dataSource.buffered?groupInfo.rows=groupInfo.children=[]:groupInfo.rows=groupInfo.children=me.getRecordGroup(record).children,rowValues.groupInfo=groupInfo),rowValues.isLastRow&&me.showSummaryRow&&(rowValues.summaryRecord=data.summaryData[groupName]),rowValues.needsWrap=rowValues.isFirstRow||rowValues.summaryRecord}},setup:function(rows,rowValues){var me=this,data=me.refreshData,isGrouping=!me.disabled&&me.view.store.isGrouped();me.skippedRows=0,rowValues.view.bufferedRenderer&&(rowValues.view.bufferedRenderer.variableRowHeight=!0),data.groupField=me.getGroupField(),data.header=me.getGroupedHeader(data.groupField),data.doGrouping=isGrouping,rowValues.groupHeaderTpl=Ext.XTemplate.getTpl(me,"groupHeaderTpl"),isGrouping&&me.showSummaryRow&&(data.summaryData=me.generateSummaryData())},cleanup:function(rows,rowValues){var data=this.refreshData;rowValues.groupInfo=rowValues.groupHeaderTpl=rowValues.isFirstRow=null,data.groupField=data.header=null},getGroupName:function(element){var parts,targetEl,row,me=this,view=me.view,eventSelector=me.eventSelector;if(targetEl=Ext.fly(element).findParent(eventSelector),targetEl||(row=Ext.fly(element).findParent(view.itemSelector))&&(targetEl=row.down(eventSelector,!0)),targetEl&&(parts=targetEl.id.split(view.id+"-hd-"),2===parts.length))return Ext.htmlDecode(parts[1])},getRecordGroup:function(record){var grouper=this.view.store.groupers.first();if(grouper)return this.groupCache[grouper.getGroupString(record)]},createGroupId:function(group){return this.view.id+"-hd-"+Ext.htmlEncode(group)},createGroupCls:function(group){return this.view.id+"-"+Ext.htmlEncode(group)+"-item"},getGroupField:function(){return this.view.store.getGroupField()},getGroupedHeader:function(groupField){var selector,header,me=this,headerCt=me.view.headerCt,partner=me.lockingPartner;return groupField=groupField||this.getGroupField(),groupField&&(selector="[dataIndex="+groupField+"]",!(header=headerCt.down(selector))&&partner&&(header=partner.view.headerCt.down(selector))),header||null},getFireEventArgs:function(type,view,targetEl,e){return[type,view,targetEl,this.getGroupName(targetEl),e]},destroy:function(){var me=this,dataSource=me.dataSource;me.view=me.prunedHeader=me.grid=me.groupCache=me.dataSource=null,me.callParent(),dataSource&&dataSource.bindStore(null)},onReconfigure:function(grid,store,columns,oldStore,oldColumns){var me=grid;store&&store!==oldStore&&(store.buffered!==oldStore.buffered&&Ext.Error.raise("Cannot reconfigure grouping switching between buffered and non-buffered stores"),store.buffered&&(me.bindStore(store),me.dataSource.processStore(store)))}});Ext.define("Ext.grid.locking.HeaderContainer",{extend:"Ext.grid.header.Container",requires:["Ext.grid.ColumnManager"],constructor:function(lockable){var events,event,me=this,eventNames=[],lockedGrid=lockable.lockedGrid,normalGrid=lockable.normalGrid;me.lockable=lockable,me.callParent(),lockedGrid.visibleColumnManager.rootColumns=normalGrid.visibleColumnManager.rootColumns=lockable.visibleColumnManager=me.visibleColumnManager=new Ext.grid.ColumnManager(!0,lockedGrid.headerCt,normalGrid.headerCt),lockedGrid.columnManager.rootColumns=normalGrid.columnManager.rootColumns=lockable.columnManager=me.columnManager=new Ext.grid.ColumnManager(!1,lockedGrid.headerCt,normalGrid.headerCt),events=lockedGrid.headerCt.events;for(event in events)events.hasOwnProperty(event)&&eventNames.push(event);me.relayEvents(lockedGrid.headerCt,eventNames),me.relayEvents(normalGrid.headerCt,eventNames)},getRefItems:function(){return this.lockable.lockedGrid.headerCt.getRefItems().concat(this.lockable.normalGrid.headerCt.getRefItems())},getGridColumns:function(){return this.lockable.lockedGrid.headerCt.getGridColumns().concat(this.lockable.normalGrid.headerCt.getGridColumns())},getColumnsState:function(){var me=this,locked=me.lockable.lockedGrid.headerCt.getColumnsState(),normal=me.lockable.normalGrid.headerCt.getColumnsState();return locked.concat(normal)},applyColumnsState:function(columns){var i,existing,lockedDefault,col,me=this,lockedGrid=me.lockable.lockedGrid,lockedHeaderCt=lockedGrid.headerCt,normalHeaderCt=me.lockable.normalGrid.headerCt,lockedCols=Ext.Array.toValueMap(lockedHeaderCt.items.items,"headerId"),normalCols=Ext.Array.toValueMap(normalHeaderCt.items.items,"headerId"),locked=[],normal=[],lockedWidth=1,length=columns.length;for(i=0;i<length;i++)col=columns[i],lockedDefault=lockedCols[col.id],(existing=lockedDefault||normalCols[col.id])&&(existing.applyColumnState&&existing.applyColumnState(col),void 0===existing.locked&&(existing.locked=!!lockedDefault),existing.locked?(locked.push(existing),existing.hidden||"number"!=typeof existing.width||(lockedWidth+=existing.width)):normal.push(existing));locked.length+normal.length==lockedHeaderCt.items.getCount()+normalHeaderCt.items.getCount()&&(lockedHeaderCt.removeAll(!1),normalHeaderCt.removeAll(!1),lockedHeaderCt.add(locked),normalHeaderCt.add(normal),lockedGrid.setWidth(lockedWidth))}});Ext.define("Ext.grid.locking.View",{alternateClassName:"Ext.grid.LockingView",mixins:{observable:"Ext.util.Observable"},isLockingView:!0,eventRelayRe:/^(beforeitem|beforecontainer|item|container|cell|refresh)/,constructor:function(config){var events,event,me=this,eventNames=[],eventRe=me.eventRelayRe,locked=config.locked.getView(),normal=config.normal.getView();Ext.apply(me,{lockedView:locked,normalView:normal,lockedGrid:config.locked,normalGrid:config.normal,panel:config.panel}),me.mixins.observable.constructor.call(me,config),events=locked.events;for(event in events)events.hasOwnProperty(event)&&eventRe.test(event)&&eventNames.push(event);me.relayEvents(locked,eventNames),me.relayEvents(normal,eventNames),normal.on({scope:me,itemmouseleave:me.onItemMouseLeave,itemmouseenter:me.onItemMouseEnter}),locked.on({scope:me,itemmouseleave:me.onItemMouseLeave,itemmouseenter:me.onItemMouseEnter}),me.panel.on({render:me.onPanelRender,scope:me})},onPanelRender:function(){var me=this,mask=me.loadMask,cfg={target:me.panel,msg:me.loadingText,msgCls:me.loadingCls,useMsg:me.loadingUseMsg,store:me.panel.store};me.el=me.panel.body,me.fireEvent("render",me),mask&&(Ext.isObject(mask)&&(cfg=Ext.apply(cfg,mask)),me.loadMask=new Ext.LoadMask(cfg))},getGridColumns:function(){return this.lockedGrid.headerCt.getVisibleGridColumns().concat(this.normalGrid.headerCt.getVisibleGridColumns())},getEl:function(column){return this.getViewForColumn(column).getEl()},getViewForColumn:function(column){var inLocked,view=this.lockedView;return view.headerCt.cascade(function(col){if(col===column)return inLocked=!0,!1}),inLocked?view:this.normalView},onItemMouseEnter:function(view,record){var item,me=this,locked=me.lockedView,other=me.normalView;view.trackOver&&(view!==locked&&(other=locked),item=other.getNode(record,!1),other.highlightItem(item))},onItemMouseLeave:function(view,record){var me=this,locked=me.lockedView,other=me.normalView;view.trackOver&&(view!==locked&&(other=locked),other.clearHighlight())},relayFn:function(name,args){args=args||[];var view=this.lockedView;view[name].apply(view,args),view=this.normalView,view[name].apply(view,args)},getSelectionModel:function(){return this.panel.getSelectionModel()},getStore:function(){return this.panel.store},getNode:function(nodeInfo,dataRow){return this.normalView.getNode(nodeInfo,dataRow)},getCell:function(record,column){var view=this.getViewForColumn(column),row=view.getNode(record,!0);return Ext.fly(row).down(column.getCellSelector())},indexOf:function(record){var result=this.lockedView.indexOf(record);return result||(result=this.normalView.indexOf(record)),result},focus:function(){var p=this.getSelectionModel().getCurrentPosition();(p?p.view:this.normalView).focus()},focusRow:function(row){this.normalView.focusRow(row)},focusCell:function(position){position.view.focusCell(position)},isVisible:function(deep){return this.panel.isVisible(deep)},getCellByPosition:function(pos,returnDom){var col=pos.column,lockedSize=this.lockedGrid.getColumnManager().getColumns().length;return col>=lockedSize?(pos=Ext.apply({},pos),pos.column-=lockedSize,this.normalView.getCellByPosition(pos,returnDom)):this.lockedView.getCellByPosition(pos,returnDom)},getRecord:function(node){var result=this.lockedView.getRecord(node);return result||(result=this.normalView.getRecord(node)),result},scrollBy:function(){var normal=this.normalView;normal.scrollBy.apply(normal,arguments)},addElListener:function(eventName,fn,scope){this.relayFn("addElListener",arguments)},refreshNode:function(){this.relayFn("refreshNode",arguments)},refresh:function(){this.relayFn("refresh",arguments)},bindStore:function(){this.relayFn("bindStore",arguments)},addRowCls:function(){this.relayFn("addRowCls",arguments)},removeRowCls:function(){this.relayFn("removeRowCls",arguments)},destroy:function(){var me=this,mask=me.loadMask;me.clearListeners(),mask&&mask.bindStore&&mask.bindStore(null)}});Ext.define("Ext.grid.locking.Lockable",{alternateClassName:"Ext.grid.Lockable",requires:["Ext.grid.locking.View","Ext.grid.header.Container","Ext.grid.locking.HeaderContainer","Ext.view.Table"],syncRowHeight:!0,headerCounter:0,scrollDelta:40,lockedGridCls:Ext.baseCSSPrefix+"grid-inner-locked",unlockText:"Unlock",lockText:"Lock",bothCfgCopy:["invalidateScrollerOnRefresh","hideHeaders","enableColumnHide","enableColumnMove","enableColumnResize","sortableColumns","columnLines","rowLines"],normalCfgCopy:["verticalScroller","verticalScrollDock","verticalScrollerType","scroll"],lockedCfgCopy:[],determineXTypeToCreate:function(lockedSide){var typeToCreate,xtypes,xtypesLn,xtype,superxtype,me=this;if(me.subGridXType)typeToCreate=me.subGridXType;else{if(!lockedSide)return"gridpanel";xtypes=this.getXTypes().split("/"),xtypesLn=xtypes.length,xtype=xtypes[xtypesLn-1],superxtype=xtypes[xtypesLn-2],typeToCreate="tablepanel"!==superxtype?superxtype:xtype}return typeToCreate},injectLockable:function(){this.lockable=!0,this.hasView=!0;var allFeatures,allPlugins,lockedGrid,normalGrid,i,columns,lockedHeaderCt,normalHeaderCt,lockedView,normalView,listeners,me=this,scrollbarHeight=Ext.getScrollbarSize().height,store=me.store=Ext.StoreManager.lookup(me.store),selModel=me.getSelectionModel(),loadMask=me.viewConfig&&me.viewConfig.loadMask,bufferedRenderer=me.findPlugin("bufferedrenderer");for(allFeatures=me.constructLockableFeatures(),me.features&&(me.features=null),allPlugins=me.constructLockablePlugins(),me.plugins=allPlugins.topPlugins,lockedGrid=Ext.apply({id:me.id+"-locked",isLocked:!0,ownerLockable:me,xtype:me.determineXTypeToCreate(!0),store:store,scrollerOwner:!1,animate:!1,scroll:!scrollbarHeight&&"vertical",selModel:selModel,border:!1,cls:me.lockedGridCls,isLayoutRoot:function(){return!1},features:allFeatures.lockedFeatures,plugins:allPlugins.lockedPlugins},me.lockedGridConfig),normalGrid=Ext.apply({id:me.id+"-normal",isLocked:!1,ownerLockable:me,xtype:me.determineXTypeToCreate(),store:store,scrollerOwner:!1,selModel:selModel,border:!1,isLayoutRoot:function(){return!1},features:allFeatures.normalFeatures,plugins:allPlugins.normalPlugins},me.normalGridConfig),me.addCls(Ext.baseCSSPrefix+"grid-locked"),Ext.copyTo(normalGrid,me,me.bothCfgCopy,!0),Ext.copyTo(lockedGrid,me,me.bothCfgCopy,!0),Ext.copyTo(normalGrid,me,me.normalCfgCopy,!0),Ext.copyTo(lockedGrid,me,me.lockedCfgCopy,!0),i=0;i<me.normalCfgCopy.length;i++)delete me[me.normalCfgCopy[i]];for(i=0;i<me.lockedCfgCopy.length;i++)delete me[me.lockedCfgCopy[i]];me.addEvents("processcolumns","lockcolumn","unlockcolumn"),me.addStateEvents(["lockcolumn","unlockcolumn"]),columns=me.processColumns(me.columns),lockedGrid.width=columns.lockedWidth+Ext.num(selModel.headerWidth,0)+(columns.locked.items.length?1:0),lockedGrid.columns=columns.locked,normalGrid.columns=columns.normal,normalGrid.flex=1,lockedGrid.viewConfig=me.lockedViewConfig||{},lockedGrid.viewConfig.loadingUseMsg=!1,lockedGrid.viewConfig.loadMask=!1,scrollbarHeight&&(lockedGrid.viewConfig.style="border-bottom:"+scrollbarHeight+"px solid #f6f6f6;"+(lockedGrid.viewConfig.style||"")),normalGrid.viewConfig=me.normalViewConfig||{},normalGrid.viewConfig.loadMask=!1,me.viewConfig&&me.viewConfig.id&&Ext.log.warn('id specified on Lockable viewConfig, it will be shared between both views: "'+me.viewConfig.id+'"'),Ext.applyIf(lockedGrid.viewConfig,me.viewConfig),Ext.applyIf(normalGrid.viewConfig,me.viewConfig),me.lockedGrid=Ext.ComponentManager.create(lockedGrid),me.isTree&&(me.lockedGrid.getView().animate=!1,normalGrid.store=me.lockedGrid.view.store,normalGrid.deferRowRender=!1,normalGrid.viewConfig.stripeRows=me.lockedGrid.view.stripeRows,normalGrid.rowLines=me.lockedGrid.rowLines),lockedView=me.lockedGrid.getView(),normalGrid.viewConfig.lockingPartner=lockedView,me.normalGrid=Ext.ComponentManager.create(normalGrid),lockedView.lockingPartner=normalView=me.normalGrid.getView(),me.view=new Ext.grid.locking.View({loadingText:normalView.loadingText,loadingCls:normalView.loadingCls,loadingUseMsg:normalView.loadingUseMsg,loadMask:void 0===loadMask?me.loadMask:loadMask,locked:me.lockedGrid,normal:me.normalGrid,panel:me}),listeners=bufferedRenderer?{}:{scroll:{fn:me.onLockedViewScroll,element:"el",scope:me}},scrollbarHeight&&(me.lockedGrid.on({afterlayout:me.afterLockedViewLayout,scope:me}),lockedView.getOverflowStyle(),lockedView.scrollFlags.y?me.lockedGrid.headerCt.forceFit=!0:listeners.mousewheel={fn:me.onLockedViewMouseWheel,element:"el",scope:me}),lockedView.on(listeners),listeners=bufferedRenderer?{}:{scroll:{fn:me.onNormalViewScroll,element:"el",scope:me},scope:me},normalView.on(listeners),lockedHeaderCt=me.lockedGrid.headerCt,normalHeaderCt=me.normalGrid.headerCt,me.headerCt=me.view.headerCt=new Ext.grid.locking.HeaderContainer(me),lockedHeaderCt.lockedCt=!0,lockedHeaderCt.lockableInjected=!0,normalHeaderCt.lockableInjected=!0,lockedHeaderCt.on({add:{buffer:1,scope:me,fn:me.onLockedHeaderAdd},columnshow:me.onLockedHeaderShow,columnhide:me.onLockedHeaderHide,sortchange:me.onLockedHeaderSortChange,columnresize:me.onLockedHeaderResize,scope:me}),normalHeaderCt.on({sortchange:me.onNormalHeaderSortChange,scope:me}),me.modifyHeaderCt(),me.items=[me.lockedGrid,me.normalGrid],me.relayHeaderCtEvents(lockedHeaderCt),me.relayHeaderCtEvents(normalHeaderCt),me.storeRelayers=me.relayEvents(store,["filterchange","groupchange"]),me.layout={type:"hbox",align:"stretch"}},getLockingViewConfig:function(){return{xclass:"Ext.grid.locking.View",locked:this.lockedGrid,normal:this.normalGrid,panel:this}},processColumns:function(columns){var i,len,column,cp=new Ext.grid.header.Container,lockedHeaders=[],normalHeaders=[],lockedHeaderCt={itemId:"lockedHeaderCt",stretchMaxPartner:"^^>>#normalHeaderCt",items:lockedHeaders},normalHeaderCt={itemId:"normalHeaderCt",stretchMaxPartner:"^^>>#lockedHeaderCt",items:normalHeaders},result={lockedWidth:0,locked:lockedHeaderCt,normal:normalHeaderCt};for(Ext.isObject(columns)&&(Ext.applyIf(lockedHeaderCt,columns),Ext.applyIf(normalHeaderCt,columns),Ext.apply(cp,columns),columns=columns.items),i=0,len=columns.length;i<len;++i)column=columns[i],column.isComponent||(column=cp.lookupComponent(cp.applyDefaults(column))),column.processed=!0,column.locked||column.autoLock?(column.hidden||(result.lockedWidth+=this.getColumnWidth(column)||cp.defaultWidth),lockedHeaders.push(column)):normalHeaders.push(column),column.headerId||(column.headerId=(column.initialConfig||column).id||"h"+ ++this.headerCounter);return this.fireEvent("processcolumns",this,lockedHeaders,normalHeaders),cp.destroy(),result},getColumnWidth:function(column){var subcols,len,i,result=column.width||0;if(column.flex&&Ext.Error.raise("Columns which are locked do NOT support a flex width. You must set a width on the "+column.text+"column."),!result&&column.isGroupHeader)for(subcols=column.items.items,len=subcols.length,i=0;i<len;i++)result+=this.getColumnWidth(subcols[i]);return result},afterLockedViewLayout:function(){var me=this,lockedView=me.lockedGrid.getView(),lockedViewEl=lockedView.el.dom,spacerHeight=me.normalGrid.headerCt.tooNarrow?Ext.getScrollbarSize().height:0;lockedView.scrollFlags.x&&lockedViewEl.scrollWidth>lockedViewEl.clientWidth&&(spacerHeight=0),lockedView.el.dom.style.borderBottomWidth=spacerHeight+"px",Ext.isBorderBox||lockedView.el.setHeight(lockedView.lastBox.height)},onLockedViewMouseWheel:function(e){var verticalCanScrollDown,verticalCanScrollUp,me=this,scrollDelta=-me.scrollDelta,deltaY=scrollDelta*e.getWheelDeltas().y,vertScrollerEl=me.lockedGrid.getView().el.dom;me.ignoreMousewheel||(vertScrollerEl&&(verticalCanScrollDown=vertScrollerEl.scrollTop!==vertScrollerEl.scrollHeight-vertScrollerEl.clientHeight,verticalCanScrollUp=0!==vertScrollerEl.scrollTop),(deltaY<0&&verticalCanScrollUp||deltaY>0&&verticalCanScrollDown)&&(e.stopEvent(),vertScrollerEl.scrollTop+=deltaY,me.normalGrid.getView().el.dom.scrollTop=vertScrollerEl.scrollTop,me.onNormalViewScroll()))},onLockedViewScroll:function(){var normalTable,lockedTable,me=this,lockedView=me.lockedGrid.getView(),normalView=me.normalGrid.getView(),normalDom=normalView.el.dom,lockedDom=lockedView.el.dom;normalDom.scrollTop!==lockedDom.scrollTop&&(normalDom.scrollTop=lockedDom.scrollTop,me.store.buffered&&(lockedTable=lockedView.el.child("table",!0),normalTable=normalView.el.child("table",!0),normalTable.style.position="absolute",normalTable.style.top=lockedTable.style.top))},onNormalViewScroll:function(){var normalTable,lockedTable,me=this,lockedView=me.lockedGrid.getView(),normalView=me.normalGrid.getView(),normalDom=normalView.el.dom,lockedDom=lockedView.el.dom;normalDom.scrollTop!==lockedDom.scrollTop&&(lockedDom.scrollTop=normalDom.scrollTop,me.store.buffered&&(lockedTable=lockedView.el.child("table",!0),normalTable=normalView.el.child("table",!0),lockedTable.style.position="absolute",lockedTable.style.top=normalTable.style.top))},syncRowHeights:function(){var i,scrollTop,me=this,lockedView=me.lockedGrid.getView(),normalView=me.normalGrid.getView(),lockedRowEls=lockedView.all.slice(),normalRowEls=normalView.all.slice(),ln=lockedRowEls.length;if(normalRowEls.length===ln){for(i=0;i<ln;i++)normalView.syncRowHeights(lockedRowEls[i],normalRowEls[i]);scrollTop=normalView.el.dom.scrollTop,normalView.el.dom.scrollTop=scrollTop,lockedView.el.dom.scrollTop=scrollTop}},modifyHeaderCt:function(){var me=this;me.lockedGrid.headerCt.getMenuItems=me.getMenuItems(me.lockedGrid.headerCt.getMenuItems,!0),me.normalGrid.headerCt.getMenuItems=me.getMenuItems(me.normalGrid.headerCt.getMenuItems,!1),me.lockedGrid.headerCt.showMenuBy=Ext.Function.createInterceptor(me.lockedGrid.headerCt.showMenuBy,me.showMenuBy),me.normalGrid.headerCt.showMenuBy=Ext.Function.createInterceptor(me.normalGrid.headerCt.showMenuBy,me.showMenuBy)},onUnlockMenuClick:function(){this.unlock()},onLockMenuClick:function(){this.lock()},showMenuBy:function(t,header){var menu=this.getMenu(),unlockItem=menu.down("#unlockItem"),lockItem=menu.down("#lockItem"),sep=unlockItem.prev();!1===header.lockable?(sep.hide(),unlockItem.hide(),lockItem.hide()):(sep.show(),unlockItem.show(),lockItem.show(),unlockItem.initialConfig.disabled||unlockItem.setDisabled(!1===header.lockable),lockItem.initialConfig.disabled||lockItem.setDisabled(!header.isLockable()))},getMenuItems:function(getMenuItems,locked){var me=this,unlockText=me.unlockText,lockText=me.lockText,unlockCls=Ext.baseCSSPrefix+"hmenu-unlock",lockCls=Ext.baseCSSPrefix+"hmenu-lock",unlockHandler=Ext.Function.bind(me.onUnlockMenuClick,me),lockHandler=Ext.Function.bind(me.onLockMenuClick,me);return function(){var o=getMenuItems.call(this);return o.push("-",{itemId:"unlockItem",iconCls:unlockCls,text:unlockText,handler:unlockHandler,disabled:!locked}),o.push({itemId:"lockItem",iconCls:lockCls,text:lockText,handler:lockHandler,disabled:locked}),o}},syncLockedWidth:function(){var me=this,locked=me.lockedGrid,lockedView=locked.view,lockedViewEl=lockedView.el.dom,normal=me.normalGrid,lockedColCount=locked.headerCt.getVisibleGridColumns().length,normalColCount=normal.headerCt.getVisibleGridColumns().length;return Ext.suspendLayouts(),normalColCount?(normal.show(),lockedColCount?(locked.headerCt.forceFit||(delete locked.flex,locked.setWidth(locked.headerCt.getFullWidth())),locked.addCls(me.lockedGridCls),locked.show()):(locked.getView().refresh(),locked.hide()),lockedView.el.setStyle(lockedView.getOverflowStyle()),me.ignoreMousewheel=lockedView.scrollFlags.y):(normal.hide(),lockedViewEl.style.borderBottomWidth="0",locked.flex=1,delete locked.width,locked.removeCls(me.lockedGridCls),locked.show(),lockedView.el.setStyle(normal.view.getOverflowStyle()),me.ignoreMousewheel=!0),Ext.resumeLayouts(!0),[lockedColCount,normalColCount]},onLockedHeaderAdd:function(){this.ignoreAddLockedColumn||this.syncLockedWidth()},onLockedHeaderResize:function(){this.syncLockedWidth()},onLockedHeaderHide:function(){this.syncLockedWidth()},onLockedHeaderShow:function(){this.syncLockedWidth()},onLockedHeaderSortChange:function(headerCt,header,sortState){sortState&&this.normalGrid.headerCt.clearOtherSortStates(null,!0)},onNormalHeaderSortChange:function(headerCt,header,sortState){sortState&&this.lockedGrid.headerCt.clearOtherSortStates(null,!0)},lock:function(activeHd,toIdx,toCt){var refreshFlags,ownerCt,me=this,normalGrid=me.normalGrid,lockedGrid=me.lockedGrid,normalHCt=normalGrid.headerCt;activeHd=activeHd||normalHCt.getMenu().activeHeader,toCt=toCt||lockedGrid.headerCt,ownerCt=activeHd.ownerCt,activeHd.isLockable()&&(activeHd.flex&&(activeHd.width=activeHd.getWidth(),activeHd.flex=null),Ext.suspendLayouts(),ownerCt.remove(activeHd,!1),activeHd.locked=!0,me.ignoreAddLockedColumn=!0,Ext.isDefined(toIdx)?toCt.insert(toIdx,activeHd):toCt.add(activeHd),me.ignoreAddLockedColumn=!1,refreshFlags=me.syncLockedWidth(),refreshFlags[0]&&lockedGrid.getView().refresh(),refreshFlags[1]&&normalGrid.getView().refresh(),Ext.resumeLayouts(!0),me.fireEvent("lockcolumn",me,activeHd))},unlock:function(activeHd,toIdx,toCt){var refreshFlags,me=this,normalGrid=me.normalGrid,lockedGrid=me.lockedGrid,lockedHCt=lockedGrid.headerCt;Ext.isDefined(toIdx)||(toIdx=0),activeHd=activeHd||lockedHCt.getMenu().activeHeader,toCt=toCt||normalGrid.headerCt,Ext.suspendLayouts(),activeHd.ownerCt.remove(activeHd,!1),activeHd.locked=!1,toCt.insert(toIdx,activeHd),refreshFlags=me.syncLockedWidth(),refreshFlags[0]&&lockedGrid.getView().refresh(),refreshFlags[1]&&normalGrid.getView().refresh(),Ext.resumeLayouts(!0),me.fireEvent("unlockcolumn",me,activeHd)},reconfigureLockable:function(store,columns){var me=this,oldStore=me.store,lockedGrid=me.lockedGrid,normalGrid=me.normalGrid;Ext.suspendLayouts(),columns&&(lockedGrid.headerCt.removeAll(),normalGrid.headerCt.removeAll(),columns=me.processColumns(columns),me.ignoreAddLockedColumn=!0,lockedGrid.headerCt.add(columns.locked.items),me.ignoreAddLockedColumn=!1,normalGrid.headerCt.add(columns.normal.items),me.syncLockedWidth()),store&&store!==oldStore?(store=Ext.data.StoreManager.lookup(store),me.store=store,lockedGrid.bindStore(store),normalGrid.bindStore(store)):(lockedGrid.getView().refresh(),normalGrid.getView().refresh()),Ext.resumeLayouts(!0)},constructLockableFeatures:function(){var feature,featureClone,lockedFeatures,normalFeatures,len,features=this.features,i=0;if(features)for(Ext.isArray(features)||(features=[features]),lockedFeatures=[],normalFeatures=[],len=features.length;i<len;i++)switch(feature=features[i],feature.isFeature||(feature=Ext.create("feature."+feature.ftype,feature)),feature.lockableScope){case"locked":lockedFeatures.push(feature);break;case"normal":normalFeatures.push(feature);break;default:feature.lockableScope="both",lockedFeatures.push(feature),normalFeatures.push(featureClone=feature.clone()),featureClone.lockingPartner=feature,feature.lockingPartner=featureClone}return{normalFeatures:normalFeatures,lockedFeatures:lockedFeatures}},constructLockablePlugins:function(){var plugin,normalPlugin,lockedPlugin,topPlugins,lockedPlugins,normalPlugins,len,lockableScope,pluginCls,plugins=this.plugins,i=0;if(plugins)for(Ext.isArray(plugins)||(plugins=[plugins]),topPlugins=[],lockedPlugins=[],normalPlugins=[],len=plugins.length;i<len;i++)switch(plugin=plugins[i],plugin.init?lockableScope=plugin.lockableScope:(pluginCls=plugin.ptype?Ext.ClassManager.getByAlias("plugin."+plugin.ptype):Ext.ClassManager.get(plugin.xclass),lockableScope=pluginCls.prototype.lockableScope),lockableScope){case"both":lockedPlugins.push(lockedPlugin=plugin.clonePlugin()),normalPlugins.push(normalPlugin=plugin.clonePlugin()),lockedPlugin.lockingPartner=normalPlugin,normalPlugin.lockingPartner=lockedPlugin,Ext.destroy(plugin);break;case"locked":lockedPlugins.push(plugin);break;case"normal":normalPlugins.push(plugin);break;default:topPlugins.push(plugin)}return{topPlugins:topPlugins,normalPlugins:normalPlugins,lockedPlugins:lockedPlugins}},destroyLockable:function(){Ext.destroy(this.view,this.headerCt)}},function(){this.borrow(Ext.AbstractComponent,["constructPlugin"])});Ext.define("Ext.tree.View",{extend:"Ext.view.Table",alias:"widget.treeview",requires:["Ext.data.NodeStore"],isTreeView:!0,loadingCls:Ext.baseCSSPrefix+"grid-tree-loading",expandedCls:Ext.baseCSSPrefix+"grid-tree-node-expanded",leafCls:Ext.baseCSSPrefix+"grid-tree-node-leaf",expanderSelector:"."+Ext.baseCSSPrefix+"tree-expander",checkboxSelector:"."+Ext.baseCSSPrefix+"tree-checkbox",expanderIconOverCls:Ext.baseCSSPrefix+"tree-expander-over",nodeAnimWrapCls:Ext.baseCSSPrefix+"tree-animator-wrap",ariaRole:"tree",blockRefresh:!0,loadMask:!1,rootVisible:!0,deferInitialRefresh:!1,expandDuration:250,collapseDuration:250,toggleOnDblClick:!0,stripeRows:!1,uiFields:["expanded","loaded","checked","expandable","leaf","icon","iconCls","loading","qtip","qtitle"],treeRowTpl:["{%","this.processRowValues(values);","this.nextTpl.applyOut(values, out, parent);","%}",{priority:10,processRowValues:function(rowValues){var record=rowValues.record,view=rowValues.view;rowValues.rowAttr={},rowValues.rowAttr["data-qtip"]=record.get("qtip")||"",rowValues.rowAttr["data-qtitle"]=record.get("qtitle")||"",record.isExpanded()&&rowValues.rowClasses.push(view.expandedCls),record.isLeaf()&&rowValues.rowClasses.push(view.leafCls),record.isLoading()&&rowValues.rowClasses.push(view.loadingCls)}}],initComponent:function(){var me=this,treeStore=me.panel.getStore(),store=me.store;void 0===me.initialConfig.animate&&(me.animate=Ext.enableFx),store&&store!==treeStore||(me.store=store=new Ext.data.NodeStore({treeStore:treeStore,recursive:!0,rootVisible:me.rootVisible})),me.node&&me.setRootNode(me.node),me.animQueue={},me.animWraps={},me.addEvents("afteritemexpand","afteritemcollapse","nodedragover"),me.callParent(arguments),me.addRowTpl(Ext.XTemplate.getTpl(me,"treeRowTpl"))},onBeforeFill:function(treeStore,fillRoot){this.store.suspendEvents()},onFillComplete:function(treeStore,fillRoot,newNodes){var me=this,store=me.store,start=store.indexOf(newNodes[0]);store.resumeEvents(),fillRoot.triggerUIUpdate(),newNodes.length&&-1!==start&&(me.onAdd(me.store,newNodes,start),me.refreshPartner())},onBeforeSort:function(){this.store.suspendEvents()},onSort:function(o){o.isStore&&(this.store.resumeEvents(),this.refresh(),this.refreshPartner())},refreshPartner:function(){var partner=this.lockingPartner;partner&&partner.refresh()},getMaskStore:function(){return this.panel.getStore()},afterRender:function(){var me=this;me.callParent(arguments),me.el.on({scope:me,delegate:me.expanderSelector,mouseover:me.onExpanderMouseOver,mouseout:me.onExpanderMouseOut,click:{delegate:me.checkboxSelector,fn:me.onCheckboxChange,scope:me}})},afterComponentLayout:function(){this.callParent(arguments);var stretcher=this.stretcher;stretcher&&stretcher.setWidth(this.getWidth()-Ext.getScrollbarSize().width)},processUIEvent:function(e){return!e.getTarget("."+this.nodeAnimWrapCls,this.el)&&this.callParent(arguments)},onClear:function(){this.store.removeAll()},setRootNode:function(node){var me=this;me.store.setNode(node),me.node=node},onCheckboxChange:function(e,t){var me=this,item=e.getTarget(me.getItemSelector(),me.getTargetEl());item&&me.onCheckChange(me.getRecord(item))},onCheckChange:function(record){var checked=record.get("checked");Ext.isBoolean(checked)&&(checked=!checked,record.set("checked",checked),this.fireEvent("checkchange",record,checked))},getChecked:function(){var checked=[];return this.node.cascadeBy(function(rec){rec.get("checked")&&checked.push(rec)}),checked},isItemChecked:function(rec){return rec.get("checked")},createAnimWrap:function(record,index){var tmpEl,nodeEl,me=this,node=me.getNode(record),columnSizer=[];return me.renderColumnSizer(columnSizer),nodeEl=Ext.get(node),tmpEl=nodeEl.insertSibling({role:"presentation",tag:"tr",html:['<td colspan="'+me.panel.headerCt.getColumnCount()+'" role="presentation">','<div class="'+me.nodeAnimWrapCls+'" role="presentation">','<table class="'+Ext.baseCSSPrefix+me.id+"-table "+Ext.baseCSSPrefix+'grid-table" style="border:0" cellspacing="0" cellpadding="0" role="presentation">',columnSizer.join(""),"<tbody></tbody></table>","</div>","</td>"].join("")},"after"),{record:record,node:node,el:tmpEl,expanding:!1,collapsing:!1,animating:!1,animateEl:tmpEl.down("div"),targetEl:tmpEl.down("tbody")}},getAnimWrap:function(parent,bubble){if(!this.animate)return null;var wraps=this.animWraps,wrap=wraps[parent.internalId];if(!1!==bubble)for(;!wrap&&parent;)(parent=parent.parentNode)&&(wrap=wraps[parent.internalId]);return wrap},doAdd:function(records,index){var relativeIndex,targetEl,children,len,me=this,nodes=me.bufferRender(records,index,!0),record=records[0],parent=record.parentNode,all=me.all,animWrap=me.getAnimWrap(parent);if(!animWrap||!animWrap.expanding)return me.callParent(arguments);parent=animWrap.record,targetEl=animWrap.targetEl,children=targetEl.dom.childNodes,len=children.length,relativeIndex=index-me.indexInStore(parent)-1,!len||relativeIndex>=len?targetEl.appendChild(nodes):Ext.fly(children[relativeIndex]).insertSibling(nodes,"before",!0),all.insert(index,nodes),animWrap.isAnimating&&me.onExpand(parent)},onRemove:function(ds,records,indexes){var i,me=this;if(me.viewReady){if(0===me.store.getCount())me.refresh();else for(i=indexes.length-1;i>=0;--i)me.doRemove(records[i],indexes[i]);if(me.hasListeners.itemremove)for(i=indexes.length-1;i>=0;--i)me.fireEvent("itemremove",records[i],indexes[i])}},doRemove:function(record,index){var me=this,all=me.all,animWrap=me.getAnimWrap(record),item=all.item(index),node=item?item.dom:null;if(!node||!animWrap||!animWrap.collapsing)return me.callParent(arguments);animWrap.targetEl.dom.insertBefore(node,animWrap.targetEl.dom.firstChild),all.removeElement(index)},onBeforeExpand:function(parent,records,index){var animWrap,me=this;me.rendered&&me.all.getCount()&&me.animate&&me.getNode(parent)&&(animWrap=me.getAnimWrap(parent,!1),animWrap?animWrap.collapsing&&animWrap.targetEl.select(me.itemSelector).remove():(animWrap=me.animWraps[parent.internalId]=me.createAnimWrap(parent),animWrap.animateEl.setHeight(0)),animWrap.expanding=!0,animWrap.collapsing=!1)},onExpand:function(parent){var animWrap,animateEl,targetEl,me=this,queue=me.animQueue,id=parent.getId(),node=me.getNode(parent),index=node?me.indexOf(node):-1,fromHeight=Ext.isIEQuirks?1:0;if(me.singleExpand&&me.ensureSingleExpand(parent),-1!==index){if(!(animWrap=me.getAnimWrap(parent,!1)))return me.refreshSelection(),parent.isExpandingOrCollapsing=!1,me.fireEvent("afteritemexpand",parent,index,node),void me.refreshSize();animateEl=animWrap.animateEl,targetEl=animWrap.targetEl,animateEl.stopAnimation(),queue[id]=!0,animateEl.dom.style.height=fromHeight+"px",animateEl.animate({from:{height:fromHeight},to:{height:targetEl.getHeight()},duration:me.expandDuration,listeners:{afteranimate:function(){var items=targetEl.query(me.itemSelector);items.length&&animWrap.el.insertSibling(items,"before",!0),animWrap.el.remove(),me.refreshSize(),delete me.animWraps[animWrap.record.internalId],delete queue[id]}},callback:function(){me.refreshSelection(),parent.isExpandingOrCollapsing=!1,me.fireEvent("afteritemexpand",parent,index,node)}}),animWrap.isAnimating=!0}},onBeforeCollapse:function(parent,records,index,callback,scope){var animWrap,me=this;me.rendered&&me.all.getCount()&&(me.animate?Ext.Array.contains(parent.stores,me.store)&&(animWrap=me.getAnimWrap(parent),animWrap?animWrap.expanding&&animWrap.targetEl.select(this.itemSelector).remove():animWrap=me.animWraps[parent.internalId]=me.createAnimWrap(parent,index),animWrap.expanding=!1,animWrap.collapsing=!0,animWrap.callback=callback,animWrap.scope=scope):(me.onCollapseCallback=callback,me.onCollapseScope=scope),me.onRowDeselect(me.indexOf(parent.firstChild)))},onCollapse:function(parent){var animateEl,me=this,queue=me.animQueue,id=parent.getId(),node=me.getNode(parent),index=node?me.indexOf(node):-1,animWrap=me.getAnimWrap(parent);if(me.all.getCount()&&Ext.Array.contains(parent.stores,me.store)){if(!animWrap)return me.refreshSelection(),parent.isExpandingOrCollapsing=!1,me.fireEvent("afteritemcollapse",parent,index,node),me.refreshSize(),Ext.callback(me.onCollapseCallback,me.onCollapseScope),void(me.onCollapseCallback=me.onCollapseScope=null);animateEl=animWrap.animateEl,queue[id]=!0,animateEl.stopAnimation(),animateEl.animate({to:{height:Ext.isIEQuirks?1:0},duration:me.collapseDuration,listeners:{afteranimate:function(){animWrap.el.remove(),me.refreshSize(),delete me.animWraps[animWrap.record.internalId],delete queue[id]}},callback:function(){me.refreshSelection(),parent.isExpandingOrCollapsing=!1,me.fireEvent("afteritemcollapse",parent,index,node),Ext.callback(animWrap.callback,animWrap.scope),animWrap.callback=animWrap.scope=null}}),animWrap.isAnimating=!0}},isAnimating:function(node){return!!this.animQueue[node.getId()]},expand:function(record,deep,callback,scope){var result,me=this,doAnimate=!!me.animate;if(!doAnimate||!record.isExpandingOrCollapsing)return record.isLeaf()||(record.isExpandingOrCollapsing=doAnimate),Ext.suspendLayouts(),result=record.expand(deep,callback,scope),Ext.resumeLayouts(!0),result},collapse:function(record,deep,callback,scope){var me=this,doAnimate=!!me.animate;if(!doAnimate||!record.isExpandingOrCollapsing)return record.isLeaf()||(record.isExpandingOrCollapsing=doAnimate),record.collapse(deep,callback,scope)},toggle:function(record,deep,callback,scope){record.isExpanded()?this.collapse(record,deep,callback,scope):this.expand(record,deep,callback,scope)},onItemDblClick:function(record,item,index){var me=this,editingPlugin=me.editingPlugin;me.callParent(arguments),!me.toggleOnDblClick||!record.isExpandable()||editingPlugin&&2===editingPlugin.clicksToEdit||me.toggle(record)},onBeforeItemMouseDown:function(record,item,index,e){return!e.getTarget(this.expanderSelector,item)&&this.callParent(arguments)},onItemClick:function(record,item,index,e){return e.getTarget(this.expanderSelector,item)&&record.isExpandable()?(this.toggle(record,e.ctrlKey),!1):this.callParent(arguments)},onExpanderMouseOver:function(e,t){e.getTarget(this.cellSelector,10,!0).addCls(this.expanderIconOverCls)},onExpanderMouseOut:function(e,t){e.getTarget(this.cellSelector,10,!0).removeCls(this.expanderIconOverCls)},getStoreListeners:function(){var me=this,listeners=me.callParent(arguments);return Ext.apply(listeners,{beforeexpand:me.onBeforeExpand,expand:me.onExpand,beforecollapse:me.onBeforeCollapse,collapse:me.onCollapse,write:me.onStoreWrite,datachanged:me.onStoreDataChanged})},onBindStore:function(){var me=this,treeStore=me.getTreeStore();me.callParent(arguments),me.mon(treeStore,{scope:me,beforefill:me.onBeforeFill,fillcomplete:me.onFillComplete}),treeStore.remoteSort||me.mon(treeStore,{scope:me,beforesort:me.onBeforeSort,sort:me.onSort})},onUnbindStore:function(){var me=this,treeStore=me.getTreeStore();me.callParent(arguments),me.mun(treeStore,{scope:me,beforefill:me.onBeforeFill,fillcomplete:me.onFillComplete}),treeStore.remoteSort||me.mun(treeStore,{scope:me,beforesort:me.onBeforeSort,sort:me.onSort})},getTreeStore:function(){return this.panel.store},ensureSingleExpand:function(node){var parent=node.parentNode;parent&&parent.eachChild(function(child){child!==node&&child.isExpanded()&&child.collapse()})},shouldUpdateCell:function(record,column,changedFieldNames){if(changedFieldNames)for(var i=0,len=changedFieldNames.length;i<len;++i)if(Ext.Array.contains(this.uiFields,changedFieldNames[i]))return!0;return this.callParent(arguments)},onStoreWrite:function(store,operation){var treeStore=this.panel.store;treeStore.fireEvent("write",treeStore,operation)},onStoreDataChanged:function(store,operation){var treeStore=this.panel.store;treeStore.fireEvent("datachanged",treeStore)}});Ext.define("Ext.grid.plugin.BufferedRendererTreeView",{override:"Ext.tree.View",onRemove:function(store,records,indices){var me=this;me.rendered&&me.bufferedRenderer?me.refreshView():me.callParent([store,records,indices])}});Ext.define("Ext.grid.plugin.BufferedRenderer",{extend:"Ext.AbstractPlugin",requires:["Ext.grid.plugin.BufferedRendererTableView","Ext.grid.plugin.BufferedRendererTreeView"],alias:"plugin.bufferedrenderer",lockableScope:"both",percentageFromEdge:.35,variableRowHeight:!1,numFromEdge:8,trailingBufferZone:10,leadingBufferZone:20,synchronousRender:!0,scrollToLoadBuffer:200,viewSize:0,rowHeight:21,position:0,lastScrollDirection:1,bodyTop:0,init:function(grid){var me=this,view=grid.view,viewListeners={scroll:{fn:me.onViewScroll,element:"el",scope:me},boxready:me.onViewResize,resize:me.onViewResize,refresh:me.onViewRefresh,scope:me,destroyable:!0};!me.variableRowHeight&&grid.ownerLockable&&(grid.ownerLockable.syncRowHeight=!1),(grid.isTree||grid.ownerLockable&&grid.ownerLockable.isTree)&&(view.blockRefresh=!1,view.loadMask=!0),view.positionBody&&(viewListeners.refresh=me.onViewRefresh),me.grid=grid,me.view=view,view.bufferedRenderer=me,view.preserveScrollOnRefresh=!0,me.bindStore(view.dataSource),view.getViewRange=function(){return me.getViewRange()},me.position=0,me.gridListeners=grid.on("reconfigure",me.onReconfigure,me),me.viewListeners=view.on(viewListeners)},bindStore:function(store){var me=this;me.store&&me.unbindStore(),me.storeListeners=store.on({scope:me,clear:me.onStoreClear,destroyable:!0}),me.store=store,me.view.componentLayout.layoutCount&&me.onViewResize(me.view,0,me.view.getHeight())},onReconfigure:function(grid,store){store&&store!==this.store&&this.bindStore(store)},unbindStore:function(){this.storeListeners.destroy(),this.store=null},onStoreClear:function(){var me=this;me.view.rendered&&!me.store.isDestroyed&&(0!==me.scrollTop&&(me.ignoreNextScrollEvent=!0,me.view.el.dom.scrollTop=0),me.bodyTop=me.scrollTop=me.position=me.scrollHeight=0,me.lastScrollDirection=me.scrollOffset=null,delete me.rowHeight)},onViewRefresh:function(){var scrollHeight,me=this,view=me.view,oldScrollHeight=me.scrollHeight;view.all.getCount()&&delete me.rowHeight,scrollHeight=me.getScrollHeight(),oldScrollHeight&&scrollHeight==oldScrollHeight||me.stretchView(view,scrollHeight),me.scrollTop!==view.el.dom.scrollTop?me.onViewScroll():(me.setBodyTop(me.bodyTop),view.all.getCount()&&(me.viewSize=0,me.onViewResize(view,null,view.getHeight())))},onViewResize:function(view,width,height,oldWidth,oldHeight){if(!oldHeight||height!==oldHeight){var newViewSize,me=this;newViewSize=Math.ceil(height/me.rowHeight)+me.trailingBufferZone+me.leadingBufferZone,me.viewSize=me.setViewSize(newViewSize)}},stretchView:function(view,scrollRange){var me=this,recordCount=me.store.buffered?me.store.getTotalCount():me.store.getCount();if(me.stretcher)me.stretcher.dom.style.marginTop=scrollRange-1+"px";else{var el=view.el;view.refreshCounter&&view.fixedNodes++,recordCount&&me.view.all.endIndex===recordCount-1&&(scrollRange=me.bodyTop+view.body.dom.offsetHeight),this.stretcher=el.createChild({style:{width:"1px",height:"1px",marginTop:scrollRange-1+"px",left:0,position:"absolute"}},el.dom.firstChild)}},setViewSize:function(viewSize){if(viewSize!==this.viewSize){this.scrollTop=this.view.el.dom.scrollTop;var start,end,me=this,store=me.store,elCount=me.view.all.getCount(),lockingPartner=me.lockingPartner;me.viewSize=store.viewSize=viewSize,elCount&&(start=me.view.all.startIndex,end=Math.min(start+viewSize-1,(store.buffered?store.getTotalCount():store.getCount())-1),lockingPartner&&lockingPartner.disable(),me.renderRange(start,end),lockingPartner&&lockingPartner.enable())}return viewSize},getViewRange:function(){var me=this,rows=me.view.all,store=me.store;return store.data.getCount()?store.getRange(rows.startIndex,rows.startIndex+(me.viewSize||store.defaultViewSize)-1):[]},scrollTo:function(recordIdx,doSelect,callback,scope){var startIdx,endIdx,targetRec,targetRow,tableTop,groupingFeature,group,record,me=this,view=me.view,viewDom=view.el.dom,store=me.store,total=store.buffered?store.getTotalCount():store.getCount();(groupingFeature=view.dataSource.groupingFeature)&&!1!==groupingFeature.collapsible?(recordIdx=Math.min(Math.max(recordIdx,0),view.store.getCount()-1),record=view.store.getAt(recordIdx),recordIdx=groupingFeature.indexOf(recordIdx),group=groupingFeature.getGroup(record),group.isCollapsed&&(groupingFeature.expand(group.name),total=store.buffered?store.getTotalCount():store.getCount())):recordIdx=Math.min(Math.max(recordIdx,0),total-1),startIdx=Math.max(Math.min(recordIdx-(me.leadingBufferZone+me.trailingBufferZone)/2,total-me.viewSize+1),0),tableTop=startIdx*me.rowHeight,endIdx=Math.min(startIdx+me.viewSize-1,total-1),store.getRange(startIdx,endIdx,{callback:function(range,start,end){me.renderRange(start,end,!0),targetRec=store.data.getRange(recordIdx,recordIdx)[0],targetRow=view.getNode(targetRec,!1),view.body.dom.style.top=tableTop+"px",me.position=me.scrollTop=viewDom.scrollTop=tableTop=Math.min(Math.max(0,tableTop-view.body.getOffsetsTo(targetRow)[1]),viewDom.scrollHeight-viewDom.clientHeight),Ext.isIE&&(viewDom.scrollTop=tableTop),doSelect&&view.selModel.select(targetRec),callback&&callback.call(scope||me,recordIdx,targetRec)}})},onViewScroll:function(e,t){var vscrollDistance,scrollDirection,me=this,store=me.store,totalCount=store.buffered?store.getTotalCount():store.getCount(),scrollTop=me.scrollTop=me.view.el.dom.scrollTop,scrollHandled=!1;if(me.ignoreNextScrollEvent)return void(me.ignoreNextScrollEvent=!1);me.disabled||totalCount<me.viewSize||(vscrollDistance=scrollTop-me.position,scrollDirection=vscrollDistance>0?1:-1,(Math.abs(vscrollDistance)>=20||scrollDirection!==me.lastScrollDirection)&&(me.lastScrollDirection=scrollDirection,me.handleViewScroll(me.lastScrollDirection),scrollHandled=!0)),scrollHandled||me.lockingPartner&&me.lockingPartner.scrollTop!==scrollTop&&(me.lockingPartner.view.el.dom.scrollTop=scrollTop)},handleViewScroll:function(direction){var requestStart,requestEnd,me=this,rows=me.view.all,store=me.store,viewSize=me.viewSize,totalCount=store.buffered?store.getTotalCount():store.getCount();if(-1==direction?rows.startIndex&&me.getFirstVisibleRowIndex()-rows.startIndex<me.numFromEdge&&(requestStart=Math.max(0,me.getLastVisibleRowIndex()+me.trailingBufferZone-viewSize)):rows.endIndex<totalCount-1&&rows.endIndex-me.getLastVisibleRowIndex()<me.numFromEdge&&(requestStart=Math.max(0,me.getFirstVisibleRowIndex()-me.trailingBufferZone)),null!=requestStart&&(requestEnd=Math.min(requestStart+viewSize-1,totalCount-1),requestStart!==rows.startIndex||requestEnd!==rows.endIndex))return void me.renderRange(requestStart,requestEnd);me.lockingPartner&&me.lockingPartner.view.el&&me.lockingPartner.scrollTop!==me.scrollTop&&(me.lockingPartner.view.el.dom.scrollTop=me.scrollTop)},renderRange:function(start,end,forceSynchronous){var me=this,rows=me.view.all,store=me.store;start===rows.startIndex&&end===rows.endIndex||(store.rangeCached(start,end)?(me.cancelLoad(),me.synchronousRender||forceSynchronous?me.onRangeFetched(null,start,end):(me.renderTask||(me.renderTask=new Ext.util.DelayedTask(me.onRangeFetched,me,null,!1)),me.renderTask.delay(1,null,null,[null,start,end]))):me.attemptLoad(start,end))},onRangeFetched:function(range,start,end,fromLockingPartner){var oldStart,removeCount,top,me=this,view=me.view,rows=view.all,increment=0,calculatedTop=start*me.rowHeight,lockingPartner=me.lockingPartner;view.isDestroyed||(range||(range=me.store.getRange(start,end)))&&((start>rows.endIndex||end<rows.startIndex)&&(rows.clear(!0),top=calculatedTop),rows.getCount()?end>rows.endIndex?(removeCount=Math.max(start-rows.startIndex,0),me.variableRowHeight&&(increment=rows.item(rows.startIndex+removeCount,!0).offsetTop),rows.scroll(Ext.Array.slice(range,rows.endIndex+1-start),1,removeCount,start,end),top=me.variableRowHeight?me.bodyTop+increment:calculatedTop):(removeCount=Math.max(rows.endIndex-end,0),oldStart=rows.startIndex,rows.scroll(Ext.Array.slice(range,0,rows.startIndex-start),-1,removeCount,start,end),top=me.variableRowHeight?me.bodyTop-rows.item(oldStart,!0).offsetTop:calculatedTop):view.doAdd(range,start),me.position=me.scrollTop,view.positionBody&&me.setBodyTop(top,calculatedTop),!lockingPartner||lockingPartner.disabled||fromLockingPartner||(lockingPartner.onRangeFetched(range,start,end,!0),lockingPartner.scrollTop!==me.scrollTop&&(lockingPartner.view.el.dom.scrollTop=me.scrollTop)))},setBodyTop:function(bodyTop,calculatedTop){var delta,me=this,view=me.view,store=me.store,body=view.body.dom;bodyTop=Math.floor(bodyTop),void 0!==calculatedTop&&(delta=bodyTop-calculatedTop,bodyTop=calculatedTop),body.style.position="absolute",body.style.top=(me.bodyTop=bodyTop)+"px",delta&&(me.scrollTop=me.position=view.el.dom.scrollTop-=delta),view.all.endIndex===(store.buffered?store.getTotalCount():store.getCount())-1&&me.stretchView(view,me.bodyTop+body.offsetHeight)},getFirstVisibleRowIndex:function(startRow,endRow,viewportTop,viewportBottom){var target,targetTop,me=this,view=me.view,rows=view.all,elements=rows.elements,clientHeight=view.el.dom.clientHeight;if(rows.getCount()&&me.variableRowHeight){if(arguments.length)target=startRow+Math.floor((endRow-startRow)/2);else{if(startRow=rows.startIndex,endRow=rows.endIndex,viewportTop=me.scrollTop,viewportBottom=viewportTop+clientHeight,me.bodyTop>viewportBottom||me.bodyTop+view.body.getHeight()<viewportTop)return Math.floor(me.scrollTop/me.rowHeight);target=startRow+Math.min(me.numFromEdge+(-1==me.lastScrollDirection?me.leadingBufferZone:me.trailingBufferZone),Math.floor((endRow-startRow)/2))}if((targetTop=me.bodyTop+elements[target].offsetTop)+elements[target].offsetHeight<viewportTop)return me.getFirstVisibleRowIndex(target+1,endRow,viewportTop,viewportBottom);if(targetTop<=viewportTop)return target;if(target!==startRow)return me.getFirstVisibleRowIndex(startRow,target-1,viewportTop,viewportBottom)}return Math.floor(me.scrollTop/me.rowHeight)},getLastVisibleRowIndex:function(startRow,endRow,viewportTop,viewportBottom){var target,targetTop,me=this,view=me.view,rows=view.all,elements=rows.elements,clientHeight=view.el.dom.clientHeight;if(rows.getCount()&&me.variableRowHeight){if(arguments.length)target=startRow+Math.floor((endRow-startRow)/2);else{if(startRow=rows.startIndex,endRow=rows.endIndex,viewportTop=me.scrollTop,viewportBottom=viewportTop+clientHeight,me.bodyTop>viewportBottom||me.bodyTop+view.body.getHeight()<viewportTop)return Math.floor(me.scrollTop/me.rowHeight)+Math.ceil(clientHeight/me.rowHeight);target=endRow-Math.min(me.numFromEdge+(1==me.lastScrollDirection?me.leadingBufferZone:me.trailingBufferZone),Math.floor((endRow-startRow)/2))}if((targetTop=me.bodyTop+elements[target].offsetTop)>viewportBottom)return me.getLastVisibleRowIndex(startRow,target-1,viewportTop,viewportBottom);if(targetTop+elements[target].offsetHeight>=viewportBottom)return target;if(target!==endRow)return me.getLastVisibleRowIndex(target+1,endRow,viewportTop,viewportBottom)}return me.getFirstVisibleRowIndex()+Math.ceil(clientHeight/me.rowHeight)},getScrollHeight:function(){var me=this,view=me.view,store=me.store,doCalcHeight=!me.hasOwnProperty("rowHeight");return me.store.getCount()?(doCalcHeight&&view.all.getCount()&&(me.rowHeight=Math.floor(view.body.getHeight()/view.all.getCount())),this.scrollHeight=Math.floor((store.buffered?store.getTotalCount():store.getCount())*me.rowHeight)):0},attemptLoad:function(start,end){var me=this;me.scrollToLoadBuffer?(me.loadTask||(me.loadTask=new Ext.util.DelayedTask(me.doAttemptLoad,me,[])),me.loadTask.delay(me.scrollToLoadBuffer,me.doAttemptLoad,me,[start,end])):me.store.getRange(start,end,{callback:me.onRangeFetched,scope:me,fireEvent:!1})},cancelLoad:function(){this.loadTask&&this.loadTask.cancel()},doAttemptLoad:function(start,end){this.store.getRange(start,end,{callback:this.onRangeFetched,scope:this,fireEvent:!1})},destroy:function(){var me=this,view=me.view;view&&view.el&&view.el.un("scroll",me.onViewScroll,me),Ext.destroy(me.viewListeners,me.storeListeners,me.gridListeners)}});Ext.define("Ext.grid.plugin.Editing",{alias:"editing.editing",extend:"Ext.AbstractPlugin",requires:["Ext.grid.column.Column","Ext.util.KeyNav"],mixins:{observable:"Ext.util.Observable"},clicksToEdit:2,triggerEvent:void 0,relayedEvents:["beforeedit","edit","validateedit","canceledit"],defaultFieldXType:"textfield",editStyle:"",constructor:function(config){var me=this;me.addEvents("beforeedit","edit","validateedit","canceledit"),me.callParent(arguments),me.mixins.observable.constructor.call(me),me.on("edit",function(editor,e){me.fireEvent("afteredit",editor,e)})},init:function(grid){var me=this;me.grid=grid,me.view=grid.view,me.initEvents(),me.mon(grid,{beforereconfigure:me.onBeforeReconfigure,reconfigure:me.onReconfigure,scope:me,beforerender:{fn:me.onReconfigure,single:!0,scope:me}}),grid.relayEvents(me,me.relayedEvents),me.grid.ownerLockable&&me.grid.ownerLockable.relayEvents(me,me.relayedEvents),grid.isEditable=!0,grid.editingPlugin=grid.view.editingPlugin=me},onBeforeReconfigure:function(){this.reconfiguring=!0},onReconfigure:function(){this.initFieldAccessors(this.grid.getTopLevelColumnManager().getColumns()),delete this.reconfiguring},destroy:function(){var me=this,grid=me.grid;Ext.destroy(me.keyNav),me.clearListeners(),grid&&(grid.editingPlugin=grid.view.editingPlugin=me.grid=me.view=me.editor=me.keyNav=null)},getEditStyle:function(){return this.editStyle},initFieldAccessors:function(columns){columns.isGroupHeader?columns=columns.getGridColumns():Ext.isArray(columns)||(columns=[columns]);var c,column,me=this,cLen=columns.length;for(c=0;c<cLen;c++)column=columns[c],column.getEditor||(column.getEditor=function(record,defaultField){return me.getColumnField(this,defaultField)}),column.hasEditor||(column.hasEditor=function(){return me.hasColumnField(this)}),column.setEditor||(column.setEditor=function(field){me.setColumnField(this,field)})},removeFieldAccessors:function(columns){columns.isGroupHeader?columns=columns.getGridColumns():Ext.isArray(columns)||(columns=[columns]);var c,column,cLen=columns.length;for(c=0;c<cLen;c++)column=columns[c],column.getEditor=column.hasEditor=column.setEditor=null},getColumnField:function(columnHeader,defaultField){var field=columnHeader.field;return field&&field.isFormField||(field=columnHeader.field=this.createColumnField(columnHeader,defaultField)),field},hasColumnField:function(columnHeader){return!!columnHeader.field},setColumnField:function(columnHeader,field){columnHeader.field=field,columnHeader.field=this.createColumnField(columnHeader)},createColumnField:function(columnHeader,defaultField){var field=columnHeader.field;return!field&&columnHeader.editor&&(field=columnHeader.editor,columnHeader.editor=null),!field&&defaultField&&(field=defaultField),field&&(field.isComponent?(field.column=columnHeader,field.isEditorComponent=!0):(field=Ext.isString(field)?{name:columnHeader.dataIndex,xtype:field,column:columnHeader,isEditorComponent:!0}:Ext.apply({name:columnHeader.dataIndex,column:columnHeader,isEditorComponent:!0},field),field=Ext.ComponentManager.create(field,this.defaultFieldXType)),columnHeader.field=field),field},initEvents:function(){var me=this;me.initEditTriggers(),me.initLockableEvents(),me.initCancelTriggers()},initCancelTriggers:Ext.emptyFn,initEditTriggers:function(){var me=this,view=me.view;"cellfocus"==me.triggerEvent?me.mon(view,"cellfocus",me.onCellFocus,me):"rowfocus"==me.triggerEvent?me.mon(view,"rowfocus",me.onRowFocus,me):(view.getSelectionModel().isCellModel&&(view.onCellFocus=Ext.Function.bind(me.beforeViewCellFocus,me)),me.mon(view,me.triggerEvent||"cell"+(1===me.clicksToEdit?"click":"dblclick"),me.onCellClick,me)),me.initAddRemoveHeaderEvents(),view.on("render",me.initKeyNavHeaderEvents,me,{single:!0})},initLockableEvents:function(){var me=this,grid=me.grid.ownerLockable;grid&&grid.on({lockcolumn:me.onColumnLockUnlock,unlockcolumn:me.onColumnLockUnlock,scope:me})},beforeViewCellFocus:function(position){!this.view.selModel.keyNavigation&&this.editing&&this.isCellEditable&&this.isCellEditable(position.row,position.columnHeader)||this.view.focusCell.apply(this.view,arguments)},onRowFocus:function(record,row,rowIdx){this.startEdit(row,0)},onCellFocus:function(record,cell,position){this.startEdit(position.row,position.column)},onCellClick:function(view,cell,colIdx,record,row,rowIdx,e){var expanderSelector=view.expanderSelector,columnHeader=view.ownerCt.getColumnManager().getHeaderAtIndex(colIdx);(columnHeader.getEditor(record)&&!expanderSelector||!e.getTarget(expanderSelector))&&this.startEdit(record,columnHeader)},initAddRemoveHeaderEvents:function(){var me=this;me.mon(me.grid.headerCt,{scope:me,add:me.onColumnAdd,remove:me.onColumnRemove,columnmove:me.onColumnMove})},initKeyNavHeaderEvents:function(){var me=this;me.keyNav=Ext.create("Ext.util.KeyNav",me.view.el,{enter:me.onEnterKey,esc:me.onEscKey,scope:me})},onColumnAdd:function(ct,column){this.initFieldAccessors(column)},onColumnRemove:function(ct,column){this.removeFieldAccessors(column)},onColumnMove:function(headerCt,column,fromIdx,toIdx){this.initFieldAccessors(column)},onColumnLockUnlock:function(view,column){this.initFieldAccessors(column)},onEnterKey:function(e){var record,pos,columnHeader,me=this,grid=me.grid,selModel=grid.getSelectionModel();selModel.getCurrentPosition&&(pos=selModel.getCurrentPosition())?(record=pos.record,columnHeader=pos.columnHeader):(record=selModel.getLastSelected(),columnHeader=grid.getColumnManager().getHeaderAtIndex(0)),record&&columnHeader&&me.startEdit(record,columnHeader)},onEscKey:function(e){return this.cancelEdit()},beforeEdit:Ext.emptyFn,startEdit:function(record,columnHeader){var context,me=this,layoutView=me.grid.lockable?me.grid:me.view;return layoutView.componentLayoutCounter?!(me.grid.collapsed||!me.grid.view.isVisible(!0))&&(null!=(context=me.getEditingContext(record,columnHeader))&&(!(!me.preventBeforeCheck&&(!1===me.beforeEdit(context)||!1===me.fireEvent("beforeedit",me,context)||context.cancel))&&context)):(layoutView.on({boxready:Ext.Function.bind(me.startEdit,me,[record,columnHeader]),single:!0}),!1)},getEditingContext:function(record,columnHeader){var view,gridRow,rowIdx,colIdx,me=this,grid=me.grid,colMgr=grid.getColumnManager();if(Ext.isNumber(columnHeader)&&(columnHeader=colMgr.getHeaderAtIndex(columnHeader)),columnHeader.hidden&&(columnHeader=columnHeader.next(":not([hidden])")||columnHeader.prev(":not([hidden])")),columnHeader&&(view=columnHeader.getOwnerHeaderCt().view,(gridRow=view.getNode(record,!0))&&(colIdx=colMgr.getHeaderIndex(columnHeader),Ext.isNumber(record)?(rowIdx=record,record=view.getRecord(gridRow)):rowIdx=view.indexOf(gridRow),record)))return{grid:grid,view:view,store:view.dataSource,record:record,field:columnHeader.dataIndex,value:record.get(columnHeader.dataIndex),row:gridRow,column:columnHeader,rowIdx:rowIdx,colIdx:colIdx}},cancelEdit:function(){var me=this;me.editing=!1,me.fireEvent("canceledit",me,me.context)},completeEdit:function(){var me=this;me.editing&&me.validateEdit()&&me.fireEvent("edit",me,me.context),me.context=null,me.editing=!1},validateEdit:function(){var me=this,context=me.context;return!1!==me.fireEvent("validateedit",me,context)&&!context.cancel}});Ext.define("Ext.grid.plugin.CellEditing",{alias:"plugin.cellediting",extend:"Ext.grid.plugin.Editing",requires:["Ext.grid.CellEditor","Ext.util.DelayedTask"],lockableScope:"both",init:function(grid){var me=this,lockingPartner=me.lockingPartner;me.callParent(arguments),lockingPartner?lockingPartner.editors?me.editors=lockingPartner.editors:me.editors=lockingPartner.editors=new Ext.util.MixedCollection(!1,function(editor){return editor.editorId}):me.editors=new Ext.util.MixedCollection(!1,function(editor){return editor.editorId})},onReconfigure:function(grid,store,columns){columns&&this.editors.clear(),this.callParent()},destroy:function(){var me=this;me.editors&&(me.editors.each(Ext.destroy,Ext),me.editors.clear()),me.callParent(arguments)},onBodyScroll:function(){var me=this,ed=me.getActiveEditor(),scroll=me.view.el.getScroll();ed&&ed.editing&&ed.editingPlugin===me&&(scroll.top!==me.scroll.top?ed.field&&(ed.field.triggerBlur?ed.field.triggerBlur():ed.field.blur()):ed.realign()),me.scroll=scroll},initCancelTriggers:function(){var me=this,grid=me.grid,view=grid.view;me.mon(view,"bodyscroll",me.onBodyScroll,me),me.mon(grid,{columnresize:me.cancelEdit,columnmove:me.cancelEdit,scope:me})},isCellEditable:function(record,columnHeader){var me=this,context=me.getEditingContext(record,columnHeader);if(me.grid.view.isVisible(!0)&&context&&(columnHeader=context.column,record=context.record,columnHeader&&me.getEditor(record,columnHeader)))return!0},startEdit:function(record,columnHeader,context){var isEditorEditing,isFieldEditable,ed,me=this;return!(!context&&(me.preventBeforeCheck=!0,context=me.callParent(arguments),delete me.preventBeforeCheck,!1===context))&&(context&&me.grid.view.isVisible(!0)?(record=context.record,columnHeader=context.column,isFieldEditable=columnHeader&&columnHeader.getEditor(record)&&!(!1===me.beforeEdit(context)||!1===me.fireEvent("beforeedit",me,context)||context.cancel),isFieldEditable&&(ed=me.getEditor(record,columnHeader),isEditorEditing=ed.editing),me.completeEdit(),!!isFieldEditable&&(me.context=context,context.originalValue=context.value=record.get(columnHeader.dataIndex),me.grid.view.cancelFocus(),me.view.scrollCellIntoView(me.getCell(record,columnHeader)),!!ed&&(Ext.isIE&&isEditorEditing&&(ed.selectSameEditor=!0),me.showEditor(ed,context,context.value),!0))):void 0)},showEditor:function(ed,context,value){var me=this,record=context.record,columnHeader=context.column,sm=me.grid.getSelectionModel(),preventFocus=sm.preventFocus,selection=sm.getCurrentPosition();if(!columnHeader.up(me.view.ownerCt))return me.lockingPartner.showEditor(ed,me.lockingPartner.getEditingContext(selection.record,selection.columnHeader),value);me.setEditingContext(context),me.setActiveEditor(ed),me.setActiveRecord(record),me.setActiveColumn(columnHeader),selection&&sm.isCellSelected(me.view,record,columnHeader)||(sm.preventFocus=!0,sm.selectByPosition({row:record,column:columnHeader,view:me.view}),sm.preventFocus=preventFocus),Ext.isIE&&"click"===Ext.EventObject.type?Ext.Function.defer(ed.startEdit,1,ed,[me.getCell(record,columnHeader),value,context]):ed.startEdit(me.getCell(record,columnHeader),value,context),me.editing=!0,me.scroll=me.view.el.getScroll()},completeEdit:function(){var activeEd=this.getActiveEditor();activeEd&&(activeEd.completeEdit(),this.editing=!1)},setEditingContext:function(context){this.context=context,this.lockingPartner&&(this.lockingPartner.context=context)},setActiveEditor:function(ed){this.activeEditor=ed,this.lockingPartner&&(this.lockingPartner.activeEditor=ed)},getActiveEditor:function(){return this.activeEditor},setActiveColumn:function(column){this.activeColumn=column,this.lockingPartner&&(this.lockingPartner.activeColumn=column)},getActiveColumn:function(){return this.activeColumn},setActiveRecord:function(record){this.activeRecord=record,this.lockingPartner&&(this.lockingPartner.activeRecord=record)},getActiveRecord:function(){return this.activeRecord},getEditor:function(record,column){var me=this,editors=me.editors,editorId=column.getItemId(),editor=editors.getByKey(editorId),editorOwner=me.grid.ownerLockable||me.grid;if(!editor){if(!(editor=column.getEditor(record)))return!1;editor instanceof Ext.grid.CellEditor?editor.floating=!0:editor=new Ext.grid.CellEditor({floating:!0,editorId:editorId,field:editor}),editor.field.excludeForm=!0,editorOwner.add(editor),editor.on({scope:me,specialkey:me.onSpecialKey,complete:me.onEditComplete,canceledit:me.cancelEdit}),column.on("removed",me.cancelActiveEdit,me),editors.add(editor)}return column.isTreeColumn&&(editor.isForTree=column.isTreeColumn,editor.addCls(Ext.baseCSSPrefix+"tree-cell-editor")),editor.grid=me.grid,editor.editingPlugin=me,editor},cancelActiveEdit:function(column){var context=this.context;context&&context.column===column&&this.cancelEdit()},setColumnField:function(column,field){var ed=this.editors.getByKey(column.getItemId());Ext.destroy(ed,column.field),this.editors.removeAtKey(column.getItemId()),this.callParent(arguments)},getCell:function(record,column){return this.grid.getView().getCell(record,column)},onSpecialKey:function(ed,field,e){var sm;if(e.getKey()===e.TAB&&(e.stopEvent(),ed&&ed.onEditorTab(e),sm=ed.up("tablepanel").getSelectionModel(),sm.onEditorTab))return sm.onEditorTab(ed.editingPlugin,e)},onEditComplete:function(ed,value,startValue){var record,me=this,activeColumn=me.getActiveColumn(),context=me.context;if(activeColumn){if(record=context.record,me.setActiveEditor(null),me.setActiveColumn(null),me.setActiveRecord(null),context.value=value,!me.validateEdit())return void(me.editing=!1);record.isEqual(value,startValue)||record.set(activeColumn.dataIndex,value),context.view.focusRow(context.rowIdx,100),me.fireEvent("edit",me,context),me.editing=!1}},cancelEdit:function(){var me=this,context=me.context,activeEd=me.getActiveEditor();return me.setActiveEditor(null),me.setActiveColumn(null),me.setActiveRecord(null),!activeEd||(activeEd.field&&(me.context.value="editedValue"in activeEd?activeEd.editedValue:activeEd.getValue(),activeEd.cancelEdit()),context.view.focusRow(context.rowIdx,100),void me.callParent(arguments))},startEditByPosition:function(position){var index,cm=this.grid.getColumnManager();return position.isCellContext||(position=new Ext.grid.CellContext(this.view).setPosition(position)),index=cm.getHeaderIndex(position.columnHeader),position.setColumn(cm.getVisibleHeaderClosestToIndex(index)),this.startEdit(position.record,position.columnHeader)}});Ext.define("Ext.grid.plugin.DragDrop",{extend:"Ext.AbstractPlugin",alias:"plugin.gridviewdragdrop",uses:["Ext.view.DragZone","Ext.grid.ViewDropZone"],dragText:"{0} selected row{1}",ddGroup:"GridDD",enableDrop:!0,enableDrag:!0,containerScroll:!1,init:function(view){view.on("render",this.onViewRender,this,{single:!0})},destroy:function(){Ext.destroy(this.dragZone,this.dropZone)},enable:function(){var me=this;me.dragZone&&me.dragZone.unlock(),me.dropZone&&me.dropZone.unlock(),me.callParent()},disable:function(){var me=this;me.dragZone&&me.dragZone.lock(),me.dropZone&&me.dropZone.lock(),me.callParent()},onViewRender:function(view){var scrollEl,me=this;me.enableDrag&&(me.containerScroll&&(scrollEl=view.getEl()),me.dragZone=new Ext.view.DragZone({view:view,ddGroup:me.dragGroup||me.ddGroup,dragText:me.dragText,containerScroll:me.containerScroll,scrollEl:scrollEl})),me.enableDrop&&(me.dropZone=new Ext.grid.ViewDropZone({view:view,ddGroup:me.dropGroup||me.ddGroup}))}});Ext.define("Ext.grid.property.HeaderContainer",{extend:"Ext.grid.header.Container",alternateClassName:"Ext.grid.PropertyColumnModel",nameWidth:115,nameText:"Name",valueText:"Value",dateFormat:"m/j/Y",trueText:"true",falseText:"false",nameColumnCls:Ext.baseCSSPrefix+"grid-property-name",nameColumnInnerCls:Ext.baseCSSPrefix+"grid-cell-inner-property-name",constructor:function(grid,store){var me=this;me.grid=grid,me.store=store,me.callParent([{isRootHeader:!0,enableColumnResize:Ext.isDefined(grid.enableColumnResize)?grid.enableColumnResize:me.enableColumnResize,enableColumnMove:Ext.isDefined(grid.enableColumnMove)?grid.enableColumnMove:me.enableColumnMove,items:[{header:me.nameText,width:grid.nameColumnWidth||me.nameWidth,sortable:grid.sortableColumns,dataIndex:grid.nameField,renderer:Ext.Function.bind(me.renderProp,me),itemId:grid.nameField,menuDisabled:!0,tdCls:me.nameColumnCls,innerCls:me.nameColumnInnerCls},{header:me.valueText,renderer:Ext.Function.bind(me.renderCell,me),getEditor:Ext.Function.bind(me.getCellEditor,me),sortable:grid.sortableColumns,flex:1,fixed:!0,dataIndex:grid.valueField,itemId:grid.valueField,menuDisabled:!0}]}]),me.grid.valueColumn=me.items.items[1]},getCellEditor:function(record){return this.grid.getCellEditor(record,this)},renderProp:function(v){return this.getPropertyName(v)},renderCell:function(val,meta,rec){var me=this,grid=me.grid,renderer=grid.getConfig(rec.get(grid.nameField),"renderer"),result=val;return renderer?renderer.apply(me,arguments):(Ext.isDate(val)?result=me.renderDate(val):Ext.isBoolean(val)&&(result=me.renderBool(val)),Ext.util.Format.htmlEncode(result))},renderDate:Ext.util.Format.date,renderBool:function(bVal){return this[bVal?"trueText":"falseText"]},getPropertyName:function(name){return this.grid.getConfig(name,"displayName",name)}});Ext.define("Ext.grid.property.Property",{extend:"Ext.data.Model",alternateClassName:"Ext.PropGridProperty",fields:[{name:"name",type:"string"},{name:"value"}],idProperty:"name"});Ext.define("Ext.grid.property.Store",{extend:"Ext.data.Store",alternateClassName:"Ext.grid.PropertyStore",sortOnLoad:!1,uses:["Ext.data.reader.Reader","Ext.data.proxy.Proxy","Ext.data.ResultSet","Ext.grid.property.Property"],constructor:function(grid,source){var me=this;me.grid=grid,me.source=source,me.callParent([{data:source,model:Ext.grid.property.Property,proxy:me.getProxy()}])},getProxy:function(){return this.proxy||(Ext.grid.property.Store.prototype.proxy=new Ext.data.proxy.Memory({model:Ext.grid.property.Property,reader:this.getReader()})),this.proxy},getReader:function(){return this.reader||(Ext.grid.property.Store.prototype.reader=new Ext.data.reader.Reader({model:Ext.grid.property.Property,buildExtractors:Ext.emptyFn,read:function(dataObject){return this.readRecords(dataObject)},readRecords:function(dataObject){var val,propName,result={records:[],success:!0};for(propName in dataObject)dataObject.hasOwnProperty(propName)&&(val=dataObject[propName],this.isEditableValue(val)&&result.records.push(new Ext.grid.property.Property({name:propName,value:val},propName)));return result.total=result.count=result.records.length,new Ext.data.ResultSet(result)},isEditableValue:function(val){return Ext.isPrimitive(val)||Ext.isDate(val)||null===val}})),this.reader},setSource:function(dataObject){var me=this;me.source=dataObject,me.suspendEvents(),me.removeAll(),me.proxy.data=dataObject,me.load(),me.resumeEvents(),me.fireEvent("datachanged",me),me.fireEvent("refresh",me)},getProperty:function(row){return Ext.isNumber(row)?this.getAt(row):this.getById(row)},setValue:function(prop,value,create){var me=this,rec=me.getRec(prop);rec?(rec.set("value",value),me.source[prop]=value):create&&(me.source[prop]=value,rec=new Ext.grid.property.Property({name:prop,value:value},prop),me.add(rec))},remove:function(prop){var rec=this.getRec(prop);rec&&(this.callParent([rec]),delete this.source[prop])},getRec:function(prop){return this.getById(prop)},getSource:function(){return this.source}});Ext.define("Ext.layout.ClassList",function(){var splitWords=Ext.String.splitWords,toMap=Ext.Array.toMap;return{dirty:!1,constructor:function(owner){this.owner=owner,this.map=toMap(this.classes=splitWords(owner.el.className))},add:function(cls){var me=this;me.map[cls]||(me.map[cls]=!0,me.classes.push(cls),me.dirty||(me.dirty=!0,me.owner.markDirty()))},addMany:function(classes){Ext.each(splitWords(classes),this.add,this)},contains:function(cls){return this.map[cls]},flush:function(){this.owner.el.className=this.classes.join(" "),this.dirty=!1},remove:function(cls){var me=this;me.map[cls]&&(delete me.map[cls],me.classes=Ext.Array.filter(me.classes,function(c){return c!=cls}),me.dirty||(me.dirty=!0,me.owner.markDirty()))},removeMany:function(classes){var me=this,remove=toMap(splitWords(classes));me.classes=Ext.Array.filter(me.classes,function(c){return!remove[c]||(delete me.map[c],me.dirty||(me.dirty=!0,me.owner.markDirty()),!1)})}}}());Ext.define("Ext.util.Queue",{constructor:function(){this.clear()},add:function(obj){var me=this,key=me.getKey(obj);return me.map[key]||(++me.length,me.items.push(obj),me.map[key]=obj),obj},clear:function(){var me=this,items=me.items;return me.items=[],me.map={},me.length=0,items},contains:function(obj){var key=this.getKey(obj);return this.map.hasOwnProperty(key)},getCount:function(){return this.length},getKey:function(obj){return obj.id},remove:function(obj){var index,me=this,key=me.getKey(obj),items=me.items;return me.map[key]&&(index=Ext.Array.indexOf(items,obj),Ext.Array.erase(items,index,1),delete me.map[key],--me.length),obj}});Ext.define("Ext.layout.ContextItem",{requires:["Ext.layout.ClassList"],heightModel:null,widthModel:null,sizeModel:null,optOut:!1,ownerSizePolicy:null,boxChildren:null,boxParent:null,isBorderBoxValue:null,children:[],dirty:null,dirtyCount:0,hasRawContent:!0,isContextItem:!0,isTopLevel:!1,consumersContentHeight:0,consumersContentWidth:0,consumersContainerHeight:0,consumersContainerWidth:0,consumersHeight:0,consumersWidth:0,ownerCtContext:null,remainingChildDimensions:0,props:null,state:null,wrapsComponent:!1,constructor:function(config){var el,lastBox,ownerCt,ownerCtContext,props,sizeModel,target,lastWidth,lastHeight,sameWidth,sameHeight,widthModel,heightModel,optOut,me=this,sizeModels=Ext.layout.SizeModel.sizeModels,configured=sizeModels.configured,shrinkWrap=sizeModels.shrinkWrap;Ext.apply(me,config),el=me.el,me.id=el.id,me.flushedProps={},me.props=props={},me.styles={},target=me.target,target.isComponent?(me.wrapsComponent=!0,me.framing=target.frameSize||null,me.isComponentChild=target.ownerLayout&&target.ownerLayout.isComponentLayout,lastBox=target.lastBox,ownerCt=target.ownerCt,ownerCt&&(ownerCtContext=ownerCt.el&&me.context.items[ownerCt.el.id])&&(me.ownerCtContext=ownerCtContext),me.sizeModel=sizeModel=target.getSizeModel(ownerCtContext&&ownerCtContext.widthModel.pairsByHeightOrdinal[ownerCtContext.heightModel.ordinal]),me.widthModel=widthModel=sizeModel.width,me.heightModel=heightModel=sizeModel.height,lastBox&&!1===lastBox.invalid&&(sameWidth=target.width===(lastWidth=lastBox.width),sameHeight=target.height===(lastHeight=lastBox.height),widthModel===shrinkWrap&&heightModel===shrinkWrap?optOut=!0:widthModel===configured&&sameWidth&&(optOut=heightModel===shrinkWrap||heightModel===configured&&sameHeight),optOut&&(me.optOut=!0,props.width=lastWidth,props.height=lastHeight))):lastBox=el.lastBox,me.lastBox=lastBox},init:function(full,options){var children,i,n,ownerCt,sizeModel,target,newHeightModel,newWidthModel,me=this,oldProps=me.props,oldDirty=me.dirty,ownerCtContext=me.ownerCtContext,ownerLayout=me.target.ownerLayout,firstTime=!me.state,ret=full||firstTime,oldHeightModel=me.heightModel,oldWidthModel=me.widthModel,remainingCount=0;if(me.dirty=me.invalid=!1,me.props={},me.remainingChildDimensions=0,me.boxChildren&&(me.boxChildren.length=0),firstTime||(me.clearAllBlocks("blocks"),me.clearAllBlocks("domBlocks")),!me.wrapsComponent)return ret;if(target=me.target,me.state={},firstTime)target.beforeLayout&&target.beforeLayout!==Ext.emptyFn&&target.beforeLayout(),!ownerCtContext&&(ownerCt=target.ownerCt)&&(ownerCtContext=me.context.items[ownerCt.el.id]),ownerCtContext?(me.ownerCtContext=ownerCtContext,me.isBoxParent=target.ownerLayout.isItemBoxParent(me)):me.isTopLevel=!0,me.frameBodyContext=me.getEl("frameBody");else for(ownerCtContext=me.ownerCtContext,me.isTopLevel=!ownerCtContext,children=me.children,i=0,n=children.length;i<n;++i)children[i].init(!0);return me.hasRawContent=!(target.isContainer&&target.items.items.length>0),full?(me.widthModel=me.heightModel=null,sizeModel=target.getSizeModel(ownerCtContext&&ownerCtContext.widthModel.pairsByHeightOrdinal[ownerCtContext.heightModel.ordinal]),firstTime&&(me.sizeModel=sizeModel),me.widthModel=sizeModel.width,me.heightModel=sizeModel.height,ownerCtContext&&!me.isComponentChild&&(ownerCtContext.remainingChildDimensions+=2)):oldProps&&(me.recoverProp("x",oldProps,oldDirty),me.recoverProp("y",oldProps,oldDirty),me.widthModel.calculated?me.recoverProp("width",oldProps,oldDirty):"width"in oldProps&&++remainingCount,me.heightModel.calculated?me.recoverProp("height",oldProps,oldDirty):"height"in oldProps&&++remainingCount,ownerCtContext&&!me.isComponentChild&&(ownerCtContext.remainingChildDimensions+=remainingCount)),oldProps&&ownerLayout&&ownerLayout.manageMargins&&(me.recoverProp("margin-top",oldProps,oldDirty),me.recoverProp("margin-right",oldProps,oldDirty),me.recoverProp("margin-bottom",oldProps,oldDirty),me.recoverProp("margin-left",oldProps,oldDirty)),options&&(newHeightModel=options.heightModel,newWidthModel=options.widthModel,newWidthModel&&newHeightModel&&oldWidthModel&&oldHeightModel&&oldWidthModel.shrinkWrap&&oldHeightModel.shrinkWrap&&newWidthModel.constrainedMax&&newHeightModel.constrainedMin&&(newHeightModel=null),newWidthModel&&(me.widthModel=newWidthModel),newHeightModel&&(me.heightModel=newHeightModel),options.state&&Ext.apply(me.state,options.state)),ret},initContinue:function(full){var boxParent,me=this,ownerCtContext=me.ownerCtContext,comp=me.target,widthModel=me.widthModel,hierarchyState=comp.getHierarchyState();return widthModel.fixed?hierarchyState.inShrinkWrapTable=!1:delete hierarchyState.inShrinkWrapTable,full&&(ownerCtContext&&widthModel.shrinkWrap?(boxParent=ownerCtContext.isBoxParent?ownerCtContext:ownerCtContext.boxParent)&&boxParent.addBoxChild(me):widthModel.natural&&(me.boxParent=ownerCtContext)),full},initDone:function(containerLayoutDone){var me=this,props=me.props,state=me.state;0===me.remainingChildDimensions&&(props.containerChildrenSizeDone=!0),containerLayoutDone&&(props.containerLayoutDone=!0),me.boxChildren&&me.boxChildren.length&&me.widthModel.shrinkWrap&&(me.el.setWidth(1e4),state.blocks=(state.blocks||0)+1)},initAnimation:function(){var me=this,target=me.target,ownerCtContext=me.ownerCtContext;ownerCtContext&&ownerCtContext.isTopLevel?me.animatePolicy=target.ownerLayout.getAnimatePolicy(me):!ownerCtContext&&target.isCollapsingOrExpanding&&target.animCollapse&&(me.animatePolicy=target.componentLayout.getAnimatePolicy(me)),me.animatePolicy&&me.context.queueAnimation(me)},addCls:function(newCls){this.getClassList().addMany(newCls)},removeCls:function(removeCls){this.getClassList().removeMany(removeCls)},addBlock:function(name,layout,propName){var me=this,collection=me[name]||(me[name]={}),blockedLayouts=collection[propName]||(collection[propName]={});blockedLayouts[layout.id]||(blockedLayouts[layout.id]=layout,++layout.blockCount,++me.context.blockCount)},addBoxChild:function(boxChildItem){var children,me=this,widthModel=boxChildItem.widthModel;boxChildItem.boxParent=this,boxChildItem.measuresBox=widthModel.shrinkWrap?boxChildItem.hasRawContent:widthModel.natural,boxChildItem.measuresBox&&(children=me.boxChildren,children?children.push(boxChildItem):me.boxChildren=[boxChildItem])},addPositionStyles:function(styles,props){var x=props.x,y=props.y,count=0;return void 0!==x&&(styles.left=x+"px",++count),void 0!==y&&(styles.top=y+"px",++count),count},addTrigger:function(propName,inDom){var me=this,name=inDom?"domTriggers":"triggers",collection=me[name]||(me[name]={}),context=me.context,layout=context.currentLayout,triggers=collection[propName]||(collection[propName]={});triggers[layout.id]||(triggers[layout.id]=layout,++layout.triggerCount,triggers=context.triggers[inDom?"dom":"data"],(triggers[layout.id]||(triggers[layout.id]=[])).push({item:this,prop:propName}),void 0!==me.props[propName]&&(inDom&&me.dirty&&propName in me.dirty||++layout.firedTriggers))},boxChildMeasured:function(){var me=this,state=me.state;(state.boxesMeasured=(state.boxesMeasured||0)+1)==me.boxChildren.length&&(state.clearBoxWidth=1,++me.context.progressCount,me.markDirty())},borderNames:["border-top-width","border-right-width","border-bottom-width","border-left-width"],marginNames:["margin-top","margin-right","margin-bottom","margin-left"],paddingNames:["padding-top","padding-right","padding-bottom","padding-left"],trblNames:["top","right","bottom","left"],cacheMissHandlers:{borderInfo:function(me){var info=me.getStyles(me.borderNames,me.trblNames);return info.width=info.left+info.right,info.height=info.top+info.bottom,info},marginInfo:function(me){var info=me.getStyles(me.marginNames,me.trblNames);return info.width=info.left+info.right,info.height=info.top+info.bottom,info},paddingInfo:function(me){var item=me.frameBodyContext||me,info=item.getStyles(me.paddingNames,me.trblNames);return info.width=info.left+info.right,info.height=info.top+info.bottom,info}},checkCache:function(entry){return this.cacheMissHandlers[entry](this)},clearAllBlocks:function(name){var propName,collection=this[name];if(collection)for(propName in collection)this.clearBlocks(name,propName)},clearBlocks:function(name,propName){var context,layout,layoutId,collection=this[name],blockedLayouts=collection&&collection[propName];if(blockedLayouts){delete collection[propName],context=this.context;for(layoutId in blockedLayouts)layout=blockedLayouts[layoutId],--context.blockCount,--layout.blockCount||layout.pending||layout.done||context.queueLayout(layout)}},block:function(layout,propName){this.addBlock("blocks",layout,propName)},domBlock:function(layout,propName){this.addBlock("domBlocks",layout,propName)},fireTriggers:function(name,propName){var layout,layoutId,collection=this[name],triggers=collection&&collection[propName],context=this.context;if(triggers)for(layoutId in triggers)layout=triggers[layoutId],++layout.firedTriggers,layout.done||layout.blockCount||layout.pending||context.queueLayout(layout)},flush:function(){var me=this,dirty=me.dirty,state=me.state,targetEl=me.el;me.dirtyCount=0,me.classList&&me.classList.dirty&&me.classList.flush(),"attributes"in me&&(targetEl.set(me.attributes),delete me.attributes),"innerHTML"in me&&(targetEl.innerHTML=me.innerHTML,delete me.innerHTML),state&&state.clearBoxWidth&&(state.clearBoxWidth=0,me.el.setStyle("width",null),--state.blocks||me.context.queueItemLayouts(me)),dirty&&(delete me.dirty,me.writeProps(dirty,!0))},flushAnimations:function(){var target,targetAnim,duration,animateProps,anim,changeCount,j,propsLen,propName,oldValue,newValue,me=this,animateFrom=me.previousSize;if(animateFrom){for(target=me.target,targetAnim=target.layout&&target.layout.animate,targetAnim&&(duration=Ext.isNumber(targetAnim)?targetAnim:targetAnim.duration),animateProps=Ext.Object.getKeys(me.animatePolicy),anim=Ext.apply({},{from:{},to:{},duration:duration||Ext.fx.Anim.prototype.duration},targetAnim),changeCount=0,j=0,propsLen=animateProps.length;j<propsLen;j++)propName=animateProps[j],oldValue=animateFrom[propName],newValue=me.peek(propName),oldValue!=newValue&&(propName=me.translateProps[propName]||propName,anim.from[propName]=oldValue,anim.to[propName]=newValue,++changeCount);changeCount&&(1===me.isCollapsingOrExpanding?target.componentLayout.undoLayout(me):me.writeProps(anim.from),me.el.animate(anim),Ext.fx.Manager.getFxQueue(me.el.id)[0].on({afteranimate:function(){1===me.isCollapsingOrExpanding?(target.componentLayout.redoLayout(me),target.afterCollapse(!0)):2===me.isCollapsingOrExpanding&&target.afterExpand(!0)}}))}},getBorderInfo:function(){var me=this,info=me.borderInfo;return info||(me.borderInfo=info=me.checkCache("borderInfo")),info},getClassList:function(){return this.classList||(this.classList=new Ext.layout.ClassList(this))},getEl:function(nameOrEl,owner){var src,el,elContext,me=this;if(nameOrEl){if(nameOrEl.dom)el=nameOrEl;else if(src=me.target,owner&&(src=owner),"function"==typeof(el=src[nameOrEl])&&(el=el.call(src))===me.el)return this;el&&(elContext=me.context.getEl(me,el))}return elContext||null},getFrameInfo:function(){var framing,border,me=this,info=me.frameInfo;return info||(framing=me.framing,border=me.getBorderInfo(),me.frameInfo=info=framing?{top:framing.top+border.top,right:framing.right+border.right,bottom:framing.bottom+border.bottom,left:framing.left+border.left,width:framing.width+border.width,height:framing.height+border.height}:border),info},getMarginInfo:function(){var comp,manageMargins,margins,ownerLayout,ownerLayoutId,me=this,info=me.marginInfo;return info||(me.wrapsComponent?(comp=me.target,ownerLayout=comp.ownerLayout,ownerLayoutId=ownerLayout?ownerLayout.id:null,manageMargins=ownerLayout&&ownerLayout.manageMargins,info=comp.margin$,info&&info.ownerId!==ownerLayoutId&&(info=null),info||(info=me.parseMargins(comp,comp.margin)||me.checkCache("marginInfo"),manageMargins&&(margins=me.parseMargins(comp,comp.margins,ownerLayout.defaultMargins),margins&&(info={top:info.top+margins.top,right:info.right+margins.right,bottom:info.bottom+margins.bottom,left:info.left+margins.left}),me.setProp("margin-top",0),me.setProp("margin-right",0),me.setProp("margin-bottom",0),me.setProp("margin-left",0)),info.ownerId=ownerLayoutId,comp.margin$=info),info.width=info.left+info.right,info.height=info.top+info.bottom):info=me.checkCache("marginInfo"),me.marginInfo=info),info},clearMarginCache:function(){delete this.marginInfo,delete this.target.margin$},getPaddingInfo:function(){var me=this,info=me.paddingInfo;return info||(me.paddingInfo=info=me.checkCache("paddingInfo")),info},getProp:function(propName){var me=this,result=me.props[propName];return me.addTrigger(propName),result},getDomProp:function(propName){var me=this,result=me.dirty&&propName in me.dirty?void 0:me.props[propName];return me.addTrigger(propName,!0),result},getStyle:function(styleName){var info,value,me=this,styles=me.styles;return styleName in styles?value=styles[styleName]:(info=me.styleInfo[styleName],value=me.el.getStyle(styleName),info&&info.parseInt&&(value=parseInt(value,10)||0),styles[styleName]=value),value},getStyles:function(styleNames,altNames){var i,missing,missingAltNames,name,info,styleInfo,styles,value,me=this,styleCache=me.styles,values={},hits=0,n=styleNames.length;for(altNames=altNames||styleNames,i=0;i<n;++i)name=styleNames[i],name in styleCache?(values[altNames[i]]=styleCache[name],++hits,i&&1==hits&&(missing=styleNames.slice(0,i),missingAltNames=altNames.slice(0,i))):hits&&((missing||(missing=[])).push(name),(missingAltNames||(missingAltNames=[])).push(altNames[i]));if(hits<n)for(missing=missing||styleNames,missingAltNames=missingAltNames||altNames,styleInfo=me.styleInfo,styles=me.el.getStyle(missing),i=missing.length;i--;)name=missing[i],info=styleInfo[name],value=styles[name],info&&info.parseInt&&(value=parseInt(value,10)||0),values[missingAltNames[i]]=value,styleCache[name]=value;return values},hasProp:function(propName){return null!=this.getProp(propName)},hasDomProp:function(propName){return null!=this.getDomProp(propName)},invalidate:function(options){this.context.queueInvalidate(this,options)},markDirty:function(){1==++this.dirtyCount&&this.context.queueFlush(this)},onBoxMeasured:function(){var boxParent=this.boxParent,state=this.state;boxParent&&boxParent.widthModel.shrinkWrap&&!state.boxMeasured&&this.measuresBox&&(state.boxMeasured=1,boxParent.boxChildMeasured())},parseMargins:function(comp,margins,defaultMargins){!0===margins&&(margins=5);var ret,type=typeof margins;return"string"==type||"number"==type?ret=comp.parseBox(margins):(margins||defaultMargins)&&(ret={top:0,right:0,bottom:0,left:0},defaultMargins&&Ext.apply(ret,this.parseMargins(comp,defaultMargins)),margins&&(margins=Ext.apply(ret,comp.parseBox(margins)))),ret},peek:function(propName){return this.props[propName]},recoverProp:function(propName,oldProps,oldDirty){var dirty,me=this,props=me.props;propName in oldProps&&(props[propName]=oldProps[propName],oldDirty&&propName in oldDirty&&(dirty=me.dirty||(me.dirty={}),dirty[propName]=oldDirty[propName]))},redo:function(deep){var items,len,i,me=this;if(me.revertProps(me.props),deep&&me.wrapsComponent){if(me.childItems)for(i=0,items=me.childItems,len=items.length;i<len;i++)items[i].redo(deep);for(i=0,items=me.children,len=items.length;i<len;i++)items[i].redo()}},removeEl:function(nameOrEl,owner){var src,el,me=this;if(nameOrEl){if(nameOrEl.dom)el=nameOrEl;else if(src=me.target,owner&&(src=owner),"function"==typeof(el=src[nameOrEl])&&(el=el.call(src))===me.el)return this;el&&me.context.removeEl(me,el)}},revertProps:function(props){var name,flushed=this.flushedProps,reverted={};for(name in props)flushed.hasOwnProperty(name)&&(reverted[name]=props[name]);this.writeProps(reverted)},setAttribute:function(name,value){var me=this;me.attributes||(me.attributes={}),me.attributes[name]=value,me.markDirty()},setBox:function(box){var me=this;"left"in box&&me.setProp("x",box.left),"top"in box&&me.setProp("y",box.top),me.setSize(box.width,box.height)},setContentHeight:function(height,measured){return!measured&&this.hasRawContent?1:this.setProp("contentHeight",height)},setContentWidth:function(width,measured){return!measured&&this.hasRawContent?1:this.setProp("contentWidth",width)},setContentSize:function(width,height,measured){return this.setContentWidth(width,measured)+this.setContentHeight(height,measured)==2},setProp:function(propName,value,dirty){var borderBox,me=this,valueType=typeof value;return"undefined"==valueType||"number"===valueType&&isNaN(value)?0:me.props[propName]===value?1:(me.props[propName]=value,++me.context.progressCount,!1===dirty?(me.fireTriggers("domTriggers",propName),me.clearBlocks("domBlocks",propName)):me.styleInfo[propName]&&(me.dirty||(me.dirty={}),"width"!=propName&&"height"!=propName||(borderBox=me.isBorderBoxValue,null===borderBox&&(me.isBorderBoxValue=borderBox=!!me.el.isBorderBox()),borderBox||(me.borderInfo||me.getBorderInfo(),me.paddingInfo||me.getPaddingInfo())),me.dirty[propName]=value,me.markDirty()),me.fireTriggers("triggers",propName),me.clearBlocks("blocks",propName),1)},setHeight:function(height,dirty){var frameBody,frameInfo,min,oldHeight,me=this,comp=me.target,ownerCtContext=me.ownerCtContext;if(height<0&&(height=0),me.wrapsComponent){if(min=me.collapsedVert?0:comp.minHeight||0,height=Ext.Number.constrain(height,min,comp.maxHeight),oldHeight=me.props.height,!me.setProp("height",height,dirty))return NaN;ownerCtContext&&!me.isComponentChild&&isNaN(oldHeight)&&(--ownerCtContext.remainingChildDimensions||ownerCtContext.setProp("containerChildrenSizeDone",!0)),frameBody=me.frameBodyContext,frameBody&&(frameInfo=me.getFrameInfo(),frameBody.setHeight(height-frameInfo.height,dirty))}else if(!me.setProp("height",height,dirty))return NaN;return height},setWidth:function(width,dirty){var frameBody,frameInfo,min,oldWidth,me=this,comp=me.target,ownerCtContext=me.ownerCtContext;if(width<0&&(width=0),me.wrapsComponent){if(min=me.collapsedHorz?0:comp.minWidth||0,width=Ext.Number.constrain(width,min,comp.maxWidth),oldWidth=me.props.width,!me.setProp("width",width,dirty))return NaN;ownerCtContext&&!me.isComponentChild&&isNaN(oldWidth)&&(--ownerCtContext.remainingChildDimensions||ownerCtContext.setProp("containerChildrenSizeDone",!0)),frameBody=me.frameBodyContext,frameBody&&(frameInfo=me.getFrameInfo(),frameBody.setWidth(width-frameInfo.width,dirty))}else if(!me.setProp("width",width,dirty))return NaN;return width},setSize:function(width,height,dirty){this.setWidth(width,dirty),this.setHeight(height,dirty)},translateProps:{x:"left",y:"top"},undo:function(deep){var items,len,i,me=this;if(me.revertProps(me.lastBox),deep&&me.wrapsComponent){if(me.childItems)for(i=0,items=me.childItems,len=items.length;i<len;i++)items[i].undo(deep);for(i=0,items=me.children,len=items.length;i<len;i++)items[i].undo()}},unsetProp:function(propName){var dirty=this.dirty;delete this.props[propName],dirty&&delete dirty[propName]},writeProps:function(dirtyProps,flushing){if(!dirtyProps||"object"!=typeof dirtyProps)return void Ext.Logger.warn("writeProps expected dirtyProps to be an object");var info,propName,numericValue,hasWidth,hasHeight,isAbsolute,scrollbarSize,style,targetEl,me=this,el=me.el,styles={},styleCount=0,styleInfo=me.styleInfo,width=dirtyProps.width,height=dirtyProps.height,isBorderBox=me.isBorderBoxValue,target=me.target,max=Math.max,paddingWidth=0,paddingHeight=0;"displayed"in dirtyProps&&el.setDisplayed(dirtyProps.displayed);for(propName in dirtyProps)flushing&&(me.fireTriggers("domTriggers",propName),me.clearBlocks("domBlocks",propName),me.flushedProps[propName]=1),(info=styleInfo[propName])&&info.dom&&(info.suffix&&(numericValue=parseInt(dirtyProps[propName],10))?styles[propName]=numericValue+info.suffix:styles[propName]=dirtyProps[propName],++styleCount);if(("x"in dirtyProps||"y"in dirtyProps)&&(target.isComponent?target.setPosition(dirtyProps.x,dirtyProps.y):styleCount+=me.addPositionStyles(styles,dirtyProps)),!isBorderBox&&(width>0||height>0)){if(!me.borderInfo||!me.paddingInfo)throw Error("Needed to have gotten the borderInfo and paddingInfo when the width or height was setProp'd");me.frameBodyContext||(paddingWidth=me.paddingInfo.width,paddingHeight=me.paddingInfo.height),width&&(width=max(parseInt(width,10)-(me.borderInfo.width+paddingWidth),0),styles.width=width+"px",++styleCount),height&&(height=max(parseInt(height,10)-(me.borderInfo.height+paddingHeight),0),styles.height=height+"px",++styleCount)}me.wrapsComponent&&Ext.isIE9&&Ext.isStrict&&((hasWidth=void 0!==width&&me.hasOverflowY)||(hasHeight=void 0!==height&&me.hasOverflowX))&&(isAbsolute=me.isAbsolute,void 0===isAbsolute&&(isAbsolute=!1,targetEl=me.target.getTargetEl(),style=targetEl.getStyle("position"),"absolute"==style&&(style=targetEl.getStyle("box-sizing"),isAbsolute="border-box"==style),me.isAbsolute=isAbsolute),isAbsolute&&(scrollbarSize=Ext.getScrollbarSize(),hasWidth&&(width=parseInt(width,10)+scrollbarSize.width,styles.width=width+"px",++styleCount),hasHeight&&(height=parseInt(height,10)+scrollbarSize.height,styles.height=height+"px",++styleCount))),styleCount&&el.setStyle(styles)}},function(){var px={dom:!0,parseInt:!0,suffix:"px"},isDom={dom:!0},faux={dom:!1};this.prototype.styleInfo={containerChildrenSizeDone:faux,containerLayoutDone:faux,displayed:faux,done:faux,x:faux,y:faux,columnWidthsDone:faux,left:px,top:px,right:px,bottom:px,width:px,height:px,"border-top-width":px,"border-right-width":px,"border-bottom-width":px,"border-left-width":px,"margin-top":px,"margin-right":px,"margin-bottom":px,"margin-left":px,"padding-top":px,"padding-right":px,"padding-bottom":px,"padding-left":px,"line-height":isDom,display:isDom}});Ext.define("Ext.layout.Context",{requires:["Ext.util.Queue","Ext.layout.ContextItem","Ext.layout.Layout","Ext.fx.Anim","Ext.fx.Manager"],remainingLayouts:0,state:0,constructor:function(config){var me=this;Ext.apply(me,config),me.items={},me.layouts={},me.blockCount=0,me.cycleCount=0,me.flushCount=0,me.calcCount=0,me.animateQueue=me.newQueue(),me.completionQueue=me.newQueue(),me.finalizeQueue=me.newQueue(),me.finishQueue=me.newQueue(),me.flushQueue=me.newQueue(),me.invalidateData={},me.layoutQueue=me.newQueue(),me.invalidQueue=[],me.triggers={data:{},dom:{}}},callLayout:function(layout,methodName){this.currentLayout=layout,layout[methodName](this.getCmp(layout.owner))},cancelComponent:function(comp,isChild,isDestroying){var i,k,klen,items,layout,newQueue,oldQueue,entry,temp,ownerCtContext,me=this,components=comp,isArray=!comp.isComponent,length=isArray?components.length:1;for(i=0;i<length;++i){if(isArray&&(comp=components[i]),isDestroying&&comp.ownerCt&&(ownerCtContext=this.items[comp.ownerCt.el.id])&&Ext.Array.remove(ownerCtContext.childItems,me.getCmp(comp)),!isChild&&(oldQueue=me.invalidQueue,klen=oldQueue.length))for(me.invalidQueue=newQueue=[],k=0;k<klen;++k)entry=oldQueue[k],(temp=entry.item.target)==comp||temp.isDescendant(comp)||newQueue.push(entry);layout=comp.componentLayout,me.cancelLayout(layout),layout.getLayoutItems&&(items=layout.getLayoutItems(),items.length&&me.cancelComponent(items,!0)),comp.isContainer&&!comp.collapsed&&(layout=comp.layout,me.cancelLayout(layout),items=layout.getVisibleItems(),items.length&&me.cancelComponent(items,!0))}},cancelLayout:function(layout){var me=this;me.completionQueue.remove(layout),me.finalizeQueue.remove(layout),me.finishQueue.remove(layout),me.layoutQueue.remove(layout),layout.running&&me.layoutDone(layout),layout.ownerContext=null},clearTriggers:function(layout,inDom){var i,item,trigger,id=layout.id,collection=this.triggers[inDom?"dom":"data"],triggers=collection&&collection[id],length=triggers&&triggers.length||0;for(i=0;i<length;++i)trigger=triggers[i],item=trigger.item,collection=inDom?item.domTriggers:item.triggers,delete collection[trigger.prop][id]},flush:function(){var i,me=this,items=me.flushQueue.clear(),length=items.length;if(length)for(++me.flushCount,i=0;i<length;++i)items[i].flush()},flushAnimations:function(){var i,me=this,items=me.animateQueue.clear(),len=items.length;if(len){for(i=0;i<len;i++)!1!==items[i].target.animate&&items[i].flushAnimations();Ext.fx.Manager.runner()}},flushInvalidates:function(){var comp,components,entry,i,me=this,queue=me.invalidQueue,length=queue&&queue.length;if(me.invalidQueue=[],length){for(components=[],i=0;i<length;++i)comp=(entry=queue[i]).item.target,comp.container.isDetachedBody||(components.push(comp),entry.options&&(me.invalidateData[comp.id]=entry.options));me.invalidate(components,null)}},flushLayouts:function(queueName,methodName,dontClear){var i,layout,me=this,layouts=dontClear?me[queueName].items:me[queueName].clear(),length=layouts.length;if(length){for(i=0;i<length;++i)layout=layouts[i],layout.running||me.callLayout(layout,methodName);me.currentLayout=null}},getCmp:function(cmp){return this.getItem(cmp,cmp.el)},getEl:function(parent,el){var item=this.getItem(el,el);return item.parent||(item.parent=parent,parent.children.length?parent.children.push(item):parent.children=[item]),item},getItem:function(target,el){var id=el.id,items=this.items;return items[id]||(items[id]=new Ext.layout.ContextItem({context:this,target:target,el:el}))},handleFailure:function(){var layout,key,layouts=this.layouts;Ext.failedLayouts=(Ext.failedLayouts||0)+1;for(key in layouts)layout=layouts[key],layouts.hasOwnProperty(key)&&(layout.running=!1,layout.ownerContext=null);Ext.repoDevMode&&!this.pageAnalyzerMode?Ext.Error.raise("Layout run failed"):Ext.log.error("Layout run failed")},invalidate:function(components,full){var containerLayoutDone,firstTime,i,comp,item,items,length,componentLayout,layout,invalidateOptions,token,me=this,isArray=!components.isComponent;for(i=0,length=isArray?components.length:1;i<length;++i)comp=isArray?components[i]:components,comp.rendered&&!comp.hidden&&(item=me.getCmp(comp),componentLayout=comp.componentLayout,firstTime=!componentLayout.ownerContext,layout=comp.isContainer&&!comp.collapsed?comp.layout:null,invalidateOptions=me.invalidateData[item.id],delete me.invalidateData[item.id],token=item.init(full,invalidateOptions),invalidateOptions&&me.processInvalidate(invalidateOptions,item,"before"),componentLayout.beforeLayoutCycle&&componentLayout.beforeLayoutCycle(item),layout&&layout.beforeLayoutCycle&&layout.beforeLayoutCycle(item),token=item.initContinue(token),containerLayoutDone=!0,componentLayout.getLayoutItems&&(componentLayout.renderChildren(),items=componentLayout.getLayoutItems(),items.length&&me.invalidate(items,!0)),layout&&(containerLayoutDone=!1,layout.renderChildren(),items=layout.getVisibleItems(),items.length&&me.invalidate(items,!0)),item.initDone(containerLayoutDone),me.resetLayout(componentLayout,item,firstTime),layout&&me.resetLayout(layout,item,firstTime),item.initAnimation(),invalidateOptions&&me.processInvalidate(invalidateOptions,item,"after"));me.currentLayout=null},layoutDone:function(layout){var ownerContext=layout.ownerContext;layout.running=!1,layout.isComponentLayout?(ownerContext.measuresBox&&ownerContext.onBoxMeasured(),ownerContext.setProp("done",!0)):ownerContext.setProp("containerLayoutDone",!0),--this.remainingLayouts,++this.progressCount},newQueue:function(){return new Ext.util.Queue},processInvalidate:function(options,item,name){if(options[name]){var me=this,currentLayout=me.currentLayout;me.currentLayout=options.layout||null,options[name](item,options),me.currentLayout=currentLayout}},queueAnimation:function(item){this.animateQueue.add(item)},queueCompletion:function(layout){this.completionQueue.add(layout)},queueFinalize:function(layout){this.finalizeQueue.add(layout)},queueFlush:function(item){this.flushQueue.add(item)},chainFns:function(oldOptions,newOptions,funcName){var me=this,oldLayout=oldOptions.layout,newLayout=newOptions.layout,oldFn=oldOptions[funcName],newFn=newOptions[funcName];return function(contextItem){var prev=me.currentLayout;oldFn&&(me.currentLayout=oldLayout,oldFn.call(oldOptions.scope||oldOptions,contextItem,oldOptions)),me.currentLayout=newLayout,newFn.call(newOptions.scope||newOptions,contextItem,newOptions),me.currentLayout=prev}},queueInvalidate:function(item,options){var comp,old,oldComp,oldOptions,oldState,me=this,newQueue=[],oldQueue=me.invalidQueue,index=oldQueue.length;for(item.isComponent?item=me.getCmp(comp=item):comp=item.target,item.invalid=!0;index--;){if(old=oldQueue[index],oldComp=old.item.target,comp.isDescendant(oldComp))return;if(oldComp==comp)return void((oldOptions=old.options)?options&&(options.widthModel&&(oldOptions.widthModel=options.widthModel),options.heightModel&&(oldOptions.heightModel=options.heightModel),(oldState=oldOptions.state)?options.state&&Ext.apply(oldState,options.state):oldOptions.state=options.state,options.before&&(oldOptions.before=me.chainFns(oldOptions,options,"before")),options.after&&(oldOptions.after=me.chainFns(oldOptions,options,"after"))):old.options=options);oldComp.isDescendant(comp)||newQueue.push(old)}newQueue.push({item:item,options:options}),me.invalidQueue=newQueue},queueItemLayouts:function(item){var comp=item.isComponent?item:item.target,layout=comp.componentLayout;layout.pending||layout.invalid||layout.done||this.queueLayout(layout),!(layout=comp.layout)||layout.pending||layout.invalid||layout.done||this.queueLayout(layout)},queueLayout:function(layout){this.layoutQueue.add(layout),layout.pending=!0},removeEl:function(parent,el){var id=el.id,children=parent.children,items=this.items;children&&Ext.Array.remove(children,items[id]),delete items[id]},resetLayout:function(layout,ownerContext,firstTime){var me=this;me.currentLayout=layout,layout.done=!1,layout.pending=!0,layout.firedTriggers=0,me.layoutQueue.add(layout),firstTime?(me.layouts[layout.id]=layout,layout.running=!0,layout.finishedLayout&&me.finishQueue.add(layout),++me.remainingLayouts,++layout.layoutCount,layout.ownerContext=ownerContext,layout.beginCount=0,layout.blockCount=0,layout.calcCount=0,layout.triggerCount=0,layout.initialized||layout.initLayout(),layout.beginLayout(ownerContext)):(++layout.beginCount,layout.running||(++me.remainingLayouts,layout.running=!0,layout.isComponentLayout&&ownerContext.unsetProp("done"),me.completionQueue.remove(layout),me.finalizeQueue.remove(layout))),layout.beginLayoutCycle(ownerContext,firstTime)},run:function(){var me=this,flushed=!1,watchDog=100;for(me.flushInvalidates(),me.state=1,me.totalCount=me.layoutQueue.getCount(),me.flush();(me.remainingLayouts||me.invalidQueue.length)&&watchDog--;){if(me.invalidQueue.length&&me.flushInvalidates(),me.runCycle())flushed=!1;else if(flushed){if(!me.invalidQueue.length){me.state=2;break}}else me.flush(),flushed=!0,me.flushLayouts("completionQueue","completeLayout");me.remainingLayouts||me.invalidQueue.length||(me.flush(),me.flushLayouts("completionQueue","completeLayout"),me.flushLayouts("finalizeQueue","finalizeLayout"))}return me.runComplete()},runComplete:function(){var me=this;return me.state=2,me.remainingLayouts?(me.handleFailure(),!1):(me.flush(),me.flushLayouts("finishQueue","finishedLayout",!0),me.flushLayouts("finishQueue","notifyOwner"),me.flush(),me.flushAnimations(),!0)},runCycle:function(){var i,me=this,layouts=me.layoutQueue.clear(),length=layouts.length;for(++me.cycleCount,me.progressCount=0,i=0;i<length;++i)me.runLayout(me.currentLayout=layouts[i]);return me.currentLayout=null,me.progressCount>0},runLayout:function(layout){var me=this,ownerContext=me.getCmp(layout.owner);layout.pending=!1,ownerContext.state.blocks||(layout.done=!0,++layout.calcCount,++me.calcCount,layout.calculate(ownerContext),layout.done?(me.layoutDone(layout),layout.completeLayout&&me.queueCompletion(layout),layout.finalizeLayout&&me.queueFinalize(layout)):layout.pending||layout.invalid||layout.blockCount+layout.triggerCount-layout.firedTriggers||me.queueLayout(layout))},setItemSize:function(item,width,height){var contextItem,i,items=item,len=1;for(item.isComposite?(items=item.elements,len=items.length,item=items[0]):item.dom||item.el||(len=items.length,item=items[0]),i=0;i<len;)contextItem=this.get(item),contextItem.setSize(width,height),item=items[++i]}});Ext.define("Ext.layout.component.Body",{alias:["layout.body"],extend:"Ext.layout.component.Auto",type:"body",beginLayout:function(ownerContext){this.callParent(arguments),ownerContext.bodyContext=ownerContext.getEl("body")},beginLayoutCycle:function(ownerContext,firstCycle){var me=this,lastWidthModel=me.lastWidthModel,lastHeightModel=me.lastHeightModel,body=me.owner.body;me.callParent(arguments),lastWidthModel&&lastWidthModel.fixed&&ownerContext.widthModel.shrinkWrap&&body.setWidth(null),lastHeightModel&&lastHeightModel.fixed&&ownerContext.heightModel.shrinkWrap&&body.setHeight(null)},calculateOwnerHeightFromContentHeight:function(ownerContext,contentHeight){var height=this.callParent(arguments);return ownerContext.targetContext!=ownerContext&&(height+=ownerContext.getPaddingInfo().height),height},calculateOwnerWidthFromContentWidth:function(ownerContext,contentWidth){var width=this.callParent(arguments);return ownerContext.targetContext!=ownerContext&&(width+=ownerContext.getPaddingInfo().width),width},measureContentWidth:function(ownerContext){return ownerContext.bodyContext.setWidth(ownerContext.bodyContext.el.dom.offsetWidth,!1)},measureContentHeight:function(ownerContext){return ownerContext.bodyContext.setHeight(ownerContext.bodyContext.el.dom.offsetHeight,!1)},publishInnerHeight:function(ownerContext,height){var innerHeight=height-ownerContext.getFrameInfo().height;return ownerContext.targetContext!=ownerContext&&(innerHeight-=ownerContext.getPaddingInfo().height),ownerContext.bodyContext.setHeight(innerHeight,!ownerContext.heightModel.natural)},publishInnerWidth:function(ownerContext,width){var innerWidth=width-ownerContext.getFrameInfo().width;ownerContext.targetContext!=ownerContext&&(innerWidth-=ownerContext.getPaddingInfo().width),ownerContext.bodyContext.setWidth(innerWidth,!ownerContext.widthModel.natural)}});Ext.define("Ext.layout.component.FieldSet",{extend:"Ext.layout.component.Body",alias:["layout.fieldset"],type:"fieldset",defaultCollapsedWidth:100,beforeLayoutCycle:function(ownerContext){ownerContext.target.collapsed&&(ownerContext.heightModel=this.sizeModels.shrinkWrap)},beginLayoutCycle:function(ownerContext){var lastSize,target=ownerContext.target;this.callParent(arguments),target.collapsed&&(ownerContext.setContentHeight(0),ownerContext.restoreMinHeight=target.minHeight,delete target.minHeight,ownerContext.widthModel.shrinkWrap&&(lastSize=target.lastComponentSize,ownerContext.setContentWidth(lastSize&&lastSize.contentWidth||this.defaultCollapsedWidth)))},finishedLayout:function(ownerContext){var owner=this.owner,restore=ownerContext.restoreMinHeight;this.callParent(arguments),restore&&(owner.minHeight=restore)},calculateOwnerHeightFromContentHeight:function(ownerContext,contentHeight){var border=ownerContext.getBorderInfo(),legend=ownerContext.target.legend;return ownerContext.getProp("contentHeight")+ownerContext.getPaddingInfo().height+(Ext.isIEQuirks||Ext.isIE8m?ownerContext.bodyContext.getPaddingInfo().top:0)+(legend?legend.getHeight():border.top)+border.bottom},publishInnerHeight:function(ownerContext,height){var legend=ownerContext.target.legend;legend&&(height-=legend.getHeight()),this.callParent([ownerContext,height])},getLayoutItems:function(){var legend=this.owner.legend;return legend?[legend]:[]}});Ext.define("Ext.layout.component.field.Slider",{alias:["layout.sliderfield"],extend:"Ext.layout.component.field.Field",type:"sliderfield",beginLayout:function(ownerContext){this.callParent(arguments),ownerContext.endElContext=ownerContext.getEl("endEl"),ownerContext.innerElContext=ownerContext.getEl("innerEl"),ownerContext.bodyElContext=ownerContext.getEl("bodyEl")},publishInnerHeight:function(ownerContext,height){var endElPad,inputPad,innerHeight=height-this.measureLabelErrorHeight(ownerContext);this.owner.vertical?(endElPad=ownerContext.endElContext.getPaddingInfo(),inputPad=ownerContext.inputContext.getPaddingInfo(),ownerContext.innerElContext.setHeight(innerHeight-inputPad.height-endElPad.height)):ownerContext.bodyElContext.setHeight(innerHeight)},publishInnerWidth:function(ownerContext,width){if(!this.owner.vertical){var endElPad=ownerContext.endElContext.getPaddingInfo(),inputPad=ownerContext.inputContext.getPaddingInfo();ownerContext.innerElContext.setWidth(width-inputPad.left-endElPad.right-ownerContext.labelContext.getProp("width"))}},beginLayoutFixed:function(ownerContext,width,suffix){var me=this,ieInputWidthAdjustment=me.ieInputWidthAdjustment;ieInputWidthAdjustment&&me.owner.bodyEl.setStyle("padding-right",ieInputWidthAdjustment+"px"),me.callParent(arguments)}});Ext.define("Ext.resizer.Splitter",{extend:"Ext.Component",requires:["Ext.XTemplate"],uses:["Ext.resizer.SplitterTracker"],alias:"widget.splitter",childEls:["collapseEl"],renderTpl:['<tpl if="collapsible===true">','<div id="{id}-collapseEl" role="presentation" class="',Ext.baseCSSPrefix,"collapse-el ",Ext.baseCSSPrefix,'layout-split-{collapseDir}{childElCls}">&#160;',"</div>","</tpl>"],baseCls:Ext.baseCSSPrefix+"splitter",collapsedClsInternal:Ext.baseCSSPrefix+"splitter-collapsed",canResize:!0,collapsible:!1,collapseOnDblClick:!0,defaultSplitMin:40,defaultSplitMax:1e3,collapseTarget:"next",horizontal:!1,vertical:!1,size:5,ariaRole:"separator",getTrackerConfig:function(){return{xclass:"Ext.resizer.SplitterTracker",el:this.el,splitter:this}},beforeRender:function(){var me=this,target=me.getCollapseTarget();me.callParent(),target.collapsed&&me.addCls(me.collapsedClsInternal),me.canResize||me.addCls(me.baseCls+"-noresize"),Ext.applyIf(me.renderData,{collapseDir:me.getCollapseDirection(),collapsible:me.collapsible||target.collapsible}),me.protoEl.unselectable()},onRender:function(){var collapseEl,me=this;me.callParent(arguments),!1!==me.performCollapse&&(me.renderData.collapsible&&me.mon(me.collapseEl,"click",me.toggleTargetCmp,me),me.collapseOnDblClick&&me.mon(me.el,"dblclick",me.toggleTargetCmp,me)),me.mon(me.getCollapseTarget(),{collapse:me.onTargetCollapse,expand:me.onTargetExpand,beforeexpand:me.onBeforeTargetExpand,beforecollapse:me.onBeforeTargetCollapse,scope:me}),me.canResize&&(me.tracker=Ext.create(me.getTrackerConfig()),me.relayEvents(me.tracker,["beforedragstart","dragstart","dragend"])),(collapseEl=me.collapseEl)&&(collapseEl.lastCollapseDirCls=me.collapseDirProps[me.collapseDirection].cls)},getCollapseDirection:function(){var collapseTarget,idx,items,type,me=this,dir=me.collapseDirection;return dir||(collapseTarget=me.collapseTarget,collapseTarget.isComponent&&(dir=collapseTarget.collapseDirection),dir||(type=me.ownerCt.layout.type,collapseTarget.isComponent?(items=me.ownerCt.items,idx=Number(items.indexOf(collapseTarget)===items.indexOf(me)-1)<<1|Number("hbox"===type)):idx=Number("prev"===me.collapseTarget)<<1|Number("hbox"===type),dir=["bottom","right","top","left"][idx]),me.collapseDirection=dir),me.setOrientation("top"===dir||"bottom"===dir?"horizontal":"vertical"),dir},getCollapseTarget:function(){var me=this;return me.collapseTarget.isComponent?me.collapseTarget:"prev"===me.collapseTarget?me.previousSibling():me.nextSibling()},setCollapseEl:function(display){var el=this.collapseEl;el&&el.setDisplayed(display)},onBeforeTargetExpand:function(target){this.setCollapseEl("none")},onBeforeTargetCollapse:function(){this.setCollapseEl("none")},onTargetCollapse:function(target){this.el.addCls([this.collapsedClsInternal,this.collapsedCls]),this.setCollapseEl("")},onTargetExpand:function(target){this.el.removeCls([this.collapsedClsInternal,this.collapsedCls]),this.setCollapseEl("")},collapseDirProps:{top:{cls:Ext.baseCSSPrefix+"layout-split-top"},right:{cls:Ext.baseCSSPrefix+"layout-split-right"},bottom:{cls:Ext.baseCSSPrefix+"layout-split-bottom"},left:{cls:Ext.baseCSSPrefix+"layout-split-left"}},orientationProps:{horizontal:{opposite:"vertical",fixedAxis:"height",stretchedAxis:"width"},vertical:{opposite:"horizontal",fixedAxis:"width",stretchedAxis:"height"}},applyCollapseDirection:function(){var cls,me=this,collapseEl=me.collapseEl,collapseDirProps=me.collapseDirProps[me.collapseDirection];collapseEl&&(cls=collapseEl.lastCollapseDirCls,cls&&collapseEl.removeCls(cls),collapseEl.addCls(collapseEl.lastCollapseDirCls=collapseDirProps.cls))},applyOrientation:function(){var me=this,orientation=me.orientation,orientationProps=me.orientationProps[orientation],defaultSize=me.size,fixedSizeProp=orientationProps.fixedAxis,stretchSizeProp=orientationProps.stretchedAxis,cls=me.baseCls+"-";me[orientation]=!0,me[orientationProps.opposite]=!1,me.hasOwnProperty(fixedSizeProp)&&"100%"!==me[fixedSizeProp]||(me[fixedSizeProp]=defaultSize),me.hasOwnProperty(stretchSizeProp)&&me[stretchSizeProp]!==defaultSize||(me[stretchSizeProp]="100%"),me.removeCls(cls+orientationProps.opposite),me.addCls(cls+orientation)},setOrientation:function(orientation){var me=this;me.orientation!==orientation&&(me.orientation=orientation,me.applyOrientation())},updateOrientation:function(){delete this.collapseDirection,this.getCollapseDirection(),this.applyCollapseDirection()},toggleTargetCmp:function(e,t){var cmp=this.getCollapseTarget(),placeholder=cmp.placeholder;Ext.isFunction(cmp.expand)&&Ext.isFunction(cmp.collapse)&&(!(!placeholder||placeholder.hidden)||!cmp.hidden)&&(cmp.collapsed?cmp.expand():cmp.collapseDirection?cmp.collapse():cmp.collapse(this.renderData.collapseDir))},setSize:function(){var me=this;me.callParent(arguments),Ext.isIE&&me.el&&me.el.repaint()},beforeDestroy:function(){Ext.destroy(this.tracker),this.callParent()}});Ext.define("Ext.resizer.BorderSplitter",{extend:"Ext.resizer.Splitter",uses:["Ext.resizer.BorderSplitterTracker"],alias:"widget.bordersplitter",collapseTarget:null,getTrackerConfig:function(){var trackerConfig=this.callParent();return trackerConfig.xclass="Ext.resizer.BorderSplitterTracker",trackerConfig}});Ext.define("Ext.layout.container.Border",{extend:"Ext.layout.container.Container",alias:"layout.border",alternateClassName:"Ext.layout.BorderLayout",requires:["Ext.resizer.BorderSplitter","Ext.fx.Anim","Ext.layout.container.border.Region"],targetCls:Ext.baseCSSPrefix+"border-layout-ct",itemCls:[Ext.baseCSSPrefix+"border-item",Ext.baseCSSPrefix+"box-item"],type:"border",isBorderLayout:!0,padding:void 0,percentageRe:/(\d+)%/,horzPositionProp:"left",padOnContainerProp:"left",padNotOnContainerProp:"right",axisProps:{horz:{borderBegin:"west",borderEnd:"east",horizontal:!0,posProp:"x",sizeProp:"width",sizePropCap:"Width"},vert:{borderBegin:"north",borderEnd:"south",horizontal:!1,posProp:"y",sizeProp:"height",sizePropCap:"Height"}},centerRegion:null,manageMargins:!0,panelCollapseAnimate:!0,panelCollapseMode:"placeholder",regionWeights:{north:20,south:10,center:0,west:-10,east:-20},beginAxis:function(ownerContext,regions,name){var center,i,childContext,centerFlex,comp,region,match,size,type,target,placeholder,me=this,props=me.axisProps[name],isVert=!props.horizontal,sizeProp=props.sizeProp,totalFlex=0,childItems=ownerContext.childItems,length=childItems.length;for(i=0;i<length;++i)if(childContext=childItems[i],comp=childContext.target,childContext.layoutPos={},comp.region){if(childContext.region=region=comp.region,childContext.isCenter=comp.isCenter,childContext.isHorz=comp.isHorz,childContext.isVert=comp.isVert,childContext.weight=comp.weight||me.regionWeights[region]||0,regions[comp.id]=childContext,comp.isCenter){center=childContext,centerFlex=comp.flex,ownerContext.centerRegion=center;continue}if(isVert!==childContext.isVert)continue;childContext.reverseWeighting=region==props.borderEnd,size=comp[sizeProp],type=typeof size,comp.collapsed||("string"==type&&(match=me.percentageRe.exec(size))?childContext.percentage=parseInt(match[1],10):comp.flex&&(totalFlex+=childContext.flex=comp.flex))}return center&&(target=center.target,(placeholder=target.placeholderFor)?centerFlex||isVert!==placeholder.collapsedVertical()||(centerFlex=0,center.collapseAxis=name):target.collapsed&&isVert===target.collapsedVertical()&&(centerFlex=0,center.collapseAxis=name)),null==centerFlex&&(centerFlex=1),totalFlex+=centerFlex,Ext.apply({before:isVert?"top":"left",totalFlex:totalFlex},props)},beginLayout:function(ownerContext){var childContext,item,length,i,regions,collapseTarget,doShow,hidden,region,me=this,items=me.getLayoutItems(),pad=me.padding,type=typeof pad,padOnContainer=!1;for(pad?"string"!=type&&"number"!=type||(pad=Ext.util.Format.parseBox(pad)):(pad=ownerContext.getEl("getTargetEl").getPaddingInfo(),padOnContainer=!0),ownerContext.outerPad=pad,ownerContext.padOnContainer=padOnContainer,i=0,length=items.length;i<length;++i)item=items[i],(collapseTarget=me.getSplitterTarget(item))&&(doShow=void 0,hidden=!!item.hidden,collapseTarget.split?hidden!==collapseTarget.hidden&&(doShow=!collapseTarget.hidden):collapseTarget.isCollapsingOrExpanding&&(doShow=!!collapseTarget.collapsed),doShow?item.show():!1===doShow&&item.hide());for(me.callParent(arguments),items=ownerContext.childItems,length=items.length,regions={},ownerContext.borderAxisHorz=me.beginAxis(ownerContext,regions,"horz"),ownerContext.borderAxisVert=me.beginAxis(ownerContext,regions,"vert"),i=0;i<length;++i)childContext=items[i],(collapseTarget=me.getSplitterTarget(childContext.target))&&(region=regions[collapseTarget.id],region||(region=ownerContext.getEl(collapseTarget.el,me),region.region=collapseTarget.region),childContext.collapseTarget=collapseTarget=region,childContext.weight=collapseTarget.weight,childContext.reverseWeighting=collapseTarget.reverseWeighting,collapseTarget.splitter=childContext,childContext.isHorz=collapseTarget.isHorz,childContext.isVert=collapseTarget.isVert);me.sortWeightedItems(items,"reverseWeighting"),me.setupSplitterNeighbors(items)},calculate:function(ownerContext){var i,childContext,childMargins,size,horzPercentTotal,vertPercentTotal,me=this,containerSize=me.getContainerSize(ownerContext),childItems=ownerContext.childItems,length=childItems.length,horz=ownerContext.borderAxisHorz,vert=ownerContext.borderAxisVert,pad=ownerContext.outerPad,padOnContainer=ownerContext.padOnContainer;for(horz.begin=pad[me.padOnContainerProp],vert.begin=pad.top,horzPercentTotal=horz.end=horz.flexSpace=containerSize.width+(padOnContainer?pad[me.padOnContainerProp]:-pad[me.padNotOnContainerProp]),vertPercentTotal=vert.end=vert.flexSpace=containerSize.height+(padOnContainer?pad.top:-pad.bottom),i=0;i<length;++i)childContext=childItems[i],childMargins=childContext.getMarginInfo(),(childContext.isHorz||childContext.isCenter)&&(horz.addUnflexed(childMargins.width),horzPercentTotal-=childMargins.width),(childContext.isVert||childContext.isCenter)&&(vert.addUnflexed(childMargins.height),vertPercentTotal-=childMargins.height),childContext.flex||childContext.percentage||(childContext.isHorz||childContext.isCenter&&"horz"===childContext.collapseAxis?(size=childContext.getProp("width"),horz.addUnflexed(size),childContext.collapseTarget&&(horzPercentTotal-=size)):(childContext.isVert||childContext.isCenter&&"vert"===childContext.collapseAxis)&&(size=childContext.getProp("height"),vert.addUnflexed(size),childContext.collapseTarget&&(vertPercentTotal-=size)));for(i=0;i<length;++i)childContext=childItems[i],childMargins=childContext.getMarginInfo(),childContext.percentage&&(childContext.isHorz?(size=Math.ceil(horzPercentTotal*childContext.percentage/100),size=childContext.setWidth(size),horz.addUnflexed(size)):childContext.isVert&&(size=Math.ceil(vertPercentTotal*childContext.percentage/100),size=childContext.setHeight(size),vert.addUnflexed(size)));for(i=0;i<length;++i)childContext=childItems[i],childContext.isCenter||(me.calculateChildAxis(childContext,horz),me.calculateChildAxis(childContext,vert));me.finishAxis(ownerContext,vert)+me.finishAxis(ownerContext,horz)<2?me.done=!1:me.finishPositions(childItems)},calculateChildAxis:function(childContext,axis){var region,isBegin,flex,pos,size,collapseTarget=childContext.collapseTarget,setSizeMethod="set"+axis.sizePropCap,sizeProp=axis.sizeProp,childMarginSize=childContext.getMarginInfo()[sizeProp];collapseTarget?region=collapseTarget.region:(region=childContext.region,flex=childContext.flex),isBegin=region==axis.borderBegin,isBegin||region==axis.borderEnd?(flex?(size=Math.ceil(axis.flexSpace*(flex/axis.totalFlex)),size=childContext[setSizeMethod](size)):size=childContext.percentage?childContext.peek(sizeProp):childContext.getProp(sizeProp),size+=childMarginSize,isBegin?(pos=axis.begin,axis.begin+=size):axis.end=pos=axis.end-size):(childContext[setSizeMethod](axis.end-axis.begin-childMarginSize),pos=axis.begin),childContext.layoutPos[axis.posProp]=pos},finishAxis:function(ownerContext,axis){var size=axis.end-axis.begin,center=ownerContext.centerRegion;return center&&(center["set"+axis.sizePropCap](size-center.getMarginInfo()[axis.sizeProp]),center.layoutPos[axis.posProp]=axis.begin),Ext.isNumber(size)?1:0},finishPositions:function(childItems){var index,childContext,length=childItems.length,marginProp=this.horzPositionProp;for(index=0;index<length;++index)childContext=childItems[index],childContext.setProp("x",childContext.layoutPos.x+childContext.marginInfo[marginProp]),childContext.setProp("y",childContext.layoutPos.y+childContext.marginInfo.top)},getLayoutItems:function(){for(var ownerItem,placeholderFor,owner=this.owner,ownerItems=owner&&owner.items&&owner.items.items||[],length=ownerItems.length,items=[],i=0;i<length;i++)ownerItem=ownerItems[i],placeholderFor=ownerItem.placeholderFor,!ownerItem.hidden&&(ownerItem.floated&&2!==ownerItem.isCollapsingOrExpanding||placeholderFor&&2===placeholderFor.isCollapsingOrExpanding)||items.push(ownerItem);return items},getPlaceholder:function(comp){return comp.getPlaceholder&&comp.getPlaceholder()},getSplitterTarget:function(splitter){var collapseTarget=splitter.collapseTarget;return collapseTarget&&collapseTarget.collapsed?collapseTarget.placeholder||collapseTarget:collapseTarget},isItemBoxParent:function(itemContext){return!0},isItemShrinkWrap:function(item){return!0},insertSplitter:function(item,index,hidden,splitterCfg){var region=item.region,splitter=Ext.apply({xtype:"bordersplitter",collapseTarget:item,id:item.id+"-splitter",hidden:hidden,canResize:!1!==item.splitterResize,splitterFor:item},splitterCfg),at=index+("south"===region||"east"===region?0:1);"mini"===item.collapseMode&&(splitter.collapsedCls=item.collapsedCls),item.splitter=this.owner.add(at,splitter)},onAdd:function(item,index){var split,hidden,cfg,me=this,placeholderFor=item.placeholderFor,region=item.region;me.callParent(arguments),region?(Ext.apply(item,me.regionFlags[region]),item.initBorderRegion&&item.initBorderRegion(),"center"===region?(me.centerRegion&&Ext.Error.raise("Cannot have multiple center regions in a BorderLayout."),me.centerRegion=item):(split=item.split,hidden=!!item.hidden,"object"==typeof split&&(cfg=split,split=!0),!item.isHorz&&!item.isVert||!split&&"mini"!=item.collapseMode||me.insertSplitter(item,index,hidden||!split,cfg)),item.hasOwnProperty("collapseMode")||(item.collapseMode=me.panelCollapseMode),item.hasOwnProperty("animCollapse")||("placeholder"!==item.collapseMode?item.animCollapse=!1:item.animCollapse=me.panelCollapseAnimate)):placeholderFor&&(Ext.apply(item,me.regionFlags[placeholderFor.region]),item.region=placeholderFor.region,item.weight=placeholderFor.weight)},onDestroy:function(){this.centerRegion=null,this.callParent()},onRemove:function(comp,isDestroying){var el,me=this,region=comp.region,splitter=comp.splitter,owner=me.owner,destroying=owner.destroying;region&&(comp.isCenter&&(me.centerRegion=null),delete comp.isCenter,delete comp.isHorz,delete comp.isVert,splitter&&!owner.destroying&&owner.doRemove(splitter,!0),delete comp.splitter),me.callParent(arguments),destroying||isDestroying||!comp.rendered||(el=comp.getEl(),el.setStyle("top",""),el.setStyle(me.horzPositionProp,""))},regionMeta:{center:{splitterDelta:0},north:{splitterDelta:1},south:{splitterDelta:-1},west:{splitterDelta:1},east:{splitterDelta:-1}},regionFlags:{center:{isCenter:!0,isHorz:!1,isVert:!1},north:{isCenter:!1,isHorz:!1,isVert:!0,collapseDirection:"top"},south:{isCenter:!1,isHorz:!1,isVert:!0,collapseDirection:"bottom"},west:{isCenter:!1,isHorz:!0,isVert:!1,collapseDirection:"left"},east:{isCenter:!1,isHorz:!0,isVert:!1,collapseDirection:"right"}},setupSplitterNeighbors:function(items){var i,j,center,count,edge,comp,region,splitter,touched,edgeRegions={},length=items.length,touchedRegions=this.touchedRegions;for(i=0;i<length;++i)if(comp=items[i].target,region=comp.region,comp.isCenter)center=comp;else if(region){for(touched=touchedRegions[region],j=0,count=touched.length;j<count;++j)(edge=edgeRegions[touched[j]])&&edge.neighbors.push(comp);splitter=comp.placeholderFor?comp.placeholderFor.splitter:comp.splitter,splitter&&(splitter.neighbors=[]),edgeRegions[region]=splitter}if(center)for(touched=touchedRegions.center,j=0,count=touched.length;j<count;++j)(edge=edgeRegions[touched[j]])&&edge.neighbors.push(center)},touchedRegions:{center:["north","south","east","west"],north:["north","east","west"],south:["south","east","west"],east:["east","north","south"],west:["west","north","south"]},sizePolicies:{vert:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},horz:{readsWidth:1,readsHeight:0,setsWidth:0,setsHeight:1},flexAll:{readsWidth:0,readsHeight:0,setsWidth:1,setsHeight:1}},getItemSizePolicy:function(item){var collapseTarget,size,policy,placeholderFor,me=this,policies=this.sizePolicies;return item.isCenter?(placeholderFor=item.placeholderFor,placeholderFor?placeholderFor.collapsedVertical()?policies.vert:policies.horz:item.collapsed?item.collapsedVertical()?policies.vert:policies.horz:policies.flexAll):(collapseTarget=item.collapseTarget,collapseTarget?collapseTarget.isVert?policies.vert:policies.horz:item.region?(item.isVert?(size=item.height,policy=policies.vert):(size=item.width,policy=policies.horz),item.flex||"string"==typeof size&&me.percentageRe.test(size)?policies.flexAll:policy):me.autoSizePolicy)}},function(){var methods={addUnflexed:function(px){this.flexSpace=Math.max(this.flexSpace-px,0)}},props=this.prototype.axisProps;Ext.apply(props.horz,methods),Ext.apply(props.vert,methods)});Ext.define("Ext.layout.container.Card",{extend:"Ext.layout.container.Fit",alternateClassName:"Ext.layout.CardLayout",alias:"layout.card",type:"card",hideInactive:!0,deferredRender:!1,getRenderTree:function(){var me=this,activeItem=me.getActiveItem();if(activeItem){if(activeItem.hasListeners.beforeactivate&&!1===activeItem.fireEvent("beforeactivate",activeItem)?activeItem=me.activeItem=me.owner.activeItem=null:activeItem.hasListeners.activate&&activeItem.on({boxready:function(){activeItem.fireEvent("activate",activeItem)},single:!0}),!me.deferredRender)return me.callParent(arguments);if(activeItem)return me.getItemsRenderTree([activeItem])}},renderChildren:function(){var me=this,active=me.getActiveItem();me.deferredRender?active&&me.renderItems([active],me.getRenderTarget()):me.callParent()},isValidParent:function(item,target,position){var itemEl=item.el?item.el.dom:Ext.getDom(item);return itemEl&&itemEl.parentNode===(target.dom||target)||!1},getActiveItem:function(){var me=this,result=me.parseActiveItem(me.activeItem||me.owner&&me.owner.activeItem);return result&&-1!=me.owner.items.indexOf(result)?me.activeItem=result:me.activeItem=null,me.activeItem},parseActiveItem:function(item){return item&&item.isComponent?item:"number"==typeof item||void 0===item?this.getLayoutItems()[item||0]:this.owner.getComponent(item)},configureItem:function(item){item===this.getActiveItem()?item.hidden=!1:item.hidden=!0,this.callParent(arguments)},onRemove:function(component){this.callParent(arguments),component===this.activeItem&&(this.activeItem=null)},getAnimation:function(newCard,owner){var newAnim=(newCard||{}).cardSwitchAnimation;return!1!==newAnim&&(newAnim||owner.cardSwitchAnimation)},getNext:function(){var wrap=arguments[0],items=this.getLayoutItems();return items[Ext.Array.indexOf(items,this.activeItem)+1]||!!wrap&&items[0]},next:function(){var anim=arguments[0],wrap=arguments[1];return this.setActiveItem(this.getNext(wrap),anim)},getPrev:function(){var wrap=arguments[0],items=this.getLayoutItems();return items[Ext.Array.indexOf(items,this.activeItem)-1]||!!wrap&&items[items.length-1]},prev:function(){var anim=arguments[0],wrap=arguments[1];return this.setActiveItem(this.getPrev(wrap),anim)},setActiveItem:function(newCard){var newIndex,me=this,owner=me.owner,oldCard=me.activeItem,rendered=owner.rendered;return newCard=me.parseActiveItem(newCard),newIndex=owner.items.indexOf(newCard),-1==newIndex&&(newIndex=owner.items.items.length,Ext.suspendLayouts(),newCard=owner.add(newCard),Ext.resumeLayouts()),!(!newCard||oldCard==newCard)&&(!1!==newCard.fireEvent("beforeactivate",newCard,oldCard)&&((!oldCard||!1!==oldCard.fireEvent("beforedeactivate",oldCard,newCard))&&(rendered?(Ext.suspendLayouts(),newCard.rendered||me.renderItem(newCard,me.getRenderTarget(),owner.items.length),oldCard&&(me.hideInactive&&(oldCard.hide(),oldCard.hiddenByLayout=!0),oldCard.fireEvent("deactivate",oldCard,newCard)),newCard.hidden&&newCard.show(),newCard.hidden||(me.activeItem=newCard),Ext.resumeLayouts(!0)):me.activeItem=newCard,newCard.fireEvent("activate",newCard,oldCard),me.activeItem)))}});Ext.define("Ext.layout.container.Column",{extend:"Ext.layout.container.Auto",alias:["layout.column"],alternateClassName:"Ext.layout.ColumnLayout",type:"column",itemCls:Ext.baseCSSPrefix+"column",targetCls:Ext.baseCSSPrefix+"column-layout-ct",columnWidthSizePolicy:{readsWidth:0,readsHeight:1,setsWidth:1,setsHeight:0},createsInnerCt:!0,manageOverflow:!0,isItemShrinkWrap:function(ownerContext){return!0},getItemSizePolicy:function(item,ownerSizeModel){return item.columnWidth&&(ownerSizeModel||(ownerSizeModel=this.owner.getSizeModel()),!ownerSizeModel.width.shrinkWrap)?this.columnWidthSizePolicy:this.autoSizePolicy},calculateItems:function(ownerContext,containerSize){var blocked,availableWidth,i,itemContext,itemMarginWidth,itemWidth,me=this,targetContext=ownerContext.targetContext,items=ownerContext.childItems,len=items.length,contentWidth=0,gotWidth=containerSize.gotWidth;if(!1===gotWidth)targetContext.domBlock(me,"width"),blocked=!0;else{if(!gotWidth)return!0;availableWidth=containerSize.width}for(i=0;i<len;++i)itemContext=items[i],itemMarginWidth=itemContext.getMarginInfo().width,itemContext.widthModel.calculated||(itemWidth=itemContext.getProp("width"),"number"!=typeof itemWidth&&(itemContext.block(me,"width"),blocked=!0),contentWidth+=itemWidth+itemMarginWidth);if(!blocked){for(availableWidth=availableWidth<contentWidth?0:availableWidth-contentWidth,i=0;i<len;++i)itemContext=items[i],itemContext.widthModel.calculated&&(itemMarginWidth=itemContext.marginInfo.width,itemWidth=itemContext.target.columnWidth,itemWidth=Math.floor(itemWidth*availableWidth)-itemMarginWidth,itemWidth=itemContext.setWidth(itemWidth),contentWidth+=itemWidth+itemMarginWidth);ownerContext.setContentWidth(contentWidth+ownerContext.paddingContext.getPaddingInfo().width)}return!blocked},setCtSizeIfNeeded:function(ownerContext,containerSize){var me=this,padding=ownerContext.paddingContext.getPaddingInfo();me.callParent(arguments),(Ext.isIEQuirks||Ext.isIE7m)&&me.isShrinkWrapTpl&&padding.right&&ownerContext.outerCtContext.setProp("width",containerSize.width+padding.left)}});Ext.define("Ext.menu.Item",{extend:"Ext.Component",alias:"widget.menuitem",alternateClassName:"Ext.menu.TextItem",isMenuItem:!0,mixins:{queryable:"Ext.Queryable"},activeCls:Ext.baseCSSPrefix+"menu-item-active",ariaRole:"menuitem",canActivate:!0,clickHideDelay:0,destroyMenu:!0,disabledCls:Ext.baseCSSPrefix+"menu-item-disabled",hideOnClick:!0,menuAlign:"tl-tr?",menuExpandDelay:200,menuHideDelay:200,tooltipType:"qtip",arrowCls:Ext.baseCSSPrefix+"menu-item-arrow",baseIconCls:Ext.baseCSSPrefix+"menu-item-icon",textCls:Ext.baseCSSPrefix+"menu-item-text",indentCls:Ext.baseCSSPrefix+"menu-item-indent",indentNoSeparatorCls:Ext.baseCSSPrefix+"menu-item-indent-no-separator",indentRightIconCls:Ext.baseCSSPrefix+"menu-item-indent-right-icon",indentRightArrowCls:Ext.baseCSSPrefix+"menu-item-indent-right-arrow",linkCls:Ext.baseCSSPrefix+"menu-item-link",childEls:["itemEl","iconEl","textEl","arrowEl"],renderTpl:['<tpl if="plain">',"{text}","<tpl else>",'<a id="{id}-itemEl"',' class="{linkCls} {indentCls}{childElCls}"',' href="{href}" role="presentation" ','<tpl if="hrefTarget"> target="{hrefTarget}"</tpl>',' hidefocus="true"',' unselectable="on"','<tpl if="tabIndex">',' tabIndex="{tabIndex}"',"</tpl>",">",'<span id="{id}-textEl" class="{textCls}{childElCls}" unselectable="on">{text}</span>','<tpl if="hasIcon">','<div role="presentation" id="{id}-iconEl" class="{baseIconCls}','{[values.rightIcon ? "-right" : ""]} {iconCls}','{childElCls} {glyphCls}" style="<tpl if="icon">background-image:url({icon});</tpl>','<tpl if="glyph && glyphFontFamily">font-family:{glyphFontFamily};</tpl>">','<tpl if="glyph">&#{glyph};</tpl>',"</div>","</tpl>",'<tpl if="showCheckbox">','<div role="presentation" id="{id}-checkEl" class="{baseIconCls}','{[(values.hasIcon && !values.rightIcon) ? "-right" : ""]} ','{groupCls} {checkboxCls}{childElCls}">',"</div>","</tpl>",'<tpl if="hasMenu">','<div role="presentation" id="{id}-arrowEl" class="{arrowCls}{childElCls}"></div>',"</tpl>","</a>","</tpl>"],maskOnDisable:!1,iconAlign:"left",activate:function(skipCheck){var me=this;(skipCheck||!me.activated&&me.canActivate&&me.rendered&&!me.isDisabled()&&me.isVisible())&&(me.plain||me.el.addCls(me.activeCls),me.focus(!1,!0),me.activated=!0,me.hasListeners.activate&&me.fireEvent("activate",me))},getFocusEl:function(){return this.itemEl},deactivate:function(){var parent,me=this;me.activated&&(parent=me.up(""),me.plain||me.el.removeCls(me.activeCls),parent&&parent.focus(!1,!0),me.hideMenu(),me.activated=!1,me.hasListeners.deactivate&&me.fireEvent("deactivate",me))},deferHideMenu:function(){this.menu.isVisible()&&this.menu.hide()},cancelDeferHide:function(){clearTimeout(this.hideMenuTimer)},deferHideParentMenus:function(){var ancestor;Ext.menu.Manager.hideAll(),Ext.Element.getActiveElement()||(ancestor=this.up(":not([hidden])"))&&ancestor.focus()},expandMenu:function(delay){var me=this;me.menu&&(me.cancelDeferHide(),0===delay?me.doExpandMenu():(clearTimeout(me.expandMenuTimer),me.expandMenuTimer=Ext.defer(me.doExpandMenu,Ext.isNumber(delay)?delay:me.menuExpandDelay,me)))},doExpandMenu:function(){var me=this,menu=me.menu;!me.activated||menu.rendered&&menu.isVisible()||(me.parentMenu.activeChild=menu,menu.parentItem=me,menu.parentMenu=me.parentMenu,menu.showBy(me,me.menuAlign))},getRefItems:function(deep){var items,menu=this.menu;return menu&&(items=menu.getRefItems(deep),items.unshift(menu)),items||[]},hideMenu:function(delay){var me=this;me.menu&&(clearTimeout(me.expandMenuTimer),me.hideMenuTimer=Ext.defer(me.deferHideMenu,Ext.isNumber(delay)?delay:me.menuHideDelay,me))},initComponent:function(){var menu,me=this,prefix=Ext.baseCSSPrefix,cls=[prefix+"menu-item"];me.addEvents("activate","click","deactivate","textchange","iconchange"),me.plain&&cls.push(prefix+"menu-item-plain"),me.cls&&cls.push(me.cls),me.cls=cls.join(" "),me.menu&&(menu=me.menu,delete me.menu,me.setMenu(menu)),me.callParent(arguments)},onClick:function(e){var me=this,clickHideDelay=me.clickHideDelay;me.href||e.stopEvent(),me.disabled||(me.hideOnClick&&(clickHideDelay?me.deferHideParentMenusTimer=Ext.defer(me.deferHideParentMenus,clickHideDelay,me):me.deferHideParentMenus()),Ext.callback(me.handler,me.scope||me,[me,e]),me.fireEvent("click",me,e),me.hideOnClick||me.focus())},onRemoved:function(){var me=this;me.activated&&me.parentMenu.activeItem===me&&me.parentMenu.deactivateActiveItem(),me.callParent(arguments),me.parentMenu=me.ownerButton=null},beforeDestroy:function(){var me=this;me.rendered&&me.clearTip(),me.callParent()},onDestroy:function(){var me=this;clearTimeout(me.expandMenuTimer),me.cancelDeferHide(),clearTimeout(me.deferHideParentMenusTimer),me.setMenu(null),me.callParent(arguments)},beforeRender:function(){var glyphParts,me=this,glyph=me.glyph,glyphFontFamily=Ext._glyphFontFamily,hasIcon=!!(me.icon||me.iconCls||glyph),hasMenu=!!me.menu,rightIcon="right"===me.iconAlign&&!hasMenu,isCheckItem=me.isMenuCheckItem,indentCls=[],ownerCt=me.ownerCt,isOwnerPlain=ownerCt.plain;me.callParent(),hasIcon&&hasMenu&&me.showCheckbox&&(hasIcon=!1),"string"==typeof glyph&&(glyphParts=glyph.split("@"),glyph=glyphParts[0],glyphFontFamily=glyphParts[1]),(!isOwnerPlain||hasIcon&&!rightIcon||isCheckItem)&&(ownerCt.showSeparator&&!isOwnerPlain?indentCls.push(me.indentCls):indentCls.push(me.indentNoSeparatorCls)),hasMenu?indentCls.push(me.indentRightArrowCls):hasIcon&&(rightIcon||isCheckItem)&&indentCls.push(me.indentRightIconCls),Ext.applyIf(me.renderData,{href:me.href||"#",hrefTarget:me.hrefTarget,icon:me.icon,iconCls:me.iconCls,glyph:glyph,glyphCls:glyph?Ext.baseCSSPrefix+"menu-item-glyph":void 0,glyphFontFamily:glyphFontFamily,hasIcon:hasIcon,hasMenu:hasMenu,indent:!isOwnerPlain||hasIcon||isCheckItem,isCheckItem:isCheckItem,rightIcon:rightIcon,plain:me.plain,text:me.text,arrowCls:me.arrowCls,baseIconCls:me.baseIconCls,textCls:me.textCls,indentCls:indentCls.join(" "),linkCls:me.linkCls,groupCls:me.group?me.groupCls:"",tabIndex:me.tabIndex})},onRender:function(){var me=this;me.callParent(arguments),me.tooltip&&me.setTooltip(me.tooltip,!0)},setMenu:function(menu,destroyMenu){var me=this,oldMenu=me.menu,arrowEl=me.arrowEl;oldMenu&&(delete oldMenu.parentItem,delete oldMenu.parentMenu,delete oldMenu.ownerItem,(!0===destroyMenu||!1!==destroyMenu&&me.destroyMenu)&&Ext.destroy(oldMenu)),menu?(me.menu=Ext.menu.Manager.get(menu),me.menu.ownerItem=me):me.menu=null,me.rendered&&!me.destroying&&arrowEl&&arrowEl[me.menu?"addCls":"removeCls"](me.arrowCls)},setHandler:function(fn,scope){this.handler=fn||null,this.scope=scope},setIcon:function(icon){var iconEl=this.iconEl,oldIcon=this.icon;iconEl&&(iconEl.src=icon||Ext.BLANK_IMAGE_URL),this.icon=icon,this.fireEvent("iconchange",this,oldIcon,icon)},setIconCls:function(iconCls){var me=this,iconEl=me.iconEl,oldCls=me.iconCls;iconEl&&(me.iconCls&&iconEl.removeCls(me.iconCls),iconCls&&iconEl.addCls(iconCls)),me.iconCls=iconCls,me.fireEvent("iconchange",me,oldCls,iconCls)},setText:function(text){var me=this,el=me.textEl||me.el,oldText=me.text;me.text=text,me.rendered&&(el.update(text||""),me.ownerCt.updateLayout()),me.fireEvent("textchange",me,oldText,text)},getTipAttr:function(){return"qtip"==this.tooltipType?"data-qtip":"title"},clearTip:function(){Ext.quickTipsActive&&Ext.isObject(this.tooltip)&&Ext.tip.QuickTipManager.unregister(this.itemEl)},setTooltip:function(tooltip,initial){var me=this;return me.rendered?(initial||me.clearTip(),Ext.quickTipsActive&&Ext.isObject(tooltip)?(Ext.tip.QuickTipManager.register(Ext.apply({target:me.itemEl.id},tooltip)),me.tooltip=tooltip):me.itemEl.dom.setAttribute(me.getTipAttr(),tooltip)):me.tooltip=tooltip,me}});Ext.define("Ext.menu.CheckItem",{extend:"Ext.menu.Item",alias:"widget.menucheckitem",checkedCls:Ext.baseCSSPrefix+"menu-item-checked",uncheckedCls:Ext.baseCSSPrefix+"menu-item-unchecked",groupCls:Ext.baseCSSPrefix+"menu-group-icon",hideOnClick:!1,checkChangeDisabled:!1,ariaRole:"menuitemcheckbox",childEls:["itemEl","iconEl","textEl","checkEl"],showCheckbox:!0,isMenuCheckItem:!0,checkboxCls:Ext.baseCSSPrefix+"menu-item-checkbox",initComponent:function(){var me=this;me.checked=!!me.checked,me.addEvents("beforecheckchange","checkchange"),me.callParent(arguments),Ext.menu.Manager.registerCheckable(me),me.group&&!1!==me.initialConfig.hideOnClick&&(me.hideOnClick=!0)},beforeRender:function(){var me=this;me.callParent(),Ext.apply(me.renderData,{checkboxCls:me.checkboxCls,showCheckbox:me.showCheckbox})},afterRender:function(){var me=this;me.callParent(),me.checked=!me.checked,me.setChecked(!me.checked,!0),me.checkChangeDisabled&&me.disableCheckChange()},disableCheckChange:function(){var me=this,checkEl=me.checkEl;checkEl&&checkEl.addCls(me.disabledCls),Ext.isIE10p||Ext.isIE9&&Ext.isStrict||!me.rendered||me.el.repaint(),me.checkChangeDisabled=!0},enableCheckChange:function(){var me=this,checkEl=me.checkEl;checkEl&&checkEl.removeCls(me.disabledCls),me.checkChangeDisabled=!1},onClick:function(e){var me=this;me.disabled||me.checkChangeDisabled||me.checked&&me.group||me.setChecked(!me.checked),this.callParent([e])},onDestroy:function(){Ext.menu.Manager.unregisterCheckable(this),this.callParent(arguments)},setChecked:function(checked,suppressEvents){var me=this,checkedCls=me.checkedCls,uncheckedCls=me.uncheckedCls,el=me.el;me.checked===checked||!suppressEvents&&!1===me.fireEvent("beforecheckchange",me,checked)||(el&&(checked?(el.addCls(checkedCls),el.removeCls(uncheckedCls)):(el.addCls(uncheckedCls),el.removeCls(checkedCls))),me.checked=checked,Ext.menu.Manager.onCheckChange(me,checked),suppressEvents||(Ext.callback(me.checkHandler,me.scope||me,[me,checked]),me.fireEvent("checkchange",me,checked)))}});Ext.define("Ext.menu.KeyNav",{extend:"Ext.util.KeyNav",requires:["Ext.FocusManager"],constructor:function(config){var me=this;me.menu=config.target,me.callParent([Ext.apply({down:me.down,enter:me.enter,esc:me.escape,left:me.left,right:me.right,space:me.enter,tab:me.tab,up:me.up},config)])},down:function(e){var me=this,fi=me.menu.focusedItem;if(fi&&e.getKey()==Ext.EventObject.DOWN&&me.isWhitelisted(fi))return!0;me.focusNextItem(1)},enter:function(e){var menu=this.menu,focused=menu.focusedItem;if(menu.activeItem)menu.onClick(e);else if(focused&&focused.isFormField)return!0},escape:function(e){Ext.menu.Manager.hideAll()},focusNextItem:function(step){for(var item,menu=this.menu,items=menu.items,focusedItem=menu.focusedItem,startIdx=focusedItem?items.indexOf(focusedItem):-1,idx=startIdx+step,len=items.length,count=0;count<len&&idx!==startIdx;){if(idx<0?idx=len-1:idx>=len&&(idx=0),item=items.getAt(idx),menu.canActivateItem(item)){menu.setActiveItem(item);break}idx+=step,++count}},isWhitelisted:function(item){return Ext.FocusManager.isWhitelisted(item)},left:function(e){var menu=this.menu,fi=menu.focusedItem;if(fi&&this.isWhitelisted(fi))return!0;menu.hide(),menu.parentMenu&&menu.parentMenu.focus()},right:function(e){var am,menu=this.menu,fi=menu.focusedItem,ai=menu.activeItem;if(fi&&this.isWhitelisted(fi))return!0;ai&&(am=menu.activeItem.menu)&&(ai.expandMenu(0),am.setActiveItem(am.child(":focusable")))},tab:function(e){var me=this;e.shiftKey?me.up(e):me.down(e)},up:function(e){var me=this,fi=me.menu.focusedItem;if(fi&&e.getKey()==Ext.EventObject.UP&&me.isWhitelisted(fi))return!0;me.focusNextItem(-1)}});Ext.define("Ext.menu.Separator",{extend:"Ext.menu.Item",alias:"widget.menuseparator",canActivate:!1,focusable:!1,hideOnClick:!1,plain:!0,separatorCls:Ext.baseCSSPrefix+"menu-item-separator",text:"&#160;",ariaRole:"separator",beforeRender:function(ct,pos){var me=this;me.callParent(),me.addCls(me.separatorCls)}});Ext.define("Ext.menu.Menu",{extend:"Ext.panel.Panel",alias:"widget.menu",requires:["Ext.layout.container.VBox","Ext.menu.CheckItem","Ext.menu.Item","Ext.menu.KeyNav","Ext.menu.Manager","Ext.menu.Separator"],enableKeyNav:!0,allowOtherMenus:!1,ariaRole:"menu",floating:!0,constrain:!0,hidden:!0,hideMode:"visibility",ignoreParentClicks:!1,isMenu:!0,showSeparator:!0,minWidth:void 0,defaultMinWidth:120,initComponent:function(){var me=this,prefix=Ext.baseCSSPrefix,cls=[prefix+"menu"],bodyCls=me.bodyCls?[me.bodyCls]:[],isFloating=!1!==me.floating;me.addEvents("click","mouseenter","mouseleave","mouseover"),Ext.menu.Manager.register(me),me.plain&&cls.push(prefix+"menu-plain"),me.cls=cls.join(" "),bodyCls.push(prefix+"menu-body",Ext.dom.Element.unselectableCls),me.bodyCls=bodyCls.join(" "),me.layout||(me.layout={type:"vbox",align:"stretchmax",overflowHandler:"Scroller"}),isFloating?void 0===me.minWidth&&(me.minWidth=me.defaultMinWidth):(me.hidden=!!me.initialConfig.hidden,me.constrain=!1),me.callParent(arguments)},registerWithOwnerCt:function(){this.floating&&(this.ownerCt=null,Ext.WindowManager.register(this))},initHierarchyEvents:Ext.emptyFn,isVisible:function(){return this.callParent()},getHierarchyState:function(){var result=this.callParent();return result.hidden=this.hidden,result},beforeRender:function(){this.callParent(arguments),this.getSizeModel().width.shrinkWrap||(this.layout.align="stretch")},onBoxReady:function(){var me=this;me.callParent(arguments),me.showSeparator&&(me.iconSepEl=me.layout.getElementTarget().insertFirst({role:"presentation",cls:Ext.baseCSSPrefix+"menu-icon-separator",html:"&#160;"})),me.mon(me.el,{click:me.onClick,mouseover:me.onMouseOver,scope:me}),me.mouseMonitor=me.el.monitorMouseLeave(100,me.onMouseLeave,me),me.enableKeyNav&&(me.keyNav=new Ext.menu.KeyNav({target:me,keyMap:me.getKeyMap()}))},getRefOwner:function(){return this.parentMenu||this.ownerButton||this.callParent(arguments)},canActivateItem:function(item){return item&&!item.isDisabled()&&item.isVisible()&&(item.canActivate||!item.isMenuItem)},deactivateActiveItem:function(andBlurFocusedItem){var me=this,activeItem=me.activeItem,focusedItem=me.focusedItem;activeItem&&(activeItem.deactivate(),activeItem.activated||delete me.activeItem),focusedItem&&andBlurFocusedItem&&(focusedItem.blur(),delete me.focusedItem)},getFocusEl:function(){return this.focusedItem||this.el},hide:function(){this.deactivateActiveItem(!0),this.callParent(arguments)},getItemFromEvent:function(e){for(var me=this,renderTarget=me.layout.getRenderTarget().dom,toEl=e.getTarget();toEl.parentNode!==renderTarget;)if(!(toEl=toEl.parentNode))return;return Ext.getCmp(toEl.id)},lookupComponent:function(cmp){var me=this;return"string"==typeof cmp?cmp=me.lookupItemFromString(cmp):Ext.isObject(cmp)&&(cmp=me.lookupItemFromObject(cmp)),cmp.minWidth=cmp.minWidth||me.minWidth,cmp},lookupItemFromObject:function(cmp){var cls,me=this,prefix=Ext.baseCSSPrefix;return cmp.isComponent||(cmp=cmp.xtype?Ext.ComponentManager.create(cmp,cmp.xtype):Ext.create("Ext.menu."+(Ext.isBoolean(cmp.checked)?"Check":"")+"Item",cmp)),cmp.isMenuItem&&(cmp.parentMenu=me),cmp.isMenuItem||cmp.dock||(cls=[prefix+"menu-item-cmp"],me.plain||!1===cmp.indent&&"no-icon"!==cmp.iconCls||cls.push(prefix+"menu-item-indent"),cmp.rendered?cmp.el.addCls(cls):cmp.cls=(cmp.cls||"")+" "+cls.join(" ")),cmp},lookupItemFromString:function(cmp){return"separator"==cmp||"-"==cmp?new Ext.menu.Separator:new Ext.menu.Item({canActivate:!1,hideOnClick:!1,plain:!0,text:cmp})},onClick:function(e){var item,me=this;if(me.disabled)return void e.stopEvent();item="click"===e.type?me.getItemFromEvent(e):me.activeItem,item&&item.isMenuItem&&(item.menu&&me.ignoreParentClicks?e.stopEvent():item.onClick(e)),item&&!item.disabled||(item=void 0),me.fireEvent("click",me,item,e)},onDestroy:function(){var me=this;Ext.menu.Manager.unregister(me),me.parentMenu=me.ownerButton=null,me.rendered&&(me.el.un(me.mouseMonitor),Ext.destroy(me.keyNav),me.keyNav=null),me.callParent(arguments)},onMouseLeave:function(e){var me=this;me.deactivateActiveItem(),me.disabled||me.fireEvent("mouseleave",me,e)},onMouseOver:function(e){var me=this,fromEl=e.getRelatedTarget(),mouseEnter=!me.el.contains(fromEl),item=me.getItemFromEvent(e),parentMenu=me.parentMenu,parentItem=me.parentItem;mouseEnter&&parentMenu&&(parentMenu.setActiveItem(parentItem),parentItem.cancelDeferHide(),parentMenu.mouseMonitor.mouseenter()),me.disabled||(item&&!item.activated&&(me.setActiveItem(item),item.activated&&item.expandMenu&&item.expandMenu()),mouseEnter&&me.fireEvent("mouseenter",me,e),me.fireEvent("mouseover",me,item,e))},setActiveItem:function(item){var me=this;item&&item!=me.activeItem&&(me.deactivateActiveItem(),me.canActivateItem(item)&&(item.activate?(item.activate(!0),item.activated&&(me.activeItem=item,me.focusedItem=item)):(item.focus(),me.focusedItem=item)))},showBy:function(cmp,pos,off){var me=this;return me.callParent(arguments),me.hidden||me.setVerticalPosition(),me},beforeShow:function(){var viewHeight,me=this;me.floating&&(me.savedMaxHeight=me.maxHeight,viewHeight=me.container.getViewSize().height,me.maxHeight=Math.min(me.maxHeight||viewHeight,viewHeight)),me.callParent(arguments)},afterShow:function(){var me=this;me.callParent(arguments),me.floating&&(me.maxHeight=me.savedMaxHeight)},setVerticalPosition:function(){var max,me=this,y=me.getY(),returnY=y,height=me.getHeight(),viewportHeight=Ext.Element.getViewportHeight().height,parentEl=me.el.parent(),viewHeight=parentEl.getViewSize().height,normalY=y-parentEl.getScroll().top;parentEl=null,me.floating&&(max=me.maxHeight?me.maxHeight:viewHeight-normalY,height>viewHeight?returnY=y-normalY:max<height?returnY=y-(height-max):y+height>viewportHeight&&(returnY=viewportHeight-height)),me.setY(returnY)}});Ext.define("Ext.panel.Tool",{extend:"Ext.Component",requires:["Ext.tip.QuickTipManager"],alias:"widget.tool",isTool:!0,baseCls:Ext.baseCSSPrefix+"tool",disabledCls:Ext.baseCSSPrefix+"tool-disabled",toolPressedCls:Ext.baseCSSPrefix+"tool-pressed",toolOverCls:Ext.baseCSSPrefix+"tool-over",ariaRole:"button",childEls:["toolEl"],renderTpl:['<img id="{id}-toolEl" src="{blank}" class="{baseCls}-img {baseCls}-{type}{childElCls}" role="presentation"/>'],toolOwner:null,tooltipType:"qtip",stopEvent:!0,height:15,width:15,_toolTypes:{close:1,collapse:1,down:1,expand:1,gear:1,help:1,left:1,maximize:1,minimize:1,minus:1,next:1,pin:1,plus:1,prev:1,print:1,refresh:1,restore:1,right:1,save:1,search:1,toggle:1,unpin:1,up:1},initComponent:function(){var me=this;me.addEvents("click"),me.id&&me._toolTypes[me.id]&&Ext.global.console&&Ext.global.console.warn("When specifying a tool you should use the type option, the id can conflict now that tool is a Component"),me.type=me.type||me.id,Ext.applyIf(me.renderData,{baseCls:me.baseCls,blank:Ext.BLANK_IMAGE_URL,type:me.type}),me.tooltip=me.tooltip||me.qtip,me.callParent()},afterRender:function(){var attr,me=this;me.callParent(arguments),me.el.on({click:me.onClick,mousedown:me.onMouseDown,mouseover:me.onMouseOver,mouseout:me.onMouseOut,scope:me}),me.tooltip&&(Ext.quickTipsActive&&Ext.isObject(me.tooltip)?Ext.tip.QuickTipManager.register(Ext.apply({target:me.id},me.tooltip)):(attr="qtip"==me.tooltipType?"data-qtip":"title",me.el.dom.setAttribute(attr,me.tooltip)))},getFocusEl:function(){return this.el},setType:function(type){var me=this,oldType=me.type;return me.type=type,me.rendered?(oldType&&me.toolEl.removeCls(me.baseCls+"-"+oldType),me.toolEl.addCls(me.baseCls+"-"+type)):me.renderData.type=type,me},onClick:function(e,target){var me=this;return!me.disabled&&(me.el.removeCls(me.toolPressedCls),me.el.removeCls(me.toolOverCls),!1!==me.stopEvent&&e.stopEvent(),me.handler?Ext.callback(me.handler,me.scope||me,[e,target,me.ownerCt,me]):me.callback&&Ext.callback(me.callback,me.scope||me,[me.toolOwner||me.ownerCt,me,e]),me.fireEvent("click",me,e),!0)},onDestroy:function(){var me=this;Ext.quickTipsActive&&Ext.isObject(me.tooltip)&&Ext.tip.QuickTipManager.unregister(me.id),me.keyMap&&me.keyMap.destroy(),me.callParent()},onMouseDown:function(){if(this.disabled)return!1;this.el.addCls(this.toolPressedCls)},onMouseOver:function(){if(this.disabled)return!1;this.el.addCls(this.toolOverCls)},onMouseOut:function(){this.el.removeCls(this.toolOverCls)}});Ext.define("Ext.resizer.SplitterTracker",{extend:"Ext.dd.DragTracker",requires:["Ext.util.Region"],enabled:!0,overlayCls:Ext.baseCSSPrefix+"resizable-overlay",createDragOverlay:function(){var overlay;overlay=this.overlay=Ext.getBody().createChild({role:"presentation",cls:this.overlayCls,html:"&#160;"}),overlay.unselectable(),overlay.setSize(Ext.Element.getViewWidth(!0),Ext.Element.getViewHeight(!0)),overlay.show()},getPrevCmp:function(){return this.getSplitter().previousSibling(":not([hidden])")},getNextCmp:function(){return this.getSplitter().nextSibling(":not([hidden])")},onBeforeStart:function(e){var box,me=this,prevCmp=me.getPrevCmp(),nextCmp=me.getNextCmp(),collapseEl=me.getSplitter().collapseEl,target=e.getTarget();return!(!prevCmp||!nextCmp)&&((!collapseEl||target!==me.getSplitter().collapseEl.dom)&&(!nextCmp.collapsed&&!prevCmp.collapsed&&(me.prevBox=prevCmp.getEl().getBox(),me.nextBox=nextCmp.getEl().getBox(),me.constrainTo=box=me.calculateConstrainRegion(),box||!1)))},onStart:function(e){var splitter=this.getSplitter();this.createDragOverlay(),splitter.addCls(splitter.baseCls+"-active")},calculateConstrainRegion:function(){var prevConstrainRegion,nextConstrainRegion,constrainOptions,me=this,splitter=me.getSplitter(),splitWidth=splitter.getWidth(),defaultMin=splitter.defaultSplitMin,orient=splitter.orientation,prevBox=me.prevBox,prevCmp=me.getPrevCmp(),nextBox=me.nextBox,nextCmp=me.getNextCmp();return"vertical"===orient?(constrainOptions={prevCmp:prevCmp,nextCmp:nextCmp,prevBox:prevBox,nextBox:nextBox,defaultMin:defaultMin,splitWidth:splitWidth},prevConstrainRegion=new Ext.util.Region(prevBox.y,me.getVertPrevConstrainRight(constrainOptions),prevBox.bottom,me.getVertPrevConstrainLeft(constrainOptions)),nextConstrainRegion=new Ext.util.Region(nextBox.y,me.getVertNextConstrainRight(constrainOptions),nextBox.bottom,me.getVertNextConstrainLeft(constrainOptions))):(prevConstrainRegion=new Ext.util.Region(prevBox.y+(prevCmp.minHeight||defaultMin),prevBox.right,(prevCmp.maxHeight?prevBox.y+prevCmp.maxHeight:nextBox.bottom-(nextCmp.minHeight||defaultMin))+splitWidth,prevBox.x),nextConstrainRegion=new Ext.util.Region((nextCmp.maxHeight?nextBox.bottom-nextCmp.maxHeight:prevBox.y+(prevCmp.minHeight||defaultMin))-splitWidth,nextBox.right,nextBox.bottom-(nextCmp.minHeight||defaultMin),nextBox.x)),prevConstrainRegion.intersect(nextConstrainRegion)},performResize:function(e,offset){for(var item,size,me=this,splitter=me.getSplitter(),orient=splitter.orientation,prevCmp=me.getPrevCmp(),nextCmp=me.getNextCmp(),owner=splitter.ownerCt,flexedSiblings=owner.query(">[flex]"),len=flexedSiblings.length,vertical="vertical"===orient,i=0,dimension=vertical?"width":"height",totalFlex=0;i<len;i++)item=flexedSiblings[i],size=vertical?item.getWidth():item.getHeight(),totalFlex+=size,item.flex=size;offset=vertical?offset[0]:offset[1],prevCmp&&(size=me.prevBox[dimension]+offset,prevCmp.flex?prevCmp.flex=size:prevCmp[dimension]=size),nextCmp&&(size=me.nextBox[dimension]-offset,nextCmp.flex?nextCmp.flex=size:nextCmp[dimension]=size),owner.updateLayout()},endDrag:function(){var me=this;me.overlay&&(me.overlay.remove(),delete me.overlay),me.callParent(arguments)},onEnd:function(e){var me=this,splitter=me.getSplitter();splitter.removeCls(splitter.baseCls+"-active"),me.performResize(e,me.getResizeOffset())},onDrag:function(e){var me=this,offset=me.getOffset("dragTarget"),splitter=me.getSplitter(),splitEl=splitter.getEl();"vertical"===splitter.orientation?splitEl.setX(me.startRegion.left+offset[0]):splitEl.setY(me.startRegion.top+offset[1])},getSplitter:function(){return this.splitter},getVertPrevConstrainRight:function(o){return(o.prevCmp.maxWidth?o.prevBox.x+o.prevCmp.maxWidth:o.nextBox.right-(o.nextCmp.minWidth||o.defaultMin))+o.splitWidth},getVertPrevConstrainLeft:function(o){return o.prevBox.x+(o.prevCmp.minWidth||o.defaultMin)},getVertNextConstrainRight:function(o){return o.nextBox.right-(o.nextCmp.minWidth||o.defaultMin)},getVertNextConstrainLeft:function(o){return(o.nextCmp.maxWidth?o.nextBox.right-o.nextCmp.maxWidth:o.prevBox.x+(o.prevBox.minWidth||o.defaultMin))-o.splitWidth},getResizeOffset:function(){return this.getOffset("dragTarget")}});Ext.define("Ext.resizer.BorderSplitterTracker",{extend:"Ext.resizer.SplitterTracker",requires:["Ext.util.Region"],getPrevCmp:null,getNextCmp:null,calculateConstrainRegion:function(){var i,neighbor,minRange,maxRange,maxGrowth,maxShrink,targetSize,me=this,splitter=me.splitter,collapseTarget=splitter.collapseTarget,defaultSplitMin=splitter.defaultSplitMin,sizePropCap=splitter.vertical?"Width":"Height",minSizeProp="min"+sizePropCap,maxSizeProp="max"+sizePropCap,getSizeMethod="get"+sizePropCap,neighbors=splitter.neighbors,length=neighbors.length,box=collapseTarget.el.getBox(),left=box.x,top=box.y,right=box.right,bottom=box.bottom,size=splitter.vertical?right-left:bottom-top;for(minRange=(collapseTarget[minSizeProp]||Math.min(size,defaultSplitMin))-size,maxRange=collapseTarget[maxSizeProp],maxRange?maxRange-=size:maxRange=1e9,targetSize=size,i=0;i<length;++i)neighbor=neighbors[i],size=neighbor[getSizeMethod](),maxGrowth=size-neighbor[maxSizeProp],maxShrink=size-(neighbor[minSizeProp]||Math.min(size,defaultSplitMin)),isNaN(maxGrowth)||minRange<maxGrowth&&(minRange=maxGrowth),maxRange>maxShrink&&(maxRange=maxShrink);return maxRange-minRange<2?null:(box=new Ext.util.Region(top,right,bottom,left),me.constraintAdjusters[me.getCollapseDirection()](box,minRange,maxRange,splitter),me.dragInfo={minRange:minRange,maxRange:maxRange,targetSize:targetSize},box)},constraintAdjusters:{left:function(box,minRange,maxRange,splitter){box[0]=box.x=box.left=box.right+minRange,box.right+=maxRange+splitter.getWidth()},top:function(box,minRange,maxRange,splitter){box[1]=box.y=box.top=box.bottom+minRange,box.bottom+=maxRange+splitter.getHeight()},bottom:function(box,minRange,maxRange,splitter){box.bottom=box.top-minRange,box.top-=maxRange+splitter.getHeight()},right:function(box,minRange,maxRange,splitter){box.right=box.left-minRange,box[0]=box.x=box.left=box.x-maxRange+splitter.getWidth()}},onBeforeStart:function(e){var i,neighbor,me=this,splitter=me.splitter,collapseTarget=splitter.collapseTarget,neighbors=splitter.neighbors,collapseEl=me.getSplitter().collapseEl,target=e.getTarget(),length=neighbors.length;if(collapseEl&&target===splitter.collapseEl.dom)return!1;if(collapseTarget.collapsed)return!1;for(i=0;i<length;++i)if(neighbor=neighbors[i],neighbor.collapsed&&neighbor.isHorz===collapseTarget.isHorz)return!1;return!!(me.constrainTo=me.calculateConstrainRegion())},performResize:function(e,offset){var owner,me=this,splitter=me.splitter,collapseDirection=splitter.getCollapseDirection(),collapseTarget=splitter.collapseTarget,adjusters=me.splitAdjusters[splitter.vertical?"horz":"vert"],delta=offset[adjusters.index],dragInfo=me.dragInfo;"right"!=collapseDirection&&"bottom"!=collapseDirection||(delta=-delta),(delta=Math.min(Math.max(dragInfo.minRange,delta),dragInfo.maxRange))&&((owner=splitter.ownerCt).suspendLayouts(),adjusters.adjustTarget(collapseTarget,dragInfo.targetSize,delta),owner.resumeLayouts(!0))},splitAdjusters:{horz:{index:0,adjustTarget:function(target,size,delta){target.flex=null,target.setSize(size+delta)}},vert:{index:1,adjustTarget:function(target,targetSize,delta){target.flex=null,target.setSize(void 0,targetSize+delta)}}},getCollapseDirection:function(){return this.splitter.getCollapseDirection()}});Ext.define("Ext.resizer.ResizeTracker",{extend:"Ext.dd.DragTracker",dynamic:!0,preserveRatio:!1,constrainTo:null,proxyCls:Ext.baseCSSPrefix+"resizable-proxy",constructor:function(config){var widthRatio,heightRatio,throttledResizeFn,me=this;config.el||(config.target.isComponent?me.el=config.target.getEl():me.el=config.target),this.callParent(arguments),me.preserveRatio&&me.minWidth&&me.minHeight&&(widthRatio=me.minWidth/me.el.getWidth(),heightRatio=me.minHeight/me.el.getHeight(),heightRatio>widthRatio?me.minWidth=me.el.getWidth()*heightRatio:me.minHeight=me.el.getHeight()*widthRatio),me.throttle&&(throttledResizeFn=Ext.Function.createThrottled(function(){Ext.resizer.ResizeTracker.prototype.resize.apply(me,arguments)},me.throttle),me.resize=function(box,direction,atEnd){atEnd?Ext.resizer.ResizeTracker.prototype.resize.apply(me,arguments):throttledResizeFn.apply(null,arguments)})},onBeforeStart:function(e){this.startBox=this.target.getBox()},getDynamicTarget:function(){var me=this,target=me.target;return me.dynamic?target:(me.proxy||(me.proxy=me.createProxy(target)),me.proxy.show(),me.proxy)},createProxy:function(target){var proxy,cls=this.proxyCls;return proxy=target.isComponent?target.getProxy().addCls(cls):target.createProxy({tag:"div",role:"presentation",cls:cls,id:target.id+"-rzproxy"},Ext.getBody()),proxy.removeCls(Ext.baseCSSPrefix+"proxy-el"),proxy},onStart:function(e){this.activeResizeHandle=Ext.get(this.getDragTarget().id),this.dynamic||this.resize(this.startBox,{horizontal:"none",vertical:"none"})},onDrag:function(e){(this.dynamic||this.proxy)&&this.updateDimensions(e)},updateDimensions:function(e,atEnd){var ratio,snappedWidth,snappedHeight,dragRatio,oppositeCorner,axis,newBox,newHeight,newWidth,me=this,region=me.activeResizeHandle.region,offset=me.getOffset(me.constrainTo?"dragTarget":null),box=me.startBox,widthAdjust=0,heightAdjust=0,adjustX=0,adjustY=0,horizDir=offset[0]<0?"right":"left",vertDir=offset[1]<0?"down":"up";switch(region=me.convertRegionName(region)){case"south":heightAdjust=offset[1],axis=2;break;case"north":heightAdjust=-offset[1],adjustY=-heightAdjust,axis=2;break;case"east":widthAdjust=offset[0],axis=1;break;case"west":widthAdjust=-offset[0],adjustX=-widthAdjust,axis=1;break;case"northeast":heightAdjust=-offset[1],adjustY=-heightAdjust,widthAdjust=offset[0],oppositeCorner=[box.x,box.y+box.height],axis=3;break;case"southeast":heightAdjust=offset[1],widthAdjust=offset[0],oppositeCorner=[box.x,box.y],axis=3;break;case"southwest":widthAdjust=-offset[0],adjustX=-widthAdjust,heightAdjust=offset[1],oppositeCorner=[box.x+box.width,box.y],axis=3;break;case"northwest":heightAdjust=-offset[1],adjustY=-heightAdjust,widthAdjust=-offset[0],adjustX=-widthAdjust,oppositeCorner=[box.x+box.width,box.y+box.height],axis=3}if(newBox={width:box.width+widthAdjust,height:box.height+heightAdjust,x:box.x+adjustX,y:box.y+adjustY},snappedWidth=Ext.Number.snap(newBox.width,me.widthIncrement),snappedHeight=Ext.Number.snap(newBox.height,me.heightIncrement),snappedWidth!=newBox.width||snappedHeight!=newBox.height){switch(region){case"northeast":case"north":newBox.y-=snappedHeight-newBox.height;break;case"southwest":case"west":newBox.x-=snappedWidth-newBox.width;break;case"northwest":newBox.x-=snappedWidth-newBox.width,newBox.y-=snappedHeight-newBox.height}newBox.width=snappedWidth,newBox.height=snappedHeight}newBox.width<me.minWidth||newBox.width>me.maxWidth?(newBox.width=Ext.Number.constrain(newBox.width,me.minWidth,me.maxWidth),adjustX&&(newBox.x=box.x+(box.width-newBox.width))):me.lastX=newBox.x,newBox.height<me.minHeight||newBox.height>me.maxHeight?(newBox.height=Ext.Number.constrain(newBox.height,me.minHeight,me.maxHeight),adjustY&&(newBox.y=box.y+(box.height-newBox.height))):me.lastY=newBox.y,(me.preserveRatio||e.shiftKey)&&(ratio=me.startBox.width/me.startBox.height,newHeight=Math.min(Math.max(me.minHeight,newBox.width/ratio),me.maxHeight),newWidth=Math.min(Math.max(me.minWidth,newBox.height*ratio),me.maxWidth),1==axis?newBox.height=newHeight:2==axis?newBox.width=newWidth:(dragRatio=Math.abs(oppositeCorner[0]-this.lastXY[0])/Math.abs(oppositeCorner[1]-this.lastXY[1]),dragRatio>ratio?newBox.height=newHeight:newBox.width=newWidth,"northeast"==region?newBox.y=box.y-(newBox.height-box.height):"northwest"==region?(newBox.y=box.y-(newBox.height-box.height),newBox.x=box.x-(newBox.width-box.width)):"southwest"==region&&(newBox.x=box.x-(newBox.width-box.width)))),0===heightAdjust&&(vertDir="none"),0===widthAdjust&&(horizDir="none"),me.resize(newBox,{horizontal:horizDir,vertical:vertDir},atEnd)},getResizeTarget:function(atEnd){return atEnd?this.target:this.getDynamicTarget()},resize:function(box,direction,atEnd){var me=this;me.getResizeTarget(atEnd).setBox(box),me.originalTarget&&(me.dynamic||atEnd)&&me.originalTarget.setBox(box)},onEnd:function(e){this.updateDimensions(e,!0),this.proxy&&this.proxy.hide()},convertRegionName:function(name){return name}});Ext.define("Ext.resizer.Resizer",{mixins:{observable:"Ext.util.Observable"},uses:["Ext.resizer.ResizeTracker","Ext.Component"],alternateClassName:"Ext.Resizable",handleCls:Ext.baseCSSPrefix+"resizable-handle",pinnedCls:Ext.baseCSSPrefix+"resizable-pinned",overCls:Ext.baseCSSPrefix+"resizable-over",wrapCls:Ext.baseCSSPrefix+"resizable-wrap",delimiterRe:/(?:\s*[,;]\s*)|\s+/,dynamic:!0,handles:"s e se",height:null,width:null,heightIncrement:0,widthIncrement:0,minHeight:20,minWidth:20,maxHeight:1e4,maxWidth:1e4,pinned:!1,preserveRatio:!1,transparent:!1,possiblePositions:{n:"north",s:"south",e:"east",w:"west",se:"southeast",sw:"southwest",nw:"northwest",ne:"northeast"},ariaRole:"presentation",constructor:function(config){var target,targetEl,tag,handleCls,possibles,len,pos,eastWestStyle,style,box,targetBaseCls,me=this,handles=me.handles,i=0,handleEls=[],unselectableCls=Ext.dom.Element.unselectableCls;for(me.addEvents("beforeresize","resizedrag","resize"),(Ext.isString(config)||Ext.isElement(config)||config.dom)&&(target=config,config=arguments[1]||{},config.target=target),me.mixins.observable.constructor.call(me,config),target=me.target,target?target.isComponent?(target.addClsWithUI("resizable"),me.el=target.getEl(),target.minWidth&&(me.minWidth=target.minWidth),target.minHeight&&(me.minHeight=target.minHeight),target.maxWidth&&(me.maxWidth=target.maxWidth),target.maxHeight&&(me.maxHeight=target.maxHeight),target.floating&&(me.hasOwnProperty("handles")||(me.handles="n ne e se s sw w nw"))):me.el=me.target=Ext.get(target):me.target=me.el=Ext.get(me.el),tag=me.el.dom.tagName.toUpperCase(),"TEXTAREA"!=tag&&"IMG"!=tag&&"TABLE"!=tag||(me.originalTarget=me.target,targetEl=me.el,box=targetEl.getBox(),me.target=me.el=me.el.wrap({role:"presentation",cls:me.wrapCls,id:me.el.id+"-rzwrap",style:targetEl.getStyles("margin-top","margin-bottom")}),me.el.setPositioning(targetEl.getPositioning()),targetEl.clearPositioning(),me.el.setBox(box),targetEl.setStyle("position","absolute")),me.el.position(),me.pinned&&me.el.addCls(me.pinnedCls),me.resizeTracker=new Ext.resizer.ResizeTracker({disabled:me.disabled,target:me.target,constrainTo:me.constrainTo,overCls:me.overCls,throttle:me.throttle,originalTarget:me.originalTarget,delegate:"."+me.handleCls,dynamic:me.dynamic,preserveRatio:me.preserveRatio,heightIncrement:me.heightIncrement,widthIncrement:me.widthIncrement,minHeight:me.minHeight,maxHeight:me.maxHeight,minWidth:me.minWidth,maxWidth:me.maxWidth}),me.resizeTracker.on({mousedown:me.onBeforeResize,drag:me.onResize,dragend:me.onResizeEnd,scope:me}),"all"==me.handles&&(me.handles="n s e w ne nw se sw"),handles=me.handles=me.handles.split(me.delimiterRe),possibles=me.possiblePositions,len=handles.length,handleCls=me.handleCls+" "+me.handleCls+"-{0}",me.target.isComponent&&(targetBaseCls=me.target.baseCls,handleCls+=" "+targetBaseCls+"-handle "+targetBaseCls+"-handle-{0}",Ext.supports.CSS3BorderRadius&&(handleCls+=" "+targetBaseCls+"-handle-{0}-br")),eastWestStyle=Ext.isIE6?' style="height:'+me.el.getHeight()+'px"':"";i<len;i++)handles[i]&&possibles[handles[i]]&&(pos=possibles[handles[i]],style="east"===pos||"west"===pos?eastWestStyle:"",handleEls.push('<div id="',me.el.id,"-",pos,'-handle"',' class="',Ext.String.format(handleCls,pos)," ",unselectableCls,'"',' unselectable="on" role="presentation"',style,"></div>"));for(Ext.DomHelper.append(me.el,handleEls.join("")),i=0;i<len;i++)handles[i]&&possibles[handles[i]]&&(pos=possibles[handles[i]],me[pos]=me.el.getById(me.el.id+"-"+pos+"-handle"),me[pos].region=pos,me.transparent&&me[pos].setOpacity(0));Ext.isNumber(me.width)&&(me.width=Ext.Number.constrain(me.width,me.minWidth,me.maxWidth)),Ext.isNumber(me.height)&&(me.height=Ext.Number.constrain(me.height,me.minHeight,me.maxHeight)),null===me.width&&null===me.height||(me.originalTarget&&(me.originalTarget.setWidth(me.width),me.originalTarget.setHeight(me.height)),me.resizeTo(me.width,me.height)),me.forceHandlesHeight()},disable:function(){this.resizeTracker.disable()},enable:function(){this.resizeTracker.enable()},onBeforeResize:function(tracker,e){var box=this.el.getBox();return this.fireEvent("beforeresize",this,box.width,box.height,e)},onResize:function(tracker,e){var me=this,box=me.el.getBox();return me.forceHandlesHeight(),me.fireEvent("resizedrag",me,box.width,box.height,e)},onResizeEnd:function(tracker,e){var me=this,box=me.el.getBox();return me.forceHandlesHeight(),me.fireEvent("resize",me,box.width,box.height,e)},resizeTo:function(width,height){var me=this;me.target.setSize(width,height),me.fireEvent("resize",me,width,height,null)},getEl:function(){return this.el},getTarget:function(){return this.target},destroy:function(){var i,handle,me=this,handles=me.handles,len=handles.length,positions=me.possiblePositions;for(me.resizeTracker.destroy(),i=0;i<len;i++)(handle=me[positions[handles[i]]])&&handle.remove()},forceHandlesHeight:function(){var handle,me=this;Ext.isIE6&&(handle=me.east,handle&&handle.setHeight(me.el.getHeight()),handle=me.west,handle&&handle.setHeight(me.el.getHeight()),me.el.repaint())}});Ext.define("Ext.selection.CellModel",{extend:"Ext.selection.Model",alias:"selection.cellmodel",requires:["Ext.grid.CellContext","Ext.util.KeyNav"],isCellModel:!0,enableKeyNav:!0,preventWrap:!1,noSelection:{row:-1,column:-1},constructor:function(){this.addEvents("deselect","select"),this.callParent(arguments)},bindComponent:function(view){var me=this,grid=view.ownerCt;me.primaryView=view,me.views=me.views||[],me.views.push(view),me.bindStore(view.getStore(),!0),view.on({cellclick:me.onCellClick,refresh:me.onViewRefresh,scope:me}),!1!==grid.optimizedColumnMove&&grid.on("columnmove",me.onColumnMove,me),me.enableKeyNav&&me.initKeyNav(view)},initKeyNav:function(view){var me=this;if(!view.rendered)return void view.on("render",Ext.Function.bind(me.initKeyNav,me,[view],0),me,{single:!0});view.el.set({tabIndex:-1}),me.keyNav=new Ext.util.KeyNav({target:view.el,ignoreInputFields:!0,up:me.onKeyUp,down:me.onKeyDown,right:me.onKeyRight,left:me.onKeyLeft,tab:me.onKeyTab,scope:me})},getHeaderCt:function(){var selection=this.getCurrentPosition();return(selection?selection.view:this.primaryView).headerCt},onKeyUp:function(e){this.doMove("up",e)},onKeyDown:function(e){this.doMove("down",e)},onKeyLeft:function(e){this.doMove("left",e)},onKeyRight:function(e){this.doMove("right",e)},doMove:function(direction,e){this.keyNavigation=!0,this.move(direction,e),this.keyNavigation=!1},select:function(pos,keepExisting,suppressEvent){var row,me=this,oldPos=me.getCurrentPosition(),store=me.view.store;(pos||0===pos)&&(pos.isModel?(row=store.indexOf(pos),pos=-1!==row?{row:row,column:oldPos?oldPos.column:0}:null):"number"==typeof pos&&(pos={row:pos,column:0})),pos?me.selectByPosition(pos,suppressEvent):me.deselect()},deselect:function(record,suppressEvent){this.selectByPosition(null,suppressEvent)},move:function(dir,e){var newPos,me=this,pos=me.getCurrentPosition();return pos&&(newPos=pos.view.walkCells(pos,dir,e,me.preventWrap))?me.setCurrentPosition(newPos):null},getCurrentPosition:function(){return this.selecting?this.nextSelection:this.selection},setCurrentPosition:function(pos,suppressEvent,preventCheck){var me=this,last=me.selection;return me.lastSelection=last,pos&&(pos=pos.isCellContext?pos:new Ext.grid.CellContext(me.primaryView).setPosition(pos)),!preventCheck&&last&&(pos&&pos.record===last.record&&pos.columnHeader===last.columnHeader&&pos.view===last.view?pos=null:me.onCellDeselect(me.selection,suppressEvent)),pos?(me.nextSelection=pos,me.selecting=!0,me.onCellSelect(me.nextSelection,suppressEvent),me.selecting=!1,me.selection=pos):null},isCellSelected:function(view,row,column){var testPos,me=this,pos=me.getCurrentPosition();if(pos&&pos.view===view)return testPos=new Ext.grid.CellContext(view).setPosition({row:row,column:column}),testPos.record===pos.record&&testPos.columnHeader===pos.columnHeader},onStoreRemove:function(store,records,indexes){var me=this,pos=me.getCurrentPosition();me.callParent(arguments),pos&&store.getCount()&&-1!==store.indexOf(pos.record)?me.setCurrentPosition({row:pos.record,column:pos.columnHeader},!0,!0):me.selection=null},onStoreAdd:function(){var me=this,pos=me.getCurrentPosition();me.callParent(arguments),pos?me.setCurrentPosition({row:pos.record,column:pos.columnHeader},!0,!0):me.selection=null},onCellClick:function(view,cell,cellIndex,record,row,recordIndex,e){var newPos;-1!==recordIndex&&(newPos=new Ext.grid.CellContext(view).setPosition({view:view,row:row,column:view.ownerCt.getColumnManager().getHeaderAtIndex(cellIndex)}),this.setCurrentPosition(newPos))},onCellSelect:function(position,supressEvent){position&&void 0!==position.row&&position.row>-1&&this.doSelect(position.record,!1,supressEvent)},onCellDeselect:function(position,supressEvent){position&&void 0!==position.row&&this.doDeselect(position.record,supressEvent)},onSelectChange:function(record,isSelected,suppressEvent,commitFn){var pos,eventName,view,me=this;isSelected?(pos=me.nextSelection,eventName="select"):(pos=me.lastSelection||me.noSelection,eventName="deselect"),view=pos.view||me.primaryView,!1!==(suppressEvent||me.fireEvent("before"+eventName,me,record,pos.row,pos.column))&&!1!==commitFn()&&(isSelected?(me.preventFocus||view.focusCell(pos,!0),view.onCellSelect(pos)):(view.onCellDeselect(pos),delete me.selection),suppressEvent||me.fireEvent(eventName,me,record,pos.row,pos.column))},onKeyTab:function(e,t){var editingPlugin,me=this,pos=me.getCurrentPosition();pos&&(editingPlugin=pos.view.editingPlugin,editingPlugin&&me.wasEditing?me.onEditorTab(editingPlugin,e):me.move(e.shiftKey?"left":"right",e))},onEditorTab:function(editingPlugin,e){var me=this,direction=e.shiftKey?"left":"right",position=me.move(direction,e);position&&(editingPlugin.startEdit(position.record,position.columnHeader)?me.wasEditing=!1:(position.view.scrollCellIntoView(position),me.wasEditing=!0))},refresh:function(){var selRowIdx,pos=this.getCurrentPosition();pos&&-1!==(selRowIdx=this.store.indexOf(this.selected.last()))&&(pos.row=selRowIdx)},onColumnMove:function(headerCt,header,fromIdx,toIdx){var grid=headerCt.up("tablepanel");grid&&this.onViewRefresh(grid.view)},onUpdate:function(record){var pos,me=this;me.isSelected(record)&&(pos=me.selecting?me.nextSelection:me.selection,me.view.onCellSelect(pos))},onViewRefresh:function(view){var newPos,record,columnHeader,me=this,pos=me.getCurrentPosition(),headerCt=view.headerCt;pos&&pos.view===view&&(record=pos.record,columnHeader=pos.columnHeader,columnHeader.isDescendantOf(headerCt)||(columnHeader=headerCt.queryById(columnHeader.id)||headerCt.down('[text="'+columnHeader.text+'"]')||headerCt.down('[dataIndex="'+columnHeader.dataIndex+'"]')),pos.record?columnHeader&&-1!==view.store.indexOfId(record.getId())&&(newPos=new Ext.grid.CellContext(view).setPosition({row:record,column:columnHeader}),me.setCurrentPosition(newPos)):me.selection=null)},selectByPosition:function(position,suppressEvent){this.setCurrentPosition(position,suppressEvent)}});Ext.define("Ext.selection.RowModel",{extend:"Ext.selection.Model",alias:"selection.rowmodel",requires:["Ext.util.KeyNav"],deltaScroll:5,enableKeyNav:!0,ignoreRightMouseSelection:!1,isRowModel:!0,constructor:function(){this.addEvents("beforedeselect","beforeselect","deselect","select"),this.views=[],this.callParent(arguments)},bindComponent:function(view){var me=this;view.on({itemcontextmenu:me.onRowClick,itemclick:me.onRowClick,scope:me}),me.enableKeyNav&&me.initKeyNav(view)},initKeyNav:function(view){var me=this;if(!view.rendered)return void view.on("render",Ext.Function.bind(me.initKeyNav,me,[view],0),me,{single:!0});view.el.set({tabIndex:-1}),me.keyNav=new Ext.util.KeyNav({target:view,ignoreInputFields:!0,eventName:"itemkeydown",processEvent:function(view,record,node,index,event){return event.record=record,event.recordIndex=index,event},up:me.onKeyUp,down:me.onKeyDown,right:me.onKeyRight,left:me.onKeyLeft,pageDown:me.onKeyPageDown,pageUp:me.onKeyPageUp,home:me.onKeyHome,end:me.onKeyEnd,space:me.onKeySpace,enter:me.onKeyEnter,scope:me})},onUpdate:function(record){var index,me=this,view=me.view;view&&me.isSelected(record)&&(index=view.indexOf(record),view.onRowSelect(index),record===me.lastFocused&&view.onRowFocus(index,!0))},getRowsVisible:function(){var rowHeight,gridViewHeight,rowsVisible=!1,view=this.views[0],firstRow=view.all.first();return firstRow&&(rowHeight=firstRow.getHeight(),gridViewHeight=view.el.getHeight(),rowsVisible=Math.floor(gridViewHeight/rowHeight)),rowsVisible},onKeyEnd:function(e){var me=this,view=me.views[0];view.bufferedRenderer?view.bufferedRenderer.scrollTo(me.store.getCount()-1,!1,function(newIdx,newRecord){me.afterKeyNavigate(e,newRecord)}):me.afterKeyNavigate(e,view.getRecord(view.all.getCount()-1))},onKeyHome:function(e){var me=this,view=me.views[0];view.bufferedRenderer?view.bufferedRenderer.scrollTo(0,!1,function(newIdx,newRecord){me.afterKeyNavigate(e,newRecord)}):me.afterKeyNavigate(e,view.getRecord(0))},onKeyPageUp:function(e){var newIdx,newRecord,me=this,view=me.views[0],rowsVisible=me.getRowsVisible();rowsVisible&&(view.bufferedRenderer?(newIdx=Math.max(e.recordIndex-rowsVisible,0),(me.lastKeyEvent||(me.lastKeyEvent=new Ext.EventObjectImpl)).setEvent(e.browserEvent),view.bufferedRenderer.scrollTo(newIdx,!1,me.afterBufferedScrollTo,me)):(newRecord=view.walkRecs(e.record,-rowsVisible),me.afterKeyNavigate(e,newRecord)))},onKeyPageDown:function(e){var newIdx,newRecord,me=this,view=me.views[0],rowsVisible=me.getRowsVisible();rowsVisible&&(view.bufferedRenderer?(newIdx=Math.min(e.recordIndex+rowsVisible,me.store.getCount()-1),(me.lastKeyEvent||(me.lastKeyEvent=new Ext.EventObjectImpl)).setEvent(e.browserEvent),view.bufferedRenderer.scrollTo(newIdx,!1,me.afterBufferedScrollTo,me)):(newRecord=view.walkRecs(e.record,rowsVisible),me.afterKeyNavigate(e,newRecord)))},onKeySpace:function(e){var record=this.lastFocused;record&&this.afterKeyNavigate(e,record)},onKeyEnter:Ext.emptyFn,onKeyUp:function(e){var newRecord=this.views[0].walkRecs(e.record,-1);newRecord&&this.afterKeyNavigate(e,newRecord)},onKeyDown:function(e){var newRecord=e.record.isExpandingOrCollapsing?null:this.views[0].walkRecs(e.record,1);newRecord&&this.afterKeyNavigate(e,newRecord)},afterBufferedScrollTo:function(newIdx,newRecord){this.afterKeyNavigate(this.lastKeyEvent,newRecord)},scrollByDeltaX:function(delta){var view=this.views[0],section=view.up(),hScroll=section.horizontalScroller;hScroll&&hScroll.scrollByDeltaX(delta)},onKeyLeft:function(e){this.scrollByDeltaX(-this.deltaScroll)},onKeyRight:function(e){this.scrollByDeltaX(this.deltaScroll)},onRowClick:function(view,record,item,index,e){var me=this;if(-1!==index){if(!me.allowRightMouseSelection(e))return;me.processSelection(view,record,item,index,e)}},processSelection:function(view,record,item,index,e){this.selectWithEvent(record,e)},allowRightMouseSelection:function(e){var disallow=this.ignoreRightMouseSelection&&0!==e.button;return disallow&&(disallow=this.hasSelection()),!disallow},onSelectChange:function(record,isSelected,suppressEvent,commitFn){var me=this,views=me.views,viewsLn=views.length,rowIdx=views[0].indexOf(record),eventName=isSelected?"select":"deselect",i=0;if(!1!==(suppressEvent||me.fireEvent("before"+eventName,me,record,rowIdx))&&!1!==commitFn()){for(;i<viewsLn;i++)isSelected?views[i].onRowSelect(rowIdx,suppressEvent):views[i].onRowDeselect(rowIdx,suppressEvent);suppressEvent||me.fireEvent(eventName,me,record,rowIdx)}},onLastFocusChanged:function(oldFocused,newFocused,supressFocus){var rowIdx,views=this.views,viewsLn=views.length,i=0;if(oldFocused&&-1!=(rowIdx=views[0].indexOf(oldFocused)))for(;i<viewsLn;i++)views[i].onRowFocus(rowIdx,!1,!0);if(newFocused&&-1!=(rowIdx=views[0].indexOf(newFocused)))for(i=0;i<viewsLn;i++)views[i].onRowFocus(rowIdx,!0,supressFocus);this.callParent(arguments)},onEditorTab:function(editingPlugin,e){var lastPos,me=this,view=editingPlugin.context.view,record=editingPlugin.getActiveRecord(),header=editingPlugin.getActiveColumn(),position=view.getPosition(record,header),direction=e.shiftKey?"left":"right";do{if(lastPos=position,position=view.walkCells(position,direction,e,me.preventWrap),lastPos&&lastPos.isEqual(position))return}while(position&&(!position.columnHeader.getEditor(record)||!editingPlugin.startEditByPosition(position)))},getCurrentPosition:function(){var firstSelection=this.selected.getAt(0);if(firstSelection)return new Ext.grid.CellContext(this.view).setPosition(this.store.indexOf(firstSelection),0)},selectByPosition:function(position){var context=new Ext.grid.CellContext(this.view);context.setPosition(position.row,position.column),this.select(context.record)},selectNext:function(keepExisting,suppressEvent){var success,me=this,store=me.store,selection=me.getSelection(),record=selection[selection.length-1],index=me.views[0].indexOf(record)+1;return index===store.getCount()||0===index?success=!1:(me.doSelect(index,keepExisting,suppressEvent),success=!0),success},selectPrevious:function(keepExisting,suppressEvent){var success,me=this,selection=me.getSelection(),record=selection[0],index=me.views[0].indexOf(record)-1;return index<0?success=!1:(me.doSelect(index,keepExisting,suppressEvent),success=!0),success},isRowSelected:function(record){return this.isSelected(record)},isCellSelected:function(view,record,columnHeader){return this.isSelected(record)}});Ext.define("Ext.selection.TreeModel",{extend:"Ext.selection.RowModel",alias:"selection.treemodel",constructor:function(config){this.callParent(arguments),this.pruneRemoved&&(this.pruneRemoved=!1,this.pruneRemovedNodes=!0)},bindStore:function(store,initial){var me=this;me.callParent(arguments),me.pruneRemovedNodes&&me.view.mon(me.treeStore,{remove:me.onNodeRemove,scope:me})},onNodeRemove:function(parent,node,isMove){isMove||this.deselectDeletedRecords([node])},onKeyRight:function(e,t){this.navExpand(e,t)},navExpand:function(e,t){var focused=this.getLastFocused(),view=this.view;focused&&(focused.isExpanded()?this.onKeyDown(e,t):focused.isExpandable()&&(view.isTreeView||(view=view.lockingPartner),view.expand(focused)))},onKeyLeft:function(e,t){this.navCollapse(e,t)},navCollapse:function(e,t){var parentNode,me=this,focused=this.getLastFocused(),view=this.view;focused&&(parentNode=focused.parentNode,focused.isExpanded()?(view.isTreeView||(view=view.lockingPartner),view.collapse(focused)):parentNode&&!parentNode.isRoot()&&(e.shiftKey?(me.selectRange(parentNode,focused,e.ctrlKey,"up"),me.setLastFocused(parentNode)):e.ctrlKey?me.setLastFocused(parentNode):me.select(parentNode)))},onKeySpace:function(e,t){null!=e.record.data.checked?this.toggleCheck(e):this.callParent(arguments)},onKeyEnter:function(e,t){null!=e.record.data.checked?this.toggleCheck(e):this.callParent(arguments)},toggleCheck:function(e){var view=this.view,selected=this.getLastSelected();e.stopEvent(),selected&&(view.isTreeView||(view=view.lockingPartner),view.onCheckChange(selected))}});Ext.define("Ext.slider.Thumb",{requires:["Ext.dd.DragTracker","Ext.util.Format"],topZIndex:1e4,constructor:function(config){var me=this;Ext.apply(me,config||{},{cls:Ext.baseCSSPrefix+"slider-thumb",constrain:!1}),me.callParent([config])},render:function(){var me=this;me.el=me.slider.innerEl.insertFirst(me.getElConfig()),me.onRender()},onRender:function(){this.disabled&&this.disable(),this.initEvents()},getElConfig:function(){var me=this,slider=me.slider,style={};return style[slider.vertical?"bottom":slider.horizontalProp]=slider.calculateThumbPosition(slider.normalizeValue(me.value))+"%",{style:style,id:this.id,cls:this.cls,role:"presentation"}},move:function(v,animate){var to,from,me=this,el=me.el,slider=me.slider,styleProp=slider.vertical?"bottom":slider.horizontalProp;v+="%",animate?(to={},to[styleProp]=v,Ext.supports.GetPositionPercentage||(from={},from[styleProp]=el.dom.style[styleProp]),new Ext.fx.Anim({target:el,duration:350,from:from,to:to})):el.dom.style[styleProp]=v},bringToFront:function(){this.el.setStyle("zIndex",this.topZIndex)},sendToBack:function(){this.el.setStyle("zIndex","")},enable:function(){var me=this;me.disabled=!1,me.el&&me.el.removeCls(me.slider.disabledCls)},disable:function(){var me=this;me.disabled=!0,me.el&&me.el.addCls(me.slider.disabledCls)},initEvents:function(){var me=this,el=me.el;me.tracker=new Ext.dd.DragTracker({onBeforeStart:Ext.Function.bind(me.onBeforeDragStart,me),onStart:Ext.Function.bind(me.onDragStart,me),onDrag:Ext.Function.bind(me.onDrag,me),onEnd:Ext.Function.bind(me.onDragEnd,me),tolerance:3,autoStart:300,overCls:Ext.baseCSSPrefix+"slider-thumb-over"}),me.tracker.initEl(el)},onBeforeDragStart:function(e){return!this.disabled&&(this.slider.promoteThumb(this),!0)},onDragStart:function(e){var me=this,slider=me.slider;slider.onDragStart(me,e),me.el.addCls(Ext.baseCSSPrefix+"slider-thumb-drag"),me.dragging=me.slider.dragging=!0,me.dragStartValue=me.value,slider.fireEvent("dragstart",slider,e,me)},onDrag:function(e){var above,below,me=this,slider=me.slider,index=me.index,newValue=me.getValueFromTracker();void 0!==newValue&&(me.constrain&&(above=slider.thumbs[index+1],below=slider.thumbs[index-1],void 0!==below&&newValue<=below.value&&(newValue=below.value),void 0!==above&&newValue>=above.value&&(newValue=above.value)),slider.setValue(index,newValue,!1),slider.fireEvent("drag",slider,e,me))},getValueFromTracker:function(){var slider=this.slider,trackPoint=slider.getTrackpoint(this.tracker.getXY());if(void 0!==trackPoint)return slider.reversePixelValue(trackPoint)},onDragEnd:function(e){var me=this,slider=me.slider,value=me.value;slider.onDragEnd(me,e),me.el.removeCls(Ext.baseCSSPrefix+"slider-thumb-drag"),me.dragging=slider.dragging=!1,slider.fireEvent("dragend",slider,e),me.dragStartValue!=value&&slider.fireEvent("changecomplete",slider,value,me)},destroy:function(){Ext.destroy(this.tracker)}});Ext.define("Ext.slider.Tip",{extend:"Ext.tip.Tip",minWidth:10,alias:"widget.slidertip",offsets:null,align:null,position:"",defaultVerticalPosition:"left",defaultHorizontalPosition:"top",isSliderTip:!0,init:function(slider){var align,offsets,me=this;switch(me.position||(me.position=slider.vertical?me.defaultVerticalPosition:me.defaultHorizontalPosition),me.position){case"top":offsets=[0,-10],align="b-t?";break;case"bottom":offsets=[0,10],align="t-b?";break;case"left":offsets=[-10,0],align="r-l?";break;case"right":offsets=[10,0],align="l-r?"}me.align||(me.align=align),me.offsets||(me.offsets=offsets),slider.on({scope:me,dragstart:me.onSlide,drag:me.onSlide,dragend:me.hide,destroy:me.destroy})},onSlide:function(slider,e,thumb){var me=this;me.show(),me.update(me.getText(thumb)),me.el.alignTo(thumb.el,me.align,me.offsets)},getText:function(thumb){return String(thumb.value)}});Ext.define("Ext.slider.Multi",{extend:"Ext.form.field.Base",alias:"widget.multislider",alternateClassName:"Ext.slider.MultiSlider",requires:["Ext.slider.Thumb","Ext.slider.Tip","Ext.Number","Ext.util.Format","Ext.Template","Ext.layout.component.field.Slider"],childEls:["endEl","innerEl"],fieldSubTpl:['<div id="{id}" role="{role}" {inputAttrTpl} class="'+Ext.baseCSSPrefix+"slider {fieldCls} {vertical}",'{childElCls}"','<tpl if="tabIdx != null"> tabIndex="{tabIdx}"</tpl>','<tpl if="isVertical"> aria-orientation="vertical"<tpl else> aria-orientation="horizontal"</tpl>',">",'<div id="{cmpId}-endEl" class="'+Ext.baseCSSPrefix+'slider-end" role="presentation">','<div id="{cmpId}-innerEl" class="'+Ext.baseCSSPrefix+'slider-inner" role="presentation">',"{%this.renderThumbs(out, values)%}","</div>","</div>","</div>",{renderThumbs:function(out,values){for(var thumb,thumbConfig,me=values.$comp,i=0,thumbs=me.thumbs,len=thumbs.length;i<len;i++)thumb=thumbs[i],thumbConfig=thumb.getElConfig(),thumbConfig.id=me.id+"-thumb-"+i,Ext.DomHelper.generateMarkup(thumbConfig,out)},disableFormats:!0}],horizontalProp:"left",vertical:!1,minValue:0,maxValue:100,decimalPrecision:0,keyIncrement:1,increment:0,clickRange:[5,15],clickToChange:!0,animate:!0,dragging:!1,constrainThumbs:!0,componentLayout:"sliderfield",useTips:!0,tipText:null,ariaRole:"slider",initValue:function(){var me=this,extValue=Ext.value,values=extValue(me.values,[extValue(me.value,extValue(me.minValue,0))]),i=0,len=values.length;for(me.originalValue=values;i<len;i++)me.addThumb(values[i])},initComponent:function(){var tipPlug,hasTip,p,pLen,plugins,me=this;if(me.thumbs=[],me.keyIncrement=Math.max(me.increment,me.keyIncrement),me.addEvents("beforechange","change","changecomplete","dragstart","drag","dragend"),me.callParent(),me.useTips){for(tipPlug=Ext.isObject(me.useTips)?Ext.apply({},me.useTips):me.tipText?{getText:me.tipText}:{},plugins=me.plugins=me.plugins||[],pLen=plugins.length,p=0;p<pLen;p++)if(plugins[p].isSliderTip){hasTip=!0;break}hasTip||me.plugins.push(new Ext.slider.Tip(tipPlug))}},addThumb:function(value){var me=this,thumb=new Ext.slider.Thumb({ownerCt:me,ownerLayout:me.getComponentLayout(),value:value,slider:me,index:me.thumbs.length,constrain:me.constrainThumbs,disabled:!!me.readOnly});return me.thumbs.push(thumb),me.rendered&&thumb.render(),thumb},promoteThumb:function(topThumb){var thumb,i,thumbs=this.thumbs,ln=thumbs.length;for(i=0;i<ln;i++)thumb=thumbs[i],thumb==topThumb?thumb.bringToFront():thumb.sendToBack()},getSubTplData:function(){var me=this;return Ext.apply(me.callParent(),{$comp:me,isVertical:me.vertical,vertical:me.vertical?Ext.baseCSSPrefix+"slider-vert":Ext.baseCSSPrefix+"slider-horz",minValue:me.minValue,maxValue:me.maxValue,value:me.value,tabIdx:me.tabIndex,childElCls:""})},onRender:function(){var thumb,me=this,thumbs=me.thumbs,len=thumbs.length,i=0;for(me.callParent(arguments),i=0;i<len;i++)thumb=thumbs[i],thumb.el=me.el.getById(me.id+"-thumb-"+i),thumb.onRender()},initEvents:function(){var me=this;me.mon(me.el,{scope:me,mousedown:me.onMouseDown,keydown:me.onKeyDown})},onDragStart:Ext.emptyFn,onDragEnd:Ext.emptyFn,getTrackpoint:function(xy){var trackLength,result,positionProperty,me=this,vertical=me.vertical,sliderTrack=me.innerEl;return vertical?(positionProperty="top",trackLength=sliderTrack.getHeight()):(positionProperty=me.horizontalProp,trackLength=sliderTrack.getWidth()),xy=me.transformTrackPoints(sliderTrack.translatePoints(xy)),result=Ext.Number.constrain(xy[positionProperty],0,trackLength),vertical?trackLength-result:result},transformTrackPoints:Ext.identityFn,onMouseDown:function(e){var trackPoint,me=this,thumbClicked=!1,i=0,thumbs=me.thumbs,len=thumbs.length;if(!me.disabled){for(;i<len;i++)thumbClicked=thumbClicked||e.target==thumbs[i].el.dom;me.clickToChange&&!thumbClicked&&void 0!==(trackPoint=me.getTrackpoint(e.getXY()))&&me.onClickChange(trackPoint),me.focus()}},onClickChange:function(trackPoint){var thumb,index,me=this;thumb=me.getNearest(trackPoint),thumb.disabled||(index=thumb.index,me.setValue(index,Ext.util.Format.round(me.reversePixelValue(trackPoint),me.decimalPrecision),void 0,!0))},getNearest:function(trackPoint){for(var thumb,value,dist,me=this,clickValue=me.reversePixelValue(trackPoint),nearestDistance=me.getRange()+5,nearest=null,thumbs=me.thumbs,i=0,len=thumbs.length;i<len;i++)thumb=me.thumbs[i],value=thumb.value,dist=Math.abs(value-clickValue),Math.abs(dist<=nearestDistance)&&(nearest=thumb,nearestDistance=dist);return nearest},onKeyDown:function(e){var val,me=this;if(me.disabled||1!==me.thumbs.length)return void e.preventDefault();switch(e.getKey()){case e.UP:case e.RIGHT:e.stopEvent(),val=e.ctrlKey?me.maxValue:me.getValue(0)+me.keyIncrement,me.setValue(0,val,void 0,!0);break;case e.DOWN:case e.LEFT:e.stopEvent(),val=e.ctrlKey?me.minValue:me.getValue(0)-me.keyIncrement,me.setValue(0,val,void 0,!0);break;default:e.preventDefault()}},normalizeValue:function(v){var me=this,snapFn=me.zeroBasedSnapping?"snap":"snapInRange";return v=Ext.Number[snapFn](v,me.increment,me.minValue,me.maxValue),v=Ext.util.Format.round(v,me.decimalPrecision),v=Ext.Number.constrain(v,me.minValue,me.maxValue)},setMinValue:function(val){var thumb,i,me=this,thumbs=me.thumbs,len=thumbs.length;for(me.minValue=val,i=0;i<len;++i)thumb=thumbs[i],thumb.value<val&&me.setValue(i,val,!1);me.syncThumbs()},setMaxValue:function(val){var thumb,i,me=this,thumbs=me.thumbs,len=thumbs.length;for(me.maxValue=val,i=0;i<len;++i)thumb=thumbs[i],thumb.value>val&&me.setValue(i,val,!1);me.syncThumbs()},setValue:function(index,value,animate,changeComplete){var thumb,len,i,values,me=this,thumbs=me.thumbs;if(Ext.isArray(index)){for(values=index,animate=value,i=0,len=values.length;i<len;++i)(thumb=thumbs[i])&&me.setValue(i,values[i],animate);return me}return thumb=me.thumbs[index],value=me.normalizeValue(value),value!==thumb.value&&!1!==me.fireEvent("beforechange",me,value,thumb.value,thumb)&&(thumb.value=value,me.rendered&&(thumb.move(me.calculateThumbPosition(value),Ext.isDefined(animate)?!1!==animate:me.animate),me.fireEvent("change",me,value,thumb),me.checkDirty(),changeComplete&&me.fireEvent("changecomplete",me,value,thumb))),me},calculateThumbPosition:function(v){var me=this,minValue=me.minValue,pos=(v-minValue)/me.getRange()*100;return isNaN(pos)&&(pos=minValue),pos},getRatio:function(){var me=this,innerEl=me.innerEl,trackLength=me.vertical?innerEl.getHeight():innerEl.getWidth(),valueRange=me.getRange();return 0===valueRange?trackLength:trackLength/valueRange},getRange:function(){return this.maxValue-this.minValue},reversePixelValue:function(pos){return this.minValue+pos/this.getRatio()},reversePercentageValue:function(pos){return this.minValue+this.getRange()*(pos/100)},onDisable:function(){var thumb,el,xy,me=this,i=0,thumbs=me.thumbs,len=thumbs.length;for(me.callParent();i<len;i++)thumb=thumbs[i],el=thumb.el,thumb.disable(),Ext.isIE&&(xy=el.getXY(),el.hide(),me.innerEl.addCls(me.disabledCls).dom.disabled=!0,me.thumbHolder||(me.thumbHolder=me.endEl.createChild({role:"presentation",cls:Ext.baseCSSPrefix+"slider-thumb "+me.disabledCls})),me.thumbHolder.show().setXY(xy))},onEnable:function(){var thumb,el,me=this,i=0,thumbs=me.thumbs,len=thumbs.length;for(this.callParent();i<len;i++)thumb=thumbs[i],el=thumb.el,thumb.enable(),Ext.isIE&&(me.innerEl.removeCls(me.disabledCls).dom.disabled=!1,me.thumbHolder&&me.thumbHolder.hide(),el.show(),me.syncThumbs())},syncThumbs:function(){if(this.rendered)for(var thumbs=this.thumbs,length=thumbs.length,i=0;i<length;i++)thumbs[i].move(this.calculateThumbPosition(thumbs[i].value))},getValue:function(index){return Ext.isNumber(index)?this.thumbs[index].value:this.getValues()},getValues:function(){for(var values=[],i=0,thumbs=this.thumbs,len=thumbs.length;i<len;i++)values.push(thumbs[i].value);return values},getSubmitValue:function(){var me=this;return me.disabled||!me.submitValue?null:me.getValue()},reset:function(){for(var val,me=this,arr=[].concat(me.originalValue),a=0,aLen=arr.length;a<aLen;a++)val=arr[a],me.setValue(a,val);me.clearInvalid(),delete me.wasValid},setReadOnly:function(readOnly){var me=this,thumbs=me.thumbs,len=thumbs.length,i=0;for(me.callParent(arguments),readOnly=me.readOnly;i<len;++i)readOnly?thumbs[i].disable():thumbs[i].enable()},beforeDestroy:function(){var thumb,me=this,thumbs=me.thumbs,t=0,tLen=thumbs.length;for(Ext.destroy(me.innerEl,me.endEl,me.focusEl);t<tLen;t++)thumb=thumbs[t],Ext.destroy(thumb);me.callParent()}});Ext.define("Ext.tab.Tab",{extend:"Ext.button.Button",alias:"widget.tab",requires:["Ext.util.KeyNav"],isTab:!0,baseCls:Ext.baseCSSPrefix+"tab",closeElOverCls:Ext.baseCSSPrefix+"tab-close-btn-over",activeCls:"active",closableCls:"closable",closable:!0,closeText:"Close Tab",active:!1,childEls:["closeEl"],scale:!1,position:"top",ariaRole:"tab",initComponent:function(){var me=this;me.addEvents("activate","deactivate","beforeclose","close"),me.callParent(arguments),me.card&&me.setCard(me.card),me.overCls=["over",me.position+"-over"]},getTemplateArgs:function(){var me=this,result=me.callParent();return result.closable=me.closable,result.closeText=me.closeText,result},getFramingInfoCls:function(){return this.baseCls+"-"+this.ui+"-"+this.position},beforeRender:function(){var me=this,tabBar=me.up("tabbar"),tabPanel=me.up("tabpanel");me.callParent(),me.addClsWithUI(me.position),me.active&&me.addClsWithUI([me.activeCls,me.position+"-"+me.activeCls]),me.syncClosableUI(),me.minWidth||(me.minWidth=tabBar?tabBar.minTabWidth:me.minWidth,!me.minWidth&&tabPanel&&(me.minWidth=tabPanel.minTabWidth),me.minWidth&&me.iconCls&&(me.minWidth+=25)),me.maxWidth||(me.maxWidth=tabBar?tabBar.maxTabWidth:me.maxWidth,!me.maxWidth&&tabPanel&&(me.maxWidth=tabPanel.maxTabWidth))},onRender:function(){var me=this;me.setElOrientation(),me.callParent(arguments),me.closable&&me.closeEl.addClsOnOver(me.closeElOverCls),me.initKeyNav()},initKeyNav:function(){var me=this;me.keyNav=new Ext.util.KeyNav(me.el,{enter:me.onEnterKey,del:me.onDeleteKey,scope:me})},setElOrientation:function(){var position=this.position;"left"!==position&&"right"!==position||this.el.setVertical("right"===position?90:270)},enable:function(silent){var me=this;return me.callParent(arguments),me.removeClsWithUI(me.position+"-disabled"),me},disable:function(silent){var me=this;return me.callParent(arguments),me.addClsWithUI(me.position+"-disabled"),me},onDestroy:function(){var me=this;Ext.destroy(me.keyNav),delete me.keyNav,me.callParent(arguments)},setClosable:function(closable){var me=this;closable=!arguments.length||!!closable,me.closable!=closable&&(me.closable=closable,me.card&&(me.card.closable=closable),me.syncClosableUI(),me.rendered&&(me.syncClosableElements(),me.updateLayout()))},syncClosableElements:function(){var me=this,closeEl=me.closeEl;me.closable?(closeEl||(closeEl=me.closeEl=me.btnWrap.insertSibling({tag:"a",role:"presentation",cls:me.baseCls+"-close-btn",href:"#",title:me.closeText},"after")),closeEl.addClsOnOver(me.closeElOverCls)):closeEl&&(closeEl.remove(),delete me.closeEl)},syncClosableUI:function(){var me=this,classes=[me.closableCls,me.closableCls+"-"+me.position];me.closable?me.addClsWithUI(classes):me.removeClsWithUI(classes)},setCard:function(card){var me=this;me.card=card,me.setText(me.title||card.title),me.setIconCls(me.iconCls||card.iconCls),me.setIcon(me.icon||card.icon),me.setGlyph(me.glyph||card.glyph)},onCloseClick:function(){var me=this;if(!1!==me.fireEvent("beforeclose",me))if(me.tabBar){if(!1===me.tabBar.closeTab(me))return}else me.fireClose()},fireClose:function(){this.fireEvent("close",this)},onEnterKey:function(e){var me=this;me.tabBar&&me.tabBar.onClick(e,me.el)},onDeleteKey:function(e){this.closable&&this.onCloseClick()},activate:function(supressEvent){var me=this;me.active=!0,me.addClsWithUI([me.activeCls,me.position+"-"+me.activeCls]),!0!==supressEvent&&me.fireEvent("activate",me)},deactivate:function(supressEvent){var me=this;me.active=!1,me.removeClsWithUI([me.activeCls,me.position+"-"+me.activeCls]),!0!==supressEvent&&me.fireEvent("deactivate",me)}});Ext.define("Ext.util.Point",{extend:"Ext.util.Region",statics:{fromEvent:function(e){return e=e.browserEvent||e,e=e.changedTouches&&e.changedTouches.length>0?e.changedTouches[0]:e,new this(e.pageX,e.pageY)}},constructor:function(x,y){this.callParent([y,x,y,x])},toString:function(){return"Point["+this.x+","+this.y+"]"},equals:function(p){return this.x==p.x&&this.y==p.y},isWithin:function(p,threshold){return Ext.isObject(threshold)||(threshold={x:threshold,y:threshold}),this.x<=p.x+threshold.x&&this.x>=p.x-threshold.x&&this.y<=p.y+threshold.y&&this.y>=p.y-threshold.y},isContainedBy:function(region){return region instanceof Ext.util.Region||(region=Ext.get(region.el||region).getRegion()),region.contains(this)},roundedEquals:function(p){return Math.round(this.x)==Math.round(p.x)&&Math.round(this.y)==Math.round(p.y)}},function(){this.prototype.translate=Ext.util.Region.prototype.translateBy});Ext.define("Ext.tab.Bar",{extend:"Ext.panel.Header",alias:"widget.tabbar",baseCls:Ext.baseCSSPrefix+"tab-bar",requires:["Ext.tab.Tab","Ext.util.Point"],isTabBar:!0,defaultType:"tab",plain:!1,ariaRole:"tablist",childEls:["body","strip"],renderTpl:['<div id="{id}-body" role="presentation" class="{baseCls}-body {bodyCls} {bodyTargetCls}{childElCls}','<tpl if="ui"> {baseCls}-body-{ui}','<tpl for="uiCls"> {parent.baseCls}-body-{parent.ui}-{.}</tpl>','</tpl>"<tpl if="bodyStyle"> style="{bodyStyle}"</tpl>>',"{%this.renderContainer(out,values)%}","</div>",'<div id="{id}-strip" role="presentation" class="{baseCls}-strip {baseCls}-strip-{dock}{childElCls}','<tpl if="ui"> {baseCls}-strip-{ui}','<tpl for="uiCls"> {parent.baseCls}-strip-{parent.ui}-{.}</tpl>','</tpl>">',"</div>"],_reverseDockNames:{left:"right",right:"left"},initComponent:function(){var me=this;me.plain&&me.addCls(me.baseCls+"-plain"),me.addClsWithUI(me.orientation),me.addEvents("change"),me.callParent(arguments),Ext.merge(me.layout,me.initialConfig.layout),me.layout.align="vertical"==me.orientation?"left":"top",me.layout.overflowHandler=new Ext.layout.container.boxOverflow.Scroller(me.layout),me.remove(me.titleCmp),delete me.titleCmp,Ext.apply(me.renderData,{bodyCls:me.bodyCls,dock:me.dock})},onRender:function(){var me=this;me.callParent(),"vertical"===me.orientation&&(Ext.isIE8||Ext.isIE9)&&Ext.isStrict&&me.el.on({mousemove:me.onMouseMove,scope:me})},afterRender:function(){var layout=this.layout;this.callParent(),Ext.isIE9&&Ext.isStrict&&"vertical"===this.orientation&&layout.innerCt.on("scroll",function(){layout.innerCt.dom.scrollLeft=0})},afterLayout:function(){this.adjustTabPositions(),this.callParent(arguments)},adjustTabPositions:function(){var tab,items=this.items.items,i=items.length;if(!Ext.isIE9m)if("right"===this.dock)for(;i--;)tab=items[i],tab.isVisible()&&tab.el.setStyle("left",tab.lastBox.width+"px");else if("left"===this.dock)for(;i--;)tab=items[i],tab.isVisible()&&tab.el.setStyle("left",-tab.lastBox.height+"px")},getLayout:function(){var me=this;return me.layout.type="horizontal"===me.orientation?"hbox":"vbox",me.callParent(arguments)},onAdd:function(tab){tab.position=this.dock,this.callParent(arguments)},onRemove:function(tab){var me=this;tab===me.previousTab&&(me.previousTab=null),me.callParent(arguments)},afterComponentLayout:function(width){var me=this,needsScroll=me.needsScroll;me.callParent(arguments),needsScroll&&me.layout.overflowHandler.scrollToItem(me.activeTab),delete me.needsScroll},onClick:function(e,target){var tabEl,tab,isCloseClick,tabInfo,me=this,tabPanel=me.tabPanel;e.getTarget("."+Ext.baseCSSPrefix+"box-scroller")||("vertical"===me.orientation&&(Ext.isIE8||Ext.isIE9)&&Ext.isStrict?(tabInfo=me.getTabInfoFromPoint(e.getXY()),tab=tabInfo.tab,isCloseClick=tabInfo.close):(tabEl=e.getTarget("."+Ext.tab.Tab.prototype.baseCls),tab=tabEl&&Ext.getCmp(tabEl.id),isCloseClick=tab&&tab.closeEl&&target===tab.closeEl.dom),isCloseClick&&e.preventDefault(),tab&&tab.isDisabled&&!tab.isDisabled()&&(tab.closable&&isCloseClick?tab.onCloseClick():(tabPanel?tabPanel.setActiveTab(tab.card):me.setActiveTab(tab),tab.focus())))},onMouseMove:function(e){var tabInfo,tab,me=this,overTab=me._overTab;e.getTarget("."+Ext.baseCSSPrefix+"box-scroller")||(tabInfo=me.getTabInfoFromPoint(e.getXY()),(tab=tabInfo.tab)!==overTab&&(overTab&&overTab.rendered&&(overTab.onMouseLeave(e),me._overTab=null),tab?(tab.onMouseEnter(e),me._overTab=tab,tab.disabled||me.el.setStyle("cursor","pointer")):me.el.setStyle("cursor","default")))},onMouseLeave:function(e){var overTab=this._overTab;overTab&&overTab.rendered&&overTab.onMouseLeave(e)},getTabInfoFromPoint:function(xy){for(var lastBox,tabRegion,closeEl,close,closeXY,closeX,closeY,closeWidth,closeHeight,tabX,tabY,tabWidth,tabHeight,closeRegion,isTabReversed,direction,tab,me=this,tabs=me.items.items,length=tabs.length,innerCt=me.layout.innerCt,innerCtXY=innerCt.getXY(),point=new Ext.util.Point(xy[0],xy[1]),i=0;i<length;i++)if(lastBox=tabs[i].lastBox,tabX=innerCtXY[0]+lastBox.x,tabY=innerCtXY[1]-innerCt.dom.scrollTop+lastBox.y,tabWidth=lastBox.width,tabHeight=lastBox.height,tabRegion=new Ext.util.Region(tabY,tabX+tabWidth,tabY+tabHeight,tabX),tabRegion.contains(point)){tab=tabs[i],closeEl=tab.closeEl,closeEl&&(void 0===me._isTabReversed&&(me._isTabReversed=isTabReversed=-1!==tab.btnWrap.dom.currentStyle.filter.indexOf("rotation=2")),direction=isTabReversed?this._reverseDockNames[me.dock]:me.dock,closeWidth=closeEl.getWidth(),closeHeight=closeEl.getHeight(),closeXY=me.getCloseXY(closeEl,tabX,tabY,tabWidth,tabHeight,closeWidth,closeHeight,direction),closeX=closeXY[0],closeY=closeXY[1],closeRegion=new Ext.util.Region(closeY,closeX+closeWidth,closeY+closeHeight,closeX),close=closeRegion.contains(point));break}return{tab:tab,close:close}},getCloseXY:function(closeEl,tabX,tabY,tabWidth,tabHeight,closeWidth,closeHeight,direction){var closeX,closeY,closeXY=closeEl.getXY();return"right"===direction?(closeX=tabX+tabWidth-(closeXY[1]-tabY+closeHeight),closeY=tabY+(closeXY[0]-tabX)):(closeX=tabX+(closeXY[1]-tabY),closeY=tabY+tabX+tabHeight-closeXY[0]-closeWidth),[closeX,closeY]},closeTab:function(toClose){var toActivate,me=this,card=toClose.card,tabPanel=me.tabPanel;if(card&&!1===card.fireEvent("beforeclose",card))return!1;if(toActivate=me.findNextActivatable(toClose),Ext.suspendLayouts(),tabPanel&&card){if(delete toClose.ownerCt,card.fireEvent("close",card),tabPanel.remove(card),tabPanel.getComponent(card))return toClose.ownerCt=me,Ext.resumeLayouts(!0),!1;toClose.fireClose(),me.remove(toClose)}toActivate&&(tabPanel?tabPanel.setActiveTab(toActivate.card):me.setActiveTab(toActivate),toActivate.focus()),Ext.resumeLayouts(!0)},findNextActivatable:function(toClose){var me=this;if(toClose.active&&me.items.getCount()>1)return me.previousTab&&me.previousTab!==toClose&&!me.previousTab.disabled?me.previousTab:toClose.next("tab[disabled=false]")||toClose.prev("tab[disabled=false]")},setActiveTab:function(tab,initial){var me=this;tab.disabled||tab===me.activeTab||(me.activeTab&&(me.activeTab.isDestroyed?me.previousTab=null:(me.previousTab=me.activeTab,me.activeTab.deactivate())),tab.activate(),me.activeTab=tab,me.needsScroll=!0,initial||(me.fireEvent("change",me,tab,tab.card),me.updateLayout()))}});Ext.define("Ext.tree.Column",{extend:"Ext.grid.column.Column",alias:"widget.treecolumn",tdCls:Ext.baseCSSPrefix+"grid-cell-treecolumn",autoLock:!0,lockable:!1,draggable:!1,hideable:!1,iconCls:Ext.baseCSSPrefix+"tree-icon",checkboxCls:Ext.baseCSSPrefix+"tree-checkbox",elbowCls:Ext.baseCSSPrefix+"tree-elbow",expanderCls:Ext.baseCSSPrefix+"tree-expander",textCls:Ext.baseCSSPrefix+"tree-node-text",innerCls:Ext.baseCSSPrefix+"grid-cell-inner-treecolumn",isTreeColumn:!0,cellTpl:['<tpl for="lines">','<img src="{parent.blankUrl}" class="{parent.childCls} {parent.elbowCls}-img ','{parent.elbowCls}-<tpl if=".">line<tpl else>empty</tpl>" role="presentation"/>',"</tpl>",'<img src="{blankUrl}" class="{childCls} {elbowCls}-img {elbowCls}','<tpl if="isLast">-end</tpl><tpl if="expandable">-plus {expanderCls}</tpl>" role="presentation"/>','<tpl if="checked !== null">','<input type="button" {ariaCellCheckboxAttr}',' class="{childCls} {checkboxCls}<tpl if="checked"> {checkboxCls}-checked</tpl>"/>',"</tpl>",'<img src="{blankUrl}" role="presentation" class="{childCls} {baseIconCls} ','{baseIconCls}-<tpl if="leaf">leaf<tpl else>parent</tpl> {iconCls}"','<tpl if="icon">style="background-image:url({icon})"</tpl>/>','<tpl if="href">','<a href="{href}" role="link" target="{hrefTarget}" class="{textCls} {childCls}">{value}</a>',"<tpl else>",'<span class="{textCls} {childCls}">{value}</span>',"</tpl>"],initComponent:function(){var me=this,renderer=me.renderer;"string"==typeof renderer&&(renderer=Ext.util.Format[renderer]),me.origRenderer=renderer,me.origScope=me.scope||window,me.renderer=me.treeRenderer,me.scope=me,me.callParent()},treeRenderer:function(value,metaData,record,rowIdx,colIdx,store,view){var rendererData,me=this,cls=record.get("cls");return cls&&(metaData.tdCls+=" "+cls),rendererData=me.initTemplateRendererData(value,metaData,record,rowIdx,colIdx,store,view),me.getTpl("cellTpl").apply(rendererData)},initTemplateRendererData:function(value,metaData,record,rowIdx,colIdx,store,view){for(var parentData,me=this,renderer=me.origRenderer,data=record.data,parent=record.parentNode,rootVisible=view.rootVisible,lines=[];parent&&(rootVisible||parent.data.depth>0);)parentData=parent.data,lines[rootVisible?parentData.depth:parentData.depth-1]=parentData.isLast?0:1,parent=parent.parentNode;return{record:record,baseIconCls:me.iconCls,iconCls:data.iconCls,icon:data.icon,checkboxCls:me.checkboxCls,checked:data.checked,elbowCls:me.elbowCls,expanderCls:me.expanderCls,textCls:me.textCls,leaf:data.leaf,expandable:record.isExpandable(),isLast:data.isLast,blankUrl:Ext.BLANK_IMAGE_URL,href:data.href,hrefTarget:data.hrefTarget,lines:lines,metaData:metaData,childCls:me.getChildCls?me.getChildCls()+" ":"",value:renderer?renderer.apply(me.origScope,arguments):value}}});Ext.define("Ext.selection.CheckboxModel",{alias:"selection.checkboxmodel",extend:"Ext.selection.RowModel",mode:"MULTI",injectCheckbox:0,checkOnly:!1,showHeaderCheckbox:void 0,checkSelector:"."+Ext.baseCSSPrefix+"grid-row-checker",headerWidth:24,checkerOnCls:Ext.baseCSSPrefix+"grid-hd-checker-on",constructor:function(){var me=this;me.callParent(arguments),"SINGLE"===me.mode&&!0!==me.showHeaderCheckbox&&(me.showHeaderCheckbox=!1)},beforeViewRender:function(view){var owner,me=this;me.callParent(arguments),me.hasLockedHeader()&&!view.headerCt.lockedCt||(!1!==me.showHeaderCheckbox&&view.headerCt.on("headerclick",me.onHeaderClick,me),me.addCheckbox(view,!0),owner=view.ownerCt,view.headerCt.lockedCt&&(owner=owner.ownerCt),me.mon(owner,"reconfigure",me.onReconfigure,me))},bindComponent:function(view){var me=this;me.sortable=!1,me.callParent(arguments)},hasLockedHeader:function(){var v,views=this.views,vLen=views.length;for(v=0;v<vLen;v++)if(views[v].headerCt.lockedCt)return!0;return!1},addCheckbox:function(view,initial){var me=this,checkbox=me.injectCheckbox,headerCt=view.headerCt;!1!==checkbox&&("first"==checkbox?checkbox=0:"last"==checkbox&&(checkbox=headerCt.getColumnCount()),Ext.suspendLayouts(),view.getStore().buffered&&(me.showHeaderCheckbox=!1),headerCt.add(checkbox,me.getHeaderConfig()),Ext.resumeLayouts()),!0!==initial&&view.refresh()},onReconfigure:function(grid,store,columns){columns&&this.addCheckbox(this.views[0])},toggleUiHeader:function(isChecked){var view=this.views[0],headerCt=view.headerCt,checkHd=headerCt.child("gridcolumn[isCheckerHd]"),cls=this.checkerOnCls;checkHd&&(isChecked?checkHd.addCls(cls):checkHd.removeCls(cls))},onHeaderClick:function(headerCt,header,e){if(header.isCheckerHd){e.stopEvent();var me=this,isChecked=header.el.hasCls(Ext.baseCSSPrefix+"grid-hd-checker-on");me.preventFocus=!0,isChecked?me.deselectAll():me.selectAll(),delete me.preventFocus}},getHeaderConfig:function(){var me=this,showCheck=!1!==me.showHeaderCheckbox;return{isCheckerHd:showCheck,text:"&#160;",clickTargetName:"el",width:me.headerWidth,sortable:!1,draggable:!1,resizable:!1,hideable:!1,menuDisabled:!0,dataIndex:"",cls:showCheck?Ext.baseCSSPrefix+"column-header-checkbox ":"",renderer:Ext.Function.bind(me.renderer,me),editRenderer:me.editRenderer||me.renderEmpty,locked:me.hasLockedHeader()}},renderEmpty:function(){return"&#160;"},refresh:function(){this.callParent(arguments),this.updateHeaderState()},renderer:function(value,metaData,record,rowIndex,colIndex,store,view){var baseCSSPrefix=Ext.baseCSSPrefix;return metaData.tdCls=baseCSSPrefix+"grid-cell-special "+baseCSSPrefix+"grid-cell-row-checker",'<div class="'+baseCSSPrefix+'grid-row-checker" role="presentation">&#160;</div>'},processSelection:function(view,record,item,index,e){var mode,me=this,checker=e.getTarget(me.checkSelector);me.checkOnly&&!checker||(checker?(mode=me.getSelectionMode(),"SINGLE"!==mode&&me.setSelectionMode("SIMPLE"),me.selectWithEvent(record,e),me.setSelectionMode(mode)):me.selectWithEvent(record,e))},onSelectChange:function(){this.callParent(arguments),this.suspendChange||this.updateHeaderState()},onStoreLoad:function(){this.callParent(arguments),this.updateHeaderState()},onStoreAdd:function(){this.callParent(arguments),this.updateHeaderState()},onStoreRemove:function(){this.callParent(arguments),this.updateHeaderState()},onStoreRefresh:function(){this.callParent(arguments),this.updateHeaderState()},maybeFireSelectionChange:function(fireEvent){fireEvent&&!this.suspendChange&&this.updateHeaderState(),this.callParent(arguments)},resumeChanges:function(){this.callParent(),this.suspendChange||this.updateHeaderState()},updateHeaderState:function(){var selected,len,i,me=this,store=me.store,storeCount=store.getCount(),views=me.views,hdSelectStatus=!1,selectedCount=0;if(!store.buffered&&storeCount>0){for(selected=me.selected,hdSelectStatus=!0,i=0,len=selected.getCount();i<len&&me.storeHasSelected(selected.getAt(i));++i)++selectedCount;hdSelectStatus=storeCount===selectedCount}views&&views.length&&me.toggleUiHeader(hdSelectStatus)}});Ext.define("Ext.slider.Single",{extend:"Ext.slider.Multi",alias:["widget.slider","widget.sliderfield"],alternateClassName:["Ext.Slider","Ext.form.SliderField","Ext.slider.SingleSlider","Ext.slider.Slider"],getValue:function(){return this.callParent([0])},setValue:function(value,animate){var args=arguments,len=args.length;return(1==len||len<=3&&"number"!=typeof args[1])&&(args=Ext.toArray(args),args.unshift(0)),this.callParent(args)},getNearest:function(){return this.thumbs[0]}});Ext.define("Ext.state.CookieProvider",{extend:"Ext.state.Provider",constructor:function(config){var me=this;me.path="/",me.expires=new Date(Ext.Date.now()+6048e5),me.domain=null,me.secure=!1,me.callParent(arguments),me.state=me.readCookies()},set:function(name,value){var me=this;if(void 0===value||null===value)return void me.clear(name);me.setCookie(name,value),me.callParent(arguments)},clear:function(name){this.clearCookie(name),this.callParent(arguments)},readCookies:function(){for(var matches,name,value,cookies={},c=document.cookie+";",re=/\s?(.*?)=(.*?);/g,prefix=this.prefix,len=prefix.length;null!=(matches=re.exec(c));)name=matches[1],value=matches[2],name&&name.substring(0,len)==prefix&&(cookies[name.substr(len)]=this.decodeValue(value));return cookies},setCookie:function(name,value){var me=this;document.cookie=me.prefix+name+"="+me.encodeValue(value)+(null==me.expires?"":"; expires="+me.expires.toGMTString())+(null==me.path?"":"; path="+me.path)+(null==me.domain?"":"; domain="+me.domain)+(1==me.secure?"; secure":"")},clearCookie:function(name){var me=this;document.cookie=me.prefix+name+"=null; expires=Thu, 01-Jan-70 00:00:01 GMT"+(null==me.path?"":"; path="+me.path)+(null==me.domain?"":"; domain="+me.domain)+(1==me.secure?"; secure":"")}});Ext.define("Ext.util.LocalStorage",{id:null,destroyed:!1,lazyKeys:!0,prefix:"",session:!1,_keys:null,_store:null,_users:0,statics:{cache:{},get:function(id){var instance,me=this,cache=me.cache,config={_users:1};return Ext.isString(id)?config.id=id:Ext.apply(config,id),(instance=cache[config.id])?(!0===instance&&Ext.Error.raise('Creating a shared instance of private local store "'+me.id+'".'),++instance._users):instance=new me(config),instance},supported:!0},constructor:function(config){var me=this;Ext.apply(me,config),me.hasOwnProperty("id")||Ext.Error.raise("No id was provided to the local store."),me._users?Ext.util.LocalStorage.cache[me.id]=me:(Ext.util.LocalStorage.cache[me.id]&&Ext.Error.raise('Cannot create duplicate instance of local store "'+me.id+'". Use Ext.util.LocalStorage.get() to share instances.'),Ext.util.LocalStorage.cache[me.id]=!0),me.init()},init:function(){var me=this,id=me.id;!me.prefix&&id&&(me.prefix=id+"-"),me._store=me.session?window.sessionStorage:window.localStorage},destroy:function(){var me=this;me._users&&Ext.log.warn("LocalStorage(id="+me.id+") destroyed while in use"),delete Ext.util.LocalStorage.cache[me.id],me._store=me._keys=null,me.destroyed=!0,me.destroy=Ext.emptyFn},getKeys:function(){var i,key,me=this,store=me._store,prefix=me.prefix,keys=me._keys,n=prefix.length;if(!keys)for(me._keys=keys=[],i=store.length;i--;)key=store.key(i),key.length>n&&prefix===key.substring(0,n)&&keys.push(key.substring(n));return keys},release:function(){--this._users||this.destroy()},save:Ext.emptyFn,clear:function(){var i,me=this,store=me._store,prefix=me.prefix,keys=me._keys||me.getKeys();for(i=keys.length;i--;)store.removeItem(prefix+keys[i]);keys.length=0},key:function(index){var keys=this._keys||this.getKeys();return 0<=index&&index<keys.length?keys[index]:null},getItem:function(key){var k=this.prefix+key;return this._store.getItem(k)},removeItem:function(key){var me=this,k=me.prefix+key,store=me._store,keys=me._keys,length=store.length;store.removeItem(k),keys&&length!==store.length&&(me.lazyKeys?me._keys=null:Ext.Array.remove(keys,key))},setItem:function(key,value){var me=this,k=me.prefix+key,store=me._store,length=store.length,keys=me._keys;store.setItem(k,value),keys&&length!==store.length&&keys.push(key)}},function(){var LocalStorage=this;if(!("localStorage"in window))return Ext.isIE?void LocalStorage.override({data:null,flushDelay:1,init:function(){var el,me=this,data=me.data;me.el=el=document.createElement("div"),el.id=me.id||(me.id="extjs-localstore"),el.addBehavior("#default#userdata"),Ext.getHead().dom.appendChild(el),el.load(me.id),data=el.getAttribute("xdata"),me.data=data=data?Ext.decode(data):{},me._flushFn=function(){me._timer=null,me.save(0)}},destroy:function(){var me=this,el=me.el;el&&(me._timer&&me.save(),el.parentNode.removeChild(el),me.data=me.el=null,me.callParent())},getKeys:function(){var me=this,keys=me._keys;return keys||(me._keys=keys=Ext.Object.getKeys(me.data)),keys},save:function(delay){var me=this;delay?me._timer||(me._timer=setTimeout(me._flushFn,delay)):(me._timer&&(clearTimeout(me._timer),me._timer=null),me.el.setAttribute("xdata",Ext.encode(me.data)),me.el.save(me.id))},clear:function(){var me=this;me.data={},me._keys=null,me.save(me.flushDelay)},getItem:function(key){var data=this.data;return key in data?data[key]:null},removeItem:function(key){var me=this,keys=me._keys,data=me.data;key in data&&(delete data[key],keys&&(me.lazyKeys?me._keys=null:Ext.Array.remove(keys,key)),me.save(me.flushDelay))},setItem:function(key,value){var me=this,data=me.data,keys=me._keys;!keys||key in data||keys.push(key),data[key]=value,me.save(me.flushDelay)}}):(LocalStorage.supported=!1,void(LocalStorage.prototype.init=function(){Ext.Error.raise("Local storage is not supported on this browser")}))});Ext.define("Ext.state.LocalStorageProvider",{extend:"Ext.state.Provider",requires:["Ext.util.LocalStorage"],alias:"state.localstorage",constructor:function(){var me=this;me.callParent(arguments),me.store=me.getStorageObject(),me.store?me.state=me.readLocalStorage():me.state={}},readLocalStorage:function(){for(var key,store=this.store,data={},keys=store.getKeys(),i=keys.length;i--;)key=keys[i],data[key]=this.decodeValue(store.getItem(key));return data},set:function(name,value){var me=this;me.clear(name),null!=value&&(me.store.setItem(name,me.encodeValue(value)),me.callParent(arguments))},clear:function(name){this.store.removeItem(name),this.callParent(arguments)},getStorageObject:function(){var prefix=this.prefix,id=prefix,n=id.length-1;return"-"===id.charAt(n)&&(id=id.substring(0,n)),new Ext.util.LocalStorage({id:id,prefix:prefix})}});Ext.define("Ext.tab.Panel",{extend:"Ext.panel.Panel",alias:"widget.tabpanel",alternateClassName:["Ext.TabPanel"],requires:["Ext.layout.container.Card","Ext.tab.Bar"],tabPosition:"top",removePanelHeader:!0,plain:!1,itemCls:Ext.baseCSSPrefix+"tabpanel-child",minTabWidth:void 0,maxTabWidth:void 0,deferredRender:!0,initComponent:function(){var me=this,dockedItems=[].concat(me.dockedItems||[]),activeTab=me.activeTab||(me.activeTab=0),tabPosition=me.tabPosition;me.layout=new Ext.layout.container.Card(Ext.apply({owner:me,deferredRender:me.deferredRender,itemCls:me.itemCls,activeItem:activeTab},me.layout)),me.tabBar=new Ext.tab.Bar(Ext.apply({ui:me.ui,dock:me.tabPosition,orientation:"top"==tabPosition||"bottom"==tabPosition?"horizontal":"vertical",plain:me.plain,cardLayout:me.layout,tabPanel:me},me.tabBar)),dockedItems.push(me.tabBar),me.dockedItems=dockedItems,me.addEvents("beforetabchange","tabchange"),me.callParent(arguments),(activeTab=me.activeTab=me.getComponent(activeTab))&&me.tabBar.setActiveTab(activeTab.tab,!0)},setActiveTab:function(card){var previous,me=this;if(card=me.getComponent(card))return(previous=me.getActiveTab())!==card&&!1!==me.fireEvent("beforetabchange",me,card,previous)&&(card.isComponent||(Ext.suspendLayouts(),card=me.add(card),Ext.resumeLayouts()),me.activeTab=card,Ext.suspendLayouts(),me.layout.setActiveItem(card),card=me.activeTab=me.layout.getActiveItem(),card&&card!==previous?(me.tabBar.setActiveTab(card.tab),Ext.resumeLayouts(!0),previous!==card&&me.fireEvent("tabchange",me,card,previous)):Ext.resumeLayouts(!0),card)},getActiveTab:function(){var me=this,result=me.getComponent(me.activeTab);return result&&-1!=me.items.indexOf(result)?me.activeTab=result:me.activeTab=null,me.activeTab},getTabBar:function(){return this.tabBar},onAdd:function(item,index){var me=this,cfg=item.tabConfig||{},defaultConfig={xtype:"tab",ui:me.tabBar.ui,card:item,disabled:item.disabled,closable:item.closable,hidden:item.hidden&&!item.hiddenByLayout,tooltip:item.tooltip,tabBar:me.tabBar,position:me.tabPosition};void 0!==item.closeText&&(defaultConfig.closeText=item.closeText),cfg=Ext.applyIf(cfg,defaultConfig),item.tab=me.tabBar.insert(index,cfg),item.on({scope:me,enable:me.onItemEnable,disable:me.onItemDisable,beforeshow:me.onItemBeforeShow,iconchange:me.onItemIconChange,iconclschange:me.onItemIconClsChange,titlechange:me.onItemTitleChange}),item.isPanel&&(me.removePanelHeader&&(item.rendered?item.header&&item.header.hide():item.header=!1),item.isPanel&&me.border&&item.setBorder(!1))},onItemEnable:function(item){item.tab.enable()},onItemDisable:function(item){item.tab.disable()},onItemBeforeShow:function(item){if(item!==this.activeTab)return this.setActiveTab(item),!1},onItemIconChange:function(item,newIcon){item.tab.setIcon(newIcon)},onItemIconClsChange:function(item,newIconCls){item.tab.setIconCls(newIconCls)},onItemTitleChange:function(item,newTitle){item.tab.setText(newTitle)},doRemove:function(item,autoDestroy){var toActivate,me=this;me.destroying||1==me.items.getCount()?me.activeTab=null:-1!==(toActivate=me.tabBar.items.indexOf(me.tabBar.findNextActivatable(item.tab)))&&me.setActiveTab(toActivate),this.callParent(arguments),delete item.tab.card,delete item.tab},onRemove:function(item,destroying){var me=this;item.un({scope:me,enable:me.onItemEnable,disable:me.onItemDisable,beforeshow:me.onItemBeforeShow}),me.destroying||item.tab.ownerCt!==me.tabBar||me.tabBar.remove(item.tab)}});Ext.define("Ext.toolbar.Spacer",{extend:"Ext.Component",alias:"widget.tbspacer",alternateClassName:"Ext.Toolbar.Spacer",baseCls:Ext.baseCSSPrefix+"toolbar-spacer",focusable:!1,ariaRole:"presentation"});Ext.define("Ext.tree.Panel",{extend:"Ext.panel.Table",alias:"widget.treepanel",alternateClassName:["Ext.tree.TreePanel","Ext.TreePanel"],requires:["Ext.tree.View","Ext.selection.TreeModel","Ext.tree.Column","Ext.data.TreeStore"],viewType:"treeview",selType:"treemodel",treeCls:Ext.baseCSSPrefix+"tree-panel",deferRowRender:!1,rowLines:!1,lines:!0,useArrows:!1,singleExpand:!1,ddConfig:{enableDrag:!0,enableDrop:!0},rootVisible:!0,displayField:"text",root:null,normalCfgCopy:["displayField","root","singleExpand","useArrows","lines","rootVisible","scroll"],lockedCfgCopy:["displayField","root","singleExpand","useArrows","lines","rootVisible"],isTree:!0,arrowCls:Ext.baseCSSPrefix+"tree-arrows",linesCls:Ext.baseCSSPrefix+"tree-lines",noLinesCls:Ext.baseCSSPrefix+"tree-no-lines",autoWidthCls:Ext.baseCSSPrefix+"autowidth-table",constructor:function(config){config=config||{},void 0===config.animate&&(config.animate=Ext.isBoolean(this.animate)?this.animate:Ext.enableFx),this.enableAnimations=config.animate,delete config.animate,this.callParent([config])},initComponent:function(){var view,me=this,cls=[me.treeCls],store=me.store;me.useArrows&&(cls.push(me.arrowCls),me.lines=!1),me.lines?cls.push(me.linesCls):me.useArrows||cls.push(me.noLinesCls),Ext.isString(store)?store=me.store=Ext.StoreMgr.lookup(store):store&&store.isStore?me.root&&(store=me.store=Ext.data.StoreManager.lookup(store),store.setRootNode(me.root),void 0!==me.folderSort&&(store.folderSort=me.folderSort,store.sort())):(store=Ext.apply({type:"tree",root:me.root,fields:me.fields,model:me.model,folderSort:me.folderSort},store),store=me.store=Ext.StoreMgr.lookup(store)),me.viewConfig=Ext.apply({rootVisible:me.rootVisible,animate:me.enableAnimations,singleExpand:me.singleExpand,node:store.getRootNode(),hideHeaders:me.hideHeaders},me.viewConfig),me.columns||(void 0===me.initialConfig.hideHeaders&&(me.hideHeaders=!0),me.addCls(me.autoWidthCls),me.columns=[{xtype:"treecolumn",text:"Name",width:Ext.isIE6?"100%":1e4,dataIndex:me.displayField}]),me.cls&&cls.push(me.cls),me.cls=cls.join(" "),me.callParent(),me.selModel.treeStore=me.store,view=me.getView(),me.relayEvents(view,["checkchange","afteritemexpand","afteritemcollapse"]),view.isLockingView||view.rootVisible||me.getRootNode()||me.setRootNode({expanded:!0})},bindStore:function(store,initial){var me=this;me.store=store,me.storeListeners=me.mon(store,{destroyable:!0,load:me.onStoreLoad,rootchange:me.onRootChange,clear:me.onClear,scope:me}),me.storeRelayers=me.relayEvents(store,["beforeload","load"]),me.storeRelayers1=me.mon(store,{destroyable:!0,append:me.createRelayer("itemappend"),remove:me.createRelayer("itemremove"),move:me.createRelayer("itemmove",[0,4]),insert:me.createRelayer("iteminsert"),beforeappend:me.createRelayer("beforeitemappend"),beforeremove:me.createRelayer("beforeitemremove"),beforemove:me.createRelayer("beforeitemmove"),beforeinsert:me.createRelayer("beforeiteminsert"),expand:me.createRelayer("itemexpand",[0,1]),collapse:me.createRelayer("itemcollapse",[0,1]),beforeexpand:me.createRelayer("beforeitemexpand",[0,1]),beforecollapse:me.createRelayer("beforeitemcollapse",[0,1])}),store.ownerTree=me,initial||me.view.setRootNode(me.getRootNode())},unbindStore:function(){var me=this,store=me.store;store&&(Ext.destroy(me.storeListeners,me.storeRelayers,me.storeRelayers1),delete store.ownerTree)},onClear:function(){this.view.onClear()},setRootNode:function(){return this.store.setRootNode.apply(this.store,arguments)},getRootNode:function(){return this.store.getRootNode()},onRootChange:function(root){this.view.setRootNode(root)},getChecked:function(){return this.getView().getChecked()},isItemChecked:function(rec){return rec.get("checked")},expandNode:function(record,deep,callback,scope){return this.getView().expand(record,deep,callback,scope||this)},collapseNode:function(record,deep,callback,scope){return this.getView().collapse(record,deep,callback,scope||this)},expandAll:function(callback,scope){var me=this,root=me.getRootNode(),animate=me.enableAnimations;root&&(animate||Ext.suspendLayouts(),root.expand(!0,callback,scope||me),animate||Ext.resumeLayouts(!0))},collapseAll:function(callback,scope){var me=this,root=me.getRootNode(),animate=me.enableAnimations,view=me.getView();root&&(animate||Ext.suspendLayouts(),scope=scope||me,view.rootVisible?root.collapse(!0,callback,scope):root.collapseChildren(!0,callback,scope),animate||Ext.resumeLayouts(!0))},expandPath:function(path,field,separator,callback,scope){var keys,expander,me=this,current=me.getRootNode(),index=1;me.getView();return field=field||me.getRootNode().idProperty,separator=separator||"/",Ext.isEmpty(path)?void Ext.callback(callback,scope||me,[!1,null]):(keys=path.split(separator),current.get(field)!=keys[1]?void Ext.callback(callback,scope||me,[!1,current]):(expander=function(){if(++index===keys.length)return void Ext.callback(callback,scope||me,[!0,current]);var node=current.findChild(field,keys[index]);if(!node)return void Ext.callback(callback,scope||me,[!1,current]);current=node,current.expand(!1,expander)},void current.expand(!1,expander)))},selectPath:function(path,field,separator,callback,scope){var root,keys,last,me=this;field=field||me.getRootNode().idProperty,separator=separator||"/",keys=path.split(separator),last=keys.pop(),keys.length>1?me.expandPath(keys.join(separator),field,separator,function(success,node){var lastNode=node;if(success&&node&&(node=node.findChild(field,last)))return me.getSelectionModel().select(node),void Ext.callback(callback,scope||me,[!0,node]);Ext.callback(callback,scope||me,[!1,lastNode])},me):(root=me.getRootNode(),root.getId()===last?(me.getSelectionModel().select(root),Ext.callback(callback,scope||me,[!0,root])):Ext.callback(callback,scope||me,[!1,null]))}});Ext.define("Ext.view.DragZone",{extend:"Ext.dd.DragZone",containerScroll:!1,constructor:function(config){var view,ownerCt,el,me=this;Ext.apply(me,config),me.ddGroup||(me.ddGroup="view-dd-zone-"+me.view.id),view=me.view,ownerCt=view.ownerCt,el=ownerCt?ownerCt.getTargetEl().dom:view.el.dom.parentNode,me.callParent([el]),me.ddel=Ext.get(document.createElement("div")),me.ddel.addCls(Ext.baseCSSPrefix+"grid-dd-wrap")},init:function(id,sGroup,config){var me=this;me.initTarget(id,sGroup,config),me.view.on("itemmousedown",me.onItemMouseDown,me)},onValidDrop:function(target,e,id){this.callParent(),target.el.focus()},onItemMouseDown:function(view,record,item,index,e){this.isPreventDrag(e,record,item,index)||(view.focusRow&&view.focusRow(record),this.handleMouseDown(e))},isPreventDrag:function(e){return!1},getDragData:function(e){var view=this.view,item=e.getTarget(view.getItemSelector());if(item)return{copy:view.copy||view.allowCopy&&e.ctrlKey,event:new Ext.EventObjectImpl(e),view:view,ddel:this.ddel,item:item,records:view.getSelectionModel().getSelection(),fromPosition:Ext.fly(item).getXY()}},onInitDrag:function(x,y){var me=this,data=me.dragData,view=data.view,selectionModel=view.getSelectionModel(),record=view.getRecord(data.item);return selectionModel.isSelected(record)||selectionModel.selectWithEvent(record,me.DDMInstance.mousedownEvent),data.records=selectionModel.getSelection(),me.ddel.update(me.getDragText()),me.proxy.update(me.ddel.dom),me.onStartDrag(x,y),!0},getDragText:function(){var count=this.dragData.records.length;return Ext.String.format(this.dragText,count,1==count?"":"s")},getRepairXY:function(e,data){return!!data&&data.fromPosition}});Ext.define("Ext.tree.ViewDragZone",{extend:"Ext.view.DragZone",isPreventDrag:function(e,record){return!1===record.get("allowDrag")||!!e.getTarget(this.view.expanderSelector)},getDragText:function(){var records=this.dragData.records,count=records.length,text=records[0].get(this.displayField),suffix="s";return 1===count&&text?text:(text||(suffix=""),Ext.String.format(this.dragText,count,suffix))},afterRepair:function(){var r,item,me=this,view=me.view,selectedRowCls=view.selectedItemCls,records=me.dragData.records,rLen=records.length,fly=Ext.fly;if(Ext.enableFx&&me.repairHighlight)for(r=0;r<rLen;r++)item=view.getNode(records[r]),fly(item.firstChild).highlight(me.repairHighlightColor,{listeners:{beforeanimate:function(){view.isSelected(item)&&fly(item).removeCls(selectedRowCls)},afteranimate:function(){view.isSelected(item)&&fly(item).addCls(selectedRowCls)}}});me.dragging=!1}});Ext.define("Ext.tree.ViewDropZone",{extend:"Ext.view.DropZone",allowParentInserts:!1,allowContainerDrops:!1,appendOnly:!1,expandDelay:500,indicatorCls:Ext.baseCSSPrefix+"tree-ddindicator",expandNode:function(node){var view=this.view;this.expandProcId=!1,node.isLeaf()||node.isExpanded()||(view.expand(node),this.expandProcId=!1)},queueExpand:function(node){this.expandProcId=Ext.Function.defer(this.expandNode,this.expandDelay,this,[node])},cancelExpand:function(){this.expandProcId&&(clearTimeout(this.expandProcId),this.expandProcId=!1)},getPosition:function(e,node){var fragment,view=this.view,record=view.getRecord(node),y=e.getPageY(),noAppend=record.isLeaf(),noBelow=!1,region=Ext.fly(node).getRegion();return record.isRoot()?"append":this.appendOnly?!noAppend&&"append":(this.allowParentInserts||(noBelow=record.hasChildNodes()&&record.isExpanded()),fragment=(region.bottom-region.top)/(noAppend?2:3),y>=region.top&&y<region.top+fragment?"before":!noBelow&&(noAppend||y>=region.bottom-fragment&&y<=region.bottom)?"after":"append")},isValidDropPoint:function(node,position,dragZone,e,data){if(!node||!data.item)return!1;var i,record,view=this.view,targetNode=view.getRecord(node),draggedRecords=data.records,dataLength=draggedRecords.length,ln=draggedRecords.length;if(!(targetNode&&position&&dataLength))return!1;for(i=0;i<ln;i++)if(record=draggedRecords[i],record.isNode&&record.contains(targetNode))return!1;return("append"!==position||!1!==targetNode.get("allowDrop"))&&(("append"==position||!1!==targetNode.parentNode.get("allowDrop"))&&(!Ext.Array.contains(draggedRecords,targetNode)&&!1!==view.fireEvent("nodedragover",targetNode,position,data,e)))},onNodeOver:function(node,dragZone,e,data){var position=this.getPosition(e,node),returnCls=this.dropNotAllowed,view=this.view,targetNode=view.getRecord(node),indicator=this.getIndicator(),indicatorY=0;return this.cancelExpand(),"append"!=position||this.expandProcId||Ext.Array.contains(data.records,targetNode)||targetNode.isLeaf()||targetNode.isExpanded()||this.queueExpand(targetNode),this.isValidDropPoint(node,position,dragZone,e,data)?(this.valid=!0,this.currentPosition=position,this.overRecord=targetNode,indicator.setWidth(Ext.fly(node).getWidth()),indicatorY=Ext.fly(node).getY()-Ext.fly(view.el).getY()-1,"before"==position?(returnCls=targetNode.isFirst()?Ext.baseCSSPrefix+"tree-drop-ok-above":Ext.baseCSSPrefix+"tree-drop-ok-between",indicator.showAt(0,indicatorY),dragZone.proxy.show()):"after"==position?(returnCls=targetNode.isLast()?Ext.baseCSSPrefix+"tree-drop-ok-below":Ext.baseCSSPrefix+"tree-drop-ok-between",indicatorY+=Ext.fly(node).getHeight(),indicator.showAt(0,indicatorY),dragZone.proxy.show()):(returnCls=Ext.baseCSSPrefix+"tree-drop-ok-append",indicator.hide())):this.valid=!1,this.currentCls=returnCls,returnCls},onNodeOut:function(n,dd,e,data){this.valid=!1,this.getIndicator().hide()},onContainerOver:function(dd,e,data){return e.getTarget("."+this.indicatorCls)?this.currentCls:this.dropNotAllowed},notifyOut:function(){this.callParent(arguments),this.cancelExpand()},handleNodeDrop:function(data,targetNode,position){var records,i,len,record,insertionMethod,argList,needTargetExpand,transferData,me=this,targetView=me.view,parentNode=targetNode?targetNode.parentNode:targetView.panel.getRootNode(),Model=targetView.getStore().treeStore.model;if(data.copy)for(records=data.records,data.records=[],i=0,len=records.length;i<len;i++)record=records[i],record.isNode?data.records.push(record.copy(void 0,!0)):data.records.push(new Model(record.data,record.getId()));me.cancelExpand(),"before"==position?(insertionMethod=parentNode.insertBefore,argList=[null,targetNode],targetNode=parentNode):"after"==position?(targetNode.nextSibling?(insertionMethod=parentNode.insertBefore,argList=[null,targetNode.nextSibling]):(insertionMethod=parentNode.appendChild,argList=[null]),targetNode=parentNode):(targetNode.isExpanded()||targetNode.isLoading()||(needTargetExpand=!0),insertionMethod=targetNode.appendChild,argList=[null]),transferData=function(){var color,n;for(Ext.suspendLayouts(),i=0,len=data.records.length;i<len;i++)record=data.records[i],record.isNode||(record=record.isModel?new Model(record.data,record.getId()):new Model(record),data.records[i]=record),argList[0]=record,insertionMethod.apply(targetNode,argList);if(me.sortOnDrop&&targetNode.sort(targetNode.getOwnerTree().store.generateComparator()),Ext.resumeLayouts(!0),Ext.enableFx&&me.dropHighlight)for(color=me.dropHighlightColor,i=0;i<len;i++)(n=targetView.getNode(data.records[i]))&&Ext.fly(n).highlight(color)},needTargetExpand?targetNode.expand(!1,transferData):targetNode.isLoading()?targetNode.on({expand:transferData,delay:1,single:!0}):transferData()}});Ext.define("Ext.tree.plugin.TreeViewDragDrop",{extend:"Ext.AbstractPlugin",alias:"plugin.treeviewdragdrop",uses:["Ext.tree.ViewDragZone","Ext.tree.ViewDropZone"],dragText:"{0} selected node{1}",allowParentInserts:!1,allowContainerDrops:!1,appendOnly:!1,ddGroup:"TreeDD",containerScroll:!1,expandDelay:1e3,enableDrop:!0,enableDrag:!0,nodeHighlightColor:"c3daf9",nodeHighlightOnDrop:Ext.enableFx,nodeHighlightOnRepair:Ext.enableFx,displayField:"text",init:function(view){view.on("render",this.onViewRender,this,{single:!0})},destroy:function(){Ext.destroy(this.dragZone,this.dropZone)},onViewRender:function(view){var scrollEl,me=this;me.enableDrag&&(me.containerScroll&&(scrollEl=view.getEl()),me.dragZone=new Ext.tree.ViewDragZone({view:view,ddGroup:me.dragGroup||me.ddGroup,dragText:me.dragText,displayField:me.displayField,repairHighlightColor:me.nodeHighlightColor,repairHighlight:me.nodeHighlightOnRepair,scrollEl:scrollEl})),me.enableDrop&&(me.dropZone=new Ext.tree.ViewDropZone({view:view,ddGroup:me.dropGroup||me.ddGroup,allowContainerDrops:me.allowContainerDrops,appendOnly:me.appendOnly,allowParentInserts:me.allowParentInserts,expandDelay:me.expandDelay,dropHighlightColor:me.nodeHighlightColor,dropHighlight:me.nodeHighlightOnDrop,sortOnDrop:me.sortOnDrop,containerScroll:me.containerScroll}))}},function(){var proto=this.prototype;proto.nodeHighlightOnDrop=proto.nodeHighlightOnRepair=Ext.enableFx});Ext.define("Ext.util.Grouper",{extend:"Ext.util.Sorter",isGrouper:!0,getGroupString:function(instance){return instance.get(this.property)}});Ext.define("Fbx.os.app.settings.UpnpIgdRedirModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"enabled",type:"boolean"},{name:"ext_src_ip",type:"string"},{name:"ext_port",type:"integer"},{name:"proto",type:"string"},{name:"int_ip",type:"string"},{name:"desc",type:"string"},{name:"int_port",type:"integer"},{name:"remaining",type:"integer"},{name:"host",type:"object"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"upnpigd/redir/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.ux.grid.plugin.MsCellEditing",{extend:"Ext.grid.plugin.CellEditing",alias:"plugin.mscellediting",triggerEvent:"dary",init:function(grid){var me=this;this.callParent(arguments),this.mon(grid,"deselect",function(row,rec,index,eOpts){rec.lastClick=0}),this.mon(grid,"editfilename",function(grid,rec){var editColumnHeader=me.grid.headerCt.getHeaderAtIndex(1);me.startEdit(rec,editColumnHeader)}),this.mon(grid,"itemclick",function(grid,rec,item,index,e,eOpts){var now=(new Date).getTime();if(rec.lastClick){var diff=now-rec.lastClick;if(diff>250&&diff<750){var editColumnHeader=me.grid.headerCt.getHeaderAtIndex(1);me.startEdit(rec,editColumnHeader)}}rec.lastClick=now})}});Ext.define("Fbx.os.app.settings.ports.PortRedirModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"enabled",type:"boolean"},{name:"wan_port_start",type:"int"},{name:"wan_port_end",type:"int"},{name:"ip_proto",type:"string",defaultValue:"tcp"},{name:"lan_ip",type:"string"},{name:"lan_port",type:"int"},{name:"hostname",type:"string"},{name:"host",type:"object"},{name:"src_ip",type:"string"},{name:"comment",type:"string"},{name:"valid",type:"boolean"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"fw/redir/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}},statics:{getPortRange:function(cb){if(Fbx.os.app.settings.ports.PortRedirModel.__portRange)return void cb(Fbx.os.app.settings.ports.PortRedirModel.__portRange);Ext.Ajax.request({url:FbxConf.apiBaseUrl+"connection/full/",method:"GET",success:function(result){var range=result.jsonData.result.ipv4_port_range;range?0==range[0]&&(range[0]=1):range=[1,65535],Fbx.os.app.settings.ports.PortRedirModel.__portRange=range,cb(range)}})}}});Ext.define("Fbx.os.app.explorer.ShareLinkModel",{extend:"Ext.data.Model",fields:[{name:"token",type:"string"},{name:"path",type:"string"},{name:"decoded_path",type:"string",convert:function(v,rec){return Fbx.os.lib.FbxUtils.base64_decode(rec.get("path"))}},{name:"expire",type:"int"},{name:"expiredate",type:"date",convert:function(val,rec){return new Date(1e3*rec.get("expire"))}},{name:"internal",type:"boolean"},{name:"fullurl",type:"string"},{name:"mailto",type:"string",convert:function(val,rec){var expire=rec.get("expire")?Fbx.os.lib.FbxUtils.getParisMoment(rec.get("expiredate")).format("DD/MM/YYYY à HH:mm:ss"):"Pas d'expiration",body="Lien de partage : "+rec.get("fullurl")+"\nValable jusqu'au "+expire;return"mailto:?subject="+encodeURIComponent("Partage sur ma Freebox")+"&body="+encodeURIComponent(body)}}],idProperty:"token",proxy:{type:"rest",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,url:FbxConf.apiBaseUrl+"share_link/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.help.HelpModel",{extend:"Ext.data.TreeModel",requires:["Ext.data.Store","Ext.data.reader.Json"],fields:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"url",type:"string"},{name:"leaf",type:"bool",convert:function(val,r){return!r.raw.children||0==r.raw.children.length}}],proxy:{type:"ajax",url:"doc/docindex.json",reader:{type:"json",root:""}}});Ext.define("Fbx.os.lib.AirMediaReceiverModel",{extend:"Ext.data.Model",requires:["Ext.data.Store"],fields:[{name:"name",type:"string"},{name:"capabilities",type:"raw"},{name:"password_protected",type:"boolean"}],idProperty:"name",proxy:{type:"rest",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,url:FbxConf.apiBaseUrl+"airmedia/receivers/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.WifiMacModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"mac",type:"string"},{name:"hostname",type:"string"},{name:"comment",type:"string"},{name:"type",type:"string"},{name:"host",type:"object"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/mac_filter/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.ux.form.field.File",{extend:"Ext.form.field.File",alias:"widget.ux_filefield",buttonText:"Explorer ...",initComponent:function(){var me=this;this.on("change",function(field,newVal,oldVal){var parts=newVal.split(/\\/);if(parts.length>1){var name=parts[parts.length-1];name!=newVal&&Ext.form.field.File.superclass.setValue.call(me,name)}}),me.on("boxready",function(){me.fileInputEl.dom.setAttribute("multiple","multiple")}),this.callParent(arguments)},reset:function(){var me=this;this.callParent(arguments),me.fileInputEl.dom.setAttribute("multiple","multiple")}});Ext.define("Fbx.os.gui.PanelContainer",{extend:"Ext.container.Container",config:{panelContainerPosition:null},constructor:function(config){this.initConfig(config),config.layout={type:"fit"},this.callParent([config])}});Ext.define("Fbx.ux.grid.plugin.DeferredRenderer",{extend:"Ext.grid.plugin.BufferedRenderer",alias:"plugin.deferredrenderer",deferDuration:1e3,init:function(grid){var me=this;me.callParent(arguments),me.deferedCols=[],Ext.Array.each(me.grid.columns,function(col){"deferedtemplated"==col.xtype&&me.deferedCols.push(col)})},renderFullRange:function(start,end){var me=this,rows=me.view.all;Ext.Array.each(me.deferedCols,function(col){col.partialRender=!1}),rows.clear(!0),me.onRangeFetched(null,start,end)},renderRange:function(start,end,forceSynchronous){var me=this;Ext.Array.each(me.deferedCols,function(col){col.partialRender=!0}),me.deferTimeout&&clearTimeout(me.deferTimeout),me.deferTimeout=setTimeout(function(){me.renderFullRange(start,end)},me.deferDuration),me.callParent(arguments)},forceRefresh:function(){var me=this,rows=me.view.all;rows.endIndex<=0||me.renderFullRange(rows.startIndex,rows.endIndex)}});Ext.define("Fbx.os.app.settings.domains.DomainModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"owner",type:"string"},{name:"certs",type:"auto"},{name:"default",type:"bool",persist:!1,convert:function(v,r){var cfg=Fbx.os.app.settings.domains.DomainModel.__domainsConf;return!!cfg&&cfg.default_domain==r.get("id")}},{name:"defaultStr",type:"bool",persist:!1,convert:function(v,r){return r.get("default")?"Oui":"Non"}}],statics:{domainsTypes:{auto:"Automatique",custom:"Personnalisé"},domainsOwners:{freebox:"Freebox",user:"Autre"},certsTypes:{ec:"ECDSA",rsa:"RSA"},certsStatus:{not_requested:"En attente",processing:"En cours de génération",issued:"Valide",revoked:"Révoqué",error:"Erreur"},__domainsConf:null,getDomainsConf:function(callback,failure){var me=this;if(me.__domainsConf)return void(callback&&callback(me.__domainsConf));Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/config/",method:"GET",success:function(response){me.__domainsConf=response.jsonData.result,callback&&callback(me.__domainsConf)},failure:failure})},setDefaultDomain:function(domain_name,cb){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/config/",method:"PUT",jsonData:{default_domain:domain_name},success:function(response){Fbx.os.app.settings.domains.DomainModel.__domainsConf=null,cb&&cb(response.jsonData.result)}})}},proxy:{type:"rest",url:FbxConf.apiBaseUrl+"domain/owned/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.core.task.Task",{extend:"Ext.util.Observable",inheritableStatics:{instances:0,cascadeDirection:{x:1,y:1}},className:null,tid:null,type:null,config:{name:"Unnamed application"},stateChanged:function(){this.fireEvent("changed",this)},terminate:function(){var me=this;this.self.instances--,this.fireEvent("killed",this.tid),me.destroy(),delete me},cascadeDirection:function(){return this.self.cascadeDirection},constructor:function(config){var me=this;return me.instanceNum=this.self.instances,this.self.instances++,this.tid=Fbx.os.core.TaskManager.allocTid(),this.className=Ext.ClassManager.getName(this.self),this.type="simple",Ext.apply(config,{name:this.self.defaultName||"Unnamed application"}),this.initConfig(config),this.callParent([config]),me.addEvents({changed:!0,killed:!0}),this}});Ext.define("Fbx.ux.grid.plugin.TreeMsEditing",{extend:"Fbx.ux.grid.plugin.MsCellEditing",alias:"plugin.treemscellediting",getEditingContext:function(record,columnHeader){var rowIdx,colIdx,value,me=this,grid=me.grid,view=(grid.store,grid.getView()),root=grid.getRootNode();return Ext.isNumber(record)?(rowIdx=record,record=root.getChildAt(rowIdx)):rowIdx=root.indexOf(record),columnHeader||(columnHeader=0),Ext.isNumber(columnHeader)?(colIdx=columnHeader,columnHeader=grid.headerCt.getHeaderAtIndex(colIdx)):colIdx=columnHeader.getIndex(),value=record.get(columnHeader.dataIndex),{grid:grid,record:record,field:columnHeader.dataIndex,value:value,row:view.getNode(rowIdx),column:columnHeader,rowIdx:rowIdx,colIdx:colIdx}}});Ext.define("Ext.ux.event.Driver",{extend:"Ext.util.Observable",active:null,specialKeysByName:{PGUP:33,PGDN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40},specialKeysByCode:{},constructor:function(){var me=this;me.callParent(arguments),me.addEvents("start","stop")},getTextSelection:function(el){var range,range2,start,end,doc=el.ownerDocument;return"number"==typeof el.selectionStart?(start=el.selectionStart,end=el.selectionEnd):doc.selection&&(range=doc.selection.createRange(),range2=el.createTextRange(),range2.setEndPoint("EndToStart",range),start=range2.text.length,end=start+range.text.length),[start,end]},getTime:function(){return(new Date).getTime()},getTimestamp:function(){return this.getTime()-this.startTime},onStart:function(){},onStop:function(){},start:function(){var me=this;me.active||(me.active=new Date,me.startTime=me.getTime(),me.onStart(),me.fireEvent("start",me))},stop:function(){var me=this;me.active&&(me.active=null,me.onStop(),me.fireEvent("stop",me))}},function(){var proto=this.prototype;Ext.Object.each(proto.specialKeysByName,function(name,value){proto.specialKeysByCode[value]=name})});Ext.define("Fbx.os.gui.panel.StartMenu",{extend:"Ext.button.Button",requires:["Ext.menu.Menu"],position:null,initComponent:function(config){var me=this;Ext.apply(me,config);var appStore=Ext.getStore("appStore");appStore.sort(function(a,b){return a.caption.localeCompare(b.caption)});var menuclick=function(item){Fbx.os.core.TaskManager.startApplication(item.application)},menus={root:{items:[]},tv:{text:"Télévision",items:[]},settings:{text:"Paramètres",items:[]},phone:{text:"Téléphonie",items:[]}};menus.root.items.push({text:menus.tv.text,iconCls:"app-icons-32-tv",menu:{showSeparator:!1,cls:"fbx-start-menu",items:menus.tv.items}}),menus.root.items.push({text:menus.settings.text,iconCls:"app-icons-32-settings",menu:{showSeparator:!1,cls:"fbx-start-menu",items:menus.settings.items}}),menus.root.items.push({text:menus.phone.text,iconCls:"app-icons-32-calls",menu:{showSeparator:!1,cls:"fbx-start-menu",items:menus.phone.items}}),appStore.each(function(rec){var app=rec.get("application"),cls="";if(!Fbx.os.gui.Environment.isLogged){var classObj=Ext.ClassManager.get(app);classObj&&!classObj.isOpenBar&&(cls="grayscale")}menus[rec.get("menu")].items.push({text:rec.get("name"),iconCls:rec.get("iconCls"),application:app,handler:menuclick,cls:cls})}),Fbx.os.gui.Environment.isLogged?(menus.root.items.push({text:"Redémarrer la Freebox",iconCls:"btn-32-reboot",handler:function(){Fbx.os.gui.Environment.reboot()}}),menus.root.items.push({text:"Déconnexion",iconCls:"btn-32-logout",handler:function(){var url=FbxConf.apiBaseUrl+"login/logout";Ext.Ajax.request({url:url,method:"POST",success:function(option,success,response){document.location="./"}})}})):menus.root.items.push({text:"Connexion",iconCls:"btn-32-login",handler:function(){document.location="./login.php"}});var menu=Ext.create("Ext.menu.Menu",{showSeparator:!1,iconCls:"start-menu",header:!1,cls:"fbx-start-menu",items:menus.root.items}),align={north:"tl-bl",south:"bl-tl",west:"tl-tr",east:"tr-tl"};config=Ext.apply(me,{scale:"large",cls:"x-btn-icon btn-start",arrowCls:"hidden",menu:menu,menuAlign:align[me.position],ariaLbl:"Menu démarrer",listeners:{afterrender:function(btn){btn.el.dom.setAttribute("tabindex","5")},menushow:function(btn,menu){menu.alignTo(me,align[btn.position]);var pos=menu.getPosition();pos[1]<0?(menu.setHeight(menu.getHeight()+pos[1]),menu.setPosition(pos[0],0)):menu.setHeight(null)}}}),this.callParent([config])}});Ext.define("Ext.ux.grid.menu.RangeMenu",{extend:"Ext.menu.Menu",fieldCls:"Ext.form.field.Number",itemIconCls:{gt:"ux-rangemenu-gt",lt:"ux-rangemenu-lt",eq:"ux-rangemenu-eq"},fieldLabels:{gt:"Greater Than",lt:"Less Than",eq:"Equal To"},menuItemCfgs:{emptyText:"Enter Number...",selectOnFocus:!1,width:155},menuItems:["lt","gt","-","eq"],plain:!0,constructor:function(config){var fields,fieldCfg,i,len,item,cfg,Cls,me=this;for(me.callParent(arguments),fields=me.fields=me.fields||{},fieldCfg=me.fieldCfg=me.fieldCfg||{},me.addEvents("update"),me.updateTask=Ext.create("Ext.util.DelayedTask",me.fireUpdate,me),i=0,len=me.menuItems.length;i<len;i++)item=me.menuItems[i],"-"!==item&&(cfg={itemId:"range-"+item,enableKeyEvents:!0,hideEmptyLabel:!1,labelCls:"ux-rangemenu-icon "+me.itemIconCls[item],labelSeparator:"",labelWidth:29,listeners:{scope:me,change:me.onInputChange,keyup:me.onInputKeyUp,el:{click:this.stopFn}},activate:Ext.emptyFn,deactivate:Ext.emptyFn},Ext.apply(cfg,Ext.applyIf(fields[item]||{},fieldCfg[item]),me.menuItemCfgs),Cls=cfg.fieldCls||me.fieldCls,item=fields[item]=Ext.create(Cls,cfg)),me.add(item)},stopFn:function(e){e.stopPropagation()},fireUpdate:function(){this.fireEvent("update",this)},getValue:function(){var key,field,result={},fields=this.fields;for(key in fields)fields.hasOwnProperty(key)&&(field=fields[key],field.isValid()&&null!==field.getValue()&&(result[key]=field.getValue()));return result},setValue:function(data){var key,field,me=this,fields=me.fields;for(key in fields)fields.hasOwnProperty(key)&&(field=fields[key],field.suspendEvents(),field.setValue(key in data?data[key]:""),field.resumeEvents());me.fireEvent("update",me)},onInputKeyUp:function(field,e){e.getKey()===e.RETURN&&field.isValid()&&(e.stopEvent(),this.hide())},onInputChange:function(field){var me=this,fields=me.fields,eq=fields.eq,gt=fields.gt,lt=fields.lt;field==eq?(gt&&gt.setValue(null),lt&&lt.setValue(null)):eq.setValue(null),this.updateTask.delay(this.updateBuffer)}});Ext.define("Fbx.os.app.settings.wifi.WifiStationModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"bssid",type:"string"},{name:"mac",type:"string"},{name:"hostname",type:"string"},{name:"inactive",type:"int"},{name:"state",type:"string"},{name:"tx_bytes",type:"int"},{name:"rx_bytes",type:"int"},{name:"tx_rate",type:"int"},{name:"rx_rate",type:"int"},{name:"signal",type:"int"},{name:"host",type:"object"},{name:"flags",type:"object"},{name:"last_rx",type:"object"},{name:"last_tx",type:"object"},{name:"iconCls",type:"string",convert:function(v,r){var iconCls="wifi-cap_g";return r.raw.flags.legacy&&(iconCls="wifi-cap_b"),r.raw.flags.ht&&(iconCls="wifi-cap_n"),r.raw.flags.vht&&(iconCls="wifi-cap_ac"),iconCls}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/ap/0/stations/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.pvr.RecordMediaModel",{extend:"Ext.data.Model",fields:[{name:"media",type:"string"},{name:"free_bytes",type:"string"},{name:"total_bytes",type:"string"},{name:"record_time",type:"auto"},{name:"available_rec_time",convert:function(val,r){var recTime=r.get("record_time").iptv.hd;return recTime<=0?'<span style="color: #C00;">Disque plein</span>':Fbx.os.lib.FbxUtils.formatDuration(recTime,!0)+" disponible"}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"pvr/media/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.WifiNeighborModel",{extend:"Ext.data.Model",fields:[{name:"bssid",type:"string"},{name:"channel_width",type:"int"},{name:"capabilities",type:"object"},{name:"ssid",type:"string",convert:function(v){return""==v?"{Masqué}":v}},{name:"channel",type:"int"},{name:"secondary_channel",type:"int"},{name:"band",type:"string"},{name:"signal",type:"int"},{name:"iconCls",type:"string",convert:function(v,r){var iconCls="wifi-cap_b";return"2d4g"==r.get("band")?(iconCls="wifi-cap_g",r.raw.capabilities.legacy&&(iconCls="wifi-cap_b"),r.raw.capabilities.ht&&(iconCls="wifi-cap_n")):"5g"==r.get("band")&&(iconCls="wifi-cap_a",r.raw.capabilities.ht&&(iconCls="wifi-cap_n"),r.raw.capabilities.vht&&(iconCls="wifi-cap_ac")),iconCls}}],idProperty:"bssid",proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/ap/0/neighbors/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.wifi.WifiWpsSessionModel",{extend:"Ext.data.Model",statics:{resultStr:{success:"Succès",user_canceled:"Annulé par l'utilisateur",self_canceled:"Annulé",failed_timeout:"Temps d'attente écoulé",failed_overlap:"Conflit WPS",failed_unknown:"Erreur inconnue"},flushSessions:function(cb){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/wps/sessions/",method:"DELETE",disableCaching:!0,autoRefresh:!0,success:function(response){cb()}})}},fields:[{name:"id",type:"int"},{name:"bss_uuid",type:"string"},{name:"ssid",type:"string"},{name:"active",type:"bool"},{name:"result",type:"string"},{name:"mac",type:"string"},{name:"start_date",type:"date",convert:function(val,r){return new Date(1e3*val)}},{name:"end_date",type:"int"},{name:"resultStr",type:"string",convert:function(v,r){var result=r.raw.result;return Fbx.os.app.settings.wifi.WifiWpsSessionModel.resultStr[result]}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/wps/sessions/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.core.task.TaskModel",{extend:"Ext.data.Model",fields:[{name:"tid",type:"int"},{name:"classname",type:"string",mapping:"className"},{name:"name",type:"string"},{name:"type",type:"string"}]});Ext.define("Ext.ux.DataView.LabelEditor",{extend:"Ext.Editor",alignment:"tl-tl",completeOnEnter:!0,cancelOnEsc:!0,shim:!1,autoSize:{width:"boundEl",height:"field"},labelSelector:"x-editable",requires:["Ext.form.field.Text"],constructor:function(config){config.field=config.field||Ext.create("Ext.form.field.Text",{allowOnlyWhitespace:!1,selectOnFocus:!0}),this.callParent([config])},init:function(view){this.view=view,this.mon(view,"afterrender",this.bindEvents,this),this.on("complete",this.onSave,this)},bindEvents:function(){this.mon(this.view.getEl(),{click:{fn:this.onClick,scope:this}})},onClick:function(e,target){var item,record,me=this;!Ext.fly(target).hasCls(me.labelSelector)||me.editing||e.ctrlKey||e.shiftKey?me.editing&&(me.field.blur(),e.preventDefault()):(e.stopEvent(),item=me.view.findItemByChild(target),record=me.view.store.getAt(me.view.indexOf(item)),me.startEdit(target,record.data[me.dataIndex]),me.activeRecord=record)},onSave:function(ed,value){this.activeRecord.set(this.dataIndex,value)}});Ext.define("Fbx.os.app.contacts.IconEditor",{extend:"Ext.form.Panel",requires:["Ext.grid.plugin.CellEditing","Ext.form.FieldContainer","Ext.Img","Fbx.ux.form.field.File","Ext.form.field.Display","Ext.form.field.Hidden","Ext.form.field.Text"],alias:"widget.iconEditor",height:150,bodyPadding:10,preventHeader:!0,buttons:[{text:"Annuler",iconCls:"btn-cancel",handler:function(me){var win=me.up("window");me.up("form").getForm().reset(),win.hide()}},{text:"Enregistrer",iconCls:"btn-disk",handler:function(me){var form=me.up("form").getForm(),record=form.getRecord();form.url=FbxConf.apiBaseUrl+"contact/"+record.getId()+"/update_photo/",form.submit({success:function(form,action){record.set("photo_url",action.result.result),me.up("window").hide()},failure:function(form,action){Ext.Msg.alert("Erreur",action.result.msg)}})}}],initComponent:function(){var me=this;Ext.applyIf(me,{fieldDefaults:{labelWidth:80},items:[{xtype:"ux_filefield",fieldLabel:"Fichier",name:"file",anchor:"100%",emptyText:"image"},{xtype:"displayfield",fieldLabel:"ou",labelSeparator:"",anchor:"100%"},{xtype:"textfield",fieldLabel:"url",name:"url",anchor:"100%",emptyText:"http://"},{xtype:"hidden",name:"csrf_token",value:FbxConf.csrfToken}]}),me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.wifi.WifiCustomKeyModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"remaining",type:"int"},{name:"expire_date",type:"str",convert:function(v,r){if(0==r.get("remaining"))return"Jamais";var expireDate=new Date((new Date).getTime()+1e3*r.get("remaining"));return Fbx.os.lib.FbxUtils.niceEventTimesDisplay(expireDate)}},{name:"params",type:"object"},{name:"params_str",type:"object",convert:function(v,r){return"Nombre maximal d'utilisateurs: "+r.raw.params.max_use_count+"<br />Type d'accès: "+("full"==r.raw.params.access_type?"Internet + réseau local":"Internet")}},{name:"users",type:"array"},{name:"users_str",type:"object",convert:function(v,r){var hosts=[];for(var i in r.raw.users){var u=r.raw.users[i];u.host&&""!=u.host.primary_name?hosts.push(u.host.primary_name):hosts.push(u.hostname)}return hosts.length?hosts.join(", "):"Aucun"}},{name:"description",type:"str",convert:function(v,r){return r.raw.params.description}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/custom_key/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.lib.AirMedia",{requires:["Fbx.os.app.explorer.ShareLinkModel","Fbx.os.lib.AirMediaReceiverModel","Ext.data.Store"],singleton:!0,supportedFiles:{"image/gif":"photo","image/jpeg":"photo","image/png":"photo","image/tiff":"photo","image/bmp":"photo","video/mpeg":"video","video/mp2t":"video","video/mp4":"video","video/quicktime":"video","video/ogg":"video","video/x-flv":"video","video/x-ms-asf":"video","video/x-ms-wmv":"video","video/x-msvideo":"video","video/x-matroska":"video","video/3gpp":"video","video/3gpp2":"video","audio/flac":"video","audio/midi":"video","audio/mpeg":"video","audio/mpegurl":"video","audio/ogg":"video","audio/x-aiff":"video","audio/x-mpegurl":"video","audio/x-ms-wma":"video","audio/x-wav":"video"},constructor:function(config){var me=this;this.callParent(arguments),me.receiverStore=Ext.create("Ext.data.Store",{autoLoad:!1,model:"Fbx.os.lib.AirMediaReceiverModel",remoteSort:!1,remoteFilter:!1})},getReceivers:function(callback){this.receiverStore.load({callback:callback})},knownPasswords:{},playMedia:function(receiver,media_type,media,password){var me=this,target=receiver.get("name");password||(password=me.knownPasswords[target]);var url=FbxConf.apiBaseUrl+"airmedia/receivers/"+encodeURIComponent(target)+"/",jsonData={action:"start",media_type:media_type,media:media};password&&""!=password&&(jsonData.password=password),Ext.Ajax.request({url:url,method:"POST",jsonData:jsonData,silentError:!0,success:function(response){me.knownPasswords[target]=password},failure:function(response,options){"unauthorized"==response.jsonData.error_code?(me.knownPasswords[target]=void 0,Ext.Msg.prompt("Mot de passe airmedia","Le périphérique "+Ext.String.htmlEncode(target)+" demande un mot de passe :",function(btnId,value){"ok"==btnId&&me.playMedia(receiver,media_type,media,value)})):Ext.Msg.alert("Erreur",response.jsonData.msg)}})}});Ext.define("Fbx.os.app.settings.wifi.WifiBssModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"phy_id",type:"int"},{name:"status",type:"object"},{name:"config",type:"object"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/bss/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Ext.ux.grid.filter.Filter",{extend:"Ext.util.Observable",active:!1,dataIndex:null,menu:null,updateBuffer:500,constructor:function(config){Ext.apply(this,config),this.addEvents("activate","deactivate","serialize","update"),Ext.ux.grid.filter.Filter.superclass.constructor.call(this),this.menu=this.createMenu(config),this.init(config),config&&config.value&&(this.setValue(config.value),this.setActive(!1!==config.active,!0),delete config.value)},destroy:function(){this.menu&&this.menu.destroy(),this.clearListeners()},init:Ext.emptyFn,createMenu:function(config){return config.plain=!0,Ext.create("Ext.menu.Menu",config)},getValue:Ext.emptyFn,setValue:Ext.emptyFn,isActivatable:function(){return!0},getSerialArgs:Ext.emptyFn,validateRecord:function(){return!0},serialize:function(){var args=this.getSerialArgs();return this.fireEvent("serialize",args,this),args},fireUpdate:function(){this.active&&this.fireEvent("update",this),this.setActive(this.isActivatable())},setActive:function(active,suppressEvent){this.active!=active&&(this.active=active,!0!==suppressEvent&&this.fireEvent(active?"activate":"deactivate",this))}});Ext.define("Fbx.os.gui.grid.column.PercentColumn",{extend:"Ext.grid.column.Template",alias:"widget.percentcolumn",requires:["Ext.util.Format"],sortType:"asFloat",dataIndex:"progress",doneImg:"resources/images/fbx/progressbar-static.gif",runningImg:"resources/images/fbx/progressbar.gif",disableAnimation:!1,constructor:function(cfg){var me=this;me.callParent(arguments),me.renderer=function(value,p,record){var data=Ext.apply({},record.data,record.getAssociatedData());return data.progress=record.get(me.dataIndex),void 0===data.running&&(data.running=data.progress<100),data.borderColor=me.borderColor,data.extraCls="",!me.disableAnimation&&data.running||(data.extraCls="nostripes"),data.progressColor||(data.progressColor=data.progress<100?"blue":""),void 0==data.beforeTxt&&(data.beforeTxt=""),void 0==data.txtColor&&(data.txtColor=data.progress>50?"#FFF":"#000"),me.tpl.apply(data)}},tpl:'<tpl if="beforeTxt"><div class="anim-before">{beforeTxt:htmlEncode}</div></tpl><tpl if="progress &gt;= 0"><div class="animprogress {extraCls} {progressColor}"><span style="width: {[Ext.util.Format.number(values.progress, "0%")]}"></span><div class="pct" style="color: {txtColor};">{[Ext.util.Format.number(values.progress, "0.00%")]}</div></div></tpl><tpl if="progress &lt; 0">Indisponible</tpl>'});Ext.define("Fbx.os.gui.wizard.WizardStep",{extend:"Ext.container.Container",alias:"widget.wizardStep",preventHeader:!0,layout:"fit",width:"100%",height:"100%",config:{title:""},initComponent:function(){this.callParent(arguments)},canGoNext:function(){return console.warn("[Wizard] canGoNext should be overriden"),!1}});Ext.define("Fbx.ux.mixin.CtxMenuMixin",{constructor:function(){var me=this;this.on("itemcontextmenu",function(grid,rec,item,index,event,eOpts){event.stopEvent();var selModel=grid.getSelectionModel();selModel.isSelected(rec)||(selModel.select(rec,!1,!1),me.rememberSelection&&me.rememberSelection());var ctxMenu=me.getCtxMenu();ctxMenu&&ctxMenu.showAt(event.xy)},this,{priority:1}),this.on("itemcontextmenu",function(grid,record,item,index,event,eOpts){return!1},this,{priority:-999}),this.on("containercontextmenu",function(grid,event,eOpts){event.stopEvent();var ctxMenu=me.getCtxMenu();ctxMenu&&ctxMenu.showAt(event.xy)})},getCtxMenu:function(){return null},getSelectedRecord:function(){return this.refreshSelection&&(this.refreshSelection(),this.__selectedRecords)?__selectedRecords:this.getSelectionModel().getSelection()},destroy:function(){this.contextMenu&&this.contextMenu.destroy(),this.callParent()}});Ext.define("Fbx.os.app.contacts.ContactGroup",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"name",type:"string"},{name:"nb_contact",type:"int"}],validations:[{type:"length",field:"name",max:64}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"group/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.downloader.TaskLogTab",{extend:"Ext.panel.Panel",requires:["Ext.button.Split"],autoScroll:!0,title:"",statics:{logLevelExtractor:/^(\d+-\d+-\d+ \d+:\d+:\d+ )(\w+): (.*)$/,logLevels:{dbg:{color:"#474747",level:1},info:{color:"black",level:2},notice:{color:"black",level:3},warn:{color:"tomato",level:4},err:{color:"red",level:5},crit:{color:"red",level:6},alert:{color:"red",level:7},emerg:{color:"purple",level:8}}},initComponent:function(){var me=this;me.minLevel=1,me.autoRefresh=!0,Ext.applyIf(me,{html:"",bbar:["->",{xtype:"splitbutton",text:"Niveau de logs",menu:{items:[{text:"Debug",handler:function(){me.minLevel=1,me.refreshLogs()}},{text:"Warning",handler:function(){me.minLevel=4,me.refreshLogs()}},{text:"Erreurs",handler:function(){me.minLevel=5,me.refreshLogs()}}]}},{xtype:"button",text:"Rafraîchissement automatique",iconCls:"btn-arrow-refresh",enableToggle:!0,pressed:!0,handler:function(btn){me.autoRefresh=btn.pressed,me.autoRefresh&&me.refreshLogs()}}]}),me.callParent(arguments)},prevId:-1,parseLogs:function(lines){var me=this,log="";for(var i in lines){var l=lines[i],matches=l.match(Fbx.os.app.downloader.TaskLogTab.logLevelExtractor);if(matches){var ts=matches[1],level=matches[2],msg=matches[3],levelInfo=Fbx.os.app.downloader.TaskLogTab.logLevels[level];levelInfo&&levelInfo.level>=me.minLevel&&(log+='<pre style="color: '+levelInfo.color+';">'+Ext.String.htmlEncode(ts+msg)+"</pre>")}}me.update(log),me.getEl().selectable(),me.autoRefresh&&me.scrollBy(0,1/0,!1)},refreshLogs:function(){var me=this;me.rec.getLogs(function(logs){var lines=logs.split("\n");me.parseLogs(lines)})},setRecord:function(rec){var me=this;rec.getId()!=me.prevId&&(me.update(""),me.prevId=rec.getId(),me.rec=rec),me.autoRefresh&&me.refreshLogs()}});Ext.define("Ext.ux.event.Recorder",function(Recorder){function apply(){var i,a=arguments,n=a.length,obj={kind:"other"};for(i=0;i<n;++i)Ext.apply(obj,arguments[i]);return obj.alt&&!obj.event&&(obj.event=obj.alt),obj}function key(extra){return apply({kind:"keyboard",modKeys:!0,key:!0},extra)}function mouse(extra){return apply({kind:"mouse",button:!0,modKeys:!0,xy:!0},extra)}var eventsToRecord={keydown:key(),keypress:key(),keyup:key(),dragmove:mouse({alt:"mousemove",pageCoords:!0,whileDrag:!0}),mousemove:mouse({pageCoords:!0}),mouseover:mouse(),mouseout:mouse(),click:mouse(),wheel:mouse({wheel:!0}),mousedown:mouse({press:!0}),mouseup:mouse({release:!0}),scroll:apply({listen:!1}),focus:apply(),blur:apply()};for(var key in eventsToRecord)eventsToRecord[key].event||(eventsToRecord[key].event=key);return eventsToRecord.wheel.event=null,{extend:"Ext.ux.event.Driver",eventsToRecord:eventsToRecord,ignoreIdRegEx:/ext-gen(?:\d+)/,inputRe:/^(input|textarea)$/i,constructor:function(config){var me=this,events=config&&config.eventsToRecord;events&&(me.eventsToRecord=Ext.apply(Ext.apply({},me.eventsToRecord),events),delete config.eventsToRecord),me.callParent(arguments),me.clear(),me.modKeys=[],me.attachTo=me.attachTo||window},clear:function(){this.eventsRecorded=[]},listenToEvent:function(event){var me=this,el=me.attachTo.document.body,fn=function(){return me.onEvent.apply(me,arguments)},cleaner={};return el.attachEvent&&el.ownerDocument.documentMode<10?(event="on"+event,el.attachEvent(event,fn),cleaner.destroy=function(){fn&&(el.detachEvent(event,fn),fn=null)}):(el.addEventListener(event,fn,!0),cleaner.destroy=function(){fn&&(el.removeEventListener(event,fn,!0),fn=null)}),cleaner},coalesce:function(rec,ev){var me=this,events=me.eventsRecorded,length=events.length,tail=length&&events[length-1],tail2=length>1&&events[length-2],tail3=length>2&&events[length-3];if(!tail)return!1;if("mousemove"===rec.type){if("mousemove"===tail.type&&rec.ts-tail.ts<200)return rec.ts=tail.ts,events[length-1]=rec,!0}else if("click"===rec.type){if(tail2&&"mouseup"===tail.type&&"mousedown"===tail2.type&&rec.button==tail.button&&rec.button==tail2.button&&rec.target==tail.target&&rec.target==tail2.target&&me.samePt(rec,tail)&&me.samePt(rec,tail2))return events.pop(),tail2.type="mduclick",!0}else if("keyup"===rec.type)if(tail2&&"keypress"===tail.type&&"keydown"===tail2.type){if(rec.target===tail.target&&rec.target===tail2.target)return events.pop(),tail2.type="type",tail2.text=String.fromCharCode(tail.charCode),delete tail2.charCode,delete tail2.keyCode,tail3&&"type"===tail3.type&&tail3.text&&tail3.target===tail2.target&&(tail3.text+=tail2.text,events.pop()),!0}else{if(me.completeKeyStroke(tail,rec))return tail.type="type",me.completeSpecialKeyStroke(ev.target,tail,rec),!0;if("scroll"===tail.type&&me.completeKeyStroke(tail2,rec))return tail2.type="type",me.completeSpecialKeyStroke(ev.target,tail2,rec),events.pop(),events.pop(),events.push(tail,tail2),!0}return!1},completeKeyStroke:function(down,up){return!(!down||"keydown"!==down.type||down.keyCode!==up.keyCode)&&(delete down.charCode,!0)},completeSpecialKeyStroke:function(target,down,up){var key=this.specialKeysByCode[up.keyCode];return!(!key||!this.inputRe.test(target.tagName))&&(delete down.keyCode,down.key=key,down.selection=this.getTextSelection(target),down.selection[0]===down.selection[1]&&(down.caret=down.selection[0],delete down.selection),!0)},getElementXPath:function(el){var count,sibling,t,tag,me=this,good=!1,xpath=[];for(t=el;t;t=t.parentNode){if(t==me.attachTo.document.body){xpath.unshift("~"),good=!0;break}if(t.id&&!me.ignoreIdRegEx.test(t.id)){xpath.unshift("#"+t.id),good=!0;break}for(count=1,sibling=t;sibling=sibling.previousSibling;)sibling.tagName==t.tagName&&++count;tag=t.tagName.toLowerCase(),count<2?xpath.unshift(tag):xpath.unshift(tag+"["+count+"]")}return good?xpath.join("/"):null},getRecordedEvents:function(){return this.eventsRecorded},onEvent:function(ev){var root,modKeys,elXY,xy,me=this,e=Ext.EventObject.setEvent(ev),info=me.eventsToRecord[e.type],rec={type:e.type,ts:me.getTimestamp(),target:me.getElementXPath(e.target)};info&&rec.target&&(root=e.target.ownerDocument,(root=root.defaultView||root.parentWindow)===me.attachTo&&(me.eventsToRecord.scroll&&me.syncScroll(e.target),info.xy&&(xy=e.getXY(),info.pageCoords||!rec.target?(rec.px=xy[0],rec.py=xy[1]):(elXY=Ext.fly(e.getTarget()).getXY(),xy[0]-=elXY[0],xy[1]-=elXY[1],rec.x=xy[0],rec.y=xy[1])),info.button&&("buttons"in ev?rec.button=ev.buttons:null==ev.which?rec.button=ev.button<2?1:4==ev.button?4:2:ev.which?rec.button=ev.which<2?1:2==ev.which?4:2:rec.button=0,!rec.button&&info.whileDrag)||(info.wheel&&(rec.type="wheel","wheel"===info.event?(rec.dx=ev.deltaX,rec.dy=ev.deltaY):"number"==typeof ev.wheelDeltaX?(rec.dx=-.025*ev.wheelDeltaX,rec.dy=-.025*ev.wheelDeltaY):ev.wheelDelta?rec.dy=-.025*ev.wheelDelta:ev.detail&&(rec.dy=ev.detail)),info.modKeys&&(me.modKeys[0]=e.altKey?"A":"",me.modKeys[1]=e.ctrlKey?"C":"",me.modKeys[2]=e.metaKey?"M":"",me.modKeys[3]=e.shiftKey?"S":"",(modKeys=me.modKeys.join(""))&&(rec.modKeys=modKeys)),info.key&&(rec.charCode=e.getCharCode(),rec.keyCode=e.getKey()),me.coalesce(rec,e)?me.fireEvent("coalesce",me,rec):(me.eventsRecorded.push(rec),me.fireEvent("add",me,rec)))))},onStart:function(){var me=this,ddm=me.attachTo.Ext.dd.DragDropManager,evproto=me.attachTo.Ext.EventObjectImpl.prototype,special=[];Recorder.prototype.eventsToRecord.wheel.event="onwheel"in me.attachTo.document?"wheel":"mousewheel",me.listeners=[],Ext.Object.each(me.eventsToRecord,function(name,value){value&&!1!==value.listen&&(value.event||(value.event=name),value.alt&&value.alt!==name?me.eventsToRecord[value.alt]||special.push(value):me.listeners.push(me.listenToEvent(value.event)))}),Ext.each(special,function(info){me.eventsToRecord[info.alt]=info,me.listeners.push(me.listenToEvent(info.alt))}),me.ddmStopEvent=ddm.stopEvent,ddm.stopEvent=Ext.Function.createSequence(ddm.stopEvent,function(e){me.onEvent(e)}),me.evStopEvent=evproto.stopEvent,evproto.stopEvent=Ext.Function.createSequence(evproto.stopEvent,function(){me.onEvent(this)})},onStop:function(){var me=this;Ext.destroy(me.listeners),me.listeners=null,me.attachTo.Ext.dd.DragDropManager.stopEvent=me.ddmStopEvent,me.attachTo.Ext.EventObjectImpl.prototype.stopEvent=me.evStopEvent},samePt:function(pt1,pt2){return pt1.x==pt2.x&&pt1.y==pt2.y},syncScroll:function(el){for(var oldX,oldY,x,y,scrolled,rec,me=this,ts=me.getTimestamp(),p=el;p&&(oldX=p.$lastScrollLeft,oldY=p.$lastScrollTop,x=p.scrollLeft,y=p.scrollTop,scrolled=!1,oldX!==x&&(x&&(scrolled=!0),p.$lastScrollLeft=x),oldY!==y&&(y&&(scrolled=!0),p.$lastScrollTop=y),scrolled&&(me.eventsRecorded.push(rec={type:"scroll",target:me.getElementXPath(p),ts:ts,pos:[x,y]}),me.fireEvent("add",me,rec)),"BODY"!==p.tagName);p=p.parentNode);}}});Ext.define("Fbx.ux.grid.plugin.KeyScrollPlugin",{extend:"Ext.AbstractPlugin",alias:"plugin.keyscrollplugin",mixins:{observable:"Ext.util.Observable"},fieldName:"name",currentStr:"",lastPress:0,lastChar:"",lastIndex:0,init:function(grid){var me=this;me.grid=grid,me.mon(grid,"boxready",function(){var el=grid.body;me.mon(el,"keypress",function(e){var charCode=e.getCharCode();if(e.isSpecialKey())return me.currentStr="",void(me.lastChar="");var c=String.fromCharCode(charCode).toLowerCase(),now=new Date;now=now.getTime(),now-me.lastPress>1e3?me.currentStr=c:me.currentStr+=c;var store=me.grid.getStore(),selModel=me.grid.getSelectionModel(),rec=store.findRecord(me.fieldName,me.currentStr,0,!1,!1,!1);rec||c==me.lastChar&&(rec=store.findRecord(me.fieldName,c,me.lastIndex+1,!1,!1,!1),rec||(rec=store.findRecord(me.fieldName,c,0,!1,!1,!1)),me.lastIndex=rec?store.indexOf(rec):0),rec&&(selModel.setLastFocused(rec),selModel.select(rec,!1,!1)),me.lastPress=now,me.lastChar=c})})}});Ext.define("Fbx.os.app.explorer.FsDropZoneMixin",{requires:["Ext.menu.Menu"],ctxMenu:null,files:[],destDir:"",handleDrop:function(sourceRecords,destDir){var me=this;me.files=[],me.destDir=destDir,Fbx.os.app.explorer.FsTask.isValidDrop(sourceRecords,me.destDir)&&(Ext.Array.each(sourceRecords,function(rec){var curPath=rec.get("path");Ext.Array.push(me.files,curPath)}),me.getCtxMenu().showAt(Ext.EventObject.getXY()))},doFsOp:function(type,conflictMode){var me=this;me.getIndicator().hide(),"mv"==type?Fbx.os.app.explorer.FsTask.moveFiles(me.files,me.destDir,conflictMode,!1):"cp"==type&&Fbx.os.app.explorer.FsTask.copyFiles(me.files,me.destDir,conflictMode)},getCtxMenu:function(){var me=this;return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Déplacer (écraser)",iconCls:"btn-move-to-folder",handler:function(){me.doFsOp("mv","overwrite")}},{text:"Déplacer (garder les deux versions)",iconCls:"btn-move-to-folder",handler:function(){me.doFsOp("mv","both")}},{text:"Déplacer (garder le plus récent)",iconCls:"btn-move-to-folder",handler:function(){me.doFsOp("mv","recent")}},{text:"Copier (écraser)",iconCls:"btn-folder-add",handler:function(){me.doFsOp("cp","overwrite")}},{text:"Copier (garder les deux versions)",iconCls:"btn-folder-add",handler:function(){me.doFsOp("cp","both")}},{text:"Copier (garder le plus récent)",iconCls:"btn-folder-add",handler:function(){me.doFsOp("cp","recent")}}]})),me.ctxMenu}});Ext.define("Fbx.os.gui.grid.column.DeferedTemplatedColumn",{extend:"Ext.grid.column.Template",alias:"widget.deferedtemplated",partialRender:!0,beforePartialRender:function(data){return data},beforeFullRender:function(data){return data},defaultRenderer:function(value,meta,record){var me=this,data=Ext.apply({},record.data,record.getAssociatedData());return data=me.partialRender?me.beforePartialRender(data):me.beforeFullRender(data),me.tpl.apply(data)}});Ext.define("Fbx.os.app.pvr.FrecordModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"byte_size",type:"int"},{name:"secure",type:"bool"},{name:"state",type:"string"},{name:"name",type:"string"},{name:"subname",type:"string"},{name:"channel_name",type:"string"},{name:"start",type:"int"},{name:"end",type:"int"},{name:"broadcast_type",type:"string"},{name:"channel_quality",type:"string"},{name:"channel_uuid",type:"string"},{name:"channel_type",type:"string"},{name:"error",type:"string"},{name:"enabled",type:"bool"},{name:"channel",type:"auto",persist:!1,convert:function(r,rec){return rec.raw.channel_uuid&&""!=rec.raw.channel_uuid?Fbx.os.app.tv.ChannelDb.channels[rec.raw.channel_uuid]:null}},{name:"day",type:"string",persist:!1,convert:function(r,rec){return Fbx.os.lib.FbxUtils.niceEventDay(new Date(1e3*rec.get("start")))}},{name:"logo_url",type:"string",persist:!1,convert:function(r,rec){var channel=rec.get("channel");return channel?channel.logo_url:"resources/images/fbx/logo_placeholder.png"}},{name:"iconCls",type:"string",persist:!1,convert:function(r,rec){var name=rec.get("state");return rec.get("conflict")&&(name="running"==name?"running_conflict":"conflict"),"pvr-sprite pvr-"+name}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"pvr/finished/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.gui.chart.FlotRrdChart",{extend:"Ext.Component",alias:"widget.flotrrdchart",requires:[],config:{autoRefresh:!1,refreshRate:1e4,db:"temp",fields:[{name:"cpum",label:"CpuM"},{name:"cpub",label:"CpuB"},{name:"sw",label:"SW"},{name:"hdd",label:"HDD"},{name:"femto",label:"Femto"},{name:"fan_speed",label:"Ventilateur",yaxis:2}],yaxes:[{min:0,axisLabel:"Température °C",unit:"°C"},{min:0,position:"right",axisLabel:"Tours par minute",unit:"RPM"}],precision:100,valueScale:1,legendPosition:"sw",period:3600,suspendRefresh:!1,isLoading:!1,start:0,end:0,lastEnd:0,nbPointMax:500,isRate:!1},rateFormatter:function(val,axis){return val>=1e6?(val/1e6).toFixed(1)+" Mo/s":val>=1e3?(val/1e3).toFixed(axis.tickDecimals)+" ko/s":val.toFixed(axis.tickDecimals)+" o/s"},initComponent:function(){var me=this;me.dataInfoId=Ext.id(),me.flotId=Ext.id(),me.html='<div id="'+me.dataInfoId+'" class="flot-dataInfo"></div><div class="flot-placeholder" id="'+me.flotId+'"></div>',this.callParent(arguments),me.autoRefresh&&me.refreshRate&&(me.timer=setInterval(function(){me.isLoading||me.suspendRefresh||me.loadData()},me.refreshRate));for(var i in me.fields)me.fields[i].selected=!0;me.on("boxready",function(){me.loadData(),me.dataInfo=$("#"+me.dataInfoId),me.flotPlaceholder=$("#"+me.flotId),me.flotPlaceholder.bind("plothover",function(event,pos,item){if(item){var text="";item.series.label&&(text+=item.series.label+": "),me.isRate?text+=" "+Fbx.os.lib.FbxUtils.rate(item.datapoint[1]):(text+=item.datapoint[1],item.series.yaxis.options.unit&&(text+=" "+item.series.yaxis.options.unit)),me.dataInfo.text(text),me.dataInfo.show();var parentOffset=me.flotPlaceholder.offset(),left=item.pageX+5,top=item.pageY-5-me.dataInfo.outerHeight();top<parentOffset.top&&(top=item.pageY+15);var w=me.dataInfo.outerWidth();left+w>parentOffset.left+me.flotPlaceholder.width()&&(left=item.pageX-5-w),me.dataInfo.offset({top:top,left:left}),me.dataInfo.css("border-color",item.series.color);me.flot.getOptions().crosshair.color=item.series.color,me.flot.lockCrosshair({x:item.datapoint[0],y:item.datapoint[1]})}else me.dataInfo.hide(),me.flot.clearCrosshair()})}),me.on("resize",function(char,width,height){width>0&&height>0&&me.plot()})},setPeriod:function(period){var me=this;me.period=period,me.loadData(!0)},tickUnitFormater:function(val,axis){return val.toFixed(axis.tickDecimals)+" "+axis.options.unit},plot:function(){var me=this,plotData=[],paris=-Fbx.os.lib.FbxUtils.getParisMoment().utcOffset(),local=(new Date).getTimezoneOffset(),offset=local-paris;for(var i in me.fields){var f=me.fields[i];if(f.selected)plotData.push(f);else{var emptyCopy={};for(j in f)"data"!=j&&(emptyCopy[j]=f[j]);emptyCopy.data=[],plotData.push(emptyCopy)}}var options={grid:{hoverable:!0,labelMargin:10,backgroundColor:{colors:["#fff","#eee"]}},xaxis:{mode:"time",timezone:"browser",min:1e3*me.start+60*offset*1e3,max:1e3*me.end+60*offset*1e3,monthNames:["Jan","Fév","Mars","Avr","Mai","Juin","Juil","Aout","Sept","Oct","Nov","Déc"],dayNames:["dim","lun","mar","mer","jeu","ven","sam"]},yaxes:me.yaxes,crosshair:{mode:"x",lineWidth:2},legend:{position:me.legendPosition,backgroundColor:"#fff",show:!0,labelFormatter:function(label,series){var lblCls="flot-legend-label";return series.selected&&(lblCls+=" flot-legend-label-selected "),'<span class="'+lblCls+'" >'+label+"</span>"}},series:{}};me.flot=$.plot(me.flotPlaceholder,plotData,options),$("#"+me.flotId+" .flot-legend-label").each(function(idx,item){$(item).bind("click",function(){me.toggle(idx)})}),me.flot.lockCrosshair({x:0,y:0}),me.flot.clearCrosshair()},toggle:function(idx){var me=this,needReload=!1;me.fields[idx]&&(me.fields[idx].selected?me.fields[idx].selected=!1:(me.fields[idx].data.length||(needReload=!0),me.fields[idx].selected=!0)),needReload?me.loadData(!0):me.plot()},loadData:function(discardData){var me=this,paris=-Fbx.os.lib.FbxUtils.getParisMoment().utcOffset(),local=(new Date).getTimezoneOffset(),offset=local-paris;if(!me.suspendRefresh&&!me.isLoading){me.isLoading=!0,discardData?me.lastEnd=0:me.lastEnd||(discardData=!0);var now=new Date;me.end=Math.ceil(now.getTime()/1e3),me.start=me.end-me.period;var fieldsNames=[];for(var i in me.fields)discardData&&(me.fields[i].data=[]),me.fields[i].selected?fieldsNames.push(me.fields[i].name):me.fields[i].data=[];for(var i in me.yaxes)me.isRate?me.yaxes[i].tickFormatter=me.rateFormatter:me.yaxes[i].unit&&(me.yaxes[i].tickFormatter=me.tickUnitFormater);var loadStart=discardData?me.start:me.lastEnd;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"rrd/",method:"POST",autorefresh:!0,jsonData:{db:me.db,precision:me.precision,date_start:loadStart,date_end:me.end,fields:fieldsNames},callback:function(){me.isLoading=!1},success:function(response){var jsonData=response.jsonData;if(!me.suspendRefresh){var data=jsonData.result,minInterval=0,nextAcceptable=me.start;me.nbPointMax&&discardData&&data.data.length&&(minInterval=(data.data[data.data.length-1].time-data.data[0].time)/me.nbPointMax);for(var i in data.data){var p=data.data[i],time=p.time;if(time>me.lastEnd&&!(minInterval&&time<nextAcceptable&&1!=Object.keys(p).length)){me.lastEnd=time,nextAcceptable=time+minInterval;for(var j in me.fields){var f=me.fields[j];if(f.selected)if(void 0!==p[f.name]){discardData||me.nbPointMax&&f.data.length>=me.nbPointMax&&f.data.shift();var t=1e3*time+60*offset*1e3;f.data.push([t,p[f.name]/me.precision/me.valueScale])}else null!==f.data[f.data.length-1]&&f.data.push(null)}}}me.plot()}}})}},destroy:function(){return this.suspendRefresh=!0,this.timer&&clearInterval(this.timer),this.callParent(arguments)}});Ext.define("Fbx.ux.toolbar.ButtonPathToolbar",{extend:"Ext.toolbar.Toolbar",requires:["Ext.toolbar.TextItem"],alias:"widget.buttonpathtoolbar",path:"",autoScroll:!0,initComponent:function(){var me=this;me.callParent(arguments),me.addEvents("pathchanged","toggleview"),me.on("afterlayout",function(){me.checkOverflow()}),me.on("resize",function(tb,width,height,oldWidth,oldHeight,eOpts){width>oldWidth&&(me.suspendLayout=!0,me.items.each(function(item){item&&!item.isVisible()&&item.show()}),me.suspendLayout=!1,me.updateLayout())}),me.on("render",function(){me.mon(me.getEl(),"click",function(){me.fireEvent("toggleview")})})},setPath:function(newPath){var me=this;newPath!=me.path&&(me.path=newPath,me.refreshButtons(),me.fireEvent("pathchanged",me.path))},genericHandler:function(btn,e){this.setPath(btn.path),e.stopEvent()},refreshButtons:function(){var me=this;me.suspendLayout=!0,me.removeAll();var parts=Fbx.os.lib.FbxUtils.base64_decode(me.path).split("/"),curPath="",elems=[];for(p in parts)curPath+=parts[p],(parts[p]||0==p)&&Ext.Array.push(elems,"/",{xtype:"button",text:parts[p]?parts[p]:"Ma Freebox",path:Fbx.os.lib.FbxUtils.base64_encode(curPath),handler:me.genericHandler,scope:me}),curPath+="/";me.add(elems),me.suspendLayout=!1},checkOverflow:function(){var me=this,innerSize=me.getEl().child("div").getSize(),size=me.getSize();innerSize.width>size.width&&me.items.each(function(item){if(item&&item.isVisible())return item.hide(),!1})}});Ext.define("Fbx.os.lib.CountryStore",{extend:"Ext.data.Store",fields:[{type:"string",name:"iso3166-1"},{type:"string",name:"name"},{type:"string",name:"name"},{type:"string",name:"iso-alpha2"}],sorters:["name"],data:[{"iso-id":"","iso-alpha2":"","iso3166-1":"",name:"Aucun"},{"iso-id":"4","iso-alpha2":"AFG","iso3166-1":"AF",name:"Afghanistan"},{"iso-id":"710","iso-alpha2":"ZAF","iso3166-1":"ZA",name:"Afrique du sud"},{"iso-id":"248","iso-alpha2":"ALA","iso3166-1":"AX",name:"Åland, îles"},{"iso-id":"8","iso-alpha2":"ALB","iso3166-1":"AL",name:"Albanie"},{"iso-id":"12","iso-alpha2":"DZA","iso3166-1":"DZ",name:"Algérie"},{"iso-id":"276","iso-alpha2":"DEU","iso3166-1":"DE",name:"Allemagne"},{"iso-id":"20","iso-alpha2":"AND","iso3166-1":"AD",name:"Andorre"},{"iso-id":"24","iso-alpha2":"AGO","iso3166-1":"AO",name:"Angola"},{"iso-id":"660","iso-alpha2":"AIA","iso3166-1":"AI",name:"Anguilla"},{"iso-id":"10","iso-alpha2":"ATA","iso3166-1":"AQ",name:"Antarctique"},{"iso-id":"28","iso-alpha2":"ATG","iso3166-1":"AG",name:"Antigua-et-barbuda"},{"iso-id":"682","iso-alpha2":"SAU","iso3166-1":"SA",name:"Arabie saoudite"},{"iso-id":"32","iso-alpha2":"ARG","iso3166-1":"AR",name:"Argentine"},{"iso-id":"51","iso-alpha2":"ARM","iso3166-1":"AM",name:"Arménie"},{"iso-id":"533","iso-alpha2":"ABW","iso3166-1":"AW",name:"Aruba"},{"iso-id":"36","iso-alpha2":"AUS","iso3166-1":"AU",name:"Australie"},{"iso-id":"40","iso-alpha2":"AUT","iso3166-1":"AT",name:"Autriche"},{"iso-id":"31","iso-alpha2":"AZE","iso3166-1":"AZ",name:"Azerbaïdjan"},{"iso-id":"44","iso-alpha2":"BHS","iso3166-1":"BS",name:"Bahamas"},{"iso-id":"48","iso-alpha2":"BHR","iso3166-1":"BH",name:"Bahreïn"},{"iso-id":"50","iso-alpha2":"BGD","iso3166-1":"BD",name:"Bangladesh"},{"iso-id":"52","iso-alpha2":"BRB","iso3166-1":"BB",name:"Barbade"},{"iso-id":"112","iso-alpha2":"BLR","iso3166-1":"BY",name:"Bélarus"},{"iso-id":"56","iso-alpha2":"BEL","iso3166-1":"BE",name:"Belgique"},{"iso-id":"84","iso-alpha2":"BLZ","iso3166-1":"BZ",name:"Belize"},{"iso-id":"204","iso-alpha2":"BEN","iso3166-1":"BJ",name:"Bénin"},{"iso-id":"60","iso-alpha2":"BMU","iso3166-1":"BM",name:"Bermudes"},{"iso-id":"64","iso-alpha2":"BTN","iso3166-1":"BT",name:"Bhoutan"},{"iso-id":"68","iso-alpha2":"BOL","iso3166-1":"BO",name:"Bolivie, état plurinational de"},{"iso-id":"535","iso-alpha2":"BES","iso3166-1":"BQ",name:"Bonaire, saint-eustache et saba"},{"iso-id":"70","iso-alpha2":"BIH","iso3166-1":"BA",name:"Bosnie-herzégovine"},{"iso-id":"72","iso-alpha2":"BWA","iso3166-1":"BW",name:"Botswana"},{"iso-id":"74","iso-alpha2":"BVT","iso3166-1":"BV",name:"Bouvet, île"},{"iso-id":"76","iso-alpha2":"BRA","iso3166-1":"BR",name:"Brésil"},{"iso-id":"96","iso-alpha2":"BRN","iso3166-1":"BN",name:"Brunéi darussalam"},{"iso-id":"100","iso-alpha2":"BGR","iso3166-1":"BG",name:"Bulgarie"},{"iso-id":"854","iso-alpha2":"BFA","iso3166-1":"BF",name:"Burkina faso"},{"iso-id":"108","iso-alpha2":"BDI","iso3166-1":"BI",name:"Burundi"},{"iso-id":"136","iso-alpha2":"CYM","iso3166-1":"KY",name:"Caïmanes, îles"},{"iso-id":"116","iso-alpha2":"KHM","iso3166-1":"KH",name:"Cambodge"},{"iso-id":"120","iso-alpha2":"CMR","iso3166-1":"CM",name:"Cameroun"},{"iso-id":"124","iso-alpha2":"CAN","iso3166-1":"CA",name:"Canada"},{"iso-id":"132","iso-alpha2":"CPV","iso3166-1":"CV",name:"Cap-vert"},{"iso-id":"140","iso-alpha2":"CAF","iso3166-1":"CF",name:"Centrafricaine, république"},{"iso-id":"152","iso-alpha2":"CHL","iso3166-1":"CL",name:"Chili"},{"iso-id":"156","iso-alpha2":"CHN","iso3166-1":"CN",name:"Chine"},{"iso-id":"162","iso-alpha2":"CXR","iso3166-1":"CX",name:"Christmas, île"},{"iso-id":"196","iso-alpha2":"CYP","iso3166-1":"CY",name:"Chypre"},{"iso-id":"166","iso-alpha2":"CCK","iso3166-1":"CC",name:"Cocos (keeling), îles"},{"iso-id":"170","iso-alpha2":"COL","iso3166-1":"CO",name:"Colombie"},{"iso-id":"174","iso-alpha2":"COM","iso3166-1":"KM",name:"Comores"},{"iso-id":"178","iso-alpha2":"COG","iso3166-1":"CG",name:"Congo"},{"iso-id":"180","iso-alpha2":"COD","iso3166-1":"CD",name:"Congo, la république démocratique du"},{"iso-id":"184","iso-alpha2":"COK","iso3166-1":"CK",name:"Cook, îles"},{"iso-id":"410","iso-alpha2":"KOR","iso3166-1":"KR",name:"Corée, république de"},{"iso-id":"408","iso-alpha2":"PRK","iso3166-1":"KP",name:"Corée, république populaire démocratique de"},{"iso-id":"188","iso-alpha2":"CRI","iso3166-1":"CR",name:"Costa rica"},{"iso-id":"384","iso-alpha2":"CIV","iso3166-1":"CI",name:"Côte d'ivoire"},{"iso-id":"191","iso-alpha2":"HRV","iso3166-1":"HR",name:"Croatie"},{"iso-id":"192","iso-alpha2":"CUB","iso3166-1":"CU",name:"Cuba"},{"iso-id":"531","iso-alpha2":"CUW","iso3166-1":"CW",name:"Curaçao"},{"iso-id":"208","iso-alpha2":"DNK","iso3166-1":"DK",name:"Danemark"},{"iso-id":"262","iso-alpha2":"DJI","iso3166-1":"DJ",name:"Djibouti"},{"iso-id":"214","iso-alpha2":"DOM","iso3166-1":"DO",name:"Dominicaine, république"},{"iso-id":"212","iso-alpha2":"DMA","iso3166-1":"DM",name:"Dominique"},{"iso-id":"818","iso-alpha2":"EGY","iso3166-1":"EG",name:"Égypte"},{"iso-id":"222","iso-alpha2":"SLV","iso3166-1":"SV",name:"El salvador"},{"iso-id":"784","iso-alpha2":"ARE","iso3166-1":"AE",name:"Émirats arabes unis"},{"iso-id":"218","iso-alpha2":"ECU","iso3166-1":"EC",name:"Équateur"},{"iso-id":"232","iso-alpha2":"ERI","iso3166-1":"ER",name:"Érythrée"},{"iso-id":"724","iso-alpha2":"ESP","iso3166-1":"ES",name:"Espagne"},{"iso-id":"233","iso-alpha2":"EST","iso3166-1":"EE",name:"Estonie"},{"iso-id":"840","iso-alpha2":"USA","iso3166-1":"US",name:"États-unis"},{"iso-id":"231","iso-alpha2":"ETH","iso3166-1":"ET",name:"Éthiopie"},{"iso-id":"238","iso-alpha2":"FLK","iso3166-1":"FK",name:"Falkland, îles (malvinas)"},{"iso-id":"234","iso-alpha2":"FRO","iso3166-1":"FO",name:"Féroé, îles"},{"iso-id":"242","iso-alpha2":"FJI","iso3166-1":"FJ",name:"Fidji"},{"iso-id":"246","iso-alpha2":"FIN","iso3166-1":"FI",name:"Finlande"},{"iso-id":"250","iso-alpha2":"FRA","iso3166-1":"FR",name:"France"},{"iso-id":"266","iso-alpha2":"GAB","iso3166-1":"GA",name:"Gabon"},{"iso-id":"270","iso-alpha2":"GMB","iso3166-1":"GM",name:"Gambie"},{"iso-id":"268","iso-alpha2":"GEO","iso3166-1":"GE",name:"Géorgie"},{"iso-id":"239","iso-alpha2":"SGS","iso3166-1":"GS",name:"Géorgie du sud et les îles sandwich du sud"},{"iso-id":"288","iso-alpha2":"GHA","iso3166-1":"GH",name:"Ghana"},{"iso-id":"292","iso-alpha2":"GIB","iso3166-1":"GI",name:"Gibraltar"},{"iso-id":"300","iso-alpha2":"GRC","iso3166-1":"GR",name:"Grèce"},{"iso-id":"308","iso-alpha2":"GRD","iso3166-1":"GD",name:"Grenade"},{"iso-id":"304","iso-alpha2":"GRL","iso3166-1":"GL",name:"Groenland"},{"iso-id":"312","iso-alpha2":"GLP","iso3166-1":"GP",name:"Guadeloupe"},{"iso-id":"316","iso-alpha2":"GUM","iso3166-1":"GU",name:"Guam"},{"iso-id":"320","iso-alpha2":"GTM","iso3166-1":"GT",name:"Guatemala"},{"iso-id":"831","iso-alpha2":"GGY","iso3166-1":"GG",name:"Guernesey"},{"iso-id":"324","iso-alpha2":"GIN","iso3166-1":"GN",name:"Guinée"},{"iso-id":"624","iso-alpha2":"GNB","iso3166-1":"GW",name:"Guinée-bissau"},{"iso-id":"226","iso-alpha2":"GNQ","iso3166-1":"GQ",name:"Guinée équatoriale"},{"iso-id":"328","iso-alpha2":"GUY","iso3166-1":"GY",name:"Guyana"},{"iso-id":"254","iso-alpha2":"GUF","iso3166-1":"GF",name:"Guyane française"},{"iso-id":"332","iso-alpha2":"HTI","iso3166-1":"HT",name:"Haïti"},{"iso-id":"334","iso-alpha2":"HMD","iso3166-1":"HM",name:"Heard, île et mcdonald, îles"},{"iso-id":"340","iso-alpha2":"HND","iso3166-1":"HN",name:"Honduras"},{"iso-id":"344","iso-alpha2":"HKG","iso3166-1":"HK",name:"Hong kong"},{"iso-id":"348","iso-alpha2":"HUN","iso3166-1":"HU",name:"Hongrie"},{"iso-id":"833","iso-alpha2":"IMN","iso3166-1":"IM",name:"Île de man"},{"iso-id":"581","iso-alpha2":"UMI","iso3166-1":"UM",name:"Îles mineures éloignées des états-unis"},{"iso-id":"92","iso-alpha2":"VGB","iso3166-1":"VG",name:"Îles vierges britanniques"},{"iso-id":"850","iso-alpha2":"VIR","iso3166-1":"VI",name:"Îles vierges des états-unis"},{"iso-id":"356","iso-alpha2":"IND","iso3166-1":"IN",name:"Inde"},{"iso-id":"360","iso-alpha2":"IDN","iso3166-1":"ID",name:"Indonésie"},{"iso-id":"364","iso-alpha2":"IRN","iso3166-1":"IR",name:"Iran, république islamique d'"},{"iso-id":"368","iso-alpha2":"IRQ","iso3166-1":"IQ",name:"Iraq"},{"iso-id":"372","iso-alpha2":"IRL","iso3166-1":"IE",name:"Irlande"},{"iso-id":"352","iso-alpha2":"ISL","iso3166-1":"IS",name:"Islande"},{"iso-id":"376","iso-alpha2":"ISR","iso3166-1":"IL",name:"Israël"},{"iso-id":"380","iso-alpha2":"ITA","iso3166-1":"IT",name:"Italie"},{"iso-id":"388","iso-alpha2":"JAM","iso3166-1":"JM",name:"Jamaïque"},{"iso-id":"392","iso-alpha2":"JPN","iso3166-1":"JP",name:"Japon"},{"iso-id":"832","iso-alpha2":"JEY","iso3166-1":"JE",name:"Jersey"},{"iso-id":"400","iso-alpha2":"JOR","iso3166-1":"JO",name:"Jordanie"},{"iso-id":"398","iso-alpha2":"KAZ","iso3166-1":"KZ",name:"Kazakhstan"},{"iso-id":"404","iso-alpha2":"KEN","iso3166-1":"KE",name:"Kenya"},{"iso-id":"417","iso-alpha2":"KGZ","iso3166-1":"KG",name:"Kirghizistan"},{"iso-id":"296","iso-alpha2":"KIR","iso3166-1":"KI",name:"Kiribati"},{"iso-id":"414","iso-alpha2":"KWT","iso3166-1":"KW",name:"Koweït"},{"iso-id":"418","iso-alpha2":"LAO","iso3166-1":"LA",name:"Lao, république démocratique populaire"},{"iso-id":"426","iso-alpha2":"LSO","iso3166-1":"LS",name:"Lesotho"},{"iso-id":"428","iso-alpha2":"LVA","iso3166-1":"LV",name:"Lettonie"},{"iso-id":"422","iso-alpha2":"LBN","iso3166-1":"LB",name:"Liban"},{"iso-id":"430","iso-alpha2":"LBR","iso3166-1":"LR",name:"Libéria"},{"iso-id":"434","iso-alpha2":"LBY","iso3166-1":"LY",name:"Libyenne, jamahiriya arabe"},{"iso-id":"438","iso-alpha2":"LIE","iso3166-1":"LI",name:"Liechtenstein"},{"iso-id":"440","iso-alpha2":"LTU","iso3166-1":"LT",name:"Lituanie"},{"iso-id":"442","iso-alpha2":"LUX","iso3166-1":"LU",name:"Luxembourg"},{"iso-id":"446","iso-alpha2":"MAC","iso3166-1":"MO",name:"Macao"},{"iso-id":"807","iso-alpha2":"MKD","iso3166-1":"MK",name:"Macédoine, l'ex-république yougoslave de"},{"iso-id":"450","iso-alpha2":"MDG","iso3166-1":"MG",name:"Madagascar"},{"iso-id":"458","iso-alpha2":"MYS","iso3166-1":"MY",name:"Malaisie"},{"iso-id":"454","iso-alpha2":"MWI","iso3166-1":"MW",name:"Malawi"},{"iso-id":"462","iso-alpha2":"MDV","iso3166-1":"MV",name:"Maldives"},{"iso-id":"466","iso-alpha2":"MLI","iso3166-1":"ML",name:"Mali"},{"iso-id":"470","iso-alpha2":"MLT","iso3166-1":"MT",name:"Malte"},{"iso-id":"580","iso-alpha2":"MNP","iso3166-1":"MP",name:"Mariannes du nord, îles"},{"iso-id":"504","iso-alpha2":"MAR","iso3166-1":"MA",name:"Maroc"},{"iso-id":"584","iso-alpha2":"MHL","iso3166-1":"MH",name:"Marshall, îles"},{"iso-id":"474","iso-alpha2":"MTQ","iso3166-1":"MQ",name:"Martinique"},{"iso-id":"480","iso-alpha2":"MUS","iso3166-1":"MU",name:"Maurice"},{"iso-id":"478","iso-alpha2":"MRT","iso3166-1":"MR",name:"Mauritanie"},{"iso-id":"175","iso-alpha2":"MYT","iso3166-1":"YT",name:"Mayotte"},{"iso-id":"484","iso-alpha2":"MEX","iso3166-1":"MX",name:"Mexique"},{"iso-id":"583","iso-alpha2":"FSM","iso3166-1":"FM",name:"Micronésie, états fédérés de"},{"iso-id":"498","iso-alpha2":"MDA","iso3166-1":"MD",name:"Moldova"},{"iso-id":"492","iso-alpha2":"MCO","iso3166-1":"MC",name:"Monaco"},{"iso-id":"496","iso-alpha2":"MNG","iso3166-1":"MN",name:"Mongolie"},{"iso-id":"499","iso-alpha2":"MNE","iso3166-1":"ME",name:"Monténégro"},{"iso-id":"500","iso-alpha2":"MSR","iso3166-1":"MS",name:"Montserrat"},{"iso-id":"508","iso-alpha2":"MOZ","iso3166-1":"MZ",name:"Mozambique"},{"iso-id":"104","iso-alpha2":"MMR","iso3166-1":"MM",name:"Myanmar"},{"iso-id":"516","iso-alpha2":"NAM","iso3166-1":"NA",name:"Namibie"},{"iso-id":"520","iso-alpha2":"NRU","iso3166-1":"NR",name:"Nauru"},{"iso-id":"524","iso-alpha2":"NPL","iso3166-1":"NP",name:"Népal"},{"iso-id":"558","iso-alpha2":"NIC","iso3166-1":"NI",name:"Nicaragua"},{"iso-id":"562","iso-alpha2":"NER","iso3166-1":"NE",name:"Niger"},{"iso-id":"566","iso-alpha2":"NGA","iso3166-1":"NG",name:"Nigéria"},{"iso-id":"570","iso-alpha2":"NIU","iso3166-1":"NU",name:"Niué"},{"iso-id":"574","iso-alpha2":"NFK","iso3166-1":"NF",name:"Norfolk, île"},{"iso-id":"578","iso-alpha2":"NOR","iso3166-1":"NO",name:"Norvège"},{"iso-id":"540","iso-alpha2":"NCL","iso3166-1":"NC",name:"Nouvelle-calédonie"},{"iso-id":"554","iso-alpha2":"NZL","iso3166-1":"NZ",name:"Nouvelle-zélande"},{"iso-id":"86","iso-alpha2":"IOT","iso3166-1":"IO",name:"Océan indien, territoire britannique de l'"},{"iso-id":"512","iso-alpha2":"OMN","iso3166-1":"OM",name:"Oman"},{"iso-id":"800","iso-alpha2":"UGA","iso3166-1":"UG",name:"Ouganda"},{"iso-id":"860","iso-alpha2":"UZB","iso3166-1":"UZ",name:"Ouzbékistan"},{"iso-id":"586","iso-alpha2":"PAK","iso3166-1":"PK",name:"Pakistan"},{"iso-id":"585","iso-alpha2":"PLW","iso3166-1":"PW",name:"Palaos"},{"iso-id":"275","iso-alpha2":"PSE","iso3166-1":"PS",name:"Territoire palestinien"},{"iso-id":"591","iso-alpha2":"PAN","iso3166-1":"PA",name:"Panama"},{"iso-id":"598","iso-alpha2":"PNG","iso3166-1":"PG",name:"Papouasie-nouvelle-guinée"},{"iso-id":"600","iso-alpha2":"PRY","iso3166-1":"PY",name:"Paraguay"},{"iso-id":"528","iso-alpha2":"NLD","iso3166-1":"NL",name:"Pays-bas"},{"iso-id":"604","iso-alpha2":"PER","iso3166-1":"PE",name:"Pérou"},{"iso-id":"608","iso-alpha2":"PHL","iso3166-1":"PH",name:"Philippines"},{"iso-id":"612","iso-alpha2":"PCN","iso3166-1":"PN",name:"Pitcairn"},{"iso-id":"616","iso-alpha2":"POL","iso3166-1":"PL",name:"Pologne"},{"iso-id":"258","iso-alpha2":"PYF","iso3166-1":"PF",name:"Polynésie française"},{"iso-id":"630","iso-alpha2":"PRI","iso3166-1":"PR",name:"Porto rico"},{"iso-id":"620","iso-alpha2":"PRT","iso3166-1":"PT",name:"Portugal"},{"iso-id":"634","iso-alpha2":"QAT","iso3166-1":"QA",name:"Qatar"},{"iso-id":"638","iso-alpha2":"REU","iso3166-1":"RE",name:"Réunion"},{"iso-id":"642","iso-alpha2":"ROU","iso3166-1":"RO",name:"Roumanie"},{"iso-id":"826","iso-alpha2":"GBR","iso3166-1":"GB",name:"Royaume-uni"},{"iso-id":"643","iso-alpha2":"RUS","iso3166-1":"RU",name:"Russie, fédération de"},{"iso-id":"646","iso-alpha2":"RWA","iso3166-1":"RW",name:"Rwanda"},{"iso-id":"732","iso-alpha2":"ESH","iso3166-1":"EH",name:"Sahara occidental"},{"iso-id":"652","iso-alpha2":"BLM","iso3166-1":"BL",name:"Saint-barthélemy"},{"iso-id":"659","iso-alpha2":"KNA","iso3166-1":"KN",name:"Saint-kitts-et-nevis"},{"iso-id":"674","iso-alpha2":"SMR","iso3166-1":"SM",name:"Saint-marin"},{"iso-id":"663","iso-alpha2":"MAF","iso3166-1":"MF",name:"Saint-martin (partie française)"},{"iso-id":"534","iso-alpha2":"SXM","iso3166-1":"SX",name:"Saint-martin (partie néerlandaise)"},{"iso-id":"666","iso-alpha2":"SPM","iso3166-1":"PM",name:"Saint-pierre-et-miquelon"},{"iso-id":"336","iso-alpha2":"VAT","iso3166-1":"VA",name:"Saint-siège (état de la cité du vatican)"},{"iso-id":"670","iso-alpha2":"VCT","iso3166-1":"VC",name:"Saint-vincent-et-les grenadines"},{"iso-id":"654","iso-alpha2":"SHN","iso3166-1":"SH",name:"Sainte-hélène, ascension et tristan da cunha"},{"iso-id":"662","iso-alpha2":"LCA","iso3166-1":"LC",name:"Sainte-lucie"},{"iso-id":"90","iso-alpha2":"SLB","iso3166-1":"SB",name:"Salomon, îles"},{"iso-id":"882","iso-alpha2":"WSM","iso3166-1":"WS",name:"Samoa"},{"iso-id":"16","iso-alpha2":"ASM","iso3166-1":"AS",name:"Samoa américaines"},{"iso-id":"678","iso-alpha2":"STP","iso3166-1":"ST",name:"Sao tomé-et-principe"},{"iso-id":"686","iso-alpha2":"SEN","iso3166-1":"SN",name:"Sénégal"},{"iso-id":"688","iso-alpha2":"SRB","iso3166-1":"RS",name:"Serbie"},{"iso-id":"690","iso-alpha2":"SYC","iso3166-1":"SC",name:"Seychelles"},{"iso-id":"694","iso-alpha2":"SLE","iso3166-1":"SL",name:"Sierra leone"},{"iso-id":"702","iso-alpha2":"SGP","iso3166-1":"SG",name:"Singapour"},{"iso-id":"703","iso-alpha2":"SVK","iso3166-1":"SK",name:"Slovaquie"},{"iso-id":"705","iso-alpha2":"SVN","iso3166-1":"SI",name:"Slovénie"},{"iso-id":"706","iso-alpha2":"SOM","iso3166-1":"SO",name:"Somalie"},{"iso-id":"729","iso-alpha2":"SDN","iso3166-1":"SD",name:"Soudan"},{"iso-id":"728","iso-alpha2":"SSD","iso3166-1":"SS",name:"Soudan du sud"},{"iso-id":"144","iso-alpha2":"LKA","iso3166-1":"LK",name:"Sri lanka"},{"iso-id":"752","iso-alpha2":"SWE","iso3166-1":"SE",name:"Suède"},{"iso-id":"756","iso-alpha2":"CHE","iso3166-1":"CH",name:"Suisse"},{"iso-id":"740","iso-alpha2":"SUR","iso3166-1":"SR",name:"Suriname"},{"iso-id":"744","iso-alpha2":"SJM","iso3166-1":"SJ",name:"Svalbard et île jan mayen"},{"iso-id":"748","iso-alpha2":"SWZ","iso3166-1":"SZ",name:"Swaziland"},{"iso-id":"760","iso-alpha2":"SYR","iso3166-1":"SY",name:"Syrienne, république arabe"},{"iso-id":"762","iso-alpha2":"TJK","iso3166-1":"TJ",name:"Tadjikistan"},{"iso-id":"158","iso-alpha2":"TWN","iso3166-1":"TW",name:"Taïwan, province de chine"},{"iso-id":"834","iso-alpha2":"TZA","iso3166-1":"TZ",name:"Tanzanie, république unie de"},{"iso-id":"148","iso-alpha2":"TCD","iso3166-1":"TD",name:"Tchad"},{"iso-id":"203","iso-alpha2":"CZE","iso3166-1":"CZ",name:"Tchèque, république"},{"iso-id":"260","iso-alpha2":"ATF","iso3166-1":"TF",name:"Terres australes françaises"},{"iso-id":"764","iso-alpha2":"THA","iso3166-1":"TH",name:"Thaïlande"},{"iso-id":"626","iso-alpha2":"TLS","iso3166-1":"TL",name:"Timor-leste"},{"iso-id":"768","iso-alpha2":"TGO","iso3166-1":"TG",name:"Togo"},{"iso-id":"772","iso-alpha2":"TKL","iso3166-1":"TK",name:"Tokelau"},{"iso-id":"776","iso-alpha2":"TON","iso3166-1":"TO",name:"Tonga"},{"iso-id":"780","iso-alpha2":"TTO","iso3166-1":"TT",name:"Trinité-et-tobago"},{"iso-id":"788","iso-alpha2":"TUN","iso3166-1":"TN",name:"Tunisie"},{"iso-id":"795","iso-alpha2":"TKM","iso3166-1":"TM",name:"Turkménistan"},{"iso-id":"796","iso-alpha2":"TCA","iso3166-1":"TC",name:"Turks et caïques, îles"},{"iso-id":"792","iso-alpha2":"TUR","iso3166-1":"TR",name:"Turquie"},{"iso-id":"798","iso-alpha2":"TUV","iso3166-1":"TV",name:"Tuvalu"},{"iso-id":"804","iso-alpha2":"UKR","iso3166-1":"UA",name:"Ukraine"},{"iso-id":"858","iso-alpha2":"URY","iso3166-1":"UY",name:"Uruguay"},{"iso-id":"548","iso-alpha2":"VUT","iso3166-1":"VU",name:"Vanuatu"},{"iso-id":"862","iso-alpha2":"VEN","iso3166-1":"VE",name:"Venezuela, république bolivarienne du"},{"iso-id":"704","iso-alpha2":"VNM","iso3166-1":"VN",name:"Viet nam"},{"iso-id":"876","iso-alpha2":"WLF","iso3166-1":"WF",name:"Wallis-et-futuna"},{"iso-id":"887","iso-alpha2":"YEM","iso3166-1":"YE",name:"Yémen"},{"iso-id":"894","iso-alpha2":"ZMB","iso3166-1":"ZM",name:"Zambie"},{"iso-id":"716","iso-alpha2":"ZWE","iso3166-1":"ZW",name:"Zimbabwe"}]});Ext.define("Fbx.ux.form.AjaxFormPanel",{extend:"Ext.form.Panel",alias:"widget.ajaxform",requires:["Ext.button.Button"],closeOnSubmit:!1,checkBeforeClose:!0,showApplyCancel:!0,showOkBtn:!0,customButtonsFirst:!1,submitForm:function(closeOnSubmit){var me=this,form=me.getForm();if(form.isValid())if(form.isDirty())me.closeOnSubmit=closeOnSubmit,me.submit();else if(me.fireEvent("saved",me,me.getValues()),closeOnSubmit){var win=me.up("window");win&&win.close()}},initComponent:function(){var me=this;this.addEvents("beforeload","loaded","saved");var buttons=[];if(me.customButtonsFirst&&me.buttons)for(var i in me.buttons)buttons.push(me.buttons[i]);if(me.showOkBtn&&buttons.push({text:"OK",iconCls:"btn-accept",itemId:"btn-apply",formBind:!0,disabled:!0,handler:function(){me.submitForm(!0)}}),me.showApplyCancel&&(me.buttonApply=Ext.create("Ext.button.Button",{text:"Appliquer",iconCls:"btn-save",disabled:!0,handler:function(){me.submitForm(!1)}}),me.cancelBtn=Ext.create("Ext.button.Button",{text:"Annuler",disabled:!1,iconCls:"btn-cancel",handler:function(){me.getForm().reset(),me.up("window").close()}}),buttons.push(me.cancelBtn),buttons.push(me.buttonApply)),!me.customButtonsFirst&&me.buttons)for(var i in me.buttons)buttons.push(me.buttons[i]);me.buttons=buttons,me.callParent(arguments),me.on("dirtychange",function(form,dirty){me.buttonApply&&me.buttonApply.setDisabled(!dirty)}),me.on("validitychange",function(form,valid){me.buttonApply&&(valid?me.buttonApply.setDisabled(!form.isDirty()):me.buttonApply.setDisabled(!0))}),me.on("afterrender",function(){var win=me.up("window");win&&me.mon(win,"beforeclose",function(){var form=me.getForm();if(form.isDirty()&&me.checkBeforeClose)return Ext.MessageBox.confirm("Modifications non sauvegardées","Voulez vous enregistrer les modifications ?",function(btn){"yes"==btn?me.submitForm(!0):(form.reset(),win.close())}),!1});var tabpanel=me.up("tabpanel");tabpanel&&me.mon(tabpanel,"beforetabchange",function(panel,newCard,oldCard){var form=me.getForm();if(form.isDirty()&&me.checkBeforeClose)return Ext.MessageBox.confirm("Modifications non sauvegardées","Voulez vous enregistrer les modifications ?",function(btn){"yes"==btn?me.submit(function(success){success&&tabpanel.setActiveTab(newCard)}):(form.reset(),tabpanel.setActiveTab(newCard))}),!1})}),me.getForm().trackResetOnLoad=!0},load:function(options){var me=this;me.isLoading||!1!==me.fireEvent("beforeload",me)&&(me.isLoading=!0,me.disableLoadMask||me.setLoading(!0),Ext.Ajax.request({url:me.url,method:"GET",success:function(response){me.isLoading=!1,me.setLoading(!1);var jsonData=response.jsonData;me.setValues(jsonData.result),me.fireEvent("loaded",me,jsonData.result)},failure:function(response){me.isLoading=!1,me.setLoading(!1)}}))},setValues:function(obj){var me=this;me.transformAfterGet&&(obj=me.transformAfterGet(obj));var form=this.getForm();me.values=form.getValues(),Fbx.os.lib.FbxUtils.stringify(obj,"",me.values),form.setValues(me.values)},getValues:function(){var me=this,fields=this.getForm().getFields(),values={};return fields.each(function(field){var name=field.getName(),val=field.getValue();name&&("radiofield"==field.xtype?(val=field.getGroupValue(),Fbx.os.lib.FbxUtils.objectify(name,val,values,field.isArray)):Fbx.os.lib.FbxUtils.objectify(name,val,values,field.isArray))}),me.transformBeforePost&&(values=me.transformBeforePost(values)),values},submit:function(callback){var me=this,settings=me.getValues();me.setLoading("Sauvegarde en cours ..."),Ext.Ajax.request({url:me.url,method:"PUT",jsonData:settings,success:function(response){me.setLoading(!1);var jsonData=response.jsonData;if(jsonData.result&&(me.setValues(jsonData.result),me.fireEvent("saved",me,jsonData.result)),callback&&callback(!0),me.closeOnSubmit){var win=me.up("window");win&&win.close()}},failure:function(){me.setLoading(!1),callback&&callback(!1)},callback:function(){me.setLoading(!1)}})}});Ext.define("Fbx.ux.grid.plugin.CellEditing",{extend:"Ext.grid.plugin.CellEditing",startEditByClick:function(){var me=this;"actioncolumn"==me.grid.columns[arguments[2]].xtype||me.editing&&me.clicksToMoveEditor!==me.clicksToEdit||me.callParent(arguments)}});Ext.define("Fbx.ux.grid.plugin.DragSelector",{extend:"Ext.util.Observable",requires:["Ext.dd.DragTracker","Ext.util.Region"],alias:"plugin.ux.dragselector",dragging:!1,scrollTopStart:0,scrollTop:0,targetDragSelector:".dragselect",dragSafe:!1,scrollSpeed:10,constructor:function(config){var me=this;me.addEvents("dragselectorstart","dragselectorend"),me.callParent([config])},init:function(cmp){var me=this;me.grid=cmp,me.view=me.grid.getView(),me.selModel=me.view.getSelectionModel(),me.mon(me.view,"render",me.onRender,me),me.mon(me.view,"bodyscroll",me.syncScroll,me)},onRender:function(){var me=this;me.tracker=new Ext.dd.DragTracker({view:me.view,dragSelector:me,el:me.view.el,onBeforeStart:Ext.Function.bind(me.onBeforeStart,me),onStart:Ext.Function.bind(me.onStart,me),onDrag:Ext.Function.bind(me.onDrag,me),onEnd:Ext.Function.bind(me.onEnd,me)}),me.dragRegion=new Ext.util.Region,me.scroller=me.view.getEl()},syncScroll:function(e){var top=this.scroller.getScroll().top;this.scrollTop=top-this.scrollTopStart,this.fillRegions(),this.dragging&&this.onDrag(e,!0)},fillAllRegions:function(){var me=this,objectsSelected=me.objectsSelected=[];me.mainRegion=me.scroller.getRegion(),me.bodyRegion=me.scroller.getRegion();for(var i in this.view.all.elements)objectsSelected.push(me.selModel.isSelected(objectsSelected.length));me.syncScroll()},fillRegions:function(){var rs=this.rs=[];for(var i in this.view.all.elements){var el=this.view.all.elements[i];rs.push(Ext.fly(el).getRegion())}},cancelClick:function(e){var me=this,target=e.getTarget();return me.ctrlState=e.ctrlKey,me.shiftState=e.shiftKey,me.ctrlState||me.shiftState||"x-grid-view"!==target.className||me.selModel.clearSelections(),!0},onBeforeStart:function(e){return 2!==e.button&&(this.grid.editingPlugin&&this.grid.editingPlugin.editing,!(e.getPageX()>this.view.el.getX()+this.view.el.dom.clientWidth-20)&&(!(e.getPageY()>this.view.el.getY()+this.view.el.dom.clientHeight-20)&&(this.cancelClick(e),!this.dragSafe||e.target==this.view.el.dom||Ext.DomQuery.is(e.target,this.targetDragSelector))))},onStart:function(e){var me=this;me.scrollTopStart=me.scroller.getScroll().top,me.fillAllRegions(),me.getProxy().show(),me.dragging=!0,me.fireEvent("dragselectorstart",me)},getProxy:function(){return this.proxy||(this.proxy=this.view.getEl().createChild({tag:"div",cls:"x-view-selector"})),this.proxy},onDrag:function(e,scaleSelector){var me=this,selModel=me.view.getSelectionModel(),proxy=me.getProxy(),bodyRegion=me.bodyRegion,startXY=me.tracker.startXY,dragRegion=me.dragRegion,currentXY=me.tracker.getXY(),width=Math.abs(startXY[0]-currentXY[0]),minX=Math.min(startXY[0],currentXY[0]),minY=Math.min(startXY[1],currentXY[1])-me.scrollTop,height=Math.abs(minY-currentXY[1]);currentXY[0]<startXY[0]&&!scaleSelector&&(currentXY[0]+=2),me.scrollTop>=0?(startXY[1]-me.scrollTop>currentXY[1]&&(minY=currentXY[1],height=Math.abs(startXY[1]-currentXY[1])-me.scrollTop),bodyRegion.top-=me.scrollTop):(startXY[1]-me.scrollTop>currentXY[1]&&(minY=currentXY[1],height=Math.abs(startXY[1]-me.scrollTop-currentXY[1])),bodyRegion.bottom-=me.scrollTop),Ext.apply(dragRegion,{top:minY,left:minX,right:minX+width,bottom:minY+height}),dragRegion.constrainTo(bodyRegion),proxy.setRegion(dragRegion);for(var s=me.scroller,i=0;i<me.rs.length;i++){var r=me.rs[i],sel=dragRegion.intersect(r),selected=selModel.isSelected(i),selectedBefore=me.objectsSelected[i];bodyRegion.intersect(r)&&(me.ctrlState&&selectedBefore?sel&&selected?selModel.deselect(i):sel||selected||selModel.select(i,!0):sel&&!selected?selModel.select(i,!0):!sel&&selected&&selModel.deselect(i))}currentXY[1]+10>=me.mainRegion.bottom&&(Ext.isIE?setTimeout(function(){s.scrollTo("top",s.getScroll().top+40)},100):me.setScrollTop(s.getScroll().top+me.scrollSpeed)),currentXY[1]-10<=me.mainRegion.top&&(Ext.isIE?setTimeout(function(){s.scrollTo("top",s.getScroll().top-40)},100):me.setScrollTop(s.getScroll().top-me.scrollSpeed))},setScrollTop:function(scrollTop){var el=this.scroller,elDom=el&&el.dom;if(elDom)return elDom.scrollTop=Ext.Number.constrain(scrollTop,0,elDom.scrollHeight-elDom.clientHeight)},onEnd:function(e){var me=this;me.dragging=!1,me.getProxy().hide(),e.preventDefault(),me.fireEvent("dragselectorend",me)}});Ext.define("Fbx.MenuOverride",{override:"Ext.menu.Menu",onMouseLeave:function(e){var me=this,visibleSubmenu=!1;me.items.each(function(item){item.menu&&item.menu.isVisible()&&(visibleSubmenu=!0)}),visibleSubmenu||(me.deactivateActiveItem(),me.disabled||me.fireEvent("mouseleave",me,e))}});Ext.define("Fbx.os.app.settings.wifi.WifiWpsCandidateModel",{extend:"Ext.data.Model",fields:[{name:"bss_uuid",type:"string"},{name:"ssid",type:"string"},{name:"bssid",type:"string"},{name:"state",type:"string"},{name:"wps_enabled",type:"bool"},{name:"encryption",type:"string"},{name:"band",type:"string"},{name:"display_ssid",type:"string",convert:function(v,r){var ssid=r.get("ssid"),band=r.get("band");return"2d4g"===band?ssid+=" (2.4 GHz)":"5g"===band&&(ssid+=" (5 GHz)"),ssid}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/wps/candidates/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.ux.mixin.RefreshMixin",{suspendRefresh:!1,refreshFreq:1e3,refreshTimer:null,suspendLoad:!1,showDetailOnClick:!1,inFailure:!1,__selectedRecords:[],__selectedBeforeLoad:[],constructor:function(){var me=this;me.addEvents("refresh"),me.detailWins=[],this.mon(this,"show",function(){me.suspendRefresh||me.getStore().load({autorefresh:!0})}),this.on("selectionchange",this.rememberSelection,this),this.on("refresh",this.refreshSelection,this),me.showDetailOnClick&&(this.on("itemclick",function(view,record,item,index,e,eOpts){Fbx.os.lib.FbxUtils.isMobileDevice()&&me.showDetailsWin(record)}),this.on("itemdblclick",function(view,record,item,index,e,eOpts){me.showDetailsWin(record)})),me.addStoreEvent()},planRefresh:function(){var me=this,s=me.getStore();me.refreshTimer||me.suspendRefresh||!me.isVisible()||(me.refreshTimer=setTimeout(function(){if(me.refreshTimer=null,!s.isLoading()&&!me.suspendRefresh){var win=me.up("window");win&&(win.isVisible()?s.load({autorefresh:!0}):setTimeout(function(){me.planRefresh()},Fbx.os.gui.Environment.accessibilityMode?1e4:1e3))}},Fbx.os.gui.Environment.accessibilityMode?1e4:me.refreshFreq))},doWhenSuspended:function(callback){var me=this;me.suspendLoad=!0,me.getStore().isLoading()?me.getStore().on("load",function(){callback(),me.suspendLoad=!1},me,{single:!0}):(callback(),me.suspendLoad=!1)},addStoreEvent:function(){var me=this,store=me.getStore();store.on("load",function(s,records,successful,eOpts){if(me.inFailure=!successful,!successful)return me.refreshTimer&&clearTimeout(me.refreshTimer),void(me.refreshTimer=setTimeout(function(){me.refreshTimer=null,store.load({autorefresh:!0,silentError:!0})},1e4));me.planRefresh(),me.fireEvent("refresh",me)}),store.on("beforeload",function(s){var hasPendingChanged=s.getRemovedRecords().length||s.getModifiedRecords().length;return!!me.up("window")&&(me.suspendLoad||hasPendingChanged?(setTimeout(function(){s.load({autorefresh:!0})},1e3),!1):void me.__saveSelection())}),store.on("afterload",function(s){me.forgetNextScrollPos?(me.firstVisibleRowIdx=null,me.beforeScrollTop=0):me.rememberVisible(),me.__restoreSelection()})},__saveSelection:function(){var me=this;me.__selectedBeforeLoad=[];var store=me.getStore(),selModel=me.getSelectionModel(),selection=selModel.getSelection();Ext.Array.each(selection,function(r){store.getById(r.getId())?me.__selectedBeforeLoad.push(r.getId()):selModel.deselect(r)})},__restoreSelection:function(){var me=this,recs=[],store=me.getStore(),selModel=me.getSelectionModel();for(var i in me.__selectedBeforeLoad){var r=store.getById(me.__selectedBeforeLoad[i]);r&&recs.push(r)}selModel.select(recs,!1,!0),me.refreshSelection()},rememberSelection:function(){this.__saveSelection()},rememberVisible:function(){var me=this,el=me.view&&me.view.getEl();el&&el.getScroll?me.beforeScrollTop=el.getScroll().top:me.beforeScrollTop=0;var plug=null;me.hasBufferingPlugin&&(plug=me.getPlugin("bufferedrenderer")),plug&&plug.getFirstVisibleRowIndex?me.firstVisibleRowIdx=plug.getFirstVisibleRowIndex():me.firstVisibleRowIdx=null},detailWinClass:"",showDetailsWin:function(rec){var me=this;if(me.detailWinClass){var rId=rec.getId(),detailWin=me.detailWins[rId];detailWin||(detailWin=Ext.create(me.detailWinClass),me.detailWins[rId]=detailWin,detailWin.on("close",function(){me.detailWins[rId]=void 0})),detailWin.setRecord(rec),detailWin.show()}},refreshSelection:function(){var me=this;if(me.detailWins)for(var rId in me.detailWins)if(me.detailWins[rId]){Ext.isNumeric(rId)&&(rId=parseInt(rId,10));var rec=me.getStore().getById(rId);rec?me.detailWins[rId].setRecord(rec):me.detailWins[rId].close()}var el=me.view&&me.view.getEl(),elDom=el&&el.dom;if(elDom){var scrollPos=Ext.Number.constrain(me.beforeScrollTop,0,elDom.scrollHeight-elDom.clientHeight),plug=null;me.hasBufferingPlugin&&(plug=me.getPlugin("bufferedrenderer")),plug&&me.firstVisibleRowIdx&&!isNaN(me.firstVisibleRowIdx)&&plug.scrollTo(me.firstVisibleRowIdx),elDom.scrollTop=scrollPos}var updated=[],store=me.getStore(),selModel=me.getSelectionModel(),selection=selModel.getSelection();Ext.Array.each(selection,function(r){var ur=store.getById(r.getId());ur?Ext.Array.push(updated,ur):selModel.deselect(r)}),selModel.select(updated,!1,!0),__selectedRecords=updated},destroy:function(){var me=this;me.refreshTimer&&clearTimeout(me.refreshTimer),this.callParent()},getSelectedRecord:function(){return this.refreshSelection(),__selectedRecords}});Ext.define("Fbx.os.app.settings.VpnServerModel",{extend:"Ext.data.Model",fields:[{name:"name",type:"string"},{name:"type",type:"string"},{name:"state",type:"string"},{name:"connection_count",type:"int"},{name:"auth_connection_count",type:"int"}],statics:{vpnPrettyNames:{openvpn_routed:"OpenVPN Routé",openvpn_bridge:"OpenVPN Bridgé",pptp:"PPTP",ipsec:"IPsec IKEv2"}},idProperty:"name",proxy:{type:"rest",url:FbxConf.apiBaseUrl+"vpn/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.LicenseModel",{extend:"Ext.data.Model",fields:[{name:"url",type:"string"},{name:"name",type:"string"},{name:"version",type:"string"},{name:"license",type:"string"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"licenses/",reader:{type:"json",root:"result",messageProperty:"msg"}},getLicenseTxt:function(success){var me=this;me.get("name")&&Ext.Ajax.request({url:FbxConf.apiBaseUrl+"licenses/"+encodeURIComponent(me.get("name"))+"/",method:"GET",success:function(response){success(response.jsonData.result)}})}});Ext.define("Fbx.os.app.settings.PhoneModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"type_id",type:"int"},{name:"type",type:"string"},{name:"gain_rx",type:"int"},{name:"gain_tx",type:"string"},{name:"on_hook",type:"boolean"},{name:"vendor",type:"string"},{name:"hardware_defect",type:"boolean"},{name:"is_ringing",type:"boolean"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"phone/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.DhcpDynamicLeaseModel",{extend:"Ext.data.Model",fields:[{name:"mac",type:"string"},{name:"ip",type:"string"},{name:"hostname",type:"string"},{name:"host",type:"object"},{name:"is_static",type:"boolean"},{name:"assign_time",type:"int",convert:function(val){return new Date(1e3*val)}},{name:"refresh_time",type:"int",convert:function(val){return new Date(1e3*val)}},{name:"lease_remaining",type:"int"}],idProperty:"mac",proxy:{type:"rest",url:FbxConf.apiBaseUrl+"dhcp/dynamic_lease/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.storage.PartitionModel",{extend:"Ext.data.Model",requires:["Ext.data.association.BelongsTo"],fields:[{name:"id",type:"integer"},{name:"label",type:"string"},{name:"state",type:"string"},{name:"path",type:"string"},{name:"disk_id",type:"integer"},{name:"total_bytes",type:"integer"},{name:"used_bytes",type:"integer"},{name:"free_bytes",type:"integer"},{name:"fsck_result",type:"string"},{name:"fstype",type:"string"},{name:"operation_pct",type:"auto"},{name:"usage_pct",type:"integer",convert:function(val,rec){var tot=rec.get("free_bytes")+rec.get("used_bytes");return 0===tot?100:Math.round(1e4*rec.get("used_bytes")/tot)/100}},{name:"description",type:"string",convert:function(val,rec){var label=rec.get("label");""===label&&(label="Sans nom");var fstype=rec.get("fstype");return"empty"===fstype&&(fstype="Non formaté"),label+" ("+fstype+")"}},{name:"canFsck",type:"boolean",persist:!1,convert:function(val,rec){var type=rec.get("fstype");return!("ntfs"===type||"vfat"===type||"exfat"===type)}}],associations:[{type:"belongsTo",getterName:"getDisk",model:"Fbx.os.app.settings.storage.DiskModel"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"storage/partition/",reader:{type:"json",root:"result",messageProperty:"msg"}},mount:function(callback){var me=this;switch(callback||(callback=me.defaultCallback),me.get("state")){case"mounted":case"mounting":case"maintenance":break;case"umounted":me.set("state","mounted"),me.save({callback:callback});break;default:Ext.Msg.alert("Erreur","La partition ne peut pas être activée actuellement")}},umount:function(callback){var me=this;switch(me.get("state")){case"umounted":case"umounting":case"ejecting":break;case"mounted":me.set("state","umounted"),me.save({callback:callback});break;default:Ext.Msg.alert("Erreur","La partition ne peut pas être désactivée actuellement")}}});Ext.define("Fbx.os.app.accounts.AuthorizationModel",{extend:"Ext.data.Model",statics:{loadPermissions:function(cb){if(Fbx.os.app.accounts.AuthorizationModel.permissionsName)return void cb(!0);Ext.Ajax.request({url:FbxConf.apiBaseUrl+"login/perms/",method:"GET",success:function(response,request){if(response.jsonData&&response.jsonData.success){var names={},res=response.jsonData.result;for(var perm in res)res[perm].desc&&(names[perm]=res[perm].desc);Fbx.os.app.accounts.AuthorizationModel.permissionsName=names,cb(!0)}else cb(!1)}})}},fields:[{name:"id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"app_id",type:"string"},{name:"device_name",type:"string"},{name:"last_session",type:"int"},{name:"req_ip",type:"string"},{name:"req_date",type:"int"},{name:"token_validity",type:"string"},{name:"permissions",type:"object"},{name:"permissions_str",type:"string",convert:function(val,rec){var str="",validity=rec.get("token_validity");if("denied"===validity||"invalid"===validity)return'<span style="color: red;">Accès refusé</span>';if("timeout"===validity)return"<span style=\"color: red;\">Temps d'attente dépassé lors de la demande d'association</span>";if("pending"===validity)return'<span style="color: orange;">Authentification en cours</span>';if("granted"!==validity)return'<span style="color: red;">Inconnu</span>';var perms=rec.get("permissions");for(var type in perms){var name=Fbx.os.app.accounts.AuthorizationModel.permissionsName[type];name||(name="all"===type?"Accès intégral":type),perms[type]&&(str+="&bull; "+name+" <br />")}return str}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"authorization/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Ext.ux.grid.filter.DateFilter",{extend:"Ext.ux.grid.filter.Filter",alias:"gridfilter.date",uses:["Ext.picker.Date","Ext.menu.Menu"],afterText:"After",beforeText:"Before",compareMap:{before:"lt",after:"gt",on:"eq"},dateFormat:"m/d/Y",menuItems:["before","after","-","on"],menuItemCfgs:{selectOnFocus:!0,width:125},onText:"On",pickerOpts:{},init:function(config){var pickerCfg,i,len,item,cfg,me=this;for(pickerCfg=Ext.apply(me.pickerOpts,{xtype:"datepicker",minDate:me.minDate,maxDate:me.maxDate,format:me.dateFormat,listeners:{scope:me,select:me.onMenuSelect}}),me.fields={},i=0,len=me.menuItems.length;i<len;i++)item=me.menuItems[i],"-"!==item&&(cfg={itemId:"range-"+item,text:me[item+"Text"],menu:Ext.create("Ext.menu.Menu",{plain:!0,items:[Ext.apply(pickerCfg,{itemId:item})]}),listeners:{scope:me,checkchange:me.onCheckChange}},item=me.fields[item]=Ext.create("Ext.menu.CheckItem",cfg)),me.menu.add(item);me.values={}},onCheckChange:function(item,checked){var me=this,picker=item.menu.items.first(),itemId=picker.itemId,values=me.values;checked?values[itemId]=picker.getValue():delete values[itemId],me.setActive(me.isActivatable()),me.fireEvent("update",me)},onInputKeyUp:function(field,e){e.getKey()==e.RETURN&&field.isValid()&&(e.stopEvent(),this.menu.hide())},onMenuSelect:function(picker,date){var fields=this.fields,field=this.fields[picker.itemId];field.setChecked(!0),field==fields.on?(fields.before.setChecked(!1,!0),fields.after.setChecked(!1,!0)):(fields.on.setChecked(!1,!0),field==fields.after&&this.getFieldValue("before")<date?fields.before.setChecked(!1,!0):field==fields.before&&this.getFieldValue("after")>date&&fields.after.setChecked(!1,!0)),this.values[picker.itemId]=date,this.fireEvent("update",this),picker.up("menu").hide()},getValue:function(){var key,result={};for(key in this.fields)this.fields[key].checked&&(result[key]=this.getFieldValue(key));return result},setValue:function(value,preserve){var key;for(key in this.fields)value[key]?(this.getPicker(key).setValue(value[key]),this.fields[key].setChecked(!0)):preserve||this.fields[key].setChecked(!1);this.fireEvent("update",this)},isActivatable:function(){var key;for(key in this.fields)if(this.fields[key].checked)return!0;return!1},getSerialArgs:function(){var args=[];for(var key in this.fields)this.fields[key].checked&&args.push({type:"date",comparison:this.compareMap[key],value:Ext.Date.format(this.getFieldValue(key),this.dateFormat)});return args},getFieldValue:function(item){return this.values[item]},getPicker:function(item){return this.fields[item].menu.items.first()},validateRecord:function(record){var key,pickerValue,val=record.get(this.dataIndex),clearTime=Ext.Date.clearTime;if(!Ext.isDate(val))return!1;val=clearTime(val,!0).getTime();for(key in this.fields)if(this.fields[key].checked){if(pickerValue=clearTime(this.getFieldValue(key),!0).getTime(),"before"==key&&pickerValue<=val)return!1;if("after"==key&&pickerValue>=val)return!1;if("on"==key&&pickerValue!=val)return!1}return!0}});Ext.define("Ext.ux.grid.filter.BooleanFilter",{extend:"Ext.ux.grid.filter.Filter",alias:"gridfilter.boolean",defaultValue:!1,yesText:"Yes",noText:"No",init:function(config){var gId=Ext.id();this.options=[Ext.create("Ext.menu.CheckItem",{text:this.yesText,group:gId,checked:!0===this.defaultValue}),Ext.create("Ext.menu.CheckItem",{text:this.noText,group:gId,checked:!1===this.defaultValue})],this.menu.add(this.options[0],this.options[1]);for(var i=0;i<this.options.length;i++)this.options[i].on("click",this.fireUpdate,this),this.options[i].on("checkchange",this.fireUpdate,this)},getValue:function(){return this.options[0].checked},setValue:function(value){this.options[value?0:1].setChecked(!0)},getSerialArgs:function(){return{type:"boolean",value:this.getValue()}},validateRecord:function(record){return record.get(this.dataIndex)==this.getValue()}});Ext.define("Fbx.os.app.pvr.PrecordModel",{extend:"Ext.data.Model",statics:{stateStr:{disabled:"Désactivé",start_error:"Erreurs",waiting_start_time:"En attente",starting:"En cours",running:"En cours",running_error:"Erreur",failed:"Echec de l'enregistrement",finished:"Terminé"},errorStr:{none:"",network_problem:"Problème de réseau",disk_full:"Disque plein",private_but_no_private_dir:"Erreur inconnue",network_problem:"Problème de réseau",resource_problem:"Problème de bande passante",no_stream_available:"Chaîne non disponible",no_data_received:"Aucune donnée reçue",missed:"Enregistrement raté",stopped:"Enregistrement arrêté",internal_error:"Erreur inconnue",unknown_error:"Erreur inconnue"}},fields:[{name:"id",type:"int"},{name:"state",type:"string"},{name:"name",type:"string"},{name:"media",type:"string"},{name:"path",type:"string"},{name:"subname",type:"string"},{name:"has_record_gen",type:"bool"},{name:"record_gen_id",type:"int"},{name:"channel_name",type:"string"},{name:"overlap_list",type:"auto"},{name:"start",type:"int"},{name:"end",type:"int"},{name:"broadcast_type",type:"string"},{name:"channel_quality",type:"string"},{name:"channel_uuid",type:"string"},{name:"channel_type",type:"string"},{name:"conflict",type:"bool"},{name:"error",type:"string"},{name:"enabled",type:"bool"},{name:"margin_after",type:"int"},{name:"margin_before",type:"int"},{name:"channel",type:"auto",persist:!1,convert:function(r,rec){return rec.raw.channel_uuid&&""!=rec.raw.channel_uuid?Fbx.os.app.tv.ChannelDb.channels[rec.raw.channel_uuid]:null}},{name:"day",type:"string",persist:!1,convert:function(r,rec){return Fbx.os.lib.FbxUtils.niceEventDay(new Date(1e3*rec.get("start")))}},{name:"logo_url",type:"string",persist:!1,convert:function(r,rec){var channel=rec.get("channel");return channel?channel.logo_url:"resources/images/fbx/logo_placeholder.png"}},{name:"iconCls",type:"string",persist:!1,convert:function(r,rec){var name=rec.get("state");return rec.get("conflict")&&(name="running"==name?"running_conflict":"conflict"),"pvr-sprite pvr-"+name}},{name:"progress",type:"int",persist:!1,convert:function(r,rec){if("running"!=rec.get("state"))return 0;var start=rec.get("start")-rec.get("margin_before"),duration=rec.get("end")+rec.get("margin_after")-start;if(!duration)return 0;var now=(new Date).getTime()/1e3,elapsed=now-start;return Math.round(100*elapsed/duration)}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"pvr/programmed/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}},isDone:function(){var me=this,state=me.get("state");return"finished"==state||"failed"==state||"start_error"==state||"running_error"==state},ackRecord:function(cb){var me=this;Ext.Ajax.request({method:"POST",url:FbxConf.apiBaseUrl+"pvr/programmed/"+me.getId()+"/ack",success:function(response){cb&&cb()}})},stopRecord:function(cb){var me=this;Ext.Ajax.request({method:"POST",url:FbxConf.apiBaseUrl+"pvr/programmed/"+me.getId()+"/stop",success:function(response){cb&&cb()}})}});Ext.define("Ext.ux.IFrame",{extend:"Ext.Component",alias:"widget.uxiframe",loadMask:"Loading...",src:"about:blank",renderTpl:['<iframe src="{src}" name="{frameName}" width="100%" height="100%" frameborder="0"></iframe>'],initComponent:function(){this.callParent(),this.frameName=this.frameName||this.id+"-frame",this.addEvents("beforeload","load"),Ext.apply(this.renderSelectors,{iframeEl:"iframe"})},initEvents:function(){var me=this;me.callParent(),me.iframeEl.on("load",me.onLoad,me)},initRenderData:function(){return Ext.apply(this.callParent(),{src:this.src,frameName:this.frameName})},getBody:function(){var doc=this.getDoc();return doc.body||doc.documentElement},getDoc:function(){try{return this.getWin().document}catch(ex){return null}},getWin:function(){var me=this,name=me.frameName;return Ext.isIE?me.iframeEl.dom.contentWindow:window.frames[name]},getFrame:function(){return this.iframeEl.dom},beforeDestroy:function(){this.cleanupListeners(!0),this.callParent()},cleanupListeners:function(destroying){var doc,prop;if(this.rendered)try{if((doc=this.getDoc())&&(Ext.EventManager.removeAll(doc),destroying))for(prop in doc)doc.hasOwnProperty&&doc.hasOwnProperty(prop)&&delete doc[prop]}catch(e){}},onLoad:function(){var me=this,doc=me.getDoc(),fn=me.onRelayedEvent;if(doc){try{Ext.EventManager.removeAll(doc),Ext.EventManager.on(doc,{mousedown:fn,mousemove:fn,mouseup:fn,click:fn,dblclick:fn,scope:me})}catch(e){}Ext.EventManager.on(this.getWin(),"beforeunload",me.cleanupListeners,me),this.el.unmask(),this.fireEvent("load",this)}else me.src&&""!=me.src&&(this.el.unmask(),this.fireEvent("error",this))},onRelayedEvent:function(event){var iframeEl=this.iframeEl,iframeXY=Ext.Element.getTrueXY(iframeEl),originalEventXY=event.getXY(),eventXY=Ext.EventManager.getPageXY(event.browserEvent);event.xy=[iframeXY[0]+eventXY[0],iframeXY[1]+eventXY[1]],event.injectEvent(iframeEl),event.xy=originalEventXY},load:function(src){var me=this,text=me.loadMask,frame=me.getFrame();!1!==me.fireEvent("beforeload",me,src)&&(text&&me.el&&me.el.mask(text),frame.src=me.src=src||me.src)}});Ext.define("Fbx.os.app.downloader.DownloadBlockWin",{extend:"Ext.panel.Panel",requires:["Ext.Component"],autoScroll:!0,initComponent:function(){var me=this;me.colors={X:"full","+":"partial","-":"skip",".":"pending",U:"urgent","/":"urgent-partial"},me.rec=null,me.inner=Ext.create("Ext.Component",{html:"plop"}),Ext.applyIf(me,{bodyPadding:5,items:[me.inner]}),me.callParent(arguments)},refreshPieces:function(){var me=this;me.refreshing||me.rec&&(me.refreshing=!0,me.rec.getPiecesStatus(function(success,status){if(me.refreshing=!1,success){var html='<div class="bt-dl-pieces">';for(var i in status){var c=status[i];html+='<div class="bt-dl-piece bt-dl-piece-'+me.colors[c]+'"></div>'}html+='<div style="clear: both;"></div></div>',me.inner.getEl().setHTML(html)}}))},setRecord:function(rec){var me=this;rec.getId()!=me.prevId&&(me.update(""),me.prevId=rec.getId(),me.rec=rec),me.refreshPieces()}});Ext.define("Ext.ux.grid.filter.NumericFilter",{extend:"Ext.ux.grid.filter.Filter",alias:"gridfilter.numeric",uses:["Ext.form.field.Number"],createMenu:function(config){var menu,me=this;return menu=Ext.create("Ext.ux.grid.menu.RangeMenu",config),menu.on("update",me.fireUpdate,me),menu},getValue:function(){return this.menu.getValue()},setValue:function(value){this.menu.setValue(value)},isActivatable:function(){var key,values=this.getValue();for(key in values)if(void 0!==values[key])return!0;return!1},getSerialArgs:function(){var key,args=[],values=this.menu.getValue();for(key in values)args.push({type:"numeric",comparison:key,value:values[key]});return args},validateRecord:function(record){var val=record.get(this.dataIndex),values=this.getValue(),isNumber=Ext.isNumber;return(!isNumber(values.eq)||val==values.eq)&&(!(isNumber(values.lt)&&val>=values.lt)&&!(isNumber(values.gt)&&val<=values.gt))}});Ext.define("Fbx.os.app.settings.VpnClientLog",{extend:"Fbx.os.app.downloader.TaskLogTab",requires:[],initComponent:function(){var me=this;me.callParent(arguments),me.on("show",function(){me.refreshLogs()}),me.on("boxready",function(){me.refreshLogs()})},refreshLogs:function(){var me=this;!me.loading&&me.isVisible()&&(me.loading=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vpn_client/log/",method:"GET",disableCaching:!0,autoRefresh:!0,callback:function(){me.setLoading(!1),me.loading=!1},success:function(response){var logs=response.jsonData.result,lines=logs.split("\n");me.parseLogs(lines),me.autoRefresh&&setTimeout(function(){me.refreshLogs()},1e3)}}))}});Ext.define("Fbx.os.lib.FbxUtils",{singleton:!0,requires:["Ext.form.field.VTypes"],internationalTel:/^(\+|00)([0-9]+)$/,init:function(){Ext.apply(Ext.form.field.VTypes,{phoneNumber:function(val,field){return val=val.replace(/[^\#\*\+0-9]/g,""),/^\+?[*\#\d\s]+$/.test(val)},phoneNumberText:"Numéro de téléphone invalide",phoneNumberMask:/[\#\*\+\d\s]/i}),Ext.apply(Ext.form.field.VTypes,{ip:function(val,field){var part=val.split(/\./);if(4!=part.length)return!1;for(i in part){var num=parseInt(part[i]);if(!Ext.isNumber(num)||num<0||num>255)return!1}return!0},ipText:"Adresse IP invalide",ipMask:/[\d.]/}),Ext.apply(Ext.form.field.VTypes,{ipv6:function(val,field){if(field.allowIPv4&&Ext.form.field.VTypes.ip(val,field))return!0;var p=val.indexOf("::"),parts=[];if(p>=0){if(val.indexOf("::",p+2)>=0)return!1;parts=val.substring(0,p).split(":"),parts=parts.concat(val.substring(p+2).split(":"))}else if(parts=val.split(":"),8!=parts.length)return!1;for(var i=0;i<parts.length;++i){if(parts[i].length>4)return!1;if(parts[i].indexOf(".")>=0)return!1}return!0},ipv6Text:"Adresse IPv6 invalide",ipv6Mask:/[\d.:a-fA-F]/}),Ext.apply(Ext.form.field.VTypes,{netName:function(val,field){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>63)&&/^[^"\\@<>{}[\]$%&]{3,64}$/.test(val)},netNameText:"Nom Réseau invalide",netNameMask:/[^"\\@<>{}[\]$%&]/}),Ext.apply(Ext.form.field.VTypes,{dnsName:function(val,field){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>63)&&/^[0-9a-z-]{3,64}$/.test(val)},dnsNameText:"Nom DNS invalide",dnsNameMask:/[0-9a-z-]/}),Ext.apply(Ext.form.field.VTypes,{mdnsName:function(val,field){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>63)&&/^[0-9a-zA-Z-]{3,64}$/.test(val)},mdnsNameText:"Nom mDNS invalide",mdnsNameMask:/[0-9a-zA-Z-]/}),Ext.apply(Ext.form.field.VTypes,{netbiosName:function(val,field){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>15)&&/^[0-9a-zA-Z!#$%&'()+,.;=@\[\]^_`{}~-]{3,15}$/.test(val)},netbiosNameText:"Nom Netbios invalide",netbiosNameMask:/[0-9a-zA-Z!#$%&'()+,.;=@\[\]^_`{}~-]/}),Ext.apply(Ext.form.field.VTypes,{macAddr:function(val,field){return/^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$/.test(val)},macAddrText:"Adresse MAC invalide",macAddrMask:/[0-9a-fA-F:]/}),Ext.apply(Ext.form.field.VTypes,{domainName:function(val,field){return/^[a-z0-9\.\-]+\.[a-z0-9]+$/.test(val)},domainNameText:"Nom de domaine invalide",domainNameMask:/[a-z0-9\.\-]/}),Ext.apply(Ext.form.field.VTypes,{downloadUrl:function(val,field){return/^(https?:\/\/|ftps?:\/\/|magnet:)/.test(val)},downloadUrlText:"Adresse de téléchargement invalide"}),Ext.onReady(function(){Ext.define("Ext.locale.fr.view.AbstractView",{override:"Ext.view.AbstractView",loadingText:"En cours de chargement...",msg:"En cours de chargement..."})})},telCountries:{20:"EG",27:"ZA",30:"GR",31:"NL",32:"BE",33:"FR",34:"ES",36:"HU",39:"IT",40:"RO",41:"CH",43:"AT",44:"GB",45:"DK",46:"SE",47:"NO",48:"PL",49:"DE",51:"PE",52:"MX",53:"CU",54:"AR",55:"BR",56:"CL",57:"CO",58:"VE",60:"MY",61:"AU",62:"ID",63:"PH",64:"NZ",65:"SG",66:"TH",81:"JP",82:"KR",84:"VN",86:"CN",90:"TR",91:"IN",92:"PK",93:"AF",94:"LK",95:"MM",98:"IR",211:"SS",212:"MA",213:"DZ",216:"TN",218:"LY",220:"GM",221:"SN",222:"MR",223:"ML",224:"GN",225:"CI",226:"BF",227:"NE",228:"TG",229:"BJ",230:"MU",231:"LR",232:"SL",233:"GH",234:"NG",235:"TD",236:"CF",237:"CM",238:"CV",239:"ST",240:"GQ",241:"GA",242:"CG",243:"CD",244:"AO",245:"GW",248:"SC",249:"SD",250:"RW",251:"ET",252:"SO",253:"DJ",254:"KE",255:"TZ",256:"UG",257:"BI",258:"MZ",260:"ZM",261:"MG",263:"ZW",264:"NA",265:"MW",266:"LS",267:"BW",268:"SZ",269:"KM",291:"ER",297:"AW",298:"FO",299:"GL",350:"GI",351:"PT",352:"LU",353:"IE",354:"IS",355:"AL",356:"MT",357:"CY",358:"FI",359:"BG",370:"LT",371:"LV",372:"EE",373:"MD",374:"AM",375:"BY",376:"AD",378:"SM",380:"UA",382:"ME",385:"HR",387:"BA",389:"MK",420:"CZ",421:"SK",423:"LI",500:"FK",501:"BZ",502:"GT",503:"SV",504:"HN",505:"NI",506:"CR",507:"PA",508:"PM",509:"HT",591:"BO",592:"GY",593:"EC",594:"GF",595:"PY",596:"MQ",597:"SR",598:"UY",599:"AN",670:"TL",673:"BN",674:"NR",675:"PG",676:"TO",677:"SB",678:"VU",679:"FJ",680:"PW",681:"WF",682:"CK",683:"NU",685:"WS",686:"KI",687:"NC",688:"TV",689:"PF",690:"TK",691:"FM",692:"MH",850:"KP",852:"HK",853:"MO",855:"KH",856:"LA",880:"BD",960:"MV",961:"LB",962:"JO",963:"SY",964:"IQ",965:"KW",966:"SA",967:"YE",968:"OM",970:"PS",971:"AE",972:"IL",973:"BH",974:"QA",975:"BT",976:"MN",977:"NP",992:"TJ",993:"TM",994:"AZ",995:"GE",996:"KG",998:"UZ",1146:"CA",1204:"CA",1226:"CA",1236:"CA",1249:"CA",1250:"CA",1289:"CA",1306:"CA",1343:"CA",1365:"CA",1403:"CA",1418:"CA",1431:"CA",1438:"CA",1450:"CA",1506:"CA",1514:"CA",1519:"CA",1579:"CA",1581:"CA",1587:"CA",1600:"CA",1604:"CA",1613:"CA",1647:"CA",1705:"CA",1709:"CA",1778:"CA",1780:"CA",1807:"CA",1819:"CA",1825:"CA",1867:"CA",1873:"CA",1902:"CA",1905:"CA",1242:"BS",1246:"BB",1264:"AI",1268:"AG",1284:"VG",1340:"VI",1345:"KY",1441:"BM",1473:"GD",1649:"TC",1664:"MS",1670:"MP",1671:"GU",1684:"AS",1758:"LC",1767:"DM",1784:"VC",1787:"PR",1939:"PR",1809:"DO",1829:"DO",1849:"DO",1868:"TT",1869:"KN",1876:"JM",379:"VA",381:"RS",386:"SI",377:"MC",262:"RE",672:"HM",590:"GP",247:"SH",290:"SH"},normalizePhoneNumber:function(number){var numberInfos={number:"",countryPrefix:"33",international:!1,country:"FR"};number=number.replace(/[^#\*\+0-9]/g,"");var match=this.internationalTel.exec(number);if(match){var pfxLen=1;if(number=match[2],"1"==number[0]){var pfx=number.substring(0,4);numberInfos.country=this.telCountries[pfx]?this.telCountries[pfx]:"US"}else if("7"==number[0])"6"==number[1]||"7"==number[1]?numberInfos.country="KZ":numberInfos.country="RU";else{for(pfxLen=2;pfxLen<4;pfxLen++){var pfx=number.substring(0,pfxLen);if(this.telCountries[pfx]){numberInfos.country=this.telCountries[pfx];break}}4==pfxLen&&(pfxLen=0)}if("GB"==numberInfos.country){var pfx=number.substring(0,6);"441481"==pfx?numberInfos.country="GG":"441534"==pfx?numberInfos.country="JE":"441624"==pfx&&(numberInfos.country="IM")}else if("IT"==numberInfos.country){var pfx=number.substring(0,7);"3906698"==pfx&&(numberInfos.country="VA")}else if("MA"==numberInfos.country){var pfx=number.substring(0,7);"2125288"!=pfx&&"2125289"!=pfx||(numberInfos.country="EH")}else if("RE"==numberInfos.country){var pfx=number.substring(0,6);"262269"!=pfx&&"262639"!=pfx||(numberInfos.country="YT")}numberInfos.number=number.substring(pfxLen),numberInfos.countryPrefix=number.substring(0,pfxLen),numberInfos.international=!0}else numberInfos.number=number;return numberInfos.displayNumber=this.formatTelNumber(numberInfos),numberInfos},formatTelNumber:function(numberInfos){var displayNumber=numberInfos.number;return"FR"==numberInfos.country&&numberInfos.international&&(displayNumber="0"+displayNumber),displayNumber.length%3==0?displayNumber=displayNumber.replace(/([0-9]{3})/g,"$1."):displayNumber.length%2==0&&(displayNumber=displayNumber.replace(/([0-9]{2})/g,"$1.")),displayNumber=displayNumber.replace(/\.$/,""),"FR"!=numberInfos.country&&numberInfos.international&&(displayNumber="+"+numberInfos.countryPrefix+" "+displayNumber),displayNumber},phoneNumberTypes:{fixed:"Domicile",mobile:"Mobile",work:"Bureau",fax:"Fax",other:"Autre"},phoneTypeString:function(type){return this.phoneNumberTypes[type]?this.phoneNumberTypes[type]:""},emailNumberTypes:{home:"Domicile",work:"Bureau",other:"Autre"},emailTypeString:function(type){return this.emailNumberTypes[type]?this.emailNumberTypes[type]:""},urlTypes:{profile:"Profil",blog:"Blog",site:"Site",other:"Autre"},urlTypeString:function(type){return this.urlTypes[type]?this.urlTypes[type]:""},addressTypes:{home:"Domicile",work:"Bureau",other:"Autre"},addressTypeString:function(type){return this.addressTypes[type]?this.addressTypes[type]:""},fileSize:function(size){return size<1e3?size+" octets":size<1e6?Math.round(10*size/1e3)/10+" Ko":size<1e9?Math.round(10*size/1e6)/10+" Mo":size<1e12?Math.round(10*size/1e9)/10+" Go":Math.round(10*size/1e12)/10+" To"},rate:function(size){return 0===size?"-":size<1e3?size+" octet/s":size<1e6?Math.round(10*size/1e3)/10+" Ko/s":size<1e9?Math.round(10*size/1e6)/10+" Mo/s":Math.round(10*size/1e9)/10+" Go/s"},rateBits:function(size){return 0===size?"-":size<1e3?size+" bits/s":size<1e6?Math.round(10*size/1e3)/10+" kb/s":size<1e9?Math.round(10*size/1e6)/10+" Mb/s":Math.round(10*size/1e9)/10+" Gb/s"},unaccented:"AAAAAAACEEEEIIIIDNOOOOO.OUUUUY..aaaaaaaceeeeiiiidnooooo.ouuuuy.yAaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiIiJjKkkLlLlLlLlJlNnNnNnnNnOoOoOoOoRrRrRrSsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZz.",stripAccents:function(str){for(var answer="",i=0;i<str.length;i++){var ch=str[i],chindex=ch.charCodeAt(0)-192;if(chindex>=0&&chindex<this.unaccented.length){var outch=this.unaccented.charAt(chindex);"."!=outch&&(ch=outch)}answer+=ch}return answer},lengthInUtf8Bytes:function(str){var m=encodeURIComponent(str).match(/%[89ABab]/g);return str.length+(m?m.length:0)},checkSubnet:function(router_ip,ip){if(!router_ip||!ip)return"IP invalide";var part_r=router_ip.split(/\./);if(4!=part_r.length)return"IP invalide";var part=ip.split(/\./);if(4!=part.length)return"IP invalide";for(var i=0;i<3;i++)if(parseInt(part_r[i])!=parseInt(part[i]))return"l'IP n'appartient pas à votre réseau local";var val=parseInt(part[3]);return!(!Ext.isNumber(val)||val<=0||val>255)||"IP invalide"},strToIpNum:function(str){if(!str)return 0;var parts=str.split(".");return 4!=parts.length?0:16777216*parseInt(parts[0])+65536*parseInt(parts[1])+256*parseInt(parts[2])+parseInt(parts[3])},ipToStr:function(num){var str="";return str+=Math.floor(num/16777216),num%=16777216,str+="."+Math.floor(num/65536),num%=65536,str+="."+Math.floor(num/256),num%=256,str+="."+num},dirname:function(path){return path?path.replace(/\/[^\/]+$/,""):""},dirname_b64:function(path){return(path=this.base64_decode(path))?(path=path.replace(/\/[^\/]+$/,""),this.base64_encode(path)):""},basename:function(path){return path?(path=path.replace(/\/$/,""),path.replace(/^.*\/([^\/]+)$/,"$1")):""},basename_b64:function(path){return(path=this.base64_decode(path))?(path=path.replace(/\/$/,""),path=path.replace(/^.*\/([^\/]+)$/,"$1"),this.base64_encode(path)):""},isMobileDeviceCached:void 0,isMobileDevice:function(){if(void 0!=Fbx.os.lib.FbxUtils.isMobileDeviceCached)return Fbx.os.lib.FbxUtils.isMobileDeviceCached;var a=navigator.userAgent||navigator.vendor||window.opera,t1=/android|(bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|tablet|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a),t2=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4));return Fbx.os.lib.FbxUtils.isMobileDeviceCached=t2||t1,Fbx.os.lib.FbxUtils.isMobileDeviceCached},stringify:function(node,path,values){if(Ext.isObject(node)||Ext.isArray(node))for(var name in node)Fbx.os.lib.FbxUtils.stringify(node[name],path+name+".",values);else path=path.substring(0,path.length-1),values[path]=node;return values},objectify:function(key,value,obj,isArray){var isNumeric=Ext.isNumeric(key);if(isNumeric)return void(obj[key]=value);for(var parts=key.split("."),len=parts.length,ptr=obj,j=0;j<len;j++){var part=parts[j],isNumeric=Ext.isNumeric(part);isNumeric&&(part=Ext.Number.from(part)),j==len-1?ptr[part]=value:(ptr[part]||(ptr[part]=isArray&&j==len-2?[]:{}),ptr=ptr[part])}},_b64keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",base64_encode:function(input){if(!input)return input;var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0;for(input=this._utf8_encode(input);i<input.length;)chr1=input.charCodeAt(i++),chr2=input.charCodeAt(i++),chr3=input.charCodeAt(i++),enc1=chr1>>2,enc2=(3&chr1)<<4|chr2>>4,enc3=(15&chr2)<<2|chr3>>6,enc4=63&chr3,isNaN(chr2)?enc3=enc4=64:isNaN(chr3)&&(enc4=64),output=output+this._b64keyStr.charAt(enc1)+this._b64keyStr.charAt(enc2)+this._b64keyStr.charAt(enc3)+this._b64keyStr.charAt(enc4);return output},base64_decode:function(input){if(!input)return input;for(var chr1,chr2,chr3,enc1,enc2,enc3,enc4,output="",i=0;i<input.length;)enc1=this._b64keyStr.indexOf(input.charAt(i++)),enc2=this._b64keyStr.indexOf(input.charAt(i++)),enc3=this._b64keyStr.indexOf(input.charAt(i++)),enc4=this._b64keyStr.indexOf(input.charAt(i++)),chr1=enc1<<2|enc2>>4,chr2=(15&enc2)<<4|enc3>>2,chr3=(3&enc3)<<6|enc4,output+=String.fromCharCode(chr1),64!=enc3&&(output+=String.fromCharCode(chr2)),64!=enc4&&(output+=String.fromCharCode(chr3));return output=this._utf8_decode(output)},_utf8_encode:function(string){string=string.replace(/\r\n/g,"\n");for(var utftext="",n=0;n<string.length;n++){var c=string.charCodeAt(n);c<128?utftext+=String.fromCharCode(c):c>127&&c<2048?(utftext+=String.fromCharCode(c>>6|192),utftext+=String.fromCharCode(63&c|128)):(utftext+=String.fromCharCode(c>>12|224),utftext+=String.fromCharCode(c>>6&63|128),utftext+=String.fromCharCode(63&c|128))}return utftext},_utf8_decode:function(utftext){for(var string="",i=0,c=c1=c2=0;i<utftext.length;)c=utftext.charCodeAt(i),c<128?(string+=String.fromCharCode(c),i++):c>191&&c<224?(c2=utftext.charCodeAt(i+1),string+=String.fromCharCode((31&c)<<6|63&c2),i+=2):(c2=utftext.charCodeAt(i+1),c3=utftext.charCodeAt(i+2),string+=String.fromCharCode((15&c)<<12|(63&c2)<<6|63&c3),i+=3);return string},niceEventDay:function(eventDate){if(0==eventDate)return"jamais";var today=Fbx.os.lib.FbxUtils.getParisMoment();today.hour(0),today.minute(0),today.second(0),today.millisecond(0);var eventMoment=Fbx.os.lib.FbxUtils.getParisMoment(eventDate.getTime());eventMoment.hour(0),eventMoment.minute(0),eventMoment.second(0),eventMoment.millisecond(0);var paris=-eventMoment.utcOffset(),local=eventDate.getTimezoneOffset(),offset=local-paris,date=new Date(eventDate.getTime()+60*offset*1e3),day=Ext.Date.format(date,"\\L\\e d/m/Y");return dayDifference=eventMoment.diff(today,"days"),-1==dayDifference?day="hier":0==dayDifference?day="aujourd'hui":1==dayDifference?day="demain":dayDifference<3&&dayDifference>-3?day=(dayDifference>0?"dans "+dayDifference:"il y a "+-dayDifference)+" jours":dayDifference<30&&dayDifference>-30&&(day=Ext.Date.format(date,"l d M")),day},niceEventTimesDisplay:function(eventDate){var paris=-Fbx.os.lib.FbxUtils.getParisMoment().utcOffset(),local=eventDate.getTimezoneOffset(),offset=local-paris,date=new Date(eventDate.getTime()+60*offset*1e3),time=Ext.Date.format(date,"H:i:s");return Fbx.os.lib.FbxUtils.niceEventDay(eventDate)+" à "+time},niceExpireTimesDisplay:function(eventDate){var today=Fbx.os.lib.FbxUtils.getParisMoment();today.hour(0),today.minute(0),today.second(0),today.millisecond(0);var paris=-Fbx.os.lib.FbxUtils.getParisMoment().utcOffset(),local=eventDate.getTimezoneOffset(),offset=local-paris,eventMoment=Fbx.os.lib.FbxUtils.getParisMoment(eventDate.getTime());eventMoment.hour(0),eventMoment.minute(0),eventMoment.second(0),eventMoment.millisecond(0);var date=new Date(eventDate.getTime()+60*offset*1e3),time=Ext.Date.format(date,"H\\hi"),dayDifference=eventMoment.diff(today,"days"),day=Ext.Date.format(eventDate,"d/m/Y");return 0==dayDifference?"jusqu'à "+time:(day=1==dayDifference?"jusqu'à demain":dayDifference<7&&dayDifference>-7?"jusqu'à "+Ext.Date.format(date,"l d M"):"jusqu'au "+day)+" à "+time},formatDuration:function(duration,shortFormat){if(duration<=0)return" - ";var nb_elem=0,res="";if(duration>86400){var days=Math.floor(duration/86400);res+=days+" jour"+(days>1?"s ":" "),duration%=86400,++nb_elem}if(duration>3600){var hours=Math.floor(duration/3600);res+=hours+" heure"+(hours>1?"s ":" "),duration%=3600,++nb_elem}if(shortFormat&&nb_elem>=2)return res;if(duration>60){var mins=Math.floor(duration/60);res+=mins+" min"+(mins>1?"s ":" "),duration%=60}return shortFormat&&nb_elem>=2?res:(duration>0&&(res+=duration+" s"),res)},displayTime:function(timestamp){var d=Fbx.os.lib.FbxUtils.getParisMoment(1e3*timestamp),h=d.hour();h<10&&(h="0"+h);var m=d.minute();return m<10&&(m="0"+m),h+":"+m},getParisMoment:function(when,format){return void 0===when?moment.tz("Europe/Paris"):void 0===format?moment.tz(when,"Europe/Paris"):moment.tz(when,format,"Europe/Paris")},genWifiQrCode:function(encryption,ssid,key,hidden,canvas){var wifiStr="WIFI:T:";wifiStr+="wep"==encryption?"WEP":"WPA",ssid=ssid.replace(/\\/g,"\\\\"),ssid=ssid.replace(/:/g,"\\:"),ssid=ssid.replace(/;/g,"\\;"),key=key.replace(/\\/g,"\\\\"),key=key.replace(/:/g,"\\:"),key=key.replace(/;/g,"\\;"),wifiStr+=";S:"+ssid+";P:"+key,hidden&&(wifiStr+=";H:true"),wifiStr+=";;";var q=qrcodegen.QrCode.encodeText(wifiStr,qrcodegen.QrCode.Ecc.MEDIUM);q.drawCanvas(q.size>30?4:5,0,canvas)},rsrqLevelColor:function(level){return level>-8?"green":level>-10?"limegreen":level>-12?"#DAA520":level>-20?"orange":"red"},rsrpLevelColor:function(level){return level>-85?"green":level>-95?"limegreen":level>-105?"#DAA520":level>-115?"orange":"red"},rssiLevelColor:function(level){return level>-85?"green":level>-95?"limegreen":level>-105?"#DAA520":level>-115?"orange":"red"}});Ext.define("Fbx.os.app.explorer.FsTaskModel",{extend:"Ext.data.Model",requires:["Fbx.os.lib.FbxUtils"],statics:{taskTypeStr:{cat:"Concaténation",cp:"Copie",mv:"Déplacement",rm:"Suppression",archive:"Archivage",extract:"Extraction",repair:"Vérification & réparation"},taskErrorStr:{none:"",archive_read_failed:"Erreur lors de la lecture de l'archive",archive_open_failed:"Erreur lors de l'ouverture de l'archive",archive_write_failed:"Erreur lors de l'écriture de l'archive",chdir_failed:"Impossible d'accéder au dossier",dest_is_not_dir:"La destination doit être un dossier",file_exists:"Le fichier de destination existe",file_not_found:"Fichier non trouvé",mkdir_failed:"Impossible de créer le dossier",open_input_failed:"Erreur lors de l'ouverture de la source",open_output_failed:"Erreur lors de l'ouverture de la destination",opendir_failed:"Impossible d'ouvrir le dossier",overwrite_failed:"Impossible d'écraser le fichier",path_too_big:"Chemin trop long",repair_failed:"La réparation a échoué",rmdir_failed:"Erreur lors de la suppression du dossier",same_file:"Les fichiers source et destination sont identiques",unlink_failed:"Erreur de suppression",unsupported_file_type:"Format de fichier non supporté",write_failed:"Erreur d'écriture",disk_full:"Le disque est plein",internal:"Erreur interne",invalid_format:"Format de fichier invalide",incorrect_password:"Mot de passe invalide",permission_denied:"Permission refusée",readlink_failed:"Impossible de lire la cible du lien symbolique",symlink_failed:"Impossible de créer le lien symbolique"},stateStr:{queued:"En attente",running:"En cours",paused:"Suspendu",user_input:"En attente de l'utilisateur",done:"Terminé",failed:"Erreur"}},fields:[{name:"id",type:"int"},{name:"type",type:"string"},{name:"state",type:"string"},{name:"error",type:"string"},{name:"created_ts",type:"date",dateFormat:"timestamp"},{name:"started_ts",type:"date",dateFormat:"timestamp"},{name:"done_ts",type:"date",dateFormat:"timestamp"},{name:"duration",type:"int"},{name:"desc",type:"string"},{name:"progress",type:"int"},{name:"eta",type:"int"},{name:"from",type:"string"},{name:"to",type:"string"},{name:"nfiles",type:"int"},{name:"nfiles_done",type:"int"},{name:"total_bytes",type:"int"},{name:"total_bytes_done",type:"int"},{name:"curr_bytes",type:"int"},{name:"curr_bytes_done",type:"int"},{name:"rate",type:"int"},{name:"done_retval",type:"int"},{name:"title",convert:function(val,rec){var title="";return title+=Fbx.os.app.explorer.FsTaskModel.taskTypeStr[rec.get("type")],title+=" de "+rec.get("nfiles")+" fichier"+(rec.get("nfiles")>1?"s":""),title+=" dans "+Fbx.os.lib.FbxUtils.dirname(rec.get("to")).replace(/ /g,"&nbsp;")}},{name:"status",convert:function(val,rec){var state=rec.get("state");if("failed"!=state)return Fbx.os.app.explorer.FsTaskModel.stateStr[state];var err=Fbx.os.app.explorer.FsTaskModel.taskErrorStr[rec.get("error")];return err||(err="Erreur"),err}}],proxy:{type:"rest",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,url:FbxConf.apiBaseUrl+"fs/tasks/",reader:{type:"json",root:"result",messageProperty:"msg"}},changeCallback:function(records,operation){operation.success?Fbx.os.app.explorer.FsTask.taskStore.load():Ext.Msg.alert("Erreur","Erreur lors de la modification de la tâche")},pause:function(){var me=this;me.set("state","paused"),me.save({callback:me.changeCallback})},resume:function(){var me=this;me.set("state","running"),me.save({callback:me.changeCallback})}});Ext.define("Fbx.os.app.settings.storage.Fsck",{extend:"Ext.window.Window",requires:["Ext.form.Label","Ext.form.field.ComboBox","Fbx.ux.form.AjaxFormPanel","Ext.data.ArrayStore","Ext.button.Button","Ext.form.field.Display"],height:175,width:400,modal:!0,layout:{type:"fit"},closeAction:"hide",title:"Vérification de la partition",initComponent:function(){var me=this;Ext.applyIf(me,{items:[{xtype:"ajaxform",showApplyCancel:!1,showOkBtn:!1,bodyPadding:10,title:"",checkBeforeClose:!1,defaults:{labelWidth:150,anchor:"100%"},buttons:[{xtype:"button",text:"Annuler",iconCls:"icon16 btn-cancel",handler:function(){me.close()}},{xtype:"button",formBind:!0,disabled:!0,text:"Démarrer la vérification",iconCls:"icon16 btn-system-monitor",handler:function(){Ext.Msg.confirm("Vérification du disque","Attention pendant la vérification, le disque ne sera plus accessible et le flux TV peut être interrompu.<br />Voulez-vous lancer la vérification ?",function(btn){if("yes"==btn){var form=me.down("ajaxform");me.diskList.suspendRefresh=!0,form.submit(function(success){success&&(me.close(),Ext.Msg.progress("Vérification de la partition","Vérifications en cours merci de patienter"),me.refreshTimer||setTimeout(function(){me.diskList.suspendRefresh=!1,me.diskList.getStore().load(),me.refreshTimer=setInterval(function(){me.checkProgress()},1e3)},3e3))})}})}}],items:[{xtype:"displayfield",fieldLabel:"Partition",name:"label"},{xtype:"combobox",fieldLabel:"Mode de vérification",name:"checkmode",allowBlank:!1,value:"ro",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["ro","Lecture seule"],["rw","Lecture / Écriture"]]}),editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0},{xtype:"label",text:'NOTE: En mode de vérification "lecture seule" les erreurs éventuelles ne seront pas corrigées'}]}]}),me.callParent(arguments)},fsckResultMsg:{fs_clean:"Aucune erreur détectée",fs_corrected:"Des erreurs ont été corrigées",fs_needs_correction:"Des erreurs ont été détectées",failed:"La vérification a échoué"},checkProgress:function(){var me=this,store=(me.down("ajaxform"),Ext.getStore("storageDiskStore"));if(store){var diskRec=store.getById(me.disk_id);if(diskRec){store=diskRec.partitions();var partitionRec=store.getById(me.id);if(partitionRec){var state=partitionRec.get("fsck_result"),msg=me.fsckResultMsg[state];switch(state){case"no_run_yet":case"running":var infos=partitionRec.get("operation_pct");return progress=infos.percent/100,Ext.Msg.updateProgress(progress,infos.percent+"% - étape "+(infos.done_steps+1)+"/"+infos.max_steps),void Ext.Msg.toFront()}clearInterval(me.refreshTimer),me.refreshTimer=null,me.close(),"fs_clean"===state||"fs_corrected"===state?Ext.Msg.show({title:"Partition OK",msg:msg,icon:Ext.window.MessageBox.INFO,buttons:Ext.Msg.OK}):Ext.Msg.show({title:"Erreur détectées",msg:msg,icon:Ext.window.MessageBox.ERROR,buttons:Ext.Msg.OK}),Ext.Msg.toFront()}}}},loadRecord:function(rec){var me=this,form=me.down("ajaxform");form.url=FbxConf.apiBaseUrl+"storage/partition/"+rec.get("id")+"/check",form.loadRecord(rec),me.disk_id=rec.get("disk_id"),me.id=rec.get("id")}});Ext.define("Fbx.ux.grid.GridKeySelectMixin",{constructor:function(){var me=this;me.on("boxready",function(){var el=me.getEl();me.mon(el,"keydown",function(e){var selModel=me.getSelectionModel();if(!me.isEditing&&e.ctrlKey)switch(e.getCharCode()){case e.A:selModel.selectAll(),me.rememberSelection&&me.rememberSelection(),e.stopEvent()}})})}});Ext.define("Fbx.os.app.pvr.RecordGenModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"type",type:"string"},{name:"name",type:"string"},{name:"media",type:"string"},{name:"path",type:"string"},{name:"params",type:"auto"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"pvr/generator/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.ux.data.proxy.RestTree",{extend:"Ext.data.proxy.Rest",alias:"proxy.resttree",nodeProperty:"node",pageParam:void 0,filterParam:void 0,sortParam:void 0,startParam:void 0,limitParam:void 0,escapePath:function(nodePath){var safePath=encodeURIComponent(nodePath);return safePath=safePath.replace(/%2F/g,"/")},getUrl:function(request){var me=this,url=me.url,nodePath="";if("read"==request.action){var params=request.operation.params;params?params[me.nodeProperty]&&(nodePath=params[me.nodeProperty]):params={},params.countSubFolder="1",params.removeHidden="1";var filters=request.operation.filters;filters&&Ext.Array.each(filters,function(f){f.property==me.nodeProperty&&Ext.isEmpty(nodePath)?nodePath=f.value:"onlyFolder"==f.property&&f.value&&(params.onlyFolder=1)})}else if("update"==request.action&&request.records&&request.records.length){var rec=request.records[0];nodePath=rec.getId()}return""!=nodePath&&(url+=me.escapePath(nodePath)),url=url.replace(/\/+/g,"/")}});Ext.define("Fbx.ux.data.Model",{extend:"Ext.data.Model",save:function(options){options=Ext.apply({},options);var me=this;if(!this.phantom)if(options.callback){var oldcb=options.callback;options.callback=function(records,operation,success){me.syncRelatedStores(),oldcb(records,operation,success)}}else options.callback=me.syncRelatedStores;this.callParent(arguments)},reject:function(silent){this.callParent(arguments);this.onEachRelatedStores(function(assoc,store){silent&&store.suspendEvents(!1);var removed=store.getRemovedRecords();removed.length&&store.loadRecords(removed,{addRecords:!0});var added=store.getNewRecords();for(var i in added){var rec=added[i];store.remove(rec)}var changed=store.getUpdatedRecords();for(var i in changed){var rec=changed[i];rec.reject(silent)}store.removed=[],silent&&store.resumeEvents()})},onEachRelatedStores:function(fn){var me=this;this.associations.each(function(assoc){if("hasMany"==assoc.type){var store=me[assoc.name]();store?fn(assoc,store):console.debug("unable to get "+assoc.storeName)}})},syncRelatedStores:function(){this.onEachRelatedStores(function(assoc,store){store.sync()})},set:function(fieldName,value){var me=this;"id"==fieldName&&(currentValue=me.get(fieldName),void 0!=currentValue&&currentValue!=value&&me.onEachRelatedStores(function(assoc,store){store.each(function(record){record.set(assoc.foreignKey,value)}),store.sync(),store.clearFilter(),store.filter(assoc.foreignKey,value)})),this.callParent(arguments)}});Ext.define("Fbx.os.gui.panel.ActivityBtn",{extend:"Ext.container.Container",requires:["Ext.Button"],constructor:function(config){config=Ext.apply(config,{layout:{type:"vbox",align:"stretch"},items:[{id:"fbx-taskbar-activity-btn",xtype:"button",width:50,enableToggle:!0,pressed:!0,componentCls:"taskbar-activity-btn",pressedCls:"taskbar-activity-btn-pressed",icon:"resources/images/fbx/loading-big.gif",handler:function(){var win=Fbx.os.gui.Environment.taskWin;if(win){var isUnder=!1;if(Ext.WindowManager.eachTopDown(function(w){return w!=win&&(w.maximized?(isUnder=!0,!1):void 0)}),isUnder)return void win.toFront();win.getCollapsed()?win.expand():win.collapse()}}}]}),config.vertical||(config.layout.type="hbox"),this.callParent([config])}});Ext.define("Fbx.os.app.explorer.FsUploadColumn",{extend:"Ext.grid.column.Template",alias:"widget.fsuploadcolumn",requires:["Fbx.os.lib.FbxUtils"],tpl:'<div class="fstask-view"><div class="fstask-title">Upload dans {dirname:htmlEncode}</div>  <div class="fstask-content">    <div class="fstask-progress-outer">      <div style="height: 100%; position: relative;" class="x-progress-inner">        <div class="fstask-progress fstask-progress-{status}" style="width: {[Ext.util.Format.number(values.progress, "0%")]};"></div>        <div class="fstask-progress-txt fstask-progress-txt-{status}">          {[Ext.util.Format.number(values.progress, "0.00%")]}           ({[Fbx.os.lib.FbxUtils.fileSize(values.uploaded)]} / {[Fbx.os.lib.FbxUtils.fileSize(values.size)]})        </div>&nbsp;      </div>    </div>    <div class="fstask-path">      Temps restant : {[Fbx.os.lib.FbxUtils.formatDuration(values.timeLeft)]} (à {[Fbx.os.lib.FbxUtils.rate(values.speed)]})    </div>    <div class="fstask-path" style="margin-bottom: 5px;"><strong>État :</strong> {status_str:htmlEncode}</div>    <div class="fstask-path"><strong>Source:</strong> {upload_name:htmlEncode}</div>    <div class="fstask-path"><strong>Destination:</strong> {dirname:htmlEncode}</div>  </div></div>'});Ext.define("Fbx.os.app.settings.ports.PortInModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"in_port",type:"int"},{name:"netns",type:"string"},{name:"enabled",type:"bool"},{name:"readonly",type:"bool"},{name:"active",type:"bool"},{name:"min_port",type:"int",defaultValue:0},{name:"max_port",type:"int",defaultValue:65535},{name:"port_valid",type:"bool",convert:function(v,r){var port=r.get("in_port");return port>=r.get("min_port")&&port<=r.get("max_port")}},{name:"description",type:"string",convert:function(v,r){return{"bittorrent-main":"Client bittorrent Freebox - Port principal","bittorrent-dht":"Client bittorrent Freebox - DHT",http:"Accès à distance à Freebox OS",https:"Accès à distance sécurisé à Freebox OS",openvpn_routed:"Serveur VPN - OpenVPN mode routé",openvpn_bridge:"Serveur VPN - OpenVPN mode bridgé",ipsec_ike:"Serveur VPN - IPsec IKEv2",ipsec_nat:"Serveur VPN - IPsec NAT",pptp:"Serveur VPN - PPTP",ftp:"Serveur FTP - Contrôle",ftp_pasv:"Serveur FTP - Données"}[r.get("id")]}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"fw/incoming/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.contacts.AddressEditor",{extend:"Ext.form.Panel",requires:["Ext.grid.plugin.CellEditing","Ext.form.FieldContainer","Ext.form.field.Text","Ext.form.field.ComboBox","Fbx.ux.grid.plugin.CellEditing","Ext.grid.column.Template","Ext.grid.column.Action","Ext.Img","Fbx.os.lib.CountryStore"],alias:"widget.addressEditor",height:175,bodyPadding:10,preventHeader:!0,buttons:[{text:"Annuler",iconCls:"btn-cancel",handler:function(me){var win=me.up("window"),form=me.up("form").getForm(),record=form.getRecord();if(record.phantom){record.store.remove(record)}win.hide()}},{text:"Enregistrer",iconCls:"btn-disk",handler:function(me){var form=me.up("form").getForm(),record=form.getRecord();form.isDirty()&&(record.modified.street=!0),form.updateRecord(record),me.up("window").hide()}}],initComponent:function(){var me=this;Ext.applyIf(me,{fieldDefaults:{labelWidth:80},items:[{xtype:"fieldcontainer",fieldLabel:"Rue",layout:{type:"hbox"},items:[{xtype:"textfield",emptyText:"Numéro",name:"number",margins:{top:0,right:5,bottom:0,left:0},width:70,fieldLabel:""},{xtype:"textfield",emptyText:"Rue",name:"street",flex:1}]},{xtype:"textfield",fieldLabel:"Complément",emptyText:"Complément d'adresse",anchor:"100%",name:"street2"},{xtype:"fieldcontainer",layout:{type:"hbox"},fieldLabel:"Ville",anchor:"100%",items:[{xtype:"textfield",fieldLabel:"",emptyText:"Code Postal",name:"zipcode",margins:{top:0,right:5,bottom:0,left:0},width:70},{xtype:"textfield",fieldLabel:"",emptyText:"Ville",name:"city",flex:1}]},{xtype:"combobox",fieldLabel:"Pays",anchor:"100%",store:Ext.create("Fbx.os.lib.CountryStore"),queryMode:"local",displayField:"name",name:"country"}]}),me.callParent(arguments),me.getForm().trackResetOnLoad=!0}});Ext.define("Fbx.os.gui.ApplicationModel",{extend:"Ext.data.Model",requires:["Ext.data.Store"],idProperty:"application",statics:{getIconCls:function(appName,size){var cls=appName.replace(/^Fbx\.os\.app\./,"");return cls=cls.replace(/\.app$/,""),cls=cls.replace(/\./g,"-"),"app-icons-"+size+"-"+cls.toLowerCase()},init:function(){var apps=[{name:"État de la Freebox",application:"Fbx.os.app.settings.ConnectionStatus",order:10,defaultDesktop:!0,qtip:"Consultez l'état de votre Freebox.",menu:"root"},{name:"Freebox TV",application:"Fbx.os.app.tv.app",order:20,defaultDesktop:!0,qtip:"Regardez la TV.",isNew:!0,menu:"tv"},{name:"Téléchargements",application:"Fbx.os.app.downloader.app",order:30,defaultDesktop:!0,qtip:"Téléchargez des fichiers sur Internet avec votre Freebox.",menu:"root"},{name:"Explorateur de fichiers",application:"Fbx.os.app.explorer.app",order:40,defaultDesktop:!0,qtip:"Explorez le contenu des disques connectés au Freebox Server.",menu:"root"},{name:"Paramètres de la Freebox",application:"Fbx.os.app.settings.app",order:50,defaultDesktop:!0,qtip:"Accédez aux réglages de votre Freebox Server.",menu:"settings"},{name:"Contrôle parental",application:"Fbx.os.app.settings.ParentalFilterConfig",order:60,defaultDesktop:!0,qtip:"Définissez les horaires d'accès à Internet des différents ordinateurs de votre réseau.",menu:"settings"},{name:"Périphériques réseau",application:"Fbx.os.app.lanbrowser.app",order:70,defaultDesktop:!0,qtip:"Gérez les différents périphériques connectés à votre réseau.",menu:"settings"},{name:"Journal d'appels",application:"Fbx.os.app.calls.app",order:80,defaultDesktop:!0,qtip:"Consultez l'historique des appels reçus et émis.",menu:"phone"},{name:"Gestion des enregistrements",application:"Fbx.os.app.pvr.app",order:90,defaultDesktop:!0,qtip:"Gérez vos enregistrements TV.",isNew:!0,menu:"tv"},{name:"Guide des programmes",application:"Fbx.os.app.epg.app",order:100,defaultDesktop:!0,qtip:"Consultez le guide des programmes TV Freebox",isNew:!0,menu:"tv"},{name:"Contacts",application:"Fbx.os.app.contacts.app",order:110,defaultDesktop:!0,qtip:"Importez et modifiez vos contacts pour personnaliser le journal d'appels.",menu:"phone"}];Fbx.os.app.grillepain.app.grillePainEnabled&&apps.push(Fbx.os.app.grillepain.app.appDefinition),apps.push({name:"Aide",application:"Fbx.os.app.help.app",order:130,defaultDesktop:!0,qtip:"Consultez la documentation complète de FreeboxOS.",menu:"root"},{name:"Premiers pas",application:"Fbx.os.app.quickstart.app",order:140,defaultDesktop:!1,qtip:"Découvrez les fonctionnalités de votre Freebox Server.",menu:"root"}),Ext.create("Ext.data.Store",{model:"Fbx.os.gui.ApplicationModel",storeId:"appStore",data:apps})}},fields:[{name:"application",type:"string"},{name:"name",type:"string"},{name:"defaultDesktop",type:"boolean",defaultValue:!1},{name:"order",type:"int"},{name:"qtip",type:"string"},{name:"isNew",type:"boolean",defaultValue:!1},{name:"menu",type:"string"},{name:"iconCls",type:"string",convert:function(v,rec){return Fbx.os.gui.ApplicationModel.getIconCls(rec.get("application"),32)}}]});Ext.define("Fbx.os.gui.grid.column.DurationColumn",{extend:"Ext.grid.column.Template",alias:"widget.durationcolumn",sortType:"asFloat",constructor:function(cfg){var me=this;me.callParent(arguments),me.renderer=function(value,p,record){var data=Ext.apply({},record.data,record.getAssociatedData());return data.val=record.get(me.dataIndex),me.tpl.apply(data)}},tpl:"{[Fbx.os.lib.FbxUtils.formatDuration(values.val)]}"});Ext.define("Fbx.os.app.settings.DhcpStaticLeaseModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"mac",type:"string"},{name:"hostname",type:"string"},{name:"host",type:"object"},{name:"ip",type:"string"},{name:"comment",type:"string"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"dhcp/static_lease/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.ux.form.FilterField",{extend:"Ext.form.field.Trigger",alias:"widget.filterfield",trigger1Cls:Ext.baseCSSPrefix+"form-clear-trigger",trigger2Cls:Ext.baseCSSPrefix+"form-search-trigger",initComponent:function(){this.callParent(arguments),this.on("specialkey",function(f,e){e.getKey()==e.ENTER&&this.onTrigger2Click()},this)},afterRender:function(){this.callParent(),this.triggerEl.item(0).setDisplayed("block")},onTrigger1Click:function(){this.reset()},onTrigger2Click:function(){this.checkChange()}});Ext.define("Fbx.os.app.settings.VpnClientApps",{extend:"Fbx.ux.form.AjaxFormPanel",requires:[],initComponent:function(){var me=this;Ext.applyIf(me,{url:FbxConf.apiBaseUrl+"vpn_client/apps/",layout:{align:"stretch",type:"vbox"},bodyPadding:10,defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"label",html:'<div style="padding: 5px 0;">Sélectionnez dans la liste suivante les applications qui doivent utiliser le client VPN de la Freebox pour accéder à internet.<div>'},{xtype:"checkboxfield",beforeLabelTpl:'<div class="app-icons-32-downloader" style="float: left; margin-right: 5px;"></div><div style="padding-top: 7px;">',fieldLabel:"Gestionnaire de téléchargements",afterLabelTpl:"</div>",beforeBodyEl:'<div style="padding-top: 7px;">',afterBodyEl:"</div>",boxLabel:"",name:"fbxgrabberd.use_vpn"}]}),me.callParent(arguments),me.load(),me.mon(me,"show",function(){me.load()})}});Ext.define("Fbx.os.app.accounts.SessionsModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"app_name",type:"string"},{name:"device_name",type:"string"},{name:"client_ip",type:"string"},{name:"start_time",type:"int"},{name:"is_web_app",type:"bool"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"sessions/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.SwitchGraph",{extend:"Ext.panel.Panel",alias:"widget.switchgraph",requires:["Fbx.os.gui.chart.FlotRrdChart"],layout:{align:"stretch",type:"vbox"},initComponent:function(){var me=this;me.curPortId=1,me.downChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"switch",flex:1,fields:[{name:"rx_"+me.curPortId,label:"Débit en réception",color:"#115fa6"}],yaxes:[{min:0,axisLabel:"Débit en réception",unit:"MB/s"}],isRate:!0,autoRefresh:!0,precision:1,period:3600,legendPosition:"sw",nbPointMax:5e3}),me.upChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"switch",flex:1,fields:[{name:"tx_"+me.curPortId,label:"Débit en émission",color:"#a61120"}],yaxes:[{min:0,axisLabel:"Débit en émission",unit:"MB/s"}],isRate:!0,autoRefresh:!0,precision:1,period:3600,legendPosition:"sw",nbPointMax:5e3}),Ext.applyIf(me,{buttons:[{xtype:"button",text:"Heure",handler:function(){me.setPeriod(3600)}},{xtype:"button",text:"Jour",handler:function(){me.setPeriod(86400)}},{xtype:"button",text:"Semaine",handler:function(){me.setPeriod(604800)}},{xtype:"button",text:"Mois",handler:function(){me.setPeriod(2592e3)}}],items:[me.downChart,me.upChart],listeners:{beforehide:function(){me.downChart&&(me.downChart.suspendRefresh=!0,me.upChart.suspendRefresh=!0)},beforeshow:function(){me.refresh(),me.downChart&&(me.downChart.suspendRefresh=!1,me.upChart.suspendRefresh=!1,me.downChart.loadData(),me.upChart.loadData())}}}),me.callParent(arguments)},setPeriod:function(period){var me=this;me.downChart.setPeriod(period),me.upChart.setPeriod(period)},refresh:function(portId,rec){var me=this;console.debug("refresh",arguments),portId&&portId!==me.curPortId&&(me.curPortId=portId,me.downChart.fields=[{name:"rx_"+rec.get("rrd_id"),label:"Débit en réception",color:"#115fa6",selected:!0}],me.upChart.fields=[{name:"tx_"+rec.get("rrd_id"),label:"Débit en émission",color:"#a61120",selected:!0}],me.downChart.loadData(!0),me.upChart.loadData(!0))}});Ext.define("Fbx.os.gui.chart.SpeedChart",{extend:"Ext.Component",alias:"widget.speedchart",config:{nbSample:50,flex:1,color:"blue"},plot:function(){var me=this;if(me.flotPlaceHolder){var options={grid:{borderWidth:1},xaxis:{show:!1,mode:"time",timezone:"browser"},yaxes:[{show:!1,min:0,autoscaleMargin:.2}],legend:{show:!1}};me.flot=$.plot(me.flotPlaceHolder,[{label:"",data:me.data,color:me.color,lines:{fill:!0,lineWidth:1}}],options)}},initComponent:function(){var me=this;me.data=[],me.plotId=Ext.id(),me.html='<div class="flot-placeholder" id="'+me.plotId+'"></div>',this.callParent(arguments),me.on("boxready",function(){me.flotPlaceHolder=$("#"+me.plotId)})},pushValue:function(value){var me=this,now=new Date,paris=Fbx.os.lib.FbxUtils.getParisMoment().utcOffset(),local=now.getTimezoneOffset(),offset=local-paris;me.data.length>=me.nbSample&&me.data.shift(),me.data.push([now.getTime()+60*offset*1e3,value]),me.plot()}});Ext.define("Fbx.os.app.tv.ChannelDb",{mixins:{observable:"Ext.util.Observable"},statics:{_instance:null,channels:{},loaded:!1,getInstance:function(){return Fbx.os.app.tv.ChannelDb._instance||(Fbx.os.app.tv.ChannelDb._instance=Ext.create("Fbx.os.app.tv.ChannelDb")),Fbx.os.app.tv.ChannelDb._instance}},constructor:function(config){var me=this;me.mixins.observable.constructor.apply(me,arguments),me.addEvents("load"),me.callParent(arguments)},load:function(){var me=this;if(Fbx.os.app.tv.ChannelDb.loaded)return void me.fireEvent("load");Ext.Ajax.request({url:FbxConf.apiBaseUrl+"tv/channels/",disableCaching:!1,success:function(response){Fbx.os.app.tv.ChannelDb.channels=response.jsonData.result,Fbx.os.app.tv.ChannelDb.loaded=!0,me.fireEvent("load")}})}});Ext.define("Fbx.os.app.explorer.FsTaskColumn",{extend:"Ext.grid.column.Template",alias:"widget.fstaskcolumn",requires:["Fbx.os.lib.FbxUtils"],constructor:function(config){var me=this;config=Ext.apply(me,config),config=Ext.apply(config,{tpl:'<div class="fstask-view">  <div class="fstask-title">{title}</div>  <div class="fstask-content">    <div class="fstask-progress-outer">      <div style="height: 100%; position: relative;" class="x-progress-inner">        <div class="fstask-progress fstask-progress-{state}" style="width: {[Ext.util.Format.number(values.progress, "0%")]};"></div>        <div class="fstask-progress-txt fstask-progress-txt-{state}">          {[Ext.util.Format.number(values.progress, "0.00%")]}           <tpl if="total_bytes">({[Fbx.os.lib.FbxUtils.fileSize(values.total_bytes_done)]} / {[Fbx.os.lib.FbxUtils.fileSize(values.total_bytes)]})</tpl>        </div>&nbsp;      </div>    </div>    <div class="fstask-path">      Temps restant : {[Fbx.os.lib.FbxUtils.formatDuration(values.eta)]} <tpl if="rate">(à {[Fbx.os.lib.FbxUtils.fileSize(values.rate)]}/s)</tpl>    </div>    <div class="fstask-path" style="margin-bottom: 5px;"><strong>État :</strong> {status:htmlEncode}</div>  <tpl if="from != \'\'">    <div class="fstask-path"><strong>Source :</strong> {[Ext.String.htmlEncode(Fbx.os.lib.FbxUtils.basename(values.from))]}</div>  </tpl>  <tpl if="to != \'\'">    <div class="fstask-path"><strong>Destination :</strong> {[Ext.String.htmlEncode(Fbx.os.lib.FbxUtils.basename(values.to))]}</div>  </tpl>  </div></div>'}),this.callParent([config])}});Ext.define("Fbx.ux.data.proxy.RestForeign",{extend:"Ext.data.proxy.Rest",alias:"proxy.restforeign",url:FbxConf.apiBaseUrl+"downloads/{foreignId}/trackers",writeUrl:"",useWriteUrl:!1,foreignProperty:"task_id",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,getUrl:function(request){var me=this,url=me.url,foreignId="",objId="";if(me.useWriteUrl&&"read"!=request.action){var rec=request.records[0],objId=rec.getId();return objId&&""!=objId?me.writeUrl+objId:me.writeUrl}if("read"==request.action){var filters=request.operation.filters;filters&&Ext.Array.each(filters,function(f){f.property==me.foreignProperty&&(foreignId=f.value)})}else if("update"==request.action||"destroy"==request.action){if(request.records&&request.records.length){var rec=request.records[0];foreignId=rec.get(me.foreignProperty),objId=rec.getId()}}else if("create"==request.action&&request.records&&request.records.length){var rec=request.records[0];foreignId=rec.get(me.foreignProperty)}return""!=foreignId?url=url.replace("{foreignId}",encodeURIComponent(foreignId)):Ext.log({level:"error",msg:"invalid foreign id tracker request",dump:request}),""!=objId&&(url+="/"+encodeURIComponent(objId)),url}});Ext.define("Fbx.os.app.settings.SwitchPortModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"integer"},{name:"name",type:"string"},{name:"rrd_id",type:"string"},{name:"duplex",type:"string"},{name:"mode",type:"string"},{name:"speed",type:"string"},{name:"link",type:"string"},{name:"mac_list",type:"auto"},{name:"str",type:"string",convert:function(val,r){return"up"===r.get("link")?r.get("mode"):" - "}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"switch/status/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.ConnectionDynDnsFieldset",{extend:"Ext.form.FieldSet",requires:["Ext.layout.component.FieldSet","Ext.form.field.Checkbox"],config:{fieldPfx:"dyndns."},constructor:function(config){var me=this;Ext.apply(me,config),config=Ext.apply(config,{defaults:{anchor:"100%",labelWidth:150},items:[{xtype:"checkboxfield",fieldLabel:"Activer",boxLabel:"",name:me.fieldPfx+"enabled",listeners:{change:function(field,newVal){var form=me.up("form").getForm();newVal?(form.findField(me.fieldPfx+"user").show(),form.findField(me.fieldPfx+"password").show(),form.findField(me.fieldPfx+"hostname").show()):(form.findField(me.fieldPfx+"user").hide(),form.findField(me.fieldPfx+"password").hide(),form.findField(me.fieldPfx+"hostname").hide())}}},{xtype:"textfield",hidden:!0,fieldLabel:"Utilisateur",name:me.fieldPfx+"user"},{xtype:"textfield",hidden:!0,fieldLabel:"Mot de passe",inputType:"password",name:me.fieldPfx+"password"},{xtype:"textfield",hidden:!0,fieldLabel:"Nom d'hôte",name:me.fieldPfx+"hostname"}]}),this.callParent([config])}});Ext.define("Fbx.os.app.tv.ProgramPanel",{extend:"Ext.panel.Panel",requires:["Ext.XTemplate"],__curProgramId:null,__curProgram:null,__curChannel:null,initComponent:function(){var me=this;me.tpl=new Ext.XTemplate('<div class="tv-epg-detail">  <tpl if="picture"><img class="tv-epg-detail-img" alt="" src="{picture:htmlEncode}" /></tpl>  <div class="tv-epg-desc">{desc:htmlEncode}</div></div>'),me.on("beforeexpand",function(){me.loadDetails()}),me.on("expand",function(){me.refresh()}),this.callParent(arguments)},setProgram:function(channel,program){var me=this;if(!program)return me.setTitle(channel.name),me.__curProgram=null,void me.refresh();if(program.id!=me.__curProgramId){if(me.__curChannel=channel,me.__curProgramId=program.id,me.setTitle(me.__curChannel.name+" / "+program.title),me.getCollapsed())return void(me.getEl()&&me.tpl.overwrite(me.body,{desc:"En cours de chargement"}));me.loadDetails()}},loadDetails:function(){var me=this;me.setLoading(!0),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"tv/epg/programs/"+encodeURIComponent(me.__curProgramId),disableCaching:!1,success:function(response){me.__curProgram=response.jsonData.result,me.__curProgram.desc||(me.__curProgram.desc="Résumé indisponible"),me.__curProgram.title||(me.__curProgram.title="Programme indisponible"),me.refresh()},callback:function(){me.setLoading(!1)}})},refresh:function(){var me=this;if(me.__curChannel&&!me.getCollapsed())return me.__curProgram?void me.tpl.overwrite(me.body,me.__curProgram):void me.tpl.overwrite(me.body,{desc:"Résumé indisponible"})}});Ext.define("Fbx.ux.form.field.NumberWithUnlimited",{extend:"Ext.form.field.Number",alias:"widget.numberwithunlimitedfield",unlimitedText:"illimité",unlimitedVal:0,processRawValue:function(value){var me=this;return value==me.unlimitedText?me.unlimitedVal:value},parseValue:function(value){var me=this;return value=value==me.unlimitedText?me.unlimitedVal:parseFloat(String(value).replace(this.decimalSeparator,".")),isNaN(value)?null:value},setValue:function(value){var me=this;return value==me.unlimitedVal?void me.setRawValue(me.unlimitedText):this.callParent(arguments)}});Ext.define("Fbx.os.app.settings.VpnClientGraph",{extend:"Ext.panel.Panel",requires:["Fbx.os.gui.chart.FlotRrdChart"],initComponent:function(){var me=this;me.downChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"net",flex:1,fields:[{name:"vpn_rate_down",label:"Débit VPN entrant",color:"#94ae0a",lines:{fill:!0}}],yaxes:[{min:0,axisLabel:"Download",unit:"o/s"}],isRate:!0,autoRefresh:!0,precision:10,period:3600,suspendRefresh:!0,nbPointMax:0,legendPosition:"nw",area:!0}),me.upChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"net",flex:1,fields:[{name:"vpn_rate_up",label:"Débit internet sortant",lines:{fill:!0},color:"#a61120"}],yaxes:[{min:0,axisLabel:"Upload",unit:"o/s"}],isRate:!0,autoRefresh:!0,precision:10,period:3600,suspendRefresh:!0,nbPointMax:0,legendPosition:"nw",area:!0}),Ext.applyIf(me,{layout:{align:"stretch",type:"vbox"},buttons:[{xtype:"button",text:"Heure",handler:function(){me.setPeriod(3600)}},{xtype:"button",text:"Jour",handler:function(){me.setPeriod(86400)}},{xtype:"button",text:"Semaine",handler:function(){me.setPeriod(604800)}},{xtype:"button",text:"Mois",handler:function(){me.setPeriod(2592e3)}}],items:[me.downChart,me.upChart],listeners:{beforehide:function(){me.downChart.suspendRefresh=!0,me.upChart.suspendRefresh=!0},beforeshow:function(){me.downChart.suspendRefresh=!1,me.upChart.suspendRefresh=!1,me.downChart.loadData(),me.upChart.loadData()}},setPeriod:function(period){me.downChart.setPeriod(period),me.upChart.setPeriod(period)}}),me.callParent(arguments)}});Ext.define("Fbx.os.app.tv.FlashPlayer",{extend:"Ext.flash.Component",requires:[],statics:{isAvailable:function(){return swfobject.hasFlashPlayerVersion("10.2")}},__pendingPlay:null,__ready:!1,initComponent:function(){var me=this;me.addEvents("stateChange","playbackFailed","srtTrackListChange","audioTrackListChange","srtTrackChange","audioTrackChange"),Ext.flash.Component.EXPRESS_INSTALL_URL="resources/swf/"+FbxFilenames.expressInstall,me.handlerFn="handler_"+me.getSwfId(),window[me.handlerFn]=function(playerId,eventName,infos){me.onPlayerEvent(playerId,eventName,infos)};var prefs=Fbx.os.app.tv.Settings.getUserPrefs();Ext.apply(me,{url:"resources/swf/"+FbxFilenames.hlsplayer,flashVersion:"10.2",expressInstall:!0,wmode:prefs.flash_wmode,flashParams:{quality:prefs.flash_quality,allowFullScreen:!0,handlerFn:me.handlerFn},flashVars:{handlerFn:me.handlerFn}}),me.callParent(arguments),me.on("render",function(){me.getEl().unselectable()}),me.on("hide",function(){me.__ready=!1}),me.on("beforedestroy",function(){me.stop(),delete window[me.handlerFn]}),me.on("failure",function(){Ext.Msg.alert("Erreur Flash Player","Erreur lors de l'initialisation du player Flash"),me.fireEvent("playbackFailed",me)})},onPlayerEvent:function(playerId,eventName,infos){var me=this;switch(eventName){case"playerReady":me.__ready=!0,me.swf.dom.playerSetLogLevel("warn"),me.__pendingPlay&&me.__pendingPlay.length&&(me.play(me.__pendingPlay),me.__pendingPlay=null);break;case"playerError":me.onPlayerError(infos);break;case"playerAudioTracksChange":me.fireEvent("audioTrackListChange",me,infos);break;case"playerSrtTracksChange":infos.unshift({id:-1,name:"Désactivés"}),me.fireEvent("srtTrackListChange",me,infos);break;case"playerAudioTrackChanged":me.fireEvent("audioTrackChange",me,infos);break;case"playerSrtTrackChanged":me.fireEvent("srtTrackChange",me,infos);break;case"playerStateChange":me.fireEvent("stateChange",me,infos)}},onPlayerError:function(errorCode){var me=this;me.fireEvent("playbackFailed",me)},stop:function(){var me=this;me.swf&&me.swf.dom&&me.swf.dom.playerStop&&me.swf.dom.playerStop()},play:function(url){var me=this;if(!me.swf||!me.swf.dom||!me.__ready)return void(me.__pendingPlay=url);me.stop(),me.swf.dom.playerPlay(url)},setAudioTrack:function(trackId){this.swf.dom.playerSetSelectedAudio(trackId)},setSrtTrack:function(trackId){var me=this;me.swf.dom.playerSetSelectedSrt(trackId),-1==trackId&&me.fireEvent("srtTrackChange",me,-1)},fullScreen:function(){console.debug("not implemented yet")},setVolume:function(pct){var me=this;me.swf&&me.swf.dom&&me.swf.dom.playerSetVolume(pct)}});Ext.define("Fbx.os.app.settings.VpnClientConfigModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"description",type:"string"},{name:"type",type:"string"},{name:"active",type:"bool"},{name:"conf_pptp",type:"object"},{name:"conf_openvpn",type:"object"}],statics:{vpnTypeNames:{pptp:"PPTP"}},proxy:{type:"rest",url:FbxConf.apiBaseUrl+"vpn_client/config/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.tv.BouquetModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"name",type:"string"},{name:"channel_count",type:"int"},{name:"state",type:"string"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"tv/bouquets/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.wifi.WifiApModel",{extend:"Ext.data.Model",statics:{apStatusStr:{scanning:"Scan en cours",no_param:"Non configurée",bad_param:"Configuration invalide",disabled:"Désactivée",disabled_planning:"Désactivée (planification)",no_active_bss:"Pas de BSS active",starting:"Démarrage",acs:"Choix du canal",ht_scan:"Scan Wi-Fi HT",dfs:"DFS",active:'<span style="color: green;">Active</span>',failed:'<span style="color: red;">Erreur</span>'}},fields:[{name:"id",type:"int"},{name:"name",type:"string"},{name:"capabilities",type:"object"},{name:"config",type:"object"},{name:"status",type:"object"},{name:"iconCls",type:"string",convert:function(v,r){return"wifi-cap_"+r.raw.config.band}},{name:"capsStr",type:"string",convert:function(v,r){var caps=r.raw.capabilities[r.raw.config.band],str="";return"2d4g"==r.raw.config.band?(str="802.11b, ",caps.ht_20&&(str+=" 802.11g, ")):"5g"==r.raw.config.band&&(str="802.11a, "),caps.ht_40&&(str+=" 802.11n, "),caps.vht_80&&(str+=" 802.11ac, "),str=str.substring(0,str.length-2),r.raw.capsStr=str,str}},{name:"titleStr",type:"string",convert:function(v,r){return"2d4g"==r.raw.config.band?"Carte Wi-Fi 2.4G / 802.11n":"Carte Wi-Fi 5G / 802.11ac"}},{name:"statusStr",type:"string",convert:function(v,r){var status=r.raw.status.state;return"dfs"!=status?Fbx.os.app.settings.wifi.WifiApModel.apStatusStr[status]:"DFS ("+r.raw.status.dfs_cac_remaining_time+" s restantes)"}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"wifi/ap/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.DvbFrontendModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"type",type:"string"},{name:"name",type:"string"},{name:"last_successful_scan",type:"int"},{name:"scan",type:"object"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"dvb/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.explorer.FsUploadModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"int"},{name:"upload_name",type:"string"},{name:"dirname",type:"string"},{name:"size",type:"int"},{name:"uploaded",type:"int"},{name:"start_date",type:"int"},{name:"status",type:"string"},{name:"status_str",type:"string",convert:function(v,record){var readable={authorized:"En attente",in_progress:"En cours",done:"Terminé",failed:"Erreur",aborted:"Annulé",conflict:"Un fichier existe déjà avec le même nom",timeout:"Expiré",cancelled:"Annulé"},s=record.get("status");return readable[s]?readable[s]:""}},{name:"progress",type:"float",convert:function(v,record){return 0==record.raw.size?0:100*record.raw.uploaded/record.raw.size}},{name:"speed",type:"float",convert:function(v,record){if("in_progress"!=record.raw.status||0==record.raw.uploaded)return 0;var elapsed=record.raw.last_update-record.raw.start_date;return elapsed<=0?0:record.raw.uploaded/elapsed}},{name:"lastUpdate",type:"date",convert:function(v,record){var d=new Date;return d.setTime(1e3*record.raw.last_update),d}},{name:"startDate",type:"date",convert:function(v,record){var d=new Date;return d.setTime(1e3*record.raw.start_date),d}},{name:"timeLeft",type:"float",convert:function(v,record){var speed=record.get("speed");if("in_progress"!=record.raw.status||0==record.raw.uploaded||0==speed)return-1;var bytesLeft=record.raw.size-record.raw.uploaded;return Math.round(bytesLeft/speed)}}],proxy:{type:"rest",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,url:FbxConf.uploadBaseUrl,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.ux.form.field.DateDisplay",{extend:"Ext.form.field.Display",requires:["Ext.XTemplate"],alias:"widget.datedisplayfield",tpl:"{val}",dateFormat:"d/m/Y H:i:s",constructor:function(cfg){var tpl,me=this;me.callParent(arguments),tpl=me.tpl=!Ext.isPrimitive(me.tpl)&&me.tpl.compile?me.tpl:Ext.create("Ext.XTemplate",me.tpl),me.renderer=function(value,p,record){var data={val:value};return tpl.apply(data)}},setRawValue:function(value){var me=this;if(Ext.isEmpty(value))return value="",void this.callParent([value]);if("object"!=typeof value){var timestamp=Ext.Number.from(value,0);if(timestamp){var m=moment.tz(1e3*timestamp,"Europe/Paris");value=new Date(m.valueOf()+60*(new Date).getTimezoneOffset()*1e3+60*m.utcOffset()*1e3),value=Ext.Date.format(value,me.dateFormat)}else value=""}else{var m=moment.tz(value,"Europe/Paris");value=new Date(m.valueOf()+60*value.getTimezoneOffset()*1e3+60*m.utcOffset()*1e3),value=Ext.Date.format(value,me.dateFormat)}this.callParent([value])}});Ext.define("Fbx.os.app.tv.BouquetChannelModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"id",type:"string",convert:function(r,rec){return rec.raw.uuid+"_"+rec.raw.number+"_"+rec.raw.sub_number}},{name:"uuid",type:"string"},{name:"number",type:"int"},{name:"sub_number",type:"int"},{name:"available",type:"bool"},{name:"pub_service",type:"bool"},{name:"streams",type:"auto"},{name:"namenumber",type:"auto",persist:!1,convert:function(r,rec){var c=Fbx.os.app.tv.ChannelDb.channels[rec.raw.uuid];return c?rec.get("number")+"/ "+c.name:""}},{name:"channel",type:"auto",persist:!1,convert:function(r,rec){return Fbx.os.app.tv.ChannelDb.channels[rec.raw.uuid]}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"tv/bouquets/freeboxtv/channels/",reader:{type:"json",root:"result",messageProperty:"msg"},sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0}});Ext.define("Fbx.os.app.settings.VpnServerConnModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"rx_bytes",type:"int"},{name:"tx_bytes",type:"int"},{name:"authenticated",type:"bool"},{name:"user",type:"string"},{name:"vpn",type:"string"},{name:"src_ip",type:"string"},{name:"src_port",type:"int"},{name:"local_ip",type:"string"},{name:"auth_time",type:"string"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"vpn/connection/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.Ajax",{override:"Ext.data.Connection",setupHeaders:function(xhr,options,data,params){return options.headers||(options.headers={}),options.headers["X-Fbx-App-Id"]="fr.freebox.mafreebox",options.headers["X-Fbx-Freebox0S"]=1,this.callOverridden(arguments)},lastErrorMsg:"",onComplete:function(request){var result,success,response,jsonData,me=this,options=request.options;try{result=me.parseStatus(request.xhr.status)}catch(e){result={success:!1,isException:!1}}if(!request.aborted&&!request.timedout)if(""===request.xhr.responseText)options.silentError=!0,Ext.log({msg:"got an empty response",level:"warn"});else try{jsonData=Ext.JSON.decode(request.xhr.responseText)}catch(ee){Ext.log({msg:"unable to parse json response",level:"warn"}),jsonData={success:!1,msg:"Format de réponse invalide "+request.xhr.responseText,error_code:"invalid_response"}}if(!jsonData){if(request.aborted)return void Ext.log({msg:"aborted",level:"warn"});request.timedout?(Ext.log({msg:"timedout",level:"warn"}),jsonData={success:!1,msg:"Temps d'attente écoulé",error_code:"timeouted"}):jsonData={success:!1,msg:"Réponse invalide",error_code:"invalid_response"}}success=result.success&&jsonData.success;var is_autorefresh=options.autorefresh||options.operation&&options.operation.autorefresh;if(!success){if("auth_required"===jsonData.error_code)return void(Fbx.os.gui.Environment.isLogged?document.location="./login.php":Fbx.os.gui.Environment.promptLogin());if(request.xhr.status>=500)return void Ext.Msg.alert("C'est cassé !!","Un problème est survenu lors de cette requête au server (erreur: "+request.xhr.status+")");if(413===request.xhr.state)return void Ext.Msg.alert("Erreur","Le fichier que vous avez essayé d'envoyer est trop gros");"hdd_not_mounted"===jsonData.error_code||"hdd_not_found"===jsonData.error_code||"hdd_not_present"===jsonData.error_code?Fbx.os.gui.Environment.setStorageUnavailable(!1):jsonData.msg&&""!==jsonData.msg&&(is_autorefresh&&me.lastErrorMsg===jsonData.msg||options.silentError||(Ext.Msg.alert("Erreur",jsonData.msg),is_autorefresh&&(me.lastErrorMsg=jsonData.msg)))}return success?(me.lastErrorMsg="",response=me.createResponse(request),response.jsonData=jsonData,me.fireEvent("requestcomplete",me,response,options),Ext.callback(options.success,options.scope,[response,options])):(response=result.isException||request.aborted||request.timedout?me.createException(request):me.createResponse(request),response.jsonData=jsonData,me.fireEvent("requestexception",me,response,options),options.proxy&&options.proxy.revertOnFailure&&Ext.Array.each(options.records,function(r){r.reject()}),Ext.callback(options.failure,options.scope,[response,options])),Ext.callback(options.callback,options.scope,[options,success,response]),delete me.requests[request.id],response}});Ext.define("Ext.ux.grid.menu.ListMenu",{extend:"Ext.menu.Menu",idField:"id",labelField:"text",loadingText:"Loading...",loadOnShow:!0,single:!1,plain:!0,constructor:function(cfg){var gridStore,me=this;me.selected=[],me.addEvents("checkchange"),me.callParent(arguments),gridStore=me.grid.store,me.store?(me.add({text:me.loadingText,iconCls:"loading-indicator"}),me.store.on("load",me.onLoad,me)):gridStore.data.length?me.createMenuStore():gridStore.on("load",me.createMenuStore,me,{single:!0})},destroy:function(){var me=this,store=me.store;store&&(me.autoStore?store.destroyStore():store.un("unload",me.onLoad,me)),me.callParent()},show:function(){var me=this;!me.loadOnShow||me.loaded||me.store.loading||me.store.load(),me.callParent()},onLoad:function(store,records){var gid,itemValue,i,len,me=this,listeners={checkchange:me.checkChange,scope:me};for(Ext.suspendLayouts(),me.removeAll(!0),gid=me.single?Ext.id():null,i=0,len=records.length;i<len;i++)itemValue=records[i].get(me.idField),me.add(Ext.create("Ext.menu.CheckItem",{text:records[i].get(me.labelField),group:gid,checked:Ext.Array.contains(me.selected,itemValue),hideOnClick:!1,value:itemValue,listeners:listeners}));me.loaded=!0,Ext.resumeLayouts(!0),me.fireEvent("load",me,records)},createMenuStore:function(){var i,len,value,me=this,options=[];for(me.options=me.grid.store.collect(me.dataIndex,!1,!0),i=0,len=me.options.length;i<len;i++)switch(value=me.options[i],Ext.type(value)){case"array":options.push(value);break;case"object":options.push([value[me.idField],value[me.labelField]]);break;default:null!=value&&options.push([value,value])}me.store=Ext.create("Ext.data.ArrayStore",{fields:[me.idField,me.labelField],data:options,listeners:{load:me.onLoad,scope:me}}),me.loaded=!0,me.autoStore=!0},getSelected:function(){return this.selected},setSelected:function(value){value=this.selected=[].concat(value),this.loaded&&this.items.each(function(item){item.setChecked(!1,!0);for(var i=0,len=value.length;i<len;i++)item.value==value[i]&&item.setChecked(!0,!0)})},checkChange:function(item,checked){var value=[];this.items.each(function(item){item.checked&&value.push(item.value)}),this.selected=value,this.fireEvent("checkchange",item,checked)}});Ext.define("Fbx.os.gui.wizard.Wizard",{extend:"Ext.window.Window",requires:["Fbx.os.gui.wizard.WizardStep","Ext.Button","Ext.container.Container"],alias:"widget.wizard",height:480,width:600,title:"Wizard",modal:!0,baseTitle:"",config:{disableCancelButton:!1},steps:[],stepContainers:[],curStepId:0,curStep:null,nbStep:0,initComponent:function(){var me=this;if(me.btnCancel=Ext.create("Ext.Button",{text:"Annuler",iconCls:"btn-cancel",width:100,handler:function(){me.cancel()}}),me.btnPrev=Ext.create("Ext.Button",{text:"Précédent",iconCls:"btn-previous",width:100,handler:function(){me.goToPrev()}}),me.btnNext=Ext.create("Ext.Button",{text:"Suivant",iconCls:"btn-next",width:100,handler:function(){me.goToNext()}}),me.getDisableCancelButton()&&me.btnCancel.hide(),Ext.applyIf(me,{layout:"fit",dockedItems:[{xtype:"toolbar",dock:"bottom",ui:"footer",items:[me.btnCancel,{xtype:"tbfill"},me.btnPrev,me.btnNext]}]}),me.nbStep=me.steps.length,!me.nbStep)throw new Error("[Wizard] Wizard must contain steps");me.callParent(arguments),me.baseTitle=me.title},getCurStep:function(){var me=this;return me.stepContainers[me.curStepId]?me.stepContainers[me.curStepId].child("wizardStep"):null},loadStep:function(id){var me=this;if(id<0||id>=me.nbStep)throw new Error("[Wizard] trying to load invalid step with id "+id);if(me.stepContainers[me.curStepId]&&me.stepContainers[me.curStepId].hide(),me.stepContainers[id]?me.stepContainers[id].show():(me.stepContainers[id]=Ext.create("Ext.container.Container",{layout:"fit",items:me.steps[id]}),me.add(me.stepContainers[id])),me.curStepId=id,me.curStep=me.stepContainers[me.curStepId].child("wizardStep"),!me.curStep)throw new Error("[Wizard] children must be of xtype wizardStep");id===me.nbStep-1?me.btnNext.setText("Terminer"):me.btnNext.setText("Suivant"),0===id?me.btnPrev.disable():me.btnPrev.enable(),me.setTitle(me.baseTitle+" : "+me.curStep.getTitle()+" ("+(id+1)+"/"+me.steps.length+")")},goToNext:function(force){var me=this;(force||me.curStep.canGoNext())&&(me.curStepId===me.nbStep-1?me.close():me.loadStep(me.curStepId+1))},goToPrev:function(){var me=this;me.loadStep(me.curStepId-1)},close:function(){for(var me=this,c=me.stepContainers.pop();c;)c.destroy(),c=me.stepContainers.pop();me.callParent(arguments)},show:function(){var me=this;me.callParent(arguments),me.loadStep(0)},cancel:function(){var me=this;Ext.Msg.show({title:"Quitter",msg:"Êtes-vous sûr de vouloir quitter ?",buttons:Ext.Msg.YESNO,icon:Ext.Msg.QUESTION,fn:function(res){"yes"===res&&me.close()}})}});Ext.define("Fbx.os.app.tv.EpgDb",{mixins:{observable:"Ext.util.Observable"},statics:{_instance:null,getInstance:function(){return Fbx.os.app.tv.EpgDb._instance||(Fbx.os.app.tv.EpgDb._instance=Ext.create("Fbx.os.app.tv.EpgDb")),Fbx.os.app.tv.EpgDb._instance},PROGRAM_RANGE_DURATION:3600,CHAN_RANGE_DURATION:7200},data:{},constructor:function(config){var me=this;me.mixins.observable.constructor.apply(me,arguments),me.addEvents("currentProgramAvailable"),me.callParent(arguments)},getCurrentProgramForChannel:function(channel){var me=this,now=me.__now();me.__updateCurrentChannel(channel);var chanInfos=me.data[channel];if(chanInfos){if(chanInfos.current){var prog=chanInfos.current;return prog.progress=100*(now-prog.date)/(prog.end-prog.date),prog}if(chanInfos.end>=now&&chanInfos.start<=now)return null}return me.__fetchByTime(),null},getProgramForChannel:function(channel,timestamp,cb){var me=this;if(cb){me.__updateCurrentChannel(channel);var chanInfos=me.data[channel];if(chanInfos&&chanInfos.start<=timestamp&&chanInfos.end>=timestamp)for(var k in chanInfos.programs){var p=chanInfos.programs[k];if(p.date<=timestamp&&p.end>=timestamp)return Ext.Function.defer(function(){cb(p)},100),p}me.__fetchByChannel(channel,timestamp,function(programs){for(var k in programs){var p=programs[k];if(p.date<=timestamp&&p.end>=timestamp)return void cb(p)}cb(null)})}},__byTimeLock:{},__adjustTime:function(time,range){return time-time%range},__now:function(){return Math.floor((new Date).getTime()/1e3)},__progSort:function(a,b){return a.date-b.date},__updateCurrentChannel:function(channel,now){var me=this;now||(now=me.__now());var chanInfos=me.data[channel];if(chanInfos){var chanProgs=chanInfos.programs;chanInfos.current=null;for(var h in chanProgs)chanProgs[h].end<now?delete chanProgs[h]:chanProgs[h].date<=now&&(chanInfos.current=chanProgs[h])}},__updateCurrent:function(){var me=this;me.__now();for(var chan in me.data)me.__updateCurrentChannel(chan)},__prefetchInterval:null,__prefetchNextRange:function(time){var me=this;me.__fetchByTime(time),me.__prefetchInterval||(me.__prefetchInterval=setInterval(function(){time+=Fbx.os.app.tv.EpgDb.PROGRAM_RANGE_DURATION,me.__prefetchNextRange(time)},1e3*Fbx.os.app.tv.EpgDb.PROGRAM_RANGE_DURATION))},__fetchByTime:function(time,invalidate){var me=this,current=!1,now=me.__now();time||(time=now),time=me.__adjustTime(time,Fbx.os.app.tv.EpgDb.PROGRAM_RANGE_DURATION),current=me.__adjustTime(now,Fbx.os.app.tv.EpgDb.PROGRAM_RANGE_DURATION)==time,current&&!me.__prefetchInterval&&me.__prefetchNextRange(time+Fbx.os.app.tv.EpgDb.PROGRAM_RANGE_DURATION),me.__byTimeLock[""+time]||(me.__byTimeLock[""+time]=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"tv/epg/by_time/"+time+"/",disableCaching:!0===invalidate,success:function(response){var progs=response.jsonData.result;for(var chan in progs){me.data[chan]||(me.data[chan]={start:1/0,end:0,programs:{},current:null});var chanInfos=me.data[chan],progList=chanInfos.programs,curList=progs[chan];for(var prog_hash in curList){var p=curList[prog_hash];delete p.prev,delete p.next,p.end=p.date+p.duration,delete p.duration,progList[prog_hash]=p,p.end>chanInfos.end&&(chanInfos.end=p.end),p.date<chanInfos.start&&(chanInfos.start=p.date)}}me.__updateCurrent(),current&&me.fireEvent("currentProgramAvailable")}}))},__byChanLock:{},__fetchByChannel:function(channel,time,cb,invalidate){var me=this;time=me.__adjustTime(time,Fbx.os.app.tv.EpgDb.CHAN_RANGE_DURATION),me.__byChanLock[channel+"_"+time]||(me.__byChanLock[channel+"_"+time]=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"tv/epg/by_channel/"+encodeURIComponent(channel)+"/"+time+"/",disableCaching:!0===invalidate,success:function(response){var programs=response.jsonData.result;me.data[channel]||(me.data[channel]={start:1/0,end:0,programs:{},current:null});var chanInfos=me.data[channel];for(var k in programs){var p=programs[k];p.end=p.date+p.duration,delete p.prev,delete p.next,delete p.duration,p.date<chanInfos.start&&(chanInfos.start=p.date),p.end>chanInfos.end&&(chanInfos.end=p.end),chanInfos.programs[k]=p}cb&&cb(programs)}}))}});Ext.define("Fbx.os.gui.Panel",{extend:"Ext.toolbar.Toolbar",panelSize:128,panelElements:null,panelContainer:null,isVertical:function(){var pos=this.panelContainer.panelContainerPosition;return"west"==pos||"east"==pos},getPosition:function(){return this.panelContainer.panelContainerPosition},resizeAll:function(){var me=this,size=me.panelSize;me.isVertical()?me.setWidth(size):me.setHeight(size),me.isVertical()?me.panelContainer.setWidth(size):me.panelContainer.setHeight(size)},setPanelSize:function(size){this.panelSize=size,this.resizeAll()},initElements:function(){for(var i=0;i<this.panelElements.length;i++){var elem=this.panelElements[i],c=Ext.create(elem.type,{vertical:this.isVertical(),position:this.getPosition()});this.add(c)}},constructor:function(config){var me=this;Ext.apply(me,config),config.style={border:0,padding:"2 2 2 2"},me.isVertical()?config.layout={type:"vbox"}:config.layout={type:"hbox"},config.layout.align="stretch",config.vertical=me.isVertical(),me.callParent([config]),me.panelContainer.add(me),me.resizeAll(),me.initElements()}});Ext.define("Fbx.os.app.settings.VpnServerUserModel",{extend:"Ext.data.Model",statics:{placeholderVal:"............"},fields:[{name:"id",type:"string",convert:function(v,r){return r.raw.login}},{name:"login",type:"string"},{name:"password",type:"string",convert:function(v,r){return""==v&&r.raw.password_set?Fbx.os.app.settings.VpnServerUserModel.placeholderVal:v}},{name:"password_set",type:"bool"},{name:"ip_reservation",type:"string"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"vpn/user/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.explorer.ExplorerModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestTree","Ext.data.Store","Fbx.os.lib.FbxUtils","Ext.window.Window"],statics:{inlineMimeTypes:{"application/pdf":!0}},fields:[{name:"mimetype",type:"string"},{name:"name",type:"string"},{name:"type",type:"string"},{name:"modification",type:"date",dateFormat:"timestamp"},{name:"size",type:"int"},{name:"path",type:"string"},{name:"decoded_path",type:"string",convert:function(v,rec){return Fbx.os.lib.FbxUtils.base64_decode(rec.get("path"))}},{name:"filecount",type:"int"},{name:"foldercount",type:"int"},{name:"link",type:"boolean"},{name:"hidden",type:"boolean"},{name:"leaf",type:"boolean",convert:function(v,rec){return"dir"!=rec.get("type")}},{name:"text",type:"string",convert:function(v,rec){return rec.get("name")}},{name:"iconCls",type:"string",convert:function(v,rec){var mime=rec.get("mimetype");return""==mime&&(mime="unknown"),"file-icon-sprite file-icon-sprite-default file-icon-"+mime.replace(/^([^\/]+)\/.*$/,"$1")+" file-icon-"+mime.replace(/[\/\-\+\.]/g,"_")+" "}},{name:"cutted",type:"boolean",convert:function(v,rec){return"cut"==Fbx.os.app.explorer.FsTask.fileSelectionOp&&Fbx.os.app.explorer.FsTask.isFileSelected(rec)}},{name:"copied",type:"boolean",convert:function(v,rec){return"copy"==Fbx.os.app.explorer.FsTask.fileSelectionOp&&Fbx.os.app.explorer.FsTask.isFileSelected(rec)}}],clearDirty:function(){var me=this;me.dirty=!1,me.modified={},this.callStore("afterReject")},downloadFile:function(inline){var me=this;if(!inline)return void window.open(FbxConf.apiBaseUrl+"dl/"+encodeURIComponent(me.get("path"))+"?inline=0");var mime=me.get("mimetype"),cat=mime.split("/")[0],supportedInline=Fbx.os.app.explorer.ExplorerModel.inlineMimeTypes[mime];switch(cat){case"audio":case"video":supportedInline=!0;var now=new Date,expire=Math.round(now.getTime()/1e3)+14400;Fbx.os.app.explorer.FsTask.createShareLink(me.get("path"),expire,!0,function(shareLink){var url=shareLink.get("fullurl");inline&&supportedInline&&(url+="?inline=1"),Ext.create("Ext.window.Window",{title:me.get("name"),closeAction:"destroy",width:"audio"==cat?400:800,height:"audio"==cat?150:600,html:'<iframe src="'+url+'" style="width: 100%; height: 100%;" />',listeners:{close:function(){shareLink.destroy()}}}).show()});break;case"image":var url=FbxConf.apiBaseUrl+"dl/"+encodeURIComponent(me.get("path"))+"?inline=1&thumbnail=480p",win=Ext.create("Ext.window.Window",{title:me.get("name"),closeAction:"destroy",width:650,height:510,layout:"fit",html:"",resizable:!1});win.show(),win.setLoading(!0);var newImg=new Image;newImg.onload=function(){var height=newImg.height,width=newImg.width;newImg.style.display="block",height/480<width/640?(newImg.style.width="100%",newImg.style.height="auto",newImg.style.margin=Math.round((480-height)/2)+"px 0"):(newImg.style.height="100%",newImg.style.width="auto",newImg.style.margin="0 auto"),win.body.appendChild(newImg),win.setLoading(!1)},newImg.src=url;break;case"text":supportedInline=!0;default:window.open(FbxConf.apiBaseUrl+"dl/"+encodeURIComponent(me.get("path"))+"?inline="+(supportedInline?"1":"0"))}},set:function(field,val){var me=this;if("name"==field){var oldPathDecoded=me.get("decoded_path"),oldPath=me.get("path"),oldName=me.get("name"),newPath=Fbx.os.lib.FbxUtils.dirname(oldPathDecoded)+"/"+val;newPath=Fbx.os.lib.FbxUtils.base64_encode(newPath);var isDirRename="dir"==me.get("type");me.set({path:newPath,name:val}),me.clearDirty(),Fbx.os.app.explorer.FsTask.renameFile(oldPath,val,isDirRename,function(success){success?me.clearDirty():(me.set({path:oldPath,name:oldName}),me.clearDirty())})}else this.callParent(arguments)},idProperty:"path",proxy:{type:"resttree",url:FbxConf.apiBaseUrl+"fs/ls/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Ext.ux.grid.filter.ListFilter",{extend:"Ext.ux.grid.filter.Filter",alias:"gridfilter.list",phpMode:!1,init:function(config){this.dt=Ext.create("Ext.util.DelayedTask",this.fireUpdate,this)},createMenu:function(config){var menu=Ext.create("Ext.ux.grid.menu.ListMenu",config);return menu.on("checkchange",this.onCheckChange,this),menu},getValue:function(){return this.menu.getSelected()},setValue:function(value){this.menu.setSelected(value),this.fireEvent("update",this)},isActivatable:function(){return this.getValue().length>0},getSerialArgs:function(){return{type:"list",value:this.phpMode?this.getValue().join(","):this.getValue()}},onCheckChange:function(){this.dt.delay(this.updateBuffer)},validateRecord:function(record){var valuesArray=this.getValue();return Ext.Array.indexOf(valuesArray,record.get(this.dataIndex))>-1}});Ext.define("Fbx.os.app.settings.wifi.WifiWpsWizard",{extend:"Ext.panel.Panel",requires:["Fbx.os.app.settings.wifi.WifiWpsCandidateModel","Ext.button.Button","Ext.form.field.ComboBox","Ext.layout.container.Card","Ext.data.Store"],setCard:function(idx){var me=this,layout=me.getLayout(),items=layout.getLayoutItems();layout.setActiveItem(items[idx]),layout.activeItem.prevIdx(!1)>=0?(me.btnPrev.setIconCls("btn-previous"),me.btnPrev.setText("Retour")):(me.btnNext.setIconCls("btn-cancel"),me.btnNext.setText("Annuler"));var nextId=layout.activeItem.nextIdx(!1);me.btnNext.setVisible(!layout.activeItem.hideNext),0==nextId?(me.btnNext.setIconCls("btn-accept"),me.btnNext.setText("Terminer")):(me.btnNext.setIconCls("btn-next"),me.btnNext.setText("Suivant"))},navigate:function(direction,force){var me=this,layout=me.getLayout();if("next"==direction){var nextIdx=layout.activeItem.nextIdx(!0);if(nextIdx<0)return;if(0==nextIdx)return void me.parentWin.close();me.setCard(nextIdx)}else{if(!layout.getPrev())return void me.parentWin.close();var prevIdx=layout.activeItem.prevIdx(!0);if(prevIdx<0)return;me.setCard(prevIdx)}},initComponent:function(){var me=this;me.btnPrev=Ext.create("Ext.button.Button",{text:"Annuler",iconCls:"btn-cancel",handler:function(){if(me.sessionId&&me.sessionId>0)return void Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/wps/stop/",method:"POST",jsonData:{bssid:me.sessionId},success:function(response){me.sessionId=-1,me.setCard(0)}});me.navigate("prev")}}),me.btnNext=Ext.create("Ext.button.Button",{text:"Suivant",iconCls:"btn-next",handler:function(){me.getLayout().getNext()?me.navigate("next"):me.parentWin.close()}}),me.candidateStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.wifi.WifiWpsCandidateModel",remoteSort:!1,remoteFilter:!1}),me.candidateCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Réseau Wi-Fi",name:"ssid",store:me.candidateStore,editable:!1,allowBlank:!1,forceSelection:!0,displayField:"display_ssid",valueField:"bssid",queryMode:"local",lastQuery:"",margin:"10 0",listeners:{change:function(combo,newVal){me.btnNext.setDisabled(!newVal)}}}),Ext.applyIf(me,{layout:"card",bodyPadding:10,title:"Ouvrir l'association WPS",items:[{xtype:"form",border:0,padding:0,defaults:{anchor:"100%",labelWidth:100},items:[{xtype:"label",text:"Sélectionnez le réseau Wi-Fi auquel vous voulez associer le périphérique :"},me.candidateCombo],listeners:{show:function(){me.btnNext.setDisabled(!1),me.setTitle("Étape 1/4 : Ouverture de l'association WPS")}},prevIdx:function(){return-1},nextIdx:function(process){var bssid=me.candidateCombo.getValue();if(!bssid||!process)return-1;var candidate=null;if(me.candidateStore.each(function(c){c.get("bssid")==bssid&&(candidate=c)}),!candidate)return-1;if(candidate.get("wps_enabled"))return me.openWps(candidate),-1;var encryption=candidate.get("encryption");return"wpa2_psk_ccmp"==encryption||"wpa2_psk_auto"==encryption?Ext.Msg.confirm("WPS désactivé","Le WPS est désactivé sur ce réseau Wi-Fi, voulez vous l'activer ?",function(btn){"yes"===btn&&me.enableWps(candidate)}):Ext.Msg.alert("WPS non compatible avec la configuration de votre réseau Wi-Fi","Pour activer le WPS vous devez modifier votre configuration Wi-Fi pour utiliser WPA2-PSK/AES"),-1}},{xtype:"container",layout:"fit",html:'<div>Ouverture d\'une session WPS</div><br /> <div>Votre réseau Wi-Fi est en train d\'être configuré pour ouvrir une session WPS ...</div> <br /><div style="text-align: center;"><img src="resources/images/fbx/loading.gif" style="width: 32px; height: 32px;" alt=""/></div>',prevIdx:function(){return-1},hideNext:!0,nextIdx:function(){return-1},listeners:{show:function(){me.setTitle("Étape 2/4 : Activation du WPS"),me.btnNext.setDisabled(!1),me.checkSessionState()}}},{xtype:"container",layout:"fit",html:'<div>L\'association WPS est maintenant ouverte</div><br /> <div>Attente de la détection d\'un périphérique Wi-Fi compatible ...</div> <br /><div style="text-align: center;"><img src="resources/images/fbx/loading.gif" style="width: 32px; height: 32px;" alt=""/></div>',prevIdx:function(){return-1},hideNext:!0,nextIdx:function(){return-1},listeners:{show:function(){me.setTitle("Étape 3/4 : Rercherche d'un appareil Wi-Fi WPS"),me.btnNext.setDisabled(!1),me.checkSessionState()}}},{xtype:"container",layout:"fit",html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>Félicitations, votre périphérique Wi-Fi est maintenant connecté</div>',prevIdx:function(){return-1},nextIdx:function(){return 0},listeners:{show:function(){me.setTitle("Étape 4/4 : Terminé")}}},{xtype:"container",layout:"fit",html:'<img src="resources/images/fbx/dialog-nok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>L\'association de votre périphérique Wi-Fi a échouée</div>',prevIdx:function(){return-1},nextIdx:function(){return 0},listeners:{show:function(){me.setTitle("Étape 4/4 : Echec")}}}],buttons:[me.btnPrev,me.btnNext]}),me.sessionStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.wifi.WifiWpsSessionModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"start_date",direction:"DESC"}],pageSize:0}),me.callParent(arguments),me.beforeShow()},beforeShow:function(){var me=this;me.setCard(0),me.checkActiveSession()},_openWps2:function(candidate){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/wps/start/",method:"POST",jsonData:{bssid:candidate.get("bssid")},success:function(response){me.setSessionId(response.jsonData.result)}})},openWps:function(candidate){var me=this;me.refreshingBss||(me.refreshingBss=!0,me.setCard(1),me.candidateStore.load(function(candidates){me.refreshingBss=!1;var candidate2=null;if(candidates.forEach(function(c){c.get("bssid")===candidate.get("bssid")&&(candidate2=c)}),!candidate2)return void me._openWps2(candidate);switch(candidate=candidate2,candidate.get("state")){case"failed":case"no_param":case"bad_param":case"no_active_bss":Ext.Msg.alert("Wifi non configuré","Vous devez activer le wifi pour utiliser la fonction wps"),me.parentWin.close();break;case"disabled":case"disabled_planning":Ext.Msg.alert("Wifi Désactivé","Vous devez activer le wifi pour utiliser la fonction wps"),me.parentWin.close();break;case"active":me._openWps2(candidate);break;default:setTimeout(function(){me.openWps(candidate)},2e3)}}))},enableWps:function(candidate){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/bss/"+candidate.get("bssid")+"/",method:"PUT",jsonData:{config:{wps_enabled:!0}},success:function(response){me.openWps(candidate)}})},setSessionId:function(id){var me=this;id!=me.sessionId&&(me.sessionId=id,me.setCard(2))},checkSessionState:function(){var me=this;!me.sessionId||me.sessionId<0||me.refreshing||(me.refreshing=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/wps/sessions/"+me.sessionId,method:"GET",failure:function(){me.refreshing=!1},success:function(response){var session=response.jsonData.result;if(me.refreshing=!1,!session.active)return void("success"==session.result?(me.setCard(3),me.sessionId=-1):(me.setCard(4),me.sessionId=-1));setTimeout(function(){me.checkSessionState()},2e3)}}))},checkCandidates:function(){var me=this;me.candidateStore.load(function(candidates){if(0==candidates.length)return Ext.Msg.alert("Wifi Désactivé","Vous devez activer le wifi pour utiliser la fonction wps"),void me.parentWin.close();var selected_bss=null;candidates.forEach(function(c){c.get("wps_enabled")&&(selected_bss?"2d4g"===c.get("band")&&(selected_bss=c):selected_bss=c)}),selected_bss?me.candidateCombo.setValue(selected_bss.get("bssid")):me.candidateCombo.setValue(candidates[0].get("bssid"))})},checkActiveSession:function(){var me=this;me.sessionStore.load(function(sessions){var active_session=null;sessions.forEach(function(s){s.get("active")&&(active_session=s)}),active_session&&me.setSessionId(active_session.get("id")),me.checkCandidates()})}});Ext.define("Fbx.ux.form.field.TemplatedDisplay",{extend:"Ext.form.field.Display",requires:["Ext.XTemplate"],alias:"widget.templateddisplayfield",constructor:function(cfg){var tpl,me=this;me.callParent(arguments),tpl=me.tpl=!Ext.isPrimitive(me.tpl)&&me.tpl.compile?me.tpl:Ext.create("Ext.XTemplate",me.tpl),me.renderer=function(value,p,record){var data={};if(record)data=Ext.apply(data,record.data,record.getAssociatedData()),data.val=record.get(me.name);else{var form=me.up("form");form&&(data=form.values?form.values:form.getValues()),data.val=value}return tpl.apply(data)}},setRawValue:function(value){var me=this;if(value=Ext.value(value,""),me.rawValue=value,me.rendered){var form=me.up("form"),record=form?form.getRecord():null;me.inputEl&&(me.inputEl.dom.innerHTML=me.renderer(value,null,record))}return value}});Ext.define("Fbx.ux.view.RefreshView",{extend:"Ext.view.View",alias:"widget.refresview",mixins:{refreshmixin:"Fbx.ux.mixin.RefreshMixin",ctxmenumixin:"Fbx.ux.mixin.CtxMenuMixin"},selectedRecords:[],loadMask:!1,initComponent:function(config){var me=this;config=Ext.apply(me,config),this.mixins.ctxmenumixin.constructor.call(this),this.mixins.refreshmixin.constructor.call(this),this.callParent([config]),this.mon(this,"beforeitemclick",function(){me.rememberSelection()})}});Ext.define("Fbx.os.gui.grid.column.FileSizeColumn",{extend:"Ext.grid.column.Template",alias:"widget.filesizecolumn",requires:["Ext.util.Format","Fbx.os.lib.FbxUtils"],sortType:"asFloat",constructor:function(cfg){var me=this;me.callParent(arguments),me.renderer=function(value,p,record){var data=Ext.apply({},record.data,record.getAssociatedData());return void 0===data.fsize&&(data.fsize=record.get(me.dataIndex)),me.tpl.apply(data)}},tpl:"{[Fbx.os.lib.FbxUtils.fileSize(values.fsize)]}"});Ext.define("Fbx.os.gui.grid.column.EnumColumn",{extend:"Ext.grid.column.Template",alias:"widget.enumcolumn",strings:{},constructor:function(cfg){var me=this;me.callParent(arguments),me.renderer=function(value,p,record){var data=Ext.apply({},record.data,record.getAssociatedData());return data.enumStr=me.strings[record.get(me.dataIndex)],me.tpl.apply(data)}},tpl:"{enumStr}"});Ext.define("Fbx.os.app.tv.VLCPlayer",{extend:"Ext.Component",requires:[],statics:{isAvailable:function(){if(void 0!==navigator.plugins&&"object"==typeof navigator.plugins["VLC Web Plugin"])return!0;if($.browser.msie)try{if(new ActiveXObject("VideoLAN.VLCPlugin.2"))return!0}catch(e){}return!1}},__pendingPlay:null,__audioTrackCount:0,__srtTrackCount:0,__updateTrackList:function(){var me=this;if(me.vlc&&(me.__audioTrackCount!=me.vlc.audio.count||me.__srtTrackCount!=me.vlc.subtitle.count)){for(var srtTracks=[],i=0;i<me.vlc.subtitle.count;++i)srtTracks.push({id:i,name:me.vlc.subtitle.description(i)});me.__srtTrackCount=me.vlc.subtitle.count,me.fireEvent("srtTrackListChange",me,srtTracks),me.fireEvent("srtTrackChange",me,me.vlc.subtitle.track);for(var audioTracks=[],i=0;i<me.vlc.audio.count;++i)audioTracks.push({id:i,name:me.vlc.audio.description(i)});me.fireEvent("audioTrackListChange",me,audioTracks),me.fireEvent("audioTrackChange",me,me.vlc.audio.track),me.__audioTrackCount=me.vlc.audio.count}},createPlugin:function(){var me=this,el=me.getEl();el&&(me.vlcPlayerId="vlcplayer-"+Ext.id(),el.update('<embed type="application/x-vlc-plugin" pluginspage="http://www.videolan.org" version="VideoLAN.VLCPlugin.2" width="100%" height="100%" id="'+me.vlcPlayerId+'"  allowfullscreen="true" windowless="true" toolbar="false" controls="false"></embed>',!1,function(){if(me.vlc=Ext.get(me.vlcPlayerId),!me.vlc)return Ext.Msg.alert("Erreur VLC","Erreur lors de l'initialisation du plugin VLC"),void me.fireEvent("failure",me);me.vlc=me.vlc.dom,Ext.EventManager.on(me.vlc,"MediaPlayerNothingSpecial",function(){me.fireEvent("stateChange",me,"idle")}),Ext.EventManager.on(me.vlc,"MediaPlayerOpening",function(){}),Ext.EventManager.on(me.vlc,"MediaPlayerBuffering",function(){me.fireEvent("stateChange",me,"buffering")}),Ext.EventManager.on(me.vlc,"MediaPlayerPlaying",function(){me.fireEvent("stateChange",me,"playing"),me.__updateTrackList()}),Ext.EventManager.on(me.vlc,"MediaPlayerPaused",function(){me.fireEvent("stateChange",me,"paused")}),Ext.EventManager.on(me.vlc,"MediaPlayerEncounteredError",function(){me.fireEvent("stateChange",me,"error"),me.fireEvent("playbackFailed",me)}),Ext.EventManager.on(me.vlc,"MediaPlayerEndReached",function(){}),Ext.EventManager.on(me.vlc,"MediaPlayerTimeChanged",function(){me.__updateTrackList()}),me.__pendingPlay&&me.__pendingPlay.length&&(me.play(me.__pendingPlay),me.__pendingPlay=null)}))},killPlugin:function(){var me=this;me.vlc&&(me.stop(),me.el.update(""),me.vlc=null,me.__pendingPlay=null)},initComponent:function(){var me=this;me.addEvents("stateChange","playbackFailed","srtTrackListChange","audioTrackListChange","srtTrackChange","audioTrackChange","failure"),Ext.apply(me,{html:""}),me.on("show",function(){me.createPlugin()}),me.on("hide",function(){me.killPlugin()}),me.on("beforedestroy",function(){me.stop()}),me.callParent(arguments)},_apiError:function(){var me=this,curVersion="";me.vlc&&me.vlc.versionInfo?(curVersion=" (version actuellement installée: "+me.vlc.versionInfo+")",Ext.Msg.alert("Erreur VLC","Vérifiez que votre plugin VLC est à jour"+curVersion)):$.browser.msie?Ext.Msg.alert("Erreur VLC","Utilisez Firefox ou Google Chrome pour utiliser le plugin VLC"):Ext.Msg.alert("Erreur VLC","Vérifiez que votre le plugin VLC est bien autorisé à se lancer"),me.fireEvent("failure",me)},stop:function(){var me=this;me.vlc&&me.vlc.playlist&&me.vlc.playlist.isPlaying&&(me.vlc.playlist.stop(),me.vlc.playlist.items.clear())},play:function(url){var me=this;if("localhost"==window.location.hostname&&(url=url.replace("192.168.1.30","10.126.6.129")),!me.vlc)return void(__pendingPlay=url);if(me.stop(),!me.vlc.playlist||!me.vlc.playlist.items)return void me._apiError();var itemId=me.vlc.playlist.add(url);me.vlc.playlist.playItem(itemId),me.vlc.video&&me.vlc.video.deinterlace&&me.vlc.video.deinterlace.enable("yadif")},__isBuggedVlc:!1,__audioTrackMapping:null,__srtTrackMapping:null,__probeTrackMapping:function(){var me=this;me.__audioTrackMapping=[],me.__audioTrackMapping[0]=-1;for(var origAudioTrack=me.vlc.audio.track,nbAudioTrack=0,i=1;i<65535&&(me.vlc.audio.track=i,me.vlc.audio.track==i&&(++nbAudioTrack,me.__audioTrackMapping[nbAudioTrack]=i),!(nbAudioTrack>=me.vlc.audio.count-1));++i);me.vlc.audio.track=origAudioTrack,me.__srtTrackMapping=[],me.__srtTrackMapping[0]=-1;for(var nbSrtTrack=0,origSrtTrack=me.vlc.subtitle.track,i=1;i<65535&&(me.vlc.subtitle.track=i,me.vlc.subtitle.track==i&&(++nbSrtTrack,me.__srtTrackMapping[nbSrtTrack]=i),!(nbSrtTrack>=me.vlc.subtitle.count-1));++i);me.vlc.subtitle.track=origSrtTrack},setAudioTrack:function(trackId){var me=this;me.vlc&&(me.__isBuggedVlc?me.__audioTrackMapping[trackId]?me.vlc.audio.track=me.__audioTrackMapping[trackId]:me.vlc.audio.track=0:(me.vlc.audio.track=trackId,me.vlc.audio.track!=trackId&&(me.__isBuggedVlc=!0,me.__probeTrackMapping(),me.setAudioTrack(trackId))))},setSrtTrack:function(trackId){var me=this;me.vlc&&(me.__isBuggedVlc?me.__srtTrackMapping[trackId]?me.vlc.subtitle.track=me.__srtTrackMapping[trackId]:me.vlc.subtitle.track=0:(me.vlc.subtitle.track=trackId,me.vlc.subtitle.track!=trackId&&(me.__isBuggedVlc=!0,me.__probeTrackMapping(),me.setSrtTrack(trackId))))},setVolume:function(pct){var me=this;me.vlc&&me.vlc.audio&&(me.vlc.audio.volume=Math.round(pct))},fullScreen:function(){var me=this;me.vlc&&(me.vlc.video.fullscreen=!0)}});Ext.define("Fbx.ux.form.field.TimetableField",{extend:"Ext.form.field.Base",alias:"widget.timetablefield",requires:["Ext.XTemplate","Ext.Button","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.window.Window"],nbSlotPerHour:1,defaultState:"default",states:{default:{color:"#00AA00",color2:"#66AA66",legend:"Activé"},stop:{color:"#AA0000",color2:"#AA6666",legend:"Désactivé"},slow:{color:"#0000AA",color2:"#6666AA",legend:"Slow"}},days:[{name:"Lundi",value:"monday"},{name:"Mardi",value:"tuesday"},{name:"Mercredi",value:"wednesday"},{name:"Jeudi",value:"thursday"},{name:"Vendredi",value:"friday"},{name:"Samedi",value:"saturday"},{name:"Dimanche",value:"sunday"}],cdays:[{name:"Spécial",value:"custom"}],availableCdays:{fr_bank_holidays:"Jours fériés",fr_school_holidays_a:"Vacances scolaires - Zone A",fr_school_holidays_b:"Vacances scolaires - Zone B",fr_school_holidays_c:"Vacances scolaires - Zone C",fr_school_holidays_corse:"Vacances scolaires - Corse"},timetable:null,mouseDownInfos:null,overTd:null,lastOverInfo:null,wasDirty:!1,enableCmapping:!1,hasChanged:!1,cancelSelect:function(){var me=this;me.mouseDownInfos=null,me.overTd=null,me.lastOverInfo=null,me.updateTimetableView(!1)},initComponent:function(){var me=this;me.nbSlot=24*me.nbSlotPerHour,me.selectState=me.defaultState;var html=me.buildHtml();me.fieldSubTpl=new Ext.XTemplate(html,{}),me.on("afterrender",function(cmp,eOpts){if(me.enableCmapping){var btnEl=me.bodyEl.select(".timetable-custom-btn");me.btnCustom=Ext.create("Ext.Button",{text:"Jours spéciaux",renderTo:btnEl.item(0),handler:function(){me.showCustomPicker()}})}me.buttons=[],btnEl=me.bodyEl.select(".timetable-btn");var i=0,keys=Ext.Object.getKeys(me.states),pressedFound=!1;btnEl.each(function(button){var state=me.states[keys[i]],pressed=!1;pressedFound||keys[i]==me.defaultState||(pressed=!0,pressedFound=!0,me.selectState=keys[i]);var btn=Ext.create("Ext.Button",{text:state.legend,pressed:pressed,state:keys[i],renderTo:button,enableToggle:!0,allowDepress:!1,toggleGroup:"timetable-btn-group",renderTpl:'<em id="{id}-btnWrap"><button id="{id}-btnEl" type="{type}" hidefocus="true"role="button" autocomplete="off" style="float: left; background-color: '+state.color+';"><span id="{id}-btnIconEl" class="{baseCls}-icon {iconCls}">&#160;</span>&nbsp;&nbsp;&nbsp;</button><span id="{id}-btnInnerEl">{text}</span></em>',toggleHandler:function(button,selected){selected&&(me.selectState=button.state)}});i++,me.buttons.push(btn)}),me.on("mouseup",me.onMouseUp,me,null);var win=me.up("window");win&&(me.mon(win.getEl(),"mouseup",function(event,elem){me.onMouseUp(event,elem,null)}),me.mon(win.getEl(),"mouseleave",function(event,elem){me.cancelSelect()}),me.mon(me.bodyEl,"mouseleave",function(){me.mouseDownInfos||me.cancelSelect()})),me.tds=me.bodyEl.select("tbody td");var i=0;me.tds.each(function(td){var infos={y:Math.floor(i/me.nbSlot),x:i%me.nbSlot};me.mon(td,"mousedown",me.onMouseDown,me,infos),me.mon(td,"mouseup",me.onMouseUp,me,infos),me.mon(td,"mouseover",me.onMouseOver,me,infos),i++}),me.trs=me.bodyEl.select("tbody tr"),me.updateTimetableView(!0),me.setReadOnly(me.readOnly)}),me.callParent(arguments)},reset:function(){var me=this;me.callParent(arguments),me.hasChanged=!1,me.wasDirty=!1},resetOriginalValue:function(){this.originalValue=Ext.Array.clone(this.getValue()),this.hasChanged=!1,this.wasDirty=!1,this.fireEvent("dirtychange",this,!1)},isDirty:function(){var me=this;if(!me.hasChanged)return me.wasDirty;var dirty=!1;if(me.originalValue&&me.rawValue.length==me.originalValue.length){for(i in me.originalValue)if(me.rawValue[i]!=me.originalValue[i]){dirty=!0;break}}else dirty=!0;return dirty!=me.wasDirty&&(me.wasDirty=dirty,me.fireEvent("dirtychange",me,dirty)),me.hasChanged=!1,dirty},updateColor:function(index){var me=this,td=me.tds.item(index);me.rawValue.mapping||(me.rawValue.mapping=[]);var val=me.rawValue.mapping[index];void 0==val&&(val=me.defaultState,me.rawValue.mapping[index]=me.defaultState);var color=me.states[val]?me.states[val].color:"yellow";return td.setStyle("background-color",color),color},updateTimetableView:function(updateCustom){var me=this;if(me.rendered&&me.tds&&me.trs){me.nbLine=7+me.rawValue.cdayranges.length;for(var i=0;i<me.nbLine;i++)for(var yy=i*me.nbSlot,j=0;j<me.nbSlot;j++)me.updateColor(yy+j);if(updateCustom){me.setCurIdx(me.curIdx);for(var i=7;i<me.trs.elements.length;i++)me.trs.item(i).setVisibilityMode(Ext.dom.AbstractElement.DISPLAY),me.trs.item(i).setVisible(i-7<me.rawValue.cdayranges.length)}}},setCurIdx:function(idx){var me=this;if(me.curIdx=idx,me.rendered&&me.tds&&me.trs&&(me.tds.removeCls("timetable-current"),me.tds.setHTML(""),idx)){var curTd=me.tds.item(me.curIdx);curTd&&(curTd.addCls("timetable-current"),curTd.setHTML("X"))}},getRect:function(from,to){var minX,maxX,minY,maxY;return from.x<to.x?(minX=from.x,maxX=to.x):(minX=to.x,maxX=from.x),from.y<to.y?(minY=from.y,maxY=to.y):(minY=to.y,maxY=from.y),{minX:minX,maxX:maxX,minY:minY,maxY:maxY}},onMouseDown:function(event,elem,eOpts){var me=this;event.stopEvent(),me.mouseDownInfos=eOpts,me.onMouseOver(event,elem,eOpts)},onMouseOver:function(event,elem,eOpts){var me=this,from=me.mouseDownInfos,to=eOpts;from||(from=to);for(var rect=me.getRect(from,to),tdIndexes=[],i=rect.minY;i<=rect.maxY;i++)for(var yy=i*me.nbSlot,j=rect.minX;j<=rect.maxX;j++)tdIndexes.push(yy+j);var newIndex=tdIndexes;if(me.overTd){var diff=Ext.Array.difference(me.overTd,tdIndexes);Ext.Array.each(diff,function(index){me.updateColor(index)});var newIndex=Ext.Array.difference(tdIndexes,me.overTd)}Ext.Array.each(newIndex,function(index){me.tds.item(index).setStyle("background-color",me.states[me.selectState].color2)}),me.overTd=tdIndexes,me.lastOverInfo=to},onMouseUp:function(event,elem,eOpts){var me=this,from=me.mouseDownInfos,to=eOpts;if(from){if(!to){if(!me.lastOverInfo)return void me.cancelSelect();to=me.lastOverInfo}for(var rect=me.getRect(from,to),changed=!1,i=rect.minY;i<=rect.maxY;i++)for(var yy=i*me.nbSlot,j=rect.minX;j<=rect.maxX;j++)me.rawValue.mapping[yy+j]!=me.selectState&&(me.rawValue.mapping[yy+j]=me.selectState,changed=!0),me.updateColor(yy+j);changed&&(me.hasChanged=!0,me.fireEvent("change",me,me.rawValue,null),me.isDirty()),me.mouseDownInfos=null,me.overTd=null,me.lastOverInfo=null}},initValue:function(){var me=this;me.rawValue={mapping:[],cdayranges:[],resolution:me.nbSlot},Ext.Array.each(me.days,function(day){for(var i=0;i<me.nbSlot;i++)me.rawValue.mapping.push(me.defaultState)}),me.hasChanged=!1,me.fireEvent("dirtychange",me,!1)},fieldBodyCls:Ext.baseCSSPrefix+"form-timetable",buildHtml:function(){for(var me=this,html='<div style="padding: 2px; position: relative;"><table class="x-form-timetable-table">  <thead>  <tr>    <th></th>',i=0;i<me.nbSlot;i++)html+='<th style="width: '+100/me.nbSlot+'%;">'+(i%me.nbSlotPerHour==0?i/me.nbSlotPerHour+(i<10?"&nbsp;":""):"&nbsp;&nbsp;")+"</th>";html+="  </tr>  </thead>  <tbody>";for(var slotDuration=1440/me.nbSlot,d=0;d<7+me.cdays.length;d++){var day=d<7?me.days[d]:me.cdays[d-7];html+='<tr id="'+me.getId()+"-"+day.value+'">',html+='<th id="'+me.getId()+"-btn-"+day.value+'">'+Ext.htmlEncode(day.name)+"</th>";for(var i=0;i<me.nbSlot;i++){var start=i*slotDuration,end=(i+1)*slotDuration-1,hStart=Math.floor(start/60),hEnd=Math.floor(end/60),mStart=start%60,mEnd=end%60;mStart<10&&(mStart="0"+mStart),mEnd<10&&(mEnd="0"+mEnd);var ttip=hStart+"h"+mStart+" -&gt; "+hEnd+"h"+mEnd;html+='<td data-qtip="'+day.name+" "+ttip+'"></td>'}html+="</tr>"}return html+='  </tbody></table><div style="margin: 10px;"></div><div class="timetable-custom-btn"></div>',Ext.Object.each(me.states,function(key,state){html+='<div class="timetable-btn"></div>'}),html+='<div style="clear: both;"></div>',html+='<div class="x-form-timetable-layer"></div>',html+="</div>"},setValue:function(value){return this.setRawValue(value)},setRawValue:function(value){var me=this;return me.enableCmapping?me.rawValue=value:me.rawValue={mapping:value,resolution:me.nbSlot,cdayranges:[]},me.updateTimetableView(!0),value},getRawValue:function(){return this.rawValue},getSubmitData:function(){var me=this,data={};return data[me.getName()]=Ext.JSON.encode(me.rawValue),data},adjustMapping:function(){var me=this,expectedMappingLen=me.nbLine*me.nbSlot;if(me.rawValue.mapping.length!=expectedMappingLen){for(var newMapping=[],i=0;i<expectedMappingLen;i++)void 0!=me.rawValue.mapping[i]?newMapping[i]=me.rawValue.mapping[i]:newMapping[i]=me.defaultState;me.rawValue.mapping=newMapping}},getValue:function(){var me=this;return me.enableCmapping?(me.adjustMapping(),this.rawValue):this.rawValue.mapping},onChange:function(newVal,oldVal){var me=this;me.updateTimetableView(!1),me.callParent(arguments)},setReadOnly:function(readonly){var me=this;if(me.callParent(arguments),me.getEl()){me.getEl().down(".x-form-timetable-layer").setVisible(readonly)}Ext.Array.each(me.buttons,function(btn){btn.setDisabled&&btn.setDisabled(readonly)})},showCustomPicker:function(){var me=this;if(me.customPicker)return void me.customPicker.show();var selected={};if(me.rawValue.cdayranges.length){var cdayrange=me.rawValue.cdayranges[0],parts=cdayrange.split(";");Ext.Array.each(parts,function(p){selected[p.substr(1)]=!0})}var checkBoxes=[];for(var k in me.availableCdays)Ext.Array.push(checkBoxes,Ext.create("Ext.form.field.Checkbox",{boxLabel:me.availableCdays[k],name:k,checked:1==selected[k]}));checkBoxes.sort(function(a,b){return a.boxLabel.toLowerCase()>b.boxLabel.toLowerCase()});var checkboxGroup=Ext.create("Ext.form.FieldSet",{title:"Choix des jours spéciaux :",items:[{xtype:"checkboxgroup",fieldLabel:"",vertical:!0,columns:2,items:checkBoxes}]});me.customPicker=Ext.create("Ext.window.Window",{closeAction:"hide",title:"Sélection des jours spéciaux",modal:!0,layout:"fit",width:600,items:[{xtype:"form",bodyPadding:5,defaults:{labelWidth:75,anchor:"100%"},items:[checkboxGroup],buttons:[{iconCls:"btn-accept",text:"Ok",handler:function(){var form=me.customPicker.down("form").getForm(),vals=form.getValues(),cranges="";for(var type in vals)"on"==vals[type]&&(cranges+=":"+type+",");me.rawValue.cdayranges=""!=cranges?[cranges]:[],me.updateTimetableView(!0),me.customPicker.close()}}]}]}),me.customPicker.show()}});Ext.define("Fbx.os.app.settings.ParentalFilterModel",{extend:"Ext.data.Model",statics:{statesStr:{allowed:"Accès internet autorisé",denied:"Accès internet refusé",webonly:"Accès web uniquement"}},fields:[{name:"id",type:"int"},{name:"macs",type:"auto"},{name:"ip",type:"string"},{name:"desc",type:"string"},{name:"forced",type:"boolean"},{name:"forced_mode",type:"string"},{name:"tmp_mode_expire",type:"int"},{name:"tmp_mode",type:"string"},{name:"scheduling_mode",type:"string"},{name:"filter_state",type:"string"},{name:"current_mapping_idx",type:"int"},{name:"next_change",type:"int"},{name:"filter_mode",type:"string",convert:function(v,r){return r.get("forced")?"forced_"+r.get("forced_mode"):"planning"}}],getStateDesc:function(){var me=this,state=me.get("filter_state"),desc=Fbx.os.app.settings.ParentalFilterModel.statesStr[state],now=new Date;if(me.get("forced")&&"temporary"!=me.get("scheduling_mode"));else if(me.get("tmp_mode_expire")>0){var expireDate=new Date(now.getTime()+1e3*me.get("tmp_mode_expire"));desc+=" (exceptionnellement "+Fbx.os.lib.FbxUtils.niceExpireTimesDisplay(expireDate,!0)+")"}else if(me.get("next_change")>0){var nextChange=new Date(now.getTime()+1e3*me.get("next_change"));desc+=" "+Fbx.os.lib.FbxUtils.niceExpireTimesDisplay(nextChange,!0)}return desc},proxy:{type:"rest",url:FbxConf.apiBaseUrl+"parental/filter/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}},getPlanning:function(callback){var me=this,url=FbxConf.apiBaseUrl+"parental/filter/"+me.getId()+"/planning";Ext.Ajax.request({url:url,method:"GET",success:function(response){callback(response.jsonData.result)}})},setPlanning:function(planning,callback){var me=this,url=FbxConf.apiBaseUrl+"parental/filter/"+me.getId()+"/planning";Ext.Ajax.request({url:url,method:"PUT",jsonData:planning,success:function(response){callback(response.jsonData.result)}})}});Ext.define("Fbx.os.app.explorer.PartitionsView",{extend:"Ext.panel.Panel",requires:["Fbx.os.app.settings.storage.PartitionModel","Fbx.os.lib.FbxUtils","Ext.data.Store"],browser:null,refresh:function(){this.partitionStore.load()},initComponent:function(){var me=this;me.partitionStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.storage.PartitionModel",autoLoad:!0,filters:[function(item){var fstype=item.get("fstype");return"empty"!==fstype&&"raid"!==fstype}]}),Ext.apply(me,{layout:"fit",items:[{xtype:"dataview",store:me.partitionStore,itemSelector:"div.fs-mount-point",tpl:'<tpl for=".">  <div class="fs-mount-point">    <div class="fs-mount-icon">      <div style="margin: auto; margin-top: 10px;" class="btn-32-harddisk"></div>    </div>    <div class="fs-mount-desc">      <div class="fs-mount-label">{label:htmlEncode}</div>      <div class="x-progress-wrap x-progress-default <tpl if="usage_pct &gt; 80">fs-mount-almost-full</tpl>">        <div style="width: 100%; height: 100%; position: relative;" class="x-progress-inner">          <div class="x-progress-bar" style="width: {[Ext.util.Format.number(values.usage_pct, "0%")]}; height: 100%; position: absolute; left: 0px; top: 0px;"></div>          <div style="width: 100%; height: 100%; text-align: center; position: absolute; left: 0px; top: 0px;">            {[Ext.util.Format.number(values.usage_pct, "0.00%")]}          </div>&nbsp;        </div>      </div>      <div class="fs-mount-usage" >Utilisé {[Fbx.os.lib.FbxUtils.fileSize(values.used_bytes)]}          / {[Fbx.os.lib.FbxUtils.fileSize(values.free_bytes + values.used_bytes)]}       </div>    </div>    <div class="x-clear"></div>  </div></tpl><div class="x-clear"></div>',listeners:{itemclick:function(view,record,item,index,e,eOpts){if(Fbx.os.lib.FbxUtils.isMobileDevice()){var path=record.get("path");me.browser&&me.browser.setPath(path)}},itemdblclick:function(view,record,item,index,e,eOpts){var path=record.get("path");me.browser&&me.browser.setPath(path)},boxready:function(dataview){dataview.getEl().unselectable()}},emptyText:'<div style="text-align: center; padding: 10px">Aucun disque dur</div>'}]}),this.callParent(arguments)}});Ext.define("DectVendorModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"name",type:"string"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"phone/dect_vendors/",reader:{type:"json",root:"result",messageProperty:"msg"}}}),Ext.define("Fbx.os.app.settings.PhoneStatusFieldset",{extend:"Ext.form.FieldSet",alias:"widget.phonestatusfieldset",requires:["Ext.layout.component.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Ext.slider.Single","Ext.form.field.ComboBox","Ext.data.Store","Ext.button.Button"],initComponent:function(){var me=this;me.dectVendorStore=Ext.getStore("dectVendorStore"),me.dectVendorStore||(me.dectVendorStore=Ext.create("Ext.data.Store",{storeId:"dectVendorStore",model:"DectVendorModel",remoteSort:!1,remoteFilter:!1,pageSize:0}),me.dectVendorStore.load());var items=[{xtype:"templateddisplayfield",name:"on_hook",fieldLabel:"Décroché",ttip:"Indique si votre téléphone est décroché",tpl:'<tpl if="on_hook">Non</tpl><tpl if="!on_hook">Oui</tpl>'},{xtype:"templateddisplayfield",name:"is_ringing",fieldLabel:"Sonne",ttip:"Indique si votre téléphone est en train de sonner",tpl:'<tpl if="!is_ringing">Non</tpl><tpl if="is_ringing">Oui</tpl>'},{xtype:"slider",animate:!1,name:"gain_rx",value:50,minValue:0,maxValue:100,fieldLabel:"Volume réception",ttip:"Vous permet d'ajuster le volume de réception de votre combiné",listeners:{dragstart:me.slideDragStart,changecomplete:me.slideDragEnd}},{xtype:"slider",animate:!1,name:"gain_tx",minValue:0,maxValue:100,value:50,fieldLabel:"Volume émission",ttip:"Vous permet d'ajuster le volume d'émission de votre combiné",listeners:{dragstart:me.slideDragStart,changecomplete:me.slideDragEnd}}];"fxs"==me.type?Ext.Array.insert(items,0,[{xtype:"templateddisplayfield",name:"hardware_defect",fieldLabel:"État matériel",ttip:"État de votre combiné téléphonique",tpl:'<tpl if="hardware_defect">HS</tpl><tpl if="!hardware_defect">OK</tpl>'}]):Ext.Array.push(items,[{xtype:"combobox",fieldLabel:"Modèle",name:"vendor",store:me.dectVendorStore,queryMode:"local",displayField:"name",valueField:"id",ttip:"Vous pouvez sélectionner la marque de votre combiné pour rétablir certaines fonctionnalités spécifiques à ce modèle",listeners:{change:function(combo,newVal,oldVal){if(oldVal){var form=me.up("form"),rec=form.getForm().getRecord();rec&&(form.getForm().updateRecord(),rec.dirty&&(me.up("window").suspendRefresh=!0,rec.store?rec.store.sync({callback:function(){me.up("window").suspendRefresh=!1}}):me.up("window").suspendRefresh=!1))}}}},{xtype:"button",text:"Supprimer le combiné",iconCls:"btn-delete",handler:function(){var me=this,form=me.up("form"),rec=form.getForm().getRecord(),store=rec.store;store.remove(rec),store.sync()}}]),Ext.applyIf(me,{defaults:{anchor:"100%",labelWidth:200},items:items}),me.callParent(arguments)},slideDragStart:function(){var me=this;me.up("form");me.up("window").suspendRefresh=!0},slideDragEnd:function(){var me=this,form=me.up("form"),rec=form.getForm().getRecord();rec&&(form.getForm().updateRecord(),rec.store&&rec.store.sync()),me.up("window").suspendRefresh=!1}});Ext.define("Ext.ux.event.Player",function(Player){var doc,defaults={},mouseEvents={},keyEvents={},uiEvents={},bubbleEvents={resize:1,reset:1,submit:1,change:1,select:1,error:1,abort:1};Ext.each(["click","dblclick","mouseover","mouseout","mousedown","mouseup","mousemove"],function(type){bubbleEvents[type]=defaults[type]=mouseEvents[type]={bubbles:!0,cancelable:"mousemove"!=type,detail:1,screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0}}),Ext.each(["keydown","keyup","keypress"],function(type){bubbleEvents[type]=defaults[type]=keyEvents[type]={bubbles:!0,cancelable:!0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,keyCode:0,charCode:0}}),Ext.each(["blur","change","focus","resize","scroll","select"],function(type){defaults[type]=uiEvents[type]={bubbles:type in bubbleEvents,cancelable:!1,detail:1}});var inputSpecialKeys={8:function(target,start,end){start<end?target.value=target.value.substring(0,start)+target.value.substring(end):start>0&&(target.value=target.value.substring(0,--start)+target.value.substring(end)),this.setTextSelection(target,start,start)},46:function(target,start,end){start<end?target.value=target.value.substring(0,start)+target.value.substring(end):start<target.value.length-1&&(target.value=target.value.substring(0,start)+target.value.substring(start+1)),this.setTextSelection(target,start,start)}};return{extend:"Ext.ux.event.Driver",keyFrameEvents:{click:!0},pauseForAnimations:!0,speed:1,stallTime:0,_inputSpecialKeys:{INPUT:inputSpecialKeys,TEXTAREA:Ext.apply({},inputSpecialKeys)},tagPathRegEx:/(\w+)(?:\[(\d+)\])?/,constructor:function(config){var me=this;me.callParent(arguments),me.timerFn=function(){me.onTick()},me.attachTo=me.attachTo||window,doc=me.attachTo.document},getElementFromXPath:function(xpath){var i,n,m,count,tag,child,me=this,parts=xpath.split("/"),regex=me.tagPathRegEx,el=me.attachTo.document;for(el="~"==parts[0]?el.body:el.getElementById(parts[0].substring(1)),i=1,n=parts.length;el&&i<n;++i){for(m=regex.exec(parts[i]),count=m[2]?parseInt(m[2],10):1,tag=m[1].toUpperCase(),child=el.firstChild;child;child=child.nextSibling)if(child.tagName==tag){if(1==count)break;--count}el=child}return el},offsetToRangeCharacterMove:function(el,offset){return offset-(el.value.slice(0,offset).split("\r\n").length-1)},setTextSelection:function(el,startOffset,endOffset){if(startOffset<0&&(startOffset+=el.value.length),null==endOffset&&(endOffset=startOffset),endOffset<0&&(endOffset+=el.value.length),"number"==typeof el.selectionStart)el.selectionStart=startOffset,el.selectionEnd=endOffset;else{var range=el.createTextRange(),startCharMove=this.offsetToRangeCharacterMove(el,startOffset);range.collapse(!0),startOffset==endOffset?range.move("character",startCharMove):(range.moveEnd("character",this.offsetToRangeCharacterMove(el,endOffset)),range.moveStart("character",startCharMove)),range.select()}},getTimeIndex:function(){return(this.getTimestamp()-this.stallTime)*this.speed},makeToken:function(eventDescriptor,signal){var t0,me=this;eventDescriptor[signal]=!0,eventDescriptor.defer=function(){eventDescriptor[signal]=!1,t0=me.getTime()},eventDescriptor.finish=function(){eventDescriptor[signal]=!0,me.stallTime+=me.getTime()-t0,me.schedule()}},nextEvent:function(eventDescriptor){var me=this,index=++me.queueIndex;me.keyFrameEvents[eventDescriptor.type]&&Ext.Array.insert(me.eventQueue,index,[{keyframe:!0,ts:eventDescriptor.ts}])},peekEvent:function(){return this.eventQueue[this.queueIndex]||null},replaceEvent:function(index,events){for(var t,i=0,n=events.length;i<n;++i)i&&(t=events[i-1],delete t.afterplay,delete t.screenshot,delete events[i].beforeplay);Ext.Array.replace(this.eventQueue,null==index?this.queueIndex:index,1,events)},processEvents:function(){for(var eventDescriptor,me=this,animations=me.pauseForAnimations&&me.attachTo.Ext.fx.Manager.items;null!==(eventDescriptor=me.peekEvent());){if(animations&&animations.getCount())return!0;if(eventDescriptor.keyframe){if(!me.processKeyFrame(eventDescriptor))return!1;me.nextEvent(eventDescriptor)}else{if(!(eventDescriptor.ts<=me.getTimeIndex()&&!1!==me.fireEvent("beforeplay",me,eventDescriptor)&&me.playEvent(eventDescriptor)))return!0;me.nextEvent(eventDescriptor)}}return me.stop(),!1},processKeyFrame:function(eventDescriptor){var me=this;return eventDescriptor.defer||(me.makeToken(eventDescriptor,"done"),me.fireEvent("keyframe",me,eventDescriptor)),eventDescriptor.done},injectEvent:function(target,event){var handler,me=this,type=event.type,options=Ext.apply({},event,defaults[type]);return"type"===type?(handler=me._inputSpecialKeys[target.tagName],handler?me.injectTypeInputEvent(target,event,handler):me.injectTypeEvent(target,event)):"focus"===type&&target.focus?(target.focus(),!0):"blur"===type&&target.blur?(target.blur(),!0):"scroll"===type?(target.scrollLeft=event.pos[0],target.scrollTop=event.pos[1],!0):"mduclick"===type?me.injectEvent(target,Ext.applyIf({type:"mousedown"},event))&&me.injectEvent(target,Ext.applyIf({type:"mouseup"},event))&&me.injectEvent(target,Ext.applyIf({type:"click"},event)):mouseEvents[type]?Player.injectMouseEvent(target,options,me.attachTo):keyEvents[type]?Player.injectKeyEvent(target,options,me.attachTo):!!uiEvents[type]&&Player.injectUIEvent(target,type,options.bubbles,options.cancelable,options.view||me.attachTo,options.detail)},injectTypeEvent:function(target,event){var ch,chUp,i,n,upper,me=this,text=event.text,xlat=[];if(text)for(delete event.text,upper=text.toUpperCase(),i=0,n=text.length;i<n;++i)ch=text.charCodeAt(i),chUp=upper.charCodeAt(i),xlat.push(Ext.applyIf({type:"keydown",charCode:chUp,keyCode:chUp},event),Ext.applyIf({type:"keypress",charCode:ch,keyCode:ch},event),Ext.applyIf({type:"keyup",charCode:chUp,keyCode:chUp},event));else xlat.push(Ext.applyIf({type:"keydown",charCode:event.keyCode},event),Ext.applyIf({type:"keyup",charCode:event.keyCode},event));for(i=0,n=xlat.length;i<n;++i)me.injectEvent(target,xlat[i]);return!0},injectTypeInputEvent:function(target,event,handler){var sel,n,me=this,text=event.text;if(handler){if(sel=me.getTextSelection(target),!text)return(handler=handler[event.keyCode])?(handler.call(this,target,sel[0],sel[1]),!0):("caret"in event?me.setTextSelection(target,event.caret,event.caret):event.selection&&me.setTextSelection(target,event.selection[0],event.selection[1]),me.injectTypeEvent(target,event));n=sel[0],target.value=target.value.substring(0,n)+text+target.value.substring(sel[1]),n+=text.length,me.setTextSelection(target,n,n)}return!0},playEvent:function(eventDescriptor){var event,me=this,target=me.getElementFromXPath(eventDescriptor.target);return!!target&&(!!me.playEventHook(eventDescriptor,"beforeplay")&&(eventDescriptor.injected||(eventDescriptor.injected=!0,event=me.translateEvent(eventDescriptor,target),me.injectEvent(target,event)),me.playEventHook(eventDescriptor,"afterplay")))},playEventHook:function(eventDescriptor,hookName){var me=this,doneName=hookName+".done",firedName=hookName+".fired",hook=eventDescriptor[hookName];return!(hook&&!eventDescriptor[doneName])||(eventDescriptor[firedName]||(eventDescriptor[firedName]=!0,me.makeToken(eventDescriptor,doneName),me.eventScope&&Ext.isString(hook)&&(hook=me.eventScope[hook]),hook&&hook.call(me.eventScope||me,eventDescriptor)),!1)},schedule:function(){var me=this;me.timer||(me.timer=setTimeout(me.timerFn,10))},_translateAcross:["type","button","charCode","keyCode","caret","pos","text","selection"],translateEvent:function(eventDescriptor,target){for(var name,xy,me=this,event={},modKeys=eventDescriptor.modKeys||"",names=me._translateAcross,i=names.length;i--;)(name=names[i])in eventDescriptor&&(event[name]=eventDescriptor[name]);return event.altKey=modKeys.indexOf("A")>0,event.ctrlKey=modKeys.indexOf("C")>0,event.metaKey=modKeys.indexOf("M")>0,event.shiftKey=modKeys.indexOf("S")>0,target&&"x"in eventDescriptor?(xy=Ext.fly(target).getXY(),xy[0]+=eventDescriptor.x,xy[1]+=eventDescriptor.y):"x"in eventDescriptor?xy=[eventDescriptor.x,eventDescriptor.y]:"px"in eventDescriptor&&(xy=[eventDescriptor.px,eventDescriptor.py]),xy&&(event.clientX=event.screenX=xy[0],event.clientY=event.screenY=xy[1]),eventDescriptor.key&&(event.keyCode=me.specialKeysByName[eventDescriptor.key]),"wheel"===eventDescriptor.type&&("onwheel"in me.attachTo.document?(event.wheelX=eventDescriptor.dx,event.wheelY=eventDescriptor.dy):(event.type="mousewheel",event.wheelDeltaX=-40*eventDescriptor.dx,event.wheelDeltaY=event.wheelDelta=-40*eventDescriptor.dy)),event},onStart:function(){var me=this;me.queueIndex=0,me.schedule()},onStop:function(){var me=this;me.timer&&(clearTimeout(me.timer),me.timer=null)},onTick:function(){var me=this;me.timer=null,me.processEvents()&&me.schedule()},statics:{ieButtonCodeMap:{0:1,1:4,2:2},injectKeyEvent:function(target,options,view){var type=options.type,customEvent=null;if("textevent"===type&&(type="keypress"),view=view||window,doc.createEvent){try{customEvent=doc.createEvent("KeyEvents"),customEvent.initKeyEvent(type,options.bubbles,options.cancelable,view,options.ctrlKey,options.altKey,options.shiftKey,options.metaKey,options.keyCode,options.charCode)}catch(ex){try{customEvent=doc.createEvent("Events")}catch(uierror){customEvent=doc.createEvent("UIEvents")}finally{customEvent.initEvent(type,options.bubbles,options.cancelable),customEvent.view=view,customEvent.altKey=options.altKey,customEvent.ctrlKey=options.ctrlKey,customEvent.shiftKey=options.shiftKey,customEvent.metaKey=options.metaKey,customEvent.keyCode=options.keyCode,customEvent.charCode=options.charCode}}target.dispatchEvent(customEvent)}else{if(!doc.createEventObject)return!1;customEvent=doc.createEventObject(),customEvent.bubbles=options.bubbles,customEvent.cancelable=options.cancelable,customEvent.view=view,customEvent.ctrlKey=options.ctrlKey,customEvent.altKey=options.altKey,customEvent.shiftKey=options.shiftKey,customEvent.metaKey=options.metaKey,customEvent.keyCode=options.charCode>0?options.charCode:options.keyCode,target.fireEvent("on"+type,customEvent)}return!0},injectMouseEvent:function(target,options,view){var type=options.type,customEvent=null;if(view=view||window,doc.createEvent)customEvent=doc.createEvent("MouseEvents"),customEvent.initMouseEvent?customEvent.initMouseEvent(type,options.bubbles,options.cancelable,view,options.detail,options.screenX,options.screenY,options.clientX,options.clientY,options.ctrlKey,options.altKey,options.shiftKey,options.metaKey,options.button,options.relatedTarget):(customEvent=doc.createEvent("UIEvents"),customEvent.initEvent(type,options.bubbles,options.cancelable),customEvent.view=view,customEvent.detail=options.detail,customEvent.screenX=options.screenX,customEvent.screenY=options.screenY,customEvent.clientX=options.clientX,customEvent.clientY=options.clientY,customEvent.ctrlKey=options.ctrlKey,customEvent.altKey=options.altKey,customEvent.metaKey=options.metaKey,customEvent.shiftKey=options.shiftKey,customEvent.button=options.button,customEvent.relatedTarget=options.relatedTarget),options.relatedTarget&&!customEvent.relatedTarget&&("mouseout"==type?customEvent.toElement=options.relatedTarget:"mouseover"==type&&(customEvent.fromElement=options.relatedTarget)),target.dispatchEvent(customEvent);else{if(!doc.createEventObject)return!1;customEvent=doc.createEventObject(),customEvent.bubbles=options.bubbles,customEvent.cancelable=options.cancelable,customEvent.view=view,customEvent.detail=options.detail,customEvent.screenX=options.screenX,customEvent.screenY=options.screenY,customEvent.clientX=options.clientX,customEvent.clientY=options.clientY,customEvent.ctrlKey=options.ctrlKey,customEvent.altKey=options.altKey,customEvent.metaKey=options.metaKey,customEvent.shiftKey=options.shiftKey,customEvent.button=Player.ieButtonCodeMap[options.button]||0,customEvent.relatedTarget=options.relatedTarget,target.fireEvent("on"+type,customEvent)}return!0},injectUIEvent:function(target,options,view){var customEvent=null;if(view=view||window,doc.createEvent)customEvent=doc.createEvent("UIEvents"),customEvent.initUIEvent(options.type,options.bubbles,options.cancelable,view,options.detail),target.dispatchEvent(customEvent);else{if(!doc.createEventObject)return!1;customEvent=doc.createEventObject(),customEvent.bubbles=options.bubbles,customEvent.cancelable=options.cancelable,customEvent.view=view,customEvent.detail=options.detail,target.fireEvent("on"+options.type,customEvent)}return!0}}}});Ext.define("Fbx.os.app.pvr.PrecordEditor",{extend:"Ext.window.Window",requires:["Ext.form.FieldSet","Ext.layout.component.FieldSet","Ext.form.field.ComboBox","Ext.form.field.Number","Fbx.os.lib.FbxUtils","Fbx.os.app.tv.ChannelDb","Fbx.os.app.tv.EpgDb","Ext.form.field.Time","Fbx.os.app.pvr.PrecordModel","Ext.form.field.Checkbox","Fbx.os.app.pvr.RecordGenModel","Fbx.os.app.pvr.RecordMediaModel","Ext.form.field.Number","Ext.data.Store","Ext.form.Panel","Ext.data.ArrayStore"],setRecord:function(rec,isGenerator){var me=this;me.record=rec,me.__preventAutoFill=!1;var form=me.form.getForm();if(form){var now=Fbx.os.lib.FbxUtils.getParisMoment(),today=now.clone();today.hour(0),today.minute(0),today.second(0),today.millisecond(0);var formatNum=function(val){return val<10?"0"+val:""+val},minutes=now.minutes();if(minutes=formatNum(minutes-minutes%5),form.getFields().each(function(f){f.setVisible(!0)}),Ext.Array.each(me.query("fieldcontainer"),function(f){f.setVisible(!0)}),me.form.getComponent("repeat_group").setVisible(isGenerator),!rec||rec.phantom?me.setTitle("Programmer un enregistrement"):me.setTitle("Modifier un enregistrement"),rec){me.isGenerator=isGenerator;var repeatField=me.form.getForm().findField("repeat");repeatField.setVisible(isGenerator||rec.phantom),repeatField.setValue(isGenerator);var media=rec.get("media");if(""==media&&(media="Disque dur"),me.isGenerator){var params=rec.get("params"),startDay=Fbx.os.lib.FbxUtils.getParisMoment();startDay.hour(params.start_hour),startDay.minute(params.start_min),startDay.second(0),startDay.millisecond(0);var start=startDay.valueOf(),end=Fbx.os.lib.FbxUtils.getParisMoment(start+1e3*params.duration),end_hour=end.hours(),end_min=end.minutes();form.setValues({channel_uuid:params.channel_uuid,date:startDay.valueOf(),start_time:formatNum(params.start_hour)+":"+formatNum(params.start_min),end_time:formatNum(end_hour)+":"+formatNum(end_min),name:params.name,subname:params.subname,quality:params.channel_quality,type:params.channel_type,repeat:!0,media:media,monday:params.repeat_days.monday,tuesday:params.repeat_days.tuesday,wednesday:params.repeat_days.wednesday,thursday:params.repeat_days.thursday,friday:params.repeat_days.friday,saturday:params.repeat_days.saturday,sunday:params.repeat_days.sunday,margin_before:params.margin_before/60,margin_after:params.margin_after/60})}else{var start=Fbx.os.lib.FbxUtils.getParisMoment(1e3*rec.get("start")),end=Fbx.os.lib.FbxUtils.getParisMoment(1e3*rec.get("end")),startDay=start.clone();startDay.hour(0),startDay.minute(0),startDay.second(0),startDay.millisecond(0);var state=rec.get("state");"failed"!=state&&"finished"!=state||(me.__preventAutoFill=!0,form.getFields().each(function(f){f.setVisible("name"==f.name||"subname"==f.name)}),Ext.Array.each(me.query("fieldcontainer"),function(f){f.setVisible(!1)})),form.setValues({channel_uuid:rec.get("channel_uuid"),date:startDay.valueOf(),start_time:formatNum(start.hours())+":"+formatNum(start.minutes()),end_time:formatNum(end.hours())+":"+formatNum(end.minutes()),name:rec.get("name"),subname:rec.get("subname"),quality:rec.get("channel_quality"),type:rec.get("channel_type"),repeat:!1,media:media,margin_before:rec.get("margin_before")/60,margin_after:rec.get("margin_after")/60})}}else form.setValues({channel_uuid:"uuid-webtv-201",date:today.valueOf(),start_time:formatNum(now.hours())+":"+minutes,end_time:formatNum((now.hours()+1)%24)+":"+minutes,name:"",subname:"",quality:"",type:"",repeat:!1,media:"Disque dur",margin_before:0,margin_after:0}),Fbx.os.app.pvr.app.getPvrCfg(function(cfg){form.setValues({margin_before:cfg.margin_before/60,margin_after:cfg.margin_after/60})}),me.autoFillName()}},submitOnEnter:function(field,event){var me=this;event.getKey()==event.ENTER&&me.save()},initComponent:function(){var me=this;me.addEvents("save"),me.mediaStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.pvr.RecordMediaModel",remoteSort:!1,remoteFilter:!1,listeners:{load:function(){if(0==me.mediaStore.count())me.close(),Ext.Msg.alert("Enregistrement impossible","Vous devez connecter un disque dur externe afin  de pouvoir programmer un enregistrement");else{var rec=me.mediaCombo.findRecordByValue(me.mediaCombo.getSubmitValue());rec||(rec=me.mediaStore.first(),me.mediaCombo.setValue(rec.get("media")))}}}}),me.mediaStore.load(),me.mediaCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Destination",name:"media",store:me.mediaStore,labelWidth:175,editable:!1,forceSelection:!0,displayField:"media",valueField:"media",queryMode:"local",lastQuery:"",listConfig:{getInnerTpl:function(){return"{media:htmlEncode} ({available_rec_time})"}}}),me.bqChannelStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.tv.BouquetChannelModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"number",order:"ASC"}],filters:[function(r){return 0==r.get("sub_number")}]}),me.channelDb=Fbx.os.app.tv.ChannelDb.getInstance(),me.channelDb.on("load",function(){me.bqChannelStore.load()}),me.channelDb.load(),me.channelCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Chaîne",name:"channel_uuid",store:me.bqChannelStore,labelWidth:100,editable:!0,forceSelection:!0,displayField:"namenumber",anyMatch:!0,valueField:"uuid",typeAhead:!0,queryMode:"local",lastQuery:"",listeners:{select:function(){me.autoFillName()}}});var today=Fbx.os.lib.FbxUtils.getParisMoment();today.hour(0),today.minute(0),today.second(0),today.millisecond(0);for(var daysList=[],i=-1;i<14;++i){var m=today.clone().add(i,"days");daysList.push([m.valueOf(),Ext.String.capitalize(Fbx.os.lib.FbxUtils.niceEventDay(m.toDate()))])}me.dateCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"",name:"date",flex:3,store:new Ext.data.ArrayStore({fields:["type","label"],data:daysList}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",queryMode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,value:daysList[0][0],listeners:{change:function(){me.autoFillName()}}}),me.form=Ext.create("Ext.form.Panel",{trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){me.save()}}],defaults:{anchor:"100%",labelWidth:175},items:[me.channelCombo,{xtype:"fieldcontainer",fieldLabel:"Date",layout:"hbox",labelWidth:100,items:[me.dateCombo,{xtype:"timefield",fieldLabel:"de",labelWidth:25,margin:"0 5 0 5",increment:5,format:"H:i",name:"start_time",flex:2,listeners:{change:function(){me.autoFillName(),me.updateDuration()}}},{xtype:"timefield",fieldLabel:"à",labelWidth:25,increment:5,format:"H:i",margin:"0 5 0 5",name:"end_time",flex:2,listeners:{change:function(){me.updateDuration()}}}]},{xtype:"displayfield",fieldLabel:"Durée",labelWidth:100,name:"duration",value:""},{xtype:"fieldcontainer",fieldLabel:"Marges",layout:"hbox",labelWidth:100,items:[{xtype:"numberfield",fieldLabel:"Avant (min)",labelWidth:85,margin:0,allowDecimals:!1,name:"margin_before",minValue:0,maxValue:60,flex:2},{xtype:"numberfield",fieldLabel:"Après (min)",labelWidth:85,allowDecimals:!1,margin:"0 5 0 5",name:"margin_after",minValue:0,maxValue:60,flex:2}]},{xtype:"textfield",fieldLabel:"Nom du programme",name:"name",value:"",isAutoFilled:!0,listeners:{change:function(field){field.isAutoFilled=!1},specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},{xtype:"textfield",fieldLabel:"Nom secondaire",name:"subname",value:"",isAutoFilled:!0,listeners:{change:function(field){field.isAutoFilled=!1},specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},{xtype:"combo",fieldLabel:"Qualité de la vidéo",name:"quality",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["","Automatique"],["4k","4K"],["hdplus","HD+"],["hd","HD"],["sd","Normale"],["ld","Bas débit"],["3d","3D"]]}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",queryMode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,value:""},{xtype:"combo",fieldLabel:"Source du flux",name:"type",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["","Automatique"],["iptv","ADSL / FTTH"],["dvb","TNT"]]}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",queryMode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,value:""},me.mediaCombo,{xtype:"checkbox",name:"repeat",fieldLabel:"Répétition",uncheckedValue:!1,inputValue:!0,listeners:{change:function(f,enabled){me.form.getComponent("repeat_group").setVisible(enabled),me.dateCombo.setDisabled(enabled)}}},{xtype:"checkboxgroup",itemId:"repeat_group",hidden:!0,columns:4,defaults:{uncheckedValue:!1,inputValue:!0},items:[{boxLabel:"Lundi",name:"monday"},{boxLabel:"Mardi",name:"tuesday"},{boxLabel:"Mercredi",name:"wednesday"},{boxLabel:"Jeudi",name:"thursday"},{boxLabel:"Vendredi",name:"friday"},{boxLabel:"Samedi",name:"saturday"},{boxLabel:"Dimanche",name:"sunday"}]}]}),Ext.apply(me,{layout:"fit",closeAction:"hide",modal:!0,title:"",width:500,items:[me.form]}),me.callParent(arguments),me.on("boxready",function(){me.record&&me.setRecord(me.record,me.isGenerator)}),me.on("beforeshow",function(){0==me.mediaStore.count()&&(me.mediaStore.isLoading()||me.mediaStore.load())})},updateDuration:function(){var me=this,values=me.getValues();if(values){me.form.getForm().findField("duration").setValue(Fbx.os.lib.FbxUtils.formatDuration(values.duration))}},getValues:function(){var me=this;if(!me.form||!me.form.getForm)return null;var form=me.form.getForm(),values=form.getValues();if(!values.start_time||!values.end_time)return null;var date=values.date?Fbx.os.lib.FbxUtils.getParisMoment(values.date):Fbx.os.lib.FbxUtils.getParisMoment();date.hour(0),date.minute(0),date.second(0),date.millisecond(0);var startStr=date.year()+"-"+(date.month()<9?"0"+(date.month()+1):""+(date.month()+1))+"-"+date.format("D")+" "+values.start_time,startMoment=Fbx.os.lib.FbxUtils.getParisMoment(startStr,"YYYY-MM-DD hh:mm");if(null===startMoment||!startMoment.isValid())return null;var endStr=date.year()+"-"+(date.month()<9?"0"+(date.month()+1):""+(date.month()+1))+"-"+date.format("D")+" "+values.end_time,endMoment=Fbx.os.lib.FbxUtils.getParisMoment(endStr,"YYYY-MM-DD hh:mm");if(null===endMoment||!endMoment.isValid())return null;var start=startMoment.unix(),end=endMoment.unix();if(start>end){var next=Fbx.os.lib.FbxUtils.getParisMoment(values.date+864e5);endStr=next.year()+"-"+(next.month()<9?"0"+(next.month()+1):""+(next.month()+1))+"-"+next.format("D")+" "+values.end_time,endMoment=Fbx.os.lib.FbxUtils.getParisMoment(endStr,"YYYY-MM-DD hh:mm"),end=endMoment.unix()}return values.start=start,values.end=end,values.duration=end-start,values.margin_before*=60,values.margin_after*=60,values},autoFillName:function(){var me=this,values=me.getValues();if(values&&values.channel_uuid&&""!=values.channel_uuid&&values.start&&!me.__preventAutoFill&&!me.isGenerator){var form=me.form.getForm(),nameField=form.findField("name"),subNameField=form.findField("subname");if(""==nameField.getValue()||nameField.isAutoFilled||""==subNameField.getValue()||subNameField.isAutoFilled){Fbx.os.app.tv.EpgDb.getInstance().getProgramForChannel(values.channel_uuid,values.start,function(programInfos){programInfos?(nameField.setValue(programInfos.title),subNameField.setValue(programInfos.sub_title)):(nameField.setValue(""),subNameField.setValue("")),nameField.isAutoFilled=!0,subNameField.isAutoFilled=!0})}}},save:function(){var me=this,values=me.getValues();if(values){var usesGenerator=values.repeat,params={};if(usesGenerator){var parts=values.start_time.split(":");if(2!=parts.length)return void Ext.Msg.alert("Heure d'enregistrement invalide","L'heure de début d'enregistrement est invalide");params={name:values.name,subname:values.subname,channel_uuid:values.channel_uuid,channel_quality:values.quality,channel_type:values.type,broadcast_type:"tv",start_hour:parseInt(parts[0]),start_min:parseInt(parts[1]),start_sec:0,duration:values.duration,margin_before:values.margin_before,margin_after:values.margin_after,repeat_days:{saturday:values.saturday,tuesday:values.tuesday,wednesday:values.wednesday,friday:values.friday,sunday:values.sunday,thursday:values.thursday,monday:values.monday}}}if(me.record&&me.record.phantom&&(me.record.destroy(),me.record=null),me.record){if(usesGenerator!=me.isGenerator)return void Ext.Msg.alert("Erreur lors de la programmation de l'enregistrement","Un enregistrement récurrent ne peut pas être transformé en enregistrement ponctuel et réciproquement.");usesGenerator?(me.isGenerator=!0,me.record.set("name",values.name),me.record.set("params",params)):(me.isGenerator=!1,me.record.set("name",values.name),me.record.set("subname",values.subname),me.record.set("channel_uuid",values.channel_uuid),me.record.set("channel_quality",values.quality),me.record.set("channel_type",values.type),me.record.set("start",values.start),me.record.set("end",values.end),me.record.set("margin_before",values.margin_before),me.record.set("margin_after",values.margin_after))}else usesGenerator?(me.isGenerator=!0,me.record=Fbx.os.app.pvr.RecordGenModel.create({name:values.name,type:"manual_repeat",media:values.media,params:params})):(me.isGenerator=!1,me.record=Fbx.os.app.pvr.PrecordModel.create({name:values.name,subname:values.subname,channel_uuid:values.channel_uuid,channel_quality:values.quality,channel_type:values.type,start:values.start,end:values.end,broadcast_type:"tv",enabled:!0,media:values.media,margin_before:values.margin_before,margin_after:values.margin_after}));me.record.set("media",values.media),""==me.record.get("path")&&me.record.set("path","Enregistrements"),me.setLoading(!0),me.record.save({callback:function(op,records,success){me.setLoading(!1),success&&(me.fireEvent("save",me.record),me.hide())}})}}});Ext.define("Fbx.os.app.calls.CallModel",{extend:"Ext.data.Model",requires:["Fbx.os.lib.FbxUtils"],fields:[{name:"id",type:"int"},{name:"duration",type:"int"},{name:"datetime",type:"date",convert:function(val,r){return new Date(1e3*val)}},{name:"line_id",type:"int"},{name:"contact_id",type:"int"},{name:"number",type:"string",convert:function(val){return""==val?"Appel masqué":val}},{name:"type",type:"string"},{name:"name",type:"string"},{name:"new",type:"boolean"},{name:"outgoing",type:"boolean",convert:function(v,r){return"outgoing"==r.get("type")}},{name:"niceCallDate",type:"string",convert:function(v,r){var d=r.get("datetime");return Fbx.os.lib.FbxUtils.niceEventTimesDisplay(d)}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"call/log/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.FreeplugModel",{extend:"Ext.data.Model",fields:[{name:"id",type:"string"},{name:"net_role",type:"string"},{name:"net_id",type:"string"},{name:"model",type:"string"},{name:"eth_port_status",type:"string"},{name:"eth_speed",type:"int"},{name:"inactive",type:"int"},{name:"local",type:"bool"},{name:"has_network",type:"bool"},{name:"eth_full_duplex",type:"bool"},{name:"rx_rate",type:"int",convert:function(val){return 1e3*val*1e3}},{name:"tx_rate",type:"int",convert:function(val){return 1e3*val*1e3}}],reboot:function(){var me=this,url=FbxConf.apiBaseUrl+"freeplug/"+encodeURIComponent(me.getId())+"/reset/";Ext.Ajax.request({url:url,method:"POST"})}}),Ext.define("Fbx.os.app.settings.FreeplugNetworkModel",{extend:"Fbx.ux.data.Model",fields:[{name:"id",type:"string"}],associations:[{model:"Fbx.os.app.settings.FreeplugModel",type:"hasMany",name:"members"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"freeplug/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.downloader.RssFeedItemModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign","Fbx.os.lib.FbxUtils"],fields:[{name:"id",type:"int"},{name:"feed_id",type:"int"},{name:"title",type:"string"},{name:"desc",type:"string"},{name:"author",type:"string"},{name:"link",type:"string"},{name:"is_read",type:"boolean"},{name:"is_downloaded",type:"boolean"},{name:"fetch_ts",type:"date",convert:function(v,record){return new Date(1e3*record.raw.fetch_ts)}},{name:"pub_ts",type:"date",convert:function(v,record){return new Date(1e3*record.raw.pub_ts)}},{name:"pretty_name",type:"string",convert:function(v,rec){var title=rec.get("title");return""==title&&(title=Fbx.os.lib.FbxUtils.basename(rec.get("link"))),""==title&&(title=rec.get("desc")),""==title&&(title="Format de flux RSS non supporté"),title}},{name:"enclosure_url",type:"string"},{name:"enclosure_type",type:"string"},{name:"enclosure_length",type:"int"}],proxy:{type:"restforeign",revertOnFailure:!0,url:FbxConf.apiBaseUrl+"downloads/feeds/{foreignId}/items",foreignProperty:"feed_id",reader:{type:"json",root:"result",messageProperty:"msg"}},changeCallback:function(records,operation){operation.success||Ext.Msg.alert("Erreur","Erreur lors de la modification du téléchargement: "+operation.getError())},updateReadStatus:function(read,postPone){var me=this;if(me.get("is_read")!=read){me.set("is_read",read),postPone||me.save({callback:me.changeCallback});var store=Ext.getStore("rssStore");if(store){var feed=store.getById(me.get("feed_id"));if(feed){var inc=read?1:-1;feed.set({nb_unread:feed.get("nb_unread")-inc,nb_read:feed.get("nb_read")+inc}),feed.dirty=!1}}}},download:function(){var me=this,url=FbxConf.apiBaseUrl+"downloads/feeds/"+me.get("feed_id")+"/items/"+ +me.get("id")+"/download";Ext.Ajax.request({url:url,method:"POST"})}});Ext.define("Fbx.os.app.settings.wifi.WifiWps",{extend:"Ext.window.Window",requires:["Fbx.os.app.settings.wifi.WifiWpsSessionModel","Fbx.os.app.settings.wifi.WifiWpsWizard","Ext.data.Store"],closeAction:"hide",initComponent:function(){var me=this;me.sessionStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.wifi.WifiWpsSessionModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"start_date",direction:"DESC"}],pageSize:0}),me.wpsWizard=Ext.create("Fbx.os.app.settings.wifi.WifiWpsWizard"),me.wpsWizard.parentWin=me,me.on("beforeshow",function(){me.wpsWizard.beforeShow()}),Ext.applyIf(me,{layout:"fit",modal:!0,title:"Wifi WPS",iconCls:"btn-wps",width:800,height:450,items:[{xtype:"tabpanel",items:[me.wpsWizard,{title:"Historique des sessions WPS",xtype:"grid",emptyText:'<div style="text-align: center; padding: 10px">Aucune session WPS</div>',store:me.sessionStore,dockedItems:[{xtype:"toolbar",items:[{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.sessionStore.load()}},{text:"Vider l'historique",iconCls:"btn-delete",handler:function(){Fbx.os.app.settings.wifi.WifiWpsSessionModel.flushSessions(function(){me.sessionStore.load()})}}]}],columns:[{dataIndex:"id",text:"Id",width:25},{xtype:"booleancolumn",dataIndex:"active",text:"Actif",falseText:"Non",trueText:"Oui",width:55},{xtype:"templatecolumn",dataIndex:"start_date",text:"Date",flex:1,tpl:"{[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(values.start_date)]}"},{dataIndex:"ssid",text:"SSID",flex:1},{dataIndex:"resultStr",text:"Etat",flex:2},{dataIndex:"mac",text:"MAC associée",flex:1}],listeners:{show:function(){me.sessionStore.load()}}}]}]}),me.callParent(arguments)}});Ext.define("Fbx.os.app.explorer.FsGridContextMenuMixin",{requires:["Fbx.Ajax","Ext.window.Window","Ext.form.Panel","Ext.form.field.File","Ext.form.field.Checkbox","Ext.form.field.Hidden","Ext.menu.Menu","Fbx.ux.form.field.File","Fbx.os.lib.AirMedia","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore"],uses:["Fbx.ux.form.field.PathPicker","Fbx.os.app.explorer.FsTask"],ctxMenu:null,containerCtxMenu:null,files:[],destDir:"",constructor:function(preventDropOnEmpty){var me=this;me.preventDropOnEmpty=preventDropOnEmpty,me.on("itemcontextmenu",function(view,rec,item,index,e,eOpts){var ctxMenu=me.getFsGridCtxMenu(),selModel=me.getSelectionModel(),selected=selModel.getSelection();return selModel.isSelected(rec)||(selModel.select(rec,!1,!1),selected=[rec]),e.stopEvent(),ctxMenu.records=selected,ctxMenu.showAt(e.getXY()),!1}),me.on("containercontextmenu",function(view,e,eOpts){return me.getContainerCtxMenu().showAt(e.getXY()),e.stopEvent(),!1})},checkIfMenuNeeded:function(menu){var nbItems=0,prevIsSeparator=!0,lastSeparator=null;return menu.items.each(function(m){"menuseparator"==m.xtype?(prevIsSeparator?m.hide():(m.show(),lastSeparator=m),prevIsSeparator=!0):m.isShowable&&!m.isShowable(menu,m)?m.hide():(m.show(),lastSeparator=null,prevIsSeparator=!1,++nbItems)}),lastSeparator&&lastSeparator.hide(),nbItems>0},getContainerCtxMenu:function(){var me=this;return me.containerCtxMenu||(me.containerCtxMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Nouveau sous-dossier",itemId:"menuNewDir",iconCls:"btn-folder",isShowable:function(){return!me.preventDropOnEmpty},handler:function(){Fbx.os.app.explorer.FsTask.promptMkdir(me.curPath)}},{text:"Coller",itemId:"menuPaste",iconCls:"btn-page-paste",isShowable:function(menu){return!me.preventDropOnEmpty&&Fbx.os.app.explorer.FsTask.isValidPaste(me.curPath)},handler:function(){Fbx.os.app.explorer.FsTask.filesPaste(me.curPath)}},"-",{text:"Uploader un fichier dans ce dossier",itemId:"menuUpload",iconCls:"btn-folder-add",isShowable:function(){return!me.preventDropOnEmpty},handler:function(){Fbx.os.app.explorer.FsTask.handleUpload(me.curPath)}}],listeners:{beforeshow:function(menu){return me.checkIfMenuNeeded(menu)}}})),me.containerCtxMenu},getFsGridCtxMenu:function(){var me=this;return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Extraire",iconCls:"btn-winrar-extract",isShowable:function(menu){if(menu.records.length>1)return!1;var rec=me.ctxMenu.records[0],mime=rec.get("mimetype");return Fbx.os.app.explorer.FsTask.canExtract(mime)},menu:{items:[{text:"Extraire ici",iconCls:"btn-winrar-extract",handler:function(){var rec=me.ctxMenu.records[0];Fbx.os.app.explorer.FsTask.extractFile(rec.get("path"),me.curPath,"",!1,!0)}},{text:"Extraire ...",iconCls:"btn-winrar-extract",handler:function(){var rec=me.ctxMenu.records[0];me.handleExtract(rec.get("path"),me.curPath)}}]}},{text:"Vérifier & Réparer",iconCls:"btn-magnifier",isShowable:function(menu){return!(menu.records.length>1)&&"application/x-par2"==me.ctxMenu.records[0].get("mimetype")},handler:function(){var rec=me.ctxMenu.records[0];Fbx.os.app.explorer.FsTask.repairFile(rec.get("path"),!1,function(success,task){success&&Ext.Msg.alert("Vérification terminée","La vérification des fichiers est terminée")})}},{text:"Ouvrir",cls:"bold",iconCls:"btn-application",isShowable:function(menu){return me.chooseRecord&&1==menu.records.length},handler:function(){var rec=me.ctxMenu.records[0];me.chooseRecord&&me.chooseRecord(rec)}},{text:"Télécharger",iconCls:"btn-save",isShowable:function(menu){return 1==menu.records.length&&"dir"!=me.ctxMenu.records[0].get("type")},handler:function(){me.ctxMenu.records[0].downloadFile(0)}},"-",{text:"Renommer",itemId:"menuRename",iconCls:"btn-folder-edit",isShowable:function(menu){return!(menu.records.length>1)&&!menu.records[0].get("path").match(/^\/[^\/]+$/)},handler:function(){var rec=me.ctxMenu.records[0];me.editPlugin.startEdit(rec,me.nameColumnIndex)}},"-",{text:"Nouveau sous-dossier",itemId:"menuNewDir",iconCls:"btn-folder-add",isShowable:function(menu){return menu.records.length<=1},handler:function(){var rec=me.ctxMenu.records[0],curDir=rec.get("path");Fbx.os.app.explorer.FsTask.promptMkdir(curDir)}},{text:"Supprimer",itemId:"menuDelete",iconCls:"btn-folder-delete",isShowable:function(menu){var canDelete=!0;return Ext.Array.each(menu.records,function(rec){if(rec.get("path").match(/^\/[^\/]+$/))return canDelete=!1,!1}),canDelete},handler:function(){var files=[];Ext.Array.each(me.ctxMenu.records,function(rec){Ext.Array.push(files,rec.get("path"))}),Ext.MessageBox.confirm("Suppression","Êtes-vous sûr de vouloir supprimer ce(s) fichier(s) ?",function(btn){"yes"==btn&&Fbx.os.app.explorer.FsTask.removeFiles(files)})}},"-",{text:"Copier",itemId:"menuCopy",iconCls:"btn-page-copy",handler:function(){Fbx.os.app.explorer.FsTask.filesCopy(me.ctxMenu.records)}},{text:"Couper",itemId:"menuCut",iconCls:"btn-cut",handler:function(){Fbx.os.app.explorer.FsTask.filesCut(me.ctxMenu.records)}},{text:"Coller",itemId:"menuPaste",iconCls:"btn-page-paste",isShowable:function(menu){var destDir=me.curPath;return 1==me.ctxMenu.records.length&&"dir"==me.ctxMenu.records[0].get("type")&&(destDir=me.ctxMenu.records[0].get("path")),Fbx.os.app.explorer.FsTask.isValidPaste(destDir)},handler:function(){1==me.ctxMenu.records.length&&"dir"==me.ctxMenu.records[0].get("type")?Fbx.os.app.explorer.FsTask.filesPaste(me.ctxMenu.records[0].get("path")):Fbx.os.app.explorer.FsTask.filesPaste(me.curPath)}},"-",{text:"Uploader un fichier dans ce dossier",itemId:"menuUpload",iconCls:"btn-folder-add",isShowable:function(menu){return 1==me.ctxMenu.records.length&&"dir"==me.ctxMenu.records[0].get("type")},handler:function(){var dir=me.curPath;1==me.ctxMenu.records.length&&"dir"==me.ctxMenu.records[0].get("type")&&(dir=me.ctxMenu.records[0].get("path")),Fbx.os.app.explorer.FsTask.handleUpload(dir)}},"-",{text:"Partager ce fichier/dossier",itemId:"menuShare",iconCls:"btn-share",isShowable:function(menu,menuitem){var showable=1==me.ctxMenu.records.length;if(showable){var rec=me.ctxMenu.records[0];menuitem.setText("dir"==rec.get("type")?"Partager ce dossier":"Partager ce fichier")}return showable},handler:function(){var dir=me.ctxMenu.records[0].get("path");Fbx.os.app.explorer.FsTask.handleShare(dir)}},{text:"Lire sur ...",itemId:"menuAirMedia",iconCls:"btn-share",hideOnClick:!1,menu:{items:[{iconCls:"btn-magnifier",hideOnClick:!1,text:"Recherche de périphérique en cours ..."}]},isShowable:function(menu,menuitem){if(1!=me.ctxMenu.records.length)return!1;var rec=me.ctxMenu.records[0],mime=rec.get("mimetype");if(!Fbx.os.lib.AirMedia.supportedFiles[mime])return!1;var mediatype=Fbx.os.lib.AirMedia.supportedFiles[mime];return Fbx.os.lib.AirMedia.getReceivers(function(records,operation,success){var receivers=[];success&&Ext.Array.each(records,function(r){r.get("capabilities")[mediatype]&&Ext.Array.push(receivers,r)});var playHandler=function(item,ev){var receiver=item.receiver,filepath=rec.get("path");if("video"==mediatype){var now=new Date,expire=Math.round(now.getTime()/1e3)+21600;Fbx.os.app.explorer.FsTask.createShareLink(filepath,expire,1,function(sharelink){var media=sharelink.get("fullurl");Fbx.os.lib.AirMedia.playMedia(receiver,mediatype,media)})}else Fbx.os.lib.AirMedia.playMedia(receiver,mediatype,filepath)},items=[];Ext.Array.each(receivers,function(r){var icon=r.get("password_protected")?"btn-lock":"btn-control-play-blue";Ext.Array.push(items,{text:r.get("name"),iconCls:icon,receiver:r,handler:playHandler})}),0==items.length&&(items=[{text:"Pas de périphérique AirMedia "+mediatype+" detecté",iconCls:"btn-cancel"}]);var menu=Ext.create("Ext.menu.Menu",{items:items});menuitem.setMenu(menu,!0),menuitem.expandMenu(50)}),!0}},{text:"Créer une archive",itemId:"menuArchive",iconCls:"btn-winrar-add",isShowable:function(menu,menuitem){if(me.ctxMenu.records.length<=0)return!1;var archiveName="archive";if(1==me.ctxMenu.records.length){var rec=me.ctxMenu.records[0];archiveName=rec.get("name")}var formats=[".zip",".tar.gz",".7z"],archiveHandler=function(item,ev){var p=Fbx.os.lib.FbxUtils.base64_decode(me.curPath),dst=Fbx.os.lib.FbxUtils.base64_encode(p+"/"+item.dst),src=[];Ext.Array.each(me.ctxMenu.records,function(r){Ext.Array.push(src,r.get("path"))}),Fbx.os.app.explorer.FsTask.archiveFiles(src,dst)},items=[];Ext.Array.each(formats,function(f){var filename=archiveName+f;Ext.Array.push(items,{text:"Créer une archive "+filename,iconCls:"btn-winrar-add",handler:archiveHandler,dst:filename})}),Ext.Array.push(items,{text:"Créer une archive ...",iconCls:"btn-winrar-add",handler:function(){var src=[];Ext.Array.each(me.ctxMenu.records,function(r){Ext.Array.push(src,r.get("path"))}),me.handleArchive(src,me.curPath)}});var newmenu=Ext.create("Ext.menu.Menu",{items:items});return menuitem.setMenu(newmenu,!0),!0},menu:{items:[]},hideOnClick:!1},{text:Fbx.os.app.grillepain.app.contextText,iconCls:Fbx.os.app.grillepain.app.contextIcon,isShowable:function(menu){return Fbx.os.gui.Environment.boxHasGrillePain()&&1==menu.records.length&&"dir"!=me.ctxMenu.records[0].get("type")},handler:function(){var rec=me.ctxMenu.records[0];Fbx.os.app.grillepain.lib.contextHandler(rec)}}],listeners:{beforeshow:function(menu){return!(!menu.records||!menu.records.length)&&("/"!=me.curPath&&""!=me.curPath&&me.checkIfMenuNeeded(menu))}}})),me.ctxMenu},handleArchive:function(srcFiles,destDir){var me=this,dstname="archive";if(1==srcFiles.length&&(dstname=Fbx.os.lib.FbxUtils.basename(Fbx.os.lib.FbxUtils.base64_decode(srcFiles[0]))),me.archiveWin){var form=me.archiveWin.down("form").getForm();form.reset(),form.setValues({dstdir:destDir,format:".zip",dstname:dstname,ext:".zip"})}else me.archiveWin=Ext.create("Ext.window.Window",{closeAction:"hide",title:"Création d'une archive",modal:!0,layout:"fit",width:450,items:[{xtype:"form",bodyPadding:5,defaults:{labelWidth:175,anchor:"100%"},items:[Ext.create("Fbx.ux.form.field.PathPicker",{xtype:"pathpicker",fieldLabel:"Destination",value:destDir,name:"dstdir"}),{xtype:"fieldcontainer",fieldLabel:"Nom de l'archive",layout:"hbox",defaults:{anchor:"100%"},items:[{xtype:"textfield",name:"dstname",allowBlank:!1,value:dstname,flex:1},{xtype:"displayfield",name:"ext",value:".zip",fieldLabel:""}]},{xtype:"combobox",fieldLabel:"Format de l'archive",name:"format",allowBlank:!1,store:new Ext.data.ArrayStore({fields:["type","label"],data:[[".zip","zip (.zip)"],[".tar","GNU tar (.tar)"],[".tar.gz","GNU tar / gzip (.tar.gz)"],[".tar.bz2","GNU tar / bzip2 (.tar.bz2)"],[".tar.xz","GNU tar / xz (.tar.xz)"],[".tar.lzma","GNU tar / lzma (.tar.lzma)"],[".7z","7zip (.7z)"],[".cpio","cpio (.cpio)"],[".cpio.gz","cpio / gzip (.cpio.gz)"],[".cpio.bz2","cpio / bzip2 (.cpio.bz2)"],[".cpio.xz","cpio / xz (.cpio.xz)"],[".cpio.lzma","cpio / lzma (.cpio.lzma)"],[".iso","iso 9660 (.iso)"]]}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,listeners:{change:function(combo){combo.up("form").getForm().findField("ext").setValue(combo.getValue())}}}],buttons:[{iconCls:"btn-accept",text:"OK",handler:function(){var form=this.up("form").getForm(),vals=form.getValues();if(form.isValid()){var dst=Fbx.os.lib.FbxUtils.base64_decode(vals.dstdir)+"/"+vals.dstname+vals.format;dst=Fbx.os.lib.FbxUtils.base64_encode(dst),Fbx.os.app.explorer.FsTask.archiveFiles(me.archiveWin.srcFiles,dst),me.archiveWin.hide()}}}]}]});me.archiveWin.srcFiles=srcFiles,me.archiveWin.show()},handleExtract:function(srcFile,destDir){var me=this;if(me.extractWin){var form=me.extractWin.down("form").getForm();form.reset(),form.setValues({dst:destDir,src:srcFile})}else me.extractWin=Ext.create("Ext.window.Window",{closeAction:"hide",modal:!0,layout:"fit",width:450,items:[{xtype:"form",bodyPadding:5,defaults:{labelWidth:250},items:[Ext.create("Fbx.ux.form.field.PathPicker",{xtype:"pathpicker",fieldLabel:"Destination",value:destDir,name:"dst"}),{xtype:"textfield",name:"password",value:"",labelWidth:200,fieldLabel:"Mot de passe de l'archive"},{xtype:"checkboxfield",name:"delete_archive",checked:!1,fieldLabel:"Supprimer l'archive après l'extraction"},{xtype:"checkboxfield",name:"overwrite",checked:!0,fieldLabel:"Écraser les fichiers existants"},{xtype:"hidden",name:"src",value:srcFile}],buttons:[{iconCls:"btn-accept",text:"OK",handler:function(){var form=this.up("form").getForm(),vals=form.getValues();form.isValid()&&(me.extractWin.hide(),Fbx.os.app.explorer.FsTask.extractFile(vals.src,vals.dst,vals.password,"on"==vals.delete_archive,"on"==vals.overwrite))}}]}]});me.extractWin.show()}});Ext.define("Fbx.os.app.settings.ParentalFilterEditor",{extend:"Ext.window.Window",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel","Fbx.os.app.settings.ParentalFilterModel","Ext.grid.column.Boolean","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Template","Ext.grid.column.Action","Ext.form.field.ComboBox","Fbx.ux.form.field.TimetableField","Fbx.os.lib.FbxUtils","Ext.button.Button"],width:720,bodyPadding:0,modal:!0,autoScroll:!0,title:"Filtre Parental",closeAction:"hide",resizable:!1,initComponent:function(){var me=this;me.hostPickerBtn=Ext.create("Ext.button.Button",{text:"Modifier la liste",handler:function(){me.showHostPicker()}}),Ext.applyIf(me,{layout:"fit",items:[{xtype:"form",trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){var form=me.down("form").getForm(),record=form.getRecord();if(record.phantom){record.store.remove(record)}me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){var form=me.down("form").getForm(),record=form.getRecord();form.updateRecord(record);record.get("macs");if(me.customMac){var values=form.getValues();record.set("macs",[values.custom_mac])}record.save({success:function(){var planningField=form.findField("planning");me.planning=planningField.getValue(),record.setPlanning(me.planning,function(){me.hide()})}})}}],items:[{xtype:"fieldset",defaults:{anchor:"100%",labelWidth:150},title:"Paramètres du filtre",items:[{xtype:"textfield",fieldLabel:"Nom du groupe",emptyText:"Nom de la règle de contrôle parental",name:"desc"},{xtype:"textfield",fieldLabel:"Adresse mac",vtype:"macAddr",name:"custom_mac",allowBlank:!1,disabled:!0,hidden:!0},{xtype:"fieldcontainer",labelWidth:100,layout:"hbox",items:[{xtype:"displayfield",fieldLabel:"Périphériques",name:"host_names",flex:1},me.hostPickerBtn]}]},{xtype:"fieldset",flex:1,title:"Période d'accès",items:[{xtype:"radiogroup",labelWidth:150,fieldLabel:"Type de filtrage",columns:2,items:[{boxLabel:"Utiliser la planification",name:"filter_mode",inputValue:"planning",ttip:"Le filtrage est choisi en respectant les plages horaires du tableau ci dessous"},{boxLabel:"Toujours bloquer",name:"filter_mode",inputValue:"force_denied",ttip:"Ce périphérique n'aura jamais accès à internet"},{boxLabel:"Toujours autoriser l'accès web",name:"filter_mode",inputValue:"force_webonly",ttip:"Ce périphérique ne pourra accéder qu'au web, les jeux et la messagerie seront bloqués"},{boxLabel:"Toujours tout autoriser",name:"filter_mode",inputValue:"force_allowed",ttip:"Ce périphérique aura toujours accès à internet"}],listeners:{change:function(group,newVal){var mode=newVal.filter_mode,form=me.down("form").getForm();form.findField("planning").setReadOnly("planning"!=mode);var rec=form.getRecord();"planning"!=mode?(rec.set("forced",!0),rec.set("forced_mode",mode.replace(/force_/g,""))):rec.set("forced",!1)}}},{xtype:"label",html:"Vous pouvez définir les plages horaires où l'accès internet doit être autorisé en coloriant le tableau ci dessous. <br />Sélectionnez le mode de planification en cliquant sur les boutons sous le tableau, puis cliquez sur les cases du tableau pour appliquer."},{xtype:"timetablefield",defaultState:"allowed",nbSlotPerHour:2,name:"planning",enableCmapping:!0,states:{allowed:{color:"#00AA00",color2:"#66AA66",legend:"Autorisé"},denied:{color:"#AA0000",color2:"#AA6666",legend:"Bloqué"},webonly:{color:"#0000AA",color2:"#6666AA",legend:"Accès web uniquement"}}}]}]}]}),me.callParent(arguments)},loadRecord:function(record){var me=this;me.record=record,me.setLoading(!0);var form=me.down("form").getForm();form.loadRecord(record);var macs=record.get("macs"),hostNamesField=form.findField("host_names"),hostNames="";me.currentHosts={},Ext.Array.each(macs,function(mac){var host=null;me.hostStore&&(host=me.hostStore.findRecord("mac",mac)),host?(me.currentHosts[mac]=host.get("primary_name"),""==me.currentHosts[mac]&&(me.currentHosts[mac]=mac)):me.currentHosts[mac]=mac,hostNames+=me.currentHosts[mac]+", "}),hostNames=hostNames.substring(0,hostNames.length-2),hostNamesField.setValue(hostNames),hostNamesField.up("fieldcontainer").setVisible(macs.length>0);var macField=form.findField("custom_mac");macField.setVisible(0==macs.length),macField.setDisabled(0!=macs.length),me.customMac=0==macs.length,form.findField("desc").setVisible(macs.length>1),""!=record.get("desc")?me.setTitle("Filtrage parental pour "+record.get("desc")):me.setTitle("Filtrage parental");var filter_mode="planning";record.get("forced")&&(filter_mode="force_"+record.get("forced_mode")),form.findField("filter_mode").setValue(filter_mode),me.hostPicker&&(me.hostPicker.destroy(),me.hostPicker=null);var planningField=form.findField("planning");record.phantom?(me.setLoading(!1),me.planning={resolution:48,cdayranges:[],mapping:[]},planningField.setValue(me.planning)):record.getPlanning(function(planning){me.setLoading(!1),me.planning=planning,planningField.setValue(planning)}),planningField.setCurIdx(record.get("current_mapping_idx")),me.hostPickerBtn.setVisible(!record.phantom)},getHostPickerMacs:function(){var me=this,macs=[],form=me.hostPicker.down("form").getForm(),vals=form.getValues();for(var type in vals)"on"==vals[type]&&Ext.Array.push(macs,type);return macs},checkHostPicker:function(){var me=this,macs=me.getHostPickerMacs();me.descGroup.setVisible(macs.length>1)},showHostPicker:function(){var me=this;if(me.hostPicker)return void me.hostPicker.show();var checkBoxes=[],macs=me.record.get("macs");Ext.Array.each(macs,function(mac){Ext.Array.push(checkBoxes,Ext.create("Ext.form.field.Checkbox",{boxLabel:me.currentHosts[mac],name:mac,checked:!0,listeners:{change:function(){me.checkHostPicker()}}}))}),me.ruleStore.each(function(rule){if(!rule.get("hasfilter")){var host=rule.get("hosts")[0],label=host.primary_name;""==label&&(label=host.mac),Ext.Array.push(checkBoxes,Ext.create("Ext.form.field.Checkbox",{boxLabel:label,name:host.mac,listeners:{change:function(){me.checkHostPicker()}}}))}}),checkBoxes.sort(function(a,b){return a.boxLabel.toLowerCase()>b.boxLabel.toLowerCase()});var checkboxGroup=Ext.create("Ext.form.FieldSet",{title:"Appliquer cette règle aux périphériques suivants :",items:[{xtype:"checkboxgroup",fieldLabel:"",vertical:!0,columns:2,items:checkBoxes}]});me.descGroup=Ext.create("Ext.form.FieldSet",{title:"Propriétés du groupe",hidden:!0,defaults:{labelWidth:120,anchor:"100%"},items:[{xtype:"textfield",fieldLabel:"Nom du groupe",name:"desc",value:me.record.get("desc")}]}),me.hostPicker=Ext.create("Ext.window.Window",{closeAction:"hide",title:"Sélection des périphériques",modal:!0,layout:"fit",width:600,items:[{xtype:"form",bodyPadding:5,defaults:{labelWidth:75,anchor:"100%"},items:[checkboxGroup,me.descGroup],buttons:[{iconCls:"btn-accept",text:"OK",handler:function(){var macs=me.getHostPickerMacs();if(0==macs.length)return void Ext.Msg.alert("Erreur","Vous devez sélectionner au minimum un périphérique réseau");var form=me.hostPicker.down("form").getForm(),values=form.getValues();me.record.set("macs",macs),me.record.set("desc",values.desc),me.record.save({success:function(){me.hostPicker.hide(),me.hostStore.load(),me.loadRecord(me.record)}})}}]}]}),me.checkHostPicker(),me.hostPicker.show()}});Ext.define("Fbx.os.app.settings.WifiPlanning",{extend:"Fbx.ux.form.AjaxFormPanel",alias:"widget.wifiplanning",requires:["Fbx.ux.form.field.TimetableField","Ext.form.field.Checkbox","Fbx.ux.form.field.TemplatedDisplay"],initComponent:function(){var me=this;Ext.applyIf(me,{url:FbxConf.apiBaseUrl+"wifi/planning/",disableStringify:!0,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"label",html:'<div style="padding: 10px;">Vous pouvez définir les plages horaires où le Wi-Fi doit être activé en coloriant le tableau ci dessous. <br />Sélectionnez l\'état désiré en cliquant sur les boutons sous le tableau, puis cliquez sur les cases du tableau pour appliquer.</div>'},{xtype:"fieldset",title:"Planification",flex:1,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkbox",fieldLabel:"Activer la planification",name:"use_planning"},{xtype:"timetablefield",defaultState:"on",nbSlotPerHour:2,name:"mapping",isArray:!0,enableCmapping:!1,states:{on:{color:"#00AA00",color2:"#66AA66",legend:"Activé"},off:{color:"#AA0000",color2:"#AA6666",legend:"Désactivé"}}}]}]}),me.callParent(arguments),me.on("show",function(){me.load()})},getValues:function(){var me=this,vals=me.callParent(arguments),planning=me.getForm().findField("mapping"),planning_val=planning.getValue();return{use_planning:vals.use_planning,mapping:planning_val,resolution:48}},setValues:function(vals){return this.getForm().setValues(vals)}});Ext.define("Fbx.os.gui.panel.Clock",{extend:"Ext.container.Container",requires:["Fbx.ux.form.field.DateDisplay"],update:function(){this.timeField.setRawValue(new Date)},constructor:function(config){var me=this;me.timeField=Ext.create("Fbx.ux.form.field.DateDisplay",{baseCls:"clock-display-field",dateFormat:"H:i"}),config=Ext.apply(config,{layout:{type:"fit"},width:70,items:[me.timeField]}),config.vertical||(config.layout.type="hbox"),this.callParent([config]),me.update(),setInterval(function(){me.update()},1e3)}});Ext.define("ConnHistoryModel",{extend:"Ext.data.Model",statics:{connName:{dgp_pub:"ADSL dégroupé (public)",ftth_pub:"FTTH (public)",pppoa:"ADSL non dégroupé",vdsl_pub:"VDSL (public)"},linkName:{ftth:"FTTH",vdsl:"VDSL",adsl:"ADSL"}},fields:[{name:"id",type:"int"},{name:"type",type:"string"},{name:"state",type:"string"},{name:"conn",type:"string"},{name:"link",type:"string"},{name:"bw_down",type:"int"},{name:"bw_up",type:"int"},{name:"date",type:"int"},{name:"connection",type:"string"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"connection/logs/",reader:{type:"json",root:"result",messageProperty:"msg"}}}),Ext.define("Fbx.os.app.settings.ConnectionHistory",{extend:"Ext.grid.Panel",requires:["Ext.form.Panel","Ext.tab.Panel","Ext.grid.column.Date","Fbx.os.gui.grid.column.EnumColumn","Ext.form.field.ComboBox","Ext.data.Store","Ext.data.ArrayStore"],updateFilters:function(){var me=this,filters=[],typeVal=me.typeCombo.getValue();"all"!=typeVal&&Ext.Array.push(filters,{property:"type",value:typeVal});var linkVal=me.linkCombo.getValue();"all"!=linkVal&&Ext.Array.push(filters,{property:"link",value:linkVal}),me.connHistoryStore.clearFilter(0!=filters.length),filters.length&&me.connHistoryStore.addFilter(filters)},initComponent:function(){var me=this;me.connHistoryStore=Ext.create("Ext.data.Store",{storeId:"connHistoryStore",autoLoad:!1,model:"ConnHistoryModel",pageSize:0,sorters:{property:"date",direction:"DESC"}}),me.typeCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Type",labelWidth:50,store:Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[["all","Tous"],["conn","Connexion"],["link","Lien"]]}),value:"all",queryMode:"local",displayField:"label",valueField:"type",listeners:{change:function(combo,newVal,oldVal){me.updateFilters()}}}),me.linkCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Lien",labelWidth:50,store:Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[["all","Tous"],["ftth","FTTH"],["adsl","ADSL"],["vdsl","VDSL"]]}),value:"all",queryMode:"local",displayField:"label",valueField:"type",listeners:{change:function(combo,newVal,oldVal){me.updateFilters()}}}),Ext.applyIf(me,{store:me.connHistoryStore,dockedItems:[{xtype:"toolbar",items:[{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.connHistoryStore.load()}},{text:"Vider l'historique",iconCls:"btn-delete",handler:function(){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"connection/logs/",method:"DELETE",success:function(){me.connHistoryStore.load()},failure:function(){Ext.Msg.alert("Erreur","Erreur lors de la suppression de l'historique")}})}},me.typeCombo,me.linkCombo]}],columns:[{xtype:"templatecolumn",header:"Date",dataIndex:"date",tpl:"{[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(new Date(values.date * 1000))]}",flex:2},{xtype:"enumcolumn",header:"Type",dataIndex:"type",flex:1,strings:{conn:"Connexion",link:"Lien"}},{xtype:"templatecolumn",header:"Nom",dataIndex:"type",tpl:"<tpl if=\"type == 'conn'\">{[ConnHistoryModel.connName[values.conn] ? ConnHistoryModel.connName[values.conn] : values.conn]}</tpl><tpl if=\"type == 'link'\">{[ConnHistoryModel.linkName[values.link]]}</tpl>",flex:1},{xtype:"enumcolumn",header:"État",dataIndex:"state",flex:2,strings:{not_available:"Non disponible",fault:"Erreur",down:"Déconnecté",training:"En cours de connexion",up:"Connecté",l2_auth_failed:"Authentification échouée",l3_auth_failed:"Authentification échouée",l3_peer_detected:"Authentification en cours"}},{xtype:"templatecolumn",header:"Débit DOWN",dataIndex:"bw_down",flex:1,tpl:"<tpl if=\"type == 'conn'\"> - </tpl><tpl if=\"type == 'link'\">{[Fbx.os.lib.FbxUtils.rateBits(values.bw_down)]}</tpl>"},{xtype:"templatecolumn",header:"Débit UP",dataIndex:"bw_up",flex:1,tpl:"<tpl if=\"type == 'conn'\"> - </tpl><tpl if=\"type == 'link'\">{[Fbx.os.lib.FbxUtils.rateBits(values.bw_up)]}</tpl>"}],listeners:{show:function(){me.connHistoryStore.load()}}}),this.callParent(arguments)}});Ext.define("Fbx.os.app.settings.WifiChannelGraph",{extend:"Ext.Component",alias:"widget.wifichannelgraph",requires:["Fbx.os.app.settings.WifiNeighborModel","Ext.grid.column.Template","Fbx.os.lib.FbxUtils","Fbx.os.gui.grid.column.EnumColumn"],autoScroll:!1,layout:"fit",band:"2d4g",maxAttenuation:-100,setBaseUrl:function(url,rec){var me=this;me.baseUrl=url,me.rec=rec,me.band=rec.raw.config.band,me.loadData()},initComponent:function(){var me=this;me.baseUrl=FbxConf.apiBaseUrl+"wifi/",me.dataInfoId=Ext.id(),me.flotId=Ext.id(),me.flotLegendId=Ext.id(),me.html='<div id="'+me.dataInfoId+'" class="flot-dataInfo"></div><div class="wifi-flot-placeholder" id="'+me.flotId+'"></div><div class="wifi-flot-legend" id="'+me.flotLegendId+'"></div>',me.callParent(arguments),me.on("boxready",function(){me.dataInfo=$("#"+me.dataInfoId),me.flotPlaceholder=$("#"+me.flotId),me.legendEl=$("#"+me.flotLegendId),$(me.flotPlaceholder).bind("plothover",function(event,pos,item){if(item){var text="";item.series.name&&(text+=item.series.name+": "),1==item.seriesIndex?text+=item.datapoint[1]:text+=item.datapoint[1]+me.maxAttenuation,item.series.yaxis.options.unit&&(text+=" "+item.series.yaxis.options.unit),me.dataInfo.text(text),me.dataInfo.show();var parentOffset=$(me.flotPlaceholder).offset(),left=item.pageX+5,top=item.pageY-5-me.dataInfo.outerHeight();top<parentOffset.top&&(top=item.pageY+15);var w=me.dataInfo.outerWidth();left+w>parentOffset.left+$(me.flotPlaceholder).width()&&(left=item.pageX-5-w),me.dataInfo.offset({top:top,left:left}),me.dataInfo.css("border-color",item.series.color)}else me.dataInfo.hide();me.plot()}),me.on("resize",function(){me.plot()}),me.on("show",function(){me.loadData()}),me.loadData()})},loadData:function(){var me=this;Ext.Ajax.request({url:me.baseUrl+"channel_usage/",method:"GET",success:function(response){var jsonData=response.jsonData;if(!me.suspendRefresh){var channelList=jsonData.result;channelList.sort(function(a,b){return a.channel-b.channel}),me.plotData=[];var busyPct=[],noiseLevel=[];me.channels=[];for(var idx=0,i=0;i<channelList.length;++i){var channel=channelList[i];channel.band==me.band&&(me.channels.push(channel.channel),busyPct.push([3*idx,channel.rx_busy_percent]),noiseLevel.push([3*idx+1,channel.noise_level-me.maxAttenuation]),++idx)}me.plotData.push({name:"Niveau de bruit",label:"Niveau de bruit (meilleur quand la valeur est faible)",data:noiseLevel,bars:{show:!0,fill:.5},color:"#DF3A01"}),me.plotData.push({name:"Taux d'occupation",label:"Taux d'occupation (meilleur quand la valeur est faible)",data:busyPct,bars:{show:!0,fill:.5},yaxis:2,color:"#FE9A2E"}),me.plot()}}})},plot:function(){var me=this;if(me.flotPlaceholder){if(!me.plotData||!me.plotData.length)return me.flotPlaceholder.hide(),void me.legendEl.hide();var options={grid:{hoverable:!0,labelMargin:10,backgroundColor:{colors:["#666","#000"]}},xaxis:{tickLength:0,min:-1,max:3*me.channels.length,ticks:function(){for(var ticks=[],i=0;i<me.channels.length;++i)ticks.push(3*i+1);return ticks},tickFormatter:function(val){return"Canal "+me.channels[Math.floor(val/3)]}},yaxes:[{tickColor:"#CCC",max:-me.maxAttenuation,min:0,axisLabel:"Niveau de bruit",unit:"dB",tickFormatter:function(val){return val+me.maxAttenuation+" dB"}},{max:100,min:0,position:"right",axisLabel:"Taux d'occupation",unit:"%",tickFormatter:function(val){return val+" %"}}],legend:{show:!0,container:me.legendEl}};me.flotPlaceholder.show(),me.legendEl.show(),me.flot=$.plot(me.flotPlaceholder,me.plotData,options)}},refresh:function(){this.loadData()}});Ext.define("Ext.ux.grid.filter.StringFilter",{extend:"Ext.ux.grid.filter.Filter",alias:"gridfilter.string",iconCls:"ux-gridfilter-text-icon",emptyText:"Enter Filter Text...",selectOnFocus:!0,width:125,init:function(config){Ext.applyIf(config,{enableKeyEvents:!0,labelCls:"ux-rangemenu-icon "+this.iconCls,hideEmptyLabel:!1,labelSeparator:"",labelWidth:29,listeners:{scope:this,keyup:this.onInputKeyUp,el:{click:function(e){e.stopPropagation()}}}}),this.inputItem=Ext.create("Ext.form.field.Text",config),this.menu.add(this.inputItem),this.menu.showSeparator=!1,this.updateTask=Ext.create("Ext.util.DelayedTask",this.fireUpdate,this)},getValue:function(){return this.inputItem.getValue()},setValue:function(value){this.inputItem.setValue(value),this.fireEvent("update",this)},isActivatable:function(){return this.inputItem.getValue().length>0},getSerialArgs:function(){return{type:"string",value:this.getValue()}},validateRecord:function(record){var val=record.get(this.dataIndex);return"string"!=typeof val?0===this.getValue().length:val.toLowerCase().indexOf(this.getValue().toLowerCase())>-1},onInputKeyUp:function(field,e){if(e.getKey()==e.RETURN&&field.isValid())return e.stopEvent(),void this.menu.hide();this.updateTask.delay(this.updateBuffer)}});Ext.define("Fbx.os.app.settings.VpnServerUserEditor",{extend:"Ext.window.Window",requires:["Fbx.os.lib.FbxUtils","Ext.form.field.Hidden","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore","Ext.form.Panel"],save:function(){var me=this,form=me.down("form").getForm();if(form.isValid()){if(!form.isDirty())return void me.hide();var record=form.getRecord();if(record.phantom)return form.updateRecord(record),void record.save({success:function(){me.hide()}});var values=form.getValues();values.password_set=record.get("password_set"),values.password==Fbx.os.app.settings.VpnServerUserModel.placeholderVal?values.password="":""==values.password&&(values.password_set=!1),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vpn/user/"+record.getId(),method:"PUT",jsonData:values,success:function(response){record.store.reload(),me.hide()}})}},submitOnEnter:function(field,event){var me=this;event.getKey()==event.ENTER&&me.save()},loadIpPoolCfg:function(){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vpn/ip_pool/",method:"GET",success:function(response){var res=response.jsonData.result,start=(res.ip_start.split("."),Fbx.os.lib.FbxUtils.strToIpNum(res.ip_start)),end=Fbx.os.lib.FbxUtils.strToIpNum(res.ip_end),used={};for(var r in res.reservations)used[res.reservations[r].ip]=!0;var curIp=me.record.get("ip_reservation");used[curIp]=!1;var ipList=[["","IP dynamique"]];for(i=start;i<end;++i){var s=Fbx.os.lib.FbxUtils.ipToStr(i);used[s]||ipList.push([s,s])}me.ipStore.loadData(ipList),me.form.getForm().findField("ip_reservation").select(curIp)}})},initComponent:function(){var me=this;me.ipStore=Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[]}),me.form=Ext.create("Ext.form.Panel",{trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){me.save()}}],defaults:{anchor:"100%",labelWidth:200,listeners:{specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},items:[{xtype:"textfield",fieldLabel:"Login",name:"login",validator:function(val){var len=Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val);return len?len>32?"Le login doit faire moins de 32 caractères":!!val.match(/^[a-zA-Z0-9\.\-\_]+$/)||"Le login ne doit comporter que des caractères alpahnumériques, -, _ et .":"Le login ne peut être vide"}},{xtype:"textfield",fieldLabel:"Mot de passe",name:"password",inputType:"password",ttip:"Le mot de passe doit faire entre 8 et 32 caractères",validator:function(val){var len=Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val);return len>32?"Le mot de passe doit faire moins de 32 caractères":!(len<8)||"Le mot de pase doit faire au moins 8 caractères"},listeners:{focus:function(f){f.getValue()==Fbx.os.app.settings.VpnServerUserModel.placeholderVal&&f.setValue("")}}},{xtype:"combo",fieldLabel:"IP Fixe",name:"ip_reservation",store:me.ipStore,editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lastQuery:"",ttip:"En mode routé assigner une ip fixe au client vous permet de définir des redirections de port pour ce client"}]}),Ext.applyIf(me,{layout:"fit",closeAction:"hide",modal:!0,title:"Utilisateur VPN",width:500,items:[me.form]}),me.on("show",function(){me.form.getForm().findField("login").focus("",200),me.loadIpPoolCfg()}),me.callParent(arguments)},setRecord:function(record){var me=this;if(!me.record||me.record!=record){var form=me.form.getForm();me.record=record,form.loadRecord(record);form.findField("login").setReadOnly(!record.phantom)}}});Ext.define("Fbx.os.app.tv.ChannelList",{extend:"Ext.grid.Panel",requires:["Ext.grid.plugin.BufferedRenderer","Fbx.os.gui.grid.column.DeferedTemplatedColumn","Fbx.ux.grid.plugin.DeferredRenderer","Fbx.os.app.tv.EpgDb","Fbx.os.lib.FbxUtils"],__curViewed:null,initComponent:function(){var me=this;me.epgDb=Fbx.os.app.tv.EpgDb.getInstance(),Ext.applyIf(me,{hideHeaders:!0,forceFit:!0,bodyCls:"channel-list",columns:[{xtype:"deferedtemplated",tpl:'<div class="tv-channel <tpl if="!pub_service || !available">channel-unavailable grayscale</tpl>">  <div class="tv-channel-container">    <img class="tv-channel-logo"      src="{[Ext.String.htmlEncode(values.channel.logo_url)]}"      alt="{[Ext.String.htmlEncode(values.channel.short_name)]}"/>  </div>  <div class="tv-channel-infos">    <div class="tv-channel-name">      {number} / {[Ext.String.htmlEncode(values.channel.short_name)]}    </div>    <tpl if="prog">      <div class="tv-prog-title">{[Ext.String.htmlEncode(values.prog.title)]}</div>      <div class="tv-prog-category">{[Ext.String.htmlEncode(values.prog.category_name)]}</div>      <div class="tv-prog-progress">        <div class="tv-prog-progress-time-start">          {[Fbx.os.lib.FbxUtils.displayTime(values.prog.date)]}        </div>        <div class="tv-prog-progress-bar">          <div class="tv-prog-progress-bar-back">            <div class="tv-prog-progress-bar-fill" style="width: {progress}%;"></div>          </div>        </div>        <div class="tv-prog-progress-time-end">          {[Fbx.os.lib.FbxUtils.displayTime(values.prog.end)]}        </div>      </div>    </tpl>  </div></div>',beforePartialRender:function(data){var c=data.channel;data.channel={short_name:c.short_name},c.logo_loaded?data.channel.logo_url=c.logo_url:data.channel.logo_url="resources/images/fbx/logo_placeholder.png";var prog=me.epgDb.getCurrentProgramForChannel(c.uuid);return prog?(data.prog=prog,data.progress=prog.progress):data.progress=0,data},beforeFullRender:function(data){data.channel.logo_loaded=!0;var prog=me.epgDb.getCurrentProgramForChannel(data.channel.uuid);return prog?(data.progress=prog.progress,data.prog=prog):data.progress=0,data}}],viewConfig:{loadMask:!0,emptyText:'<div style="text-align: center; padding: 10px">Aucune chaîne dans ce bouquet</div>',getRowClass:function(record,rowIndex,rowParams,store){return me.__curViewed&&me.__curViewed==record.getId()?"viewed-channel":""}},plugins:{ptype:"deferredrenderer",trailingBufferZone:5,leadingBufferZone:5,deferDuration:500}}),me.on("itemdblclick",function(list,rec,item,idx){me.__curViewed=rec.getId()}),me.on("boxready",function(){me.resumeRefresh(),me.up("window").on("hide",me.stopRefresh,me),me.up("window").on("show",me.resumeRefresh,me)}),me.on("destroy",me.stopRefresh,me),this.callParent(arguments)},resumeRefresh:function(){var me=this;me.refresh(),me.refreshInterval||(me.refreshInterval=setInterval(function(){me.refresh()},5e3))},stopRefresh:function(){var me=this;me.refreshInterval&&(clearInterval(me.refreshInterval),delete me.refreshInterval)},refresh:function(){var me=this,plug=me.findPlugin("deferredrenderer");plug&&plug.forceRefresh()}});Ext.define("Ext.ux.grid.filter.DateTimeFilter",{extend:"Ext.ux.grid.filter.DateFilter",alias:"gridfilter.datetime",dateDefaults:{xtype:"datepicker",format:"m/d/Y"},timeDefaults:{xtype:"timepicker",width:100,height:200,format:"g:i A"},dockDefaults:{dock:"top",buttonText:"Filter"},selectDateToFilter:!0,positionDatepickerFirst:!0,reTime:/\s(am|pm)/i,addTimeSelection:function(date,timepicker){var time,len,fn,val,me=this,selection=timepicker.getSelectionModel().getSelection(),i=0,arr=[],timeFns=["setHours","setMinutes","setSeconds","setMilliseconds"];if(selection.length)for(time=selection[0].get("disp"),arr=time.replace(me.reTime,"").split(":"),len=arr.length;i<len;i++)fn=timeFns[i],(val=arr[i])&&date[fn](parseInt(val,10));return date},init:function(config){var pickerCtnCfg,i,len,item,cfg,me=this,dateCfg=Ext.applyIf(me.date||{},me.dateDefaults),timeCfg=Ext.applyIf(me.time||{},me.timeDefaults),dockCfg=me.dock,defaultListeners={click:{scope:me,click:me.onMenuSelect},select:{scope:me,select:me.onMenuSelect}},items=[dateCfg,timeCfg],datepickerPosition=0;for(me.positionDatepickerFirst||(items=items.reverse(),datepickerPosition=1),pickerCtnCfg=Ext.apply(me.pickerOpts,{xtype:dockCfg?"panel":"container",layout:"hbox",items:items}),dockCfg?dockCfg&&(me.selectDateToFilter=null,dockCfg.dockedItems?(pickerCtnCfg.dockedItems=dockCfg.dockedItems,pickerCtnCfg.dockedItems.items[dockCfg.bindToItem||0].listeners=defaultListeners.click):(Ext.isBoolean(dockCfg)&&(dockCfg={}),dockCfg=Ext.applyIf(dockCfg,me.dockDefaults),pickerCtnCfg.dockedItems={xtype:"toolbar",dock:dockCfg.dock,items:[{xtype:"button",text:dockCfg.buttonText,flex:1,listeners:defaultListeners.click}]})):me.selectDateToFilter?dateCfg.listeners=defaultListeners.select:timeCfg.listeners=defaultListeners.select,me.fields={},i=0,len=me.menuItems.length;i<len;i++)item=me.menuItems[i],"-"!==item&&(pickerCtnCfg.items[datepickerPosition].itemId=item,cfg={itemId:item,text:me[item+"Text"],menu:Ext.create("Ext.menu.Menu",{items:pickerCtnCfg}),listeners:{scope:me,checkchange:me.onCheckChange}},item=me.fields[item]=Ext.create("Ext.menu.CheckItem",cfg)),me.menu.add(item);me.values={}},onCheckChange:function(item,checked){var me=this,menu=item.menu,timepicker=menu.down("timepicker"),datepicker=menu.down("datepicker"),itemId=datepicker.itemId,values=me.values;checked?values[itemId]=me.addTimeSelection(datepicker.value,timepicker):delete values[itemId],me.setActive(me.isActivatable()),me.fireEvent("update",me)},onMenuSelect:function(picker,date){var field,me=this,menu=me.menu,fields=me.fields;me.dock&&(picker=menu.getFocusEl().down("datepicker")),field=me.fields[picker.itemId],field.setChecked(!0),field==fields.on?(fields.before.setChecked(!1,!0),fields.after.setChecked(!1,!0)):(fields.on.setChecked(!1,!0),field==fields.after&&me.getFieldValue("before")<date?fields.before.setChecked(!1,!0):field==fields.before&&me.getFieldValue("after")>date&&fields.after.setChecked(!1,!0)),me.fireEvent("update",me),picker.ownerCt.ownerCt.hide()},getSerialArgs:function(){var key,me=this,fields=me.fields,args=[],date=Ext.apply(me.dateDefaults,me.date||{}),time=Ext.apply(me.timeDefaults,me.time||{});for(key in fields)fields[key].checked&&args.push({type:"datetime",comparison:me.compareMap[key],value:Ext.Date.format(me.getFieldValue(key),date.format+" "+time.format)});return args},setValue:function(value,preserve){var key,val,datepicker,me=this,fields=me.fields;for(key in fields)val=value[key],val?(datepicker=me.menu.down('datepicker[itemId="'+key+'"]'),datepicker.update(val),datepicker.value=val,fields[key].setChecked(!0)):preserve||fields[key].setChecked(!1);me.fireEvent("update",me)},validateRecord:function(record){var key,pickerValue,me=this,val=record.get(me.dataIndex);if(!Ext.isDate(val))return!1;val=val.getTime();for(key in me.fields)if(me.fields[key].checked){if(pickerValue=me.getFieldValue(key).getTime(),"before"==key&&pickerValue<=val)return!1;if("after"==key&&pickerValue>=val)return!1;if("on"==key&&pickerValue!=val)return!1}return!0}});Ext.define("Fbx.os.app.settings.ConnectionStatusXdsl",{extend:"Ext.form.FieldSet",requires:["Fbx.ux.form.field.TemplatedDisplay"],config:{fieldPfx:"down_"},constructor:function(config){var me=this;Ext.apply(me,config),config=Ext.apply(config,{defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"templateddisplayfield",fieldLabel:"Débit Brut",name:me.fieldPfx+"rate",tpl:"{val} kbit/s"},{xtype:"templateddisplayfield",fieldLabel:"Atténuation",name:me.fieldPfx+"attn_10",tpl:"{[values.val / 10]} dB"},{xtype:"templateddisplayfield",fieldLabel:"Marge de bruit",name:me.fieldPfx+"snr_10",tpl:"{[values.val / 10]} dB"},{xtype:"displayfield",fieldLabel:"FEC",name:me.fieldPfx+"fec"},{xtype:"displayfield",fieldLabel:"HEC",name:me.fieldPfx+"hec"},{xtype:"displayfield",fieldLabel:"CRC",name:me.fieldPfx+"crc"},{xtype:"displayfield",fieldLabel:"ES",name:me.fieldPfx+"es"},{xtype:"displayfield",fieldLabel:"SES",name:me.fieldPfx+"ses"},{xtype:"templateddisplayfield",fieldLabel:"Mode nitro",name:me.fieldPfx+"nitro",tpl:'<tpl if="val">Activé</tpl><tpl if="!val">Désactivé</tpl>'},{xtype:"templateddisplayfield",fieldLabel:"Mode PhyR",name:me.fieldPfx+"phyr",tpl:'<tpl if="val">Activé</tpl><tpl if="!val">Désactivé</tpl>'},{xtype:"templateddisplayfield",fieldLabel:"G.INP",name:me.fieldPfx+"ginp",tpl:'<tpl if="val">Activé</tpl><tpl if="!val">Désactivé</tpl>'},{xtype:"displayfield",fieldLabel:"rxmt",name:me.fieldPfx+"rxmt",hidden:!0},{xtype:"displayfield",fieldLabel:"rxmt_corr",name:me.fieldPfx+"rxmt_corr",hidden:!0},{xtype:"displayfield",fieldLabel:"rxmt_uncorr",name:me.fieldPfx+"rxmt_uncorr",hidden:!0},{xtype:"displayfield",fieldLabel:"rtx_tx",name:me.fieldPfx+"rtx_tx",hidden:!0},{xtype:"displayfield",fieldLabel:"rtx_c",name:me.fieldPfx+"rtx_c",hidden:!0},{xtype:"displayfield",fieldLabel:"rtx_uc",name:me.fieldPfx+"rtx_uc",hidden:!0}]}),this.callParent([config])}});Ext.define("Fbx.os.app.settings.storage.RaidMemberModel",{extend:"Fbx.ux.data.Model",fields:[{name:"id",type:"integer"},{name:"array_id",type:"integer"},{name:"role",type:"string"},{name:"set_name",type:"string"},{name:"set_uuid",type:"string"},{name:"dev_uuid",type:"string"},{name:"device_location",type:"string"},{name:"total_bytes",type:"integer"},{name:"active_device",type:"integer"},{name:"corrected_read_errors",type:"integer"},{name:"sct_erc_supported",type:"bool"},{name:"sct_erc_enabled",type:"bool"},{name:"disk",type:"auto"},{name:"disk_serial",type:"string",convert:function(val,rec){return rec.get("disk").serial}},{name:"disk_model",type:"string",convert:function(val,rec){return rec.get("disk").model}},{name:"disk_temp",type:"string",convert:function(val,rec){return rec.get("disk").temp+" °C"}},{name:"icon_type",type:"string",convert:function(val,rec){var role=rec.get("role");return"active"===role?"ok":"faulty"===role||"missing"===role?"nok":"idle"}},{name:"pretty_device_location",type:"string",convert:function(val,rec){var loc=rec.get("device_location"),locs={missing:"Disque manquant","sata-internal-p0":"Slot interne 1","sata-internal-p1":"Slot interne 2","sata-internal-p2":"Slot interne 3","sata-internal-p3":"Slot interne 4"};return locs[loc]?locs[loc]:loc}},{name:"role_str",type:"string",convert:function(val,rec){var role=rec.get("role"),roles={active:"Actif",spare:"Disque de remplacement",faulty:"Dégradé",missing:"Disque manquant"};return roles[role]?roles[role]:role}},{name:"display_cls",type:"string",convert:function(val,rec){var role=rec.get("role");return"faulty"===role||"missing"===role?"storage-raid-degraded":"active"===role?"storage-raid-good":""}}]});Ext.define("Fbx.ux.grid.CtxMenuGrid",{extend:"Ext.grid.Panel",alias:"widget.ctxmenugrid",mixins:{gridkeyselect:"Fbx.ux.grid.GridKeySelectMixin",ctxmenumixin:"Fbx.ux.mixin.CtxMenuMixin"},constructor:function(options){this.callParent(arguments),this.mixins.ctxmenumixin.constructor.call(this),this.mixins.gridkeyselect.constructor.call(this)}});Ext.define("Fbx.os.app.settings.storage.Format",{extend:"Ext.window.Window",requires:["Ext.form.Label","Ext.form.field.ComboBox","Fbx.ux.form.AjaxFormPanel","Ext.data.ArrayStore"],height:250,width:500,modal:!0,layout:{type:"fit"},closeAction:"hide",title:"Formatage du disque",formatPresets:{fbx:{fs_type:"ext4",table_type:"gpt"},win:{fs_type:"ntfs",table_type:"msdos"},mac:{fs_type:"hfsplus",table_type:"gpt"},lin:{fs_type:"ext4",table_type:"gpt"}},initComponent:function(){var me=this;Ext.applyIf(me,{items:[{xtype:"ajaxform",showApplyCancel:!1,showOkBtn:!1,bodyPadding:10,checkBeforeClose:!1,title:"",defaults:{labelWidth:150,anchor:"100%"},buttons:[{xtype:"button",formBind:!0,disabled:!0,text:"Démarrer le formatage",iconCls:"btn-drive-delete",handler:function(){Ext.MessageBox.confirm("Êtes-vous sûr de vouloir formater le disque ?","<b>ATTENTION</b>, si vous validez votre choix, le contenu actuel du disque sera effacé !",function(btn){if("yes"===btn){var form=me.down("ajaxform");me.formatStarted=!1,form.submit(function(success){success&&(me.close(),Ext.Msg.progress("Formatage du disque","Formatage en cours, merci de patienter"),me.refreshTimer||(me.refreshTimer=setInterval(function(){me.checkProgress()},1e3)))})}})}},{xtype:"button",text:"Annuler",iconCls:"btn-cancel",handler:function(){me.close()}}],items:[{xtype:"displayfield",fieldLabel:"Disque",name:"title"},{xtype:"textfield",fieldLabel:"Nom",name:"label"},{xtype:"combobox",fieldLabel:"Utilisation du disque",name:"usage",allowBlank:!1,value:"fbx",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["fbx","Connecté en permanence à la Freebox"],["win","Connecté occasionnellement à un PC Windows"],["mac","Connecté occasionnellement à un MAC"],["lin","Connecté occasionnellement à un PC Linux"],["manual","Autre (configuration manuelle)"]]}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,listeners:{change:function(field,newVal){var basicForm=me.down("form").getForm();basicForm.findField("table_type").setReadOnly("manual"!==newVal),basicForm.findField("fs_type").setReadOnly("manual"!==newVal),me.formatPresets[newVal]&&basicForm.setValues(me.formatPresets[newVal])}}},{xtype:"combobox",fieldLabel:"Système de fichier",name:"fs_type",readOnly:!0,allowBlank:!1,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["ntfs","NTFS"],["vfat","FAT 32"],["ext4","EXT4"],["xfs","XFS"],["hfsplus","HFS Plus"],["exfat","exFAT"]]}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0},{xtype:"combobox",fieldLabel:"Table de partition",name:"table_type",readOnly:!0,allowBlank:!1,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["msdos","MBR"],["gpt","GUID"]]}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0},{xtype:"label",text:"ATTENTION : Toutes les données présentes sur le disque seront détruites !"}]}]}),me.callParent(arguments)},checkProgress:function(){var me=this,store=(me.down("ajaxform"),Ext.getStore("storageDiskStore"));if(store){var diskRec=store.getById(me.id);if(diskRec){var state=diskRec.get("state");switch(state){case"formatting":me.formatStarted=!0;var infos=diskRec.get("operation_pct");return progress=infos.percent/100,Ext.Msg.updateProgress(progress,infos.percent+"% - étape "+(infos.done_steps+1)+"/"+infos.max_steps),Ext.Msg.toFront(),void Ext.Msg.focus();case"enabled":if(!me.formatStarted)return}clearInterval(me.refreshTimer),me.refreshTimer=null,me.close(),"error"===state?Ext.Msg.show({title:"Erreur détectées",msg:"Une erreur est survenue lors du formatage",icon:Ext.window.MessageBox.ERROR,buttons:Ext.Msg.OK}):Ext.Msg.show({title:"Formatage OK",msg:"Le formatage est terminé",icon:Ext.window.MessageBox.INFO,buttons:Ext.Msg.OK}),setTimeout(function(){Ext.Msg.toFront(),Ext.Msg.focus()},100)}}},loadRecord:function(rec){var me=this,form=me.down("ajaxform");form.url=FbxConf.apiBaseUrl+"storage/disk/"+rec.get("id")+"/format",form.loadRecord(rec),me.id=rec.get("id");var basicForm=form.getForm(),type=rec.get("type");basicForm.findField("label").setDisabled("internal"===type),basicForm.findField("usage").setDisabled("internal"===type),basicForm.findField("table_type").setDisabled("internal"===type),basicForm.findField("fs_type").setDisabled("internal"===type),basicForm.setValues({label:"internal"===type?"Disque dur":"Disque "+Math.round(me.id/1e3),usage:"fbx",table_type:"gpt",fs_type:"ext4"})}});Ext.define("Fbx.os.app.downloader.TaskFileModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"id",type:"string"},{name:"task_id",type:"int"},{name:"name",type:"string"},{name:"filepath",type:"string"},{name:"status",type:"string"},{name:"priority",type:"string"},{name:"error",type:"string"},{name:"rx",type:"int"},{name:"size",type:"int"},{name:"preview_url",type:"string"},{name:"progress",type:"float",convert:function(v,record){return record.get("size")?Math.round(100*record.get("rx")/record.get("size")):-1}},{name:"running",type:"boolean",convert:function(v,rec){return"downloading"==rec.get("status")}},{name:"todownload",type:"boolean",convert:function(v,rec){return"no_dl"!=rec.get("priority")}}],proxy:{type:"restforeign",revertOnFailure:!0,url:FbxConf.apiBaseUrl+"downloads/{foreignId}/files",reader:{type:"json",root:"result"}}});Ext.define("Fbx.ux.form.field.EnumDisplay",{extend:"Fbx.ux.form.field.TemplatedDisplay",requires:["Ext.XTemplate"],alias:"widget.enumdisplayfield",tpl:"{valStr}",strings:{},constructor:function(cfg){var tpl,me=this;me.callParent(arguments),tpl=me.tpl=!Ext.isPrimitive(me.tpl)&&me.tpl.compile?me.tpl:Ext.create("Ext.XTemplate",me.tpl),me.renderer=function(value,p,record){var data={};return record?(data=Ext.apply(data,record.data,record.getAssociatedData()),data.val=record.get(me.name),data.valStr=this.strings[record.get(me.name)]):(data.val=value,data.valStr=this.strings[value]),tpl.apply(data)}}});Ext.define("Fbx.os.app.settings.DvbServicesModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"lcn",type:"int"},{name:"name",type:"string"},{name:"scrambled",type:"bool"}],idProperty:"lcn",proxy:{type:"restforeign",foreignProperty:"frontend",url:FbxConf.apiBaseUrl+"dvb/{foreignId}/services/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.VpnServerUserGrid",{extend:"Fbx.ux.grid.CtxMenuGrid",requires:["Fbx.os.app.settings.VpnServerUserModel","Fbx.os.app.settings.VpnServerUserEditor","Ext.grid.column.Action","Ext.grid.column.Boolean","Ext.grid.column.Template","Ext.data.Store","Ext.menu.Menu"],initComponent:function(){var me=this;me.store=Ext.create("Ext.data.Store",{storeId:"vpnUserStore",model:"Fbx.os.app.settings.VpnServerUserModel",remoteSort:!1,remoteFilter:!1,pageSize:0,autoload:!0}),Ext.applyIf(me,{store:me.store,bodyPadding:0,tbar:[{xtype:"button",iconCls:"btn-add",text:"Ajouter un utilisateur",handler:function(){var recs=me.store.add({}),rec=recs[0];me.showUserEditor(rec)}}],columns:[{text:"Utilisateur",dataIndex:"login",hideable:!1,flex:2},{xtype:"booleancolumn",dataIndex:"password_set",text:"Mot de passe défini",falseText:"Non",trueText:"Oui",flex:1},{xtype:"templatecolumn",dataIndex:"ip_reservation",text:"IP fixe",tpl:"<tpl if=\"ip_reservation != ''\">{ip_reservation}</tpl><tpl if=\"ip_reservation == ''\">IP dynamique</tpl>",flex:1},{xtype:"actioncolumn",hideable:!1,width:30,items:[{iconCls:"btn-edit",tooltip:"éditer",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);me.showUserEditor(rec)}}]},{xtype:"actioncolumn",hideable:!1,width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);rec.phantom?me.store.remove(rec):Ext.MessageBox.confirm("Supprimer","Voulez-vous supprimer cet utilisateur ?",function(btn){"yes"==btn&&(me.store.remove(rec),me.store.sync())})}}]}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun utilisateur</div>'},listeners:{celldblclick:function(cell,td,cellIndex,record,tr,rowIndex,e,eOpts){me.showUserEditor(record)}}}),me.on("show",function(){me.store.load()}),me.callParent(arguments)},showUserEditor:function(rec){var me=this;me.userEditor||(me.userEditor=Ext.create("Fbx.os.app.settings.VpnServerUserEditor",{closeAction:"hide",listeners:{hide:function(){setTimeout(function(){me.store.load(),Fbx.ux.form.field.HostSelector.vpnListLoaded=!1},300)}}})),me.userEditor.setRecord(rec),me.userEditor.show()},getCtxMenu:function(){var me=this;return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-edit",cls:"bold",text:"Modifier l'utilisateur",handler:function(){var records=me.getSelectedRecord(),rec=records[0];me.showUserEditor(rec)}},{iconCls:"btn-delete",text:"Supprimer l'utilisateur",handler:function(){var records=me.getSelectedRecord();Ext.MessageBox.confirm("Supprimer","Êtes-vous sûr de vouloir supprimer ce(s) utilisateur(s) ?",function(btn){"yes"==btn&&Ext.Array.each(records,function(r){r.destroy()})})}}],listeners:{beforeshow:function(){return me.getSelectedRecord().length>0}}})),me.ctxMenu}});Ext.define("Fbx.os.app.settings.VpnServerConfigPPTP",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Fbx.os.app.settings.VpnServerModel","Ext.layout.component.FieldSet","Ext.form.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Ext.form.field.Checkbox","Ext.form.field.Number","Ext.data.Store","Ext.form.field.Display","Ext.form.field.ComboBox"],initComponent:function(){var me=this;Ext.applyIf(me,{bodyPadding:10,autoScroll:!0,border:0,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"fieldset",title:me.fieldSetTitle,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",fieldLabel:"Activer",boxLabel:"",name:"enabled",listeners:{change:function(field,newVal){var form=me.getForm();form.findField("port").setDisabled(!newVal),form.findField("conf_pptp.mppe").setDisabled(!newVal),me.getComponent("vpn_allowed_auth_fieldset").setDisabled(!newVal)}}},{xtype:"displayfield",fieldLabel:"Port",disabled:!0,ttip:"Port à utiliser pour la connexion",name:"port"},{xtype:"combobox",fieldLabel:"Mode de chiffrement",disabled:!0,ttip:"Type de chiffrement à utiliser",name:"conf_pptp.mppe",store:new Ext.data.Store({fields:["type","name"],data:[{type:"disable",name:"Désactivé"},{type:"require",name:"Obligatoire"},{type:"require_128",name:"Obligatoire 128 bits"}]}),displayField:"name",valueField:"type",mode:"local",typeAhead:!1,editable:!1,listeners:{change:function(combo,newVal){var form=me.getForm(),chapv2=form.findField("conf_pptp.allowed_auth.mschapv2"),pap=form.findField("conf_pptp.allowed_auth.pap"),chap=form.findField("conf_pptp.allowed_auth.chap");"disable"!=newVal?(chapv2.setValue(!0),chapv2.setDisabled(!0),pap.setDisabled(!0),pap.setValue(!1),chap.setDisabled(!0),chap.setValue(!1)):(chapv2.setDisabled(!1),pap.setDisabled(!1),chap.setDisabled(!1))}}}]},{xtype:"fieldset",itemId:"vpn_allowed_auth_fieldset",title:"Modes de chiffrement autorisés",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.pap",fieldLabel:"PAP",boxLabel:""},{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.chap",fieldLabel:"CHAP",boxLabel:""},{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.mschapv2",fieldLabel:"MS-CHAPv2",boxLabel:""}]}]}),me.on("show",function(){me.load()}),me.on("loaded",function(form,data){void 0!==data.max_port&&void 0!==data.min_port&&(data.min_port>1723||data.max_port<1723)&&Ext.Msg.alert("Service indisponible","Ce service n'est pas disponible sur votre connexion")}),me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.DhcpConfig",{extend:"Fbx.ux.form.AjaxFormPanel",alias:"widget.dhcpconfig",requires:["Ext.form.FieldSet","Ext.form.field.Checkbox","Ext.form.field.ComboBox","Ext.layout.component.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Fbx.os.lib.FbxUtils"],initComponent:function(){var me=this;Fbx.os.gui.Environment.getNetworkConf(function(conf){me.netConf=conf}),Ext.applyIf(me,{url:FbxConf.apiBaseUrl+"dhcp/config/",layout:{align:"stretch",type:"vbox"},items:[{xtype:"fieldset",title:"Serveur DHCP",defaults:{anchor:"100%",labelWidth:200,boxLabel:""},items:[{xtype:"checkboxfield",fieldLabel:"Activer le serveur DHCP",name:"enabled",ttip:"Cette fonctionnalité permet d'attribuer automatiquement des adresses IP aux machines de votre réseau (vous ne devriez pas désactiver cette option)"},{xtype:"checkboxfield",fieldLabel:"Assignation fixe par machine",name:"sticky_assign",ttip:"Cette fonctionnalité permet d'attribuer toujours la même IP à une machine donnée"},{xtype:"checkboxfield",fieldLabel:"Forcer la réponse en broadcast",name:"always_broadcast",ttip:"Peut être nécessaire avec certains équipements réseau"},{xtype:"textfield",fieldLabel:"Début de la plage d'adresses",name:"ip_range_start",allowBlank:!1,ttip:"Début de la plage d'adresses IP qui sera attribuées aux machines de votre réseau",validator:function(val){return Fbx.os.lib.FbxUtils.checkSubnet(me.netConf.ip,val)}},{xtype:"textfield",fieldLabel:"Fin de la plage d'adresses",name:"ip_range_end",allowBlank:!1,ttip:"Fin de la plage d'adresses IP qui sera attribuées aux machines de votre réseau",validator:function(val,f){var ret=Fbx.os.lib.FbxUtils.checkSubnet(me.netConf.ip,val);if(!0!==ret)return ret;var form=me.getForm(),values=form.getValues(),s=values.ip_range_start.split(/\./);if(4!=s.length)return"Plage d'IP invalide";s=parseInt(s[3]);var e=val.split(/\./);return 4!=e.length?"Plage d'IP invalide":!((e=parseInt(e[3]))<=s)||"La fin de la plage d'IP doit être supérieure au début de la plage d'IP"}}]},{xtype:"fieldset",title:"DNS",flex:1,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"textfield",fieldLabel:"Serveur DNS 1",name:"dns.0",isArray:!0,vtype:"ip",ttip:"Un serveur DNS permet de retrouver l'adresse d'une machine sur internet à partir de son nom"},{xtype:"textfield",fieldLabel:"Serveur DNS 2",name:"dns.1",isArray:!0,vtype:"ip",ttip:"Serveur DNS secondaire"},{xtype:"textfield",fieldLabel:"Serveur DNS 3",name:"dns.2",isArray:!0,vtype:"ip",ttip:"Vous pouvez definir d'autres serveurs DNS (Optionnel)"},{xtype:"textfield",fieldLabel:"Serveur DNS 4",name:"dns.3",isArray:!0,vtype:"ip",ttip:"Vous pouvez definir d'autres serveurs DNS (Optionnel)"},{xtype:"textfield",fieldLabel:"Serveur DNS 5",name:"dns.4",isArray:!0,vtype:"ip",ttip:"Vous pouvez definir d'autres serveurs DNS (Optionnel)"}]}]}),me.callParent(arguments),me.load(),me.mon(me,"show",function(){me.load()}),me.mon(Fbx.os.gui.Environment,"networkConfChanged",function(conf){me.netConf=conf,me.getForm().isValid()})},submit:function(callback,force){var me=this,settings=me.getValues(),allEmpty=!0;for(var i in settings.dns)if(!Ext.isEmpty(settings.dns[i])){allEmpty=!1;break}if(allEmpty&&!force)return void Ext.MessageBox.confirm("Attention","Attention aucun serveur DNS n'est configuré voulez-vous utiliser la configuration par défaut ?",function(btn){if("yes"==btn){me.getForm().findField("dns.0").setValue(me.netConf.ip)}me.submit(callback,!0)});me.callParent(arguments)}});Ext.define("Fbx.os.app.lanbrowser.HostName",{extend:"Ext.data.Model",fields:[{name:"name",type:"string"},{name:"source",type:"string"}]}),Ext.define("Fbx.os.app.lanbrowser.HostConnection",{extend:"Ext.data.Model",fields:[{name:"af",type:"string"},{name:"addr",type:"string"},{name:"active",type:"bool"},{name:"reachable",type:"bool"},{name:"last_activity",type:"int"},{name:"last_time_reachable",type:"int"}]}),Ext.define("Fbx.os.app.lanbrowser.HostModel",{extend:"Fbx.ux.data.Model",requires:["Ext.data.association.HasMany"],fields:[{name:"id",type:"string"},{name:"vendor_name",type:"string"},{name:"host_type",type:"string"},{name:"primary_name",type:"string"},{name:"interface",type:"string"},{name:"reachable",type:"bool"},{name:"primary_name_manual",type:"bool",convert:function(val,r){return""==val?r.get("mac"):val}},{name:"active",type:"bool"},{name:"persistent",type:"bool"},{name:"last_time_reachable",type:"int"},{name:"last_activity",type:"int"},{name:"l2ident",type:"object"},{name:"mac",type:"string",convert:function(v,r){var l2=r.get("l2ident");return"mac_address"==l2.type?l2.id.toUpperCase():""}},{name:"is_crappy_name",type:"bool",convert:function(v,r){var name=r.raw.primary_name;return""==name||name.match(/^android([a-fA-F0-9-_]+)$/i)}},{name:"icon_name",type:"string",convert:function(v,r){var reachable=r.get("reachable");return r.get("host_type")+"-"+(reachable?"on":"off")}}],associations:[{model:"Fbx.os.app.lanbrowser.HostName",type:"hasMany",name:"names"},{model:"Fbx.os.app.lanbrowser.HostConnection",type:"hasMany",name:"l3connectivities"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"lan/browser/pub/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,buildUrl:function(request){var url,me=this,operation=request.operation,records=operation.records||[],record=records[0],id=record?record.getId():operation.id;return url=request.operation.__network?FbxConf.apiBaseUrl+"lan/browser/"+request.operation.__network+"/":FbxConf.apiBaseUrl+"lan/browser/pub/",me.appendId&&me.isValidId(id)&&(url.match(/\/$/)||(url+="/"),url+=id),url},reader:{type:"json",root:"result",messageProperty:"msg"}},wol:function(password){var me=this,url=FbxConf.apiBaseUrl+"lan/wol/pub/";Ext.Ajax.request({url:url,method:"POST",jsonData:{mac:me.get("mac"),password:password},success:function(response){Ext.Msg.alert("Réveil réseau","La demande de reveil a été envoyée")}})}});Ext.define("Fbx.os.app.downloader.BtPeerModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],statics:{btProto:{tcp:"TCP",tcp_obfuscated:"TCP brouillé",utp:"UTP"},btOrigin:{tracker:"Traqueur",dht:"DHT",pex:"Echange de pairs",incoming:"Connexion entrante",user:"Ajout manuel"}},fields:[{name:"host",type:"string"},{name:"state",type:"string"},{name:"origin",type:"string"},{name:"protocol",type:"string"},{name:"client",type:"string"},{name:"country_code",type:"string"},{name:"port",type:"int"},{name:"tx",type:"float"},{name:"rx",type:"float"},{name:"tx_rate",type:"float"},{name:"rx_rate",type:"float"},{name:"progress",type:"int"},{name:"score",type:"int"}],idProperty:"host",proxy:{type:"restforeign",revertOnFailure:!0,url:FbxConf.apiBaseUrl+"downloads/{foreignId}/peers",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.VpnServerStatus",{extend:"Ext.form.Panel",requires:["Fbx.os.app.settings.VpnServerModel","Ext.layout.component.FieldSet","Ext.form.FieldSet","Fbx.ux.form.field.EnumDisplay","Ext.form.field.Display"],initComponent:function(){var me=this;me.vpnStore=Ext.getStore("vpnServerStore"),Ext.applyIf(me,{bodyPadding:10,autoScroll:!0,items:[]}),me.callParent(arguments);var form=me.getForm();me.setLoading(!0);var values={},fields=["state","type","connection_count","auth_connection_count"];me.vpnStore.on("load",function(store,records){me.setLoading(!1),Ext.Array.each(records,function(r){var id=r.getId(),fieldPfx=id+"-",itemId="status-vpn-"+id;for(var i in fields){var f=fields[i];values[fieldPfx+f]=""+r.get(f)}if(!me.getComponent(itemId)){var item=Ext.create("Ext.form.FieldSet",{itemId:itemId,title:Fbx.os.app.settings.VpnServerModel.vpnPrettyNames[id],padding:5,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"enumdisplayfield",fieldLabel:"État",name:fieldPfx+"state",strings:{stopped:"Désactivé",starting:"Démarrage en cours",started:"Activé",stopping:"En cours d'arrêt",error:"Erreur"},listeners:{change:function(field,newVal){form.findField(fieldPfx+"auth_connection_count").setVisible("stopped"!=newVal)}}},{xtype:"displayfield",fieldLabel:"Nombre de clients actifs",name:fieldPfx+"auth_connection_count"}]});me.add(item)}}),form.setValues(values)})}});Ext.define("Fbx.os.app.settings.wifi.WifiGuestEditor",{extend:"Ext.window.Window",requires:["Ext.form.FieldSet","Ext.layout.component.FieldSet","Ext.form.field.ComboBox","Ext.form.field.Number","Fbx.os.lib.FbxUtils","Ext.form.Panel","Ext.data.ArrayStore","Fbx.ux.form.field.TemplatedDisplay"],save:function(){var me=this;me.down("form").getForm().isValid()&&(me.dirty?(me.wantClose=!0,me.updateCustomKey()):(me.customKeyId=null,me.close()))},submitOnEnter:function(field,event){var me=this;event.getKey()==event.ENTER&&me.save()},initComponent:function(){var me=this;me.canvasId="wifi-guest-qrcode-"+Math.ceil(1e5*Math.random()),me.form=Ext.create("Ext.form.Panel",{trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.close()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){me.save()}}],defaults:{anchor:"100%",labelWidth:200,listeners:{specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},items:[{xtype:"textfield",fieldLabel:"Mot de passe Wi-Fi invité",name:"key",ttip:"Mot de passe qui vous sera demandé pour vous connecter à votre accès Wi-Fi invité",validator:function(value){if(""==value)return!0;var keyLen=Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value);return keyLen<8?"Votre clé Wi-Fi est trop courte !":!(keyLen>63)||"Votre clé Wi-Fi est trop longue !"},listeners:{change:function(){me.updateCustomKey()}}},{xtype:"numberfield",fieldLabel:"Nombre de périphériques",name:"max_use_count",ttip:"Nombre de périphériques autorisés à se connecter en tout",allowBlank:!1,allowDecimals:!1,maxValue:128,minValue:1,listeners:{change:function(){me.updateCustomKey()}}},{xtype:"combo",name:"access_type",fieldLabel:"Type d'accès",ttip:"Si vous sélectionnez Accès Internet, vos invités n'auront pas accès à votre réseau local",store:new Ext.data.ArrayStore({fields:["val","name"],data:[["net_only","Accès Internet"],["full","Accès Internet + Réseau local"]]}),displayField:"name",valueField:"val",allowBlank:!1,queryMode:"local",listeners:{change:function(){me.updateCustomKey()}}},{xtype:"combo",name:"duration",fieldLabel:"Durée de l'accès",store:new Ext.data.ArrayStore({fields:["val","name"],data:[[0,"Pas d'expiration"],[3600,"1 heure"],[7200,"2 heures"],[14400,"4 heures"],[21600,"6 heures"],[86400,"1 jour"],[604800,"1 semaine"]]}),displayField:"name",valueField:"val",allowBlank:!1,queryMode:"local",listeners:{change:function(){me.updateCustomKey()}}},{xtype:"textfield",fieldLabel:"Description",maxLength:63,name:"description",validator:function(value){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value)>63)||"Votre description est trop longue"},listeners:{change:function(){me.updateCustomKey()}}},{xtype:"templateddisplayfield",fieldLabel:"QR Code",ttip:"Pour vous connecter à ce réseau Wi-Fi vous pouvez scanner ce QR Code avec un smartphone",size:{height:160},tpl:'<canvas id="'+me.canvasId+'"></canvas>'}]}),Ext.applyIf(me,{layout:"fit",closeAction:"hide",modal:!0,title:"Accès Wi-Fi Invité",width:550,height:375,items:[me.form]}),me.callParent(arguments),me.on("beforeclose",function(){me.customKeyId&&me.__deleteKey()})},loadValues:function(values){this.form.getForm().setValues(values)},updateCustomKey:function(){var me=this;me.dirty=!0,me.saveTimeout&&clearTimeout(me.saveTimeout),me.saveTimeout=setTimeout(function(){me.__updateCustomKey()},500)},__deleteKey:function(){var me=this;if(me.customKeyId){if(me.deleting)return;me.deleting=!0;document.getElementById(me.canvasId).style.display="none",Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/custom_key/"+me.customKeyId,method:"DELETE",callback:function(){me.deleting=!1},success:function(){me.customKeyId=null,me.wantSave&&me.__updateCustomKey(),me.wantSave=!1}})}},__updateCustomKey:function(){var me=this;if(document.getElementById(me.canvasId).style.display="none",me.customKeyId)return me.wantSave=!0,void me.__deleteKey();var form=me.form.getForm(),values=form.getValues();form.isValid()&&(me.saving||(me.saving=!0,me.saveTimeout=null,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/custom_key/",method:"POST",jsonData:{description:values.description,key:values.key,max_use_count:values.max_use_count,duration:values.duration,access_type:values.access_type},callback:function(){me.saving=!1},success:function(result){me.dirty=!1,me.wantClose?(me.close(),me.wantClose=!1,me.customKeyId=null):(me.customKeyId=result.jsonData.result.id,form.findField("key").setValue(result.jsonData.result.params.key),me.genQrcode())}})))},genQrcode:function(){var me=this,values=me.form.getForm().getValues(),bssParams=me.wifiGuest.bssParams,canvas=document.getElementById(me.canvasId);canvas.style.display="",Fbx.os.lib.FbxUtils.genWifiQrCode(bssParams.encryption,bssParams.ssid,values.key,bssParams.hide_ssid,canvas)}});Ext.define("Fbx.os.app.downloader.BtTrackerModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"task_id",type:"int"},{name:"announce",type:"string"},{name:"is_backup",type:"boolean"},{name:"status",type:"string"},{name:"interval",type:"int"},{name:"min_interval",type:"int"},{name:"reannounce_in",type:"int"},{name:"nseeders",type:"int"},{name:"nleechers",type:"int"},{name:"is_enabled",type:"boolean"}],idProperty:"announce",proxy:{type:"restforeign",revertOnFailure:!0,url:FbxConf.apiBaseUrl+"downloads/{foreignId}/trackers",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.epg.EpgCommon",{extend:"Ext.Component",requires:["Fbx.os.app.tv.ChannelDb","Fbx.os.lib.FbxUtils"],infoBubbleTpl:function(){return'<div class="epg-info-bubble" class="unselectable" unselectable="on">  <img class="epg-bubble-img" />  <div class="epg-bubble-infos">    <div class="epg-bubble-title"></div>    <div class="epg-bubble-subtitle"></div>    <div class="epg-bubble-cat"></div>   <div class="epg-bubble-date"></div>  </div> <div style="clear: both;"></div></div>'},initComponent:function(){var me=this;me.addEvents("programclick","startdrag"),me.TOTAL_DURATION=10080,me.CATEGORY_ASSOC=[9,3,3,7,7,1,0,6,6,0,5,2,0,6,0,3,2,0,0,8,4,4,5,6,0,9,5,9,0,0,0,9],me.PROG_IMG_WIDTH=100,me.EMPTY_IMG="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",me.TIME_BUTTON_INTERVAL=3,me.CHANNEL_HEIGHT=85,me.CHANNEL_MARGIN=5,me.CHANNEL_WIDTH=80+2*me.CHANNEL_MARGIN+1,me.PROG_SPACING=4,me.BUTTON_ELEM_HEIGHT=60,me.MAX_UPDATE_PER_SEC=25,me.BUBBLE_TIMER=250,me.BUBBLE_WIDTH=300,me.BUBBLE_HEIGHT=87,me.REQUEST_QUEUE_MAX_SIZE=32,me.REQUEST_MAX_PARALLEL=5,me.channels=[],me.programs={},me.progLoadLock={},me.requestQueue=[],me.requestRunning=0,me.channelElems=[],me.recycleChannelElems=[],me.programElems=[],me.recycleProgramElems=[],me.on("boxready",function(){me.initEpg(),me.channelDb.load()}),me.on("resize",function(){me.resizeContainer()}),me.channelDb=Fbx.os.app.tv.ChannelDb.getInstance(),me.channelDb.on("load",function(){var channels=Fbx.os.app.tv.ChannelDb.channels;$.ajax({url:FbxConf.apiBaseUrl+"tv/bouquets/freeboxtv/channels/",dataType:"json",success:function(data){var bqChannels=data.result;bqChannels||(bqChannels=[]),me.loadChannels(channels,bqChannels)}})}),me.on("show",function(){me.enableRefresh()}),me.on("hide",function(){me.suspendRefresh()}),me.enableRefresh(),me.callParent(arguments)},suspendRefresh:function(){var me=this;me.interval&&(clearInterval(me.interval),me.interval=null)},enableRefresh:function(){var me=this;me.interval||(me.interval=setInterval(function(){if(!me.isVisible())return void me.suspendRefresh();me.dirty&&me.refreshDisplay()},Math.ceil(1e3/me.MAX_UPDATE_PER_SEC)))},initEpg:function(){var me=this;me.outerElem=$("#"+me.divId),me.container=$("#"+me.divId+" .epg-container"),me.viewport=$("#"+me.divId+" .epg-viewport"),me.btnElem=$("#"+me.divId+" .epg-btn-container"),me.vcrap=$("#"+me.divId+" .epg-vcrap"),me.btnElem||console.warn("unable to get btn container"),me.channelList=$("#"+me.divId+" .epg-channellist"),$.browser.msie&&me.viewport.css({"background-color":"rgba(255,255,255,0.01)"}),me.viewport.scrollTop(0),me.viewport.scrollLeft(0),me.viewport.on("scroll",function(){me.dirty=!0}),me.infoBubble={infos:$("#"+me.divId+" .epg-bubble-infos"),elem:$("#"+me.divId+" .epg-info-bubble"),img:$("#"+me.divId+" .epg-bubble-img"),title:$("#"+me.divId+" .epg-bubble-title"),subtitle:$("#"+me.divId+" .epg-bubble-subtitle"),cat:$("#"+me.divId+" .epg-bubble-cat"),date:$("#"+me.divId+" .epg-bubble-date")},me.initDayBtn(),me.hideInfoBubble(),me.container.on("ondragstart",function(event){return event.stopPropagation(),event.preventDefault(),!1}),me.viewport.on("mousedown",function(event){if(me.hideInfoBubble(),!(event.offsetX>me.width+me.CHANNEL_WIDTH||event.offsetY>me.height))return me.startDrag(event),event.stopPropagation(),event.preventDefault(),!1}),me.viewport.bind("mousemove",function(event){if(me.__isDragging){me.hideInfoBubble();var left=me.__dragOrigin.x-event.pageX+me.__dragOrigin.scrollLeft;me.viewport.scrollLeft(left);var top=me.__dragOrigin.y-event.pageY+me.__dragOrigin.scrollTop;me.viewport.scrollTop(top)}else me.ENABLE_BUBBLE&&(me.bubbleTimer&&clearTimeout(me.bubbleTimer),me.bubbleVisible?me.hideInfoBubble():me.BUBBLE_TIMER?me.bubbleTimer=setTimeout(function(){me.updateInfoBubble(event),me.hideBubbleTimer&&clearTimeout(me.hideBubbleTimer)},me.BUBBLE_TIMER):me.updateInfoBubble(event))}),me.infoBubble.elem.bind("mouseover",function(event){me.mouseOverBubble=!0}),me.infoBubble.elem.bind("mouseout",function(event){me.mouseOverBubble=!1}),me.viewport.bind("mouseout",function(event){me.bubbleTimer&&clearTimeout(me.bubbleTimer),me.__isDragging?me.stopDrag(event):(me.bubbleTimer&&clearTimeout(me.bubbleTimer),me.bubbleTimer=setTimeout(function(){me.mouseOverBubble||me.hideInfoBubble()},500))}),me.viewport.on("mouseup",function(event){me.stopDrag(event),me.__dragOrigin||(me.__dragOrigin={x:event.pageX,y:event.pageY,time:new Date});var dst=Math.abs(event.pageX-me.__dragOrigin.x)+Math.abs(event.pageY-me.__dragOrigin.y);if((new Date).getTime()-me.__dragOrigin.time.getTime()<2e3&&dst<30){var infos=me.getChanTimeForEvent(event);if(!infos)return;var channelIdx=infos[0],time=infos[1],prog=me.getProgForChanAtTime(channelIdx,time);if(!prog)return;var channel=me.channels[channelIdx];me.fireEvent("programclick",me,channel,prog)}})},startDrag:function(event){var me=this;me.__dragOrigin={x:event.pageX,y:event.pageY,scrollTop:me.viewport.scrollTop(),scrollLeft:me.viewport.scrollLeft(),time:new Date},me.__isDragging=!0,me.fireEvent("startdrag")},stopDrag:function(event){this.__isDragging=!1},resizeContainer:function(){var me=this;me.container.css({top:me.HEADER_HEIGHT+me.BUTTON_ELEM_HEIGHT,width:me.width,height:me.height,left:me.CHANNEL_WIDTH}),me.channelList.css({top:me.HEADER_HEIGHT+me.BUTTON_ELEM_HEIGHT,left:0,width:me.CHANNEL_WIDTH-1,height:me.height}),me.dirty=!0},scrollToDate:function(date){console.warn("scrollToDate not implemented")},initDayBtn:function(){var me=this,shortDayName=["Dima.","Lundi","Mardi","Merc.","Jeudi","Vend.","Same."];me.dayBtns={};var m=Fbx.os.lib.FbxUtils.getParisMoment();m.hour(21),m.minute(0),m.second(0),m.millisecond(0);var nbDays=me.TOTAL_DURATION/60/24;($('<div class="btn-epg-view-toggle btn-epg-highlight btn-epg-view-toggle-selected">Soirée</div>').appendTo(me.btnElem),$('<div class="btn-epg-view-toggle btn-epg-complete">Semaine</div>').appendTo(me.btnElem),me.showNowbutton)&&$('<div class="btn-day btn-now">Maintenant</div>').appendTo(me.btnElem);for(var i=0;i<nbDays;++i){var d=m.clone().add(i,"days"),day=shortDayName[d.day()]+"<br />"+d.format("D"),btn=$('<div class="btn-day">'+day+"</div>");btn.appendTo(me.btnElem),$(btn).data({date:d.toDate()}),me.dayBtns[d.valueOf()]=btn,0==i&&$(btn).addClass("btn-day-selected")}if(me.up("tabpanel").on("tabchange",function(tabpanel,newCard,oldCard){$("#"+me.divId+" .btn-epg-view-toggle").removeClass("btn-epg-view-toggle-selected"),$("#"+me.divId+" .btn-"+newCard.itemId).addClass("btn-epg-view-toggle-selected")}),$("#"+me.divId+" .btn-epg-highlight").click(function(e){var tabpanel=me.up("tabpanel");tabpanel.setActiveTab(tabpanel.getComponent("epg-highlight"))}),$("#"+me.divId+" .btn-epg-complete").click(function(e){var tabpanel=me.up("tabpanel");tabpanel.setActiveTab(tabpanel.getComponent("epg-complete"))}),$("#"+me.divId+" .btn-epg-view-toggle").mouseover(function(e){$(this).addClass("btn-epg-view-toggle-over")}).mouseout(function(e){$(this).removeClass("btn-epg-view-toggle-over")}),me.allDayBtns=$("#"+me.divId+" .btn-day"),me.allDayBtns.mouseover(function(e){$(this).addClass("btn-day-over")}).mouseout(function(e){$(this).removeClass("btn-day-over")}).click(function(e){me.allDayBtns.removeClass("btn-day-selected");var day,data=$(this).data();if(data&&data.date){day=Fbx.os.lib.FbxUtils.getParisMoment(data.date),$(this).addClass("btn-day-selected");var sHour=$("#"+me.divId+" .btn-hour-selected"),data=$(sHour).data();data&&data.hours&&day.hour(data.hours)}else day=Fbx.os.lib.FbxUtils.getParisMoment();me.scrollToDate(day.toDate())}),me.showHourbutton){me.hourBtns={};var hourBtnElem=$('<div class="btn-hour-container"></div>');hourBtnElem.appendTo(me.btnElem);for(var i=0;i<24;i+=me.TIME_BUTTON_INTERVAL){var hStr=i>=10?i:"0"+i,btn=$('<div class="btn-hour">'+hStr+":00</div>");$(btn).data({hours:i}),btn.appendTo(hourBtnElem),me.hourBtns[i]=btn}me.allHourBtns=$("#"+me.divId+" .btn-hour"),me.allHourBtns.mouseover(function(e){$(this).addClass("btn-hour-over")}).mouseout(function(e){$(this).removeClass("btn-hour-over")}).click(function(e){me.allHourBtns.removeClass("btn-hour-selected"),$(this).addClass("btn-hour-selected");var data=$(this).data(),hours=data.hours,middle=(me.rangeStart+me.rangeEnd)/2,day=Fbx.os.lib.FbxUtils.getParisMoment(1e3*middle);day.hour(hours),day.minute(0),day.second(0),day.millisecond(0),me.scrollToDate(day.toDate())})}},getScrollBarWidth:function(){var me=this;if(me.__scrollBarSize)return me.__scrollBarSize;var inner=document.createElement("p");inner.style.width="100%",inner.style.height="200px";var outer=document.createElement("div");outer.style.position="absolute",outer.style.top="0px",outer.style.left="0px",outer.style.visibility="hidden",outer.style.width="200px",outer.style.height="150px",outer.style.overflow="hidden",outer.appendChild(inner),document.body.appendChild(outer);var w1=inner.offsetWidth;outer.style.overflow="scroll";var w2=inner.offsetWidth;return w1==w2&&(w2=outer.clientWidth),document.body.removeChild(outer),me.__scrollBarSize=w1-w2,me.__scrollBarSize},createChannelElem:function(){var me=this,e={};return e.elem=$('<div class="epg-channel-elem unselectable" unselectable="on"></div>'),e.img=$('<img class="epg-channel-logo"/>'),e.img.appendTo(e.elem),e.title=$('<div class="epg-channel-name"></div>'),e.title.appendTo(e.elem),e.elem.appendTo(me.channelList),e.idx=-1,e},recycleChannelElem:function(e){var me=this;e.elem.hide(),e.img.attr({src:me.EMPTY_IMG}),e.idx=-1,me.recycleChannelElems.push(e)},recycleProgramElem:function(e){var me=this;e.elem.hide(),e.img.hide(),e.imgVisible=!1,e.elem.removeClass(e.catClass),e.img.attr({alt:"",src:me.EMPTY_IMG}),e.infos.css({"padding-left":5}),e.prog="",me.recycleProgramElems.push(e)},createProgElem:function(){var me=this,e={};return e.elem=$('<div class="epg-prog-elem unselectable" unselectable="on"></div>'),e.img=$('<img class="epg-prog-logo" />'),e.img.appendTo(e.elem),e.img.hide(),e.infos=$('<div class="epg-prog-infos unselectable" unselectable="on"></div>'),e.infos.appendTo(e.elem),e.title=$('<div class="epg-prog-title unselectable" unselectable="on"></div>'),e.title.appendTo(e.infos),e.subtitle=$('<div class="epg-prog-subtitle unselectable" unselectable="on"></div>'),e.subtitle.appendTo(e.infos),e.elem.appendTo(me.container),e.imgVisible=!1,e.prog="",e},enqueRequest:function(url,channelIdx,time,cb){var me=this,rq={url:url,channelIdx:channelIdx,time:time,cb:cb};if(me.requestQueue.length==me.REQUEST_QUEUE_MAX_SIZE){me.requestQueue.shift().cb(!1)}me.requestQueue.push(rq),me.processNextRequest()},processNextRequest:function(){var me=this;if(!(me.requestRunning>=me.REQUEST_MAX_PARALLEL||!me.requestQueue.length||me.animationInProgress)){for(var rq=me.requestQueue.shift();rq&&(rq.channelIdx<me.startChannelIdx||rq.channelIdx>me.endChannelIdx||rq.time+me.PROG_RANGE_DURATION<me.rangeStart||rq.time>me.rangeEnd);)rq.cb(!1),rq=me.requestQueue.shift();rq&&(++me.requestRunning,$.ajax({url:rq.url,dataType:"json",success:function(data){rq.cb(!0,data)},error:function(xhr){rq.cb(!1),429==xhr.status&&me.flushRequestQueue()},complete:function(){--me.requestRunning,me.processNextRequest()}}))}},flushRequestQueue:function(){for(var me=this,prevW=(me.requestQueueW-1+me.REQUEST_QUEUE_MAX_SIZE)%me.REQUEST_QUEUE_MAX_SIZE;me.requestQueueR!=prevW;){var rq=me.requestQueue[me.requestQueueR];if(!rq)break;rq.cb(!1),me.requestQueueR=(me.requestQueueR+1)%me.REQUEST_QUEUE_MAX_SIZE}me.requestQueue=[],me.requestQueueR=0,me.requestQueueW=0},hideInfoBubble:function(){var me=this;me.bubbleTimer&&clearTimeout(me.bubbleTimer),me.infoBubble.channelIdx=-1,me.infoBubble.start=-1,me.infoBubble.end=-1,me.bubbleVisible=!1,me.infoBubble.elem.hide(),me.infoBubble.img.attr({src:me.EMPTY_IMG})},getChanTimeForEvent:function(event){console.warn("getChanTimeForEvent not implemented")},getProgForChanAtTime:function(channelIdx,time){console.warn("getProgForChanAtTime not implemented")},updateInfoBubble:function(event){var me=this,infos=me.getChanTimeForEvent(event);if(!infos)return void me.hideInfoBubble();var channelIdx=infos[0],time=infos[1];if(me.infoBubble.channelIdx!=channelIdx||time<me.infoBubble.start||time>me.infoBubble.end){var p=me.getProgForChanAtTime(channelIdx,time);if(!p||p.fake)return void me.hideInfoBubble();me.infoBubble.channelIdx=channelIdx,me.infoBubble.start=p.date,me.infoBubble.end=p.end,p.picture?(me.infoBubble.img.attr({src:p.picture}),me.infoBubble.img.show()):me.infoBubble.img.hide(),p.title?(me.infoBubble.title.text(p.title),me.infoBubble.title.show()):me.infoBubble.title.hide(),p.sub_title?(me.infoBubble.subtitle.text(p.sub_title),me.infoBubble.subtitle.show()):me.infoBubble.subtitle.hide(),p.category_name?(me.infoBubble.cat.text(p.category_name),me.infoBubble.cat.show()):me.infoBubble.cat.hide(),me.infoBubble.date.text("de "+Fbx.os.lib.FbxUtils.displayTime(me.infoBubble.start)+" à "+Fbx.os.lib.FbxUtils.displayTime(me.infoBubble.end))}me.bubbleVisible=!0,me.moveBubble(event),me.infoBubble.elem.show()},moveBubble:function(event){var me=this;if(me.bubbleVisible){var top=event.offsetY+10+me.BUTTON_ELEM_HEIGHT,left=event.offsetX+10;top>me.maxTop&&(top=event.offsetY+me.BUTTON_ELEM_HEIGHT-me.BUBBLE_HEIGHT-10),left>me.maxLeft&&(left=event.offsetX-me.BUBBLE_WIDTH-10),me.infoBubble.elem.css({left:left,top:top})}},loadChannels:function(channels,bqChannels){var me=this;me.channels=[];for(var i=0;i<bqChannels.length;++i){var c=bqChannels[i];if(0==c.sub_number){var infos=channels[c.uuid];infos&&(infos.number&&(infos=$.extend({},infos)),infos.number=c.number,me.channels.push(infos))}}me.channels.sort(function(a,b){return a.number-b.number});for(var i=0;i<me.channels.length;++i)me.channels[i].idx=i;me.dirty=!0},updateCurDay:function(){var me=this;if(!me.animationInProgress){var middle=(me.rangeStart+me.rangeEnd)/2,curDay=Fbx.os.lib.FbxUtils.getParisMoment(1e3*middle),h=curDay.hour();curDay.hour(21),curDay.minute(0),curDay.second(0),curDay.millisecond(0);var btn=me.dayBtns[curDay.valueOf()];if(me.allDayBtns.removeClass("btn-day-selected"),$(btn).addClass("btn-day-selected"),me.showHourbutton){h-=h%me.TIME_BUTTON_INTERVAL;var hBtn=me.hourBtns[h];me.allHourBtns.removeClass("btn-hour-selected"),$(hBtn).addClass("btn-hour-selected")}}},refreshDisplay:function(){var me=this;if(me.channels&&me.channels.length){me.updateCurDay(),me.scrollTop=me.viewport.scrollTop(),me.scrollLeft=me.viewport.scrollLeft(),me.startChannelIdx=Math.floor(me.scrollTop/me.CHANNEL_HEIGHT),me.endChannelIdx=Math.floor((me.scrollTop+me.height)/me.CHANNEL_HEIGHT),me.vcrap.height(me.channels.length*me.CHANNEL_HEIGHT+me.HEADER_HEIGHT);for(var i in me.channelElems)if(i<me.startChannelIdx||i>me.endChannelIdx){var e=me.channelElems[i];me.recycleChannelElem(e),delete me.channelElems[i]}for(var i=me.startChannelIdx;i<=me.endChannelIdx;++i){var e=me.channelElems[i];if(e||(e=me.recycleChannelElems.pop(),e||(e=me.createChannelElem()),me.channelElems[i]=e),e.idx!=i){var channel=me.channels[i];if(!channel){me.recycleChannelElem(e);continue}e.img.attr({src:channel.logo_url,alt:channel.short_name}),e.title.text(channel.short_name),e.idx=i}e.elem.css({left:me.CHANNEL_MARGIN,top:e.idx*me.CHANNEL_HEIGHT-me.scrollTop}),e.elem.show()}for(var i in me.programElems){me.programElems[i]||(me.programElems[i]={});var elems=me.programElems[i];if((i<me.startChannelIdx-10||i>me.endChannelIdx+10)&&delete me.programs[i],i<me.startChannelIdx||i>me.endChannelIdx){for(var k in elems){var e=elems[k];me.recycleProgramElem(e)}delete me.programElems[i]}else for(var k in elems){var e=elems[k];(e.end<=me.rangeStart||e.start>=me.rangeEnd)&&(me.recycleProgramElem(e),delete elems[k])}}me.dirty=!1}}});Ext.define("Fbx.os.app.tv.Settings",{extend:"Ext.tab.Panel",requires:["Fbx.os.app.tv.FlashPlayer","Fbx.os.app.tv.VLCPlayer","Ext.data.ArrayStore","Ext.form.field.ComboBox","Ext.form.RadioGroup","Ext.form.field.Radio","Ext.form.Panel","Ext.button.Button","Ext.util.LocalStorage","Ext.state.LocalStorageProvider","Ext.state.CookieProvider"],statics:{__stateProvider:null,__tvPrefsKey:"freeboxos-tv-prefs",__defaultPrefs:{prefered_player:"flash",prefered_quality:"auto",prefered_source:"iptv",auto_resume:!0,auto_subtitle:!1,flash_wmode:"opaque",flash_quality:"autohigh"},_getStateProvider:function(){return this.__stateProvider?this.__stateProvider:(Ext.util.LocalStorage.supported?this.__stateProvider=Ext.create("Ext.state.LocalStorageProvider",{prefix:"fbxtv"}):this.__stateProvider=Ext.create("Ext.state.CookieProvider",{expires:new Date((new Date).getTime()+31536e6)}),this.__stateProvider)},getUserPrefs:function(){var stateProvider=this._getStateProvider(),prefs=stateProvider.get(this.__tvPrefsKey);return prefs||(stateProvider.set(this.__tvPrefsKey,this.__defaultPrefs),prefs=this.__defaultPrefs),prefs},saveUserPrefs:function(prefs){this._getStateProvider().set(this.__tvPrefsKey,prefs)}},initComponent:function(){var me=this,playerData=[];Fbx.os.app.tv.FlashPlayer.isAvailable()&&playerData.push(["flash","Flash Player"]),me.playerStore=Ext.create("Ext.data.ArrayStore",{fields:[{name:"id",type:"string"},{name:"name",type:"string"},{name:"available",type:"bool"}],data:[["flash","Flash Player",Fbx.os.app.tv.FlashPlayer.isAvailable()],["vlc","VLC",Fbx.os.app.tv.VLCPlayer.isAvailable()]]}),me.playerCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Lecteur Préféré",name:"prefered_player",store:me.playerStore,editable:!1,labelWidth:300,forceSelection:!0,displayField:"name",valueField:"id",typeAhead:!1,mode:"local",lastQuery:"",listConfig:{getInnerTpl:function(){return'<tpl if="!available"><span style="color: #AAA;"></tpl>  {name:htmlEncode}<tpl if="!available"> (Non disponible)</span></tpl>'}},ttip:"En fonction des plugins installés dans votre navigateur vous pouvez choisir quel plugin utiliser pour regarder la TV. <br />La lecture avec Flash est optimisée pour une utilisation en Wifi.<br />La lecture avec VLC permet un zap plus rapide mais est plus sensible aux perturbations réseau"}),me.qualityStore=Ext.create("Ext.data.ArrayStore",{fields:[{name:"id",type:"string"},{name:"name",type:"string"}],data:[["auto","Automatique"],["hd","HD"],["sd","Standard"],["ld","Bas débit"]]}),me.qualityCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Qualité de flux préférée",name:"prefered_quality",store:me.qualityStore,editable:!1,labelWidth:300,forceSelection:!0,displayField:"name",valueField:"id",typeAhead:!1,mode:"local",lastQuery:"",ttip:"En fonction du débit de votre connexion internet vous pouvez choisir d'utiliser un flux bas débit."}),me.sourceStore=Ext.create("Ext.data.ArrayStore",{fields:[{name:"id",type:"string"},{name:"name",type:"string"}],data:[["iptv","ADSL / FTTH"],["dvb","TNT"]]}),me.sourceCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Source de flux préférée",name:"prefered_source",store:me.sourceStore,labelWidth:300,editable:!1,forceSelection:!0,displayField:"name",valueField:"id",typeAhead:!1,mode:"local",lastQuery:"",ttip:"Si vous avez relié votre Freebox à une antenne TNT vous pouvez choisir d'utiliser en priorité un flux TNT. Notez que le plugin VLC est nécessaire pour la lecture des flux TNT"}),me.generalForm=Ext.create("Ext.form.Panel",{bodyPadding:10,trackResetOnLoad:!0,title:"Préférences de lecture",defaults:{anchor:"100%",labelWidth:300},items:[me.playerCombo,me.qualityCombo,me.sourceCombo,{xtype:"checkbox",name:"auto_resume",inputValue:!0,uncheckedValue:!1,fieldLabel:"Lancer automatiquement la dernière chaîne visualisée",ttip:"Lorsque cette option est activée la dernière chaîne regardée se lance automatiquement lors de l'ouverture de l'application"},{xtype:"checkbox",name:"auto_subtitle",inputValue:!0,uncheckedValue:!1,fieldLabel:"Activer automatiquement les sous titres",ttip:"Lorsque cette option est activée et qu'une piste de sous titres est disponible, les sous titres sont automatiquement activés"}]}),me.flashForm=Ext.create("Ext.form.Panel",{bodyPadding:10,trackResetOnLoad:!0,title:"Paramètres Flash Player",defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"radiogroup",fieldLabel:"Mode d'intégration",labelWidth:200,columns:3,vertical:!0,defaults:{flex:1},items:[{boxLabel:"Window",name:"flash_wmode",inputValue:"window"},{boxLabel:"Direct",name:"flash_wmode",inputValue:"direct"},{boxLabel:"Opaque",name:"flash_wmode",inputValue:"opaque"},{boxLabel:"Transparent",name:"flash_wmode",inputValue:"transparent"}]},{xtype:"radiogroup",fieldLabel:"Qualité vidéo",labelWidth:200,columns:3,vertical:!0,defaults:{flex:1},items:[{boxLabel:"Basse",name:"flash_quality",inputValue:"low"},{boxLabel:"Auto Basse",name:"flash_quality",inputValue:"autolow"},{boxLabel:"Auto Haute",name:"flash_quality",inputValue:"autohigh"},{boxLabel:"Moyenne",name:"flash_quality",inputValue:"medium"},{boxLabel:"Haute",name:"flash_quality",inputValue:"high"},{boxLabel:"Meilleur",name:"flash_quality",inputValue:"best"}]},{xtype:"container",padding:"5 0",html:"Les paramètres de qualité et de mode d'intégration ont un effet sur les performances du lecteur vidéo Flash. En cas de saccades d'images essayez de modifier les paramètres ci-dessus. Pour plus d'informations consultez la <a target=\"_blank\" href=\"http://helpx.adobe.com/fr/flash/kb/flash-object-embed-tag-attributes.html#main_Optional_attributes\">documentation du plugin flash.</a><br />Vous devez redémarrer l'application TV pour que ces paramères soient pris en compte."}]}),me.buttonApply=Ext.create("Ext.button.Button",{text:"Appliquer",iconCls:"btn-save",disabled:!0,handler:function(){me.savePrefs()}}),me.cancelBtn=Ext.create("Ext.button.Button",{text:"Annuler",disabled:!1,iconCls:"btn-cancel",handler:function(){me.loadPrefs(),me.up("window").close()}}),me.submitBtn=Ext.create("Ext.button.Button",{text:"OK",iconCls:"btn-accept",itemId:"btn-apply",disabled:!0,handler:function(){me.savePrefs(),me.up("window").close()}}),Ext.applyIf(me,{buttons:[me.submitBtn,me.cancelBtn,me.buttonApply],items:[me.generalForm,me.flashForm]}),me.generalForm.on("dirtychange",function(){me.updateDirty()}),me.flashForm.on("dirtychange",function(){me.updateDirty()}),me.generalForm.on("validitychange",function(){me.updateDirty()}),me.flashForm.on("validitychange",function(){me.updateValidity()}),me.on("boxready",function(){me.up("window").on("show",function(){me.loadPrefs()}),me.up("window").on("beforeclose",function(){if(me.isDirty)return Ext.Msg.confirm("Modifications non sauvegardées","Voulez-vous sauvegarder les modifications ?",function(btn){"yes"==btn?me.savePrefs():me.loadPrefs(),me.up("window").close()}),!1})}),me.callParent(arguments)},updateDirty:function(){var me=this;me.isDirty=me.generalForm.isDirty()||me.flashForm.isDirty(),me.buttonApply.setDisabled(!me.isValid||!me.isDirty)},updateValidity:function(){var me=this;me.isValid=me.generalForm.isValid()||me.flashForm.isValid(),me.buttonApply.setDisabled(!me.isValid||!me.isDirty),me.submitBtn.setDisabled(!me.isValid)},loadPrefs:function(){var me=this,prefs=Fbx.os.app.tv.Settings.getUserPrefs();me.generalForm.getForm().setValues(prefs),me.flashForm.getForm().setValues(prefs),me.updateDirty(),me.updateValidity()},savePrefs:function(){var me=this,prefs=me.generalForm.getForm().getValues(),prefs2=me.flashForm.getForm().getValues();Ext.apply(prefs,prefs2),Fbx.os.app.tv.Settings.saveUserPrefs(prefs),me.loadPrefs()}});Ext.define("Fbx.os.app.epg.EpgHighlights",{extend:"Fbx.os.app.epg.EpgCommon",requires:["Fbx.os.app.tv.ChannelDb","Fbx.os.lib.FbxUtils"],initComponent:function(){var me=this;me.showNowbutton=!1,me.showHourbutton=!1,me.BUTTON_ELEM_WIDTH=630,me.EMPTY_IMG="resources/images/fbx/logo_placeholder_white.png",me.NB_PROGS_PER_LINE=3,me.HEADER_HEIGHT=0,me.HIGHLIGHTS_DURATION=3,me.ENABLE_BUBBLE=!1;var m=Fbx.os.lib.FbxUtils.getParisMoment();m.hour(21),m.minute(0),m.second(0),m.millisecond(0),me.curDay=m.toDate(),me.divId=Ext.id(),me.html='<div id="'+me.divId+'" class="epg-highlights unselectable" unselectable="on"    style="width: 100%; height: 100%;">  <div class="epg-btn-container"></div>  <div class="epg-viewport" style="overflow: auto; width: 100%;">    <div class="epg-vcrap"> </div>  </div>'+me.infoBubbleTpl()+'  <div class="epg-channellist" class="unselectable" unselectable="on"></div>  <div class="epg-container" class="unselectable" unselectable="on"></div></div>',me.callParent(arguments)},initEpg:function(){var me=this;me.callParent(arguments),me.resizeContainer()},resizeContainer:function(){var me=this;me.viewport&&(me.width=me.outerElem.width(),me.height=me.outerElem.height()-me.BUTTON_ELEM_HEIGHT,me.elemWidth=Math.floor((me.width-me.CHANNEL_WIDTH-me.getScrollBarWidth())/me.NB_PROGS_PER_LINE)-me.PROG_SPACING,me.maxTop=me.height-me.BUBBLE_HEIGHT+me.BUTTON_ELEM_HEIGHT,me.maxLeft=me.width-me.getScrollBarWidth()-me.BUBBLE_WIDTH,me.viewport.css({width:me.width,height:me.height,top:me.BUTTON_ELEM_HEIGHT,left:0}),me.btnElem.css({width:me.BUTTON_ELEM_WIDTH,height:me.BUTTON_ELEM_HEIGHT}),me.callParent(arguments))},scrollToDate:function(date){var me=this;me.curDay=date,me.programs={},me.flushRequestQueue(),me.dirty=!0},refreshDisplay:function(){var me=this;if(me.channels&&me.channels.length){var refTime=me.curDay.getTime()/1e3;me.rangeStart=refTime,me.rangeEnd=refTime+me.HIGHLIGHTS_DURATION,me.callParent(arguments);for(var i=me.startChannelIdx;i<=me.endChannelIdx;++i)me.drawChannelProgram(i)}},drawChannelProgram:function(idx){var me=this,t=me.curDay.getTime()/1e3;me.programs[idx]&&me.programs[idx][t]?me.processChannelProg(idx,me.programs[idx][t]):me.loadChannelProg(idx,t)},loadChannelProg:function(idx,rangeStart){var me=this,channel=me.channels[idx];if(channel){var lock=channel.uuid+"_"+rangeStart;if(!me.progLoadLock[lock]){me.progLoadLock[lock]=!0;var url=FbxConf.apiBaseUrl+"tv/epg/highlights/"+channel.uuid+"/"+rangeStart+"/";me.enqueRequest(url,idx,rangeStart,function(success,data){if(delete me.progLoadLock[lock],success){var progs=data.result;for(var k in progs){var p=progs[k];p.end=p.date+p.duration}if(0==progs.length){progs=[];for(var i=0;i<me.NB_PROGS_PER_LINE;++i)progs.push({id:"fake_id_"+i,title:"Programme inconnu",subtitle:"",date:rangeStart+3600*i,duration:3600})}else progs=progs.sort(function(a,b){return a.date-b.date});me.programs[idx]||(me.programs[idx]={}),me.programs[idx][rangeStart]=progs,me.processChannelProg(idx,progs)}})}}},recycleProgramElem:function(e){this.callParent(arguments)},createProgElem:function(){var me=this;return e=me.callParent(arguments),e.time=$('<div class="epg-prog-timeinfo"></div>'),e.time.prependTo(e.infos),e},processChannelProg:function(idx,progs){var me=this;if(!(idx<me.startChannelIdx||idx>me.endChannelIdx)){me.programElems[idx]||(me.programElems[idx]={});for(var elems=me.programElems[idx],i=0;i<me.NB_PROGS_PER_LINE;++i){var p=progs[i];if(p){var e=elems[p.id];e||(e=me.recycleProgramElems.pop(),e||(e=me.createProgElem()),elems[p.id]=e);var left=(me.elemWidth+me.PROG_SPACING)*i;e.prog!=p.id&&(e.title.text(p.title),e.subtitle.text(p.sub_title?p.sub_title:""),e.prog=p.id,e.start=p.date,e.end=p.end,e.time.text(Fbx.os.lib.FbxUtils.displayTime(p.date)+" - "+Fbx.os.lib.FbxUtils.displayTime(p.end)),p.category||(p.category=0),e.catClass="epg-prog-cat-"+me.CATEGORY_ASSOC[p.category],e.elem.addClass(e.catClass)),p.picture?e.imgVisible||(e.img.attr({src:p.picture,alt:p.title}),e.img.show(),e.imgVisible=!0,e.infos.css({"padding-left":me.PROG_IMG_WIDTH+5})):e.imgVisible&&(e.img.hide(),e.imgVisible=!1,e.infos.css({"padding-left":5})),e.elem.css({left:left,width:me.elemWidth,top:idx*me.CHANNEL_HEIGHT-me.scrollTop}),e.elem.show()}}}},getChanTimeForEvent:function(event){var me=this;if(void 0===event.offsetX||void 0===event.offsetY){var targetOffset=$(event.target).offset();event.offsetX=event.pageX-targetOffset.left,event.offsetY=event.pageY-targetOffset.top}var eX=event.offsetX,eY=event.offsetY;if(eX<me.CHANNEL_WIDTH||eY<me.HEADER_HEIGHT)return null;if(!me.elemWidth)return null;var x=eX-me.CHANNEL_WIDTH,y=me.scrollTop+eY-me.HEADER_HEIGHT;return[Math.floor(y/me.CHANNEL_HEIGHT),Math.floor(x/me.elemWidth)]},getProgForChanAtTime:function(channelIdx,idx){var me=this,t=me.curDay.getTime()/1e3;return me.programs[channelIdx]&&me.programs[channelIdx][t]&&me.programs[channelIdx][t][idx]?me.programs[channelIdx][t][idx]:null}});Ext.define("Fbx.os.app.downloader.RssFeedModel",{extend:"Fbx.ux.data.Model",requires:["Ext.data.association.HasMany","Fbx.os.app.downloader.RssFeedItemModel"],fields:[{name:"id",type:"int"},{name:"status",type:"string"},{name:"url",type:"string"},{name:"title",type:"string"},{name:"desc",type:"string"},{name:"image_url",type:"string"},{name:"nb_read",type:"int"},{name:"nb_unread",type:"int"},{name:"auto_download",type:"boolean"},{name:"fetch_ts",type:"date",convert:function(v,record){return record.raw.fetch_ts?new Date(1e3*record.raw.fetch_ts):new Date}},{name:"pub_ts",type:"date",convert:function(v,record){return record.raw.pub_ts?new Date(1e3*record.raw.pub_ts):new Date}},{name:"error",type:"string"},{name:"pretty_name",type:"string",convert:function(v,rec){var title=rec.get("title");return""==title&&(title=rec.get("desc")),""==title&&(title=rec.get("url")),title}}],associations:[{model:"Fbx.os.app.downloader.RssFeedItemModel",type:"hasMany",name:"items",foreignKey:"feed_id"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"downloads/feeds/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,revertOnFailure:!0,reader:{type:"json",root:"result",messageProperty:"msg"}},statics:{fetch:function(feed_id){var url=FbxConf.apiBaseUrl+"downloads/feeds/fetch";feed_id&&(url=FbxConf.apiBaseUrl+"downloads/feeds/"+feed_id+"/fetch"),Ext.Ajax.request({url:url,silentError:!0,method:"POST",failure:function(response){response.jsonData&&"feed_is_recent"==response.jsonData.error_code&&Ext.Msg.alert("Flux déjà à jour","Le flux RSS est déjà à jour")}})},mark_all_as_read:function(feed_id,cb){var url=FbxConf.apiBaseUrl+"downloads/feeds/"+feed_id+"/items/mark_all_as_read";feed_id&&Ext.Ajax.request({url:url,method:"POST",success:function(){cb&&cb()}})}}});Ext.define("ContactGroupRef",{extend:"Ext.data.Model",fields:[{name:"id",type:"int",convert:function(v,record){return record.phantom?0:record.raw.group_id}},{name:"group_id",type:"int"},{name:"contact_id",type:"int"}],proxy:{type:"ajax",url:"",api:{create:FbxConf.apiBaseUrl+"contact/addtogroup",read:FbxConf.apiBaseUrl+"contact/groups",destroy:FbxConf.apiBaseUrl+"contact/removefromgroup"},reader:{type:"json",root:"result",messageProperty:"msg"}}}),Ext.define("Fbx.os.app.contacts.ContactModel",{extend:"Fbx.ux.data.Model",requires:["Ext.data.association.BelongsTo","Ext.data.association.HasMany","Fbx.ux.data.proxy.RestForeign"],fields:[{name:"id",type:"int"},{name:"display_name",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"company",type:"string"},{name:"photo_url",type:"string"},{name:"birthday",type:"date"},{name:"notes",type:"string"},{name:"display_name_pretty",type:"string",convert:function(val,rec){return Fbx.os.app.contacts.app.getPrettyDisplayName(rec.get("first_name"),rec.get("last_name"),rec.get("display_name"),rec.get("company"))}},{name:"display_name_pretty_lower",type:"string",convert:function(val,rec){return rec.get("display_name_pretty").toLowerCase()}}],validations:[{type:"length",field:"display_name",max:64},{type:"length",field:"first_name",max:64},{type:"length",field:"last_name",max:64},{type:"length",field:"photo_url",max:256}],associations:[{model:"ContactGroupRef",type:"hasMany",name:"groups",foreignKey:"contact_id"},{model:"ContactNumber",type:"hasMany",name:"numbers",foreignKey:"contact_id"},{model:"ContactEmail",type:"hasMany",name:"emails",foreignKey:"contact_id"},{model:"ContactUrl",type:"hasMany",name:"urls",foreignKey:"contact_id"},{model:"ContactAddress",type:"hasMany",name:"addresses",foreignKey:"contact_id"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"contact/",reader:{type:"json",root:"result",totalProperty:"total",messageProperty:"msg"}},statics:{getContactNumber:function(callback){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"contact/count",success:function(response){response.jsonData.success&&callback(response.jsonData.result)}})}}}),Ext.define("ContactNumber",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"id",type:"int"},{name:"contact_id",type:"int"},{name:"number",type:"string"},{name:"type",type:"string"},{name:"is_default",type:"boolean",defaultValue:!1},{name:"is_own",type:"boolean",defaultValue:!1},{name:"infos",type:"auto",convert:function(v,record){return Fbx.os.lib.FbxUtils.normalizePhoneNumber(record.get("number"))}}],validations:[{type:"length",field:"number",min:1,max:64}],belongsTo:"Fbx.os.app.contacts.ContactModel",proxy:{type:"restforeign",foreignProperty:"contact_id",url:FbxConf.apiBaseUrl+"contact/{foreignId}/numbers/",useWriteUrl:!0,writeUrl:FbxConf.apiBaseUrl+"number/",reader:{type:"json",root:"result",messageProperty:"msg"}},set:function(key,val){if(this.callParent(arguments),"number"==key){if(val!=this.get("number")){var infos=Fbx.os.lib.FbxUtils.normalizePhoneNumber(val);this.set("infos",infos)}}}}),Ext.define("ContactEmail",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"id",type:"int"},{name:"contact_id",type:"int"},{name:"email",type:"string"},{name:"type",type:"string"}],validations:[{type:"email",field:"email"}],belongsTo:"Fbx.os.app.contacts.ContactModel",proxy:{type:"restforeign",foreignProperty:"contact_id",url:FbxConf.apiBaseUrl+"contact/{foreignId}/emails/",useWriteUrl:!0,writeUrl:FbxConf.apiBaseUrl+"email/",reader:{type:"json",root:"result",messageProperty:"msg"}}}),Ext.define("ContactUrl",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"id",type:"int"},{name:"contact_id",type:"int"},{name:"url",type:"string"},{name:"type",type:"string"}],belongsTo:"Fbx.os.app.contacts.ContactModel",proxy:{type:"restforeign",foreignProperty:"contact_id",url:FbxConf.apiBaseUrl+"contact/{foreignId}/urls/",useWriteUrl:!0,writeUrl:FbxConf.apiBaseUrl+"url/",reader:{type:"json",root:"result",messageProperty:"msg"}}}),Ext.define("ContactAddress",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],fields:[{name:"id",type:"int"},{name:"contact_id",type:"int"},{name:"type",type:"string"},{name:"number",type:"string"},{name:"street",type:"string"},{name:"street2",type:"string"},{name:"city",type:"string"},{name:"zipcode",type:"string"},{name:"country",type:"string"}],belongsTo:"Fbx.os.app.contacts.ContactModel",proxy:{type:"restforeign",foreignProperty:"contact_id",url:FbxConf.apiBaseUrl+"contact/{foreignId}/addresses/",useWriteUrl:!0,writeUrl:FbxConf.apiBaseUrl+"address/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.epg.EpgInfoWin",{extend:"Ext.window.Window",requires:["Ext.Component","Ext.XTemplate","Fbx.os.lib.FbxUtils","Fbx.os.app.pvr.PrecordEditor","Fbx.os.app.pvr.PrecordModel"],initComponent:function(){var me=this;me.progInfosTpl=new Ext.XTemplate('<div class="epg-win"><div class="epg-win-head <tpl if="picture">epg-win-head-fixed</tpl>"><tpl if="picture"><img class="epg-win-img" src="{picture}" alt="{title:htmlEncode}" /></tpl><div class="epg-prog-title">{title:htmlEncode}</div><tpl if="sub_title"><div class="epg-prog-subtitle">{sub_title:htmlEncode}</div></tpl><div class="epg-win-time">{time_str}</div><div style="clear: both;" ></div></div><tpl if="desc"><div class="epg-win-desc <tpl if="picture">epg-win-desc-fixed</tpl>">{desc:htmlEncode}</div></tpl></div>'),me.progInfosElem=Ext.create("Ext.Component",{html:"",listeners:{boxready:function(){if(me.infosEl=me.progInfosElem.getEl(),me.prog){var p=me.prog;me.prog=null,me.loadProg(p,me.channel)}}}}),Ext.apply(me,{closeAction:"hide",title:"",width:400,height:400,resizable:!1,minimizable:!1,maximizable:!1,layout:"fit",bbar:["->",{xtype:"button",text:"Enregister ce programme",iconCls:"btn-pvr",handler:function(){me.progRecord()}}],items:[me.progInfosElem]}),this.callParent(arguments)},loadProg:function(prog,channel){var me=this;me.prog&&me.prog.id==prog.id||(me.channel=channel,me.__partialProg=prog,me.setProg(prog,channel,!1),me.setLoading(!0),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"tv/epg/programs/"+encodeURIComponent(prog.id),success:function(response){var progInfos=response.jsonData.result;progInfos.desc&&(me.__partialProg.desc=progInfos.desc,me.setProg(prog,!0))},callback:function(){me.setLoading(!1),me.prog=prog}}))},setProg:function(prog,force){var me=this;if((!me.prog||me.prog.id!=prog.id||force)&&me.infosEl){prog.time_str="De "+Fbx.os.lib.FbxUtils.displayTime(prog.date)+" à "+Fbx.os.lib.FbxUtils.displayTime(prog.end),me.setTitle(prog.title);var html=me.progInfosTpl.apply(prog);me.infosEl.setHTML(html)}},progRecord:function(){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.pvr.PrecordEditor",{listeners:{save:function(){Ext.Msg.alert("Enregistrement programmé","Votre enregistrement a bien été programmé")}}}));var record=Fbx.os.app.pvr.PrecordModel.create({name:me.prog.title,subname:me.prog.sub_title?me.prog.sub_title:"",channel_uuid:me.channel.uuid,channel_quality:"auto",channel_type:"",start:me.prog.date,end:me.prog.end,broadcast_type:"tv",enabled:!0});me.editor.setRecord(record),me.editor.show()}});Ext.define("Fbx.os.app.settings.storage.DiskModel",{extend:"Fbx.ux.data.Model",requires:["Ext.data.association.HasMany"],fields:[{name:"id",type:"integer"},{name:"connector",type:"integer"},{name:"state",type:"string"},{name:"total_bytes",type:"integer"},{name:"type",type:"string"},{name:"table_type",type:"string"},{name:"model",type:"string"},{name:"serial",type:"string"},{name:"firmware",type:"string"},{name:"spinning",type:"boolean"},{name:"idle",type:"boolean"},{name:"idle_duration",type:"integer"},{name:"active_duration",type:"integer"},{name:"time_before_spindown",type:"integer"},{name:"temp",type:"integer"},{name:"operation_pct",type:"auto"},{name:"title",type:"string",convert:function(val,rec){return"internal"===rec.get("type")?"Ma Freebox":rec.raw.partitions&&rec.raw.partitions.length>=1?rec.raw.partitions[0].label:rec.get("disk_title")}},{name:"disk_title",type:"string",convert:function(val,rec){return"Disque "+rec.get("type")+" "+rec.get("connector")+" de "+Fbx.os.lib.FbxUtils.fileSize(rec.get("total_bytes"))}},{name:"state_str",type:"string",convert:function(val,rec){return{error:"Erreur",disabled:"Inactif",enabled:"Actif",formatting:"Formatage en cours"}[rec.get("state")]}},{name:"table_type_str",type:"string",convert:function(val,rec){return{msdos:"MBR",gpt:"GUID",superfloppy:"SuperFloppy",empty:"Vide",raid:"RAID"}[rec.get("table_type")]}},{name:"type_str",type:"string",convert:function(val,rec){return{usb:"USB",sata:"SATA",raid:"RAID"}[rec.get("type")]}},{name:"connector_str",type:"string",convert:function(val,rec){return{usb_0:"USB 1 (dessus)",usb_1:"USB 2 (dessous)",sata_0:"SATA 0",sata_1:"SATA 1",sata_2:"SATA 2",sata_3:"SATA 3"}[rec.get("type")+"_"+rec.get("connector")]}},{name:"spin_str",type:"string",convert:function(val,rec){if("internal"!==rec.get("type"))return"";var ret=rec.get("idle")?"Inactif":"Actif";return ret=ret+" / "+(rec.get("spinning")?"Disque en rotation":"Disque arrêté")}},{name:"icon_type",type:"string",convert:function(val,rec){return"usb"===rec.get("type")?"usb":"internal"}},{name:"cant_use_reason",type:"string",defaultValue:!1,convert:function(val,rec){return rec.cantUseForRaidReason()}}],associations:[{model:"Fbx.os.app.settings.storage.PartitionModel",type:"hasMany",name:"partitions",foreignKey:"disk_id"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"storage/disk/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}},defaultCallback:function(records,operation,success){},mount:function(callback){var me=this;callback||(callback=me.defaultCallback),"enabled"!==me.get("state")&&(me.set("state","enabled"),me.save({callback:callback}))},umount:function(callback){var me=this;callback||(callback=me.defaultCallback),"disabled"!==me.get("state")&&(me.set("state","disabled"),me.save({callback:callback}))},cantUseForRaidReason:function(){var me=this;if("sata"!==me.get("type"))return"Les disques USB ne sont pas pris en charge";if("raid"===me.get("table_type"))return"Disque déjà membre d'un array RAID";var state=me.get("state");return"disabled"!==state&&"error"!==state?"Disque occupé: "+me.get("state_str"):""},canUseForRaid:function(){return""===this.cantUseForRaidReason()}});Ext.define("Fbx.os.app.settings.VpnServerOpenVPNUserGrid",{extend:"Fbx.ux.grid.CtxMenuGrid",requires:["Fbx.os.app.settings.VpnServerUserModel","Fbx.os.app.settings.VpnServerUserEditor","Ext.grid.column.Action","Ext.grid.column.Boolean","Ext.data.Store","Ext.menu.Menu"],initComponent:function(){var me=this;me.store=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.VpnServerUserModel",remoteSort:!1,remoteFilter:!1,pageSize:0,autoload:!0}),Ext.applyIf(me,{store:me.store,bodyPadding:0,columns:[{text:"Utilisateur",dataIndex:"login",hideable:!1,flex:2},{xtype:"actioncolumn",hideable:!1,text:"Télécharger la configuration",flex:1,align:"center",items:[{iconCls:"btn-disk",tooltip:"Télécharger la configuration",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);me.downloadUserConf(rec)}}]}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun utilisateur</div>'},listeners:{celldblclick:function(cell,td,cellIndex,record,tr,rowIndex,e,eOpts){me.downloadUserConf(record)}}}),me.callParent(arguments)},downloadUserConf:function(rec){var me=this,vpnStore=Ext.getStore("vpnServerStore");if(vpnStore){var vpn=vpnStore.getById(me.vpnid);if(!vpn||"started"!=vpn.get("state"))return void Ext.Msg.alert("Configuration indisponible","La configuration ne peut pas être téléchargée tant que le serveur n'est pas démarré");var url=FbxConf.apiBaseUrl+"vpn/download_config/"+me.vpnid+"/"+rec.get("login")+"/";window.open(url,"_blank")}},getCtxMenu:function(){var me=this;return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-disk",text:"Télécharger la configuration",handler:function(){var records=me.getSelectedRecord(),rec=records[0];me.downloadUserConf(rec)}}],listeners:{beforeshow:function(){return me.getSelectedRecord().length>0}}})),me.ctxMenu}});Ext.define("Fbx.ux.form.field.SizeDisplay",{extend:"Fbx.ux.form.field.TemplatedDisplay",alias:"widget.sizedisplayfield",tpl:"{[Fbx.os.lib.FbxUtils.fileSize(values.val)]}"});Ext.define("Fbx.os.gui.panel.Toggles",{extend:"Ext.container.Container",requires:["Fbx.Ajax","Ext.data.Store","Ext.data.Request","Ext.button.Button"],statics:{toggles:{wifi:{url:"wifi/config/",property:"enabled",tooltip:"Wi-Fi personnel",name:"votre wifi personnel",isEnabled:!0},pub:{url:"connection/config/",property:"adblock",tooltip:"Blocage de publicités (Bêta)",name:"le blocage de publicités",isEnabled:!0}}},updateBtn:function(type,enabled,values){var me=this,btn=me.buttons[type];if(btn){var mode=enabled?"on":"off";"pub"==type&&values.adblock_not_set&&(mode="unset",btn.unset=!0);var cls="btn-32-"+type+"-toggle-"+mode;btn.setIconCls(cls)}},parseResult:function(response,req){var me=this,infos=Fbx.os.gui.panel.Toggles.toggles[req.type],res=response.jsonData.result,values={};Fbx.os.lib.FbxUtils.stringify(res,"",values);var enabled=values[infos.property];infos.isEnabled=enabled,me.updateBtn(req.type,enabled,values)},loadBtn:function(){var me=this;for(var type in Fbx.os.gui.panel.Toggles.toggles){var infos=Fbx.os.gui.panel.Toggles.toggles[type];Ext.Ajax.request({url:FbxConf.apiBaseUrl+infos.url,method:"GET",silentError:!0,type:type,success:function(a,b){me.parseResult(a,b)}})}},constructor:function(config){var me=this;me.buttons=[];var items=[];for(var type in Fbx.os.gui.panel.Toggles.toggles){var infos=Fbx.os.gui.panel.Toggles.toggles[type],btn=Ext.create("Ext.button.Button",{tooltip:infos.tooltip,tooltipType:"title",pressedCls:"",width:40,height:40,margin:2,scale:"large",border:"0",style:{background:"none"},iconCls:"btn-32-"+type+"-toggle-off",xtoggleType:type,handler:function(btn){var infos=Fbx.os.gui.panel.Toggles.toggles[btn.xtoggleType],action=infos.isEnabled?"désactiver":"activer",msg="Êtes-vous sûr de vouloir "+action+" "+infos.name+" ?";btn.unset&&(msg="Voulez vous activer "+infos.name+" ?"),Ext.MessageBox.confirm("Confirmation",msg,function(confirm){if("yes"==confirm||btn.unset){btn.unset&&(infos.isEnabled="yes"!=confirm);var jsonData={};"pub"==btn.xtoggleType&&(jsonData.adblock_not_set=!1,btn.unset=void 0),Fbx.os.lib.FbxUtils.objectify(infos.property,!infos.isEnabled,jsonData),Ext.Ajax.request({url:FbxConf.apiBaseUrl+infos.url,method:"PUT",jsonData:jsonData,type:btn.xtoggleType,success:function(a,b){me.parseResult(a,b)}})}})}});me.buttons[type]=btn,Ext.Array.push(items,btn)}config=Ext.apply(config,{layout:{type:"vbox",align:"center"},width:80,items:items,listeners:{boxready:function(){me.loadBtn(),Fbx.os.gui.Environment.on("toogleneedrefresh",function(){me.loadBtn()})}}}),config.vertical||(config.layout.type="hbox"),this.callParent([config])}});Ext.define("Fbx.os.app.explorer.FsTask",{requires:["Fbx.os.app.explorer.FsTaskModel","Fbx.os.lib.FbxUtils","Fbx.os.app.explorer.ShareLinkModel","Ext.data.Store","Ext.window.Window","Ext.data.ArrayStore","Fbx.ux.form.field.File"],uses:["Fbx.ux.form.field.PathPicker"],singleton:!0,fsTaskWin:null,constructor:function(config){var me=this;this.callParent(arguments),this.taskStore=Ext.create("Ext.data.Store",{autoLoad:!1,model:"Fbx.os.app.explorer.FsTaskModel",sorters:[{property:"created_ts",direction:"DESC"}],remoteSort:!1,remoteFilter:!1,listeners:{load:function(store,records,successful){if(!successful)return void(me.needRefresh=!1);me.needRefresh=!1,Ext.Array.each(records,function(rec){var id=rec.getId(),callbacks=me.fsCallbacks[id];if(!callbacks){return void("running"==rec.get("state")&&(me.needRefresh=!0))}switch(rec.get("state")){case"done":Ext.Array.each(callbacks,function(c){c&&c(!0,rec)}),delete me.fsCallbacks[id];break;case"failed":Ext.Array.each(callbacks,function(c){c&&c(!1,rec)}),delete me.fsCallbacks[id];break;default:me.needRefresh=!0}}),me.needRefresh&&!me.refreshInterval&&(me.refreshInterval=setInterval(function(){me.refreshFn()},1e3))}}})},needRefresh:!1,fsCallbacks:[],refreshInterval:null,refreshFn:function(){var me=this;if(!me.needRefresh)return clearInterval(me.refreshInterval),void(me.refreshInterval=null);me.taskStore.isLoading()||me.taskStore.load({autorefresh:!0})},fileSelection:[],filePathSelected:{},fileSelectionOp:"",isFileSelected:function(rec){return this.filePathSelected[rec.get("path")]},clearFileSelection:function(){var me=this;me.hasFileSelection()&&(me.fileSelectionOp="",Ext.Array.each(me.fileSelection,function(r){r.set({copied:!1,cutted:!1}),r.dirty=!1}),me.fileSelection=[])},setFileSelection:function(records){var me=this;me.filePathSelected={},Ext.Array.each(records,function(r){me.filePathSelected[r.get("path")]=!0}),me.fileSelection=records},filesCut:function(selection){var me=this;me.clearFileSelection(),me.fileSelectionOp="cut",me.setFileSelection(selection),Ext.Array.each(selection,function(r){r.set({copied:!0,cutted:!1}),r.dirty=!1})},filesCopy:function(selection){var me=this;me.clearFileSelection(),me.fileSelectionOp="copy",me.setFileSelection(selection),Ext.Array.each(selection,function(r){r.set({copied:!1,cutted:!0}),r.dirty=!1})},isValidPaste:function(destDir){var me=this;return!!me.hasFileSelection()&&Fbx.os.app.explorer.FsTask.isValidDrop(me.fileSelection,destDir,!0)},filesPaste:function(destDir){var me=this;if(me.hasFileSelection()){if(me.files=[],me.destDir=destDir,!Fbx.os.app.explorer.FsTask.isValidDrop(me.fileSelection,me.destDir,!0))return void Ext.Msg.alert("Erreur","Impossible de "+("cut"==me.fileSelectionOp?"déplacer":"copier")+" les fichiers dans ce dossier");Ext.Array.each(me.fileSelection,function(rec){var curPath=rec.get("path");Ext.Array.push(me.files,curPath)}),Ext.Msg.show({title:"Résolution de conflit",msg:"En cas de conflit:",buttons:Ext.Msg.YESNOOK,buttonText:{ok:"Écraser",yes:"Garder les deux",no:"Garder le plus récent"},icon:Ext.Msg.QUESTION,fn:function(buttonId){var mode="cancel";switch(buttonId){case"ok":mode="overwrite";break;case"yes":mode="both";break;case"no":mode="recent"}"cancel"!=mode&&("cut"==me.fileSelectionOp?me.moveFiles(me.files,me.destDir,mode,!1):"copy"==me.fileSelectionOp&&me.copyFiles(me.files,me.destDir,mode),me.clearFileSelection())}})}},hasFileSelection:function(){var me=this;return me.fileSelection&&me.fileSelection.length},doFsOp:function(url,jsonData,callback,errmsg,notifFn,optarg){var me=this;Ext.Ajax.request({url:url,method:"POST",jsonData:jsonData,success:function(response){var rep=Ext.decode(response.responseText);rep.success?rep.result&&rep.result.id?(me.fsCallbacks[rep.result.id]=[callback,function(success,rec){if(success)me.taskStore.remove(rec),me.taskStore.sync(),notifFn(jsonData.files,jsonData.dst,optarg);else{var jsonmsg=rec?rec.get("error"):"";jsonmsg=Fbx.os.app.explorer.FsTaskModel.taskErrorStr[jsonmsg],jsonmsg||(jsonmsg="Erreur inconnue"),Ext.defer(function(){Ext.Msg.alert("Erreur",errmsg+" : "+jsonmsg)},100)}}],me.needRefresh=!0,me.refreshInterval||(me.refreshInterval=setInterval(function(){me.refreshFn()},1e3))):(callback&&callback(!0),notifFn(jsonData.files,jsonData.dst,optarg)):(callback&&callback(!1),Ext.defer(function(){Ext.Msg.alert("Erreur",errmsg+" : "+rep.msg)}))},failure:function(response){callback&&callback(!1),Ext.Msg.alert("Erreur",errmsg)}})},moveFiles:function(files,destDir,conflictMode,isDirRename,callback){this.doFsOp(FbxConf.apiBaseUrl+"fs/mv/",{files:files,dst:destDir,mode:conflictMode},callback,"Erreur lors du déplacement des fichiers",Fbx.os.gui.Environment.notifyFileMove,isDirRename)},copyFiles:function(files,destDir,conflictMode,callback){this.doFsOp(FbxConf.apiBaseUrl+"fs/cp/",{files:files,dst:destDir,mode:conflictMode},callback,"Erreur lors de la copie des fichiers",Fbx.os.gui.Environment.notifyFileCopy)},removeFiles:function(files,callback){this.doFsOp(FbxConf.apiBaseUrl+"fs/rm/",{files:files},callback,"Erreur lors de la suppression des fichiers",Fbx.os.gui.Environment.notifyFileDelete)},extractFile:function(file,destDir,password,removeArchive,overwrite,callback){this.doFsOp(FbxConf.apiBaseUrl+"fs/extract/",{src:file,dst:destDir,password:password,delete_archive:!0===removeArchive,overwrite:!0===overwrite},callback,"Erreur lors de l'extraction des fichiers",function(){var name=Fbx.os.lib.FbxUtils.basename(file);Fbx.os.gui.Environment.notifyFileCopy([name],destDir)})},archiveFiles:function(files,dst,callback){this.doFsOp(FbxConf.apiBaseUrl+"fs/archive/",{files:files,dst:dst},callback,"Erreur lors de la compression des fichiers",function(){var name=Fbx.os.lib.FbxUtils.basename(dst),folder=Fbx.os.lib.FbxUtils.dirname(dst);Fbx.os.gui.Environment.notifyFileCopy([name],folder)})},repairFile:function(file,deleteArchive,callback){this.doFsOp(FbxConf.apiBaseUrl+"fs/repair/",{src:file,delete_archive:deleteArchive},callback,"Erreur lors de la réparation des fichiers",function(){var name=Fbx.os.lib.FbxUtils.basename(file);Fbx.os.gui.Environment.notifyFileDelete([name])})},promptMkdir:function(curPath){Ext.Msg.prompt("Nouveau Dossier","Nom du nouveau dossier:",function(btn,text){"ok"==btn&&("."!=text&&".."!=text&&text.match(/^[^\/]+$/)?Fbx.os.app.explorer.FsTask.mkdir(curPath,text):Ext.Msg.alert("Erreur","Nom de dossier incorrect"))})},handleUpload:function(destDir){var me=this;me.uploadForm?me.uploadForm.down("form").getForm().setValues({dirname:destDir}):me.uploadForm=Ext.create("Ext.window.Window",{closeAction:"hide",modal:!0,width:450,layout:"fit",items:[{xtype:"form",bodyPadding:5,url:FbxConf.uploadBaseUrl,defaults:{labelWidth:50},items:[{xtype:"ux_filefield",fieldLabel:"Fichier",emptyText:"Sélectionnez un fichier",name:"file",anchor:"100%",allowBlank:!1},Ext.create("Fbx.ux.form.field.PathPicker",{xtype:"pathpicker",fieldLabel:"Chemin",value:destDir,name:"dirname"}),{xtype:"hidden",name:"MAX_FILE_SIZE",value:4194304e3},{xtype:"hidden",name:"csrf_token",value:FbxConf.csrfToken}],buttons:[{text:"Envoyer",iconCls:"btn-accept",handler:function(){var form=this.up("form").getForm(),vals=form.getValues(),fileField=form.findField("file"),filename=Fbx.os.lib.FbxUtils.basename(fileField.value);form.isValid()&&(me.uploadForm.hide(),form.doAction("fbxsubmit",{success:function(form,action){var upload_id=action.response.jsonData.result.id;form.url=FbxConf.uploadBaseUrl+upload_id+"/send",form.submit({success:function(form,action){Fbx.os.gui.Environment.notifyFileCopy([filename],vals.dirname)}})},failure:function(form,action){Ext.Msg.alert("Erreur",action.response.jsonData.msg)}}))}}]}]}),me.uploadForm.show()},handleShare:function(path){var me=this;if(me.shareWin){var form=me.shareWin.down("form").getForm();form.reset(),form.setValues({path:path,pathdisplay:Fbx.os.lib.FbxUtils.base64_decode(path)})}else me.shareWin=Ext.create("Ext.window.Window",{closeAction:"hide",modal:!0,layout:"fit",width:450,title:"Créer un lien de partage",items:[{xtype:"form",bodyPadding:5,defaults:{anchor:"100%",labelWidth:150},items:[{xtype:"displayfield",fieldLabel:"Chemin",name:"pathdisplay",value:Fbx.os.lib.FbxUtils.base64_decode(path)},{xtype:"hidden",name:"path",value:path},{xtype:"combobox",name:"duration",fieldLabel:"Expiration du lien",displayField:"label",valueField:"value",allowBlank:!1,forceSelection:!0,editable:!1,queryMode:"local",value:86400,store:Ext.create("Ext.data.ArrayStore",{fields:["value","label"],data:[[3600,"après 1 heure"],[21600,"après 6 heures"],[43200,"après 12 heures"],[86400,"après 1 jour"],[604800,"après 7 jours"],[1296e3,"après 15 jours"],[2592e3,"après 1 mois"],[0,"Jamais"]]})}],buttons:[{iconCls:"btn-accept",text:"OK",handler:function(){var form=this.up("form").getForm(),vals=form.getValues();if(vals.duration>0){var now=new Date;vals.duration+=Math.round(now.getTime()/1e3)}form.isValid()&&me.createShareLink(vals.path,vals.duration,0,function(record){me.shareWin.hide();var url=record.get("fullurl"),expireDate=record.get("expiredate"),limit=0==record.get("expire")?"Ce lien n'a pas de date d'expiration":"Ce lien est valable jusqu'au "+Fbx.os.lib.FbxUtils.getParisMoment(expireDate).format("DD/MM/YYYY à HH:mm:ss");url&&""!=url?Ext.Msg.alert("Lien de partage crée",'<div style="padding: 5px;">Vous pouvez partager ce contenu en utilisant le lien suivant :</div><div style="padding: 5px;">  <a href="'+Ext.String.htmlEncode(url)+'" target="_blank">'+Ext.String.htmlEncode(url)+'</a> &nbsp;  <a href="'+record.get("mailto")+'" target="_blank"><img class="btn-email" style="vertical-align: middle;" src="data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt="email"/></a></div><div style="padding: 5px;">'+limit+"</div>"):Ext.Msg.alert("Lien de partage crée","Le lien de partage a bien été crée mais l'accès a distance n'est pas activé sur votre Freebox !")})}}]}]});me.shareWin.show()},createShareLink:function(path,expire,internal,callback){var shareLink=Fbx.os.app.explorer.ShareLinkModel.create({path:path,expire:expire,internal:internal?1:0});shareLink.save({callback:function(record,operation){operation.wasSuccessful()&&callback(shareLink)}})},mkdir:function(parent,dirname){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"fs/mkdir/",jsonData:{parent:parent,dirname:dirname},success:function(){Fbx.os.gui.Environment.notifyFileCopy([dirname],parent)}})},mkpath:function(parent,subdir,success_cb,failure_cb){var path=Fbx.os.lib.FbxUtils.base64_decode(parent)+subdir;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"fs/mkpath/",jsonData:{path:path},success:function(result){var created_path=result.jsonData.result;Fbx.os.gui.Environment.notifyFileCopy([subdir],parent),success_cb(created_path)},failure:failure_cb})},renameFile:function(src,newName,isDirRename,callback){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"fs/rename/",jsonData:{src:src,dst:newName},success:function(response){var newPath=response.jsonData.result;Fbx.os.gui.Environment.notifyFileMove([src],newPath,isDirRename),callback(!0)},failure:function(){callback(!1)}})},isValidDrop:function(sourceRecords,targetPath,allowDuplicate){var isValid=!0;return"/"!=targetPath.charAt(targetPath.length-1)&&(targetPath+="/"),Ext.Array.each(sourceRecords,function(rec){var curPath=rec.get("path")+"/";return targetPath.indexOf(curPath)>=0||!allowDuplicate&&targetPath+rec.get("name")==rec.get("path")?(isValid=!1,!1):curPath.match(/^\/[^\/]*\/?$/)?(isValid=!1,!1):void 0}),isValid},supportedArchives:{"application/x-xz-compressed-tar":!0,"application/x-rar":!0,"application/vnd.rar":!0,"application/x-tar":!0,"application/zip":!0,"application/x-iso9660-image":!0,"application/x-bzip-compressed-tar":!0,"application/x-compressed-tar":!0,"application/x-cd-image":!0,"application/vnd.ms-cab-compressed":!0,"application/x-7z-compressed":!0,"application/x-cpio":!0},canExtract:function(mimetype){return this.supportedArchives[mimetype]}});Ext.define("Fbx.os.app.contacts.Settings",{extend:"Ext.window.Window",requires:["Ext.data.ArrayStore","Fbx.os.app.contacts.ContactModel","Ext.grid.column.Template","Ext.data.Store","Ext.grid.Panel","Ext.grid.plugin.CellEditing","Fbx.os.app.contacts.ContactGroup"],height:290,width:450,resizable:!1,layout:{type:"fit"},title:"Paramètres",modal:!0,initComponent:function(){var me=this;me.store=Ext.create("Ext.data.Store",{model:"Fbx.os.app.contacts.ContactGroup",autoLoad:!0,filters:[{property:"id",filterFn:function(r){return 0!=r.getId()}}]}),me.grid=Ext.create("Ext.grid.Panel",{title:"Groupes",store:me.store,forceFit:!0,autoScroll:!0,layout:"fit",height:160,columns:[{dataIndex:"name",flex:3,editor:"textfield",text:"Nom"},{dataIndex:"nb_contact",flex:1,text:"Contacts"},{xtype:"actioncolumn",maxWidth:28,items:[{altText:"supprimer",iconCls:"btn-delete",handler:function(grid,rowIndex,colIndex){var store=grid.getStore(),rec=store.getAt(rowIndex);return rec.fakeGroup?void Ext.MessageBox.alert("Impossible","Impossible de supprimer ce groupe"):rec.phantom?void store.remove(rec):void Ext.MessageBox.confirm("Suppression","Êtes-vous sûr de vouloir supprimer le groupe "+Ext.util.Format.htmlEncode(rec.get("name"))+" ?",function(btn){"yes"==btn&&rec.destroy({success:function(r,operation){store.remove(rec)},failure:function(r,operation){Ext.MessageBox.show({title:"Erreur",msg:operation.getError(),buttons:Ext.MessageBox.OK,icon:Ext.MessageBox.ERROR})}})})}}]}],buttons:[{text:"Ajouter un groupe",iconCls:"btn-group-add",handler:function(){var store=me.grid.getStore();Ext.MessageBox.prompt("Nouveau groupe","Nom du groupe",function(btn,text){"ok"==btn&&(store.add({name:text}),store.sync({failure:function(){store.load()}}))})}}],plugins:[Ext.create("Ext.grid.plugin.CellEditing",{clicksToEdit:1,listeners:{beforeedit:function(editor,infos){var record=infos.record;return!!record&&!record.fakeGroup}}})],listeners:{afterrender:function(){this.doLayout()}}}),Ext.applyIf(me,{items:[{xtype:"form",bodyPadding:10,items:[{xtype:"combobox",name:"displayType",fieldLabel:"Nom d'affichage",displayField:"name",valueField:"type",labelWidth:150,store:Ext.create("Ext.data.ArrayStore",{autoDestroy:!0,idIndex:0,fields:["type","name"],data:[["last_first","Nom Prénom"],["first_last","Prénom Nom"]]}),anchor:"100%"},me.grid],dockedItems:[{xtype:"toolbar",dock:"bottom",layout:{pack:"end",type:"hbox"},items:[{xtype:"button",text:"Annuler",iconCls:"btn-cancel",handler:function(){me.grid.getStore().each(function(record){record.reject()}),me.close()}},{xtype:"button",text:"Enregistrer",iconCls:"btn-save",handler:function(){me.grid.getStore().sync();var form=me.down("form").getForm(),values=form.getValues(),settings=me.app.getSettings();settings.orderBy=values.orderBy,settings.displayType=values.displayType,me.app.setSettings(settings),me.app.saveSettings(),me.app.applySettings(settings),me.close()}}]}]}]}),me.callParent(arguments)},show:function(){var me=this,form=me.down("form").getForm(),settings=me.app.getSettings();form.setValues(settings),this.callParent()}});Ext.define("Fbx.ux.grid.RefreshGrid",{extend:"Fbx.ux.grid.CtxMenuGrid",alias:"widget.refreshgrid",mixins:{refreshmixin:"Fbx.ux.mixin.RefreshMixin"},requires:["Ext.grid.plugin.BufferedRenderer","Fbx.ux.grid.plugin.DragSelector"],selectedRecords:[],disableBufferring:!1,viewConfig:{loadMask:!1},initComponent:function(config){var me=this;me.plugins||(me.plugins=[]),me.dragSel=Ext.create("Fbx.ux.grid.plugin.DragSelector",{}),Ext.Array.push(me.plugins,me.dragSel),me.disableBufferring||(me.hasBufferingPlugin=!0,Ext.Array.push(me.plugins,{ptype:"bufferedrenderer",pluginId:"bufferedrenderer"})),config=Ext.apply(me,config),this.callParent([config]),this.mixins.refreshmixin.constructor.call(this),this.mon(this,"beforeitemclick",function(){me.rememberSelection()}),this.mon(this,"reconfigure",function(){me.addStoreEvent(),me.fireEvent("refresh",me)}),this.mon(me.dragSel,"dragselectorend",function(){me.rememberSelection()})}});Ext.define("Fbx.os.gui.grid.column.TransferSpeedColumn",{extend:"Ext.grid.column.Template",alias:"widget.transferspeedcolumn",requires:["Ext.util.Format","Fbx.os.lib.FbxUtils"],sortType:"asFloat",useBits:!1,scale:1,constructor:function(cfg){var me=this;me.callParent(arguments),me.renderer=function(value,p,record){var data=Ext.apply({},record.data,record.getAssociatedData());return void 0===data.fsize&&(data.fsize=record.get(me.dataIndex)),me.useBits?data.fsizeStr=Fbx.os.lib.FbxUtils.rateBits(me.scale*data.fsize):data.fsizeStr=Fbx.os.lib.FbxUtils.rate(me.scale*data.fsize),me.tpl.apply(data)}},tpl:'<tpl if="values.fsize &gt; 1024">{fsizeStr}</tpl>'});Ext.define("Fbx.ux.form.field.SpeedDisplay",{extend:"Fbx.ux.form.field.TemplatedDisplay",alias:"widget.speeddisplayfield",tpl:"{[Fbx.os.lib.FbxUtils.fileSize(values.val)]}/s"});Ext.define("Fbx.os.app.settings.storage.RaidModel",{extend:"Fbx.ux.data.Model",fields:[{name:"id",type:"integer"},{name:"state",type:"string"},{name:"name",type:"string"},{name:"level",type:"string"},{name:"uuid",type:"string"},{name:"sync_action",type:"string"},{name:"sysfs_state",type:"string"},{name:"array_size",type:"integer"},{name:"raid_disks",type:"int"},{name:"sync_speed",type:"integer"},{name:"sync_completed_pos",type:"integer"},{name:"sync_completed_end",type:"integer"},{name:"sync_completed_percent",type:"integer"},{name:"check_interval",type:"integer"},{name:"last_check",type:"integer"},{name:"next_check",type:"integer"},{name:"degraded",type:"bool"},{name:"members",type:"auto"},{name:"display_cls",type:"string",convert:function(val,rec){var degraded=rec.get("degraded"),state=rec.get("state");return degraded||"error"===state?"storage-raid-degraded":"running"===state?"storage-raid-good":""}},{name:"icon_type",type:"string",convert:function(val,rec){var degraded=rec.get("degraded"),state=rec.get("state");return degraded||"error"===state?"nok":"running"===state?"ok":"idle"}},{name:"state_str",type:"string",convert:function(val,rec){var degraded=rec.get("degraded"),stateStr={error:"Erreur",stopped:"Arrêté",running:"Actif"},state=stateStr[rec.get("state")];return degraded&&(state+=" (Dégradé)"),state}},{name:"sync_str",type:"string",convert:function(val,rec){var syncActionStr={idle:"Synchronisé",resync:"Synchronisation",recover:"Récupération",check:"Vérification",repair:"Réparation",reshape:"Redimensionnement"},sync_action=rec.get("sync_action"),pct=rec.get("sync_completed_percent"),pctStr="";return"idle"!==sync_action&&100!==pct&&(pctStr=" ("+pct+" %)"),syncActionStr[sync_action]+pctStr}},{name:"level_str",type:"string",convert:function(val,rec){return{basic:"Basic",raid0:"RAID 0",raid1:"RAID 1",raid5:"RAID 5",raid6:"RAID 6",raid10:"RAID 10"}[rec.get("level")]}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"storage/raid/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}},stop:function(cb){var me=this;"running"===me.get("state")&&(me.set("state","stopped"),me.save({callback:function(records,operation,success){cb&&cb(me,success)}}))},start:function(cb){var me=this;"running"!==me.get("state")&&(me.set("state","running"),me.save({callback:function(records,operation,success){cb&&cb(me,success)}}))}});Ext.define("Fbx.os.app.contacts.ContactList",{extend:"Ext.grid.Panel",alias:"widget.contactList",requires:["Fbx.os.lib.FbxUtils","Fbx.ux.form.FilterField","Ext.data.Store","Fbx.os.app.contacts.ContactModel","Ext.form.field.ComboBox"],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun contact</div>'},preventHeader:!0,enableColumnHide:!1,enableColumnMove:!1,enableColumnResize:!1,hideHeaders:!0,loadMask:!0,applyNameFilter:function(){var me=this,nameFilter=this.down("filterfield"),value=nameFilter.getValue();me.store.remoteFilter=!1,""==value?me.store.clearFilter():(value=value.toLowerCase(),me.store.filterBy(function(record){return-1!==record.get("display_name").toLowerCase().indexOf(value)||(-1!==record.get("first_name").toLowerCase().indexOf(value)||(-1!==record.get("last_name").toLowerCase().indexOf(value)||-1!==record.get("company").toLowerCase().indexOf(value)))})),me.store.remoteFilter=!0},initComponent:function(){var me=this;Ext.applyIf(me,{columns:[{xtype:"templatecolumn",width:52,margin:0,padding:0,align:"middle",tpl:'<tpl if="photo_url != \'\'"><img class="contacts-list-img" src="{[Ext.util.Format.htmlEncode(values.photo_url)]}"/></tpl><tpl if="photo_url == \'\'">  <div class="contacts-anonymous-small" /></tpl>'},{xtype:"templatecolumn",flex:1,dataIndex:"display_name",tpl:'<div class="contact"><div class="contact-name">{display_name_pretty:htmlEncode}</div><div class="contact-number"><tpl if="numbers[0]">&bull; {[Ext.util.Format.htmlEncode(values.numbers[0].infos.displayNumber)]}</tpl></div><div class="contact-email"><tpl if="emails[0]">&bull; {[Ext.util.Format.htmlEncode(values.emails[0].email)]}</tpl></div></div>'}]}),this.mon(me.store,"load",function(){me.applyNameFilter()});var groupStore=Ext.data.StoreManager.lookup("contactGroupStore");this.groupList=Ext.create("Ext.form.field.ComboBox",{dock:"top",weight:2,margin:0,store:groupStore,displayField:"name",valueField:"id",typeAhead:!1,queryMode:"local",autoSelect:!0,forceSelection:!0,listConfig:{getInnerTpl:function(){return"{name}"}},listeners:{change:function(field,group_id){if(Ext.isNumber(group_id)){var store=me.store;0==group_id?store.clearFilter():store.filter("group_id",group_id)}}}}),this.dockedItems=[this.groupList,{dock:"top",margin:0,weight:1,xtype:"filterfield",emptyText:"Rechercher un contact",checkChangeBuffer:500,listeners:{change:{fn:function(field,value){me.applyNameFilter()}}}}],this.bbar=[{xtype:"button",text:"Ajouter un contact",iconCls:"btn-add",handler:function(btn){var contactList=this.up("contactList"),editor=contactList.up("container").down("contactEditor"),centerPanel=editor.up("panel");if(!editor)return void Ext.log({msg:"unable to get contact editor",level:"warn"});editor.performWhenSaved(function(){var store=me.store,group_id=me.groupList.getValue(),records=store.add({}),record=records[0];record.groups().add({group_id:group_id}),centerPanel.getLayout().setActiveItem(1),centerPanel.show(),me.getSelectionModel().select(record,!1,!0),editor.loadRecord(record)})}}],this.callParent()}});Ext.define("Fbx.os.app.settings.storage.Config",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Ext.form.FieldSet","Ext.form.field.Checkbox","Ext.form.field.ComboBox","Ext.layout.component.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Fbx.os.lib.FbxUtils"],initComponent:function(){var me=this;Fbx.os.gui.Environment.getNetworkConf(function(conf){me.netConf=conf}),Ext.applyIf(me,{url:FbxConf.apiBaseUrl+"storage/config/",layout:{align:"stretch",type:"vbox"},bodyPadding:10,items:[{xtype:"fieldset",title:"Gestion de l'alimentation SATA externe",defaults:{anchor:"100%",labelWidth:300,boxLabel:""},items:[{xtype:"checkboxfield",fieldLabel:"Activer la mise en veille des périphériques SATA",name:"external_pm_enabled",ttip:"Cette fonctionnalité permet de mettre en veille un disque dur externe relié en SATA à la Freebox",listeners:{change:function(field,newVal){me.down("#idleTimeout").setDisabled(!newVal)}}},{xtype:"numberfield",fieldLabel:"Durée d'inactivité avant la mise en veille (min)",name:"external_pm_idle_before_spindown",itemId:"idleTimeout",minValue:0,maxValue:60,step:5,ttip:"Votre disque dur externe passera en veille après la période d'inactivité que vous aurez choisie"}]}]}),me.callParent(arguments),me.load(),me.on("loaded",function(form,values){me.down("#idleTimeout").setDisabled(!values.external_pm_enabled)}),me.mon(me,"show",function(){me.load()})}});Ext.define("Fbx.os.app.settings.SwitchConfig",{extend:"Fbx.ux.form.AjaxFormPanel",alias:"widget.switchconfig",requires:["Ext.form.FieldSet","Ext.form.field.Checkbox","Ext.form.field.ComboBox","Ext.layout.component.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Fbx.os.lib.FbxUtils","Ext.form.Label","Ext.data.ArrayStore"],initComponent:function(){var me=this;Ext.applyIf(me,{url:FbxConf.apiBaseUrl+"switch/port/1",disableLoadMask:!0,layout:{align:"stretch",type:"vbox"},items:[{xtype:"label",html:'<div style="padding: 10px 0;">Vous pouvez modifier ici les paramètres d\'autonégotiation des ports ethernet du Freebox Server.<br />Les paramètes automatiques devraient suffir pour toutes les configurations.<br />Ne modifiez les paramètres ici que si certains de vos équipements rencontrent des problèmes pour se connecter au Freebox Server.<br />ATTENTION: Ces paramètres ne sont pas sauvegardés.<div>'},{xtype:"displayfield",fieldLabel:"Port",name:"name"},{xtype:"combo",fieldLabel:"Vitesse",name:"speed",ttip:"Si l'auto négociation échoue vous pouvez forcer ici la vitesse du port du switch",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["auto","Automatique"],["10","10 Mbit/s"],["100","100 Mbit/s"],["1000","1 Gbit/s"],["10000","10 Gbit/s"]]}),forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0},{xtype:"combo",fieldLabel:"Duplex",name:"duplex",ttip:"Si l'auto négociation échoue vous pouvez forcer ici le mode de communication du port du switch",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["auto","Automatique"],["full","Full-Duplex"],["half","Half-Duplex"]]}),forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0},{xtype:"image",style:{width:"640px",display:"block",margin:"0 auto"},src:me.getBackImgUrl()}]}),me.callParent(arguments),me.load(),me.mon(me,"show",function(){me.load()})},getBackImgUrl:function(){var box_model=Fbx.os.gui.Environment.boxModelInfo.name,imgs={"fbxgw-r1/full":"v6","fbxgw-r2/full":"v6","fbxgw-r1/mini":"mini4k","fbxgw-r2/mini":"mini4k","fbxgw-r1/one":"onebox","fbxgw-r2/one":"onebox","fbxgw7-r1/full":"v7"},i=imgs[box_model];return i||(i="v7"),"resources/images/fbx/gw_back_"+i+".png"},refresh:function(portId){var me=this;me.portId!==portId&&(me.portId=portId,me.url=FbxConf.apiBaseUrl+"switch/port/"+portId,me.load())}});Ext.define("Fbx.os.app.settings.storage.PartitionList",{extend:"Fbx.ux.grid.RefreshGrid",alias:"widget.storagepartitionlist",requires:["Fbx.os.gui.grid.column.EnumColumn","Fbx.os.app.settings.storage.PartitionModel","Ext.grid.column.Action","Fbx.os.gui.grid.column.PercentColumn","Fbx.os.gui.grid.column.FileSizeColumn","Fbx.os.app.settings.storage.Fsck","Ext.data.ArrayStore"],initComponent:function(){var me=this;me.fsckWin=Ext.create("Fbx.os.app.settings.storage.Fsck",{diskList:me.diskList}),Ext.applyIf(me,{store:Ext.create("Ext.data.ArrayStore",{fields:[]}),selModel:{mode:"SINGLE"},columns:[{dataIndex:"label",text:"Nom",flex:2},{xtype:"enumcolumn",dataIndex:"state",text:"État",strings:{error:"Erreur",checking:"Vérification du système de fichier en cours",formatting:"Création du système de fichier en cours",mounting:"Montage en cours",maintenance:"Montage en cours",mounted:"Actif",umounting:"Démontage en cours",umounted:"Inactif",ejecting:"Éjection du média en cours"},flex:1},{xtype:"percentcolumn",dataIndex:"usage_pct",text:"Utilisation",disableAnimation:!0,flex:1},{xtype:"filesizecolumn",text:"Taille",dataIndex:"total_bytes",width:60},{xtype:"filesizecolumn",text:"Utilisé",dataIndex:"used_bytes",width:60},{xtype:"filesizecolumn",text:"Libre",dataIndex:"free_bytes",width:60},{text:"Type",dataIndex:"fstype",width:60},{xtype:"enumcolumn",text:"Vérification",dataIndex:"fsck_result",strings:{no_run_yet:"Non vérifié",running:"Vérification en cours",fs_clean:"Sain",fs_corrected:"Corrigé",fs_needs_correction:"Contient des erreurs",failed:"Erreur"},width:120},{xtype:"actioncolumn",width:20,items:[{xtype:"button",tooltip:"Vérification de la partition",handler:function(grid,rowIndex,colIndex,f,e){var rec=grid.getStore().getAt(rowIndex);rec.get("canFsck")&&(me.fsckWin.loadRecord(rec),me.fsckWin.show())},getClass:function(v,m,r){return r.get("canFsck")?"icon16 btn-system-monitor":"hidden"}}]},{xtype:"actioncolumn",width:20,items:[{xtype:"button",getClass:function(v,m,r){var disk=r.getDisk();if(!disk||"internal"==disk.get("type"))return"hidden";switch(r.get("state")){case"mounted":return"btn16 btn-control-eject-blue";case"umounted":return"btn16 btn-drive-go"}return"hidden"},handler:function(grid,rowIndex,colIndex,f,e){var rec=grid.getStore().getAt(rowIndex),disk=rec.getDisk();if(disk&&"internal"!=disk.get("type")){var state=rec.get("state");"mounted"==state?rec.umount():"umounted"==state&&rec.mount()}}}]}],viewConfig:{loadMask:!0,emptyText:'<div style="text-align: center; padding: 10px">Aucun Disque detecté</div>'}}),this.callParent(arguments)},destroy:function(){var me=this;me.fsckWin.destroy(),me.callParent(arguments)}});Ext.define("Fbx.ux.toolbar.ComboPathToolbar",{extend:"Ext.toolbar.Toolbar",requires:["Ext.form.field.ComboBox","Fbx.os.app.explorer.ExplorerModel","Fbx.os.lib.FbxUtils","Ext.data.Store"],alias:"widget.combopathtoolbar",path:"",initComponent:function(){var me=this;me.store=Ext.create("Ext.data.Store",{model:"Fbx.os.app.explorer.ExplorerModel",autoLoad:!1,listeners:{beforeload:function(store){if(me.isHidden())return!1},load:function(){if(me.combo.getValue()){var testVal=me.combo.getValue().toLowerCase();me.store.filterBy(function(rec){return rec.get("decoded_path").toLowerCase().indexOf(testVal)>=0})}}}}),me.loadedDir="",me.combo=Ext.create("Ext.form.field.ComboBox",{flex:1,fieldLabel:"",mode:"remote",typeAhead:!0,store:me.store,valueField:"decoded_path",displayField:"decoded_path",queryParam:"node",queryDelay:10,allQuery:"",lastQuery:"un truc improbable",listeners:{beforequery:function(queryEvent,eOpts){var curDir=Fbx.os.lib.FbxUtils.dirname(queryEvent.query);if(""==curDir&&(curDir="/"),me.loadedDir==curDir){var testVal=queryEvent.query.toLowerCase();return me.store.filterBy(function(rec){return rec.get("decoded_path").toLowerCase().indexOf(testVal)>=0}),!1}me.store.clearFilter(!0),me.loadedDir=curDir,queryEvent.query=Fbx.os.lib.FbxUtils.base64_encode(curDir),me.store.filter({property:"onlyFolder",value:"1"})},select:function(combo,records){var rec=records[0];me.setPath(rec.get("path")),me.fireEvent("toggleview")},blur:function(){me.fireEvent("toggleview")}}}),me.items=[me.combo,{xtype:"button",text:"/",handler:function(){me.fireEvent("toggleview")}}],me.callParent(arguments),me.addEvents("pathchanged","toggleview"),this.on("show",function(){me.combo.focus()})},setPath:function(newPath){var me=this;newPath!=me.path&&(me.path=newPath,me.combo.setValue(Fbx.os.lib.FbxUtils.base64_decode(me.path)),me.fireEvent("pathchanged",me.path))}});Ext.define("Fbx.os.app.explorer.FbxSubmit",{extend:"Ext.form.action.Submit",require:["Fbx.os.lib.FbxUtils"],alias:"formaction.fbxsubmit",doSubmit:function(){var values=this.form.getValues();if(!values.dirname)throw new Error("[FbxSubmit] form need to contain a dirname field");var files=[];this.form.getFields().each(function(f){if(f.isFileUpload())for(var input=f.getEl().dom.getElementsByTagName("input"),i=0;i<input.length;++i){var e=input[i];if(e.files)for(var j=0;j<e.files.length;++j)files.push(e.files.item(j))}}),Fbx.os.app.explorer.FsUpload.startUpload(values.dirname,null,files)}}),Ext.define("Fbx.os.app.explorer.FsUpload",{requires:["Fbx.Ajax","Fbx.os.app.explorer.FsUploadModel","Ext.data.Store"],singleton:!0,nbRunningUploads:0,queue:[],uploadFiles:{},maxConcurrentUpload:8,defaultDirName:"/Disque dur/",uploadInterval:null,CHUNK_SIZE:524288,MAX_BUFFER_SIZE:33554432,constructor:function(config){var me=this;Ext.apply(this,config),this.callParent([config]),me.authorizationUrl=FbxConf.uploadBaseUrl,me.cancelUrl=FbxConf.uploadBaseUrl,me.cleanUrl=FbxConf.uploadBaseUrl+"clean",me.trackedUpload={},this.store=Ext.create("Ext.data.Store",{storeId:"uploadStore",model:"Fbx.os.app.explorer.FsUploadModel",autoLoad:!1,timeout:500,remoteSort:!1,remoteFilter:!1,sorters:[{property:"start_date",direction:"DESC"}],getNbActive:function(){var me=this,nbActive=0;return me.each(function(r){var s=r.get("status");"authorized"!=s&&"in_progress"!=s||++nbActive}),nbActive},listeners:{load:function(store,records,successful){if(successful){var toRemove=[];Ext.Array.each(records,function(r){var status=r.get("status"),recId=r.getId();"in_progress"==status?me.trackedUpload[recId]=!0:"done"==status&&me.trackedUpload[recId]&&(Ext.Array.push(toRemove,recId),delete me.trackedUpload[recId])});for(var i in toRemove){var upload_id=toRemove[i];me.remove(upload_id)}toRemove.length&&me.store.load()}}}})},cancel:function(upload_id){var me=this;Ext.Ajax.request({method:"DELETE",url:this.cancelUrl+upload_id+"/cancel",callback:function(){me.store.load()}})},remove:function(upload_id){var me=this;Ext.Ajax.request({method:"DELETE",url:this.cancelUrl+upload_id,callback:function(){me.store.load()}})},clean:function(){var me=this;Ext.Ajax.request({method:"DELETE",url:me.cleanUrl,callback:function(){Fbx.os.app.explorer.FsUpload.store.load()}})},_addFile:function(upload,curPath,file){var elem={subdir:curPath,name:file.name,file:file,read_offset:0,started:!1};upload.queue.push(elem),upload.total_size+=file.size},_scanDirectory:function(upload,dir){var me=this,directoryReader=dir.createReader();if($.browser.win&&$.browser.mozilla&&$.browser.versionNumber<51)return void(upload.filtered_dir=!0);upload.pending_dir+=1,directoryReader.readEntries(function(entries){entries.forEach(function(entry){entry.isDirectory?me._scanDirectory(upload,entry):entry.isFile&&(upload.pending_file+=1,entry.file(function(file){me._addFile(upload,dir.fullPath,file),upload.pending_file-=1,0==upload.pending_file&&0==upload.pending_dir&&me._doneExploring(upload)},function(){console.error("failed to get file",arguments),upload.pending_file-=1,0==upload.pending_file&&0==upload.pending_dir&&me._doneExploring(upload)}))}),upload.pending_dir-=1,0==upload.pending_file&&0==upload.pending_dir&&me._doneExploring(upload)})},_scanFiles:function(upload,path,file){var me=this;if(file.webkitGetAsEntry){var e=file.webkitGetAsEntry();e.isDirectory?me._scanDirectory(upload,e):e.isFile?me._addFile(upload,"",file.getAsFile()):console.warn("unexpected entry type: ",e)}else console.warn("no webkitGetAsEntry",file)},_sendData:function(upload){for(var f=upload.queue[0],end=f.read_offset+Fbx.os.app.explorer.FsUpload.CHUNK_SIZE;f.read_offset<f.file.size;){if(upload.ws.bufferedAmount>=Fbx.os.app.explorer.FsUpload.MAX_BUFFER_SIZE)return;end>f.file.size&&(end=f.file.size);var chunk=f.file.slice(f.read_offset,end);upload.ws.send(chunk),f.read_offset=end,end+=Fbx.os.app.explorer.FsUpload.CHUNK_SIZE}if(f.read_offset>=f.file.size&&!f.finalized){f.finalized=!0;var cmd=JSON.stringify({action:"upload_finalize",request_id:3615});upload.ws.send(cmd)}},_sendNext:function(upload){var me=this;if(0==upload.queue.length)return void upload.ws.close(1e3);var f=upload.queue[0];if(!upload.sub_dirs[f.subdir])return void Fbx.os.app.explorer.FsTask.mkpath(upload.parent_dir,f.subdir,function(created_path){upload.sub_dirs[f.subdir]=created_path,me._sendNext(upload)},function(req,res){me._cancelUpload(upload)});if(f.started)me._sendData(upload);else{var cmd=JSON.stringify({action:"upload_start",request_id:3615,size:f.file.size,dirname:upload.sub_dirs[f.subdir],filename:f.name,force:f.force});upload.ws.send(cmd)}},_cancelUpload:function(upload){if(console.warn("Cancel Upload"),upload.queue.length){if(upload.queue[0].read_offset>0){var cmd=JSON.stringify({action:"upload_cancel",request_id:3617});upload.ws.send(cmd)}}upload.queue=[],upload.ws.close(1e3)},_doneExploring:function(upload){var me=this;if(!upload.queue.length)return void(upload.filtered_dir?Ext.Msg.alert("Echec de l'envoi","Votre navigateur ne supporte pas l'envoi de dossiers"):Ext.Msg.alert("Rien à uploader","Il n'y a rien a uploader"));upload.ws=new WebSocket(FbxConf.websocketBaseUrl+"upload"),upload.ws.onclose=function(ev){upload.queue.length&&(console.warn("ws on close",ev.code,"reason: "+ev.reason,ev.wasClean),Ext.Msg.alert("Echec de l'envoi","Le serveur a interrompu le transfert "+ev.reason),me._cancelUpload(upload))},upload.ws.onerror=function(ev){console.warn("ws onerror",ev),Ext.Msg.alert("Echec de l'envoi","Une erreur est survenue durant le transfert"),me._cancelUpload(upload)},upload.ws.onmessage=function(msg){var f=upload.queue[0];try{var reply=JSON.parse(msg.data)}catch(e){return console.error("Failed to parse response "+e,msg.data),upload.ws.close(1007,"Invalid json "+e),Ext.Msg.alert("Echec de l'envoi","Un message invalide a été reçu "+msg.data),void me._cancelUpload(upload)}if(!reply.success)return"upload_start"==reply.action&&"destination_conflict"==reply.error_code?void Ext.Msg.show({icon:Ext.Msg.QUESTION,title:"Le fichier existe déjà",msg:"Un fichier "+f.name+" existe dejà que voulez-vous faire ?",buttons:Ext.Msg.YESNOCANCEL+Ext.Msg.OK,buttonText:{ok:"Ecraser le fichier",yes:"Reprendre l'envoi",no:"Passer au fichier suivant",cancel:"Annuler"},fn:function(action){switch(action){case"cancel":me._cancelUpload(upload);break;case"ok":return f.force="overwrite",f.started=!1,f.read_offset=0,void me._sendNext(upload);case"yes":return reply.file_size==f.file.size?(upload.queue.shift(),void me._sendNext(upload)):(f.force="resume",f.started=!1,f.read_offset=reply.file_size,void me._sendNext(upload));case"no":return upload.queue.shift(),void me._sendNext(upload)}}}):(Ext.Msg.alert("Echec de l'envoi","Erreur lors de l'envoi: "+reply.msg),void me._cancelUpload(upload));switch(reply.action){case"upload_start":Fbx.os.app.explorer.FsUpload.store.load(),f.started=!0,me._sendData(upload);break;case"upload_finalize":upload.queue.shift(),Fbx.os.gui.Environment.notifyFileCopy([f.name],upload.sub_dirs[f.subdir]),me._sendNext(upload);break;case"upload_data":Math.floor(100*reply.result.total_len/f.file.size);me._sendData(upload);break;case"upload_cancel":me._cancelUpload(upload);break;default:console.warn("unexpected action: "+reply.action)}},upload.ws.onopen=function(e){me._sendNext(upload)}},startUpload:function(path,items,files){var i,f,me=this,upload={pending_dir:0,pending_file:0,parent_dir:path,total_size:0,sent:0,queue:[],sub_dirs:{"":path}};if(!(window.File&&window.FileList&&window.Blob&&window.WebSocket))return void Ext.Msg.alert("Navigateur ancien","Votre navigateur est trop ancien et ne supporte pas l'upload vers votre Freebox");if(items&&items.length&&items[0].webkitGetAsEntry)for(i=0;i<items.length;++i)f=items[i],me._scanFiles(upload,"",f);else if(files&&files.length)for(i=0;i<files.length;++i)f=files[i],0!=f.size||""!=f.type?me._addFile(upload,"",f):upload.filtered_dir=!0;0==upload.pending_file&&0==upload.pending_dir&&me._doneExploring(upload)}});Ext.define("Fbx.os.app.downloader.BtBlacklistModel",{extend:"Ext.data.Model",requires:["Fbx.ux.data.proxy.RestForeign"],statics:{blReason:{not_blacklisted:"",crypto_not_supported:"Ne supporte pas le chiffrement",connect_fail:"Connexion impossible",hs_timeout:"Temps d'attente dépassé dans la négociation",hs_failed:"Echec de la négociation",hs_crypt_failed:"Echec de la négociation en mode chiffré",hs_crypto_disabled:"Le support du chiffrement est désactivé",torrent_not_found:"Le torrent demandé n'a pas été trouvé",read_failed:"Erreur de réception",write_failed:"Erreur de transmission",crap_received:"Erreur de protocole",conn_closed:"Connexion fermée par le pair",timeout:"Temps d'attente dépassé",blocklist:"Appartient à la list de blocage",user:"Blacklisté manuellement"}},fields:[{name:"id",type:"string",convert:function(val,rec){return rec.raw.reason?rec.raw.host:0}},{name:"task_id",type:"string",defaultValue:"0"},{name:"host",type:"string"},{name:"expire",type:"int"},{name:"global",type:"bool"},{name:"reason",type:"string"}],proxy:{type:"restforeign",revertOnFailure:!0,useWriteUrl:!0,url:FbxConf.apiBaseUrl+"downloads/{foreignId}/blacklist",writeUrl:FbxConf.apiBaseUrl+"downloads/blacklist/",reader:{type:"json",root:"result",messageProperty:"msg"}}});Ext.define("Fbx.os.app.settings.storage.RaidCreateWindow",{extend:"Fbx.os.gui.wizard.Wizard",requires:["Fbx.os.gui.wizard.WizardStep","Ext.form.field.ComboBox","Ext.form.field.Display","Ext.form.field.Text","Fbx.os.app.settings.storage.DiskModel","Ext.data.Store","Ext.grid.Panel","Ext.grid.column.Check","Ext.grid.column.Template","Ext.selection.CheckboxModel","Ext.form.Panel","Fbx.os.app.settings.storage.RaidModel","Ext.data.ArrayStore"],initComponent:function(){var me=this;me.disk_id=-1,me.raidInfos={basic:{desc:"Dans ce mode, un seul disque est utilisé.<br />Il n'y a pas de redondance de donnés mais vous aurez la possibilité de migrer vers RAID1 en ajoutant un disque utiltérieurement",minDisk:1,maxDisk:1},raid0:{desc:"Dans ce mode, une seule zone de stockage est crée à partir d'un ensemble de disques.<br />Ce mode permet d'augmenter les performances de lecture et d'écriture en répartissant les données sur les disques.<br /><strong style=\"color: red;\">ATTENTION</strong>: la perte d'un seul disque entraîne la perte de l'ensemble des données<br />La taille totale disponible est la somme de la taille des disques",minDisk:2,maxDisk:-1},raid1:{desc:"Dans ce mode, les données sont dupliquées sur chacun des disques.<br />Ce mode permet d'augmenter la redondance des données, tant qu'un disque est fonctionnel les données sont préservées.<br />La taille totale disponible est celle du disque le plus petit",minDisk:2,maxDisk:-1},raid5:{desc:"Dans ce mode, un des disques utilisé pour la redondance des données.<br />Ce mode permet de bénéficier de meilleures performances tout en bénéficiant de redondance<br />La taille totale disponible est égale à la somme de tous les disques sauf un",minDisk:3,maxDisk:-1},raid10:{desc:"Ce mode utilise deux disques en raid0 et conserve une copie des données sur les deux autres disques<br />Ce mode permet de bénéficier de meilleures performances tout en bénéficiant de redondance<br />La taille totale disponible est égale à la somme de deux des quatre disques",minDisk:4,maxDisk:-1}},me.diskStore=Ext.create("Ext.data.Store",{autoLoad:!0,remoteSort:!1,remoteFilter:!1,model:"Fbx.os.app.settings.storage.DiskModel",sorters:[{sorterFn:function(o1,o2){var canUse1=o1.canUseForRaid();return canUse1!==o2.canUseForRaid()?canUse1?-1:1:o1.get("id")>o2.get("id")?1:-1}}],filters:[function(item){return"sata"===item.get("type")}],listeners:{load:function(){me.checkRaidDiskSelection()}}}),me.diskList=Ext.create("Ext.grid.Panel",{store:me.diskStore,height:200,selModel:{mode:"SIMPLE",selType:"checkboxmodel"},hideHeaders:!0,viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun disque detecté</div>',getRowClass:function(record,rowIndex,rowParams,store){return record.canUseForRaid()?"":"storage-disk-noraid"}},columns:[{xtype:"templatecolumn",width:40,tpl:'<div class="storage-sprite storage-hdd-{icon_type}" style="float: left;"></div>'},{xtype:"templatecolumn",dataIndex:"id",flex:1,tpl:'<div class="storage-disk"><div class="storage-disk-title">{disk_title:htmlEncode}</div><div class="storage-disk-state">&bull; État : {state_str:htmlEncode}</div><div class="storage-disk-table">&bull; Table de partition : {table_type_str:htmlEncode}</div><tpl if="connector_str"><div class="storage-disk-pos">&bull; Connecteur : {connector_str:htmlEncode}</div></tpl></div>'},{xtype:"templatecolumn",dataIndex:"cant_use_reason",tpl:'<em style="color: black;">{cant_use_reason}</em>',flex:1}],listeners:{beforeselect:function(grid,rec,idx){return rec.canUseForRaid()},selectionchange:function(grid,selected){me.checkRaidDiskSelection()}}}),me.raidCfgForm=Ext.create("Ext.form.Panel",{bodyPadding:10,items:[{xtype:"fieldset",title:"Configuration RAID",defaults:{labelWidth:120,anchor:"100%"},items:[{xtype:"textfield",fieldLabel:"Nom de l'array",name:"name",value:"Freebox",allowBlank:!1,maxLength:32,validator:function(val){return""===val?"Le nom de l'array ne peut être vide":!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>32)||"Le nom est trop long"}},{xtype:"combobox",fieldLabel:"Niveau de raid",name:"level",allowBlank:!1,ttip:"Le niveau de RAID permet de controler le niveau de réplication de vos données",value:"basic",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["basic","Basique"],["raid0","RAID 0"],["raid1","RAID 1"],["raid5","RAID 5"],["raid10","RAID 10"]]}),forceSelection:!0,editable:!1,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,validator:function(val){var f=me.raidCfgForm.getForm(),raidType=f.findField("level").getValue(),infos=me.raidInfos[raidType],selModel=me.diskList.getSelectionModel(),selected=selModel.getSelection();return infos.minDisk>0&&selected.length<infos.minDisk?"Vous devez sélectionner au moins "+infos.minDisk+" disque"+(infos.minDisk>1?"s":""):!(infos.maxDisk>0&&selected.length>infos.maxDisk)||"Vous ne devez pas sélectionner plus de "+infos.maxDisk+" disque"+(infos.minDisk>1?"s":"")},listeners:{change:function(field,newVal){me.raidCfgForm.getForm().findField("level_desc").setValue(me.raidInfos[newVal].desc),me.checkRaidDiskSelection()}}},{xtype:"displayfield",name:"level_desc",value:me.raidInfos.raid1.desc,margin:"0 0 10 0"}]},{xtype:"fieldset",title:"Supports de stockage",flex:1,items:[me.diskList]}]}),Ext.apply(me,{closeAction:"hide",title:"Création d'un Array RAID",steps:[{xtype:"wizardStep",title:"Configuration RAID",items:[me.raidCfgForm],canGoNext:function(){if(!me.raidCfgForm.isValid())return!1;var f=me.raidCfgForm.getForm(),vals=f.getValues(),selModel=me.diskList.getSelectionModel(),selected=selModel.getSelection(),members=[];for(var i in selected){var d=selected[i];members.push({id:d.get("id")})}return Ext.create("Fbx.os.app.settings.storage.RaidModel",{name:vals.name,level:vals.level,members:members}).save({callback:function(rec,ops,success){if(!success)return void me.close();var res=ops.response.jsonData.result;if(me.disk_id=res.disk_id,!me.disk_id)return Ext.Msg.alert("Erreur","Erreur lors de la récupération de l'id de Disque"),void me.close();Ext.Ajax.request({url:FbxConf.apiBaseUrl+"storage/disk/"+me.disk_id+"/format",method:"PUT",jsonData:{table_type:"superfloppy",fs_type:"ext4",label:vals.name},success:function(){me.checkProgress(),me.loadStep(2)}})}}),me.btnPrev.disable(),me.btnNext.disable(),!0}},{xtype:"wizardStep",title:"Création de l'Array",items:[{xtype:"panel",bodyPadding:10,items:[{xtype:"container",layout:"fit",html:'<div>Création de l\'Array RAID</div><br /> <div>L\'array RAID est en train d\'être initialisé</div> <br /><div style="text-align: center;"><img src="resources/images/fbx/loading.gif" style="width: 32px; height: 32px;" alt=""/></div>'}]}],canGoNext:function(){return!1}},{xtype:"wizardStep",title:"Formatage de l'Array",items:[{xtype:"panel",bodyPadding:10,items:[{xtype:"container",layout:"fit",html:'<div>Formatage de l\'Array RAID</div><br /> <div>L\'array RAID est en train d\'être formaté</div> <br /><div style="text-align: center;"><img src="resources/images/fbx/loading.gif" style="width: 32px; height: 32px;" alt=""/></div>'}]}],canGoNext:function(){return!1}}]}),me.callParent(arguments)},checkRaidDiskSelection:function(){var me=this;return me.raidCfgForm.isValid()?(me.btnNext.enable(),!0):(me.btnNext.disable(),!1)},checkProgress:function(){var me=this;Fbx.os.app.settings.storage.DiskModel.load(me.disk_id,{failure:function(record,operation){me.close()},success:function(rec,operation){var state=(rec.get("operation_pct"),rec.get("state"));if("formatting"!==state)return"error"===state?Ext.Msg.show({title:"Erreur détectées",msg:"Une erreur est survenue lors du formatage",icon:Ext.window.MessageBox.ERROR,buttons:Ext.Msg.OK}):Ext.Msg.show({title:"Initialisation terminée",msg:"L'initialisation de l'array raid est terminé",icon:Ext.window.MessageBox.INFO,buttons:Ext.Msg.OK}),void me.close();setTimeout(function(){me.checkProgress()},1e3)}})}});Ext.define("Fbx.os.app.settings.wifi.WifiApConfig",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Ext.form.FieldSet","Ext.form.field.Checkbox","Ext.form.field.ComboBox","Ext.layout.component.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore"],channelInfo:[],setRecord:function(rec){var me=this;me.url=FbxConf.apiBaseUrl+"wifi/ap/"+rec.getId(),me.chanSupportLoaded=!1,me.formLoaded=!1,me.loadChannSupport()},applyCapabilities:function(conf){var me=this,form=me.getForm(),band=conf.config.band,field11n=form.findField("config.ht.ht_enabled"),field11ac=form.findField("config.ht.ac_enabled"),dfsField=form.findField("config.dfs_enabled"),caps=conf.capabilities[band],cap11n=caps.ht_20||caps.ht_40,cap11ac=caps.vht_80||caps.vht_80_80||caps.vht_160;cap11n||(field11n.setValue(!1),field11ac.setValue(!1)),cap11ac||field11ac.setValue(!1),field11n.setVisible(cap11n),field11ac.setVisible(cap11ac),dfsField.setVisible("5g"==band),me.updateAdvancedParams(),form.getFields().each(function(f){f.requiredCap&&f.setDisabled(!caps[f.requiredCap])});var sup_smps=[["disabled","Désactivé"]];caps.smps_static&&sup_smps.push(["static","Statique"]),caps.smps_dynamic&&sup_smps.push(["dynamic","Dynamique"]),me.smpsStore.loadData(sup_smps);var f=form.findField("config.ht.smps");f.setDisabled(sup_smps.length<2),f.select(conf.config.ht.smps),f.originalValue=conf.config.ht.smps;for(var sup_rx_stbc=[["disabled","Désactivé"]],i=0;i<4;++i)caps["rx_stbc_"+i]?sup_rx_stbc.push([""+i,""+i]):i==conf.config.ht.rx_stbc&&(console.warn("rx_stbc not supposed to be supported: ",i),sup_rx_stbc.push([""+i,""+i]));me.rxStbcStore.loadData(sup_rx_stbc),f=form.findField("config.ht.rx_stbc"),f.setDisabled(sup_rx_stbc.length<2),f.select(conf.config.ht.rx_stbc),f.originalValue=conf.config.ht.rx_stbc;var values=[["default","Valeur par défaut"]];caps.vht_mpdu_len_7991&&values.push(["7991","7991"]),caps.vht_mpdu_len_11454&&values.push(["11454","11454"]),me.maxMpduStore.loadData(values),f=form.findField("config.ht.vht_max_mpdu_len"),f.setDisabled(values.length<2),f.select(conf.config.ht.vht_max_mpdu_len),f.originalValue=conf.config.ht.vht_max_mpdu_len,values=[["disabled","Désactivé"]];for(var i=0;i<5;++i)caps["vht_rx_stbc_"+i]?values.push([""+i,""+i]):i==conf.config.ht.vht_rx_stbc&&(console.warn("vht_rx_stbc not supposed to be supported ...",i),values.push([""+i,""+i]));me.vhtRxStbcStore.loadData(values),f=form.findField("config.ht.vht_rx_stbc"),f.setDisabled(values.length<2),f.select(conf.config.ht.vht_rx_stbc),f.originalValue=conf.config.ht.vht_rx_stbc,values=[[0,"0"]];for(var i=0;i<8;++i)caps["vht_max_ampdu_len_exp"+i]&&values.push([i,""+i]);me.vhtMaxAmpduStore.loadData(values),f=form.findField("config.ht.vht_max_ampdu_len_exp"),f.setDisabled(values.length<2),f.select(conf.config.ht.vht_max_ampdu_len_exp),f.originalValue=conf.config.ht.vht_max_ampdu_len_exp},chanSupportLoaded:!1,formLoaded:!1,loadChannSupport:function(){var me=this;me.getForm().findField("config.channel_width").setDisabled(!0),me.setLoading(!0),Ext.Ajax.request({url:me.url+"/allowed_channel_comb/",method:"GET",success:function(response,opts){var data=response.jsonData.result;me.channelInfo=data,me.chanSupportLoaded=!0,me.load()},callback:function(){me.setLoading(!1)}})},updateChanWidth:function(){var me=this,form=me.getForm(),field11n=form.findField("config.ht.ht_enabled"),field11ac=form.findField("config.ht.ac_enabled"),widthField=form.findField("config.channel_width"),isValid=!1,curVal=parseInt(widthField.getValue());if(me.formLoaded&&me.channelInfo&&0!=me.channelInfo.length){var maxWidth=20;field11n.getValue()?(maxWidth=40,field11ac.setDisabled(!1)):(field11ac.setDisabled(!0),field11ac.setValue(!1));field11ac.getValue()&&(maxWidth=160);var supportedWidth=[],supportedWidthH={};for(var i in me.channelInfo){var info=me.channelInfo[i];supportedWidthH[info.channel_width]||(supportedWidthH[info.channel_width]=!0,info.channel_width<=maxWidth&&(supportedWidth.push([""+info.channel_width,info.channel_width+" MHz"]),info.channel_width==curVal&&(isValid=!0)))}me.channelWidthStore.loadData(supportedWidth),widthField.setDisabled(!1),isValid?widthField.setValue(""+curVal):widthField.select(me.channelWidthStore.first()),me.updatePrimChan()}},updatePrimChan:function(){var me=this,supported=[];if(me.formLoaded){var form=me.getForm(),widthField=form.findField("config.channel_width"),primField=form.findField("config.primary_channel"),dfsField=form.findField("config.dfs_enabled"),dfsEnabled=dfsField.getValue(),curVal=primField.getValue(),isValid=!1;if(!me.channelInfo||0==me.channelInfo.length)return void primField.setDisabled(!0);chan_width=widthField.getValue(),supported.push([0,"Canal automatique"]);var uniq={};for(var i in me.channelInfo){var info=me.channelInfo[i];if((!info.need_dfs||dfsEnabled)&&(info.channel_width==chan_width&&!uniq[info.primary])){uniq[info.primary]=!0;var name="Canal "+info.primary;info.need_dfs&&(name+=" (DFS: "+info.dfs_cac_time+" s)"),supported.push([info.primary,name]),info.primary==curVal&&(isValid=!0)}}me.primaryChannelStore.loadData(supported),primField.setDisabled(!1),isValid?primField.setValue(curVal):primField.select(me.primaryChannelStore.first()),me.updateSecondChan()}},updateSecondChan:function(){var me=this,supported=[];if(me.formLoaded){var form=me.getForm(),widthField=form.findField("config.channel_width"),primField=form.findField("config.primary_channel"),secField=form.findField("config.secondary_channel"),dfsField=form.findField("config.dfs_enabled"),dfsEnabled=dfsField.getValue(),curVal=secField.getValue(),isValid=!1;if(!me.channelInfo||0==me.channelInfo.length)return void secField.setDisabled(!0);chan_width=widthField.getValue(),prim_chan=primField.getValue();var uniq={};if(0==prim_chan)return supported.push([0,"Canal automatique"]),me.secondaryChannelStore.loadData(supported),secField.setValue(0),void secField.setDisabled(!0);for(var i in me.channelInfo){var info=me.channelInfo[i];if((!info.need_dfs||dfsEnabled)&&(info.channel_width==chan_width&&info.primary==prim_chan&&info.secondary&&!uniq[info.secondary])){var name="Canal "+info.secondary;info.need_dfs&&(name+=" (DFS: "+info.dfs_cac_time+" s)"),supported.push([info.secondary,name]),info.secondary==curVal&&(isValid=!0),uniq[info.secondary]=!0}}secField.setDisabled(0==supported.length),supported.length||supported.push([0,"Désactivé"]),me.secondaryChannelStore.loadData(supported),isValid?secField.setValue(curVal):secField.select(me.secondaryChannelStore.first())}},updateAdvancedParams:function(){var me=this,form=me.getForm(),fields=form.getFields(),field11n=form.findField("config.ht.ht_enabled"),nEnabled=field11n.getValue();nEnabled||(me.getComponent("advancedParams").setVisible(!1),me.getComponent("advancedParamsCheck").setValue(!1)),me.getComponent("advancedParamsCheck").setDisabled(!nEnabled);var field11ac=form.findField("config.ht.ac_enabled"),acEnabled=field11ac.getValue();fields.each(function(f){f.name&&"config.ht"==f.name.substr(0,9)&&"config.ht.ht_enabled"!=f.name&&"config.ht.ac_enabled"!=f.name&&(f.needAc?f.setVisible(acEnabled):f.setVisible(!0))})},initComponent:function(){var me=this;me.primaryChannelStore=new Ext.data.ArrayStore({fields:["val","display"],data:[]}),me.secondaryChannelStore=new Ext.data.ArrayStore({fields:["val","display"],data:[]}),me.channelWidthStore=new Ext.data.ArrayStore({fields:["val","display"],data:[]}),me.smpsStore=Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[]}),me.rxStbcStore=Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[]}),me.maxMpduStore=Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[]}),me.vhtRxStbcStore=Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[]}),me.vhtMaxAmpduStore=Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[]}),Ext.applyIf(me,{url:FbxConf.apiBaseUrl+"wifi/ap/0",layout:{align:"stretch",type:"vbox"},autoScroll:!0,defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"checkboxfield",fieldLabel:"Activer le 802.11n",ttip:"La norme 802.11n permet des débits plus importants, mais peut entrainer des problèmes de compatibilité.",boxLabel:"",name:"config.ht.ht_enabled",listeners:{change:function(field,val,prev){me.updateChanWidth(),me.updateAdvancedParams()}}},{xtype:"checkboxfield",fieldLabel:"Activer le 802.11ac",ttip:"La norme 802.11ac permet des débits plus importants, mais peut entrainer des problèmes de compatibilité.",boxLabel:"",name:"config.ht.ac_enabled",listeners:{change:function(field,val,prev){me.updateChanWidth(),me.updateAdvancedParams()}}},{xtype:"combobox",fieldLabel:"Largeur de bande",name:"config.channel_width",ttip:"Plus la bande de fréquence utilisée est large, plus le débit sera important.",editable:!1,disabled:!0,store:me.channelWidthStore,displayField:"display",valueField:"val",mode:"local",typeAhead:!1,lastQuery:"",listeners:{change:function(field,val,oldVal){me.updatePrimChan()}}},{xtype:"checkboxfield",fieldLabel:"Permettre l'utilisation des canaux DFS",name:"config.dfs_enabled",hidden:!0,boxLabel:"",ttip:"Certains canaux Wi-Fi nécessitent un scan préalable afin de ne pas perturber d'autres équipements radio.",listeners:{change:function(field,val,oldVal){me.updatePrimChan()}}},{xtype:"combobox",fieldLabel:"Canal Primaire",name:"config.primary_channel",ttip:"Canal Wi-Fi à utiliser. Vous pouvez essayer de changer de canal Wi-Fi si vous avez des problèmes de connexion",editable:!1,disabled:!0,store:me.primaryChannelStore,displayField:"display",valueField:"val",mode:"local",typeAhead:!1,lastQuery:"",listeners:{change:function(field,val,oldVal){me.updateSecondChan()}}},{xtype:"combobox",fieldLabel:"Canal Secondaire",name:"config.secondary_channel",ttip:"Canal secondaire Wi-Fi à utiliser.",editable:!1,disabled:!0,store:me.secondaryChannelStore,displayField:"display",valueField:"val",mode:"local",typeAhead:!1,lastQuery:""},{xtype:"checkbox",submitValue:!1,itemId:"advancedParamsCheck",fieldLabel:"Configurer les paramètres avancés",boxLabel:"",name:"",isDirty:function(){return!1},listeners:{change:function(field,val,prev){me.updateAdvancedParams(),me.getComponent("advancedParams").setVisible(val)}}},{xtype:"fieldset",title:"Paramètres avancés",itemId:"advancedParams",hidden:!0,items:[{xtype:"checkboxgroup",fieldLabel:"",columns:2,defaults:{labelWidth:200,margin:5},items:[{xtype:"checkbox",fieldLabel:"greenfield",boxLabel:"",name:"config.ht.greenfield",requiredCap:"greenfield"},{xtype:"checkbox",fieldLabel:"shortgi20",boxLabel:"",name:"config.ht.shortgi20",requiredCap:"shortgi20"},{xtype:"checkbox",fieldLabel:"shortgi40",boxLabel:"",name:"config.ht.shortgi40",requiredCap:"shortgi40"},{xtype:"checkbox",fieldLabel:"ldpc",boxLabel:"",name:"config.ht.ldpc",requiredCap:"ldpc"},{xtype:"combo",fieldLabel:"smps",name:"config.ht.smps",store:me.smpsStore,editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lastQuery:""},{xtype:"checkbox",fieldLabel:"tx_stbc",boxLabel:"",name:"config.ht.tx_stbc",requiredCap:"tx_stbc"},{xtype:"combo",fieldLabel:"rx_stbc",name:"config.ht.rx_stbc",store:me.rxStbcStore,editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lastQuery:""},{xtype:"checkbox",fieldLabel:"delayed_ba",boxLabel:"",name:"config.ht.delayed_ba",requiredCap:"delayed_ba"},{xtype:"checkbox",fieldLabel:"max_amsdu_7935",boxLabel:"",name:"config.ht.max_amsdu_7935",requiredCap:"max_amsdu_7935"},{xtype:"checkbox",fieldLabel:"dsss_cck_40",boxLabel:"",name:"config.ht.dsss_cck_40",requiredCap:"dsss_cck_40"},{xtype:"checkbox",fieldLabel:"psmp",boxLabel:"",name:"config.ht.psmp",requiredCap:"psmp"},{xtype:"checkbox",fieldLabel:"lsig_txop_prot",boxLabel:"",name:"config.ht.lsig_txop_prot",requiredCap:"lsig_txop_prot"},{xtype:"checkbox",fieldLabel:"vht_shortgi80",boxLabel:"",name:"config.ht.vht_shortgi80",needAc:!0,requiredCap:"vht_shortgi80"},{xtype:"checkbox",fieldLabel:"vht_shortgi160",boxLabel:"",name:"config.ht.vht_shortgi160",needAc:!0,requiredCap:"vht_shortgi160"},{xtype:"combo",fieldLabel:"vht_max_mpdu_len",name:"config.ht.vht_max_mpdu_len",store:me.maxMpduStore,editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lastQuery:"",needAc:!0},{xtype:"checkbox",fieldLabel:"vht_rx_ldpc",boxLabel:"",name:"config.ht.vht_rx_ldpc",needAc:!0,requiredCap:"vht_rx_ldpc"},{xtype:"checkbox",fieldLabel:"vht_tx_stbc",boxLabel:"",name:"config.ht.vht_tx_stbc",needAc:!0,requiredCap:"vht_tx_stbc"},{xtype:"combo",fieldLabel:"vht_rx_stbc",name:"config.ht.vht_rx_stbc",store:me.vhtRxStbcStore,editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lastQuery:"",needAc:!0},{xtype:"combo",fieldLabel:"vht_max_ampdu_len_exp",name:"config.ht.vht_max_ampdu_len_exp",store:me.vhtMaxAmpduStore,editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,lastQuery:"",needAc:!0},{xtype:"checkbox",fieldLabel:"vht_rx_antenna_consistency",boxLabel:"",name:"config.ht.vht_rx_antenna_consistency",needAc:!0,requiredCap:"vht_rx_antenna_consistency"},{xtype:"checkbox",fieldLabel:"vht_tx_antenna_consistency",boxLabel:"",name:"config.ht.vht_tx_antenna_consistency",needAc:!0,requiredCap:"vht_tx_antenna_consistency"},{xtype:"checkbox",fieldLabel:"vht_su_beamformer",boxLabel:"",name:"config.ht.vht_su_beamformer",needAc:!0,requiredCap:"vht_su_beamformer"},{xtype:"checkbox",fieldLabel:"vht_su_beamformee",boxLabel:"",name:"config.ht.vht_su_beamformee",needAc:!0,requiredCap:"vht_su_beamformee"},{xtype:"checkbox",fieldLabel:"vht_mu_beamformer",boxLabel:"",name:"config.ht.vht_mu_beamformer",needAc:!0,requiredCap:"vht_mu_beamformer"}]}]}]}),me.callParent(arguments),me.mon(me,"show",function(){me.chanSupportLoaded?me.load():me.loadChannSupport()}),me.mon(me,"loaded",function(form,conf){me.formLoaded=!0,me.updateChanWidth(),me.applyCapabilities(conf)}),me.mon(me,"saved",function(){Fbx.os.gui.Environment.fireEvent("toogleneedrefresh")})},save:function(){this.submitForm()},reset:function(){this.getForm().reset()}});Ext.define("Fbx.os.core.AppSettingsModel",{extend:"Ext.data.Model",requires:["Fbx.Ajax"],fields:[{name:"id",type:"int"},{name:"name",type:"string"},{name:"data",type:"auto"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"settings/",reader:{type:"json",root:"result",messageProperty:"msg"},sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0}});Ext.define("Fbx.os.app.settings.VpnClientConfigEditor",{extend:"Ext.window.Window",requires:["Ext.form.Panel","Ext.layout.component.FieldSet","Ext.form.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Ext.form.field.Checkbox","Ext.form.field.Number","Ext.form.field.ComboBox","Ext.form.field.Text","Ext.data.ArrayStore","Ext.data.Store"],initComponent:function(){var me=this;me.form=Ext.create("Ext.form.Panel",{bodyPadding:10,trackResetOnLoad:!0,autoScroll:!0,border:0,buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){if(me.record.phantom){me.record.store.remove(me.record)}me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){var form=me.form.getForm(),values=form.getValues();if(me.record.set("description",values.description),me.record.set("type",values.type),"pptp"==values.type){var conf_pptp={password:values["conf_pptp.password"],mppe:values["conf_pptp.mppe"],remote_host:values["conf_pptp.remote_host"],username:values["conf_pptp.username"]};"disable"!=conf_pptp.mppe?conf_pptp.allowed_auth={mschapv2:!0}:conf_pptp.allowed_auth={pap:"on"==values["conf_pptp.allowed_auth.pap"],chap:"on"==values["conf_pptp.allowed_auth.chap"],eap:"on"==values["conf_pptp.allowed_auth.eap"],mschap:"on"==values["conf_pptp.allowed_auth.mschap"],mschapv2:"on"==values["conf_pptp.allowed_auth.mschapv2"]},me.record.set("conf_pptp",conf_pptp),me.record.save({success:function(){me.hide(),me.record.store.load()}})}else if("openvpn"==values.type){if(void 0===window.FileReader)return void Ext.Msg.alert("Erreur","Votre navigateur est trop ancien et ne supporte pas l'api FileReader. Mettez à jour votre navigateur !");var file=form.findField("conf_openvpn.config_file").extractFileInput();if(!file.files||!file.files.length){if(me.record.phantom)return void Ext.Msg.alert("Erreur","Vous devez fournir un fichier de configuration OpenVPN");var conf_openvpn={password:values["conf_openvpn.password"],username:values["conf_openvpn.username"]};return me.record.set("conf_openvpn",conf_openvpn),void me.record.save({success:function(){me.hide(),me.record.store.load()}})}var fr=new FileReader;fr.onload=function(){var config_file=fr.result;if(config_file.length>=16384)return void Ext.Msg.alert("Erreur","Le fichier de configuration est trop gros");var conf_openvpn={password:values["conf_openvpn.password"],username:values["conf_openvpn.username"],config_file:config_file};me.record.set("conf_openvpn",conf_openvpn),me.record.save({success:function(){me.hide(),me.record.store.load()}})},fr.readAsText(file.files[0])}}}],items:[{xtype:"fieldset",title:"Configuration VPN",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"textfield",fieldLabel:"Description",maxLength:128,enforceMaxLength:!0,name:"description"},{xtype:"combo",name:"type",fieldLabel:"Type de serveur VPN",editable:!1,forceSelection:!0,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["pptp","PPTP"],["openvpn","OpenVPN"]]}),value:"all",displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,listeners:{change:function(combo,newVal){me.form&&(me.form.getComponent("pptpConfig").setVisible("pptp"==newVal),me.form.getComponent("pptpCipher").setVisible("pptp"==newVal),me.form.getComponent("openVpnConfig").setVisible("openvpn"==newVal))}}}]},{xtype:"fieldset",title:"Configuration PPTP",itemId:"pptpConfig",hidden:!0,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"textfield",fieldLabel:"Nom d'hôte",maxLength:256,enforceMaxLength:!0,name:"conf_pptp.remote_host"},{xtype:"textfield",fieldLabel:"Nom d'utilisateur",maxLength:32,enforceMaxLength:!0,name:"conf_pptp.username"},{xtype:"textfield",fieldLabel:"Mot de passe",inputType:"password",maxLength:32,enforceMaxLength:!0,name:"conf_pptp.password"},{xtype:"combobox",fieldLabel:"Mode de chiffrement",ttip:"Type de chiffrement à utiliser",name:"conf_pptp.mppe",store:new Ext.data.Store({fields:["type","name"],data:[{type:"disable",name:"Désactivé"},{type:"require",name:"Obligatoire"},{type:"require_128",name:"Obligatoire 128 bits"}]}),displayField:"name",valueField:"type",mode:"local",typeAhead:!1,editable:!1,listeners:{change:function(combo,newVal){var form=me.form.getForm(),chapv2=form.findField("conf_pptp.allowed_auth.mschapv2"),mschap=form.findField("conf_pptp.allowed_auth.mschap"),pap=form.findField("conf_pptp.allowed_auth.pap"),eap=form.findField("conf_pptp.allowed_auth.eap"),chap=form.findField("conf_pptp.allowed_auth.chap");"disable"!=newVal?(chapv2.setDisabled(!0),chapv2.setValue(!0),pap.setDisabled(!0),pap.setValue(!1),chap.setDisabled(!0),chap.setValue(!1),eap.setDisabled(!0),eap.setValue(!1),mschap.setDisabled(!0),mschap.setValue(!1)):(chapv2.setDisabled(!1),eap.setDisabled(!1),mschap.setDisabled(!1),pap.setDisabled(!1),chap.setDisabled(!1))}}}]},{xtype:"fieldset",title:"Modes de chiffrement autorisés",itemId:"pptpCipher",hidden:!0,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.pap",fieldLabel:"PAP",boxLabel:""},{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.chap",fieldLabel:"CHAP",boxLabel:""},{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.eap",fieldLabel:"EAP",boxLabel:""},{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.mschap",fieldLabel:"MS-CHAP",boxLabel:""},{xtype:"checkboxfield",name:"conf_pptp.allowed_auth.mschapv2",fieldLabel:"MS-CHAPv2",boxLabel:""}]},{xtype:"fieldset",title:"Configuration OpenVPN",itemId:"openVpnConfig",hidden:!0,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"textfield",fieldLabel:"Nom d'utilisateur",maxLength:32,enforceMaxLength:!0,name:"conf_openvpn.username"},{xtype:"textfield",fieldLabel:"Mot de passe",inputType:"password",maxLength:32,enforceMaxLength:!0,name:"conf_openvpn.password"},{xtype:"filefield",fieldLabel:"Fichier de configuration",name:"conf_openvpn.config_file"},{xtype:"hidden",name:"csrf_token",value:FbxConf.csrfToken}]}]}),Ext.applyIf(me,{layout:"fit",items:[me.form]}),me.callParent(arguments)},loadRecord:function(rec){var me=this,form=me.form.getForm();me.record=rec,me.values={},form.getFields().each(function(f){f.setValue&&f.setValue("")}),Fbx.os.lib.FbxUtils.stringify(rec.raw,"",me.values),form.setValues(me.values)}});Ext.define("Fbx.os.app.settings.wifi.WifiBssConfig",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Ext.form.FieldSet","Ext.form.field.Checkbox","Ext.form.field.ComboBox","Ext.layout.component.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore","Ext.data.Store"],channelInfo:[],urlSet:!1,conf:!1,setRecord:function(rec,bss){var me=this;me.conf=!1,me.urlSet=!0,me.url=FbxConf.apiBaseUrl+"wifi/bss/"+bss.getId(),me.load()},applyDef:function(use_shared,save_old){var me=this;if(me.conf){var form=me.getForm();form.trackResetOnLoad=!1;var values=form.getFieldValues();if(save_old){var old_params=use_shared?me.conf.bss_params:me.conf.shared_bss_params;for(var k in old_params)old_params[k]=values["config."+k]}var new_params=use_shared?me.conf.shared_bss_params:me.conf.bss_params;for(var k in new_params)values["config."+k]=new_params[k];form.setValues(values)}},transformBeforePost:function(values){return values.config.use_default_config=values.use_shared_params,values},initComponent:function(){var me=this;me.canvasId="wifi-config-qrcode-"+Math.ceil(1e5*Math.random()),Ext.applyIf(me,{url:FbxConf.apiBaseUrl+"wifi/ap/0",layout:{align:"stretch",type:"vbox"},defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"combobox",fieldLabel:"Choix de la configuration",name:"use_shared_params",ttip:"Vous permet d'utiliser une configuration spécifque à cette carte",store:new Ext.data.ArrayStore({fields:["value","label"],data:[[!0,"Configuration commune"],[!1,"Configuration spécifique à la carte"]]}),displayField:"label",valueField:"value",mode:"local",typeAhead:!1,listeners:{change:function(field,val,oldVal){me.applyDef(val,!0),me.genQrcode()}}},{xtype:"checkboxfield",fieldLabel:"Activer le réseau personnel",ttip:"Vous pouvez désactiver cette option si vous n'utilisez pas le Wi-Fi mais que vous souhaitez que votre Freebox continue à émettre le réseau FreeWifi",boxLabel:"",name:"config.enabled"},{xtype:"checkboxfield",fieldLabel:"Cacher le SSID",ttip:"Si vous activez cette option, votre réseau Wi-Fi n'apparaitra pas dans la liste des réseaux Wi-Fi à proximité",boxLabel:"",name:"config.hide_ssid",listeners:{change:function(){me.genQrcode()}}},{xtype:"textfield",fieldLabel:"SSID",allowBlank:!1,ttip:"Nom de votre réseau Wi-Fi",name:"config.ssid",validator:function(value){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value)>32)||"Votre nom de réseau est trop long !"},listeners:{change:function(){me.genQrcode()}}},{xtype:"combobox",fieldLabel:"Type de protection",name:"config.encryption",ttip:"Type de protection à utiliser pour votre réseau",editable:!1,store:new Ext.data.Store({fields:["type","name"],data:[{type:"wpa2_psk_ccmp",name:"WPA2-PSK/AES"},{type:"wpa2_psk_tkip",name:"WPA2-PSK/TKIP (obsolète)"},{type:"wpa2_psk_auto",name:"WPA2-PSK (obsolète)"},{type:"wpa_psk_ccmp",name:"WPA-PSK/CCMP (obsolète)"},{type:"wpa_psk_tkip",name:"WPA-PSK/TKIP (obsolète)"},{type:"wpa_psk_auto",name:"WPA-PSK (obsolète)"},{type:"wep",name:"WEP (obsolète)"}]}),displayField:"name",valueField:"type",mode:"local",typeAhead:!1,listeners:{change:function(combo,newVal,oldVal){me.getForm().findField("config.key").validate(),me.genQrcode(),"wpa2_psk_ccmp"!=newVal?combo.setFieldStyle("color: #FF4500;"):combo.setFieldStyle("color: #000000;")}}},{xtype:"textfield",fieldLabel:"Clé Wi-Fi",name:"config.key",ttip:"Mot de passe qui vous sera demandé pour vous connecter à votre réseau Wi-Fi",validator:function(value){var form=me.getForm(),cipherCombo=form.findField("config.encryption"),cipher=cipherCombo.getValue(),keyLen=Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value);if("wep"==cipher){if(10!=keyLen&&26!=keyLen)return"Votre clé WEP doit faire 10 ou 26 caractères";if(!/^[0-9A-F]+$/i.test(value))return"Votre clé WEP doit être une chaîne hexadécimale"}else{if(keyLen<8)return"Votre clé Wi-Fi est trop courte !";if(keyLen>63)return"Votre clé Wi-Fi est trop longue !"}return!0},listeners:{change:function(){me.genQrcode()}}},{xtype:"combobox",fieldLabel:"Version du protocole EAPOL",ttip:"Version du protocole d'authentification à utiliser",name:"config.eapol_version",editable:!1,store:new Ext.data.Store({fields:["type","name"],data:[{type:1,name:"Version 1"},{type:2,name:"Version 2"}]}),displayField:"name",valueField:"type",mode:"local",typeAhead:!1},{xtype:"checkboxfield",fieldLabel:"Activer WPS",ttip:"Si vous activez cette option, vous pourrez vous connecter à votre réseau Wi-Fi en utilisant une méthode WPS",boxLabel:"",name:"config.wps_enabled"},{xtype:"templateddisplayfield",ttip:"Pour vous connecter à ce réseau Wi-Fi vous pouvez scanner ce QR Code avec un smartphone",fieldLabel:"QR Code",tpl:'<canvas id="'+me.canvasId+'"></canvas>'}]}),me.callParent(arguments),me.mon(me,"beforeload",function(){return me.getForm().trackResetOnLoad=!0,me.urlSet}),me.mon(me,"loaded",function(receiver,conf){me.conf=conf,me.applyDef(conf.use_shared_params,!1),me.genQrcode()}),me.mon(me,"saved",function(){Fbx.os.gui.Environment.fireEvent("toogleneedrefresh"),me.load()})},genQrcode:function(){var me=this,values=me.getForm().getValues(),canvas=document.getElementById(me.canvasId);Fbx.os.lib.FbxUtils.genWifiQrCode(values["config.encryption"],values["config.ssid"],values["config.key"],values["config.hide_ssid"],canvas)},save:function(){this.submitForm()},reset:function(){this.getForm().reset()}});Ext.define("Fbx.os.app.grillepain.VmModel",{extend:"Fbx.ux.data.Model",requires:["Fbx.Ajax"],fields:[{name:"name",type:"string"},{name:"disk_path",type:"string"},{name:"disk_type",type:"string"},{name:"cd_path",type:"string"},{name:"status",type:"string"},{name:"memory",type:"int"},{name:"vcpus",type:"int"},{name:"status",type:"string"},{name:"enable_screen",type:"boolean"},{name:"enable_cloudinit",type:"boolean"},{name:"cloudinit_hostname",type:"string"},{name:"cloudinit_userdata",type:"string"},{name:"generated_name",type:"string",persist:!1,convert:function(_v,rec){var name=rec.get("name");if(name&&name.length>0)return name;var disk=rec.get("disk_path");return disk&&0!=disk.length?Fbx.os.app.grillepain.lib.basename(Fbx.os.lib.FbxUtils.base64_decode(disk)):"VM non configurée"}},{name:"pretty_status",type:"string",persist:!1,convert:function(_v,rec){switch(rec.get("status")){case"running":return"Démarré";case"starting":return"En cours de démarrage";case"stopped":return"Arrêté";case"stopping":return"En cours d'arrêt"}}},{name:"generated_hostname",type:"string",persist:!1,convert:function(_v,rec){var name=rec.get("cloudinit_hostname");return name&&name.length>0?name:(name=rec.get("name"),name&&name.length>0&&(name=name.replace(/\s/g,"-"),name=name.replace(/[éèêëÉÈÊË]/g,"e"),name=name.replace(/[àâÀÂ]/g,"a"),name=name.replace(/[ùûÙÛüÜ]/g,"u"),name=name.replace(/[ôöÔÖ]/g,"o"),name=name.replace(/[çÇ]/g,"c"),name=name.replace(/[ïîÏÎ]/g,"i"),name=name.replace(/[^A-Za-z0-9-]/g,""),name.length>0)?name:"freebox-vm-"+Math.ceil(1e5*Math.random()))}}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"vm/",filterParam:void 0,sortParam:void 0,limitParam:void 0,startParam:void 0,pageParam:void 0,reader:{type:"json",root:"result",messageProperty:"msg"}},start:function(success){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/"+this.get("id")+"/start/",method:"POST",success:success})},reset:function(success){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/"+this.get("id")+"/restart/",method:"POST",success:success})},shutdown:function(success){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/"+this.get("id")+"/stop/",method:"POST",success:success})}});Ext.define("Fbx.os.app.settings.WifiNeighborGraph",{extend:"Ext.Component",alias:"widget.wifineighborgraph",requires:["Fbx.os.app.settings.WifiNeighborModel","Ext.grid.column.Template","Fbx.os.lib.FbxUtils","Fbx.os.gui.grid.column.EnumColumn"],statics:{channelsFreq:[2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484],channelsFreq5G:{36:5180,40:5200,44:5220,48:5240,52:5260,56:5280,60:5300,64:5320,100:5500,104:5520,108:5540,112:5560,116:5580,120:5600,124:5620,128:5640,132:5660,136:5680,140:5700}},maxAttenuation:-100,maxSsid:50,autoScroll:!1,layout:"fit",band:"2d4g",setBaseUrl:function(url,rec){var me=this;me.baseUrl=url,me.rec=rec,me.band=rec.raw.config.band,me.loadData()},initComponent:function(){var me=this;me.baseUrl=FbxConf.apiBaseUrl+"wifi/ap/0/";var st=Fbx.os.app.settings.WifiNeighborGraph;if(!st.channelsAssoc){st.channelsAssoc={};for(var i=0;i<st.channelsFreq.length;++i)st.channelsAssoc[st.channelsFreq[i]]=i+1;st.channelsAssoc5G={},st.channels5G=[],st.channelsFqList5G=[];for(var i in st.channelsFreq5G)st.channels5G.push(i),st.channelsFqList5G.push(st.channelsFreq5G[i]),st.channelsAssoc5G[st.channelsFreq5G[i]]=i}me.dataInfoId=Ext.id(),me.flotId=Ext.id(),me.flotLegendId=Ext.id(),me.html='<div id="'+me.dataInfoId+'" class="flot-dataInfo"></div><div class="wifi-flot-placeholder" id="'+me.flotId+'"></div><div class="wifi-flot-legend" id="'+me.flotLegendId+'"></div>',me.callParent(arguments),me.on("boxready",function(){me.dataInfo=$("#"+me.dataInfoId),me.flotPlaceholder=$("#"+me.flotId),me.legendEl=$("#"+me.flotLegendId),$(me.flotPlaceholder).bind("plothover",function(event,pos,item){if(item&&st.channelsAssoc[item.datapoint[0]]){var text="";item.series.label&&(text+=item.series.label+": "),text+=item.datapoint[1]+me.maxAttenuation,item.series.yaxis.options.unit&&(text+=" "+item.series.yaxis.options.unit),me.dataInfo.text(text),me.dataInfo.show();var parentOffset=$(me.flotPlaceholder).offset(),left=item.pageX+5,top=item.pageY-5-me.dataInfo.outerHeight();top<parentOffset.top&&(top=item.pageY+15);var w=me.dataInfo.outerWidth();left+w>parentOffset.left+$(me.flotPlaceholder).width()&&(left=item.pageX-5-w),me.dataInfo.offset({top:top,left:left}),me.dataInfo.css("border-color",item.series.color);me.flot.getOptions().crosshair.color=item.series.color,me.flot.lockCrosshair({x:item.datapoint[0],y:item.datapoint[1]})}else me.dataInfo.hide(),me.flot.clearCrosshair();me.plot()}),me.on("resize",function(){me.plot()}),me.on("show",function(){me.loadData()}),me.loadData()})},dssMask:function(centerChannel,baseLevel){var me=this;return[[centerChannel-25,me.maxAttenuation],[centerChannel-22,baseLevel-50],[centerChannel-22,baseLevel-30],[centerChannel-11,baseLevel-30],[centerChannel-11,baseLevel],[centerChannel,baseLevel],[centerChannel+11,baseLevel],[centerChannel+11,baseLevel-30],[centerChannel+22,baseLevel-30],[centerChannel+22,baseLevel-50],[centerChannel+25,me.maxAttenuation]]},ofdmMask:function(centerChannel,width,baseLevel){var me=this;return[[centerChannel-(width/2+1),me.maxAttenuation],[centerChannel-(width/2+1),baseLevel-20],[centerChannel-(width/2-1),baseLevel],[centerChannel,baseLevel],[centerChannel+width/2-1,baseLevel],[centerChannel+width/2+1,baseLevel-20],[centerChannel+width/2+1,me.maxAttenuation]]},createApPoints:function(ap){var me=this,st=Fbx.os.app.settings.WifiNeighborGraph;if("2d4g"==ap.band)switch(""+ap.channel_width){case"20":var freq=st.channelsFreq[ap.channel-1];return ap.capabilities.legacy?me.dssMask(freq,ap.signal-me.maxAttenuation):me.ofdmMask(freq,20,ap.signal-me.maxAttenuation);case"40":var freq1=st.channelsFreq[ap.channel-1],freq2=st.channelsFreq[ap.secondary_channel-1],center=(freq1+freq2)/2;return me.ofdmMask(center,40,ap.signal-me.maxAttenuation);default:console.warn("unknown channel_width",ap.channel_width)}else{if("5g"==ap.band){var freq=0,width=0;switch(""+ap.channel_width){case"20":freq=st.channelsFreq5G[ap.channel],width=20;break;case"40":var freq1=st.channelsFreq5G[ap.channel],freq2=st.channelsFreq5G[ap.secondary_channel];freq=(freq1+freq2)/2,width=40;break;case"80":var freq1=st.channelsFreq5G[ap.channel],freq2=st.channelsFreq5G[ap.secondary_channel];freq=(freq1+freq2)/2,width=80;break;case"160":var freq1=st.channelsFreq5G[ap.channel],freq2=st.channelsFreq5G[ap.secondary_channel];freq=(freq1+freq2)/2,width=160;break;default:return console.warn("unknown channel_width 5G",ap.channel_width),[]}return me.ofdmMask(freq,width,ap.signal-me.maxAttenuation)}console.warn("unknown band",ap.band)}return[]},loadData:function(){var me=this;Ext.Ajax.request({url:me.baseUrl+"neighbors/",method:"GET",success:function(response){var jsonData=response.jsonData;if(!me.suspendRefresh){var apList=jsonData.result;apList||(apList=[]);var l=apList.sort(function(a,b){return a.bssid>b.bssid?1:-1});apList=[];for(var prev=0,i=0;i<l.length;++i){var ap=l[i],id=parseInt(ap.bssid.replace(/:/g,""),16);id-prev<2?prev=id:(prev=id,apList.push(ap))}apList.sort(function(a,b){return a.signal-b.signal});var max=me.maxSsid;apList.length<me.maxSsid&&(max=apList.length);var count=0;me.plotData=[];for(var i=apList.length-1;i>=0;--i){var ap=apList[i];if(ap.band==me.band){var data=me.createApPoints(ap);if(me.plotData.push({name:ap.ssid,label:ap.ssid,data:data,lines:{fill:.3,lineWidth:1+3*i/apList.length}}),++count>max)break}}me.plot()}}})},plot:function(){var me=this;if(me.flotPlaceholder){if(!me.plotData||!me.plotData.length)return me.flotPlaceholder.html('<div style="text-align: center; padding: 20px; text-color: #666;">Aucune station détectée</div>'),void me.legendEl.hide();var st=Fbx.os.app.settings.WifiNeighborGraph,min="2d4g"==me.band?st.channelsFreq[0]-3:st.channelsFreq5G[36]-3,max="2d4g"==me.band?st.channelsFreq[13]+3:st.channelsFreq5G[140]-3,options={grid:{labelMargin:10,backgroundColor:{colors:["#000","#333"]}},xaxis:{tickLength:0,min:min,max:max,ticks:function(){return"2d4g"==me.band?st.channelsFreq:st.channelsFqList5G},tickFormatter:function(val){return"2d4g"==me.band?"Canal "+st.channelsAssoc[val]:st.channelsAssoc5G[val]}},yaxes:[{tickColor:"#CCC",max:-me.maxAttenuation,min:0,axisLabel:"Atténuation",unit:"dB",tickFormatter:function(val){return val+me.maxAttenuation+" dB"}}],crosshair:{mode:"x",lineWidth:2},legend:{show:!0,container:me.legendEl,noColumns:5}};me.flotPlaceholder.show(),me.legendEl.show(),me.flot=$.plot(me.flotPlaceholder,me.plotData,options),me.flot.lockCrosshair({x:0,y:0}),me.flot.clearCrosshair()}},refresh:function(){this.loadData()}});Ext.define("Fbx.os.gui.grid.column.FileSizeColumnFolder",{extend:"Fbx.os.gui.grid.column.FileSizeColumn",alias:"widget.filesizecolumnfolder",requires:["Ext.util.Format","Fbx.os.lib.FbxUtils"],align:"right",tpl:"<tpl if=\"type != 'dir'\">{[Fbx.os.lib.FbxUtils.fileSize(values.fsize)]}</tpl><tpl if=\"type == 'dir'\">{[values.filecount + values.foldercount]} élément{[values.filecount + values.foldercount > 1 ? 's' : '']}</tpl>"});Ext.define("Fbx.os.app.settings.VpnServerConfigIPSec",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Fbx.os.app.settings.VpnServerModel","Ext.layout.component.FieldSet","Ext.form.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Ext.form.field.Checkbox","Ext.form.field.Number","Ext.data.Store","Ext.form.field.Display","Fbx.os.app.settings.VpnServerOpenVPNUserGrid","Fbx.os.app.settings.domains.DomainModel"],initComponent:function(){var me=this;Ext.applyIf(me,{bodyPadding:10,autoScroll:!0,border:0,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"fieldset",title:me.fieldSetTitle,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",fieldLabel:"Activer",boxLabel:"",name:"enabled",listeners:{change:function(field,newVal){var form=me.getForm();form.findField("port_ike").setDisabled(!newVal),form.findField("port_nat").setDisabled(!newVal),form.findField("conf_ipsec.ike_version").setDisabled(!newVal),me.getComponent("vpn_supported_proto").setDisabled(!newVal)}}},{xtype:"displayfield",fieldLabel:"Version IKE",disabled:!0,ttip:"Version du protocole IKE",name:"conf_ipsec.ike_version"},{xtype:"displayfield",fieldLabel:"Port IKE",disabled:!0,ttip:"Port à utiliser pour la connexion",name:"port_ike"},{xtype:"displayfield",fieldLabel:"Port NAT",disabled:!0,ttip:"Port à utiliser pour le trafic",name:"port_nat"}]},{xtype:"fieldset",itemId:"vpn_supported_proto",title:"Protocoles supportés",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",name:"enable_ipv4",fieldLabel:"IPv4",boxLabel:""},{xtype:"checkboxfield",name:"enable_ipv6",fieldLabel:"IPv6",boxLabel:""}]},{xtype:"fieldset",itemId:"ipsec_psk_authinfo",hidden:!0,title:"Authentification par secret partagé",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"displayfield",fieldLabel:"Id. distant",name:"conf_ipsec.auth_modes.psk.id_custom"},{xtype:"displayfield",fieldLabel:"Id. local",value:"* Votre nom d'utilisateur *"},{xtype:"displayfield",fieldLabel:"Type d'authentification",value:"Aucun"},{xtype:"displayfield",fieldLabel:"Utiliser le certificat",value:"Non"},{xtype:"displayfield",fieldLabel:"Secret",value:"* Votre mot de passe vpn *"}]},{xtype:"fieldset",itemId:"ipsec_need_config",hidden:!0,title:"Authentification par mot de passe",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"container",border:0,padding:10,html:'<div style="text-align: center"><div style="color: red;">Vous devez configurer un nom de domaine personnalisé pour utiliser cette fonction</div><a href="javascript:Fbx.os.core.TaskManager.startApplication(\'Fbx.os.app.settings.domains.DomainWizard\');">Configurer un nom de domaine personnalisé</a></div>'}]},{xtype:"fieldset",itemId:"ipsec_lcert_reap",hidden:!0,title:"Authentification par mot de passe",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"displayfield",fieldLabel:"Serveur",name:"lcert_server"},{xtype:"displayfield",fieldLabel:"Id. distant",name:"lcert_id"},{xtype:"displayfield",fieldLabel:"Id. local",value:"* vide *"},{xtype:"displayfield",fieldLabel:"Type d'authentification",value:"Nom d'utilisateur"},{xtype:"displayfield",fieldLabel:"Nom d'utilisateur",value:"* Votre nom d'utilisateur *"},{xtype:"displayfield",fieldLabel:"Secret",value:"* Votre mot de passe vpn *"}]}]}),me.on("show",function(){me.load()}),me.on("loaded",function(form,data){void 0!==data.max_port&&void 0!==data.min_port&&(data.min_port>500||data.max_port<500||data.min_port>4500||data.max_port<4500)&&Ext.Msg.alert("Service indisponible","Ce service n'est pas disponible sur votre connexion"),me.has_psk=!1,me.has_cert=!1;for(var mode in data.conf_ipsec.auth_modes)switch(mode){case"psk":me.has_psk=!0;break;case"lcert_reap":me.has_cert=!0;break;default:console.warn("need to handle auth mode "+mode)}me.has_cert?(me.getComponent("ipsec_lcert_reap").setVisible(!0),me.getComponent("ipsec_psk_authinfo").setVisible(!1),Fbx.os.app.settings.domains.DomainModel.getDomainsConf(function(cfg){if(cfg.default_domain&&""!=cfg.default_domain){var form=me.getForm(),server=form.findField("lcert_server");form.findField("lcert_id").setValue(cfg.default_domain),server.setValue(cfg.default_domain),me.getComponent("ipsec_need_config").setVisible(!1),me.getComponent("ipsec_lcert_reap").setVisible(!0)}else me.getComponent("ipsec_need_config").setVisible(!0),me.getComponent("ipsec_lcert_reap").setVisible(!1)})):me.has_psk&&(me.getComponent("ipsec_lcert_reap").setVisible(!1),me.getComponent("ipsec_psk_authinfo").setVisible(has_psk))}),me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.WifiNeighbor",{extend:"Ext.grid.Panel",alias:"widget.wifineighbor",requires:["Fbx.os.app.settings.WifiNeighborModel","Ext.grid.column.Template","Fbx.os.lib.FbxUtils","Fbx.os.gui.grid.column.EnumColumn","Ext.data.Store"],setBaseUrl:function(url){var me=this;me.neighborStore.getProxy().url=url+"neighbors/",me.neighborStore.load()},initComponent:function(){var me=this;me.neighborStore=Ext.create("Ext.data.Store",{storeId:"wifiStations",model:"Fbx.os.app.settings.WifiNeighborModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"signal",direction:"DESC"},{property:"bssid",direction:"ASC"}],pageSize:0}),Ext.apply(me,{store:me.neighborStore,viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun point d\'accès détecté</div>'},columns:[{xtype:"templatecolumn",text:"Nom du réseau",dataIndex:"ssid",flex:2,tpl:'<div class="wifi-neighbor">{ssid:htmlEncode}</div>{bssid}'},{xtype:"enumcolumn",text:"Bande Wifi",dataIndex:"band",align:"center",flex:1,strings:{"2d4g":"2.4 GHz","5g":"5 GHz","60g":"60 GHz"}},{xtype:"templatecolumn",text:"Norme",dataIndex:"iconCls",align:"center",width:110,tpl:'<div class="wifi-sprite {iconCls}"></div>'},{xtype:"templatecolumn",text:"Canal Wifi",dataIndex:"channel",flex:1,align:"center",tpl:'{channel} <tpl if="secondary_channel">+ {secondary_channel}</tpl>'},{xtype:"enumcolumn",text:"Largeur de bande",align:"center",dataIndex:"channel_width",strings:{20:"20 MHz",40:"40 MHz",80:"80 MHz",160:"160 MHz"}},{xtype:"templatecolumn",dataIndex:"signal",text:"Signal",tpl:'<div data-qtip="{signal} dB"><tpl if="signal &gt; -36 "><div class="wifi-level-sprite wifi-level-5"></div></tpl><tpl if="signal &lt;= -36 &amp;&amp; signal &gt; -56 "><div class="wifi-level-sprite wifi-level-4"></div></tpl><tpl if="signal &lt;= -56 &amp;&amp; signal &gt; -66 "><div class="wifi-level-sprite wifi-level-3"></div></tpl><tpl if="signal &lt;= -66 &amp;&amp; signal &gt; -76 "><div class="wifi-level-sprite wifi-level-2"></div></tpl><tpl if="signal &lt;= -76"><div class="wifi-level-sprite wifi-level-1"></div></tpl></div>',align:"center",width:60}]}),me.callParent(arguments),me.on("show",function(){me.neighborStore.load()})},refresh:function(){this.neighborStore.load()}});Ext.define("Fbx.ux.form.field.DurationDisplay",{extend:"Fbx.ux.form.field.TemplatedDisplay",alias:"widget.durationdisplayfield",requires:["Fbx.os.lib.FbxUtils"],tpl:"{[Fbx.os.lib.FbxUtils.formatDuration(values.val)]}"});Ext.define("Fbx.os.app.contacts.ContactImportSelect",{extend:"Fbx.os.gui.wizard.WizardStep",title:"Choix des contacts à importer",layout:"fit",requires:["Ext.grid.plugin.CellEditing","Fbx.os.app.contacts.ContactModel","Ext.selection.CheckboxModel","Ext.toolbar.TextItem","Ext.data.ArrayStore","Ext.data.Store","Ext.window.MessageBox","Ext.grid.Panel","Ext.XTemplate"],updateStatus:function(){var me=this,text="Aucun nouveau contact",newCount=me.selModel.getCount(),categories={skip:"contact(s) ignoré(s)",merge:"contact(s) à fusionner",replace:"contact(s) à remplacer"},count={};me.conflictVcardStore.each(function(r){var conflict=r.get("conflict");conflict||(conflict=me.defaultAction),count[conflict]?count[conflict]+=1:count[conflict]=1}),count.both&&(newCount+=count.both),newCount&&(text=newCount+" nouveau(x) contact(s)");for(var i in categories)count[i]&&(text+=" / "+count[i]+" "+categories[i]);me.tbStatus.setText(text)},initComponent:function(){var me=this;this.conflictVcardStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.contacts.ContactModel",sorters:[{property:"display_name",direction:"ASC"}],proxy:{type:"memory",reader:{type:"json",root:"result",messageProperty:"msg"}}}),this.vcardStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.contacts.ContactModel",sorters:[{property:"display_name",direction:"ASC"}],proxy:{type:"memory",reader:{type:"json",root:"result",messageProperty:"msg"}}}),this.selModel=Ext.create("Ext.selection.CheckboxModel",{mode:"SIMPLE",listeners:{selectionchange:function(){me.updateStatus()}}}),this.comboStore=new Ext.data.ArrayStore({fields:["type","label"],data:[["","Défaut"],["skip","Ne pas importer"],["merge","Fusionner"],["replace","Remplacer l'ancien"],["both","Nouveau contact"]]}),this.defaultAction="skip",this.emptyBeforeAdding=!1,this.conflictContactGrid=Ext.create("Ext.grid.Panel",{autoScroll:!0,store:this.conflictVcardStore,dockedItems:[{xtype:"toolbar",dock:"top",items:[{xtype:"tbtext",text:"Action par défaut :"},{xtype:"combo",store:this.comboStore,forceSelection:!0,editable:!1,displayField:"label",valueField:"type",mode:"local",triggerAction:"all",emptyText:"",value:this.defaultAction,listeners:{change:function(combo,value){me.defaultAction=value,me.updateStatus()}}}]}],columns:[{xtype:"templatecolumn",dataIndex:"conflict",text:"Action",tpl:new Ext.XTemplate("{[this.getActionName(values.conflict)]}",{getActionName:function(type){var rec=me.comboStore.findRecord("type",type,0,!1,!1,!0);return rec?rec.get("label"):"Défaut"}}),minWidth:150,flex:1,editor:{xtype:"combo",store:this.comboStore,forceSelection:!0,editable:!1,emptyText:"Défaut",displayField:"label",valueField:"type",mode:"local",lazyRender:!0,listeners:{blur:function(){Ext.defer(function(){me.updateStatus()},200)}}}},{text:"Contact",xtype:"templatecolumn",dataIndex:"display_name",minWidth:150,tpl:"<tpl if=\"display_name != ''\">{display_name:htmlEncode} <br /></tpl>{first_name:htmlEncode} {last_name:htmlEncode}<br /><tpl if=\"company != ''\">{company:htmlEncode} <br /></tpl>",flex:1},{text:"Téléphone",xtype:"templatecolumn",dataIndex:"numbers",tpl:'<tpl for="numbers">&bull; {number:htmlEncode}<br /></tpl>',minWidth:150,flex:1},{text:"Email",xtype:"templatecolumn",dataIndex:"emails",tpl:'<tpl for="emails">&bull; {email:htmlEncode}<br /></tpl>',minWidth:200,flex:1},{text:"Adresse",xtype:"templatecolumn",dataIndex:"addresses",tpl:'<tpl for="addresses">&bull; {number:htmlEncode} {street:htmlEncode} <br />  <tpl if="street2 != \'\'">{street2:htmlEncode} <br /></tpl>  {zipcode:htmlEncode} {city:htmlEncode} <br />  {country:htmlEncode}<br /></tpl>',minWidth:250,flex:1}],plugins:[Ext.create("Ext.grid.plugin.CellEditing",{clicksToEdit:1})]}),this.contactGrid=Ext.create("Ext.grid.Panel",{autoScroll:!0,store:this.vcardStore,dockedItems:[{xtype:"toolbar",dock:"top",items:[{xtype:"tbtext",text:"Séléctionner les contacts :"},{xtype:"button",text:"Tous",handler:function(){me.selModel.selectAll()}},{xtype:"button",text:"Aucun",handler:function(){me.selModel.deselectAll()}},{xtype:"button",text:"Avec numéro de téléphone",handler:function(){var recs=[];me.vcardStore.each(function(record){record.raw.numbers&&record.raw.numbers.length&&Ext.Array.push(recs,record)}),recs.length&&me.selModel.select(recs,!0)}}]}],selModel:this.selModel,columns:[{text:"Contact",xtype:"templatecolumn",dataIndex:"display_name",minWidth:150,tpl:"<tpl if=\"display_name != ''\">{display_name:htmlEncode} <br /></tpl>{first_name:htmlEncode} {last_name:htmlEncode}<br /><tpl if=\"company != ''\">{company:htmlEncode} <br /></tpl>",flex:1},{text:"Téléphone",xtype:"templatecolumn",dataIndex:"numbers",tpl:'<tpl for="numbers">&bull; {number:htmlEncode}<br /></tpl>',minWidth:150,flex:1},{text:"Email",xtype:"templatecolumn",dataIndex:"emails",tpl:'<tpl for="emails">&bull; {email:htmlEncode}<br /></tpl>',minWidth:200,flex:1},{text:"Adresse",xtype:"templatecolumn",dataIndex:"addresses",tpl:'<tpl for="addresses">&bull; {number:htmlEncode} {street:htmlEncode} <br />  <tpl if="street2 != \'\'">{street2:htmlEncode} <br /></tpl>  {zipcode:htmlEncode} {city:htmlEncode} <br />  {country:htmlEncode}<br /></tpl>',minWidth:250,flex:1}]}),me.tbStatus=Ext.create("Ext.toolbar.TextItem",{text:"Aucun contact selectionné"}),Ext.applyIf(me,{items:[{xtype:"tabpanel",layout:"fit",activeTab:0,items:[me.conflictContactGrid,me.contactGrid],bbar:["->",this.tbStatus]}]}),this.callParent(arguments)},loadContacts:function(vcards){var records=[],conflicts=[];for(var i in vcards){var vcard=vcards[i];vcard.conflict="",vcard.duplicate&&!this.emptyBeforeAdding?conflicts.push(vcard):records.push(vcard)}if(this.conflictContactGrid.setTitle("Conflits ("+conflicts.length+")"),conflicts.length?(this.conflictContactGrid.setDisabled(!1),this.conflictVcardStore.loadRawData(conflicts,!1)):(this.conflictContactGrid.setDisabled(!0),this.conflictVcardStore.removeAll()),this.contactGrid.setTitle("Nouveaux ("+records.length+")"),records.length?(this.contactGrid.setDisabled(!1),this.vcardStore.loadRawData(records,!1)):(this.contactGrid.setDisabled(!0),this.vcardStore.removeAll()),records.length&&!conflicts.length){var panel=this.contactGrid.up("tabpanel");panel&&panel.setActiveTab(1)}this.updateStatus()},canGoNext:function(){var me=this,wizard=this.up("wizard"),contacts=[],selected=this.selModel.getSelection();for(var i in selected)delete selected[i].raw.conflict,delete selected[i].raw.duplicate,contacts.push(selected[i].raw);this.conflictVcardStore.each(function(record){var action=record.get("conflict");action&&""!=action||(action=me.defaultAction),"skip"!=action&&(record.raw.conflict=action,contacts.push(record.raw))});var waitMsg=Ext.create("Ext.window.MessageBox");return waitMsg.wait("Import en cours ...","Merci de patienter"),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"contact/import/step2/",jsonData:{emptyBeforeAdding:this.emptyBeforeAdding,contacts:contacts},success:function(response,opts){var result=response.jsonData.result;waitMsg.close();var msg="Import terminé<br />";result.added&&(msg+="- "+result.added+" contact(s) ajouté(s)<br />"),result.merged&&(msg+="- "+result.merged+" contact(s) mis à jour<br />"),result.replaced&&(msg+="- "+result.replaced+" contact(s) remplacé(s)<br />"),result.errors&&(msg+="- "+result.errors+" erreur(s) lors de l'import<br />"),Ext.Msg.alert("Import terminé",msg),wizard.goToNext(!0),Ext.getStore("contactStore").load()},failure:function(response,opts){waitMsg.close(),Ext.Msg.alert("Erreur",response)}}),!1}});Ext.define("Fbx.os.app.settings.ExpModuleStatus",{extend:"Ext.form.FieldSet",alias:"widget.expmodulestatus",requires:["Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.EnumDisplay","Ext.form.field.Display"],initComponent:function(){var me=this;Ext.applyIf(me,{flex:1,margin:"0 5",xtype:"fieldset",defaults:{labelWidth:200,anchor:"100%"},title:"Module "+(me.module_id+1),items:[{xtype:"templateddisplayfield",fieldLabel:"Présence",name:"expansions."+me.module_id+".present",tpl:'<tpl if="values.val"><span style="color: green;">Module présent</span></tpl><tpl if="!values.val"><span style="color: red;">Module absent</span></tpl>'},{xtype:"templateddisplayfield",fieldLabel:"Supporté",name:"expansions."+me.module_id+".supported",ttip:"Si votre module est marqué comme non supporté, vérifiez que vous l'avez introduit dans le bon emplacement",tpl:'<tpl if="values.val"><span style="color: green;">Oui</span></tpl><tpl if="!values.val"><span style="color: red;">Non supporté</span></tpl>'},{xtype:"enumdisplayfield",fieldLabel:"Type de module",name:"expansions."+me.module_id+".type",strings:{unknown:"Inconnu",dsl_lte:"xDSL + 4G",dsl_lte_external_antennas:"xDSL + 4G avec antennes externes",ftth_p2p:"FTTH P2P",ftth_pon:"FTTH PON",security:"Sécurité / Alarme"}},{xtype:"displayfield",fieldLabel:"Numéro de série",name:"expansions."+me.module_id+".bundle"}]}),this.callParent(arguments)},updateDisplay:function(form,values){var me=this,present=values[me.module_id].present,names=["supported","type","bundle"];for(var i in names){var fname="expansions."+me.module_id+"."+names[i],f=form.findField(fname);f&&f.setVisible(present)}}});Ext.define("Fbx.os.app.downloader.RssItemsGrid",{extend:"Fbx.ux.grid.CtxMenuGrid",alias:"widget.rssItemsGrid",requires:["Fbx.os.app.downloader.RssFeedItemModel","Ext.menu.Menu","Ext.grid.column.Boolean","Ext.grid.column.Date","Fbx.ux.grid.plugin.DragSelector","Fbx.os.gui.grid.column.FileSizeColumn","Ext.data.Store"],initComponent:function(){var me=this;me.rssItemsStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.downloader.RssFeedItemModel",remoteSort:!1,remoteFilter:!0,sorters:[{property:"fetch_ts",direction:"DESC"}],listeners:{write:function(s,r){s.reload()}}}),Ext.applyIf(me,{stateId:"rssitemgrid",selModel:{mode:"MULTI"},store:me.rssItemsStore,columns:[{xtype:"booleancolumn",dataIndex:"is_read",text:"Non Lu",width:30,falseText:'<div class="btn-bullet-blue"> </div>',trueText:'<div class="btn-bullet-white"> </div>'},{xtype:"booleancolumn",dataIndex:"is_downloaded",text:"Téléchargé",width:30,falseText:"",trueText:"&#10003;"},{xtype:"templatecolumn",text:"Titre",dataIndex:"pretty_name",tpl:'<tpl if="link">  <div class="rss-item-title"><a target="_blank" href="{link:htmlEncode}">{pretty_name:htmlEncode}</a></div></tpl><tpl if="!link"><div class="rss-item-title">{pretty_name:htmlEncode}</div></tpl><div class="rss-item-desc">{desc:htmlEncode}</div><tpl if="author">  <div class="rss-item-author">Auteur : {author:htmlEncode}</div></tpl><tpl if="enclosure_length">  <div class="rss-item-size">Taille : {[Fbx.os.lib.FbxUtils.fileSize(values.enclosure_length)]}</div></tpl>',flex:3},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-move-down",tooltip:"Télécharger",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);me.donwloadRec(rec)}}]},{xtype:"datecolumn",dataIndex:"pub_ts",text:"Date d'ajout",format:"d/m/Y H:i:s",flex:1}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Sélectionnez un flux RSS</div>',getRowClass:function(record,rowIndex,rowParams,store){return record.get("is_read")?"":"row-unread"}},plugins:[Ext.create("Fbx.ux.grid.plugin.DragSelector",{})]}),this.callParent(arguments),me.on("cellclick",function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){var col=me.columns[cellIndex];if(col&&"is_read"==col.dataIndex){var is_read=record.get("is_read");record.updateReadStatus(!is_read)}}),me.on("itemdblclick",function(grid,record,item,index,e,eOpts){me.donwloadRec(record)})},doDownloadRec:function(rec){var me=this;rec.download(),rec.updateReadStatus(!0,!0),setTimeout(function(){me.rssItemsStore.load()},1500)},donwloadRec:function(rec){var me=this;rec.get("is_downloaded")?Ext.Msg.confirm("Téléchargement","Êtes-vous sûr de vouloir télécharger à nouveau "+Ext.String.htmlEncode(rec.get("pretty_name"))+" ?",function(btn){"yes"==btn&&me.doDownloadRec(rec)}):me.doDownloadRec(rec)},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Télécharger cet élément",iconCls:"btn-feed-go",handler:function(){var records=me.getSelectedRecord();for(var i in records)records[i].download();setTimeout(function(){me.rssItemsStore.load()},1500)}},{text:"Marquer comme lu",iconCls:"btn-bullet-white",handler:function(){var records=me.getSelectedRecord();for(var i in records)records[i].updateReadStatus(!0,!0);me.rssItemsStore.sync()}},{text:"Marquer comme non lu",iconCls:"btn-bullet-blue",handler:function(){var records=me.getSelectedRecord();for(var i in records)records[i].updateReadStatus(!1,!0);me.rssItemsStore.sync()}}],listeners:{beforeshow:function(menu){if(!me.getSelectedRecord())return!1}}})),me.contextMenu}});Ext.define("Fbx.os.app.contacts.ContactImport",{extend:"Fbx.os.gui.wizard.Wizard",requires:["Ext.tab.Panel","Ext.form.RadioGroup","Ext.form.field.Radio","Fbx.os.app.contacts.ContactImportSelect","Fbx.ux.form.field.File","Fbx.os.gui.wizard.WizardStep"],width:600,title:"Import de contacts",modal:!0,initComponent:function(){var me=this;me.steps=[{xtype:"wizardStep",title:"Choix d'un fichier",items:[{xtype:"form",bodyPadding:10,height:"100%",defaults:{allowBlank:!1},items:[{xtype:"ux_filefield",fieldLabel:"Fichier",emptyText:"Sélectionnez un fichier",name:"file",anchor:"100%"},{xtype:"radiogroup",allowBlank:!1,fieldLabel:"Format",defaults:{flex:1},items:[{boxLabel:"vcard (vcf)",name:"format",inputValue:"vcard",checked:!0},{boxLabel:"ldif",name:"format",inputValue:"ldif"},{boxLabel:"csv",name:"format",inputValue:"csv"}]},{xtype:"checkbox",labelWidth:300,fieldLabel:"Supprimer tous les contacts avant l'import",name:"removeall",checked:!1},{xtype:"hidden",name:"csrf_token",value:FbxConf.csrfToken}]}],canGoNext:function(){var form=this.down("form").getForm(),wizard=this.up("wizard");form.isValid()&&form.submit({url:FbxConf.apiBaseUrl+"contact/import/step1/",waitTitle:"Merci de patienter",waitMsg:"Import en cours ...",success:function(f,action){var res,response=Ext.htmlDecode(action.response.responseText);try{res=Ext.JSON.decode(response)}catch(e){return void Ext.Msg.alert("Erreur","Impossible de décoder la réponse du serveur")}if(!res.result.stats.nb_contact)return void Ext.defer(function(){Ext.Msg.alert("Aucun contact","Aucun contact à importer, "+res.result.stats.nb_line_skipped+" lignes ignorées")},250);var contacts=res.result.contacts,values=form.getValues();wizard.goToNext(!0),"on"==values.removeall?wizard.steps[1].emptyBeforeAdding=!0:wizard.steps[1].emptyBeforeAdding=!1,wizard.steps[1].loadContacts(contacts)},failure:function(form,action){Ext.Msg.alert("Failed",action.result.msg)}})}},Ext.create("Fbx.os.app.contacts.ContactImportSelect")],me.callParent(arguments)}});Ext.define("Fbx.os.app.lanbrowser.HostInfosWin",{extend:"Ext.window.Window",requires:["Fbx.ux.form.AjaxFormPanel","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.DateDisplay","Ext.grid.Panel","Ext.grid.column.Boolean","Ext.form.field.Display","Ext.grid.column.Template","Ext.form.FieldContainer","Fbx.os.gui.grid.column.EnumColumn","Ext.form.field.ComboBox","Ext.data.ArrayStore","Ext.button.Button"],width:500,height:470,title:"",closeAction:"destroy",resizable:!1,preventReload:!1,initComponent:function(){var me=this;me.nameGrid=Ext.create("Ext.grid.Panel",{title:"Noms",disableSelection:!0,flex:1,border:0,anchor:"100%",store:Ext.create("Ext.data.ArrayStore",{model:"Fbx.os.app.lanbrowser.HostName"}),columns:[{text:"Nom",flex:2,dataIndex:"name"},{xtype:"enumcolumn",text:"Source du nom",flex:1,dataIndex:"source",strings:{dhcp:"DHCP",netbios:"Netbios",mdns:"mDNS",upnp:"UPnP"}}],bodyStyle:{border:0},viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center;">Aucun nom disponible</div>'}}),me.conGrid=Ext.create("Ext.grid.Panel",{title:"Connectivité",disableSelection:!0,flex:1,border:0,anchor:"100%",store:Ext.create("Ext.data.ArrayStore",{model:"Fbx.os.app.lanbrowser.HostConnection"}),columns:[{text:"Adresse",dataIndex:"addr",flex:1},{xtype:"templatecolumn",text:"Joignable",dataIndex:"last_time_reachable",tpl:'<tpl if="reachable">Joignable</tpl><tpl if="!reachable">Injoignable depuis <br /> {[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(new Date(values.last_time_reachable*1000))]}</tpl>',flex:1},{xtype:"templatecolumn",text:"Dernière activité",dataIndex:"active",tpl:'<tpl if="active">Actif</tpl><tpl if="!active">Inactif depuis <br /> {[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(new Date(values.last_activity*1000))]}</tpl>',flex:1}],bodyStyle:{border:0},viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center;">Aucunne connexion disponible</div>'}}),me.nameCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Nom principal",labelWidth:200,allowBlank:!1,store:Ext.create("Ext.data.ArrayStore",{fields:[{name:"name",type:"string"}]}),queryMode:"local",displayField:"name",valueField:"name",name:"primary_name",listeners:{focus:function(){me.preventReload=!0},blur:function(field){field.isDirty()||(me.preventReload=!1)}}}),me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{title:"Propriétés",showApplyCancel:!1,showOkBtn:!1,bodyPadding:10,defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"templateddisplayfield",fieldLabel:"",labelWidth:1,editable:!1,name:"icon_name",tpl:'<div class="lan-host-img lan-{icon_name}" style="height: 60px; margin: 0px;"></div>'},me.nameCombo,{xtype:"combo",editable:!1,forceSelection:!0,name:"host_type",fieldLabel:"Type de périphérique",store:Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[["workstation","Ordinateur Fixe"],["laptop","Ordinateur Portable"],["smartphone","Smartphone"],["tablet","Tablette"],["printer","Imprimante"],["vg_console","Console de jeux"],["television","Télévision"],["nas","NAS"],["ip_camera","Caméra IP"],["ip_phone","Téléphone IP"],["freebox_player","Freebox Player"],["freebox_hd","Freebox HD"],["freebox_mini","Freebox Mini"],["freebox_delta","Freebox Delta"],["networking_device","Périphérique réseau"],["multimedia_device","Périphérique multimédia"],["other","Autre"]]}),listConfig:{getInnerTpl:function(){return'<div>  <div class="btn-sprite btn-host-{type}" style="float: left;"></div>&nbsp;&nbsp;  {label}  <div style="clear: both;"></div></div>'}},displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,listeners:{focus:function(){me.preventReload=!0},blur:function(field){field.isDirty()||(me.preventReload=!1)}}},{xtype:"displayfield",fieldLabel:"Adresse MAC",name:"l2ident.id",value:""},{xtype:"displayfield",fieldLabel:"Constructeur",name:"vendor_name",value:""},{xtype:"templateddisplayfield",fieldLabel:"Joignable",name:"reachable",value:"",tpl:'<tpl if="val &amp;&amp; val != \'false\'">Oui</tpl><tpl if="!val || val == \'false\'">Non   <tpl if="last_time_reachable"> depuis <br /> {[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(new Date(values.last_time_reachable*1000))]}</tpl>  <tpl if="!last_time_reachable"> (Jamais)</tpl></tpl>'}],listeners:{dirtychange:function(form,dirty,eOpts){me.btnApply.setDisabled(!dirty)},validitychange:function(form,valid,eOpts){me.btnOk.setDisabled(!valid)},saved:function(f,recData){me.preventReload=!1,me.record&&me.record.store&&me.record.store.reload();var rec=Fbx.os.app.lanbrowser.HostModel.create(recData);me.setRecord(rec)}},getRecord:function(){return me.record}}),me.btnApply=Ext.create("Ext.button.Button",{text:"Appliquer",disabled:!0,iconCls:"btn-save",handler:function(){me.form.submitForm(!1)}}),me.btnOk=Ext.create("Ext.button.Button",{text:"OK",iconCls:"btn-accept",handler:function(){me.form.submitForm(!0)}}),Ext.applyIf(me,{layout:"fit",items:[{xtype:"tabpanel",items:[me.form,me.nameGrid,me.conGrid]}],buttons:[me.btnOk,me.btnApply,{text:"Annuler",iconCls:"btn-cancel",disabled:!1,formBind:!0,handler:function(){me.form.getForm().reset(),me.close()}}]}),me.callParent(arguments),me.on("boxready",function(){if(me.record){var rec=me.record;me.record=null,me.setRecord(rec)}})},nameList:[],loadById:function(id){var me=this;Fbx.os.app.lanbrowser.HostModel.load(id,{success:function(rec){me.setRecord(rec)}})},setRecord:function(record){var me=this;if(!me.record||me.record!=record){me.record=record,me.form.url=FbxConf.apiBaseUrl+"lan/browser/"+record.get("interface")+"/"+record.getId(),me.setTitle("Propriétés de "+record.get("primary_name"));var data=record.getData();me.preventReload||me.form.setValues(data),me.nameGrid.reconfigure(record.names()),me.conGrid.reconfigure(record.l3connectivities());var nameStore=record.names(),names={},nameList=[];nameStore.each(function(r){var name=r.get("name");names[name]||(Ext.Array.push(nameList,{name:name}),names[name]=!0)}),nameList.length!=me.nameList.length&&(me.nameCombo.getStore().loadData(nameList),me.nameList=nameList)}}});Ext.define("Fbx.os.app.settings.VpnServerConnGrid",{extend:"Fbx.ux.grid.RefreshGrid",requires:["Fbx.os.app.settings.VpnServerConnModel","Ext.grid.column.Action","Ext.grid.column.Boolean","Fbx.ux.form.field.SizeDisplay","Fbx.ux.form.field.DateDisplay","Ext.data.Store","Ext.menu.Menu"],initComponent:function(){var me=this;me.store=Ext.create("Ext.data.Store",{storeId:"vpnConnStore",model:"Fbx.os.app.settings.VpnServerConnModel",remoteSort:!1,remoteFilter:!1,pageSize:0,autoload:!0}),Ext.applyIf(me,{store:me.store,bodyPadding:0,columns:[{xtype:"templatecolumn",text:"Utilisateur",dataIndex:"user",flex:3,tpl:'<div class="vpn-conn"><div class="vpn-user">{user:htmlEncode}</div><div class="vpn-state" style="color: gray; font-style: italic; font-size: 12px;">Etat:   <tpl if="authenticated">Authentifié</tpl>  <tpl if="!authenticated">En attente d\'authentification</tpl> ({[Fbx.os.app.settings.VpnServerModel.vpnPrettyNames[values.vpn]]})</div></div>'},{xtype:"templatecolumn",dataIndex:"rx_bytes",text:"Transféré",width:160,tpl:"Reçu : {[Fbx.os.lib.FbxUtils.fileSize(values.rx_bytes)]}<br />Émis : {[Fbx.os.lib.FbxUtils.fileSize(values.tx_bytes)]}<br />"},{xtype:"templatecolumn",text:"IP Source",dataIndex:"src_ip",flex:2,tpl:"{src_ip}:{src_port}"},{text:"IP Locale",dataIndex:"local_ip",flex:2},{xtype:"templatecolumn",text:"Date de connexion",dataIndex:"auth_time",tpl:'{[Fbx.os.lib.FbxUtils.getParisMoment(values.auth_time * 1000).format("DD/MM/YYYY à HH:mm:ss")]}',flex:3},{xtype:"actioncolumn",hideable:!1,width:30,items:[{iconCls:"btn-disconnect",tooltip:"Déconnecter",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);me.disconnectConfirm(rec)}}]}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucunne connexion active</div>'}}),me.callParent(arguments)},getCtxMenu:function(){var me=this;return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-disconnect",text:"Déconnecter l'utilisateur",handler:function(){var records=me.getSelectedRecord(),rec=records[0];me.disconnectConfirm(rec)}}],listeners:{beforeshow:function(){return me.getSelectedRecord().length>0}}})),me.ctxMenu},disconnectConfirm:function(rec){Ext.MessageBox.confirm("Déconnecter","Voulez-vous déconnecter cet utilisateur ?",function(btn){"yes"==btn&&rec.destroy()})}});Ext.define("Fbx.os.app.settings.WifiRadar",{extend:"Ext.tab.Panel",alias:"widget.wifiradar",requires:["Fbx.os.app.settings.WifiNeighbor","Fbx.os.app.settings.WifiNeighborGraph","Fbx.os.app.settings.WifiChannelGraph","Fbx.os.app.settings.WifiNeighborModel"],useV2:!1,waitForScanComplete:function(){var me=this;Ext.Ajax.request({url:me.baseUrl,autorefresh:!0,method:"GET",success:function(response,opts){var data=response.jsonData.result;"scanning"==data.status.state&&(me.scanStarted=!0),"scanning"!=data.status.state&&me.scanStarted?(me.setLoading(!1),me.refresh()):setTimeout(function(){me.waitForScanComplete()},1e3)},failure:function(){me.setLoading(!1),setTimeout(function(){me.waitForScanComplete()},1e3)}})},setRecord:function(rec){var me=this;me.baseUrl=FbxConf.apiBaseUrl+"wifi/ap/"+rec.getId()+"/",me.useV2=!0,me.items.each(function(it){it.setBaseUrl&&it.setBaseUrl(me.baseUrl,rec)})},initComponent:function(){var me=this;me.baseUrl=FbxConf.apiBaseUrl+"wifi/ap/0/",Ext.applyIf(me,{autoScroll:!1,defaults:{bodyPadding:10},items:[{itemId:"wifineighbor",xtype:"wifineighbor",title:"Bornes voisines",bodyPadding:0},{itemId:"wifineighborgraph",xtype:"wifineighborgraph",title:"Occupation Canaux Wi-Fi"},{itemId:"wifichannelgraph",xtype:"wifichannelgraph",title:"Canaux"}],buttons:["->",{xtype:"button",text:"Relancer un scan Wi-Fi",handler:function(){Ext.Msg.confirm("Scan Wi-Fi","Attention, votre réseau Wi-Fi sera inaccessible pendant le scan Wi-Fi !<br />Voulez-vous continuer ?",function(btn){"yes"==btn&&(me.setLoading("Scan Wi-Fi en cours"),Ext.Ajax.request({url:me.baseUrl+"neighbors/scan/",method:"POST",success:function(response,opts){me.scanStarted=!1,me.waitForScanComplete()},failure:function(){me.setLoading(!1)}}))})}}]}),me.on("show",function(){me.refresh()}),me.callParent(arguments)},refresh:function(){var me=this,tab=me.getActiveTab();tab.refresh&&tab.refresh()}});Ext.define("Fbx.ux.toolbar.PathToolbar",{extend:"Ext.container.Container",requires:["Fbx.ux.toolbar.ButtonPathToolbar","Fbx.ux.toolbar.ComboPathToolbar"],alias:"widget.pathtoolbar",curPath:"",showButtons:!0,initComponent:function(){var me=this;me.comboTb=Ext.create("Fbx.ux.toolbar.ComboPathToolbar",{hidden:me.showButtons,listeners:{pathchanged:function(newPath){me.setPath(newPath),me.fireEvent("pathchanged",me.curPath)},toggleview:function(){me.comboTb.hide(),me.buttonTb.show()}},viewConfig:{loadMask:!1}}),me.buttonTb=Ext.create("Fbx.ux.toolbar.ButtonPathToolbar",{items:[""],hidden:!me.showButtons,listeners:{pathchanged:function(newPath){me.setPath(newPath),me.fireEvent("pathchanged",me.curPath)},toggleview:function(){me.buttonTb.hide(),me.comboTb.show()}}}),me.items=[me.comboTb,me.buttonTb],me.callParent(arguments),me.addEvents("pathchanged"),this.mon(Fbx.os.gui.Environment,"filemoved",function(changes){Ext.Array.each(changes,function(c){var p=Fbx.os.lib.FbxUtils.base64_decode(me.curPath),f=Fbx.os.lib.FbxUtils.base64_decode(c.from),t=Fbx.os.lib.FbxUtils.base64_decode(c.to);if(0==(p+"/").indexOf(f+"/")){var updatedPath=p.replace(f,t);return me.setPath(Fbx.os.lib.FbxUtils.base64_encode(updatedPath)),!1}})}),this.mon(Fbx.os.gui.Environment,"filedeleted",function(changes){Ext.Array.each(changes,function(c){var p=Fbx.os.lib.FbxUtils.base64_decode(me.curPath);if(0==(p+"/").indexOf(Fbx.os.lib.FbxUtils.base64_decode(c.from)+"/")){var parent=p.replace(/\/[^\/]+$/,"");return me.setPath(Fbx.os.lib.FbxUtils.base64_encode(parent)),!1}})})},setPath:function(newPath){var me=this;newPath!=me.curPath&&(me.curPath=newPath,me.buttonTb.setPath(newPath),me.comboTb.setPath(newPath))}});Ext.define("Fbx.os.app.downloader.BtPeerGrid",{extend:"Fbx.ux.grid.RefreshGrid",alias:"widget.btpeergrid",requires:["Fbx.os.app.downloader.BtPeerModel","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Boolean","Ext.grid.column.Number","Ext.grid.column.Template","Fbx.os.gui.grid.column.FileSizeColumn","Fbx.os.gui.grid.column.TransferSpeedColumn","Fbx.os.gui.grid.column.PercentColumn","Fbx.os.app.downloader.BtBlacklistModel","Ext.data.Store","Ext.menu.Menu"],suspendRefresh:!0,initComponent:function(){var me=this;me.trackerStore=Ext.create("Ext.data.Store",{remoteSort:!1,remoteFilter:!0,model:"Fbx.os.app.downloader.BtPeerModel"}),Ext.applyIf(me,{stateId:"btpeergrid",selModel:{mode:"MULTI"},store:me.trackerStore,columns:[{xtype:"templatecolumn",dataIndex:"country_code",tpl:'<div class="flags-{country_code:lowercase}" title="{country_code}"> </div>',width:30},{xtype:"templatecolumn",dataIndex:"host",text:"Hôte",tpl:'<div class="download-peer-title">{host}:{port}</div><div class="download-peer-client">Client : {client:htmlEncode}</div>',flex:3},{xtype:"templatecolumn",text:"Statut",dataIndex:"state",tpl:'<div class="dl-peer-{state}" title="{state:htmlEncode}"></div>',width:30},{xtype:"transferspeedcolumn",dataIndex:"rx_rate",text:"Vitesse RX",flex:1},{xtype:"transferspeedcolumn",dataIndex:"tx_rate",text:"Vitesse TX",flex:1},{xtype:"templatecolumn",dataIndex:"rx",text:"Échangé",tpl:"<div>Reçu : {[Fbx.os.lib.FbxUtils.fileSize(values.rx)]}</div><div>Envoyé : {[Fbx.os.lib.FbxUtils.fileSize(values.tx)]}</div>",width:100},{xtype:"percentcolumn",text:"Progression du pair",dataIndex:"progress",width:120},{xtype:"templatecolumn",text:"Informations",dataIndex:"origin",tpl:"<div>Origine : {[Fbx.os.app.downloader.BtPeerModel.btOrigin[values.origin]]}</div><div>Protocole : {[Fbx.os.app.downloader.BtPeerModel.btProto[values.protocol]]}</div>",flex:2},{xtype:"numbercolumn",dataIndex:"score",text:"Score"}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Sélectionnez un téléchargement bittorrent</div>'}}),this.callParent(arguments)},blacklistPeers:function(duration){var me=this,records=me.getSelectedRecord();for(var i in records){Fbx.os.app.downloader.BtBlacklistModel.create({host:records[i].get("host"),expire:duration}).save()}},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Bloquer ce pair",iconCls:"btn-access-denied",hideOnClick:!1,menu:{items:[{text:"Bloquer 5 minutes",iconCls:"btn-access-denied",handler:function(){me.blacklistPeers(300)}},{text:"Bloquer 15 minutes",iconCls:"btn-access-denied",handler:function(){me.blacklistPeers(900)}},{text:"Bloquer 1 heure",iconCls:"btn-access-denied",handler:function(){me.blacklistPeers(3600)}},{text:"Bloquer 24 heures",iconCls:"btn-access-denied",handler:function(){me.blacklistPeers(86400)}}]}}]})),me.contextMenu}});Ext.define("Fbx.os.gui.panel.ExternalDiskStatus",{extend:"Ext.container.Container",requires:["Ext.data.Store","Ext.data.Request","Ext.button.Button","Fbx.os.app.settings.storage.DiskModel","Ext.menu.Menu"],ejectPartition:function(p){var me=this;Ext.Msg.confirm("Ejection du disque","Voulez-vous éjecter ce disque ?",function(btn){"yes"==btn&&p.umount(function(kk,op){me.store.isLoading()||me.store.load(),op.success&&Ext.Msg.alert("Ejection","Vous pouvez maintenant retirer ce disque en toute sécurité")})})},updateMenu:function(partitions,freePct){var me=this;if(0==partitions.length&&freePct>10)return void me.hide();me.diskFullBtn.setVisible(freePct<10),me.ejectBtn.setVisible(partitions.length>0),me.show(),me.menu.removeAll(),Ext.Array.each(partitions,function(p){me.menu.add({text:p.get("label"),iconCls:"btn-control-eject-blue",handler:function(){me.ejectPartition(p)}})})},constructor:function(config){var me=this;me.menu=Ext.create("Ext.menu.Menu",{items:[]}),me.store=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.storage.DiskModel",listeners:{load:function(store,records){var partitions=[],freePct=100;Ext.Array.each(records,function(d){if("internal"==d.get("type")){var p=d.partitionsStore.first();p&&(freePct=100*p.get("free_bytes")/(p.get("free_bytes")+p.get("used_bytes")))}else"enabled"==d.get("state")&&d.partitionsStore.each(function(p){"mounted"==p.get("state")&&Ext.Array.push(partitions,p)})}),me.updateMenu(partitions,freePct)}}}),me.diskFullBtn=Ext.create("Ext.button.Button",{xtype:"button",scale:"large",width:40,height:40,margin:4,border:"0",style:{background:"none"},pressedCls:"",arrowCls:"",focusCls:"",menuActiveCls:"",iconCls:"btn-32-disk-full",tooltip:"Votre disque dur est presque plein !",handler:function(){},hidden:!0}),me.ejectBtn=Ext.create("Ext.button.Button",{scale:"large",width:40,height:40,margin:4,border:"0",style:{background:"none"},pressedCls:"",arrowCls:"",focusCls:"",menuActiveCls:"",iconCls:"btn-32-usb",menu:me.menu}),config=Ext.apply(config,{ariaLbl:"Ejecter un disque externe",layout:{type:"vbox",align:"stretch"},items:[me.ejectBtn,me.diskFullBtn],listeners:{boxready:function(){me.store.load()},afterrender:function(btn){btn.el.dom.setAttribute("role","button")}}}),config.vertical||(config.layout.type="hbox"),this.callParent([config]),Fbx.os.gui.Environment.registerNotif("storage","partition_state_changed",this,function(){me.store.load()})},beforedestroy:function(){Fbx.os.gui.Environment.unregisterNotif(this),this.callParent()}});Ext.define("Fbx.os.app.settings.storage.RaidMemberList",{extend:"Fbx.ux.grid.RefreshGrid",alias:"widget.storageraidmemberlist",requires:["Fbx.os.gui.grid.column.FileSizeColumn","Ext.data.ArrayStore","Fbx.os.app.settings.storage.RaidMemberModel"],fsOpCb:function(r,success){var me=this;success||(r.dirty=!1,me.store.load())},initComponent:function(){var me=this;me.store=Ext.create("Ext.data.ArrayStore",{model:"Fbx.os.app.settings.storage.RaidMemberModel",storeId:"storageRaidMemberStore",listeners:{load:function(){var selModel=me.raidList.getSelectionModel();if(!selModel.hasSelection()){var first=me.store.first();first&&selModel.select(first,!1)}}}}),Ext.applyIf(me,{store:me.store,selModel:{mode:"SINGLE"},hideHeaders:!0,columns:[{dataIndex:"active_device",width:25},{xtype:"templatecolumn",width:40,tpl:'<div class="storage-sprite storage-raid-{icon_type}" style="float: left;"></div>'},{xtype:"templatecolumn",dataIndex:"id",flex:1,tpl:'<div class="storage-disk"><div class="storage-disk-title">{disk_serial:htmlEncode}</div><div class="storage-disk-state">&bull; État: <span class="{display_cls}">{role_str:htmlEncode}</span></div><div class="storage-disk-pos">&bull; Modèle: {disk_model}</div></div>'},{xtype:"templatecolumn",dataIndex:"pretty_device_location",text:"Emplacement",tpl:'<span class="{display_cls}">{pretty_device_location:htmlEncode}</span>',flex:1},{xtype:"filesizecolumn",text:"Taille",dataIndex:"total_bytes",width:60}],viewConfig:{loadMask:!0,emptyText:'<div style="text-align: center; padding: 10px">Aucun Membre dans l\'array RAID</div>'}}),this.callParent(arguments)}});Ext.define("Fbx.os.app.epg.EpgComponent",{extend:"Fbx.os.app.epg.EpgCommon",requires:["Fbx.os.app.tv.ChannelDb","Fbx.os.lib.FbxUtils"],initComponent:function(){var me=this;me.showNowbutton=!0,me.showHourbutton=!0,me.BUTTON_ELEM_WIDTH=920,me.ENABLE_BUBBLE=!0,me.MINUTE_WIDTH=5,me.PROG_IMG_WIDTH=100,me.PROG_MIN_WIDTH=10*me.MINUTE_WIDTH,me.PROG_MIN_IMG_WIDTH=2*me.PROG_MIN_WIDTH+me.PROG_IMG_WIDTH,me.PROG_RANGE_DURATION=7200,me.TIME_ELEM_WIDTH=40,me.TIME_ELEM_DURATION=1800,me.TIMELINE_HEIGHT=23,me.HEADER_HEIGHT=me.TIMELINE_HEIGHT,me.timeElems=[],me.recycleTimeElems=[],me.divId=Ext.id(),me.html='<div id="'+me.divId+'" class="epg-outer" style="width: 100%; height: 100%;">  <div class="epg-btn-container"></div>  <div class="epg-viewport" class="unselectable" unselectable="on">    <div class="epg-hcrap"> </div>    <div class="epg-vcrap" > </div>  </div>'+me.infoBubbleTpl()+'  <div class="epg-blacklayer" class="unselectable" unselectable="on"></div>  <div class="epg-curtime" class="unselectable" unselectable="on"></div>  <div class="epg-timeline" class="unselectable" unselectable="on"></div>  <div class="epg-channellist" class="unselectable" unselectable="on"></div>  <div class="epg-container" class="unselectable" unselectable="on"></div></div>',me.callParent(arguments)},initEpg:function(){var me=this;me.callParent(arguments),me.hcrap=$("#"+me.divId+" .epg-hcrap"),me.timeLine=$("#"+me.divId+" .epg-timeline"),me.curTimeElem=$("#"+me.divId+" .epg-curtime"),me.blackLayer=$("#"+me.divId+" .epg-blacklayer"),me.curTimeInterval=setInterval(function(){me.dirty=!0},6e4/this.MINUTE_WIDTH),me.hcrap.width(me.TOTAL_DURATION*me.MINUTE_WIDTH),me.resizeContainer()},scrollToDate:function(date){var me=this;if(!me.animationInProgress){var left=Math.round((date.getTime()/1e3-me.refTime)/60*me.MINUTE_WIDTH)-me.width/2;left<0&&(left=0);var duration=Math.abs(left-me.viewport.scrollLeft())/7;duration>2e3?duration=2e3:duration<500&&(duration=500),me.animationInProgress=!0,me.viewport.animate({scrollLeft:left},duration,"linear",function(){me.animationInProgress=!1,me.processNextRequest()})}},positionCurrentTime:function(){var me=this,now=new Date,left=Math.round((now.getTime()/1e3-me.rangeStart)/60*me.MINUTE_WIDTH);left<0?(me.curTimeElem.hide(),me.blackLayer.hide()):(me.curTimeElem.css({left:me.CHANNEL_WIDTH+left}),me.blackLayer.css({width:left}),me.curTimeElem.show(),me.blackLayer.show())},getChanTimeForEvent:function(event){var me=this;if(void 0===event.offsetX||void 0===event.offsetY){var targetOffset=$(event.target).offset();event.offsetX=event.pageX-targetOffset.left,event.offsetY=event.pageY-targetOffset.top}var eX=event.offsetX,eY=event.offsetY;if(eX<me.CHANNEL_WIDTH||eY<me.HEADER_HEIGHT)return null;var x=eX-me.CHANNEL_WIDTH;if(x>me.width)return null;var y=me.scrollTop+eY-me.HEADER_HEIGHT;return[Math.floor(y/me.CHANNEL_HEIGHT),me.rangeStart+60*x/me.MINUTE_WIDTH]},resizeContainer:function(){var me=this;if(me.viewport){me.viewport.css({width:me.outerElem.width(),height:me.outerElem.height()+me.getScrollBarWidth()-me.BUTTON_ELEM_HEIGHT,top:me.BUTTON_ELEM_HEIGHT,left:0}),me.width=me.outerElem.width()-me.CHANNEL_WIDTH-me.getScrollBarWidth(),me.widthDuration=Math.floor(me.width/me.MINUTE_WIDTH*60),me.height=me.outerElem.height()-me.HEADER_HEIGHT,me.nbVisibleChannels=Math.ceil(me.height/me.CHANNEL_HEIGHT),me.maxLeft=me.width-me.BUBBLE_WIDTH+me.CHANNEL_WIDTH,me.maxTop=me.height-me.BUBBLE_HEIGHT+me.HEADER_HEIGHT;var maxRq=(1+Math.ceil(me.widthDuration/me.PROG_RANGE_DURATION))*me.nbVisibleChannels;me.REQUEST_QUEUE_MAX_SIZE<maxRq&&(me.flushRequestQueue(),me.REQUEST_QUEUE_MAX_SIZE=maxRq),me.timeLine.css({top:me.BUTTON_ELEM_HEIGHT,left:0,width:me.width+me.CHANNEL_WIDTH,height:me.TIMELINE_HEIGHT}),me.curTimeElem.css({left:me.CHANNEL_WIDTH,top:me.HEADER_HEIGHT+me.BUTTON_ELEM_HEIGHT,height:me.height}),me.blackLayer.css({left:me.CHANNEL_WIDTH,top:me.HEADER_HEIGHT+me.BUTTON_ELEM_HEIGHT,height:me.height,width:0}),me.btnElem.css({left:me.CHANNEL_WIDTH+(me.width-me.BUTTON_ELEM_WIDTH)/2,top:0,height:me.BUTTON_ELEM_HEIGHT,width:me.BUTTON_ELEM_WIDTH}),me.callParent(arguments)}},createTimeElem:function(){var me=this,e={};return e.elem=$('<div class="epg-time-elem unselectable" unselectable="on"></div>'),e.elem.appendTo(me.timeLine),e.h=-1,e},refreshDisplay:function(){var me=this;if(me.channels&&me.channels.length){if(!me.refTime){var now=new Date;me.refTime=now.getTime()/1e3-3600}me.refTime,me.TOTAL_DURATION;me.scrollTop=me.viewport.scrollTop(),me.scrollLeft=me.viewport.scrollLeft(),me.rangeStart=Math.floor(me.refTime+me.scrollLeft/me.MINUTE_WIDTH*60),me.rangeEnd=me.rangeStart+me.widthDuration,me.callParent(arguments),me.positionCurrentTime();var mod=me.rangeStart%me.TIME_ELEM_DURATION,curH=mod?me.rangeStart+me.TIME_ELEM_DURATION-mod:me.rangeStart;new Date(1e3*curH);for(var h in me.timeElems){var e=me.timeElems[h];(h<me.rangeStart||h>me.rangeEnd)&&(e.elem.hide(),e.h=-1,me.recycleTimeElems.push(e),delete me.timeElems[h])}for(;curH<me.rangeEnd;){var e=me.timeElems[curH];e||(e=me.recycleTimeElems.pop(),e||(e=me.createTimeElem()),me.timeElems[curH]=e);var left=me.CHANNEL_WIDTH+Math.floor((curH-me.rangeStart)/60*me.MINUTE_WIDTH-me.TIME_ELEM_WIDTH/2);e.curH!=curH&&(e.elem.text(Fbx.os.lib.FbxUtils.displayTime(curH)),e.curH=curH),e.elem.css({left:left}),e.elem.show(),curH+=me.TIME_ELEM_DURATION}for(var i=me.startChannelIdx;i<=me.endChannelIdx;++i)me.drawChannelProgram(i,me.rangeStart,me.rangeEnd)}},drawChannelProgram:function(idx,rangeStart,rangeEnd){for(var me=this,t=rangeStart-rangeStart%me.PROG_RANGE_DURATION;t<rangeEnd;)me.programs[idx]&&me.programs[idx][t]?me.processChannelProg(idx,me.programs[idx][t]):me.loadChannelProg(idx,t),t+=me.PROG_RANGE_DURATION},processChannelProg:function(idx,progs){var me=this;if(!(idx<me.startChannelIdx||idx>me.endChannelIdx)){me.programElems[idx]||(me.programElems[idx]={});var elems=me.programElems[idx];for(var k in progs){var p=progs[k],e=elems[p.id];if(!(p.end<=me.rangeStart||p.date>=me.rangeEnd)){e||(e=me.recycleProgramElems.pop(),e||(e=me.createProgElem()),elems[p.id]=e);var width=Math.floor(p.duration/60*me.MINUTE_WIDTH)-me.PROG_SPACING,left=Math.floor((p.date-me.rangeStart)/60*me.MINUTE_WIDTH)+me.PROG_SPACING/2;e.prog!=k&&(e.title.text(p.title),e.subtitle.text(p.sub_title?p.sub_title:""),e.prog=k,e.start=p.date,e.end=p.end,p.category||(p.category=0),e.catClass="epg-prog-cat-"+me.CATEGORY_ASSOC[p.category],e.elem.addClass(e.catClass)),p.picture&&width>me.PROG_MIN_IMG_WIDTH?e.imgVisible||(e.img.attr({src:p.picture,alt:p.title}),e.img.show(),e.imgVisible=!0,e.infos.css({"padding-left":me.PROG_IMG_WIDTH+5})):e.imgVisible&&(e.img.hide(),e.imgVisible=!1,e.infos.css({"padding-left":5})),width<me.PROG_MIN_WIDTH?e.infos.hide():e.infos.show(),e.elem.css({left:left,width:width,top:idx*me.CHANNEL_HEIGHT-me.scrollTop}),e.elem.show()}}}},loadChannelProg:function(idx,rangeStart){var me=this,channel=me.channels[idx];if(channel){var lock=channel.uuid+"_"+rangeStart;if(!me.progLoadLock[lock]){me.progLoadLock[lock]=!0;var url=FbxConf.apiBaseUrl+"tv/epg/by_channel/"+channel.uuid+"/"+rangeStart+"/";me.enqueRequest(url,idx,rangeStart,function(success,data){if(delete me.progLoadLock[lock],success){var progs=data.result;for(var k in progs){var p=progs[k];p.end=p.date+p.duration}me.programs[idx]||(me.programs[idx]={}),me.programs[idx][rangeStart]=progs,me.processChannelProg(idx,progs)}})}}},getProgForChanAtTime:function(channelIdx,time){var me=this,timeRange=time-time%me.PROG_RANGE_DURATION;if(!me.programs[channelIdx]||!me.programs[channelIdx][timeRange])return null;var progs=me.programs[channelIdx][timeRange],curProg=null;for(var k in progs){var p=progs[k];if(time>=p.date&&time<p.end){curProg=p;break}}return curProg}});Ext.define("Fbx.os.core.AppSettings",{extend:"Ext.data.Store",singleton:!0,model:"Fbx.os.core.AppSettingsModel",resetSettings:function(){var url=FbxConf.apiBaseUrl+"settings/reset/";Ext.Ajax.request({url:url,method:"DELETE",success:function(){Ext.Msg.alert("Réinitialisation des préférences","Les préférences ont bien été réinitialisées, l'interface va maintenant être rechargée",function(){location.reload(!0)})}})}});Ext.define("Fbx.os.app.settings.VpnClientStatus",{extend:"Ext.form.Panel",requires:["Ext.layout.component.FieldSet","Ext.form.FieldSet","Fbx.ux.form.field.EnumDisplay","Ext.form.field.Display","Fbx.os.lib.FbxUtils","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.DateDisplay","Fbx.ux.form.field.DurationDisplay","Fbx.ux.form.field.SpeedDisplay","Fbx.ux.form.field.SizeDisplay"],initComponent:function(){var me=this;me.on("boxready",function(){me.setLoading(!0),me.refreshStatus()}),me.on("show",function(){me.refreshStatus()}),Ext.applyIf(me,{layout:"vbox",defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"fieldset",title:"État du client",itemId:"client-status",defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"templateddisplayfield",fieldLabel:"Client VPN actif",tpl:'<tpl if="val">Oui</tpl><tpl if="!val">Non</tpl>',name:"enabled"},{xtype:"enumdisplayfield",hidden:!0,fieldLabel:"État",strings:{waiting_wan:"En attente de connexion internet",going_up:"En cours de connexion",up:"Connecté",going_down:"Déconnexion en cours",down:"Déconnecté"},name:"state"},{xtype:"displayfield",hidden:!0,fieldLabel:"Connexion active",name:"active_vpn_description"},{xtype:"datedisplayfield",hidden:!0,fieldLabel:"Dernière connexion",name:"last_up"},{xtype:"datedisplayfield",hidden:!0,name:"last_try",fieldLabel:"Dernière tentative"},{xtype:"enumdisplayfield",hidden:!0,name:"last_error",fieldLabel:"Dernière erreur",strings:{none:"Aucune",internal:"Erreur interne",authentication_failed:"Erreur d'authentification",resolv_failed:"Nom d'hôte inconnu",connect_timeout:"Temps d'attente dépassé lors de la connexion",connect_failed:"Impossible de se connecter à l'hôte",setup_control_failed:"Erreur lors de la négociation PPTP",setup_call_failed:"Erreur lors de l'établissement de la session PPTP",protocol:"Erreur de protocole",remote_terminated:"Le serveur a fermé la connexion",auth_failed:"Erreur d'authentification",remote_disconnect:"Le serveur a fermé la connexion"}},{xtype:"durationdisplayfield",name:"next_try",fieldLabel:"Prochaine tentative"}]},{xtype:"fieldset",title:"Informations sur la connexion",layout:"hbox",itemId:"conn-status",hidden:!0,items:[{xtype:"container",flex:1,defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"enumdisplayfield",fieldLabel:"Type de connexion",strings:{pptp:"PPTP",openvpn_routed:"OpenVPN Routé"},name:"type"},{xtype:"displayfield",fieldLabel:"IP",name:"ipv4.ip_mask.ip"},{xtype:"displayfield",fieldLabel:"Masque sous réseau",name:"ipv4.ip_mask.mask"},{xtype:"displayfield",fieldLabel:"Passerelle",name:"ipv4.gateway"},{xtype:"templateddisplayfield",fieldLabel:"Serveurs DNS",name:"ipv4.dns.0",tpl:'{[values["ipv4.dns.0"]]}{[values["ipv4.dns.1"] ? ", " + values["ipv4.dns.1"] : ""]} {[values["ipv4.dns.2"] ? ", " + values["ipv4.dns.2"] : ""]} {[values["ipv4.dns.3"] ? ", " + values["ipv4.dns.3"] : ""]} '}]},{xtype:"container",flex:1,defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"sizedisplayfield",fieldLabel:"Reçu",name:"stats.bytes_down"},{xtype:"sizedisplayfield",fieldLabel:"Émis",name:"stats.bytes_up"},{xtype:"speeddisplayfield",fieldLabel:"Débit descendant",name:"stats.rate_down"},{xtype:"speeddisplayfield",fieldLabel:"Débit montant",name:"stats.rate_up"}]}]}]}),me.callParent(arguments)},refreshStatus:function(){var me=this;me.tabStatus;me.loading||me.suspendRefresh||!me.isVisible()||(me.loading=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vpn_client/status/",method:"GET",disableCaching:!0,autoRefresh:!0,callback:function(){me.setLoading(!1),me.loading=!1},success:function(response){var jsonData=response.jsonData.result;me.values={},Fbx.os.lib.FbxUtils.stringify(jsonData,"",me.values);var form=me.getForm();form.setValues(me.values),me.getComponent("conn-status").setVisible("up"==me.values.state),me.values.enabled?(me.form.getFields().each(function(f){f.setVisible(!0)}),"up"==me.values.state?(form.findField("last_error").setVisible(!1),form.findField("last_try").setVisible(!1),form.findField("next_try").setVisible(!1)):(form.findField("last_error").setVisible(!0),form.findField("last_try").setVisible(!0),form.findField("next_try").setVisible(!0))):me.form.getFields().each(function(f){f.setVisible("enabled"==f.name)}),setTimeout(function(){me.refreshStatus()},1e3)}}))}});Ext.define("Fbx.os.app.downloader.DownloadTaskModel",{extend:"Ext.data.Model",requires:["Fbx.os.app.downloader.TaskFileModel","Ext.data.association.HasMany","Fbx.os.lib.FbxUtils"],statics:{convertBytes:function(v){return"number"==typeof v?v:v.val},getStats:function(cb,errcb){var url=FbxConf.apiBaseUrl+"downloads/stats";Ext.Ajax.request({url:url,method:"GET",autorefresh:!0,callback:function(option,success,response){var jsonData=response.jsonData;jsonData.success?cb(jsonData.result):errcb&&errcb(jsonData)}})},setThrottling:function(mode,cb){var url=FbxConf.apiBaseUrl+"downloads/throttling";Ext.Ajax.request({url:url,method:"PUT",jsonData:{throttling:mode},callback:function(option,success,response){response.jsonData.success&&cb()}})},dlTypes:{bt:"BitTorrent",nzb:"Newsgroups",http:"Http",ftp:"Ftp"},dlPriorities:{no_dl:"Ne pas télécharger",low:"Faible",normal:"Normale",high:"Haute"},dlStatus:{starting:"Initialisation",stopped:"Pause",queued:"En Attente",downloading:"Téléchargement",stopping:"En cours d'arrêt",repairing:"Réparation",extracting:"Extraction",error:"Erreur",done:"Terminé",seeding:"Terminé, Partage",checking:"Vérification"},dlErrors:{none:"",internal:"Erreur interne",disk_full:"Plus de place sur le disque dur",unknown:"Erreur inconnue",parse_error:"Format de fichier invalide",http_301:"Document déplacé de façon permanente",http_400:"La syntaxe de la requête est erronée",http_401:"Une authentification est nécessaire pour accéder à la ressource",http_402:"Paiement requis pour accéder à la ressource",http_403:"L'authentification est refusée",http_404:"Ressource non trouvée",http_405:"Méthode de requête non autorisée",http_406:"Toutes les réponses possibles seront refusées",http_407:"Accès à la ressource autorisé par identification avec le proxy",http_408:"Temps d'attente d'une réponse du serveur écoulé",http_409:"La requête ne peut être traitée en l'état actuel",http_410:"La ressource est indisponible et aucune adresse de redirection n'est connue",http_411:"La longueur de la requête n'a pas été précisée",http_412:"Préconditions envoyées par la requête non-vérifiées",http_413:"Traitement abandonné dû à une requête trop importante",http_414:"URI trop longue",http_415:"Format de requête non supporté pour une méthode et une ressource données",http_416:"Champs d'en-tête de requête « range » incorrect",http_417:"Comportement attendu et défini dans l'en-tête de la requête insatisfaisable",http_422:"WebDAV : L'entité fournie avec la requête est incompréhensible ou incomplète",http_423:"WebDAV : L'opération ne peut avoir lieu car la ressource est verrouillée",http_424:"WebDAV : Une méthode de la transaction a échoué",http_425:"webDAV 425",http_426:"Le client devrait changer de protocole, par exemple au profit de TLS/1.0",http_427:"",http_428:"Erreur 428",http_429:"Trop de reqêtes",http_430:"",http_431:"Les en-têtes de la requête sont trop gros",http_4xx:"Erreur 4xx",http_500:"Erreur interne du serveur",http_501:"Fonctionnalité réclamée non supportée par le serveur",http_502:"Mauvaise réponse envoyée à un serveur intermédiaire par un autre serveur",http_503:"Service temporairement indisponible ou en maintenance",http_504:"Temps d'attente d'une réponse d'un serveur à un serveur intermédiaire écoulé",http_505:"Version HTTP non gérée par le serveur",http_506:"",http_507:"WebDAV : Espace insuffisant pour modifier les propriétés ou construire la collection",http_508:"Boucle détéctée",http_509:"Quota de bande passante dépassé",http_510:"",http_511:"Authentification réseau nécessaire",http_5xx:"Erreur 5xx",http_redirections_exceeded:"Nombre maximum de redirections atteint",nzb_no_group:"Le groupe n'est pas disponible sur ce serveur",nzb_not_found:"L'article n'a pas été trouvé sur le serveur",nzb_invalid_crc:"Erreur d'intégrité du fichier",nzb_invalid_size:"Taille d'article invalide",nzb_invalid_filename:"Nom de fichier invalide",nzb_open_failed:"Erreur lors de l'ouverture du fichier",nzb_write_failed:"Erreur lors de l'écriture du fichier",nzb_missing_size:"Taille de fichier manquante",nzb_decode_error:"Erreur lors du décodage de l'article",nzb_missing_segments:"Segments manquants",nzb_error:"Erreur nzb",unknown_host:"Hôte inconnu",timeout:"Temps d'attente dépassé",bad_authentication:"Informations d'identification erronées",connection_refused:"Connexion refusée",nzb_authentication_required:"Authentification nécessaire sur le serveur de newsgroups",bt_tracker_error:"Impossible de s'annoncer sur le traqueur",bt_missing_files:"Fichiers du torrent manquants",bt_file_error:"Erreur lors de l'accès aux fichiers du torrent",missing_ctx_file:"Impossible d'accéder au fichier de ctx de la tâche"}},fields:[{name:"id",type:"int"},{name:"type",type:"string"},{name:"name",type:"string"},{name:"status",type:"string"},{name:"created_ts",type:"int"},{name:"size",type:"int"},{name:"queue_pos",type:"int"},{name:"io_priority",type:"string"},{name:"tx_bytes",type:"int"},{name:"rx_bytes",type:"int"},{name:"tx_rate",type:"int"},{name:"rx_rate",type:"int"},{name:"rx_pct",type:"float",convert:function(v){return v/100}},{name:"tx_pct",type:"float",convert:function(v){return v/100}},{name:"error",type:"string"},{name:"download_dir",type:"string"},{name:"decoded_download_dir",type:"string",convert:function(v,rec){return Fbx.os.lib.FbxUtils.base64_decode(rec.get("download_dir"))}},{name:"eta",type:"int"},{name:"stop_ratio",type:"int"},{name:"stop_ratio_display",type:"int",convert:function(v,r){return r.get("stop_ratio")/100}},{name:"use_global_settings",type:"boolean"},{name:"running",type:"boolean",convert:function(v,rec){var status=rec.get("status");return"downloading"==status||"seeding"==status}},{name:"beforeTxt",type:"string",convert:function(v,rec){var status=rec.get("status");return Fbx.os.app.downloader.DownloadTaskModel.dlStatus[status]}},{name:"progressColor",type:"string",convert:function(v,rec){switch(rec.get("status")){case"done":return"";case"seeding":return"red";case"error":return"orange"}return"blue"}},{name:"task_pct",type:"float",convert:function(v,rec){return"seeding"==rec.get("status")?rec.get("tx_pct"):rec.get("rx_pct")}}],associations:[{model:"Fbx.os.app.downloader.TaskFileModel",type:"hasMany",name:"files",foreignKey:"task_id"}],proxy:{type:"rest",url:FbxConf.apiBaseUrl+"downloads/",sortParam:void 0,startParam:void 0,limitParam:void 0,filterParam:void 0,pageParam:void 0,revertOnFailure:!0,reader:{type:"json",root:"result",messageProperty:"msg"}},canResume:function(){var rec=this;return{stopped:!0,done:"bt"==rec.get("type")}[rec.get("status")]},canPause:function(){return{downloading:!0,starting:!0,queued:!0,seeding:!0}[this.get("status")]},canRetry:function(){var status=this.get("status"),type=this.get("type");return"error"==status||"done"==status&&"nzb"==type},canCheck:function(){var checkable={done:!0,stopped:!0},status=this.get("status");return"bt"==this.get("type")&&checkable[status]},pause:function(postPone){var me=this;me.canPause()&&(me.set("status","stopped"),postPone||me.save())},resume:function(postPone){var me=this;me.canResume()&&(me.set("status","downloading"),postPone||me.save())},retry:function(postPone){var me=this;me.canRetry()&&(me.set("status","retry"),postPone||me.save())},check:function(postPone){var me=this;me.canCheck()&&(me.set("status","checking"),postPone||me.save())},erase:function(){var url=FbxConf.apiBaseUrl+"downloads/"+this.get("id")+"/erase",me=this;me.store;Ext.Ajax.request({url:url,method:"DELETE",success:function(){me.phantom=!0,me.destroy()}})},setIoPriority:function(priority){var me=this;me.set("io_priority",priority),me.save()},setQueuePos:function(pos){var me=this;me.set("queue_pos",pos),me.save()},setStopRatio:function(ratio){var me=this;me.set("stop_ratio",100*ratio),me.save()},getLogs:function(callback){var url=FbxConf.apiBaseUrl+"downloads/"+this.get("id")+"/log/",me=this;me.store;Ext.Ajax.request({url:url,method:"GET",success:function(response,request){response.jsonData&&response.jsonData.success&&callback(response.jsonData.result)}})},getPiecesStatus:function(callback){var url=FbxConf.apiBaseUrl+"downloads/"+this.get("id")+"/pieces/",me=this;me.store;Ext.Ajax.request({url:url,method:"GET",success:function(response,request){response.jsonData&&response.jsonData.success?callback(!0,response.jsonData.result):callback(!1,null)}})}});Ext.define("Fbx.os.app.downloader.RssForm",{extend:"Ext.window.Window",requires:["Ext.form.Label","Ext.form.FieldSet","Ext.form.FieldContainer","Ext.layout.component.FieldSet","Ext.form.field.Checkbox","Fbx.os.lib.FbxUtils","Fbx.os.app.downloader.RssFeedModel"],closeAction:"hide",initComponent:function(){var me=this;Ext.applyIf(me,{preventHeader:!0,width:500,modal:!0,title:"Ajouter un flux RSS",layout:"fit",items:[{xtype:"form",bodyPadding:10,defaults:{anchor:"100%"},buttons:[{text:"Annuler",iconCls:"btn-cancel",handler:function(){me.down("form").getForm().reset(),me.close()}},{text:"Ajouter",iconCls:"btn-rss-add",formBind:!0,handler:function(){var form=me.down("form").getForm();if(form.isValid()){var formVal=form.getValues();Fbx.os.app.downloader.RssFeedModel.create({auto_download:formVal.auto_download&&"on"==formVal.auto_download,url:formVal.url}).save({callback:function(records,operation,success){operation.wasSuccessful()?(me.app.refreshRssList(),setTimeout(function(){me.app.refreshRssList()},3e3)):Ext.Msg.Alert("Erreur",operation.getError())}}),me.close()}else Ext.Msg.alert("Erreur","Paramètres invalides")}}],items:[{xtype:"fieldset",title:"Flux RSS",defaults:{anchor:"100%"},items:[{xtype:"textfield",fieldLabel:"URL",name:"url",vtype:"downloadUrl",allowBlank:!1,labelWidth:50},{xtype:"checkbox",name:"auto_download",fieldLabel:"Télécharger automatiquement les nouveaux éléments",labelWidth:350}]}]}],listeners:{close:function(){me.down("form").getForm().reset()}}}),me.callParent(arguments)}});Ext.define("Fbx.os.app.contacts.ContactEditorPanel",{requires:["Fbx.os.app.contacts.ContactModel","Ext.data.ArrayStore"],extend:"Ext.grid.Panel",preventHeader:!0,enableColumnHide:!1,enableColumnMove:!1,enableColumnResize:!1,hideHeaders:!0,sortableColumns:!1,border:0,bodyStyle:{border:0},viewConfig:{loadMask:!1}});Ext.define("Fbx.ux.form.field.HostSelector",{extend:"Ext.form.field.ComboBox",alias:"widget.hostselector",requires:["Fbx.os.app.lanbrowser.HostModel","Ext.data.Store","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore"],statics:{vpnListLoaded:!1,vpnList:null,vpnIpPoolStart:0,vpnIpPoolEnd:0},displayField:"name",valueField:"ip",allowBlank:!1,queryMode:"local",hostStoreLoaded:!1,validator:function(val){var me=this,curIp=me.getValue();if(!curIp)return!1;var res=Fbx.os.lib.FbxUtils.checkSubnet(me.netConf.ip,curIp);if(!0===res)return!0;var ipNum=Fbx.os.lib.FbxUtils.strToIpNum(curIp);return ipNum>=Fbx.ux.form.field.HostSelector.vpnIpPoolStart&&ipNum<=Fbx.ux.form.field.HostSelector.vpnIpPoolEnd||res},updateCombo:function(){var me=this;if(me.hostStoreLoaded&&Fbx.ux.form.field.HostSelector.vpnListLoaded){var list=[];if(me.hostStore.each(function(r){var name=r.get("primary_name");if("ip"==me.valueField){if(r.l3connectivities){var con=r.l3connectivities();con.each(function(c){if("ipv4"==c.get("af")){var addr=c.get("addr");Ext.Array.push(list,{name:name+" ("+addr+")",ip:addr})}})}}else{var mac=r.get("mac");Ext.Array.push(list,{name:name+" ("+mac+")",mac:mac})}}),"ip"==me.valueField)for(var i in Fbx.ux.form.field.HostSelector.vpnList){var v=Fbx.ux.form.field.HostSelector.vpnList[i];Ext.Array.push(list,{name:"VPN "+v.login+" ("+v.ip+")",ip:v.ip})}me.getStore().loadData(list)}},loadVpnList:function(){var me=this;if(Fbx.ux.form.field.HostSelector.vpnListLoaded)return void me.updateCombo();Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vpn/ip_pool/",method:"GET",success:function(response){var res=response.jsonData.result;Fbx.ux.form.field.HostSelector.vpnList=res.reservations,Fbx.ux.form.field.HostSelector.vpnListLoaded=!0,Fbx.ux.form.field.HostSelector.vpnIpPoolStart=Fbx.os.lib.FbxUtils.strToIpNum(res.ip_start),Fbx.ux.form.field.HostSelector.vpnIpPoolEnd=Fbx.os.lib.FbxUtils.strToIpNum(res.ip_end),me.updateCombo(),me.validate()}})},initComponent:function(){var me=this;Fbx.os.gui.Environment.getNetworkConf(function(conf){me.netConf=conf,me.form&&me.form.getForm().isValid()}),me.mon(Fbx.os.gui.Environment,"networkConfChanged",function(conf){me.netConf=conf,me.form&&me.form.getForm().isValid()}),me.hostStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.lanbrowser.HostModel",sorters:[{property:"primary_name",direction:"ASC"}],listeners:{load:function(){me.hostStoreLoaded=!0,me.updateCombo()}}}),me.callParent(arguments),me.store=Ext.create("Ext.data.ArrayStore",{fields:["name","ip","mac"]}),me.on("afterrender",function(){me.hostStore.load(),Fbx.os.gui.Environment.getNetworkConf(function(cfg){"bridge"==cfg.mode?(Fbx.ux.form.field.HostSelector.vpnList={},Fbx.ux.form.field.HostSelector.vpnListLoaded=!0,Fbx.ux.form.field.HostSelector.vpnIpPoolStart=0,Fbx.ux.form.field.HostSelector.vpnIpPoolEnd=0):me.loadVpnList()})})}});Ext.define("Fbx.os.app.settings.ConnectionDynDnsStatus",{extend:"Ext.form.FieldSet",requires:["Fbx.ux.form.field.EnumDisplay","Fbx.ux.form.field.DateDisplay"],config:{fieldPfx:"dyndns."},constructor:function(config){var me=this;Ext.apply(me,config),config=Ext.apply(config,{defaults:{anchor:"100%",labelWidth:150},items:[{xtype:"enumdisplayfield",fieldLabel:"État",name:me.fieldPfx+"status",strings:{disabled:"Désactivé",ok:"OK",wait:"En cours de mise à jour",reqfail:"La requête a échoué",authfail:"Erreur d'authentification",nocredential:"Compte invalide",ipinval:"IP invalide",hostinval:"Hôte invalide",abuse:"Bloqué pour abus",dnserror:"Erreur DNS",unavailable:"Service momentanément indisponible",nowan:"Impossible de déterminer l'IP",unknown:"Inconnu"},listeners:{change:function(field,newVal){var form=me.up("form").getForm();"disabled"==newVal?(form.findField(me.fieldPfx+"last_error").hide(),form.findField(me.fieldPfx+"next_retry").hide(),form.findField(me.fieldPfx+"last_refresh").hide(),form.findField(me.fieldPfx+"next_refresh").hide()):"ok"==newVal?(form.findField(me.fieldPfx+"last_error").hide(),form.findField(me.fieldPfx+"next_retry").hide(),form.findField(me.fieldPfx+"last_refresh").show(),form.findField(me.fieldPfx+"next_refresh").show()):(form.findField(me.fieldPfx+"last_error").show(),form.findField(me.fieldPfx+"next_retry").show(),form.findField(me.fieldPfx+"last_refresh").hide(),form.findField(me.fieldPfx+"next_refresh").hide())}}},{xtype:"datedisplayfield",fieldLabel:"Dernière mise à jour",hidden:!0,name:me.fieldPfx+"last_refresh"},{xtype:"datedisplayfield",fieldLabel:"Prochaine mise à jour",hidden:!0,name:me.fieldPfx+"next_refresh"},{xtype:"datedisplayfield",fieldLabel:"Dernière erreur",hidden:!0,name:me.fieldPfx+"last_error"},{xtype:"datedisplayfield",fieldLabel:"Prochaine tentative",hidden:!0,name:me.fieldPfx+"next_retry"}]}),this.callParent([config])}});Ext.define("Fbx.os.gui.panel.TaskList",{extend:"Ext.window.Window",requires:["Fbx.ux.grid.RefreshGrid","Fbx.os.app.explorer.FsTask","Fbx.os.app.explorer.FsTaskColumn","Fbx.os.app.explorer.FsUpload","Ext.grid.column.Action","Fbx.os.app.explorer.FsUploadColumn"],title:"Liste des tâches",resizable:!1,closable:!1,draggable:!1,collapsible:!0,collapseDirection:"bottom",closeAction:"hide",border:!1,autoScroll:!0,width:280,height:200,y:0,cls:"task-list-win",layout:{align:"stretch",type:"vbox"},constructor:function(config){var me=this;config=Ext.apply(me,config),me.fsTaskGrid=Ext.create("Fbx.ux.grid.RefreshGrid",{suspendRefresh:!0,store:Fbx.os.app.explorer.FsTask.taskStore,hideHeaders:!0,disableBufferring:!0,border:!1,baseCls:"task-list-grid",viewConfig:{loadMask:!1,border:!1,selectedItemCls:"task-list-selected"},columns:[{tdCls:"task-list-grid-column",xtype:"fstaskcolumn",flex:1},{xtype:"actioncolumn",tdCls:"task-list-grid-action-column",width:0,align:"right",items:[{iconCls:"btn-control-pause-blue",tooltip:"Suspendre / Reprendre",getClass:function(v,m,r){switch(r.get("state")){case"running":return"btn-control-pause-blue";case"paused":case"queued":return"btn-control-play-blue"}return"hidden"},handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);switch(rec.get("state")){case"running":rec.pause();break;case"queued":case"paused":rec.resume()}}},{iconCls:"btn-cancel",tooltip:"Annuler",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);Fbx.os.app.explorer.FsTask.taskStore.remove(rec),Fbx.os.app.explorer.FsTask.taskStore.sync({callback:function(){Fbx.os.app.explorer.FsTask.taskStore.load()}})}}]}]}),me.uploadTaskGrid=Ext.create("Fbx.ux.grid.RefreshGrid",{suspendRefresh:!0,store:Fbx.os.app.explorer.FsUpload.store,hideHeaders:!0,disableBufferring:!0,border:!1,baseCls:"task-list-grid",columns:[{xtype:"fsuploadcolumn",flex:1},{xtype:"actioncolumn",tdCls:"upload-list-grid-action-column",width:0,align:"right",items:[{iconCls:"btn-cancel",tooltip:"Annuler",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);"in_progress"==rec.get("status")?Fbx.os.app.explorer.FsUpload.cancel(rec.getId()):Fbx.os.app.explorer.FsUpload.remove(rec.getId())}}]}]}),config=Ext.apply(config,{renderTo:me.desktopCenter.getEl(),items:[me.fsTaskGrid,me.uploadTaskGrid],bbar:["->",{xtype:"button",text:"Supprimer les tâches terminées",handler:function(){var toRemove=[];Fbx.os.app.explorer.FsTask.taskStore.each(function(rec){switch(rec.get("state")){case"done":case"failed":Ext.Array.push(toRemove,rec)}}),Fbx.os.app.explorer.FsTask.taskStore.remove(toRemove),Fbx.os.app.explorer.FsTask.taskStore.sync({callback:function(){Fbx.os.app.explorer.FsTask.taskStore.load()}}),Fbx.os.app.explorer.FsUpload.clean()}}],listeners:{show:function(){me.reposition()},beforecollapse:function(){return me.suspendLayout=!0,me.animate({to:{y:me.getHeight()+50,opacity:.1},callback:function(){me.collapsed=!0,me.activityBtn.pressed=!1,me.reposition(),me.getEl().setStyle("display","none")}}),!1},beforeexpand:function(){return me.suspendLayout=!1,me.getEl().setStyle("display","block"),me.animate({to:{y:0,opacity:1},callback:function(){me.collapsed=!1,me.reposition(),me.activityBtn.pressed=!0,me.toFront()}}),!1}}}),this.callParent([config]),me.desktopCenter.on("resize",function(){me.reposition()}),me.mon(Fbx.os.app.explorer.FsTask.taskStore,"load",function(store,records,successful){if(successful){var nbFsTask=Fbx.os.app.explorer.FsTask.taskStore.count();nbFsTask>me.nbFsTask&&(me.show(),me.toFront()),me.nbFsTask=nbFsTask,me.updateVisibility()}}),me.mon(Fbx.os.app.explorer.FsUpload.store,"load",function(store,records,successful){if(successful){var nbUploadTask=Fbx.os.app.explorer.FsUpload.store.count();nbUploadTask>me.nbUploadTask&&(me.show(),me.toFront()),me.nbUploadTask=nbUploadTask,me.nbUploadTaskActive=Fbx.os.app.explorer.FsUpload.store.getNbActive(),me.updateVisibility()}}),me.nbUploadTask=0,me.nbUploadTaskActive=0,me.nbFsTask=0,Fbx.os.app.explorer.FsTask.taskStore.load(),Fbx.os.app.explorer.FsUpload.store.load()},toFront:function(){var me=this;if(me.getCollapsed())return void me.expand();me.callParent(arguments)},reposition:function(){var me=this,parentSize=me.container.getSize(),mySize=me.getOuterSize(),x=parentSize.width-mySize.width,y=me.collapsed?parentSize.height+50:0;me.setHeight(parentSize.height),me.setPosition([x,y])},updateVisibility:function(){var me=this;me.nbFsTask?me.fsTaskGrid.show():me.fsTaskGrid.hide(),me.nbUploadTask?me.uploadTaskGrid.show():me.uploadTaskGrid.hide(),0==me.nbUploadTaskActive?me.uploadTaskGrid.suspendRefresh=!0:me.uploadTaskGrid.suspendRefresh&&(me.uploadTaskGrid.suspendRefresh=!1,me.uploadTaskGrid.store.load()),me.nbUploadTask||me.nbFsTask?me.isHidden()&&me.show():me.hide(),me.activityBtn||(me.activityBtn=Ext.get("fbx-taskbar-activity-btn")),me.activityBtn&&(me.nbUploadTask||me.nbFsTask?me.activityBtn.show():me.activityBtn.hide())}});Ext.define("Fbx.os.app.downloader.BtTrackerGrid",{extend:"Fbx.ux.grid.RefreshGrid",alias:"widget.bttrackergrid",requires:["Fbx.os.app.downloader.BtTrackerModel","Fbx.os.gui.grid.column.DurationColumn","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Boolean","Ext.grid.column.Template","Ext.grid.column.Number","Ext.data.Store","Ext.menu.Menu"],suspendRefresh:!0,initComponent:function(){var me=this;me.trackerStore=Ext.create("Ext.data.Store",{remoteSort:!1,remoteFilter:!0,model:"Fbx.os.app.downloader.BtTrackerModel"}),Ext.applyIf(me,{selModel:{mode:"MULTI"},store:me.trackerStore,forceFit:!0,columns:[{xtype:"templatecolumn",dataIndex:"announce",text:"Traqueur",flex:2,minWidth:200,tpl:'<div class="download-tracker-title">{announce:htmlEncode}</div><div>Activé : <tpl if="is_enabled">Oui</tpl><tpl if="!is_enabled">Non</tpl></div><div>Traqueur Principal : <tpl if="is_backup">Non</tpl><tpl if="!is_backup">Oui</tpl></div><div>Période de mise à jour : {[Fbx.os.lib.FbxUtils.formatDuration(values.interval)]}</div>'},{xtype:"enumcolumn",text:"Statut",flex:1,dataIndex:"status",strings:{unannounced:"Non annoncé",announcing:"Connexion en cours",announce_failed:"Connexion échouée",announced:"Annoncé"}},{xtype:"numbercolumn",dataIndex:"nseeders",text:"Sources",format:"0"},{xtype:"numbercolumn",dataIndex:"nleechers",text:"Preneurs",format:"0"},{xtype:"durationcolumn",dataIndex:"reannounce_in",text:"Prochaine mise à jour",width:120}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Sélectionnez un téléchargement bittorrent</div>'}}),this.callParent(arguments)},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Supprimer le traqueur",iconCls:"btn-delete",handler:function(){var records=me.getSelectedRecord();for(i in records)records[i].destroy()}},{text:"Ajouter un traqueur",iconCls:"btn-add",handler:function(){Ext.Msg.prompt("Ajout d'un traqueur","Adresse du traqueur",function(btn,text){if("ok"==btn){var rec=Fbx.os.app.downloader.BtTrackerModel.create({task_id:me.task_id,announce:text});rec.phantom=!0,rec.save({callback:function(records,operation){operation.wasSuccessful()||Ext.Msg.alert("Erreur","Erreur lors de l'ajout du traqueur : "+operation.getError())}})}})}},{text:"Activer le traqueur",iconCls:"btn-connect",handler:function(){var records=me.getSelectedRecord();for(i in records)records[i].set("is_enabled",!0),records[i].save()}},{text:"Désactiver le traqueur",iconCls:"btn-disconnect",handler:function(){var records=me.getSelectedRecord();for(i in records)records[i].set("is_enabled",!1),records[i].save()}}],listeners:{beforeshow:function(menu){if(!me.getSelectedRecord())return!1}}})),me.contextMenu}});Ext.define("Fbx.os.app.tv.Player",{extend:"Ext.panel.Panel",requires:["Fbx.os.app.tv.FlashPlayer","Fbx.os.app.tv.VLCPlayer","Ext.layout.container.Card","Fbx.os.app.tv.Settings","Ext.button.Split","Ext.toolbar.Toolbar","Ext.button.Button","Ext.slider.Single","Ext.menu.Menu","Fbx.os.app.pvr.PrecordEditor"],flashAvailable:!1,vlcAvailable:!1,__curPlayer:null,__curChannel:"",__curStreams:null,__curStreamIdx:0,__selectedSrtTrack:-1,__selectedAudioTrack:-1,__isManualSelection:!1,statics:{streamTypePriority:{iptv:2,dvb:1},streamQualityPriority:{auto:10,hd:5,ld:2,sd:1,"3d":0},streamQualityName:{auto:"Automatique",hd:"HD",sd:"Standard",ld:"Bas débit","3d":"3D"},streamSourceName:{iptv:"",dvb:"TNT "}},updateSrtMenu:function(){var me=this;me.srtMenu.removeAll();for(var i=0;i<me.__srtTracks.length;++i)s=me.__srtTracks[i],me.srtMenu.add({text:s.name,trackId:s.id,iconCls:s.id==me.__selectedSrtTrack?"btn-bullet-blue":"",handler:function(item){me.setSrtTrack(item.trackId)}})},updateAudioMenu:function(){var me=this;me.audioMenu.removeAll();for(var i=0;i<me.__audioTracks.length;++i)s=me.__audioTracks[i],me.audioMenu.add({text:s.name,trackId:s.id,iconCls:s.id==me.__selectedAudioTrack?"btn-bullet-blue":"",handler:function(item){me.setAudioTrack(item.trackId)}})},initComponent:function(){var me=this;me.flashAvailable=Fbx.os.app.tv.FlashPlayer.isAvailable(),me.vlcAvailable=Fbx.os.app.tv.VLCPlayer.isAvailable(),me.__players=[],me.flashAvailable&&me.__players.push("flash"),me.vlcAvailable&&me.__players.push("vlc");var audioTrackListChangeHandler=function(player,audioTracks){me.__audioTracks=audioTracks,me.updateAudioMenu()},srtTrackListChangeHandler=function(player,srtTracks){if(me.__srtTracks=srtTracks,me.updateSrtMenu(),Fbx.os.app.tv.Settings.getUserPrefs().auto_subtitle)for(var i=0;i<srtTracks.length;++i)if(srtTracks[i].id>=0){me.setSrtTrack(srtTracks[i].id);break}},audioTrackChangeHandler=function(player,trackId){me.__selectedAudioTrack=trackId,me.updateAudioMenu(trackId)},srtTrackChangeHandler=function(player,trackId){me.__selectedSrtTrack=trackId,me.updateSrtMenu(trackId)},cardItems=[];me.flashAvailable?(me.flashPlayer=Ext.create("Fbx.os.app.tv.FlashPlayer",{listeners:{playbackFailed:function(){var s=me.__streams[me.__curStreamIdx];s.failures?s.failures+=1:s.failures=1,s.failures==me.__players.length&&(s.canPlay=!1),me.updateStreamMenu(),me.__isManualSelection?(Ext.Msg.alert("Flux indisponible","Le format de ce flux n'est pas pris en charge par Freebox OS"),me.__curChannel=null):me.__tryNext()},audioTrackListChange:audioTrackListChangeHandler,srtTrackListChange:srtTrackListChangeHandler,audioTrackChange:audioTrackChangeHandler,srtTrackChange:srtTrackChangeHandler,failure:function(){me.flashAvailable=!1,me.__curChannel=null}}}),cardItems.push(me.flashPlayer)):cardItems.push({xtype:"container",html:""}),me.vlcAvailable&&(me.vlcPlayer=Ext.create("Fbx.os.app.tv.VLCPlayer",{listeners:{audioTrackListChange:audioTrackListChangeHandler,srtTrackListChange:srtTrackListChangeHandler,audioTrackChange:audioTrackChangeHandler,srtTrackChange:srtTrackChangeHandler,failure:function(){me.vlcAvailable=!1,me.__curChannel=null}}}),cardItems.push(me.vlcPlayer)),me.streamMenu=Ext.create("Ext.menu.Menu",{items:[]}),me.streamBtn=Ext.create("Ext.button.Split",{iconCls:"btn-player-quality",text:"Qualité du flux",menu:me.streamMenu,handler:function(){me.streamBtn.maybeShowMenu()}}),me.audioMenu=Ext.create("Ext.menu.Menu",{items:[]}),me.audioBtn=Ext.create("Ext.button.Split",{iconCls:"btn-player-volume",text:"Piste audio",menu:me.audioMenu,handler:function(){me.audioBtn.maybeShowMenu()}}),me.srtMenu=Ext.create("Ext.menu.Menu",{items:[]}),me.srtBtn=Ext.create("Ext.button.Split",{iconCls:"btn-subtitle",text:"Sous titres",menu:me.srtMenu,handler:function(){me.srtBtn.maybeShowMenu()}}),me.playBtn=Ext.create("Ext.button.Button",{iconCls:"btn-player-play",tooltip:"Lecture",handler:function(){me.play(me.__curStreamIdx,0)}}),me.stopBtn=Ext.create("Ext.button.Button",{iconCls:"btn-player-stop",tooltip:"Stop",handler:function(){me.stop()}}),me.recBtn=Ext.create("Ext.button.Button",{iconCls:"btn-player-record",tooltip:"Enregistrer le programme courant",handler:function(){me.record()}});var userPref=Fbx.os.app.tv.Settings.getUserPrefs();userPref.volume||(userPref.volume=50,Fbx.os.app.tv.Settings.saveUserPrefs(userPref)),me.volumeSlider=Ext.create("Ext.slider.Single",{width:150,min:0,max:100,value:userPref.volume,increment:1,listeners:{change:function(slider,newVal){me.setVolume(newVal)}}}),me.muteBtn=Ext.create("Ext.button.Button",{iconCls:"btn-sound-mute",tooltip:"Couper le son",handler:function(){0==me.__curVolume?(me.__prevVolume||(me.__prevVolume=50),me.volumeSlider.setValue(me.__prevVolume),me.muteBtn.setIconCls("btn-sound-mute")):(me.__prevVolume=me.__curVolume,me.volumeSlider.setValue(0),me.muteBtn.setIconCls("btn-sound"))}}),me.controlTb=Ext.create("Ext.toolbar.Toolbar",{dock:"bottom",hidden:!0,items:[me.playBtn,me.stopBtn,me.recBtn,"-",me.muteBtn,{iconCls:"btn-player-volume",overCls:"",pressedCls:"",focusCls:""},me.volumeSlider,"->",me.streamBtn,me.audioBtn,me.srtBtn]}),Ext.apply(me,{layout:"card",dockedItems:[me.controlTb],items:cardItems}),me.callParent(arguments)},setAudioTrack:function(trackId){var me=this;me.__curPlayer&&me.__curPlayer.setAudioTrack&&me.__curPlayer.setAudioTrack(trackId)},setSrtTrack:function(trackId){var me=this;me.__curPlayer&&me.__curPlayer.setSrtTrack&&me.__curPlayer.setSrtTrack(trackId)},setVolume:function(pct){var me=this;if(me.__curPlayer&&me.__curPlayer.setVolume){me.__curPlayer.setVolume(pct),me.__curVolume=pct;var userPref=Fbx.os.app.tv.Settings.getUserPrefs();userPref.volume=pct,Fbx.os.app.tv.Settings.saveUserPrefs(userPref)}},fullScreen:function(){var me=this;me.__curPlayer&&me.__curPlayer.fullScreen&&me.__curPlayer.fullScreen()},zap:function(rec){var me=this;if(rec.getId()!=me.__curChannel&&me.stop(),me.controlTb.show(),me.__streams=[],me.__audioTracks=[],me.__srtTracks=[],me.updateStreamMenu(-1),me.updateAudioMenu(-1),me.updateSrtMenu(-1),!rec.get("pub_service"))return void Ext.Msg.alert("Impossible de visionner cette chaîne","Cette chaîne n'est pas disponible en multiposte");if(!rec.get("available")){return void(rec.get("channel").has_service?Ext.Msg.alert("Impossible de visionner cette chaîne","Vous n'êtes pas abonné à cette chaîne"):Ext.Msg.alert("Impossible de visionner cette chaîne","Cette chaîne n'est pas disponible en multiposte"))}for(var streamsList=[],recCanPlay=!1,streams=rec.get("streams"),i=0;i<streams.length;++i){var s=streams[i],canPlay=me.vlcAvailable||void 0!=s.hls&&me.flashAvailable;streamsList.push({name:Fbx.os.app.tv.Player.streamSourceName[s.type]+Fbx.os.app.tv.Player.streamQualityName[s.quality],type:s.type,quality:s.quality,rtsp:s.rtsp,hls:s.hls,canPlay:canPlay}),recCanPlay|=canPlay}var userPref=Fbx.os.app.tv.Settings.getUserPrefs(),sortFn=function(a,b){if(a.canPlay){if(!b.canPlay)return-1}else if(b.canPlay)return 1;var streamEntryIdx="hls";if("vlc"==userPref.prefered_player&&(streamEntryIdx="rtsp"),a[streamEntryIdx]){if(!b[streamEntryIdx])return-1}else if(b[streamEntryIdx])return 1;if(a.type==userPref.prefered_source){if(b.type!=userPref.prefered_source)return-1}else if(b.type==userPref.prefered_source)return 1;if(a.quality==userPref.prefered_quality){if(b.quality!=userPref.prefered_quality)return-1}else if(b.quality==userPref.prefered_quality)return 1;var diff=Fbx.os.app.tv.Player.streamTypePriority[a.type]-Fbx.os.app.tv.Player.streamTypePriority[b.type];return diff||((diff=Fbx.os.app.tv.Player.streamQualityPriority[a.type]-Fbx.os.app.tv.Player.streamQualityPriority[b.type])||0)};if(streamsList.sort(sortFn),me.__streams=streamsList,me.updateStreamMenu(-1),!recCanPlay)return void(me.vlcAvailable?Ext.Msg.alert("Impossible de visionner cette chaîne","Aucun flux n'est compatible avec votre configuration"):Ext.Msg.alert("Impossible de visionner cette chaîne","Vous devez installer le plugin VLC pour visualiser cette chaîne"));me.__players.sort(function(a,b){return a==userPref.prefered_player?-1:b==userPref.prefered_player?1:0}),me.__streams=streamsList,me.__curChannel=rec.get("uuid"),me.__curRec=rec,me.updateStreamMenu(0),me.play(0,!1)},updateStreamMenu:function(selectedId){var me=this;if(me.streamMenu.removeAll(),me.__streams)for(var i=0;i<me.__streams.length;++i)s=me.__streams[i],me.streamMenu.add({text:s.name,trackId:i,disabled:!s.canPlay,iconCls:selectedId==i?"btn-bullet-blue":"",handler:function(item){me.play(item.trackId,!1)}})},__playHls:function(url){var me=this;"mafreebox.freebox.fr"!=window.location.hostname&&"localhost"!=window.location.hostname&&(url=url.replace("mafreebox.freebox.fr",window.location.hostname)),me.getLayout().setActiveItem(0),me.__curPlayer=me.flashPlayer,me.flashPlayer.play(url)},__playVlc:function(url){var me=this;"mafreebox.freebox.fr"!=window.location.hostname&&"localhost"!=window.location.hostname&&(url=url.replace("mafreebox.freebox.fr",window.location.hostname)),me.getLayout().setActiveItem(1),me.__curPlayer=me.vlcPlayer,me.vlcPlayer.play(url)},__tryNext:function(){var me=this;me.__streams&&me.play(me.__curStreamIdx+1,!1)},play:function(streamIdx,manual){var me=this;if(0!=me.__streams.length){var playerIdx=Math.floor(streamIdx/me.__streams.length);if(playerIdx>me.__players.length)return me.stop(),me.vlcAvailable?Ext.Msg.alert("Erreur de lecture","Cette chaîne ne peut être lue sur Freebox OS"):Ext.Msg.alert("Impossible de visionner cette chaîne","Vous devez installer le plugin VLC pour visualiser cette chaîne"),void(me.__curChannel=null);var player=me.__players[playerIdx],realIdx=streamIdx%me.__streams.length,s=me.__streams[realIdx];if(s){if(me.updateStreamMenu(realIdx),!s.canPlay)return void me.play(streamIdx+1,!1);me.__curStreamIdx=streamIdx,me.__isManualSelection=manual;var userPref=Fbx.os.app.tv.Settings.getUserPrefs();switch(userPref.volume||(userPref.volume=50),me.setVolume(userPref.volume),player){case"vlc":if(me.vlcAvailable)return me.__playVlc(s.rtsp),void me.setVolume(userPref.volume);break;case"flash":if(me.flashAvailable&&s.hls)return me.__playHls(s.hls),void me.setVolume(userPref.volume)}me.__tryNext()}}},stop:function(){var me=this;me.__curPlayer&&me.__curPlayer.stop(),me.__selectedSrtTrack=-1,me.__selectedAudioTrack=-1,me.updateStreamMenu(-1)},record:function(){var me=this;if(me.__curChannel){me.editor||(me.editor=Ext.create("Fbx.os.app.pvr.PrecordEditor",{listeners:{save:function(){Ext.Msg.alert("Enregistrement programmé","Votre enregistrement a bien été programmé")}}}));var record,epgDb=Fbx.os.app.tv.EpgDb.getInstance(),prog=epgDb.getCurrentProgramForChannel(me.__curChannel);if(prog)record=Fbx.os.app.pvr.PrecordModel.create({name:prog.title,subname:prog.sub_title?prog.sub_title:"",channel_uuid:me.__curChannel,channel_quality:"auto",channel_type:"",start:prog.date,end:prog.end,broadcast_type:"tv",enabled:!0});else{var now=new Date,start=Math.ceil(now.getTime()/1e3);record=Fbx.os.app.pvr.PrecordModel.create({name:"",subname:"",channel_uuid:me.__curChannel,channel_quality:"auto",channel_type:"",start:start,end:start+3600,broadcast_type:"tv",enabled:!0})}me.editor.setRecord(record,!1),me.editor.show()}}});Ext.define("Fbx.ux.tree.FsViewDropZone",{extend:"Ext.tree.ViewDropZone",requires:["Fbx.os.app.explorer.FsTask","Fbx.os.lib.FbxUtils"],mixins:{fsdropzone:"Fbx.os.app.explorer.FsDropZoneMixin"},isValidDropPoint:function(node,position,dragZone,e,data){var me=this,view=this.view;targetNode=view.getRecord(node);var sourceRecords=data.records;if(!me.callParent(arguments))return!1;if(!targetNode||"dir"!=targetNode.get("type"))return!1;var targetPath=targetNode.get("path");return Fbx.os.app.explorer.FsTask.isValidDrop(sourceRecords,targetPath)},onContainerOver:function(dd,e,data){var me=this;me.callParent(arguments),me.overRecord=null},doFsOp:function(type,conflictMode){var me=this;"mv"==type?Fbx.os.app.explorer.FsTask.moveFiles(me.files,me.destDir,conflictMode,!1):"cp"==type&&Fbx.os.app.explorer.FsTask.copyFiles(me.files,me.destDir,conflictMode)},handleNodeDrop:function(data,targetNode,position){var me=this;targetNode&&me.handleDrop(data.records,targetNode.get("path"))}});Ext.define("Fbx.os.app.explorer.FsGridKeysMixin",{requires:["Fbx.os.app.explorer.FsTask"],constructor:function(){var me=this;me.on("boxready",function(){var el=me.getEl();me.addEvents("editfilename"),me.mon(el,"keydown",function(e){var selModel=me.getSelectionModel();if(!me.isEditing)if(e.ctrlKey)switch(e.getCharCode()){case e.A:selModel.selectAll(),me.rememberSelection&&me.rememberSelection(),e.stopEvent();break;case e.C:Fbx.os.app.explorer.FsTask.filesCopy(selModel.getSelection()),e.stopEvent();break;case e.V:Fbx.os.app.explorer.FsTask.filesPaste(me.curPath),e.stopEvent();break;case e.X:Fbx.os.app.explorer.FsTask.filesCut(selModel.getSelection()),e.stopEvent()}else switch(e.getCharCode()){case e.DELETE:var records=selModel.getSelection();if(0==records.length)return;Ext.Msg.show({title:"Suppression",msg:"Êtes-vous sûr de vouloir effacer ce(s) fichier(s) ?",buttons:Ext.Msg.YESNO,fn:function(buttonId){if("yes"==buttonId){var files=[],selection=selModel.getSelection();Ext.Array.each(selection,function(rec){var curPath=rec.get("path");Ext.Array.push(files,curPath)}),Fbx.os.app.explorer.FsTask.removeFiles(files)}}}),e.stopEvent();break;case e.DOWN:case e.UP:var store=me.getStore?me.getStore():null;if(!store||!store.first)return;var first=store.first();first&&selModel.select(first,!1,!1)}}),me.mon(me.body,"keydown",function(e){var selModel=me.getSelectionModel();if(!me.isEditing)switch(e.getCharCode()){case e.BACKSPACE:me.loadParent(),e.stopEvent();break;case e.ESC:selModel.deselectAll(),e.stopEvent();break;case e.F2:var records=selModel.getSelection();1==records.length&&me.fireEvent("editfilename",me,records[0]),e.stopEvent()}})})}});Ext.define("Fbx.os.app.settings.VpnServerConfigOpenVPN",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Fbx.os.app.settings.VpnServerModel","Ext.layout.component.FieldSet","Ext.form.FieldSet","Fbx.ux.form.field.TemplatedDisplay","Ext.form.field.Checkbox","Ext.form.field.Number","Fbx.os.app.settings.VpnServerOpenVPNUserGrid","Fbx.ux.form.AjaxFormPanel","Ext.data.Store"],initComponent:function(){var me=this;me.userConfGrid=Ext.create("Fbx.os.app.settings.VpnServerOpenVPNUserGrid",{title:"Fichiers de configuration",border:1,vpnid:me.vpnid}),Ext.applyIf(me,{bodyPadding:10,autoScroll:!0,border:0,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"fieldset",title:me.fieldSetTitle,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",fieldLabel:"Activer",boxLabel:"",name:"enabled",listeners:{change:function(field,newVal){var form=me.getForm();form.findField("port").setDisabled(!newVal),form.findField("conf_openvpn.cipher").setDisabled(!newVal),form.findField("conf_openvpn.disable_fragment").setDisabled(!newVal),form.findField("conf_openvpn.use_tcp").setDisabled(!newVal)}}},{xtype:"numberfield",fieldLabel:"Port",disabled:!0,ttip:"Port à utiliser pour la connexion",name:"port",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:0},{xtype:"combobox",fieldLabel:"Mode de chiffrement",disabled:!0,ttip:"Type de chiffrement à utiliser",name:"conf_openvpn.cipher",store:new Ext.data.Store({fields:["type","name"],data:[{type:"blowfish",name:"Blowfish"},{type:"aes128",name:"AES 128"},{type:"aes256",name:"AES 256"}]}),displayField:"name",valueField:"type",mode:"local",typeAhead:!1,editable:!1},{xtype:"checkboxfield",fieldLabel:"Désactiver la Fragmentation",disabled:!0,boxLabel:"",ttip:"Vous pouvez désactiver la fragmentation si votre client OpenVPN ne prend pas en charge cette option.",name:"conf_openvpn.disable_fragment"},{xtype:"checkboxfield",fieldLabel:"Utiliser TCP",disabled:!0,boxLabel:"",ttip:"Vous pouvez choisir d'utiliser TCP plutot que UDP pour transporter les données du tunnel VPN.",name:"conf_openvpn.use_tcp"}]},{xtype:"fieldset",itemId:"openvpn_supported_proto",title:"Protocoles supportés",hidden:!0,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",name:"enable_ipv4",fieldLabel:"IPv4",boxLabel:""},{xtype:"checkboxfield",name:"enable_ipv6",fieldLabel:"IPv6",boxLabel:""}]},me.userConfGrid]}),me.on("show",function(){me.load(),me.userConfGrid.store.load()}),me.on("loaded",function(form,data){me.userConfGrid.setVisible(data.enabled);var minPort=0,maxPort=65535;void 0!==data.max_port&&void 0!==data.min_port&&(minPort=data.min_port,maxPort=data.max_port),me.getComponent("openvpn_supported_proto").setVisible("openvpn_routed"==data.id);var form=me.getForm(),portField=form.findField("port");portField.setMinValue(minPort),portField.setMaxValue(maxPort),portField.minText="Vous devez choisir un port supérieur à "+minPort,portField.maxText="Vous devez choisir un port inférieur à "+maxPort,form.isValid()}),me.on("saved",function(form,data){me.userConfGrid.setVisible(data.enabled)}),me.callParent(arguments)},isDirty:function(){return this.form.isDirty()}});Ext.define("Fbx.os.app.contacts.ContactEditor",{extend:"Ext.form.Panel",requires:["Ext.grid.plugin.CellEditing","Ext.form.field.ComboBox","Ext.form.FieldContainer","Ext.form.field.Date","Fbx.ux.grid.plugin.CellEditing","Ext.grid.column.Template","Ext.grid.column.Action","Ext.Img","Ext.toolbar.Spacer","Fbx.os.app.contacts.AddressEditor","Fbx.os.app.contacts.IconEditor","Ext.selection.CheckboxModel","Ext.window.Window","Ext.data.Store","Fbx.os.app.contacts.ContactGroup","Ext.data.ArrayStore","Fbx.os.app.contacts.ContactEditorPanel"],alias:"widget.contactEditor",defaults:{labelWidth:80,anchor:"100%"},suppressWithConfirm:function(grid,rowIndex,cfmMsg){var store=grid.getStore(),rec=store.getAt(rowIndex);rec.phantom&&!rec.dirty?store.remove(rec):Ext.Msg.confirm("Suppression",cfmMsg,function(btn){"yes"==btn&&store.remove(rec)})},isLoading:function(){var loading=!1,record=this.getForm().getRecord();return!(!record||!record.store)&&(!!record.store.isLoading()||(record.onEachRelatedStores(function(assoc,store){store.isLoading()&&(loading=!0)}),loading))},setSuspendLayout:function(suspend){this.suspendLayout=suspend,this.contactGroups.suspendLayout=suspend,this.contactUrl.suspendLayout=suspend,this.contactAddress.suspendLayout=suspend,this.contactEmail.suspendLayout=suspend,this.contactTel.suspendLayout=suspend,suspend||this.doLayout()},updateEmptyTxt:function(){var me=this,form=me.getForm(),record=form.getRecord(),dField=form.findField("display_name");if(dField&&record){var vals=form.getValues();dField.emptyText=Fbx.os.app.contacts.app.getPrettyDisplayName(vals.first_name,vals.last_name,vals.display_name,vals.company),dField.applyEmptyText()}},onRecordLoaded:function(record){var me=this,groupStore=this.contactGroups.getStore();groupStore.removeAll(),Ext.data.StoreManager.lookup("contactGroupStore").each(function(rec){rec.fakeGroup||groupStore.add(rec)}),me.contactGroupsSelection.suspendEvents(!1);var selectedGroups=[];record.groups().each(function(groupRef){var gRecord=groupStore.getById(groupRef.get("group_id"));gRecord&&selectedGroups.push(gRecord)}),me.contactGroupsSelection.select(selectedGroups),me.contactGroupsSelection.resumeEvents(),this.contactTel.reconfigure(record.numbers()),this.contactEmail.reconfigure(record.emails()),this.contactUrl.reconfigure(record.urls()),this.contactAddress.reconfigure(record.addresses()),me.updateEmptyTxt(),this.setSuspendLayout(!1)},loadRecord:function(record){var me=this;me.scrollBy([0,-5e3]),this.setSuspendLayout(!0),this.getForm().reset(),this.getForm().trackResetOnLoad=!0;var ret=this.callParent(arguments);return me.onRecordLoaded(record),this.updatePhoto(),setTimeout(function(){me.setLoading(me.isLoading())},100),ret},updatePhoto:function(){var form=this.getForm(),record=form.getRecord(),contactImg=Ext.getCmp("contact-img"),imgUrl=record.get("photo_url");imgUrl?(contactImg.setSrc(imgUrl),contactImg.removeCls("contacts-anonymous")):(contactImg.setSrc(Ext.BLANK_IMAGE_URL),contactImg.addCls("contacts-anonymous"))},reset:function(reload){var form=this.getForm();form.reset();var record=form.getRecord();record&&(record.reject(),record.store&&record.store.fireEvent("datachanged"))},isDirty:function(){var form=this.getForm();if(form.isDirty())return!0;var dirty=!1,record=form.getRecord();return!!record&&(record.onEachRelatedStores(function(assoc,store){if(store.getNewRecords().length>0||store.getUpdatedRecords().length>0||store.getRemovedRecords().length>0)return dirty=!0,!1}),dirty)},isValid:function(){var form=this.getForm(),values=form.getValues(),valid=form.isValid(),msg="Le formulaire contient des erreurs";return Ext.isEmpty(values.company)&&Ext.isEmpty(values.first_name)&&Ext.isEmpty(values.display_name)&&Ext.isEmpty(values.last_name)&&(valid=!1,msg="Vous devez remplir au moins un des champs nom, prénom, ou société"),valid||Ext.Msg.show({title:"Erreur",msg:msg,buttons:Ext.Msg.OK,icon:Ext.Msg.ERROR}),valid},saveContact:function(){var centerPanel=this.up("panel");if(this.isValid()){if(!this.isDirty())return void centerPanel.getLayout().setActiveItem(0);var form=this.getForm(),record=form.getRecord();form.updateRecord(record),record.save({callback:function(newrecord,b,c){form.loadRecord(record),centerPanel.down("contactViewer").loadRecord(record),centerPanel.getLayout().setActiveItem(0);var store=Ext.getStore("contactStore");setTimeout(function(){store.load()},500)}})}},performWhenSaved:function(callback){var editor=this;if(this.isVisible()&&editor.isDirty())return void Ext.MessageBox.confirm("Modifications non sauvegardées","Voulez-vous enregistrer les modifications ?",function(btn){if("yes"==btn){if(!editor.isValid())return;editor.saveContact()}else editor.reset(!1);callback()});callback()},initComponent:function(){var me=this;me.dockedItems=[{xtype:"container",dock:"left",padding:5,items:[{xtype:"image",id:"contact-img",width:60,imgCls:"contacts-anonymous",src:Ext.BLANK_IMAGE_URL,listeners:{afterrender:function(img){var editor=img.up("form");img.el.on("click",function(){var record=editor.getRecord();editor.iconEditor.down("panel").loadRecord(record),editor.iconEditor.show()})}}}]},{weight:2,xtype:"toolbar",anchor:"100%",dock:"bottom",layout:{type:"hbox"},items:[{xtype:"button",text:"Supprimer",iconCls:"btn-delete",handler:function(me){var editor=me.up("form"),record=editor.getRecord(),deletefn=function(record){record.destroy();var centerPanel=editor.up("panel");editor.reset(!1),centerPanel.hide()};record.phantom?deletefn(record):Ext.MessageBox.confirm("Suppression","Êtes-vous sûr de vouloir supprimer ce contact ?",function(btn){"yes"==btn&&deletefn(record)})}},{xtype:"tbspacer",flex:1},{xtype:"button",text:"Annuler",iconCls:"btn-cancel",handler:function(me){var editor=me.up("form"),centerPanel=editor.up("panel"),viewer=centerPanel.down("contactViewer"),record=editor.getRecord();editor.reset(!1),centerPanel.getLayout().setActiveItem(0),record.phantom&&record.store?(record.store.remove(record),centerPanel.hide()):viewer.loadRecord(editor.getRecord())}},{xtype:"button",text:"Enregistrer",iconCls:"btn-disk",handler:function(me){me.up("form").saveContact()}}]}],me.numberColumns=[{xtype:"templatecolumn",dataIndex:"number",tpl:"{number:htmlEncode}",editor:{xtype:"textfield",allowBlank:!1,vtype:"phoneNumber"},flex:1},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite tel-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.phoneTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1,editor:{xtype:"combo",editable:!1,forceSelection:!0,store:Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[["fixed","Domicile"],["mobile","Mobile"],["work","Bureau"],["fax","Fax"],["other","Autre"]]}),listConfig:{getInnerTpl:function(){return'<div>  <div class="btn-sprite tel-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {label}  <div style="clear: both;"></div></div>'}},displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0}},{xtype:"actioncolumn",width:24,align:"center",stopSelection:!0,dataIndex:"is_default",items:[{tooltip:"Favoris",getClass:function(v,m,r){return"btn-sprite tel-favorite-"+r.get("is_default")},handler:function(grid,rowIndex,colIndex,item,e,rec){var store=grid.getStore(),favorite=!rec.get("is_default");rec.set("is_default",favorite),favorite&&store.each(function(record){record!=rec&&record.set("is_default",!1)})}}]},{xtype:"actioncolumn",width:24,align:"center",stopSelection:!0,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){return grid.up("form").suppressWithConfirm(grid,rowIndex,"Êtes-vous sûr de vouloir supprimer ce numéro ?"),!1}}]}],me.emailColumns=[{dataIndex:"email",editor:{xtype:"textfield",allowBlank:!1,vtype:"email"},flex:1},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite email-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.emailTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1,editor:{xtype:"combo",editable:!1,forceSelection:!0,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["home","Domicile"],["work","Bureau"],["other","Autre"]]}),listConfig:{getInnerTpl:function(){return'<div>  <div class="btn-sprite email-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {label}  <div style="clear: both;"></div></div>'}},displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0}},{xtype:"actioncolumn",width:24,align:"center",stopSelection:!0,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){return grid.up("form").suppressWithConfirm(grid,rowIndex,"Êtes-vous sûr de vouloir supprimer cet email ?"),!1}}]}],me.urlColumns=[{xtype:"templatecolumn",dataIndex:"url",tpl:"{url:htmlEncode}",editor:{xtype:"textfield",allowBlank:!1,value:"http://"},flex:1},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite url-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.urlTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1,editor:{xtype:"combo",editable:!1,forceSelection:!0,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["profile","Profil"],["blog","Blog"],["site","Site"],["other","Autre"]]}),listConfig:{getInnerTpl:function(){return'<div>  <div class="btn-sprite url-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {label}  <div style="clear: both;"></div></div>'}},displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0}},{xtype:"actioncolumn",width:24,align:"center",stopSelection:!0,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){return grid.up("form").suppressWithConfirm(grid,rowIndex,"Êtes-vous sûr de vouloir supprimer cette URL ?"),!1}}]}],me.addressColumns=[{xtype:"templatecolumn",tpl:"<div>  {number:htmlEncode} {street:htmlEncode} <br />  <tpl if=\"street2 != ''\">{street2:htmlEncode} <br /></tpl>  {zipcode:htmlEncode} {city:htmlEncode} <br />  {country:htmlEncode}</div>",dataIndex:"street",flex:1},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite address-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.addressTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1,editor:{xtype:"combo",editable:!1,forceSelection:!0,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["home","Domicile"],["work","Bureau"],["other","Autre"]]}),listConfig:{getInnerTpl:function(){return'<div>  <div class="btn-sprite address-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {label}  <div style="clear: both;"></div></div>'}},displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0}},{xtype:"actioncolumn",width:24,align:"center",stopSelection:!0,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex,f,e){return grid.up("form").suppressWithConfirm(grid,rowIndex,"Êtes-vous sûr de vouloir supprimer cette adresse ?"),!1}}]}],me.groupColumns=[{xtype:"templatecolumn",dataIndex:"name",tpl:"{name:htmlEncode}"}],this.addressEditor=Ext.create("Ext.window.Window",{title:"Adresse",layout:"fit",modal:!0,width:350,closeAction:"hide",items:{xtype:"addressEditor"}}),this.iconEditor=Ext.create("Ext.window.Window",{title:"Photo",layout:"fit",modal:!0,width:350,closeAction:"hide",items:{xtype:"iconEditor"},listeners:{hide:function(){me.updatePhoto()}}}),me.contactTelEditor=Ext.create("Fbx.ux.grid.plugin.CellEditing",{clicksToEdit:1}),me.contactTel=Ext.create("Fbx.os.app.contacts.ContactEditorPanel",{forceFit:!0,store:Ext.create("Ext.data.ArrayStore",{fields:[]}),dockedItems:[{xtype:"toolbar",cls:"transparent-toolbar",anchor:"100%",dock:"bottom",layout:{pack:"end",type:"hbox"},items:[{xtype:"button",iconCls:"btn-phone-add",text:"Ajouter un numéro",handler:function(){var store=me.contactTel.getStore(),from=this.up("form"),record=from.getRecord(),contact_id=record.get("id"),r=store.add({type:"fixed",contact_id:contact_id});r[0].set("contact_id",contact_id),me.contactTelEditor.startEditByPosition({column:0,row:store.indexOf(r[0])})}}]}],columns:me.numberColumns,plugins:[me.contactTelEditor]}),me.contactEmailEditor=Ext.create("Fbx.ux.grid.plugin.CellEditing",{clicksToEdit:1}),me.contactEmail=Ext.create("Fbx.os.app.contacts.ContactEditorPanel",{forceFit:!0,store:Ext.create("Ext.data.ArrayStore",{fields:[]}),dockedItems:[{xtype:"toolbar",cls:"transparent-toolbar",anchor:"100%",dock:"bottom",layout:{pack:"end",type:"hbox"},items:[{xtype:"button",iconCls:"btn-email-add",text:"Ajouter un email",handler:function(){var store=me.contactEmail.getStore(),editor=this.up("form"),record=editor.getRecord(),contact_id=record.get("id"),r=store.add({type:"home",contact_id:contact_id});r[0].set("contact_id",contact_id),me.contactEmailEditor.startEditByPosition({column:0,row:store.indexOf(r[0])})}}]}],columns:me.emailColumns,plugins:[me.contactEmailEditor]}),me.contactAddress=Ext.create("Fbx.os.app.contacts.ContactEditorPanel",{forceFit:!0,store:Ext.create("Ext.data.ArrayStore",{fields:[]}),dockedItems:[{xtype:"toolbar",cls:"transparent-toolbar",anchor:"100%",dock:"bottom",layout:{pack:"end",type:"hbox"},items:[{xtype:"button",iconCls:"btn-building-add",text:"Ajouter une adresse",handler:function(){var store=me.contactAddress.getStore(),editor=this.up("form"),record=editor.getRecord(),contact_id=record.get("id"),r=store.add({type:"home",contact_id:record.get("id")});r[0].set("contact_id",contact_id),editor.addressEditor.down("panel").loadRecord(r[0]),editor.addressEditor.show()}}]}],columns:me.addressColumns,listeners:{cellclick:function(grid,td,cellIndex,rec,tr,rowIndex,e,eOpts){if(0==cellIndex){var editor=grid.up("form");editor.addressEditor.down("panel").loadRecord(rec),editor.addressEditor.show()}}},plugins:[Ext.create("Fbx.ux.grid.plugin.CellEditing",{clicksToEdit:1})]}),me.contactUrlEditor=Ext.create("Fbx.ux.grid.plugin.CellEditing",{clicksToEdit:1}),me.contactUrl=Ext.create("Fbx.os.app.contacts.ContactEditorPanel",{forceFit:!0,store:Ext.create("Ext.data.ArrayStore",{fields:[]}),dockedItems:[{xtype:"toolbar",cls:"transparent-toolbar",anchor:"100%",dock:"bottom",layout:{pack:"end",type:"hbox"},items:[{xtype:"button",iconCls:"btn-email-add",text:"Ajouter une URL",handler:function(){var store=me.contactUrl.getStore(),editor=this.up("form"),record=editor.getRecord(),contact_id=record.get("id"),r=store.add({type:"site",contact_id:contact_id});r[0].set("contact_id",contact_id),me.contactUrlEditor.startEditByPosition({column:0,row:store.indexOf(r[0])})}}]}],columns:me.urlColumns,plugins:[me.contactUrlEditor]}),me.contactGroupsSelection=Ext.create("Ext.selection.CheckboxModel",{listeners:{deselect:function(model,group){var record=me.getRecord(),groupStore=record.groups(),group_id=group.get("id");if(0!=group_id){var index=groupStore.findExact("group_id",group_id);index>=0&&groupStore.removeAt(index)}},select:function(model,group){var record=me.getRecord(),groupStore=record.groups(),group_id=group.get("id");if(0!=group_id){var contact_id=record.get("id"),removed=groupStore.getRemovedRecords(),found=!1;for(var i in removed)if(removed[i].get("group_id")==group_id){groupStore.add(removed[i]),Ext.Array.remove(groupStore.removed,removed[i]),found=!0;break}found||groupStore.add({group_id:group.get("id"),contact_id:contact_id})}}}}),me.contactGroups=Ext.create("Fbx.os.app.contacts.ContactEditorPanel",{store:Ext.create("Ext.data.Store",{fields:[{name:"id",type:"int"},{name:"name",type:"string"}]}),forceFit:!0,selModel:me.contactGroupsSelection,columns:me.groupColumns,columnLines:!0,frame:!1,dockedItems:[{xtype:"toolbar",cls:"transparent-toolbar",anchor:"100%",dock:"bottom",layout:{pack:"end",type:"hbox"},items:[{xtype:"button",iconCls:"btn-group-add",text:"Ajouter un groupe",handler:function(){var store=me.contactGroups.getStore();Ext.MessageBox.prompt("Nouveau groupe","Nom du groupe",function(btn,text){if("ok"==btn){var groupStore=Ext.data.StoreManager.lookup("contactGroupStore"),group=Ext.create("Fbx.os.app.contacts.ContactGroup",{name:text});groupStore.add(group),groupStore.sync({callback:function(){store.add(group)},failure:function(){store.load()}})}})}}]}]}),this.items=[{xtype:"textfield",fieldLabel:"Nom d'affichage",name:"display_name",htmlEncode:!0,emptyText:"Nom d'affichage"},{xtype:"fieldcontainer",fieldLabel:"Nom",layout:{type:"hbox"},items:[{xtype:"textfield",emptyText:"Nom",name:"last_name",htmlEncode:!0,margins:{top:0,right:5,bottom:0,left:0},flex:1,maxLength:64,listeners:{change:function(){me.updateEmptyTxt()}}},{xtype:"textfield",emptyText:"Prénom",name:"first_name",htmlEncode:!0,flex:1,maxLength:64,listeners:{change:function(){me.updateEmptyTxt()}}}]},{xtype:"textfield",fieldLabel:"Société",emptyText:"Société",htmlEncode:!0,name:"company",maxLength:64,listeners:{change:function(){me.updateEmptyTxt()}}},{xtype:"fieldcontainer",fieldLabel:"Téléphone",labelWidth:80,anchor:"100%",items:[me.contactTel]},{xtype:"fieldcontainer",fieldLabel:"Email",labelWidth:80,anchor:"100%",items:[me.contactEmail]},{xtype:"fieldcontainer",fieldLabel:"Adresse",labelWidth:80,anchor:"100%",items:[me.contactAddress]},{xtype:"fieldcontainer",fieldLabel:"URL",labelWidth:80,anchor:"100%",items:[me.contactUrl]},{xtype:"datefield",fieldLabel:"Date de naissance",name:"birthday",htmlEncode:!0},{xtype:"textareafield",fieldLabel:"Notes",name:"notes"},{xtype:"fieldcontainer",fieldLabel:"Groupes",labelWidth:80,anchor:"100%",items:[me.contactGroups]}],this.callParent()},destroy:function(){this.contactGroupsSelection.destroy(),this.contactGroups.destroy(),this.contactUrl.destroy(),this.contactAddress.destroy(),this.contactEmail.destroy(),this.contactTel.destroy(),this.addressEditor.destroy(),this.iconEditor.destroy(),this.callParent()}});Ext.define("Fbx.os.app.settings.WifiMacFilterEditor",{extend:"Ext.window.Window",requires:["Ext.form.FieldSet","Ext.layout.component.FieldSet","Ext.form.field.ComboBox","Ext.form.field.Number","Fbx.os.lib.FbxUtils","Fbx.ux.form.field.HostSelector","Ext.form.field.Hidden","Ext.data.ArrayStore","Fbx.ux.form.field.HostSelector","Ext.form.Panel"],save:function(){var me=this,form=me.down("form").getForm();if(form.isValid()){var record=form.getRecord();form.updateRecord(record),record.save({success:function(){me.hide()}})}},submitOnEnter:function(field,event){var me=this;event.getKey()==event.ENTER&&me.save()},initComponent:function(){var me=this;Fbx.os.gui.Environment.getNetworkConf(function(conf){me.netConf=conf}),me.mon(Fbx.os.gui.Environment,"networkConfChanged",function(conf){me.netConf=conf}),me.hostCombo=Ext.create("Fbx.ux.form.field.HostSelector",{fieldLabel:"Adresse MAC",labelWidth:200,valueField:"mac",ttip:"Périphérique réseau que vous souhaitez ajouter à la liste",name:"mac",validator:function(val){var val=me.hostCombo.getValue();return Ext.form.field.VTypes.macAddr(val)}}),me.form=Ext.create("Ext.form.Panel",{trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){me.save()}}],defaults:{anchor:"100%",labelWidth:200,listeners:{specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},items:[{xtype:"displayfield",fieldLabel:"Périphérique",name:"hostname",listeners:{change:function(f,newVal){f.setVisible(""!=newVal)}}},me.hostCombo,{xtype:"combo",fieldLabel:"Type de filtrage",ttip:"Si vous ajoutez ce périphérique à la liste noire et que le filtrage MAC est activé, ce périphérique ne pourra plus se connecter à votre réseau Wi-Fi. Si vous ajoutez ce périphérique à la liste blanche et que le filtrage MAC est activé ce périphérique pourra se connecter à votre réseau Wi-Fi.",store:Ext.create("Ext.data.ArrayStore",{fields:["type","label"],data:[["whitelist","Liste blanche"],["blacklist","Liste noire"]]}),editable:!1,forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,name:"type"},{xtype:"textfield",fieldLabel:"Commentaire",maxLength:63,name:"comment",validator:function(value){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value)>63)||"Votre commentaire est trop long"}}]}),Ext.applyIf(me,{layout:"fit",closeAction:"hide",modal:!0,title:"Filtrage MAC",width:500,items:[me.form]}),me.callParent(arguments)},setRecord:function(record){var me=this;if(!me.record||me.record!=record){var form=me.form.getForm();me.record=record;form.findField("mac").setReadOnly(""!=record.get("mac")),form.loadRecord(record)}}});Ext.define("Fbx.ux.grid.GridViewDropZone",{extend:"Ext.view.DropZone",requires:["Fbx.os.app.explorer.FsTask","Fbx.os.lib.FbxUtils"],mixins:{fsdropzone:"Fbx.os.app.explorer.FsDropZoneMixin"},indicatorHtml:"",getDestDir:function(node){var me=this,destDir="";!node.getAttribute&&node.el&&(node=node.el);var target=me.view.getRecord(node);if(target&&"dir"==target.get("type"))destDir=target.get("path");else{var fileGrid=me.view.up("refreshgrid");if(!fileGrid)return me.dropNotAllowed;destDir=fileGrid.curPath}return destDir},onNodeOver:function(node,dragZone,e,data){var me=this,destDir=me.getDestDir(node);return me.valid=Fbx.os.app.explorer.FsTask.isValidDrop(data.records,destDir),me.valid?me.dropAllowed:me.dropNotAllowed},onContainerOver:function(dd,e,data){var me=this,fileGrid=me.view.up("refreshgrid");if(!fileGrid)return me.dropNotAllowed;var targetPath=fileGrid.curPath,sourceRecords=data.records;return me.valid=Fbx.os.app.explorer.FsTask.isValidDrop(sourceRecords,targetPath),me.valid?(me.callParent(arguments),me.dropAllowed):me.dropNotAllowed},onNodeDrop:function(node,dragZone,e,data){var me=this;if(me.valid){var destDir=me.getDestDir(node);me.handleDrop(data.records,destDir)}}});Ext.define("Fbx.os.app.settings.ports.PortRedirEditor",{extend:"Ext.window.Window",requires:["Ext.form.FieldSet","Ext.layout.component.FieldSet","Ext.form.field.ComboBox","Ext.form.field.Number","Fbx.os.lib.FbxUtils","Fbx.ux.form.field.HostSelector","Ext.form.Panel","Ext.data.ArrayStore","Fbx.os.app.settings.ports.PortRedirModel"],save:function(){var me=this,form=me.down("form").getForm();if(form.isValid()){var record=form.getRecord();form.updateRecord(record),record.save({success:function(){me.hide()}})}},submitOnEnter:function(field,event){var me=this;event.getKey()==event.ENTER&&me.save()},initComponent:function(){var me=this;me.hostCombo=Ext.create("Fbx.ux.form.field.HostSelector",{fieldLabel:"IP Destination",labelWidth:200,ttip:"Machine de votre réseau sur laquelle vous souhaiter rediriger le trafic",name:"lan_ip"}),me.form=Ext.create("Ext.form.Panel",{trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){me.save()}}],defaults:{anchor:"100%",labelWidth:200,listeners:{specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},items:[me.hostCombo,{xtype:"checkbox",fieldLabel:"Redirection active",inputValue:!0,name:"enabled"},{xtype:"combo",name:"src_ip",fieldLabel:"IP source",store:new Ext.data.ArrayStore({fields:["ip","name"],data:[["0.0.0.0","Toutes"]]}),displayField:"name",valueField:"ip",allowBlank:!1,queryMode:"local",validator:function(val){return"Toutes"==val||(!!Ext.form.field.VTypes.ip(val)||Ext.form.field.VTypes.ipText)}},{xtype:"combo",name:"ip_proto",fieldLabel:"Protocole",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["tcp","TCP"],["udp","UDP"]]}),displayField:"label",valueField:"type",mode:"local",ttip:"Protocole à rediriger",typeAhead:!1},{xtype:"numberfield",fieldLabel:"Port de début",name:"wan_port_start",ttip:"Port de début de la plage de ports à rediriger",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:1,listeners:{change:function(f,newVal,oldVal){var f=me.form.getForm(),fEnd=f.findField("wan_port_end"),endVal=fEnd.getValue();newVal>0&&fEnd.setMinValue(newVal),0!=endVal&&endVal!=oldVal||fEnd.setValue(newVal),fEnd.validate();var fDst=f.findField("lan_port"),dstVal=fDst.getValue();0!=dstVal&&dstVal!=oldVal||fDst.setValue(newVal)}}},{xtype:"numberfield",fieldLabel:"Port de fin",name:"wan_port_end",ttip:"Port de fin de la plage de rédirection de ports (identique au port de début si vous ne voulez rediriger qu'un port)",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:1,listeners:{change:function(f,newVal,oldVal){var f=me.form.getForm(),fStart=f.findField("wan_port_start"),fDst=f.findField("lan_port"),startVal=fStart.getValue();newVal!=startVal?(fDst.setValue(startVal),fDst.setReadOnly(!0),fDst.validate()):fDst.setReadOnly(!1),f.isValid()}}},{xtype:"numberfield",fieldLabel:"Port de destination",name:"lan_port",ttip:"Port de destination sur la machine de votre réseau",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:1},{xtype:"textfield",fieldLabel:"Commentaire",maxLength:63,name:"comment",validator:function(value){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value)>63)||"Votre commentaire est trop long"}}]}),Ext.applyIf(me,{layout:"fit",closeAction:"hide",modal:!0,title:"Redirection de port",width:500,items:[me.form]}),Fbx.os.app.settings.ports.PortRedirModel.getPortRange(function(range){var form=me.form.getForm(),wan_port=form.findField("wan_port_start"),minTxt="Vous devez choisir un port supérieur à "+range[0],maxTxt="Vous devez choisir un port inférieur à "+range[1];wan_port.setMinValue(range[0]),wan_port.setMaxValue(range[1]),wan_port.minText=minTxt,wan_port.maxText=maxTxt,form.isValid()}),me.callParent(arguments)},setRecord:function(record){var me=this;me.record&&me.record==record||(me.record=record,me.form.getForm().loadRecord(record))}});Ext.define("Fbx.ux.grid.plugin.FsGridViewDragDrop",{extend:"Ext.grid.plugin.DragDrop",alias:"plugin.fsgridviewdragdrop",requires:["Fbx.ux.grid.GridViewDropZone","Ext.view.DragZone"],onViewRender:function(view){var me=this;me.enableDrag&&(me.dragZone=Ext.create("Ext.view.DragZone",{view:view,ddGroup:me.dragGroup||me.ddGroup,dragText:me.dragText})),me.enableDrop&&(me.dropZone=Ext.create("Fbx.ux.grid.GridViewDropZone",{view:view,ddGroup:me.dropGroup||me.ddGroup}))}});Ext.define("Fbx.os.app.settings.SwitchStatus",{extend:"Fbx.ux.form.AjaxFormPanel",alias:"widget.switchstatus",requires:["Fbx.os.lib.FbxUtils","Fbx.ux.form.AjaxFormPanel","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.field.SizeDisplay","Fbx.ux.form.field.SpeedDisplay","Fbx.ux.form.field.TemplatedDisplay","Ext.container.Container","Ext.form.field.Display"],initComponent:function(){var me=this;Ext.applyIf(me,{url:"",disableLoadMask:!0,border:0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[],items:[{xtype:"container",layout:{align:"stretch",type:"hbox"},flex:1,items:[{xtype:"fieldset",margin:2,title:"Réception",flex:1,defaults:{anchor:"100%",labelWidth:180},items:[{xtype:"displayfield",fieldLabel:"Paquets reçus",name:"rx_good_packets"},{xtype:"displayfield",fieldLabel:"Paquets broadcast",name:"rx_broadcast_packets"},{xtype:"displayfield",fieldLabel:"Paquets multicast",name:"rx_multicast_packets"},{xtype:"displayfield",fieldLabel:"Paquets unicast",name:"rx_unicast_packets"},{xtype:"sizedisplayfield",fieldLabel:"Octets reçus",name:"rx_good_bytes"},{xtype:"speeddisplayfield",fieldLabel:"Débit instantané",name:"rx_bytes_rate"},{xtype:"templateddisplayfield",fieldLabel:"Débit instantané",name:"rx_packets_rate",tpl:"{val} paquets/s"}]},{xtype:"fieldset",margin:2,title:"Erreurs en réception",flex:1,defaults:{anchor:"100%",labelWidth:180},items:[{xtype:"displayfield",fieldLabel:"Paquets undersize",name:"rx_undersize_packets"},{xtype:"displayfield",fieldLabel:"Paquets runt",name:"rx_fragments_packets"},{xtype:"displayfield",fieldLabel:"Paquets oversize",name:"rx_oversize_packets"},{xtype:"displayfield",fieldLabel:"Paquets jabber",name:"rx_jabber_packets"},{xtype:"displayfield",fieldLabel:"Paquets CRC",name:"rx_fcs_packets"},{xtype:"sizedisplayfield",fieldLabel:"Octets reçus en erreur",name:"rx_bad_bytes"}]}]},{xtype:"container",layout:{align:"stretch",type:"hbox"},flex:1,items:[{xtype:"fieldset",margin:2,title:"Émission",flex:1,defaults:{anchor:"100%",labelWidth:180},items:[{xtype:"displayfield",fieldLabel:"Paquets émis",name:"tx_packets"},{xtype:"displayfield",fieldLabel:"Paquets broadcast",name:"tx_broadcast_packets"},{xtype:"displayfield",fieldLabel:"Paquets multicast",name:"tx_multicast_packets"},{xtype:"displayfield",fieldLabel:"Paquets unicast",name:"tx_unicast_packets"},{xtype:"sizedisplayfield",fieldLabel:"Octets émis",name:"tx_bytes"},{xtype:"speeddisplayfield",fieldLabel:"Débit instantané",name:"tx_bytes_rate"},{xtype:"templateddisplayfield",fieldLabel:"Débit instantané",name:"tx_packets_rate",tpl:"{val} paquets/s"}]},{xtype:"fieldset",margin:2,title:"Erreurs en émission",flex:1,defaults:{anchor:"100%",labelWidth:180},items:[{xtype:"displayfield",fieldLabel:"Paquets retardés",name:"tx_deferred"},{xtype:"displayfield",fieldLabel:"Collision",name:"tx_collisions"},{xtype:"displayfield",fieldLabel:"Collision unique",name:"tx_single"},{xtype:"displayfield",fieldLabel:"Collision multiple",name:"tx_multiple"},{xtype:"displayfield",fieldLabel:"Collision excessive",name:"tx_excessive"},{xtype:"displayfield",fieldLabel:"Collision retardée",name:"tx_late"},{xtype:"displayfield",fieldLabel:"Paquets CRC",name:"tx_fcs"}]}]}]}),me.callParent(arguments)},refresh:function(portId){var me=this;me.url=FbxConf.apiBaseUrl+"switch/port/"+portId+"/stats",me.load()}});Ext.define("Fbx.os.app.downloader.BtBlacklistGrid",{extend:"Fbx.ux.grid.RefreshGrid",requires:["Fbx.os.app.downloader.BtBlacklistModel","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Boolean","Ext.grid.column.Number","Ext.grid.column.Template","Fbx.os.lib.FbxUtils","Ext.data.Store","Ext.menu.Menu"],suspendRefresh:!0,initComponent:function(){var me=this;me.blacklistStore=Ext.create("Ext.data.Store",{remoteSort:!1,remoteFilter:!0,model:"Fbx.os.app.downloader.BtBlacklistModel"}),Ext.applyIf(me,{stateId:"btblacklistgrid",selModel:{mode:"MULTI"},store:me.blacklistStore,tbar:[{iconCls:"btn-delete",text:"Vider la blacklist",handler:function(){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"downloads/"+me.task_id+"/blacklist/empty",method:"DELETE",success:function(){me.blacklistStore.reload()}})}}],columns:[{dataIndex:"host",text:"Hôte",flex:2},{xtype:"templatecolumn",text:"Motif",dataIndex:"reason",tpl:"{[Fbx.os.app.downloader.BtBlacklistModel.blReason[values.reason]]}",flex:3},{xtype:"templatecolumn",dataIndex:"expire",text:"Expiration",tpl:"{[Fbx.os.lib.FbxUtils.formatDuration(values.expire)]}",flex:2},{xtype:"booleancolumn",text:"Global",trueText:"Oui",falseText:"Non",dataIndex:"global"}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Blacklist vide</div>'}}),this.callParent(arguments)},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Retirer de la blacklist",iconCls:"btn-access-allowed",handler:function(){var records=me.getSelectedRecord();for(var i in records)records[i].destroy()}}]})),me.contextMenu}});Ext.define("Fbx.os.app.explorer.FsDropUploadMixin",{requires:["Fbx.os.app.explorer.FsUpload","Ext.dom.Element"],clearDropIndicator:function(){var elems=Ext.select(".file-drop-available");Ext.Array.each(elems,function(el){el.removeCls("file-drop-available")})},constructor:function(preventDropOnEmpty){var me=this;me.preventDropOnEmpty=preventDropOnEmpty,me.on("boxready",function(){var el=me.body;me.mon(el,"dragover",function(e){e.stopEvent()}),me.mon(el,"dragenter",function(e){var t=me.getDropTarget(e);if(e.stopEvent(),me.preventDropOnEmpty){if(!me.getDropPath(t))return!1}me.clearDropIndicator(),t&&t.addCls("file-drop-available")}),me.mon(el,"dragexit",function(e){e.stopEvent(),me.clearDropIndicator()}),me.mon(el,"pathchanged",function(e){me.clearDropIndicator()}),me.mon(el,"drop",function(e){var event=e.browserEvent;if(e.stopEvent(),me.clearDropIndicator(),event&&event.dataTransfer&&event.dataTransfer.files){var t=me.getDropTarget(e),path=me.getDropPath(t);path&&Fbx.os.app.explorer.FsUpload.startUpload(path,event.dataTransfer.items,event.dataTransfer.files)}})})},getDropPath:function(t){var me=this,rec=null;if(t){var recs=me.view.getRecords([t.dom]);rec=recs?recs[0]:null,rec&&"dir"!=rec.get("type")&&(rec=null)}return rec?rec.get("path"):!me.preventDropOnEmpty&&me.curPath},getDropTarget:function(e){var me=this,t=me.view.findTargetByEvent(e);return t?new Ext.dom.Element(t):me.body}});Ext.define("Fbx.os.app.downloader.DownloadInfosWin",{extend:"Ext.window.Window",requires:["Fbx.ux.form.AjaxFormPanel","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.DateDisplay","Ext.grid.Panel","Ext.form.field.Display","Fbx.os.gui.grid.column.EnumColumn","Fbx.os.app.downloader.DownloadTaskModel","Ext.button.Button","Fbx.ux.form.field.SizeDisplay","Fbx.ux.form.field.EnumDisplay","Fbx.ux.form.field.SpeedDisplay"],width:420,height:470,title:"",closeAction:"destroy",resizable:!1,preventReload:!1,initComponent:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{showApplyCancel:!1,showOkBtn:!1,bodyPadding:10,defaults:{labelWidth:100,anchor:"100%",htmlEncode:!0},items:[{xtype:"displayfield",fieldLabel:"Nom",name:"name"},{xtype:"enumdisplayfield",fieldLabel:"Statut",name:"status",strings:Fbx.os.app.downloader.DownloadTaskModel.dlStatus},{xtype:"datedisplayfield",name:"created_ts",fieldLabel:"Date d'ajout"},{xtype:"sizedisplayfield",name:"size",fieldLabel:"Taille"},{xtype:"enumdisplayfield",fieldLabel:"Priorité",name:"io_priority",strings:Fbx.os.app.downloader.DownloadTaskModel.dlPriorities},{xtype:"displayfield",fieldLabel:"Destination",name:"decoded_download_dir"},{xtype:"sizedisplayfield",name:"rx_bytes",fieldLabel:"Reçu"},{xtype:"speeddisplayfield",name:"rx_rate",fieldLabel:"Réception"},{xtype:"sizedisplayfield",name:"tx_bytes",fieldLabel:"Émis"},{xtype:"speeddisplayfield",name:"tx_rate",fieldLabel:"Émission"},{xtype:"enumdisplayfield",name:"error",fieldLabel:"Erreur",strings:Fbx.os.app.downloader.DownloadTaskModel.dlErrors}]}),me.btnOk=Ext.create("Ext.button.Button",{text:"OK",iconCls:"btn-accept",handler:function(){me.close()}}),Ext.applyIf(me,{layout:"fit",items:[me.form],buttons:[me.btnOk]}),me.callParent(arguments)},setRecord:function(record){var me=this;if(me.record!=record){me.record=record,me.setTitle("Téléchargement de "+record.get("name"));var data=record.getData();me.form.setValues(data)}}});Ext.define("Fbx.os.app.settings.VpnClientConfig",{extend:"Fbx.ux.grid.CtxMenuGrid",requires:["Ext.data.Store","Ext.data.ArrayStore","Ext.button.Button","Fbx.os.app.settings.VpnClientConfigModel","Fbx.os.app.settings.VpnClientConfigEditor","Ext.form.field.ComboBox","Ext.menu.Menu","Ext.data.ArrayStore","Ext.data.Store"],selectedVpn:"undef",initComponent:function(){var me=this;me.comboStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.VpnClientConfigModel",listeners:{beforeload:function(){return!1}}}),me.vpnConfigStore=Ext.create("Ext.data.Store",{storeId:"vpnConfStore",model:"Fbx.os.app.settings.VpnClientConfigModel",remoteSort:!1,remoteFilter:!1,pageSize:0,listeners:{load:function(){me.setLoading(!1);var storeData=[{id:"",description:"Aucune"}];me.selectedVpn="",me.vpnConfigStore.each(function(r){storeData.push({id:r.getId(),description:r.get("description")}),r.get("active")&&(me.selectedVpn=r.getId())}),me.comboStore.loadData(storeData),me.vpnCombo.select(me.selectedVpn)}}}),me.applyBtn=Ext.create("Ext.button.Button",{text:"Appliquer",iconCls:"btn-accept",hidden:!0,handler:function(){var sel=me.vpnCombo.getValue(),r=null;(r=""==sel?me.vpnConfigStore.findRecord("active",!0):me.vpnConfigStore.getById(sel))&&(r.set("active",""!=sel),r.save({callback:function(){me.applyBtn.setVisible(!1),me.vpnConfigStore.load()}}))}}),me.vpnCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Connexion active",labelWidth:150,editable:!1,forceSelection:!0,store:me.comboStore,value:"all",displayField:"description",valueField:"id",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,listeners:{change:function(combo,newVal){me.applyBtn.setVisible(newVal!=me.selectedVpn)}}}),Ext.apply(me,{store:me.vpnConfigStore,autoScroll:!0,bodyPadding:0,tbar:[me.vpnCombo," ",me.applyBtn,"->",{xtype:"button",text:"Ajouter une connexion",iconCls:"btn-add",handler:function(){var recs=me.vpnConfigStore.add({type:"pptp"}),rec=recs[0];me.showEditor(rec)}}],columns:[{xtype:"templatecolumn",dataIndex:"active",width:40,tpl:'<tpl if="active"><div class="btn-star" style="margin: 0 auto;"></div></tpl>'},{xtype:"templatecolumn",dataIndex:"description",text:"Description",flex:3,tpl:'<div class="vpn-client-cfg">  <div class="vpn-client-name">{description:htmlEncode}</div>  <tpl if="type == \'pptp\'"><div class="vpn-client-host">Hôte: {[values[\'conf_\' + values.type].remote_host]}</div></tpl>  <div class="vpn-client-type">Type: {type}</div></div>'},{xtype:"actioncolumn",hideable:!1,width:30,items:[{iconCls:"btn-edit",tooltip:"Éditer",handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex));me.showEditor(rec)}}]},{xtype:"actioncolumn",hideable:!1,width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);me.delRecord(rec)}}]}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucune connexion VPN</div>',getRowClass:function(record,rowIndex,rowParams,store){return"vpn-client-row-"+(record.get("active")?"on":"off")}},listeners:{celldblclick:function(gird,td,cellIndex,record,tr,rowIndex,e,eOpts){2!=cellIndex&&3!=cellIndex&&me.showEditor(record)}}}),me.on("boxready",function(){me.setLoading(!0),me.vpnConfigStore.load()}),me.on("show",function(){me.vpnConfigStore.load()}),me.callParent(arguments)},showEditor:function(rec){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.settings.VpnClientConfigEditor",{title:"Configuration client VPN",modal:!0,width:600,height:460,closeAction:"hide"}));var updatedRec=me.vpnConfigStore.getById(rec.getId());me.editor.loadRecord(updatedRec),me.editor.show()},delRecord:function(rec){var me=this;rec.phantom?me.vpnConfigStore.remove(rec):Ext.MessageBox.confirm("Supprimer","Voulez-vous supprimer cette connexion VPN ?",function(btn){"yes"==btn&&(me.vpnConfigStore.remove(rec),me.vpnConfigStore.sync())})},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{text:"<strong>Éditer la connexion</strong>",iconCls:"btn-edit",handler:function(){var records=me.getSelectedRecord();if(records.length){var rec=records[0];me.showEditor(rec)}}},{text:"Définir comme connexion active",iconCls:"btn-accept",handler:function(){var records=me.getSelectedRecord();if(records.length){var r=records[0];r.set("active",!0),r.save({callback:function(){me.vpnConfigStore.load()}})}}},{text:"Supprimer la connexion",iconCls:"btn-delete",handler:function(){var records=me.getSelectedRecord();if(records.length){var rec=records[0];me.delRecord(rec)}}}]})),me.contextMenu}});Ext.define("Fbx.os.app.settings.storage.RaidList",{extend:"Ext.panel.Panel",requires:["Fbx.os.gui.grid.column.EnumColumn","Fbx.os.app.settings.storage.RaidModel","Ext.grid.column.Action","Ext.data.Store","Ext.grid.column.Template","Fbx.ux.grid.RefreshGrid","Fbx.ux.form.field.SizeDisplay","Ext.window.Window","Fbx.os.app.settings.storage.Config","Fbx.os.app.settings.storage.Fsck","Ext.form.Panel","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.DurationDisplay","Fbx.os.app.settings.storage.Format","Fbx.os.app.settings.storage.RaidMemberList","Fbx.ux.form.field.EnumDisplay","Fbx.os.app.settings.storage.RaidCreateWindow"],showRaidWin:function(){Ext.create("Fbx.os.app.settings.storage.RaidCreateWindow").show()},fsOpCb:function(r,success){var me=this;success||(r.dirty=!1,me.store.load())},initComponent:function(){var me=this;me.store=Ext.create("Ext.data.Store",{autoLoad:!1,remoteSort:!1,remoteFilter:!1,model:"Fbx.os.app.settings.storage.RaidModel",storeId:"storageRaidStore",listeners:{load:function(s,records){var selModel=me.raidList.getSelectionModel();if(0===records.length)return selModel.deselectAll(),void me.memberList.store.loadData([]);if(!selModel.hasSelection()){var first=me.store.first();first&&selModel.select(first,!1)}}}}),me.raidList=Ext.create("Fbx.ux.grid.RefreshGrid",{title:"Array Raid",store:me.store,selModel:{mode:"SINGLE"},hideHeaders:!0,width:300,region:"west",split:!0,dockedItems:[{xtype:"container",padding:2,dock:"bottom",layout:{align:"stretch",type:"vbox"},defaults:{margin:"2 0 1 0"},items:[{xtype:"button",text:"Créer un array RAID",iconCls:"btn-add",handler:function(){me.showRaidWin()}}]}],columns:[{xtype:"templatecolumn",width:40,tpl:'<div class="storage-sprite storage-raid-{icon_type}" style="float: left;"></div>'},{xtype:"templatecolumn",dataIndex:"id",flex:1,tpl:'<div class="storage-disk"><div class="storage-disk-title">{name:htmlEncode}</div><div class="storage-disk-state">&bull; État: <span class="{display_cls}">{state_str:htmlEncode}</span></div><div class="storage-disk-state">&bull; Sync: {sync_str}</div><div class="storage-disk-table">&bull; Type: {level_str}</div><div class="storage-disk-size">&bull; Taille: {[Fbx.os.lib.FbxUtils.fileSize(values.array_size)]}</div><div class="storage-disk-pos">&bull; Nombre de Disques: {raid_disks}</div></div>'},{xtype:"actioncolumn",width:26,padding:3,items:[{getClass:function(v,m,r){return"running"===r.get("state")?"btn16 btn-control-eject-blue":"btn16 btn-drive-go"},handler:function(grid,rowIndex,colIndex,f,e){var r=grid.getStore().getAt(rowIndex);"running"===r.get("state")?r.stop(me.fsOpCb):r.start(me.fsOpCb)}}]},{xtype:"actioncolumn",width:26,padding:3,items:[{getClass:function(v,m,r){return"btn16 btn-delete"},handler:function(grid,rowIndex,colIndex,f,e){var r=grid.getStore().getAt(rowIndex);"running"===r.get("state")?Ext.Msg.alert("Opération non autorisée","Vous devez stopper l'array raid avant de pouvoir le supprimer"):Ext.Msg.show({title:"Suppression de l'array raid",msg:"Confirmez vous la suppression de l'array raid '"+Ext.String.htmlEncode(r.get("name"))+"' ?<br />ATTENTION: Toutes les données seront perdues",buttons:Ext.Msg.YESNO,fn:function(btn){"yes"===btn&&Ext.Msg.show({title:"Suppression de l'array raid",msg:"Dernière chance !<br />Vous êtes sûr de bien vouloir supprimer les données présentes sur cet array RAID ?",buttons:Ext.Msg.YESNO,fn:function(btn){"yes"===btn&&r.destroy()},icon:Ext.Msg.WARNING})},icon:Ext.Msg.WARNING})}}]}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun array raid</div>'},listeners:{itemclick:function(grid,rec,item,index,e,eOpts){grid.getSelectionModel().select(rec),me.updateDisplay(rec)},refresh:function(grid){var sel=grid.getSelectedRecord();if(1===sel.length){var rec=grid.store.getById(sel[0].getId());if(!rec)return void me.memberForm.hide();me.updateDisplay(rec),me.updateForm()}else me.memberForm.hide()}}}),me.memberList=Ext.create("Fbx.os.app.settings.storage.RaidMemberList",{autoScroll:!0,title:"Membres",flex:1,listeners:{itemclick:function(grid,rec,item,index,e,eOpts){me.updateForm(rec)}}}),me.memberForm=Ext.create("Ext.form.Panel",{bodyPadding:10,autoScroll:!0,hidden:!0,title:"Informations du membre",flex:1,buttons:["->",{text:"Annuler",iconCls:"btn-cancel",handler:function(){me.up("window").close()}}],defaults:{anchor:"100%",labelWidth:220},layout:"vbox",items:[{xtype:"displayfield",name:"dev_uuid",fieldLabel:"UUID"},{xtype:"displayfield",name:"corrected_read_errors",fieldLabel:"Erreurs de lecture corrigées"},{xtype:"enumdisplayfield",name:"role",fieldLabel:"État",strings:{active:"Actif",faulty:"Défaillant",spare:"Disque de rechange"}},{xtype:"templateddisplayfield",name:"sct_erc_supported",fieldLabel:" Error Recovery Control supporté",tpl:'<tpl if="val">Oui</tpl><tpl if="!val">Non</tpl>'},{xtype:"templateddisplayfield",name:"sct_erc_enabled",fieldLabel:" Error Recovery Control activé",tpl:'<tpl if="val">Oui</tpl><tpl if="!val">Non</tpl>'},{xtype:"displayfield",name:"disk_temp",fieldLabel:"Température"}]}),Ext.applyIf(me,{layout:"border",items:[me.raidList,{xtype:"container",layout:{align:"stretch",type:"vbox"},region:"center",items:[me.memberList,me.memberForm]}],listeners:{afterrender:function(){me.store.load()},show:function(){me.raidList.suspendRefresh=!1,me.store.load()},hide:function(){me.raidList.suspendRefresh=!0}}}),this.callParent(arguments)},updateDisplay:function(rec){var me=this,members=rec.get("members");me.memberList.store.loadData(members),me.memberForm.show()},updateForm:function(rec){var me=this,selModel=me.memberList.getSelectionModel();rec?selModel.select(rec):(selModel.selected.length<1&&selModel.select(0),rec=selModel.selected.first()),me.memberForm.show(),me.memberForm.loadRecord(rec)},getSelectedArray:function(){var me=this,selModel=me.raidList.getSelectionModel();return selModel.selected.length<1?null:selModel.selected.first()}});Ext.define("Fbx.os.app.settings.ports.PortRedirConfig",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Fbx.os.app.settings.ports.PortRedirModel","Fbx.ux.form.AjaxFormPanel","Ext.form.FieldSet","Ext.grid.column.Template","Ext.grid.column.Action","Ext.grid.column.Boolean","Fbx.os.gui.grid.column.EnumColumn","Ext.layout.component.FieldSet","Ext.form.field.Checkbox","Ext.grid.plugin.CellEditing","Ext.form.field.Number","Ext.form.field.ComboBox","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore","Fbx.os.app.settings.ports.PortRedirEditor","Ext.grid.column.Template","Fbx.os.app.lanbrowser.HostInfosWin","Fbx.os.app.lanbrowser.HostModel","Fbx.ux.form.field.HostSelector","Ext.data.Store"],showHostDetailsWin:function(host){var detailWin=Ext.create("Fbx.os.app.lanbrowser.HostInfosWin");detailWin.loadById(host.id),detailWin.show()},initComponent:function(){var me=this;me.hostCombo=Ext.create("Fbx.ux.form.field.HostSelector",{fieldLabel:"IP Destination",labelWidth:200,fieldLabel:"IP DMZ",ttip:"Machine de votre réseau sur laquelle vous souhaitez rediriger tout le trafic entrant",name:"ip",disabled:"true"}),me.redirStore=Ext.create("Ext.data.Store",{storeId:"portRedir",model:"Fbx.os.app.settings.ports.PortRedirModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"mac",direction:"ASC"}],pageSize:0}),Ext.apply(me,{url:FbxConf.apiBaseUrl+"fw/dmz/",bodyPadding:10,layout:{align:"stretch",type:"vbox"},items:[{xtype:"grid",title:"Liste des redirections",flex:2,viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucune redirection de port configurée</div>'},store:me.redirStore,buttons:[{iconCls:"btn-arrow-refresh",text:"Rafraîchir",handler:function(){me.redirStore.load()}},{iconCls:"btn-add",text:"Ajouter une redirection",handler:function(){var recs=me.redirStore.add({lan_ip:"",enabled:!0,wan_port_start:"",wan_port_end:"",lan_port:"",comment:""});me.showEditor(recs[0])}}],columns:[{xtype:"booleancolumn",dataIndex:"enabled",text:"Active",flex:1,falseText:"Désactivée",trueText:"Active"},{xtype:"templatecolumn",dataIndex:"wan_port_start",text:"Redirection",tpl:'Protocole: {ip_proto} <br /><tpl if="!valid"><span style="color: red"></tpl>WAN : <tpl if="wan_port_start == wan_port_end">{wan_port_start}</tpl><tpl if="wan_port_start != wan_port_end">{wan_port_start} &rarr; {wan_port_end}</tpl><tpl if="!valid"></span> <div class="btn-warn" style="display: inline-block;" ></div></tpl><br />LAN: <tpl if="wan_port_start == wan_port_end">{lan_port}</tpl><tpl if="wan_port_start != wan_port_end">{lan_port} &rarr; {[values.lan_port + values.wan_port_end - values.wan_port_start]}</tpl><br />Commentaire: {comment:htmlEncode}',flex:3},{xtype:"templatecolumn",dataIndex:"src_ip",flex:2,text:"IP source",tpl:'{[values.src_ip == "0.0.0.0" ? "Toutes" : values.src_ip]}'},{xtype:"templatecolumn",dataIndex:"hostname",flex:2,text:"Destination",tpl:'<a href="#">{hostname:htmlEncode}</a>'},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-edit",tooltip:"Éditer",handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex));me.showEditor(rec)}}]},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var store=grid.getStore(),rec=grid.getStore().getAt(rowIndex);rec.phantom?store.remove(rec):Ext.MessageBox.confirm("Supprimer","Voulez-vous supprimer cette redirection ?",function(btn){"yes"==btn&&(store.remove(rec),store.sync())})}}]}],listeners:{cellclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){if("hostname"==grid.headerCt.getGridColumns()[cellIndex].dataIndex){e.stopEvent();var host=record.get("host");""!=host&&me.showHostDetailsWin(host)}},itemdblclick:function(grid,rec,item,index,e,eOpts){me.showEditor(rec)}}},{xtype:"fieldset",title:"DMZ",anchor:"100%",defaults:{anchor:"100%",labelWidth:200},layout:{type:"vbox",align:"stretch"},items:[{xtype:"checkboxfield",fieldLabel:"Activer la DMZ",ttip:"Cette fonctionnalité vous permet de rediriger tout le trafic entrant vers une machine de votre réseau",name:"enabled",boxLabel:"",listeners:{change:function(field,newVal){var form=me.getForm();form.findField("ip").setDisabled(!newVal),form.isValid()}}},me.hostCombo]}]}),me.callParent(arguments),me.mon(me,"show",function(){me.load()}),me.mon(me,"loaded",function(){me.redirStore.load()}),me.load()},showEditor:function(rec){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.settings.ports.PortRedirEditor",{closeAction:"hide",listeners:{hide:function(){setTimeout(function(){me.redirStore.load()},300)}}})),me.editor.setRecord(rec),me.editor.show()}});Ext.define("Fbx.os.app.contacts.ContactViewerPanel",{extend:"Ext.grid.Panel",requires:["Fbx.os.app.contacts.ContactModel","Ext.data.ArrayStore","Fbx.os.app.contacts.ContactEditorPanel","Ext.XTemplate"],preventHeader:!0,enableColumnHide:!1,enableColumnMove:!1,enableColumnResize:!1,hideHeaders:!0,sortableColumns:!1,disableSelection:!0,border:0,flex:1,bodyStyle:{border:0},viewConfig:{loadMask:!1}}),Ext.define("Fbx.os.app.contacts.ContactViewer",{extend:"Ext.form.Panel",requires:["Ext.grid.plugin.CellEditing","Ext.form.field.Text","Ext.toolbar.Toolbar","Ext.form.field.ComboBox","Ext.form.FieldContainer","Fbx.ux.grid.plugin.CellEditing","Ext.grid.column.Template","Ext.grid.column.Action","Ext.Img","Fbx.os.app.contacts.AddressEditor","Fbx.os.app.contacts.IconEditor"],alias:"widget.contactViewer",defaults:{labelWidth:80,anchor:"100%"},dockedItems:[{xtype:"container",dock:"left",padding:5,items:[{xtype:"image",id:"view-contact-img",shrinkWrap:1,width:60,imgCls:"contacts-anonymous"}]},{weight:2,xtype:"toolbar",anchor:"100%",dock:"bottom",layout:{pack:"end",type:"hbox"},items:[{xtype:"button",text:"Modifier",iconCls:"btn-monitor-edit",handler:function(me){var viewer=me.up("panel"),centerPanel=viewer.up("panel"),editor=centerPanel.down("contactEditor");centerPanel.getLayout().setActiveItem(1),editor.loadRecord(viewer.getRecord())}}]}],setSuspendLayout:function(suspend){this.suspendLayout=suspend,this.contactTel.suspendLayout=suspend,this.contactUrl.suspendLayout=suspend,this.contactAddress.suspendLayout=suspend,this.contactEmail.suspendLayout=suspend,this.contactTel.suspendLayout=suspend,suspend||this.doLayout()},onRecordLoaded:function(record){if(record.store&&record.store.fireEvent("datachanged"),Ext.isEmpty(record.get("first_name"))&&Ext.isEmpty(record.get("last_name"))?Ext.getCmp("name-container").hide():Ext.getCmp("name-container").show(),Ext.isEmpty(record.get("company"))?Ext.getCmp("company-container").hide():Ext.getCmp("company-container").show(),Ext.isEmpty(record.get("notes"))?Ext.getCmp("notes-container").hide():Ext.getCmp("notes-container").show(),Ext.isEmpty(record.get("birthday"))?Ext.getCmp("birthday-container").hide():Ext.getCmp("birthday-container").show(),record.numbers().count()?(this.numbersContainer.show(),this.contactTel.reconfigure(record.numbers())):this.numbersContainer.hide(),record.emails().count()?(this.mailsContainer.show(),this.contactEmail.reconfigure(record.emails())):this.mailsContainer.hide(),record.urls().count()?(this.urlsContainer.show(),this.contactUrl.reconfigure(record.urls())):this.urlsContainer.hide(),record.addresses().count()?(this.addressesContainer.show(),this.contactAddress.reconfigure(record.addresses())):this.addressesContainer.hide(),record.groups().count()){var gStore=this.contactGroups.store;gStore.removeAll();var groupStore=Ext.data.StoreManager.lookup("contactGroupStore");record.groups().each(function(groupRef){var gRecord=groupStore.getById(groupRef.get("group_id"));gRecord&&gStore.add({name:gRecord.get("name")})}),this.groupsContainer.show()}else this.groupsContainer.hide();this.setSuspendLayout(!1)},isLoading:function(){var loading=!1,record=this.getForm().getRecord();return!(!record||!record.store)&&(!!record.store.isLoading()||(record.onEachRelatedStores(function(assoc,store){store.isLoading()&&(loading=!0)}),loading))},loadRecord:function(record){var me=this,ret=this.callParent(arguments);if(this.setSuspendLayout(!0),record.phantom)me.onRecordLoaded(record);else{record.onEachRelatedStores(function(assoc,store){var name=assoc.name;record.raw&&record.raw[name]||store.loaded||(store.remoteFilter=!0,store.load(function(records,operation,success){var loading=me.isLoading();this.loaded=!0,me.setLoading(loading),loading||me.onRecordLoaded(record)}))});me.isLoading()||me.onRecordLoaded(record)}return this.updatePhoto(),ret},updatePhoto:function(){var form=this.getForm(),record=form.getRecord(),contactImg=Ext.getCmp("view-contact-img"),imgUrl=record.get("photo_url");imgUrl?(contactImg.setSrc(imgUrl),contactImg.removeCls("contacts-anonymous")):(contactImg.setSrc(Ext.BLANK_IMAGE_URL),contactImg.addCls("contacts-anonymous"))},numberColumns:[{xtype:"templatecolumn",dataIndex:"number",tpl:"{infos.displayNumber:htmlEncode}",flex:2},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite tel-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.phoneTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1},{xtype:"templatecolumn",dataIndex:"is_default",maxWidth:32,tpl:'<div class="btn-sprite tel-favorite-{is_default}"></div>'}],emailColumns:[{xtype:"templatecolumn",dataIndex:"email",tpl:'<a href="mailto:{email:htmlEncode}" target="_blank">{email:htmlEncode}</a>',flex:2},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite email-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.emailTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1}],urlColumns:[{xtype:"templatecolumn",dataIndex:"url",tpl:new Ext.XTemplate('<a href="{[this.formatUrl(values.url)]}" target="_blank">{url:htmlEncode}</a>',{formatUrl:function(url){return url.match("^[^:]+://")||(url="http://"+url),Ext.htmlEncode(url)}}),flex:2},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite url-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.urlTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1}],addressColumns:[{xtype:"templatecolumn",tpl:'<a href="http://maps.google.fr/maps?hl=fr&{[Ext.Object.toQueryString({ q : values.number + " " + values.street + " " +  values.street2 + ", " + values.zipcode + " " + values.city + ", " +  values.country })]}" target="_blank"><div>  {number:htmlEncode} {street:htmlEncode} <br />  <tpl if="street2 != \'\'">{street2:htmlEncode} <br /></tpl>  {zipcode:htmlEncode} {city:htmlEncode} <br />  {country:htmlEncode}</div></a>',dataIndex:"street",flex:2},{xtype:"templatecolumn",dataIndex:"type",tpl:'<div>  <div class="btn-sprite address-icon-{type}" style="float: left;"></div>&nbsp;&nbsp;  {[Fbx.os.lib.FbxUtils.addressTypeString(values.type)]}  <div style="clear: both;"></div></div>',flex:1}],groupColumns:[{xtype:"templatecolumn",dataIndex:"name",tpl:"{name:htmlEncode}"}],initComponent:function(){var me=this;me.contactTel=Ext.create("Fbx.os.app.contacts.ContactViewerPanel",{store:Ext.create("Ext.data.ArrayStore",{fields:[]}),forceFit:!0,columns:me.numberColumns}),this.numbersContainer=Ext.create("Ext.form.FieldContainer",{fieldLabel:"Téléphone",labelWidth:80,anchor:"100%",items:[me.contactTel]}),me.contactEmail=Ext.create("Fbx.os.app.contacts.ContactViewerPanel",{store:Ext.create("Ext.data.ArrayStore",{fields:[]}),forceFit:!0,columns:me.emailColumns}),this.mailsContainer=Ext.create("Ext.form.FieldContainer",{fieldLabel:"Email",labelWidth:80,anchor:"100%",items:[me.contactEmail]}),me.contactAddress=Ext.create("Fbx.os.app.contacts.ContactViewerPanel",{store:Ext.create("Ext.data.ArrayStore",{fields:[]}),forceFit:!0,columns:me.addressColumns}),this.addressesContainer=Ext.create("Ext.form.FieldContainer",{fieldLabel:"Adresse",labelWidth:80,anchor:"100%",items:[me.contactAddress]}),me.contactUrl=Ext.create("Fbx.os.app.contacts.ContactViewerPanel",{store:Ext.create("Ext.data.ArrayStore",{fields:[]}),forceFit:!0,columns:me.urlColumns}),this.urlsContainer=Ext.create("Ext.form.FieldContainer",{fieldLabel:"URL",labelWidth:80,anchor:"100%",items:[me.contactUrl]}),me.contactGroups=Ext.create("Fbx.os.app.contacts.ContactEditorPanel",{forceFit:!0,columns:me.groupColumns,store:new Ext.data.ArrayStore({fields:["name"],data:[]})}),this.groupsContainer=Ext.create("Ext.form.FieldContainer",{fieldLabel:"Groupes",labelWidth:80,anchor:"100%",items:[me.contactGroups]}),this.items=[{xtype:"displayfield",fieldLabel:"Nom d'affichage",htmlEncode:!0,name:"display_name_pretty"},{xtype:"fieldcontainer",id:"name-container",fieldLabel:"Nom",labelWidth:80,layout:{type:"hbox"},items:[{xtype:"displayfield",name:"last_name",margins:{top:0,right:15,bottom:0,left:0},htmlEncode:!0,flex:1},{xtype:"displayfield",name:"first_name",htmlEncode:!0,flex:1}]},{xtype:"displayfield",id:"company-container",fieldLabel:"Société",htmlEncode:!0,name:"company"},this.numbersContainer,this.mailsContainer,this.addressesContainer,this.urlsContainer,this.groupsContainer,{xtype:"datefield",readOnly:!0,fieldLabel:"Date de naissance",id:"birthday-container",name:"birthday"},{xtype:"textareafield",readOnly:!0,fieldLabel:"Notes",id:"notes-container",name:"notes"}],this.callParent()},destroy:function(){this.callParent()}});Ext.define("Fbx.os.app.downloader.DownloadListGrid",{extend:"Fbx.ux.grid.RefreshGrid",alias:"widget.downloadlist",requires:["Fbx.os.app.downloader.TaskFileModel","Fbx.os.gui.grid.column.DurationColumn","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Date","Ext.menu.Menu","Fbx.os.app.downloader.DownloadTaskModel","Fbx.os.app.downloader.DownloadInfosWin","Fbx.os.gui.grid.column.PercentColumn","Fbx.os.gui.grid.column.TransferSpeedColumn"],refreshFreq:1e3,detailWinClass:"Fbx.os.app.downloader.DownloadInfosWin",showDetailOnClick:!0,initComponent:function(){var me=this;Ext.applyIf(me,{selModel:{mode:"MULTI"},columns:[{dataIndex:"queue_pos",text:"#",width:30},{xtype:"templatecolumn",text:"",hideable:!1,width:32,dataIndex:"status",tpl:'<div class="btn-24-download-{status}"></div>'},{xtype:"templatecolumn",dataIndex:"name",text:"Nom",flex:5,tpl:'<div class="download-task-title">{name:htmlEncode}</div><div class="download-task-size">{[Fbx.os.lib.FbxUtils.fileSize(values.size)]}</div><tpl if="error">  <div class="download-task-error">{[Fbx.os.app.downloader.DownloadTaskModel.dlErrors[values.error]]}</div></tpl>'},{xtype:"percentcolumn",text:"Progression",dataIndex:"task_pct",width:120},{xtype:"templatecolumn",text:"Temps restant",dataIndex:"eta",flex:2,tpl:'<tpl if="eta">  <div class="download-task-eta">{[Fbx.os.lib.FbxUtils.formatDuration(values.eta)]}</div></tpl>'},{xtype:"transferspeedcolumn",text:"Réception",dataIndex:"rx_rate",width:80},{xtype:"transferspeedcolumn",dataIndex:"tx_rate",text:"Émission",width:80},{xtype:"templatecolumn",dataIndex:"rx_bytes",text:"Transféré",width:160,tpl:'Reçu : {[Fbx.os.lib.FbxUtils.fileSize(values.rx_bytes)]}<br />Émis : {[Fbx.os.lib.FbxUtils.fileSize(values.tx_bytes)]}<br />Ratio : <tpl if="type == \'bt\'">{[Math.round(values.rx_bytes ? 100 * values.tx_bytes / values.rx_bytes : 0) / 100]} / <tpl if="stop_ratio_display != 0">{stop_ratio_display}</tpl><tpl if="stop_ratio_display == 0">&infin;</tpl></tpl><tpl if="type != \'bt\'"> - </tpl>'},{xtype:"templatecolumn",dataIndex:"created_ts",text:"Date d'ajout",tpl:'{[Fbx.os.lib.FbxUtils.getParisMoment(values.created_ts * 1000).format("DD/MM/YYYY HH:mm:ss")]}',width:160}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun Téléchargement</div>'}}),this.callParent(arguments),me.on("boxready",function(){var el=me.getEl();me.mon(el,"keydown",function(e){switch(e.getCharCode()){case e.DELETE:var records=me.getSelectedRecord();if(0==records.length)return;Ext.Msg.show({title:"Suppression",msg:"Êtes-vous sûr de vouloir effacer ce(s) téléchargement(s) ?",buttons:Ext.Msg.YESNO,fn:function(buttonId){if("yes"==buttonId){var selmod=me.getSelectionModel();Ext.Array.each(records,function(rec){selmod.deselect(rec),rec.destroy()})}}}),e.stopEvent()}})})},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{itemId:"propertiesItem",text:"Propriétés",cls:"bold",iconCls:"btn-properties",handler:function(){var records=me.getSelectedRecord(),rec=records[0];me.showDetailsWin(rec)}},"-",{itemId:"resumeItem",text:"Reprendre",iconCls:"btn-control-play-blue",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.resume()})})}},{itemId:"retryItem",text:"Réessayer",iconCls:"btn-recycle",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.retry()})})}},{itemId:"pauseItem",text:"Pause",iconCls:"btn-control-pause-blue",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.pause()})})}},{itemId:"checkItem",text:"Vérifier",iconCls:"btn-magnifier",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.check()})})}},{text:"Supprimer",iconCls:"btn-cancel",hideOnClick:!1,menu:{items:[{text:"En conservant les fichiers",iconCls:"btn-delete",handler:function(){var records=me.getSelectedRecord();Ext.MessageBox.confirm("Suppression","Voulez-vous supprimer cette tâche (en conservant les fichiers) ?",function(btn){"yes"==btn&&me.doWhenSuspended(function(){var selmod=me.getSelectionModel();Ext.Array.each(records,function(rec){selmod.deselect(rec),rec.destroy()})})})}},{text:"En effaçant les fichiers",iconCls:"btn-cancel",handler:function(){Ext.MessageBox.confirm("Suppression","Voulez-vous supprimer cette tâche (en effaçant les fichiers) ?",function(btn){"yes"==btn&&me.doWhenSuspended(function(){var selmod=me.getSelectionModel(),records=me.getSelectedRecord();Ext.Array.each(records,function(rec){selmod.deselect(rec),rec.erase()})})})}}]}},{xtype:"menuseparator"},{itemId:"ioPriorityMenu",text:"Changer la priorité réseau",iconCls:"btn-time",hideOnClick:!1,menu:{items:[{itemId:"priority-high",text:"Haute",group:"priority",checked:!1,handler:function(){var records=me.getSelectedRecord();Ext.Array.each(records,function(rec){rec.setIoPriority("high")})}},{itemId:"priority-normal",text:"Normale",group:"priority",checked:!1,handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.setIoPriority("normal")})})}},{itemId:"priority-low",text:"Faible",group:"priority",checked:!1,handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.setIoPriority("low")})})}}]}},{itemId:"queueMenu",text:"Déplacer dans la file d'attente",iconCls:"btn-table-row-insert",hideOnClick:!1,menu:{items:[{iconCls:"btn-move-top",text:"En premier dans la liste",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.setQueuePos(1)})})}},{iconCls:"btn-move-up",text:"Monter dans la liste",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){var pos=rec.get("queue_pos");rec.setQueuePos(pos-1)})})}},{iconCls:"btn-move-down",text:"Descendre dans la liste",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){var pos=rec.get("queue_pos");rec.setQueuePos(pos+1)})})}},{iconCls:"btn-move-bottom",text:"En dernier dans la liste",handler:function(){var records=me.getSelectedRecord();me.doWhenSuspended(function(){Ext.Array.each(records,function(rec){rec.setQueuePos(5e4)})})}}]}},{itemId:"ratioMenu",text:"Changer le ratio de partage",iconCls:"btn-share",handler:function(){var records=me.getSelectedRecord(),rec=null;for(var i in records)if("bt"==records[i].get("type")){rec=records[i];break}rec&&Ext.Msg.prompt("Changement de ratio de partage","Nouveau ratio",function(btn,value){if("ok"==btn)if(Ext.isNumeric(value))for(var i in records){var val=parseFloat(value);rec=records[i],"bt"==rec.get("type")&&rec.setStopRatio(val)}else Ext.Msg.alert("Erreur","Le ratio de partage doit être numérique")},me,!1,rec.get("stop_ratio_display"))}},"-",{itemId:"folderItem",text:"Ouvrir le dossier de destination",iconCls:"btn-folder",handler:function(){var records=me.getSelectedRecord(),rec=records[0],dstDir=rec.get("download_dir");Fbx.os.core.TaskManager.startApplication("Fbx.os.app.explorer.app",dstDir)}}],listeners:{beforeshow:function(menu){var records=me.getSelectedRecord();if(!records||0==records.length)return!1;var ioPriorityMenu=menu.getComponent("ioPriorityMenu"),resumeItem=menu.getComponent("resumeItem"),pauseItem=menu.getComponent("pauseItem"),queueMenu=menu.getComponent("queueMenu"),ratioMenu=menu.getComponent("ratioMenu"),retryItem=menu.getComponent("retryItem"),checkItem=menu.getComponent("checkItem"),propertiesItem=menu.getComponent("propertiesItem"),folderItem=menu.getComponent("folderItem");if(1==records.length){var rec=records[0],priority=rec.get("io_priority"),priorityItem=ioPriorityMenu.menu.getComponent("priority-"+priority);priorityItem&&priorityItem.setChecked(!0),resumeItem.setDisabled(!rec.canResume()),pauseItem.setDisabled(!rec.canPause()),retryItem.setDisabled(!rec.canRetry()),checkItem.setDisabled(!rec.canCheck()),ioPriorityMenu.setDisabled(!1),rec.get("queue_pos")?queueMenu.setDisabled(!1):queueMenu.setDisabled(!0),"bt"==rec.get("type")?ratioMenu.setDisabled(!1):ratioMenu.setDisabled(!0),propertiesItem.setDisabled(!1),folderItem.setDisabled(!1)}else resumeItem.setDisabled(!1),pauseItem.setDisabled(!1),ioPriorityMenu.setDisabled(!1),retryItem.setDisabled(!1),queueMenu.setDisabled(!0),ratioMenu.setDisabled(!1),checkItem.setDisabled(!0),propertiesItem.setDisabled(!0),folderItem.setDisabled(!0)},refresh:function(){for(var rId in me.detailWins){var rec=me.hostStore.getById(rId);me.detailWins[rId]&&(rec?me.detailWins[rId].setRecord(rec):me.detailWins[rId].close())}}}})),me.contextMenu}});Ext.define("Fbx.ux.state.AjaxProvider",{extend:"Ext.state.Provider",requires:["Fbx.os.core.AppSettings"],statics:{db_is_hs:!1},constructor:function(config){var me=this;me.callParent(arguments),me.state={},Fbx.os.core.AppSettings.each(function(rec){me.state[rec.get("name")]=rec.get("data")})},prefCompare:function(obj1,obj2){var me=this;if(typeof obj1!=typeof obj2)return!0;if("object"==typeof obj1){if(Object.keys(obj1).length!=Object.keys(obj2).length)return!0;obj1.maximized&&obj2.maximized&&(obj2.width=obj1.width,obj2.height=obj1.height,obj2.size=obj1.size,obj2.pos=obj1.pos);for(var i in obj1)if(me.prefCompare(obj1[i],obj2[i]))return!0;return!1}return obj1!=obj2},saveCallback:function(records,operation){operation.success||(Fbx.ux.state.AjaxProvider.db_is_hs=!0)},set:function(name,value){var me=this;if(!Fbx.ux.state.AjaxProvider.db_is_hs&&!Fbx.os.lib.FbxUtils.isMobileDevice()&&Fbx.os.gui.Environment.isLogged){var record=Fbx.os.core.AppSettings.findRecord("name",name,0,!1,!0,!0);if(record)me.prefCompare(record.get("data"),value)&&(record.set("data",value),record.save({callback:me.saveCallback,silentError:!0}));else{record=Fbx.os.core.AppSettings.add({name:name,data:value})[0],record.save({callback:me.saveCallback,silentError:!0})}this.callParent(arguments)}}});Ext.define("Fbx.os.app.grillepain.Screen",{extend:"Ext.window.Window",requires:["Ext.panel.Panel","Fbx.os.app.grillepain.VmModel"],title:"Écran: ",width:1040,height:840,statics:{allowMultipleInstance:!0,disabledInBridge:!1,docSection:"doc/index.html#TODO"},iconCls:"btn-host-workstation",initComponent:function(){var me=this;Fbx.os.gui.Environment.boxHasGrillePain()&&(me.vmId=me.vm.get("id"),me.screenText=function(text){me.setTitle("Écran: "+me.vm.get("generated_name")+" "+text)},me.init=function(){me.vm.get("disk_path")&&me.setTitle("Écran: "+me.vm.get("generated_name"));var toolbar=me.cont.getDockedItems('toolbar[dock="top"]')[0],onButton=toolbar.getComponent("on-button"),resetButton=toolbar.getComponent("reset-button"),offButton=toolbar.getComponent("off-button");switch(me.vm.get("status")){case"running":me.screenText("est démarré"),me.keepalive=!0,me.initVnc(),onButton.disable(),resetButton.enable(),offButton.enable();break;case"starting":me.screenText("démarre");break;case"stopped":me.screenText("est arrêté"),me.keepalive=!1,onButton.enable(),resetButton.disable(),offButton.disable();break;case"stopping":me.screenText("s’arrête")}},me.initVnc=function(){function disconnectedFromServer(e){e.detail.clean?me.keepalive&&Ext.defer(me.initVnc,1e3,this):(me.keepalive=!1,status("Something went wrong, connection is closed"))}function status(text){console.log(text)}if(me.keepalive){var rfb;status("Connecting");var url;url="https:"===window.location.protocol?"wss":"ws",url+="://"+location.host,url+=FbxConf.apiBaseUrl+"vm/"+me.vmId+"/vnc",htmlScreen=Ext.get("screen-"+me.vmId),htmlScreen&&(rfb=new RFB(htmlScreen.dom,url),rfb.addEventListener("connect",function(){me.keepalive=!0,rfb.focus()}),rfb.addEventListener("disconnect",disconnectedFromServer),rfb.viewOnly=!1,rfb.scaleViewport=!1)}},me.cont=Ext.create("Ext.panel.Panel",{layout:"fit",autoScroll:!0,border:!1,bodyStyle:{border:0},dockedItems:[{xtype:"toolbar",defaults:{border:0},items:[{iconCls:"btn-access-allowed",text:"Allumer",itemId:"on-button",handler:function(){me.vm.start(function(){})}},{iconCls:"btn-recycle",text:"Redémarrer",itemId:"reset-button",handler:function(){me.vm.reset(function(){})}},{iconCls:"btn-access-denied",text:"Éteindre",itemId:"off-button",handler:function(){me.vm.shutdown(function(){}),me.keepalive=!1}}]}],html:'<div id="screen-'+me.vmId+'" style="height:inherit;width:inherit; background-color: rgb(0, 0, 0); border: 0; margin: 0;"></div>',listeners:{afterrender:function(){me.init()},resize:function(){}}}),Ext.applyIf(me,{layout:"fit",items:[{xtype:"panel",layout:"fit",bodyStyle:{border:0},items:[me.cont]}]}),me.callParent(arguments))},refreshStatus:function(newVM){var me=this;newVM.get("status")!=me.vm.get("status")&&(me.vm=newVM,me.init())}});Ext.define("Fbx.os.app.grillepain.Console",{extend:"Ext.window.Window",requires:["Ext.panel.Panel","Fbx.os.app.grillepain.VmModel"],width:750,height:520,statics:{defaultName:"Console: ",allowMultipleInstance:!0,disabledInBridge:!1,docSection:"doc/index.html#TODO"},iconCls:"btn-system-monitor",initComponent:function(){var me=this;Fbx.os.gui.Environment.boxHasGrillePain()&&(me.id=me.vm.get("id"),me.start=function(){me.vm.start(function(){me.term.write(""+Fbx.os.app.grillepain.app.defaultName+" démarre...")})},me.reset=function(){me.vm.reset(function(){me.term.writeln(""+Fbx.os.app.grillepain.app.defaultName+" redémarre..."),me.term.focus()})},me.shutdown=function(){me.vm.shutdown(),me.keepalive=!1,me.socket&&me.socket.close()},me.initSocket=function(){me.keepalive&&(me.socket&&me.socket.close(),me.socket=new WebSocket(("https:"==document.location.protocol?"wss://":"ws://")+location.host+FbxConf.apiBaseUrl+"vm/"+me.id+"/console",["binary"]),me.socket.addEventListener("open",function(_event){me.term.attach(me.socket,!0,!0),me.term.focus()}),me.socket.addEventListener("error",function(_event){me.term.writeln(""+Fbx.os.app.grillepain.app.defaultName+" n’est pas joignable. Vérifiez que vous ne l’utilisez pas depuis une autre fenêtre, puis essayez de l’éteindre et le rallumer."),me.keepalive=!1}),me.socket.addEventListener("close",function(_event){me.keepalive&&Ext.defer(me.initSocket,1e3,this)}))},me.init=function(){me.vm.get("disk_path")&&me.setTitle("Console: "+me.vm.get("generated_name"));var toolbar=me.cont.getDockedItems('toolbar[dock="top"]')[0],onButton=toolbar.getComponent("on-button"),resetButton=toolbar.getComponent("reset-button"),offButton=toolbar.getComponent("off-button");switch(me.vm.get("status")){case"running":me.term.writeln(""+Fbx.os.app.grillepain.app.defaultName+" est démarré"),me.keepalive=!0,me.initSocket(),onButton.disable(),resetButton.enable(),offButton.enable();break;case"starting":me.term.writeln(""+Fbx.os.app.grillepain.app.defaultName+" démarre");break;case"stopped":me.keepalive=!1,me.socket&&me.socket.close(),me.term.writeln(""+Fbx.os.app.grillepain.app.defaultName+" est arrêté."),onButton.enable(),resetButton.disable(),offButton.disable();break;case"stopping":me.term.writeln(""+Fbx.os.app.grillepain.app.defaultName+" s’arrête.")}},me.cont=Ext.create("Ext.panel.Panel",{layout:"fit",autoScroll:!0,border:!1,bodyStyle:{border:0},dockedItems:[{xtype:"toolbar",defaults:{border:0},items:[{iconCls:"btn-access-allowed",text:"Allumer",itemId:"on-button",handler:function(){me.start()}},{iconCls:"btn-recycle",text:"Redémarrer",itemId:"reset-button",handler:function(){me.reset()}},{iconCls:"btn-access-denied",text:"Éteindre",itemId:"off-button",handler:function(){me.shutdown()}}]}],html:'<div id="terminal-'+me.id+'" style="height:inherit;width:inherit; background-color: rgb(0, 0, 0);"></div>',listeners:{afterrender:function(){Terminal.applyAddon(attach),Terminal.applyAddon(fit),me.term=new Terminal,termDom=Ext.get("terminal-"+me.id),me.term.open(termDom.dom),me.term.fit(),me.init(),me.keepalive=!0,me.cont.up("window").on("beforeclose",function(){me.keepalive=!1,me.socket&&me.socket.close()})},resize:function(){me.term&&me.term.fit()}}}),Ext.applyIf(me,{layout:"fit",items:[{xtype:"panel",layout:"fit",bodyStyle:{border:0},items:[me.cont]}]}),me.callParent(arguments))},refreshStatus:function(newVM){var me=this;newVM.get("status")!=me.vm.get("status")&&(me.vm=newVM,me.init())}});Ext.define("Fbx.os.app.grillepain.lib",{requires:["Fbx.Ajax","Ext.data.Store"],singleton:!0,checkArch:function(disk_path,cd_path,cb){var arch_match=/i[3-6]86|x86_64|amd64/;null!=disk_path.match(arch_match)||cd_path&&null!=cd_path.match(arch_match)?Ext.Msg.alert("Mauvaise architecture","Attention, votre image disque ne semble pas être pour l’architecture arm64 (ou aarch64); l'architecture x86 n’est pas supportée, et le disque ne démarrera peut-être pas.",cb):cb()},contextHandler:function(rec){var path=rec.get("path"),type="raw",filename=rec.get("name");(filename.endsWith(".img")||filename.endsWith(".qcow2"))&&(type="qcow2");var vm_add=function(request){var disk_path=Fbx.os.lib.FbxUtils.base64_decode(request.disk_path),cd_path=Fbx.os.lib.FbxUtils.base64_decode(request.cd_path),sendRequest=function(){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/",jsonData:request,method:"POST",success:function(resp){var id=resp.jsonData.result.id;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/"+id+"/start/",method:"POST",success:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.grillepain.app")}})}})};Fbx.os.app.grillepain.lib.checkArch(disk_path,cd_path,sendRequest)};if(filename.endsWith(".iso")){var new_disk_path=Fbx.os.lib.FbxUtils.base64_encode(Fbx.os.lib.FbxUtils.base64_decode(path).replace(/.iso$/i,".vm.raw"));Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/disk/create",jsonData:{disk_path:new_disk_path,disk_type:"raw",size:12884901888},method:"POST",success:function(){vm_add({cd_path:path,disk_type:"raw",disk_path:new_disk_path,vcpus:1,memory:256,enable_cloudinit:!1})}})}else vm_add({disk_path:path,disk_type:type,vcpus:1,memory:256})},basename:function(s){return fileIndex=s.lastIndexOf("/"),-1==fileIndex||s.length<=1?s:(extension=s.lastIndexOf("."),-1==extension?s.substring(fileIndex+1):s.substring(fileIndex+1,extension))},totalCPUs:3,totalMem:512,getInfos:function(cb){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/info",method:"GET",success:function(response){var info=response.jsonData.result;Fbx.os.app.grillepain.lib.totalCPUs=info.total_cpus,Fbx.os.app.grillepain.lib.totalMem=info.total_memory,cb()}})},setupVmWithIso:function(name,path,disk_size,cb){var new_disk_path=Fbx.os.lib.FbxUtils.base64_encode(Fbx.os.lib.FbxUtils.base64_decode(path).replace(/.iso$/i,".vm.raw"));Ext.Ajax.request({url:FbxConf.apiBaseUrl+"vm/disk/create",jsonData:{disk_path:new_disk_path,disk_type:"raw",size:1024*disk_size*1024*1024},method:"POST",success:function(){Ext.create("Ext.data.Store",{model:"Fbx.os.app.grillepain.VmModel"}).add({name:name,cd_path:path,disk_type:"raw",disk_path:new_disk_path,vcpus:2,memory:512,enable_cloudinit:!1})[0].save({callback:cb})}})},setupVmWithDisk:function(name,path,type,cb){Ext.create("Ext.data.Store",{model:"Fbx.os.app.grillepain.VmModel"}).add({name:name,disk_type:type,disk_path:path,vcpus:2,memory:512,enable_cloudinit:!1})[0].save({callback:cb})},setupVmFromCloud:function(name,url,ssh_key,password,cb){var cloudinit=["#cloud-config"];ssh_key&&ssh_key.length>0&&cloudinit.push("ssh_authorized_keys:","  - "+ssh_key),password&&password.length>0&&cloudinit.push("password: "+password,"chpasswd: { expire: False }","ssh_pwauth: True"),cloudinit.push(""),Ext.Ajax.request({params:{download_url:url},url:FbxConf.apiBaseUrl+"downloads/add",method:"POST",success:function(addResp){Ext.Ajax.request({method:"GET",url:FbxConf.apiBaseUrl+"downloads/"+addResp.jsonData.result.id,success:function(getResp){var dl=getResp.jsonData.result,store=Ext.create("Ext.data.Store",{model:"Fbx.os.app.grillepain.VmModel"}),path=Fbx.os.lib.FbxUtils.base64_decode(dl.download_dir)+"/"+dl.name;path=Fbx.os.lib.FbxUtils.base64_encode(path);var recs=store.add({name:name,disk_type:"qcow2",disk_path:path,vcpus:2,memory:512,enable_cloudinit:!0,cloudinit_userdata:cloudinit.join("\n")});recs[0].set("cloudinit_hostname",recs[0].get("generated_hostname")),recs[0].save({callback:cb})}})}})}});Ext.define("Fbx.os.app.settings.DhcpStaticEditor",{extend:"Ext.window.Window",requires:["Ext.form.FieldSet","Ext.layout.component.FieldSet","Ext.form.field.ComboBox","Ext.form.field.Number","Fbx.os.lib.FbxUtils","Fbx.ux.form.field.HostSelector","Ext.form.field.Hidden","Ext.form.Panel"],save:function(){var me=this,form=me.down("form").getForm();if(form.isValid()){var record=form.getRecord();form.updateRecord(record),record.save({success:function(){me.hide()}})}},submitOnEnter:function(field,event){var me=this;event.getKey()==event.ENTER&&me.save()},initComponent:function(){var me=this;Fbx.os.gui.Environment.getNetworkConf(function(conf){me.netConf=conf}),me.mon(Fbx.os.gui.Environment,"networkConfChanged",function(conf){me.netConf=conf}),me.hostCombo=Ext.create("Fbx.ux.form.field.HostSelector",{fieldLabel:"Adresse MAC",labelWidth:200,valueField:"mac",name:"mac",validator:function(val){var val=me.hostCombo.getValue();return Ext.form.field.VTypes.macAddr(val)}}),me.form=Ext.create("Ext.form.Panel",{trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){me.save()}}],defaults:{anchor:"100%",labelWidth:200,listeners:{specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},items:[{xtype:"displayfield",fieldLabel:"Périphérique",name:"hostname",listeners:{change:function(f,newVal){f.setVisible(""!=newVal)}}},me.hostCombo,{xtype:"textfield",allowBlank:!1,fieldLabel:"Adresse IP",name:"ip",validator:function(val){return!Ext.isEmpty(val)&&Fbx.os.lib.FbxUtils.checkSubnet(me.netConf.ip,val)}},{xtype:"textfield",fieldLabel:"Commentaire",maxLength:63,name:"comment",validator:function(value){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value)>63)||"Votre commentaire est trop long"}}]}),Ext.applyIf(me,{layout:"fit",closeAction:"hide",modal:!0,title:"Bail DHCP statique",width:500,items:[me.form]}),me.callParent(arguments)},setRecord:function(record){var me=this;if(!me.record||me.record!=record){var form=me.form.getForm();me.record=record,""==record.get("ip")&&record.set("ip",me.netConf.ip.replace(/\d+$/,""));form.findField("mac").setReadOnly(""!=record.get("mac")),form.loadRecord(record)}}});Ext.define("Fbx.os.app.downloader.RssListGrid",{extend:"Fbx.ux.grid.CtxMenuGrid",alias:"widget.rsslist",requires:["Fbx.os.app.downloader.RssFeedModel","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Date","Ext.menu.Menu","Ext.grid.column.Boolean","Ext.grid.column.Template","Ext.grid.column.Action","Fbx.os.app.downloader.DownloadTaskModel","Ext.data.Store"],initComponent:function(){var me=this;me.rssStore=Ext.create("Ext.data.Store",{storeId:"rssStore",model:"Fbx.os.app.downloader.RssFeedModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"title",direction:"ASC"}],pageSize:0}),Ext.applyIf(me,{selModel:{mode:"MULTI"},store:me.rssStore,columns:[{xtype:"templatecolumn",text:"Titre",dataIndex:"pretty_name",tpl:'<div class="rss-feed-title"><tpl if="nb_unread &gt; 0">({nb_unread}) </tpl>{pretty_name:htmlEncode}</div><div class="rss-feed-url">{url:htmlEncode}</div><tpl if="error">  <div class="rss-feed-error">{[Fbx.os.app.downloader.DownloadTaskModel.dlErrors[values.error]]}</div></tpl><tpl if="!error">  <div>OK</div></tpl>',flex:2},{xtype:"enumcolumn",text:"État",dataIndex:"status",width:90,strings:{ready:"Prêt",fetching:"Mise à jour",error:"Erreur"}},{xtype:"booleancolumn",dataIndex:"auto_download",text:"Téléchargement automatique",width:30,falseText:" ",trueText:'<div class="btn-move-down"> </div>'},{xtype:"datecolumn",dataIndex:"pub_ts",text:"Date de mise à jour",format:"d/m/Y H:i:s",flex:1}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun Flux RSS</div>',getRowClass:function(record,rowIndex,rowParams,store){return record.get("nb_unread")>0?"row-unread":""}}}),this.callParent(arguments),me.on("cellclick",function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){var col=me.columns[cellIndex];if(col&&"auto_download"==col.dataIndex){var auto_download=record.get("auto_download");record.set("auto_download",!auto_download),record.save()}}),me.on("boxready",function(){var el=me.getEl();me.mon(el,"keydown",function(e){switch(e.getCharCode()){case e.DELETE:var records=me.getSelectedRecord();if(0==records.length)return;Ext.Msg.show({title:"Suppression",msg:"Êtes-vous sûr de vouloir effacer ce(s) flux rss ?",buttons:Ext.Msg.YESNO,fn:function(buttonId){if("yes"==buttonId){var selmod=me.getSelectionModel();Ext.Array.each(records,function(rec){selmod.deselect(rec),rec.destroy()})}}}),e.stopEvent()}})})},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Mettre à jour le flux RSS",iconCls:"btn-rss-refresh",handler:function(){var records=me.getSelectedRecord();for(var i in records){var rec=records[i];Fbx.os.app.downloader.RssFeedModel.fetch(rec.get("id"))}}},{text:"Supprimer le flux RSS",iconCls:"btn-feed-delete",handler:function(){Ext.Msg.confirm("Suppression de flux RSS","Êtes-vous sûr de vouloir supprimer ces flux ?",function(btn){if("yes"==btn){var selmod=me.getSelectionModel(),records=me.getSelectedRecord();selmod.deselect(records),me.rssStore.remove(records),me.rssStore.sync()}})}},{text:"Tout marquer comme lu",iconCls:"btn-bullet-white",handler:function(){var records=me.getSelectedRecord(),cb=function(){me.rssStore.isLoading()||me.rssStore.load(),me.itemList.getStore().reload()};for(var i in records){var rec=records[i];Fbx.os.app.downloader.RssFeedModel.mark_all_as_read(rec.get("id"),cb)}}}],listeners:{beforeshow:function(menu){if(!me.getSelectedRecord())return!1}}})),me.contextMenu}});Ext.define("Fbx.os.app.settings.storage.DiskList",{extend:"Ext.panel.Panel",requires:["Fbx.os.gui.grid.column.EnumColumn","Fbx.os.app.settings.storage.DiskModel","Ext.grid.column.Action","Ext.data.Store","Ext.grid.column.Template","Fbx.ux.grid.RefreshGrid","Fbx.os.app.settings.storage.PartitionList","Fbx.ux.form.field.SizeDisplay","Ext.window.Window","Fbx.os.app.settings.storage.Config","Fbx.os.app.settings.storage.Fsck","Ext.form.Panel","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.DurationDisplay","Fbx.os.app.settings.storage.Format"],fsOpCb:function(r,success){var me=this;success||(r.dirty=!1,me.store.load())},showFormatWin:function(rec){var me=this;me.formatWin||(me.formatWin=Ext.create("Fbx.os.app.settings.storage.Format")),me.formatWin.loadRecord(rec),me.formatWin.show()},initComponent:function(){var me=this;me.store=Ext.create("Ext.data.Store",{autoLoad:!1,remoteSort:!1,remoteFilter:!1,model:"Fbx.os.app.settings.storage.DiskModel",storeId:"storageDiskStore",filters:[function(item){return"raid"!==item.get("type")}],listeners:{load:function(){var selModel=me.diskList.getSelectionModel();if(!selModel.hasSelection()){var first=me.store.first();first&&selModel.select(first,!1)}}}}),me.diskList=Ext.create("Fbx.ux.grid.RefreshGrid",{title:"Supports de stockage",store:me.store,selModel:{mode:"SINGLE"},hideHeaders:!0,width:300,region:"west",split:!0,dockedItems:[{xtype:"container",padding:2,dock:"bottom",layout:{align:"stretch",type:"vbox"},defaults:{margin:"2 0 1 0"},items:[{xtype:"button",text:"Paramètres",iconCls:"btn-setting-tools",handler:function(){me.storageConfig||(me.storageConfig=Ext.create("Ext.window.Window",{title:"Paramètres de Stockage",closeAction:"hide",height:200,width:500,layout:"fit",modal:!0,items:[Ext.create("Fbx.os.app.settings.storage.Config")]})),me.storageConfig.show()}}]}],columns:[{xtype:"templatecolumn",width:40,tpl:'<div class="storage-sprite storage-hdd-{icon_type}" style="float: left;"></div>'},{xtype:"templatecolumn",dataIndex:"id",flex:1,tpl:'<div class="storage-disk"><div class="storage-disk-title">{disk_title:htmlEncode}</div><div class="storage-disk-state">&bull; État : {state_str:htmlEncode}</div><div class="storage-disk-table">&bull; Table de partition : {table_type_str:htmlEncode}</div><tpl if="connector_str"><div class="storage-disk-pos">&bull; Connecteur : {connector_str:htmlEncode}</div></tpl></div>'},{xtype:"actioncolumn",width:26,padding:3,items:[{getClass:function(v,m,r){var type=r.get("type"),table_type=r.get("table_type");return"internal"===type||"raid"===table_type?"hidden":"empty"===table_type?"btn16 btn-drive-delete":r.raw.partitions&&0!==r.raw.partitions.length?"enabled"===r.get("state")?"btn16 btn-control-eject-blue":"btn16 btn-drive-go":"hidden"},handler:function(grid,rowIndex,colIndex,f,e){var r=grid.getStore().getAt(rowIndex);if(!r.raw.partitions||0===r.raw.partitions.length)return void me.showFormatWin(r);"enabled"===r.get("state")?r.umount(function(a,b,success){me.fsOpCb(r,success)}):r.mount(function(a,b,success){me.fsOpCb(r,success)})}}]}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun disque detecté</div>'},listeners:{itemclick:function(grid,rec,item,index,e,eOpts){var selModel=grid.getSelectionModel();if(!rec.partitions)return void selModel.select(0);selModel.select(rec),me.partitionList.reconfigure(rec.partitions()),me.partitionForm.show(),me.updateDisplay(rec)},refresh:function(grid){var sel=grid.getSelectedRecord();if(1===sel.length){var rec=grid.store.getById(sel[0].getId());if(!rec)return void me.partitionForm.hide();me.partitionForm.show(),me.updateDisplay(rec),rec.partitions?me.partitionList.reconfigure(rec.partitions()):selModel.select(0)}else me.partitionForm.hide()}}}),me.partitionList=Ext.create("Fbx.os.app.settings.storage.PartitionList",{autoScroll:!0,title:"Partitions",stateful:!0,stateId:"storage-partition-list",diskList:me.diskList,flex:1,viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Disque vierge</div>'},buttons:[{text:"Formater le disque",itemId:"btnFormat",iconCls:"btn-drive-delete",handler:function(){var rec=me.partitionForm.getRecord();me.showFormatWin(rec)}},"->",{text:"Vérifier la partition",itemId:"btnFsck",iconCls:"btn-system-monitor",handler:function(){var part=me.getSelectedPartition();part&&part.get("canFsck")&&(me.fsckWin||(me.fsckWin=Ext.create("Fbx.os.app.settings.storage.Fsck",{diskList:me.diskList})),me.fsckWin.loadRecord(part),me.fsckWin.show())}},{text:"Éjecter",itemId:"btnEject",iconCls:"btn-control-eject-blue",handler:function(){var rec=me.partitionForm.getRecord();"enabled"===rec.get("state")&&rec.umount(function(a,b,success){me.fsOpCb(rec,success)})}},{text:"Activer le disque",itemId:"btnMount",iconCls:"btn-drive-go",handler:function(){var rec=me.partitionForm.getRecord();"enabled"!==rec.get("state")&&rec.mount(function(a,b,success){me.fsOpCb(rec,success)})}},{text:"Annuler",iconCls:"btn-cancel",handler:function(){me.up("window").close()}}]}),me.partitionForm=Ext.create("Ext.form.Panel",{bodyPadding:10,autoScroll:!0,hidden:!0,title:"Informations du disque",flex:1,defaults:{anchor:"100%"},layout:"hbox",items:[{xtype:"container",layout:"vbox",defaults:{anchor:"100%",labelWidth:150},flex:1,items:[{xtype:"displayfield",name:"model",fieldLabel:"Modèle"},{xtype:"displayfield",name:"serial",fieldLabel:"Numéro de série"},{xtype:"sizedisplayfield",name:"total_bytes",fieldLabel:"Taille"},{xtype:"displayfield",name:"table_type_str",fieldLabel:"Table des partitions"},{xtype:"displayfield",name:"firmware",fieldLabel:"Firmware"},{xtype:"templateddisplayfield",name:"temp",fieldLabel:"Température",tpl:"{val} °C"}]},{xtype:"container",layout:"vbox",defaults:{anchor:"100%",labelWidth:150},flex:1,items:[{xtype:"displayfield",name:"state_str",fieldLabel:"État"},{xtype:"displayfield",name:"connector_str",fieldLabel:"Connecteur"},{xtype:"displayfield",name:"spin_str",fieldLabel:"Rotation"},{xtype:"durationdisplayfield",name:"idle_duration",fieldLabel:"Inactif depuis"},{xtype:"durationdisplayfield",name:"active_duration",fieldLabel:"Actif depuis"},{xtype:"durationdisplayfield",name:"time_before_spindown",fieldLabel:"Temps avant arrêt"}]}]}),Ext.applyIf(me,{layout:"border",items:[me.diskList,{xtype:"container",layout:{align:"stretch",type:"vbox"},region:"center",items:[me.partitionForm,me.partitionList]}],listeners:{afterrender:function(){me.store.load()},show:function(){me.diskList.suspendRefresh=!1,me.store.load()},hide:function(){me.diskList.suspendRefresh=!0}}}),this.callParent(arguments)},updateDisplay:function(rec){var me=this,form=me.partitionForm;form.loadRecord(rec),form.getForm().getFields().each(function(f){var val=f.getValue();(Ext.isEmpty(val)||0===val)&&"durationdisplayfield"!==f.xtype&&f.setValue("N/A")});var btnEject=me.partitionList.down("#btnEject"),btnMount=me.partitionList.down("#btnMount");rec&&rec.get&&"internal"!==rec.get("type")&&rec.raw.partitions&&0!==rec.raw.partitions.length?"enabled"!==rec.get("state")?(btnMount.show(),btnEject.hide()):(btnMount.hide(),btnEject.show()):(btnMount.hide(),btnEject.hide());var part=me.getSelectedPartition(),btnFsck=me.partitionList.down("#btnFsck"),btnFormat=me.partitionList.down("#btnFormat");"raid"===rec.get("table_type")?(btnFormat.hide(),btnMount.hide()):(btnFormat.show(),btnMount.show()),part&&part.get("canFsck")?btnFsck.show():btnFsck.hide()},getSelectedPartition:function(){var me=this,selModel=me.partitionList.getSelectionModel();return selModel.selected.length<1?null:selModel.selected.first()}});Ext.define("Fbx.os.app.settings.wifi.WifiApStations",{extend:"Fbx.ux.grid.RefreshGrid",requires:["Fbx.os.app.settings.wifi.WifiStationModel","Ext.grid.column.Template","Fbx.os.gui.grid.column.FileSizeColumn","Fbx.os.lib.FbxUtils","Ext.menu.Menu","Fbx.os.app.lanbrowser.HostInfosWin","Fbx.os.app.lanbrowser.HostModel","Ext.data.Store"],apid:-1,showHostDetailsWin:function(host){var detailWin=Ext.create("Fbx.os.app.lanbrowser.HostInfosWin");detailWin.loadById(host.id),detailWin.show()},setRecord:function(rec,bssid){var me=this,proxy=me.stationsStore.getProxy();me.apid=rec.getId(),proxy.url=FbxConf.apiBaseUrl+"wifi/ap/"+me.apid+"/stations/",me.stationsStore.load()},initComponent:function(){var me=this;me.stationsStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.wifi.WifiStationModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"mac",direction:"ASC"}],pageSize:0,listeners:{beforeload:function(){return!(me.apid<0)}}}),Ext.applyIf(me,{hideHeaders:!0,store:me.stationsStore,enableColumnMove:!1,columns:[{xtype:"templatecolumn",dataIndex:"hostname",tpl:'<div class="lan-host-img lan-host-{[values.host.reachable ? "on" : "off"]}  lan-{[values.host.host_type + "-" + (values.host.reachable ? "on" : "off")]}"></div>'},{xtype:"templatecolumn",dataIndex:"hostname",tpl:'<div><a href="#">{hostname:htmlEncode}</a></div><div style="margin-top: 10px;" class="dhcp-host-detail">{mac}<br />{ip}</div>',flex:1},{xtype:"templatecolumn",dataIndex:"iconCls",width:100,tpl:'<div class="wifi-sprite {iconCls}"></div>'},{xtype:"templatecolumn",dataIndex:"state",text:"État",tpl:'Authentifié: {[values.state == "authenticated" ? "Oui" : "Non"]} <br />Actif: {[values.inactive == 0 ? "Oui" : ("Non depuis " + Fbx.os.lib.FbxUtils.formatDuration(values.inactive))]}<br />Signal: {signal} dB<br />Lien TX: {[(values.last_tx.bitrate / 10)]} Mbit/s<br />Lien RX: {[(values.last_rx.bitrate / 10)]} Mbit/s<br />',flex:1},{xtype:"templatecolumn",dataIndex:"last_rx",text:"Débit",tpl:"Débit TX: {[Fbx.os.lib.FbxUtils.rate(values.tx_rate)]} <br />Débit RX: {[Fbx.os.lib.FbxUtils.rate(values.rx_rate)]}<br />Transmis: {[Fbx.os.lib.FbxUtils.fileSize(values.tx_bytes)]}<br />Reçu: {[Fbx.os.lib.FbxUtils.fileSize(values.rx_bytes)]}",flex:1}],listeners:{cellclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){if("hostname"==grid.headerCt.getGridColumns()[cellIndex].dataIndex){e.stopEvent();var host=record.get("host");""!=host&&me.showHostDetailsWin(host)}}}}),me.callParent(arguments)},getCtxMenu:function(){var me=this;return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"icon16 icon-whitelist",text:"Ajouter à la liste blanche",handler:function(){var records=me.getSelectedRecord();me.addToMacFilterList("whitelist",records[0])}},{iconCls:"icon16 icon-blacklist",text:"Ajouter à la liste noire",handler:function(){var records=me.getSelectedRecord();me.addToMacFilterList("blacklist",records[0])}}]})),me.ctxMenu},addToMacFilterList:function(type,rec){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.wifi.Wifi",{mac:rec.get("mac"),type:type})}});Ext.define("Fbx.os.core.task.Desktop",{extend:"Fbx.os.core.task.Task",requires:["Ext.window.Window","Fbx.ux.state.AjaxProvider","Fbx.os.app.explorer.FsDropUploadMixin"],config:{windowSink:null,modal:!1,settings:{}},mainWindow:null,minimized:!1,terminate:function(){null!=this.mainWindow&&this.mainWindow.destroy(),this.callParent(),this.taskbarBtn=null},minimize:function(){var me=this;this.mainWindow.getActiveAnimation()?this.mainWindow.stopAnimation():(me.restoreWidth=me.mainWindow.getWidth(),me.restoreHeight=me.mainWindow.getHeight(),me.restoreX=me.mainWindow.getX(),me.restoreY=me.mainWindow.getY());var x=0,y=0;me.taskbarBtn&&(x=me.taskbarBtn.getX()+me.taskbarBtn.getWidth()/2,y=me.taskbarBtn.getY()-me.taskbarBtn.getHeight()),this.mainWindow.animate({duration:me.self.disableAnimation?0:500,to:{opacity:0,width:0,height:0,x:x,y:y},listeners:{afteranimate:function(){me.mainWindow.hide(),me.minimized=!0,me.stateChanged()}}})},maximize:function(){var me=this;this.mainWindow.stopAnimation(),this.mainWindow.animate({duration:me.self.disableAnimation?0:100,to:{opacity:1}}),this.mainWindow.maximize(!0)},close:function(){this.mainWindow.close()},activate:function(){var me=this;this.mainWindow&&(this.minimized&&((me.restoreWidth<=150||me.restoreHeight<=150)&&(me.restoreWidth=me.self.defaultWidth,me.restoreWidth=me.self.defaultHeight),this.mainWindow.stopAnimation(),this.mainWindow.animate({duration:me.self.disableAnimation?0:500,to:{opacity:1,width:this.restoreWidth,height:this.restoreHeight,x:this.restoreX,y:this.restoreY}}),this.mainWindow.show(),this.minimized=!1),this.mainWindow.toFront(),Fbx.os.core.TaskManager.markFocused(this),this.stateChanged())},isMinimized:function(){return this.minimized},isFocused:function(){return!(!this.mainWindow||!this.mainWindow.zIndexManager)&&this.mainWindow.zIndexManager.getActive()==this.mainWindow},onWinMinimize:function(win){this.minimize(),this.fireEvent("changed",this)},onWinActivate:function(win){this.activate(),this.fireEvent("changed",this)},onWinClose:function(win){this.mainWindow=null,this.terminate()},launch:function(){var me=this,appName=Ext.getClassName(me),stateProvider=Fbx.os.gui.Environment.getStateProvider(),appSettings=stateProvider.get(appName,null);appSettings&&me.setSettings(appSettings)},saveSettings:function(){var me=this,stateProvider=Fbx.os.gui.Environment.getStateProvider(),appName=Ext.getClassName(me);stateProvider.set(appName,me.settings)},applySettings:function(settings){this.settings=settings},getIconCls:function(size){var me=this,appName=Ext.getClassName(me);return Fbx.os.gui.ApplicationModel.getIconCls(appName,size)},constructor:function(config){var me=this;Ext.state.Manager.setProvider(Fbx.os.gui.Environment.getStateProvider()),this.callParent([config]),me.type="desktop",null==me.windowSink&&(me.windowSink=Ext.getBody());var winConfig=me.winConfig||[];Ext.apply(winConfig,config.window,{width:me.self.defaultWidth||400,height:me.self.defaultHeight||400,modal:me.self.modal||!1,animCollaspse:!1,iconCls:me.getIconCls(16),constrain:!0,border:!1,layout:"fit"}),void 0===winConfig.maximizable&&(winConfig.maximizable=!0),void 0===winConfig.minimizable&&(winConfig.minimizable=!0),void 0===winConfig.stateful&&(winConfig.stateful=!0),me.self.docSection&&""!=me.self.docSection&&(winConfig.tools=[{type:"help",tooltip:"Aide de l'application",handler:function(event,toolEl,panel){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.help.app",me.self.docSection)}}]),(Fbx.os.lib.FbxUtils.isMobileDevice()||Fbx.os.gui.Environment.accessibilityMode)&&(winConfig.collapsible=!1,winConfig.minimizable=!1,winConfig.resizable=!1,winConfig.draggable=!1,winConfig.maximizable=!1,winConfig.hideCollapseTool=!0),Ext.apply(winConfig,{title:me.name,renderTo:me.windowSink.getEl(),listeners:{activate:function(win){return me.onWinActivate(win)},minimize:function(win){return me.onWinMinimize(win)},close:function(win){return me.onWinClose(win)},show:function(win){(Fbx.os.lib.FbxUtils.isMobileDevice()||Fbx.os.gui.Environment.accessibilityMode)&&me.maximize()},beforeclose:function(win){return!!win.closeAnimated||(win.animate({duration:me.self.disableAnimation?0:350,to:{opacity:0,width:0,height:0,x:win.getX()+win.getWidth()/2,y:win.getY()+win.getHeight()/2},listeners:{afteranimate:function(){win.closeAnimated=!0,setTimeout(function(){win.close()},100)}}}),!1)},titlechange:function(win){me.fireEvent("changed",me)},beforestaterestore:function(win,state){if(state.pos&&state.size){(!1===winConfig.resizable||state.size.width<=150||state.size.height<=150)&&(state.size.width=me.self.defaultWidth,state.size.height=me.self.defaultHeight);var size=[state.size.width,state.size.height],cascade=me.instanceNum?30:0;Fbx.os.gui.Environment.desktop.constrainToDesktop(state.pos,size,!0,cascade,me.cascadeDirection())&&(state.size.width=size[0],state.size.height=size[1],state.width=size[0],state.height=size[1])}}},stateId:Ext.getClassName(me)+"-window"});var win=Ext.create("Ext.window.Window",winConfig);return me.mainWindow=win,me.self.allowFileDrop&&win.on("boxready",function(){var el=win.getEl();me.mon(el,"dragover",function(e){e.stopEvent()}),me.mon(el,"dragenter",function(e){e.stopEvent()}),me.mon(el,"dragexit",function(e){e.stopEvent()}),me.mon(el,"drop",function(e){var event=e.browserEvent;if(e.stopEvent(),event&&event.dataTransfer&&event.dataTransfer.files){var filesArray=event.dataTransfer.files,filenames=[],totSize=0,hasError=!1,containsDir=!1;return Ext.Array.each(filesArray,function(f){if(f.webkitGetAsEntry){f.webkitGetAsEntry().isFile()||(containsDir=!0)}else 0==f.size&&(containsDir=!0);var ftype=f.type?f.type:"";if(""==ftype){var parts=f.name.split(/\./);switch(parts[parts.length-1]){case"nzb":ftype="application/x-nzb";break;case"torrent":ftype="application/x-bittorrent"}}if(!me.self.droppableFiles[ftype])return Ext.Msg.alert("Type de fichier non supporté","Ce type de fichier n'est pas supporté"),hasError=!0,!1;Ext.Array.push(filenames,f.name),totSize+=f.size}),hasError?!1:totSize<=0?(Ext.Msg.alert("Erreur","Il n'y a rien à uploader"),!1):containsDir?(Ext.Msg.alert("Erreur","Il n'est pas possible d'uploader un répertoire"),!1):void me.handleFileDrop(filesArray)}})}),win.show(),this}});Ext.define("Fbx.os.app.explorer.FileGrid",{extend:"Ext.grid.Panel",requires:["Fbx.ux.data.proxy.RestTree","Fbx.os.app.explorer.ExplorerModel","Fbx.ux.grid.plugin.MsCellEditing","Ext.grid.column.Date","Fbx.os.gui.grid.column.FileSizeColumnFolder","Ext.grid.plugin.DragDrop","Ext.view.DragZone","Ext.grid.ViewDropZone","Fbx.ux.grid.plugin.FsGridViewDragDrop","Fbx.ux.grid.plugin.KeyScrollPlugin","Ext.data.Store","Ext.selection.RowModel","Fbx.ux.grid.plugin.DragSelector"],mixins:{refreshmixin:"Fbx.ux.mixin.RefreshMixin",fsctxmenu:"Fbx.os.app.explorer.FsGridContextMenuMixin",fsgridkey:"Fbx.os.app.explorer.FsGridKeysMixin",dropupload:"Fbx.os.app.explorer.FsDropUploadMixin"},suspendRefresh:!0,curPath:"",nameColumnIndex:1,displayedMimeType:"any",selModel:{mode:"MULTI"},setPath:function(path,force){var me=this;(path!=me.curPath||force)&&(me.forgetNextScrollPos=path!=me.curPath,me.curPath=path,me.fileStore.clearFilter(!0),me.fileStore.filter([{property:"node",value:me.curPath}]),me.fireEvent("pathchanged",me.curPath))},loadParent:function(){var me=this,parent=Fbx.os.lib.FbxUtils.base64_decode(me.curPath).replace(/\/[^\/]+$/,"");""!=(parent=Fbx.os.lib.FbxUtils.base64_encode(parent))&&me.curPath!=parent&&(me.setPath(parent),me.fireEvent("pathchanged",me.curPath))},constructor:function(options){this.callParent(arguments),this.mixins.refreshmixin.constructor.call(this),this.mixins.fsctxmenu.constructor.call(this,!1),this.mixins.fsgridkey.constructor.call(this),this.mixins.dropupload.constructor.call(this,!1)},chooseRecord:function(rec){var me=this;"dir"==rec.get("type")?(me.setPath(rec.get("path")),me.fireEvent("pathchanged",rec.get("path"))):me.fireEvent("filedbclicked",rec)},initComponent:function(config){var me=this;me.fileStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.explorer.ExplorerModel",remoteFilter:!0,remoteSort:!1,autoLoad:!0,filters:[{property:"node",value:""}],listeners:{load:function(store,records,successfull){if(!successfull)return me.needTreeRefresh=!0,void me.loadParent();"any"!=me.displayedMimeType&&(Ext.isArray(me.displayedMimeType)||(me.displayedMimeType=[me.displayedMimeType]),me.fileStore.filterBy(function(rec){return"dir"==rec.get("type")||Ext.Array.contains(me.displayedMimeType,rec.get("mimetype"))}));var first=store.first();if(first){me.getSelectionModel().setLastFocused(first),me.getEl().focus()}}}}),me.editPlugin=Ext.create("Fbx.ux.grid.plugin.MsCellEditing",{listeners:{beforeedit:function(editor,e,eOpts){var rec=e.record,dir=Fbx.os.lib.FbxUtils.dirname(rec.get("decoded_path"));if("/"==dir||""==dir)return!1;me.isEditing=!0},afteredit:function(){me.isEditing=!1}}}),Ext.apply(me,{store:me.fileStore,autoScroll:!0,selModel:Ext.create("Ext.selection.RowModel",{mode:me.selModel.mode,onKeyEnter:function(e){var rec=e.record;me.chooseRecord(rec)}}),columns:[{xtype:"templatecolumn",dataIndex:"iconCls",tpl:'<div class="{iconCls}"><tpl if="link"><div class="file-icon-sprite file-icon-sprite-default file-icon-shortcut"></div></tpl></div>',text:"",width:24},{dataIndex:"name",text:"Nom",flex:1,editor:{xtype:"textfield",allowBlank:!1}},{xtype:"filesizecolumnfolder",dataIndex:"size",text:"Taille"},{xtype:"datecolumn",dataIndex:"modification",format:"d/m/Y H:i:s",text:"Date de modification",width:150}],plugins:[me.editPlugin,Ext.create("Fbx.ux.grid.plugin.KeyScrollPlugin",{fieldName:"name"})],viewConfig:{loadMask:!0,getRowClass:function(record,rowIndex,rowParams,store){return record.get("cutted")?"file-cutted":record.get("copied")?"file-copied":""},plugins:[{ptype:"fsgridviewdragdrop",ddGroup:"fileDDGroup",dragText:"{0} fichier{1} sélectionné{1}"}]}}),this.callParent(arguments),me.dragSel=Ext.create("Fbx.ux.grid.plugin.DragSelector",{dragSafe:!0}),me.dragSel.init(me),me.on("itemclick",function(grid,rec,item,index,e,eOpts){Fbx.os.lib.FbxUtils.isMobileDevice()&&me.chooseRecord(rec)}),me.on("itemdblclick",function(grid,rec,item,index,e,eOpts){me.chooseRecord(rec)}),me.on("beforecontainermouseup",function(view,e,eOpts){var selModel=me.getSelectionModel();me.dragSel.dragging||selModel.deselectAll()}),me.on("sortchange",function(){if(me.store.sorters&&1==me.store.sorters.getCount()){var sorter=me.store.sorters.first();"name"==sorter.property&&(sorter.property="index",me.store.sort({property:"index",direction:sorter.direction}))}}),this.mon(Fbx.os.gui.Environment,"filemoved",function(changes){var needRefresh=!1;Ext.Array.each(changes,function(c){var p=Fbx.os.lib.FbxUtils.base64_decode(me.curPath),f=Fbx.os.lib.FbxUtils.base64_decode(c.from),t=Fbx.os.lib.FbxUtils.base64_decode(c.to);if(0!=f.indexOf(p)&&0!=t.indexOf(p)||(needRefresh=!0),0==(p+"/").indexOf(f+"/")){var updatedPath=p.replace(f,t);return me.setPath(Fbx.os.lib.FbxUtils.base64_encode(updatedPath),!0),needRefresh=!1,!1}}),needRefresh&&me.setPath(me.curPath,!0)}),this.mon(Fbx.os.gui.Environment,"filecopied",function(changes){var needRefresh=!1;Ext.Array.each(changes,function(c){var p=Fbx.os.lib.FbxUtils.base64_decode(me.curPath);0==Fbx.os.lib.FbxUtils.base64_decode(c.to).indexOf(p)&&(needRefresh=!0)}),needRefresh&&me.setPath(me.curPath,!0)}),this.mon(Fbx.os.gui.Environment,"filedeleted",function(changes){var needRefresh=!1;Ext.Array.each(changes,function(c){var p=Fbx.os.lib.FbxUtils.base64_decode(me.curPath),f=Fbx.os.lib.FbxUtils.base64_decode(c.from);Fbx.os.lib.FbxUtils.base64_decode(c.to);if(0==(p+"/").indexOf(f+"/")){var parent=p.replace(/\/[^\/]+$/,"");return me.setPath(Fbx.os.lib.FbxUtils.base64_encode(parent),!0),needRefresh=!1,!1}0==f.indexOf(p)&&(needRefresh=!0)}),needRefresh&&me.setPath(me.curPath,!0)}),me.addEvents("pathchanged","filedbclicked")}});Ext.define("Fbx.os.app.settings.DhcpDynamicLeases",{extend:"Fbx.ux.grid.RefreshGrid",alias:"widget.dhcpdynamicleases",requires:["Fbx.os.app.settings.DhcpDynamicLeaseModel","Ext.grid.column.Action","Ext.grid.column.Template","Ext.grid.column.Boolean","Fbx.os.gui.grid.column.EnumColumn","Fbx.os.gui.grid.column.DurationColumn","Ext.grid.column.Date","Fbx.os.lib.FbxUtils","Fbx.os.app.lanbrowser.HostModel","Fbx.os.app.lanbrowser.HostInfosWin","Ext.menu.Menu"],showHostDetailsWin:function(host){var detailWin=Ext.create("Fbx.os.app.lanbrowser.HostInfosWin");detailWin.loadById(host.id),detailWin.show()},initComponent:function(){var me=this;me.store=Ext.getStore("dhcpDynamicLeaseStore"),Ext.applyIf(me,{store:me.store,bodyPadding:0,selModel:{mode:"SINGLE"},columns:[{xtype:"templatecolumn",dataIndex:"hostname",hideable:!1,tpl:'<div class="lan-host-img lan-host-{[values.host.reachable ? "on" : "off"]}  lan-{[values.host.host_type + "-" + (values.host.reachable ? "on" : "off")]}"></div>'},{xtype:"templatecolumn",dataIndex:"hostname",hideable:!1,tpl:'<div><a href="#">{hostname:htmlEncode}</a></div><div style="margin-top: 10px;" class="dhcp-host-detail">{mac}<br />{ip}</div>',flex:1},{xtype:"booleancolumn",dataIndex:"is_static",text:"Statique",falseText:"Non",trueText:"Oui",width:55},{xtype:"templatecolumn",text:"Bail",dataIndex:"assign_time",tpl:'Assigné: {[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(values.assign_time)]} <br />Dernière mise à jour: {[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(values.refresh_time)]} <br /><tpl if="!is_static">Expire dans {[Fbx.os.lib.FbxUtils.formatDuration(values.lease_remaining)]}</tpl>',flex:1}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun bail actif actuellement</div>'},listeners:{cellclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){if("hostname"==grid.headerCt.getGridColumns()[cellIndex].dataIndex){e.stopEvent();var host=record.get("host");""!=host&&me.showHostDetailsWin(host)}}}}),me.callParent(arguments)},getCtxMenu:function(){var me=this;return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-add",text:"Ajouter un bail statique",handler:function(){var records=me.getSelectedRecord();me.addStaticLease(records[0])}}],listeners:{beforeshow:function(){var selected=me.getSelectedRecord();if(1!=selected.length)return!1;var rec=selected[0],menuItem=me.ctxMenu.items.items[0];rec.get("is_static")?menuItem.disable():menuItem.enable()}}})),me.ctxMenu},addStaticLease:function(rec){var me=this;rec&&me.dhcpapp.addStaticLease(rec.get("mac"),rec.get("ip"),"")}});Ext.define("Fbx.os.app.settings.SpeedTest",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.panel.Panel"],statics:{defaultName:"Test de débit réseau local",defaultWidth:450,defaultHeight:300,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#tester-le-debit-entre-votre-ordinateur-et-votre-freebox"},winConfig:{resizable:!1,maximizable:!1,minimizable:!1,stateful:!1},launch:function(){var me=this;me.panel=Ext.create("Ext.panel.Panel",{bodyPadding:10,defaults:{anchor:"100%"},items:[{xtype:"container",html:'<div><div style="font-weight: bold; font-size: 16px;">Test débit réseau local</div><div style="margin: 10px 0px;">Les liens ci dessous vous permettent d\'estimer le débit entre votre ordinateur et votre Freebox.</div><div style="margin: 10px 0px;">Attention, ce débit peut être inférieur à la réalité si la vitesse est limitée par la capacité d\'écriture du disque dur de votre ordinateur.</div><div style="font-weight: bold; margin: 10px 0px;">Ce test n\'est disponible que depuis votre réseau local</div><a href="/gen/1M" target="_blank">Fichier de 1Mo</a><br /><a href="/gen/10M" target="_blank">Fichier de 10Mo</a><br /><a href="/gen/100M" target="_blank">Fichier de 100Mo</a><br /><a href="/gen/1G" target="_blank">Fichier de 1Go</a><br /></div>'}],buttons:[{text:"OK",iconCls:"btn-accept",handler:function(){me.close()}}]}),this.mainWindow.add(me.panel),me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.WizardDect",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.container.Container","Ext.panel.Panel","Ext.layout.container.Card","Ext.form.Panel","Fbx.os.app.settings.PhoneModel","Ext.button.Button","Ext.data.Store"],statics:{defaultName:"Associer un DECT",defaultWidth:400,defaultHeight:275,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#associer-un-dect",beforeLaunch:function(cb){Fbx.os.gui.Environment.boxHasDect()&&cb()}},winConfig:{resizable:!1,maximizable:!1,minimizable:!1},nbDectOrig:0,navigate:function(direction){var me=this,layout=me.panel.getLayout();"next"==direction?layout.getNext()&&layout.next():layout.getPrev()&&layout.prev(),me.btnPrev.setDisabled(!layout.getPrev()),layout.getNext()?(me.btnNext.setIconCls("btn-next"),me.btnNext.setText("Suivant")):(me.btnNext.setIconCls("btn-accept"),me.btnNext.setText("Terminer"))},getDectConfig:function(cb){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"phone/config/",method:"GET",success:function(response){cb(response.jsonData.result)},failure:function(){me.close()}})},launch:function(defaultSrc){var me=this;me.btnPrev=Ext.create("Ext.button.Button",{text:"Retour",iconCls:"btn-previous",disabled:!0,handler:function(){me.navigate("prev")}}),me.btnNext=Ext.create("Ext.button.Button",{text:"Suivant",iconCls:"btn-next",handler:function(){me.panel.getLayout().getNext()?me.navigate("next"):me.close()}}),me.panel=Ext.create("Ext.panel.Panel",{title:"> Étape 1/3 : Ouverture de l'association",layout:"card",bodyPadding:10,items:[{xtype:"container",layout:"fit",html:"<div>Pour associer un nouveau combiné DECT à votre Freebox, l'association va être ouverte sur la base DECT de la Freebox. Sur votre combiné vous devrez alors passer en mode association et saisir le code PIN de votre base DECT : <span class=\"bold\">__PIN__</span>.</div><br /><div>Lorsque vous êtes prêt, cliquez sur suivant pour ouvrir l'association.</div>",listeners:{show:function(){me.panel.setTitle("> Étape 1/3 : Ouverture de l'association")}}},{xtype:"container",layout:"fit",html:'<div>La base DECT de la Freebox est maintenant prête pour l\'association d\'un nouveau combiné.</div><br /> <div>Attente de l\'association d\'un nouveau combiné ...</div> <br /><div>Le code PIN de votre base DECT est <span class="bold">__PIN__</span></div><br /><div style="text-align: center;"><img src="resources/images/fbx/loading.gif" style="width: 32px; height: 32px;" alt=""/></div>',listeners:{show:function(){me.panel.setTitle("> Étape 2/3 : Association du combiné"),me.startAssoc()}}},{xtype:"container",layout:"fit",html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div style="padding: 10px;">Votre combiné est maintenant associé à votre Freebox.</div>',listeners:{show:function(){me.panel.setTitle("> Étape 3/3 : Combiné associé"),me.btnPrev.setDisabled(!0)}}}],buttons:[me.btnPrev,me.btnNext]}),me.mainWindow.setLoading(!0),me.getDectConfig(function(result){me.mainWindow.setLoading(!1),me.dectConfig=result,me.panel.items.each(function(item){var el=item.getEl(),html=el.dom.innerHTML;html=html.replace(/__PIN__/,me.dectConfig.dect_pin),el.dom.innerHTML=html})}),me.store=Ext.create("Ext.data.Store",{storeId:"phoneStore",model:"Fbx.os.app.settings.PhoneModel",remoteSort:!1,remoteFilter:!1,pageSize:0,filterOnLoad:!0,filters:[{property:"type",value:"dect"}]}),me.store.load(function(){me.nbDectOrig=me.store.getCount()}),me.mainWindow.add(me.panel),me.callParent(arguments)},startAssoc:function(){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"phone/config/",method:"PUT",jsonData:{dect_enabled:!0,dect_registration:!0},success:function(response){me.btnPrev.setDisabled(!0),me.btnNext.setDisabled(!0),me.refreshInterval&&clearInterval(me.refreshInterval),me.refreshInterval=setInterval(function(){me.getDectConfig(function(result){result.dect_registration||(clearInterval(me.refreshInterval),setTimeout(function(){me.store.isLoading()||me.store.load(function(){me.btnNext.setDisabled(!1),me.store.getCount()>me.nbDectOrig?me.navigate("next"):Ext.Msg.confirm("Échec de l'association","Il n'a pas été possible d'associer un nouveau combiné ! Voulez-vous réessayer ?",function(btn){"yes"==btn?me.startAssoc():me.navigate("prev")})})},2e3))})},3e3)},failure:function(){me.navigate("prev")}})},terminate:function(){var me=this;me.refreshInterval&&clearInterval(me.refreshInterval),this.callParent(arguments)}});Ext.define("Fbx.os.app.settings.License",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.app.settings.LicenseModel","Ext.data.Store","Ext.grid.Panel","Ext.grid.column.Template","Ext.form.field.TextArea","Ext.panel.Panel","Ext.window.Window"],statics:{defaultName:"Divers / Mentions légales",defaultWidth:750,defaultHeight:400,allowMultipleInstance:!1,modal:!0},getLicenseWin:function(){var me=this;return me.licenseWin||(me.licenseCont=Ext.create("Ext.form.field.TextArea",{value:"",anchor:"%",fieldLabel:"",hideLabel:!0,readOnly:!0,cls:"monospace"}),me.licenseWin=Ext.create("Ext.window.Window",{title:"Licence",modal:!0,width:700,height:350,autoScroll:!0,closeAction:"hide",layout:"fit",buttons:["->",{text:"OK",iconCls:"btn-accept",handler:function(){me.licenseWin.close()}}],items:[me.licenseCont]})),me.licenseWin},showLicense:function(record){var me=this;record.getLicenseTxt(function(licenseTxt){var lwin=me.getLicenseWin();lwin.setTitle("Licence / "+record.get("name")),me.licenseCont.setValue(licenseTxt),lwin.show(),me.licenseCont.getEl().down("textarea").dom.scrollTop=0})},launch:function(){var me=this;me.store=Ext.create("Ext.data.Store",{storeId:"dhcpDynamicLeaseStore",model:"Fbx.os.app.settings.LicenseModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"name",direction:"ASC"}],pageSize:0,autoLoad:!0}),me.grid=Ext.create("Ext.grid.Panel",{title:"",store:me.store,flex:1,columns:[{text:"Nom",dataIndex:"name",flex:1},{text:"Version",dataIndex:"version",width:100},{xtype:"templatecolumn",text:"Licence",dataIndex:"license",tpl:'<span style="color: black;">{license}</span>',width:100},{xtype:"templatecolumn",text:"Url",dataIndex:"url",flex:2,tpl:'<a href="{url:htmlEncode}" target="_blank">{url:htmlEncode}</a>'}],listeners:{cellclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){2==cellIndex&&me.showLicense(record)},itemdblclick:function(grid,record){me.showLicense(record)}}}),me.cont=Ext.create("Ext.panel.Panel",{layout:{align:"stretch",type:"vbox"},bodyPadding:10,items:[{xtype:"container",height:40,padding:5,html:'La Freebox Server utilise des logiciels libres ou opensource. La liste est présente ci-dessous.<br />Vous pouvez obtenir le code source complet des logiciels concernés à l\'adresse suivante: <a target="_blank" href="http://floss.freebox.fr/">http://floss.freebox.fr/</a>'},me.grid,{xtype:"container",height:70,padding:5,html:"Vous pouvez également obtenir le code source complet et correspondant des logiciels libres de votre Freebox sur un support numérique en en faisant la demande à FREE - service logiciels libres - 8, Rue de la Ville l'Évêque - 75008 Paris; il conviendra de joindre un chèque d'un montant de 5 euros libellé à l'ordre de FREE et de préciser la version de votre Freebox ainsi que votre adresse postale."}],buttons:["->",{text:"OK",iconCls:"btn-accept",handler:function(){me.mainWindow.close()}}]}),this.mainWindow.add(me.cont),me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.UpnpIgd",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel","Fbx.os.app.settings.UpnpIgdRedirModel","Ext.grid.column.Boolean","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Template","Ext.grid.column.Action","Fbx.ux.grid.RefreshGrid","Fbx.os.lib.FbxUtils","Fbx.os.app.lanbrowser.HostInfosWin","Ext.data.Store"],statics:{defaultName:"Réseau local / UPnP IGD",defaultWidth:650,defaultHeight:400,allowMultipleInstance:!1,modal:!0,disabledInBridge:!0,docSection:"doc/index.html#gerer-le-protocole-upnp-igd"},launch:function(){var me=this;me.store=Ext.create("Ext.data.Store",{storeId:"upnpredirs",model:"Fbx.os.app.settings.UpnpIgdRedirModel",remoteSort:!1,remoteFilter:!1,pageSize:0}),me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"upnpigd/config/",bodyPadding:10,layout:{type:"vbox",align:"stretch"},items:[{xtype:"fieldset",title:"Filtrage",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",fieldLabel:"Activer le service UPnP IGD",ttip:"Ce service permet aux machines de votre réseau de configurer automatiquement des redirections de port",name:"enabled",boxLabel:""},{xtype:"numberfield",fieldLabel:"Version du protocole UPnP IGD",ttip:"Permet de choisir la version du protocole UPnP IGD à utiliser",name:"version",minValue:1,maxValue:2,step:1,listeners:{change:function(target,newVal){me.form.queryById("disclaimer").setVisible(2==newVal)}}},{xtype:"label",itemId:"disclaimer",hidden:!0,html:"<div style=\"color: #FF6600; padding: 10px 0;\">ATTENTION: La version 2 du protocole UPnP n'est pas encore supportée par tous les logiciels.<br />En cas d'incompatibilité, il convient de revenir à la version 1 du protocole.<br /></div>"}]},{xtype:"refreshgrid",title:"Redirections actives",stateful:!0,stateId:"upnpigd-redir-grid",flex:1,forceFit:!0,viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucune redirection active</div>'},store:me.store,columns:[{xtype:"booleancolumn",dataIndex:"enabled",text:"Actif",width:35,falseText:"",trueText:"&#x2713;"},{xtype:"templatecolumn",text:"Redirection",flex:2,dataIndex:"ext_src_ip",tpl:'<div>Source:   <tpl if="ext_src_ip == \'0.0.0.0\'">Toutes</tpl>  <tpl if="ext_src_ip != \'0.0.0.0\'">{ext_src_ip}</tpl> / port {ext_port}</div><div>Destination:   <tpl if="host"><a href="javascript:;">{host.primary_name:htmlEncode}</a></tpl>  <tpl if="!host">{int_ip}</tpl> / port {int_port}</div><div>Protocole: {proto}</div>'},{text:"Description",flex:1,dataIndex:"desc",htmlEncode:!0},{xtype:"templatecolumn",text:"Temps restant",width:140,dataIndex:"remaining",tpl:'<tpl if="remaining != 0">{[Fbx.os.lib.FbxUtils.formatDuration(values.remaining)]}</tpl><tpl if="remaining == 0">Pas d\'expiration</tpl>'},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex));Ext.MessageBox.confirm("Supprimer","Voulez-vous supprimer cette redirection ?",function(btn){"yes"==btn&&rec.destroy()})}}]}],listeners:{cellclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){if("ext_src_ip"==grid.headerCt.getGridColumns()[cellIndex].dataIndex){e.stopEvent();var host=record.get("host");""!=host&&me.showHostDetailsWin(host)}}}}]}),this.mainWindow.add(me.form),me.callParent(arguments),me.mon(me,"show",function(){me.form.load()}),me.form.load(),me.store.load()},showHostDetailsWin:function(host){var detailWin=Ext.create("Fbx.os.app.lanbrowser.HostInfosWin");detailWin.loadById(host.id),detailWin.show()}});Ext.define("Fbx.os.app.settings.DhcpStaticLeases",{extend:"Ext.grid.Panel",alias:"widget.dhcpstaticleases",requires:["Fbx.os.app.settings.DhcpStaticLeaseModel","Fbx.os.app.settings.DhcpDynamicLeaseModel","Ext.grid.plugin.CellEditing","Ext.grid.column.Action","Ext.grid.column.Template","Fbx.os.lib.FbxUtils","Fbx.os.gui.grid.column.EnumColumn","Ext.menu.Menu","Fbx.os.app.settings.DhcpStaticEditor","Fbx.os.app.lanbrowser.HostInfosWin"],showEditor:function(rec){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.settings.DhcpStaticEditor",{closeAction:"hide",listeners:{hide:function(){me.store.load()}}})),me.editor.setRecord(rec),me.editor.show(),setTimeout(function(){me.editor.focus()},200)},showHostDetailsWin:function(host){var detailWin=Ext.create("Fbx.os.app.lanbrowser.HostInfosWin");detailWin.loadById(host.id),detailWin.show()},initComponent:function(){var me=this;me.store=Ext.getStore("dhcpStaticLeaseStore"),Ext.applyIf(me,{store:me.store,bodyPadding:0,buttons:["->",{text:"Ajouter un bail DHCP Statique",iconCls:"btn-add",handler:function(){var r=me.store.add({});me.showEditor(r[0])}}],columns:[{xtype:"templatecolumn",dataIndex:"hostname",hideable:!1,tpl:'<div class="lan-host-img lan-host-{[values.host.reachable ? "on" : "off"]}  lan-{[values.host.host_type + "-" + (values.host.reachable ? "on" : "off")]}"></div>'},{xtype:"templatecolumn",dataIndex:"hostname",hideable:!1,tpl:'<div><a href="#">{hostname:htmlEncode}</a></div><div style="margin-top: 10px;" class="dhcp-host-detail">{mac}<br />{ip}</div>',flex:1},{xtype:"templatecolumn",text:"Commentaire",dataIndex:"comment",tpl:"{comment:htmlEncode}",flex:1},{xtype:"actioncolumn",hideable:!1,width:30,items:[{iconCls:"btn-edit",tooltip:"Éditer",handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex));me.showEditor(rec)}}]},{xtype:"actioncolumn",hideable:!1,width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);rec.phantom?me.store.remove(rec):Ext.MessageBox.confirm("Supprimer","Voulez-vous retirer ce bail statique de la liste ?",function(btn){"yes"==btn&&(me.store.remove(rec),me.store.sync())})}}]}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun bail statique configuré</div>'},listeners:{cellclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){if("hostname"==grid.headerCt.getGridColumns()[cellIndex].dataIndex){e.stopEvent();var host=record.get("host");""!=host&&me.showHostDetailsWin(host)}},itemdblclick:function(grid,rec,item,index,e,eOpts){me.showEditor(rec)}}}),me.callParent(arguments)},isDirty:function(){return!1}});Ext.define("Fbx.os.app.settings.Accounts",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.app.accounts.AuthorizationModel","Fbx.os.app.accounts.SessionsModel","Ext.data.Store","Ext.grid.Panel","Ext.grid.column.Template","Ext.tab.Panel","Fbx.os.gui.grid.column.EnumColumn","Ext.form.field.Checkbox","Ext.form.CheckboxGroup","Fbx.ux.form.AjaxFormPanel","Ext.form.FieldSet","Ext.window.Window","Fbx.os.app.settings.domains.DomainModel"],statics:{defaultName:"Gestion des accès",defaultWidth:750,defaultHeight:600,allowMultipleInstance:!1,docSection:"doc/index.html#gerer-les-applications-tierces-se-connectant-au-freebox"},launch:function(){var me=this;me.store=Ext.create("Ext.data.Store",{model:"Fbx.os.app.accounts.AuthorizationModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"id",direction:"ASC"}],pageSize:0,autoLoad:!1}),Fbx.os.app.accounts.AuthorizationModel.loadPermissions(function(success){me.store.load()}),me.grid=Ext.create("Ext.grid.Panel",{title:"Applications",store:me.store,viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucune application autorisée</div>'},dockedItems:[{xtype:"toolbar",items:[{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.store.load()}},{iconCls:"btn-delete",text:"Révoquer tous les accès",handler:function(){Ext.MessageBox.confirm("Supprimer","Voulez-vous révoquer toutes les autorisations ? <br />Vous devrez alors réassocier Freebox Compagnon",function(btn){"yes"==btn&&me.store.each(function(rec){rec.destroy()})})}}]}],columns:[{xtype:"templatecolumn",text:"Application",dataIndex:"app_name",tpl:'<div class="accounts-app-name">{app_name:htmlEncode}</div><div class="accounts-app-device">({device_name:htmlEncode})</div>',flex:1},{xtype:"templatecolumn",text:"Accès",dataIndex:"last_session",tpl:"<div>Dernier accès : {[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(new Date(values.last_session * 1000))]}</div><div>Création : {[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(new Date(values.req_date * 1000))]}</div>",flex:2},{text:"Permissions",dataIndex:"permissions_str",flex:2},{xtype:"actioncolumn",maxWidth:30,align:"center",stopSelection:!0,iconCls:"btn-edit",items:[{tooltip:"Éditer",handler:function(grid,rowIndex,colIndex,item,e,rec){me.showEditor(rec)}}]},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=me.store.getAt(rowIndex);Ext.MessageBox.confirm("Supprimer","Voulez-vous révoquer cette autorisation ?",function(btn){"yes"==btn&&(me.store.remove(rec),me.store.sync())})}}]}],listeners:{celldblclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){me.showEditor(record)}},buttons:["->",{text:"OK",iconCls:"btn-accept",handler:function(){me.mainWindow.close()}}]}),me.sessionStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.accounts.SessionsModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"id",direction:"ASC"}],pageSize:0,autoLoad:!0}),me.sessionsGrid=Ext.create("Ext.grid.Panel",{title:"Sessions",store:me.sessionStore,viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucune session ouverte</div>'},dockedItems:[{xtype:"toolbar",items:[{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.sessionStore.load()}}]}],columns:[{xtype:"templatecolumn",text:"Application",dataIndex:"app_name",tpl:'<div class="accounts-app-name">{app_name:htmlEncode}</div><div class="accounts-app-device">({device_name:htmlEncode})</div>',flex:2},{text:"IP",dataIndex:"client_ip",flex:1},{xtype:"templatecolumn",text:"Ouverture de la session",dataIndex:"start_time",tpl:"{[Fbx.os.lib.FbxUtils.niceEventTimesDisplay(new Date(values.start_time * 1000))]}",width:150},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=me.sessionStore.getAt(rowIndex);Ext.MessageBox.confirm("Supprimer","Voulez-vous fermer cette session ?",function(btn){"yes"==btn&&(me.sessionStore.remove(rec),me.sessionStore.sync())})}}]}],buttons:["->",{text:"OK",iconCls:"btn-accept",handler:function(){me.mainWindow.close()}}]}),me.settingsForm=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"connection/config/",bodyPadding:10,title:"Paramètres",autoScroll:!0,defaults:{anchor:"100%"},items:[{xtype:"fieldset",title:"Interface Web",items:[{xtype:"label",html:"Si vous voulez changer le mot de passe administrateur de votre Freebox cliquez sur le bouton ci-dessous<br />Le changement du mot de passe entrainera la réinitialisation des autorisations des applications tierces"},{xtype:"button",text:"Changer le mot de passe administrateur",margin:5,handler:function(){document.location="reset.php"}}]},{xtype:"fieldset",title:"Accès à Freebox OS",defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"label",html:"Lorsque vous utilisez des apllication ou des liens de partage l'accès à votre freebox est rendu possible automatiquement. Vous avez la possibilité de personnaliser le port utilisé ci dessous.<br />D'autre part si vous souhaitez pouvoir vous identifier avec votre mot de passe en utilisant l'accès à distance vous devez cocher l'option ci dessous."},{xtype:"numberfield",fieldLabel:"Port accès distant (HTTP)",name:"remote_access_port",ttip:"Port sur lequel vous devrez vous connecter pour utiliser l'accès à distance",emptyText:80,maxValue:65535,minValue:0,listeners:{change:function(){me.updateRemoteUrl()}}},{xtype:"numberfield",fieldLabel:"Port accès distant sécurisé (HTTPS)",name:"https_port",ttip:"Port sur lequel vous devrez vous connecter pour utiliser l'accès à distance",emptyText:443,maxValue:65535,minValue:0,listeners:{change:function(){me.updateRemoteUrl()}}},{xtype:"checkboxfield",fieldLabel:"Activer l'authentification par mot de passe",name:"remote_access",boxLabel:"",ttip:"Lorsque vous activez cette option vous pouvez accéder au contenu de votre freebox depuis n'importe quelle connexion internet, en utilisant votre mot de passe.",listeners:{change:function(checkbox,newval){var form=checkbox.up("form").getForm();me.updateRemoteUrl(),form.findField("remote_access_url").setVisible(newval)}}},{xtype:"checkboxfield",fieldLabel:"Désactiver le mode invité",name:"disable_guest",boxLabel:"",ttip:"Vous pouvez activer cette option pour désactiver le mode invité de Freebox OS"},{xtype:"displayfield",fieldLabel:"Adresse à utiliser pour l'accès distant",name:"remote_access_url",value:"",hidden:!0},{xtype:"displayfield",fieldLabel:"",name:"api_remote_access_str",value:"",hidden:!0}]},{xtype:"fieldset",title:"Applications",defaults:{anchor:"100%",labelWidth:500},items:[{xtype:"label",html:"Des applications tierces peuvent demander l'accès à certaines fonctionnalités de votre Freebox (comme Freebox Compagnon). <br />Vous pouvez gérer la liste d'applications autorisées dans l'onglet Applications.<br />Si vous ne souhaitez pas qu'une nouvelle application puisse s'associer à votre Freebox vous avez la possibilité d'interdire les nouvelles demandes d'association en décochant la case ci-dessous."},{xtype:"checkboxfield",fieldLabel:"Permettre les nouvelles demandes d'association",name:"allow_token_request",boxLabel:"",ttip:"Si vous décochez cette case vous ne pourrez plus associer de nouvelles applications avec votre Freebox."}]},{xtype:"fieldset",title:"Sessions",defaults:{anchor:"100%",labelWidth:500},items:[{xtype:"label",html:"L'onglet sessions vous permet de contrôler qui est actuellement connecté à votre Freebox.<br />Vous avez la possibilité de fermer une session à distance si vous constatez un accès non autorisé."}]}],listeners:{saved:function(){me.updateRemoteUrl()},loaded:function(form,conf){me.updateRemoteUrl();var minPort=0,maxPort=65535;void 0!==conf.remote_access_max_port&&void 0!==conf.remote_access_min_port&&(minPort=conf.remote_access_min_port,maxPort=conf.remote_access_max_port);var form=me.settingsForm.getForm(),portField=form.findField("remote_access_port");portField.setMinValue(minPort),portField.setMaxValue(maxPort),portField.minText="Vous devez choisir un port supérieur à "+minPort,portField.maxText="Vous devez choisir un port inférieur à "+maxPort,form.isValid()}}}),me.cont=Ext.create("Ext.tab.Panel",{layout:{type:"fit"},items:[me.settingsForm,me.grid,me.sessionsGrid]}),this.mainWindow.add(me.cont),me.callParent(arguments),me.settingsForm.load({method:"GET"})},updateRemoteUrl:function(){var me=this;me.__updatingUrl||(me.__updatingUrl=!0,Fbx.os.app.settings.domains.DomainModel.getDomainsConf(function(domainsCfg){var form=me.settingsForm.getForm(),remoteUrlField=form.findField("remote_access_url"),portField=form.findField("remote_access_port"),httpsPortField=form.findField("https_port");me.__updatingUrl=!1;var domain=domainsCfg.default_domain;domain&&""!=domain||(domain=domainsCfg.api_domain);var remoteUrl;if(me.settingsForm.values.https_available){remoteUrl="https://"+domain;var port=httpsPortField.getValue();443!=port&&(remoteUrl+=":"+port)}else{remoteUrl="http://"+domain;var port=portField.getValue();80!=port&&(remoteUrl+=":"+port)}remoteUrl+="/",remoteUrlField.setValue('<a href="'+remoteUrl+'" target="_blank">'+remoteUrl+"</a>"),remoteUrlField.setVisible(me.settingsForm.values.remote_access);var apiRemoteField=form.findField("api_remote_access_str");me.settingsForm.values.api_remote_access&&!me.settingsForm.values.remote_access?(apiRemoteField.setVisible(!0),apiRemoteField.setValue('<span style="color: orange;">NOTE: L\'accès distant est possible pour les applications et les liens de partages</span>')):(apiRemoteField.setVisible(!1),apiRemoteField.setValue(""))}))},showEditor:function(rec){var me=this;if(!me.rightsEditor){me.checkBoxes=[];var names=Fbx.os.app.accounts.AuthorizationModel.permissionsName;for(var perm in names){var name=Fbx.os.app.accounts.AuthorizationModel.permissionsName[perm];Ext.Array.push(me.checkBoxes,Ext.create("Ext.form.field.Checkbox",{boxLabel:name,name:perm}))}me.checkboxGroup=Ext.create("Ext.form.FieldSet",{title:"Liste des droits d'accès",items:[{xtype:"checkboxgroup",fieldLabel:"",columns:2,items:me.checkBoxes}]}),me.rightsEditor=Ext.create("Ext.window.Window",{closeAction:"hide",title:"Modification des droits d'accès",modal:!0,layout:"fit",width:600,items:[{xtype:"form",bodyPadding:5,defaults:{labelWidth:75,anchor:"100%"},items:[me.checkboxGroup],buttons:[{iconCls:"btn-accept",text:"OK",handler:function(){var form=this.up("form").getForm(),vals=form.getValues(),rights={};for(var type in vals)"on"==vals[type]&&(rights[type]=!0);me.rightsEditor.rec.set("permissions",rights),me.rightsEditor.rec.save({success:function(){me.rightsEditor.hide()}})}}]}]})}var form=me.rightsEditor.down("form").getForm(),perms=rec.get("permissions"),names=Fbx.os.app.accounts.AuthorizationModel.permissionsName;for(var perm in names)perms[perm]||(perms[perm]=!1);form.setValues(perms),me.rightsEditor.rec=rec,me.rightsEditor.show()}});Ext.define("Fbx.os.app.settings.PhoneDectStatus",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.Label","Ext.tab.Panel","Ext.form.field.Checkbox","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.SizeDisplay","Fbx.ux.form.field.EnumDisplay","Fbx.os.app.settings.PhoneModel","Fbx.os.app.settings.PhoneStatusFieldset","Fbx.ux.form.AjaxFormPanel","Ext.data.ArrayStore","Ext.button.Button","Ext.data.Store","Ext.panel.Panel","Ext.form.Panel"],statics:{defaultName:"Téléphonie / DECT",defaultWidth:500,defaultHeight:380,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#configurer-vos-dect",beforeLaunch:function(cb){Fbx.os.gui.Environment.boxHasDect()&&cb()}},launch:function(){var me=this;me.store=Ext.getStore("phoneStore"),me.store||(me.store=Ext.create("Ext.data.Store",{storeId:"phoneStore",model:"Fbx.os.app.settings.PhoneModel",remoteSort:!1,remoteFilter:!1,pageSize:0})),me.emptyLabel=Ext.create("Ext.form.Label",{text:"Aucun téléphone associé"}),me.ringBtn=Ext.create("Ext.button.Button",{margin:5,iconCls:"btn-bell",text:"Faire sonner les combinés",flex:1,handler:function(button){me.form.getForm().isDirty()?me.form.submit(function(){me.pageDect(button)}):me.pageDect(button)}}),me.deleteBtn=Ext.create("Ext.button.Button",{margin:5,flex:1,iconCls:"btn-delete",text:"Supprimer toutes les associations",handler:function(){var dects=[];Ext.MessageBox.confirm("Confirmation","Êtes-vous sûr de vouloir supprimer toutes les associations ?",function(btn){"yes"==btn&&(me.store.each(function(rec){"dect"==rec.get("type")&&dects.push(rec)}),me.store.remove(dects),me.store.sync())})}}),me.phoneList=Ext.create("Ext.panel.Panel",{layout:{align:"stretch",type:"vbox"},title:"Combinés Associés",border:0,bodyPadding:5,autoScroll:!0,buttons:[me.ringBtn,me.deleteBtn],items:[me.emptyLabel],listeners:{show:function(){me.phoneList.up("window").suspendRefresh=!1,me.refreshStatus()},hide:function(){me.phoneList.up("window").suspendRefresh=!0}}}),me.phoneList.mon(me.store,"load",function(){var items=me.phoneList.items,nbItems=me.phoneList.items.getCount()-1,dects=[],forceRefresh=!1;if(me.phoneList.suspendLayout=!0,me.store.each(function(rec){"dect"==rec.get("type")&&dects.push(rec)}),me.deleteBtn.setDisabled(0==dects.length),me.ringBtn.setDisabled(0==dects.length),0==dects.length?me.emptyLabel.show():me.emptyLabel.hide(),dects.length!=nbItems){for(forceRefresh=!0;nbItems<dects.length;){var item=Ext.create("Ext.form.Panel",{layout:"fit",border:0,margin:"0 4",items:[{xtype:"phonestatusfieldset",type:"dect",title:"DECT"}]});me.phoneList.insert(item),++nbItems}for(;nbItems>dects.length;)me.phoneList.remove(items.last()),--nbItems}for(var i=0;i<dects.length;++i){var item=items.getAt(i+1),rec=dects[i];!forceRefresh&&me.phoneList.up("window").suspendRefresh||(item.loadRecord(rec),item.down("phonestatusfieldset").setTitle("DECT "+rec.get("type_id")))}me.phoneList.suspendLayout=!1,me.phoneList.doLayout()}),me.paging=!1,me.ringPatternStore=Ext.getStore("ringPatternStore"),me.ringPatternStore||(me.ringPatternStore=Ext.create("Ext.data.ArrayStore",{storeId:"ringPatternStore",fields:["val","label"],data:[[0,"Sonnerie interne"],[1,"Sonnerie externe (défaut)"],[2,"Sonnerie 2"],[3,"Sonnerie 3"],[4,"Sonnerie 4"],[5,"Sonnerie 5"],[6,"Sonnerie 6"],[7,"Sonnerie 7"],[8,"Sonnerie continue"]]})),Ext.apply(Ext.form.field.VTypes,{pinCode:function(val,field){return/^\d{4}$/.test(val)},pinCodeText:"Code PIN invalide",pinCodeMask:/\d/}),me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"phone/config/",bodyPadding:10,autoScroll:!0,title:"Base DECT",defaults:{anchor:"100%",labelWidth:150},items:[{xtype:"enumdisplayfield",fieldLabel:"Service téléphonique",name:"network",ttip:"État de votre service téléphonique",strings:{working:"Opérationnel",unconfigured:'<span style="color: red;">Non configuré</span>'}},{xtype:"checkboxfield",fieldLabel:"Activer la base DECT",name:"dect_enabled",ttip:"Si vous n'utilisez pas la base DECT intégrée à votre Freebox, vous pouvez la désactiver décochant cette case",checked:!0,boxLabel:"",listeners:{change:function(field,newVal){me.form.getForm().getFields().each(function(f){f!=field&&f.setDisabled&&f.setDisabled(!newVal)}),me.phoneList.setDisabled(!newVal)}}},{xtype:"checkboxfield",fieldLabel:"Ouvrir l'association",ttip:"Ouvrir l'association vous permet d'associer un nouveau combiné sans fil à la base DECT de la Freebox",boxLabel:"",name:"dect_registration"},{xtype:"textfield",fieldLabel:"Code PIN",name:"dect_pin",ttip:"Code PIN qui vous sera demandé sur le téléphone DECT lors de l'association",vtype:"pinCode"},{xtype:"checkboxfield",fieldLabel:"Sonnerie intermittente",name:"dect_ring_on_off",ttip:"Cette option doit être activée pour que la sonnerie fonctionne correctement avec certains modèles de combinés DECT",boxLabel:""},{xtype:"combobox",name:"dect_ring_pattern",store:me.ringPatternStore,fieldLabel:"Sonnerie",queryMode:"local",displayField:"label",ttip:"Vous permet de modifier la sonnerie de votre combiné DECT (varie en fonction du modèle de combiné)",valueField:"val"},{xtype:"checkboxfield",fieldLabel:"Mode éco",name:"dect_eco_mode",ttip:"Réduit la puissance d'émission DECT, ce qui améliore l'autonomie des téléphones mais réduit la portée du signal DECT"},{xtype:"checkboxfield",fieldLabel:"Mode éco +",name:"dect_nemo_mode",ttip:"Permet d'interrompre l'emission du signal DECT lorsque les téléphones ne sont pas utilisés"}],listeners:{show:function(){me.form.load()}}}),me.tabPanel=Ext.create("Ext.tab.Panel",{items:[me.form,me.phoneList]}),this.mainWindow.add(this.tabPanel),this.callParent(),me.phoneList.up("window").suspendRefresh=!0,me.timer=setInterval(function(){me.refreshStatus()},1e3),me.form.load(),me.store.load()},refreshStatus:function(){var me=this;me.phoneList.up("window").suspendRefresh||me.store.isLoading()||me.store.load({autorefresh:!0})},destroy:function(){this.timer&&clearInterval(this.timer),this.callParent(arguments)},pageDect:function(button){var me=this,url=FbxConf.apiBaseUrl+"phone/dect_page_start/";me.paging&&(url=FbxConf.apiBaseUrl+"phone/dect_page_stop/"),Ext.Ajax.request({url:url,method:"POST",success:function(response){response.jsonData;me.paging=!me.paging,me.paging?button.setText("Arrêter la sonnerie des combinés"):button.setText("Faire sonner les combinés")}})}});Ext.define("Fbx.os.app.settings.ParentalFilterConfig",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel","Fbx.os.app.settings.ParentalFilterModel","Ext.grid.column.Boolean","Fbx.os.gui.grid.column.EnumColumn","Ext.grid.column.Template","Ext.grid.column.Action","Fbx.os.app.settings.ParentalFilterEditor","Ext.grid.feature.Grouping","Fbx.os.app.lanbrowser.HostInfosWin","Ext.button.Button","Ext.form.field.ComboBox","Ext.data.Store","Ext.data.ArrayStore","Ext.grid.Panel","Ext.panel.Panel","Ext.window.Window","Ext.form.Panel","Ext.form.Label","Ext.grid.column.Column"],statics:{defaultName:"Contrôle parental",defaultWidth:650,defaultHeight:400,allowMultipleInstance:!1,disabledInBridge:!0,docSection:"doc/index.html#controle-parental",showHostDetailsWin:function(rId){Fbx.os.core.TaskManager.getAppInstances("Fbx.os.app.settings.ParentalFilterConfig")[0].showHostDetailsWin(rId)}},refresh:function(){var me=this;me.filterStore.loaded=!1,me.hostStore.loaded=!1,me.defaultFilterMode="",me.filterStore.load(),me.hostStore.load(),me.ajaxParams.load()},detailWins:{},showHostDetailsWin:function(rId){var me=this,rec=me.hostStore.getById(rId);if(rec){var detailWin=me.detailWins[rId];detailWin||(detailWin=Ext.create("Fbx.os.app.lanbrowser.HostInfosWin"),me.detailWins[rId]=detailWin,detailWin.on("close",function(){me.detailWins[rId]=void 0})),detailWin.setRecord(rec),detailWin.show()}},updateGrid:function(){var me=this;if(me.hostStore.loaded&&me.filterStore.loaded&&""!=me.defaultFilterMode){var rules=[],hostsWithFilter={};me.filterStore.each(function(f){var rule={desc:f.get("desc"),icon_name:"group",filter_state:f.get("filter_state"),state_desc:f.getStateDesc(),hasfilter:!0,filter:f,hosts:[]},macs=f.get("macs");macs.length?(Ext.Array.each(macs,function(mac){hostsWithFilter[mac]=rule;var hostIndex=me.hostStore.find("mac",mac,0,!1,!1);if(hostIndex>=0){var h=me.hostStore.getAt(hostIndex);Ext.Array.push(rule.hosts,{id:h.getId(),mac:mac,primary_name:h.get("primary_name"),reachable:h.get("reachable"),icon_name:h.get("icon_name")})}else Ext.Array.push(rule.hosts,{id:"",mac:mac,primary_name:mac,reachable:!1,icon_name:"workstation-off"})}),1==rule.hosts.length&&(rule.icon_name=rule.hosts[0].icon_name,rule.reachable=rule.hosts[0].reachable)):(rule.icon_name="workstation-on",rule.reachable=!1,Ext.Array.push(rule.hosts,{id:"",mac:"",primary_name:f.get("ip")+" (Règle à migrer)",reachable:!0,icon_name:"workstation-on"})),Ext.Array.push(rules,rule)});if(me.hostStore.each(function(h){var mac=h.get("mac");if(mac&&""!=mac&&!hostsWithFilter[mac]){var filterhost={id:h.getId(),mac:h.get("mac"),primary_name:h.get("primary_name"),reachable:h.get("reachable"),icon_name:h.get("reachable")},rule={desc:h.get("primary_name"),icon_name:h.get("icon_name"),filter_state:me.defaultFilterMode,state_desc:"Pas de règle de filtrage",hasfilter:!1,filter:null,reachable:filterhost.reachable,hosts:[filterhost]};hostsWithFilter[mac]=rule,Ext.Array.push(rules,rule)}}),me.store.loadData(rules),me.args&&me.args.mac&&""!=me.args.mac){var mac=me.args.mac;me.args=!1;var rule=hostsWithFilter[mac];rule.filter?me.showEditor(rule.filter):me.suggestFilterReuse(mac)}}},editRecord:function(record){var me=this,filter=record.get("filter");if(!filter||""==filter){var host=record.get("hosts")[0];return void me.suggestFilterReuse(host.mac)}me.showEditor(filter)},showEditor:function(filterRecord){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.settings.ParentalFilterEditor",{closeAction:"hide"}),me.editor.hostStore=me.hostStore,me.editor.ruleStore=me.store,me.mon(me.editor,"hide",function(){me.refresh()})),me.editor.loadRecord(filterRecord),me.editor.show()},setArgs:function(args){this.args=args},launch:function(args){var me=this;args&&me.setArgs(args),me.filterStore=Ext.create("Ext.data.Store",{storeId:"lanFilters",model:"Fbx.os.app.settings.ParentalFilterModel",listeners:{load:function(){me.filterStore.loaded=!0,me.updateGrid()}}}),me.hostStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.lanbrowser.HostModel",listeners:{load:function(){me.hostStore.loaded=!0,me.updateGrid()}}}),me.store=Ext.create("Ext.data.ArrayStore",{groupDir:"ASC",groupers:[{property:"hasfilter",sorterFn:function(a,b){var aa=a.get("hasfilter");return aa==b.get("hasfilter")?0:aa?-1:1}}],sorters:[{property:"reachable",direction:"DESC"},{property:"desc",direction:"ASC",transform:function(a){return a.toLowerCase()}}],fields:[{name:"desc",type:"str"},{name:"icon_name",type:"string"},{name:"filter_state",type:"string"},{name:"state_desc",type:"string"},{name:"hasfilter",type:"boolean"},{name:"reachable",type:"boolean"},{name:"filter",type:"object"},{name:"hosts",type:"object"}]});var groupingFeature=Ext.create("Ext.grid.feature.Grouping",{collapsible:!1,groupHeaderTpl:'<tpl if="name">Règles de contrôle parental</tpl><tpl if="!name">Machines sans contrôle parental</tpl>'});me.gridSpecialBtn={},me.grid=Ext.create("Ext.grid.Panel",{autoScroll:!0,title:"",hideHeaders:!0,cls:"parental-filter-grid",region:"center",border:0,bodyStyle:{border:0},features:[groupingFeature],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun filtre</div>',getRowClass:function(record,rowIndex,rowParams,store){return"filter-row-"+record.get("filter_state")}},store:me.store,columns:[{xtype:"templatecolumn",dataIndex:"desc",tpl:'<div class="lan-host-img lan-host-{[values.reachable ? "on" : "off"]} lan-{icon_name}"></div>'},{xtype:"templatecolumn",dataIndex:"desc",tpl:'<tpl if="hosts.length &gt; 1">  <div class="parental-rule-desc">{desc:htmlEncode}</div></tpl><div class="parental-rule-hosts">  <tpl for="hosts">    &bull;     <tpl if="id != \'\'"><a href="javascript:Fbx.os.app.settings.ParentalFilterConfig.showHostDetailsWin(\'{id}\');"></tpl><tpl if="primary_name != \'\'">{primary_name:htmlEncode}</tpl><tpl if="primary_name == \'\'">{mac}</tpl><tpl if="id != \'\'"></a></tpl>    <br />  </tpl></div>',flex:1},{xtype:"gridcolumn",flex:2,renderer:function(v,meta,rec,rowIndex,colIndex,store,view){var filter=rec.get("filter");if(!filter||""==filter)return"";var id=Ext.id();return setTimeout(function(){var div=document.getElementById(id),state=filter.get("filter_state"),action=("denied"==state?"Autoriser":"Interdire")+" l'accès à internet";if(filter.get("tmp_mode_expire")>0)me.gridSpecialBtn[rowIndex]=Ext.create("Ext.button.Button",{renderTo:div,text:"Revenir à la planification",handler:function(){filter.set("tmp_mode_expire",0),filter.save({success:function(){me.filterStore.load()}})}});else{var handler=function(btn){var new_state="denied"==state?"allowed":"denied";btn.duration>0?(filter.set("tmp_mode",new_state),filter.set("tmp_mode_expire",60*btn.duration)):(filter.set("forced",!0),filter.set("forced_mode",new_state),filter.set("tmp_mode_expire",0)),filter.save({success:function(){me.filterStore.load()}})},btnItems=[{text:action+" pendant 30 min",duration:30,handler:handler},{text:action+" pendant 1 heure",duration:60,handler:handler},{text:action+" pendant 2 heures",duration:120,handler:handler},{text:action+" pendant 6 heures",duration:360,handler:handler},{text:action+" pendant 12 heures",duration:720,handler:handler},{text:action+" pendant 1 jour",duration:1440,handler:handler},{text:action+" pendant 1 semaine",duration:10080,handler:handler},{text:action+" de façon permanente",duration:-1,handler:handler}];if(filter.get("forced")){var backToPlanning=function(){filter.set("forced",!1),filter.set("tmp_mode_expire",0),filter.save({success:function(){me.filterStore.load()}})};Ext.Array.push(btnItems,{text:"Revenir à la planification",duration:-1,handler:backToPlanning})}me.gridSpecialBtn[rowIndex]=Ext.create("Ext.button.Button",{renderTo:div,text:action,menu:{plain:!0,showSeparator:!1,cls:"menu-without-icon",items:btnItems}})}},100),'<div style="text-align: center;">  <div style="margin-bottom: 5px;">'+rec.get("state_desc")+' </div>  <div" id="'+id+'"></div></div>'}},{xtype:"actioncolumn",width:28,items:[{getTip:function(v,meta,rec,rowIndex,colIndex,store){return rec.get("hasfilter")?"Éditer":"Ajouter"},getClass:function(v,meta,rec,rowIndex,colIndex,store){return rec.get("hasfilter")?"btn-edit":"btn-add"},handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex));me.editRecord(rec)}}]},{xtype:"actioncolumn",width:28,items:[{getClass:function(v,meta,rec,rowIndex,colIndex,store){return rec.get("hasfilter")?"btn-delete":""},getTip:function(v,meta,rec,rowIndex,colIndex,store){return rec.get("hasfilter")?"Supprimer":""},handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex)),filter=rec.get("filter");if(!filter||""==filter)return void me.editRecord(rec);Ext.MessageBox.confirm("Supprimer","Voulez-vous supprimer ce filtre ?",function(btn){"yes"==btn&&filter.destroy({callback:function(){me.refresh()}})})}}]}],listeners:{celldblclick:function(gird,td,cellIndex,record,tr,rowIndex,e,eOpts){1!=cellIndex&&2!=cellIndex&&me.editRecord(record)}}}),me.ajaxParams=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"parental/config/",bodyPadding:5,region:"south",showApplyCancel:!1,showOkBtn:!1,disableLoadMask:!0,defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"combo",name:"default_filter_mode",fieldLabel:"Mode de filtrage par défaut",editable:!1,forceSelection:!0,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["allowed","Accès internet autorisé"],["denied","Accès internet refusé"],["webonly","Accès web uniquement"]]}),value:"all",displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0}],listeners:{loaded:function(form,conf){me.defaultFilterMode=conf.default_filter_mode,me.updateGrid()},saved:function(){setTimeout(function(){me.cont.isVisible()&&me.refresh()},200)}}}),me.cont=Ext.create("Ext.panel.Panel",{autoScroll:!1,scroll:!1,layout:{type:"border"},items:[me.grid,me.ajaxParams],buttons:[{iconCls:"btn-filter-add",text:"Ajouter un filtre manuellement",width:200,handler:function(){me.suggestFilterReuse()}},"->",{iconCls:"btn-arrow-refresh",text:"Rafraîchir",handler:function(){me.refresh()}},{iconCls:"btn-save",text:"Appliquer",handler:function(){me.ajaxParams.submitForm(!1)}},{iconCls:"btn-accept",text:"OK",handler:function(){me.ajaxParams.submitForm(!0)}},{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.close()}}]}),this.mainWindow.add(me.cont),me.callParent(arguments),me.mon(me.mainWindow,"show",function(){me.refresh()}),me.refresh()},suggestFilterReuse:function(mac){var me=this,existingFilters=[[-1,"Créer une nouvelle règle"]];if(me.store.each(function(f){if(f.get("hasfilter")){var desc=f.get("desc");if(""==desc){desc=f.get("hosts")[0].primary_name}var filter=f.get("filter");existingFilters.push([filter.getId(),desc])}}),1==existingFilters.length){var macs=mac?[mac]:[],records=me.filterStore.add({macs:macs,forced:!1,tmp_mode_expire:0,scheduling_mode:"planning"});return void me.showEditor(records[0])}var comboStore=new Ext.data.ArrayStore({fields:["filter_id","label"],data:existingFilters}),combo=Ext.create("Ext.form.field.ComboBox",{editable:!1,name:"previous",forceSelection:!0,store:comboStore,displayField:"label",valueField:"filter_id",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,value:-1,margin:"10 0"}),win=Ext.create("Ext.window.Window",{closeAction:"destroy",title:"Réutiliser une règle existante ?",width:450,items:[{xtype:"form",bodyPadding:5,defaults:{labelWidth:400,anchor:"100%"},items:[{xtype:"label",text:"Voulez-vous réutiliser une règle existante ?"},combo],buttons:[{iconCls:"btn-accept",text:"OK",handler:function(){var form=win.down("form").getForm(),values=form.getValues(),prev=values.previous;if(prev>0){var filter=me.filterStore.getById(prev),macs=filter.get("macs");mac?(Ext.Array.push(macs,mac),filter.set("macs",macs),filter.save({success:function(){win.hide(),me.filterStore.load()}})):Ext.Msg.prompt("Ajout d'une adresse mac à un filtre","Adresse MAC de la machine",function(btnId,value){win.hide(),"ok"==btnId&&(Ext.Array.push(macs,mac),filter.set("macs",macs),filter.save({success:function(){me.filterStore.load()}}))})}else{var macs=mac?[mac]:[],records=me.filterStore.add({macs:macs,forced:!1,tmp_mode_expire:0,scheduling_mode:"planning"});win.hide(),me.showEditor(records[0])}}}]}]});win.show()}});Ext.define("Fbx.ux.tree.plugin.FsTreeViewDragDrop",{extend:"Ext.tree.plugin.TreeViewDragDrop",alias:"plugin.fstreeviewdragdrop",requires:["Ext.tree.ViewDragZone","Fbx.ux.tree.FsViewDropZone"],onViewRender:function(view){var me=this;me.enableDrag&&(me.dragZone=Ext.create("Ext.tree.ViewDragZone",{view:view,ddGroup:me.dragGroup||me.ddGroup,dragText:me.dragText,repairHighlightColor:me.nodeHighlightColor,repairHighlight:me.nodeHighlightOnRepair})),me.enableDrop&&(me.dropZone=Ext.create("Fbx.ux.tree.FsViewDropZone",{view:view,ddGroup:me.dropGroup||me.ddGroup,allowContainerDrops:me.allowContainerDrops,appendOnly:me.appendOnly,allowParentInserts:me.allowParentInserts,expandDelay:me.expandDelay,dropHighlightColor:me.nodeHighlightColor,dropHighlight:me.nodeHighlightOnDrop}))}});Ext.define("Fbx.os.app.lanbrowser.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.view.View","Fbx.os.app.lanbrowser.HostModel","Ext.ux.DataView.LabelEditor","Fbx.ux.view.RefreshView","Fbx.os.app.lanbrowser.HostInfosWin","Ext.menu.Menu","Ext.data.Store","Ext.panel.Panel","Ext.data.ArrayStore","Ext.form.ComboBox"],statics:{defaultName:"Périphériques réseau",defaultWidth:750,defaultHeight:400,allowMultipleInstance:!1,disabledInBridge:!0,docSection:"doc/index.html#peripheriques-reseau"},addControlFilter:function(host){var mac=host.get("mac");Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.ParentalFilterConfig",{mac:mac})},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Propriétés",cls:"bold",iconCls:"btn-properties",handler:function(){var rec=me.contextMenu.record;me.dataView.showDetailsWin(rec)}},"-",{itemId:"forgetItem",text:"Oublier",iconCls:"btn-delete",handler:function(){me.contextMenu.record.destroy()}},"-",{text:"Configurer le contrôle parental",iconCls:"btn-settings-parentalfilterconfig",handler:function(){var rec=me.contextMenu.record;me.addControlFilter(rec)}},{text:"Configurer un bail DHCP",iconCls:"app-icons-16-settings-dhcp",handler:function(){var rec=me.contextMenu.record,con=rec.l3connectivities(),ip="";con&&con.each(function(c){if("ipv4"==c.get("af"))return ip=c.get("addr"),!1}),Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.Dhcp",{mac:rec.get("mac"),ip:ip})}},{text:"Configurer une redirection de port",iconCls:"app-icons-16-settings-ports-portredir",handler:function(){var rec=me.contextMenu.record,con=rec.l3connectivities(),ip="";con&&con.each(function(c){if("ipv4"==c.get("af"))return ip=c.get("addr"),!1}),Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.ports.PortRedir",{ip:ip})}},"-",{iconCls:"btn-transmit",text:"Filtrage Wi-Fi",hideOnClick:!1,menu:[{iconCls:"icon16 icon-whitelist",text:"Ajouter à la liste blanche",handler:function(){var rec=me.contextMenu.record;Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.wifi.Wifi",{mac:rec.get("mac"),hostname:rec.get("primary_name"),type:"whitelist",host:rec.raw})}},{iconCls:"icon16 icon-blacklist",text:"Ajouter à la liste noire",handler:function(){var rec=me.contextMenu.record;Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.wifi.Wifi",{mac:rec.get("mac"),hostname:rec.get("primary_name"),type:"blacklist",host:rec.raw})}}]},"-",{iconCls:"btn-wol",text:"Réveil réseau (Wake on Lan)",hideOnClick:!1,menu:[{iconCls:"btn-wol",text:"Allumer",handler:function(){me.contextMenu.record.wol("")}},{iconCls:"btn-wol",text:"Allumer (avancé)",handler:function(){Ext.Msg.prompt("Mot de passe WoL","Mot de passe WoL de l'hôte",function(btn,txt){if("yes"==btn){me.contextMenu.record.wol(txt)}})}}]}],listeners:{beforeshow:function(menu){var rec=menu.record;rec.get("persistent");menu.getComponent("forgetItem").setVisible(!rec.get("active"))}}})),me.contextMenu},launch:function(){var me=this;me.hostStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.lanbrowser.HostModel",autoLoad:!0,autoSync:!0,sorters:[{property:"reachable",direction:"DESC"},{property:"primary_name",direction:"ASC"}],listeners:{beforeload:function(s,op){op.__network=me.filterCombo.getValue()}}}),me.dataView=Ext.create("Fbx.ux.view.RefreshView",{store:me.hostStore,detailWinClass:"Fbx.os.app.lanbrowser.HostInfosWin",showDetailOnClick:!0,itemSelector:"div.lan-host",selectedItemCls:"lan-host-selected",refreshFreq:2500,tpl:'<tpl for="."><div class="lan-host lan-host-{[values.reachable ? "on" : "off"]}">  <div role="button" class="lan-host-img lan-{icon_name}" aria-label="{primary_name:htmlEncode} {[values.reachable ? "Connecté" : "Non connecté"]}"></div>  <tpl if="is_crappy_name">    <div class="lan-host-name x-editable">      <tpl if="primary_name != \'\'">{primary_name:htmlEncode}</div></tpl>      <tpl if="primary_name == \'\'">{mac}</div></tpl>    <div class="lan-host-vendor">{vendor_name:htmlEncode}</div>  </tpl>  <tpl if="!is_crappy_name">    <div class="lan-host-name x-editable">{primary_name:htmlEncode}</div>  </tpl></div></tpl><div class="x-clear"></div>',plugins:[Ext.create("Ext.ux.DataView.LabelEditor",{dataIndex:"primary_name",listeners:{startedit:function(){me.dataView.suspendRefresh=!0},canceledit:function(){me.dataView.suspendRefresh=!1,me.dataView.planRefresh()},complete:function(){me.dataView.suspendRefresh=!1,me.dataView.planRefresh()}}})],listeners:{itemcontextmenu:function(view,record,item,index,e,eOpts){e.stopEvent();var ctxMenu=me.getCtxMenu();ctxMenu&&(ctxMenu.record=record,ctxMenu.showAt(e.xy))}}}),me.filterCombo=Ext.create("Ext.form.ComboBox",{name:"access_type",fieldLabel:"Réseau",store:new Ext.data.ArrayStore({fields:["val","name"],data:[["pub","Réseau local"],["wifiguest","Wi-Fi invité"]]}),displayField:"name",valueField:"val",allowBlank:!1,editable:!1,value:"pub",queryMode:"local",listeners:{change:function(combo,val){me.hostStore.load()}}}),me.cont=Ext.create("Ext.panel.Panel",{layout:"fit",autoScroll:!0,dockedItems:[{xtype:"toolbar",items:[me.filterCombo]}],items:[me.dataView]}),me.mainWindow.add(me.cont),me.callParent(arguments),me.on("boxready",function(){this.mixins.refreshmixin.constructor.call(this)})}});Ext.define("Fbx.os.app.settings.Freeplugs",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.app.settings.FreeplugNetworkModel","Ext.data.Store","Ext.panel.Panel","Fbx.ux.grid.RefreshGrid","Fbx.os.gui.grid.column.EnumColumn","Fbx.os.gui.grid.column.TransferSpeedColumn","Ext.data.ArrayStore"],statics:{defaultName:"Réseau / Freeplugs",defaultWidth:600,defaultHeight:400,allowMultipleInstance:!1,disabledInBridge:!1,modal:!0,docSection:"doc/index.html#controler-les-freeplugs"},selectFirst:function(){var me=this,store=me.netList.getStore(),first=store.first();first&&(me.netList.getSelectionModel().select(first),me.updatePlugList(first))},getSelected:function(){var me=this,selected=me.netList.getSelectionModel().getSelection();if(selected.length>0){var recId=selected[0].getId();return me.freeplugNetStore.getById(recId)}return null},updatePlugList:function(rec){var me=this;if(!rec)return void me.selectFirst();if(rec.members){var members=rec.members(),store=me.plugList.getStore();store.loadRecords(members.data.items,!1),store.sort({property:"net_role",direction:"ASC"})}},launch:function(){var me=this;me.freeplugNetStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.FreeplugNetworkModel",autoLoad:!0,remoteSort:!1,remoteFilter:!1,pageSize:0}),me.freeplugNetStore.on("afterload",function(){me.updatePlugList(me.getSelected())}),me.netList=Ext.create("Fbx.ux.grid.RefreshGrid",{store:me.freeplugNetStore,disableBufferring:!0,region:"west",width:175,split:!0,columns:[{text:"Réseau",flex:1,dataIndex:"id"}],listeners:{itemclick:function(grid,rec){me.updatePlugList(rec)}},viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun Freeplug détecté</div>'}}),me.plugList=Ext.create("Fbx.ux.grid.RefreshGrid",{suspendRefresh:!0,sortableColumns:!1,disableBufferring:!0,store:Ext.create("Ext.data.ArrayStore",{model:"Fbx.os.app.settings.FreeplugModel"}),region:"center",columns:[{text:"id",flex:1,dataIndex:"id"},{xtype:"enumcolumn",text:"Rôle",flex:1,dataIndex:"net_role",strings:{sta:"Station",cco:"Coordinateur",pco:"Proxy Coordinateur"}},{xtype:"transferspeedcolumn",text:"Débit TX",useBits:!0,flex:1,dataIndex:"tx_rate"},{xtype:"transferspeedcolumn",text:"Débit RX",useBits:!0,flex:1,dataIndex:"rx_rate"},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-reboot",tooltip:"Redémarrer",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);Ext.MessageBox.confirm("Redémarrer","Voulez-vous redémarrer ce freeplug ?",function(btn){"yes"==btn&&rec.reboot()})}}]}]}),me.panel=Ext.create("Ext.panel.Panel",{layout:{type:"border"},items:[me.netList,me.plugList]}),this.mainWindow.add(me.panel),me.callParent(arguments)}});Ext.define("Fbx.os.app.downloader.TaskFilesGrid",{extend:"Fbx.ux.grid.RefreshGrid",alias:"widget.taskfilesgrid",requires:["Fbx.os.app.downloader.TaskFileModel","Fbx.os.app.downloader.DownloadTaskModel","Ext.menu.Menu","Ext.data.Store","Fbx.os.gui.grid.column.EnumColumn","Fbx.os.gui.grid.column.PercentColumn","Ext.grid.column.Template","Ext.grid.column.Boolean"],suspendRefresh:!0,initComponent:function(){var me=this;me.filesStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.downloader.TaskFileModel",remoteSort:!1,remoteFilter:!0}),Ext.applyIf(me,{selModel:{mode:"MULTI"},store:me.filesStore,columns:[{xtype:"templatecolumn",text:"",width:24,dataIndex:"status",tpl:'<div class="btn-download-{status}"></div>'},{xtype:"templatecolumn",dataIndex:"name",text:"Fichier",flex:3,minWidth:300,tpl:'<div class="download-file-title">{name:htmlEncode}</div><div class="download-file-status">État : {[Fbx.os.app.downloader.DownloadTaskModel.dlStatus[values.status]]}</div><tpl if="error">  <div class="download-file-error">{[Fbx.os.app.downloader.DownloadTaskModel.dlErrors[values.error]]}</div></tpl>'},{xtype:"percentcolumn",text:"Progression",width:120},{xtype:"templatecolumn",dataIndex:"rx",text:"Reçu",tpl:"{[Fbx.os.lib.FbxUtils.fileSize(values.rx)]} / {[Fbx.os.lib.FbxUtils.fileSize(values.size)]}",width:120},{xtype:"booleancolumn",text:"A Télécharger",trueText:"Oui",falseText:"Non",dataIndex:"todownload",flex:1},{xtype:"enumcolumn",dataIndex:"priority",text:"Priorité",strings:{no_dl:" - ",low:"Faible",normal:"Normale",high:"Haute"},flex:1}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Sélectionnez un téléchargement</div>'}}),this.callParent(arguments)},setSelectedPrio:function(prio){var me=this,records=me.getSelectedRecord();Ext.Array.each(records,function(rec){rec.set("priority",prio)}),me.getStore().sync()},getCtxMenu:function(){var me=this;return me.contextMenu||(me.contextMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-accept",itemId:"includeMenu",text:"Télécharger ce fichier",handler:function(){me.setSelectedPrio("normal")}},{iconCls:"btn-cancel",itemId:"excludeMenu",text:"Ne pas télécharger ce fichier",handler:function(){me.setSelectedPrio("no_dl")}},{itemId:"priorityMenu",text:"Changer la priorité",iconCls:"btn-time",menu:{items:[{itemId:"priority-high",text:"Haute",group:"priority",checked:!1,handler:function(){me.setSelectedPrio("high")}},{itemId:"priority-normal",text:"Normale",group:"priority",checked:!1,handler:function(){me.setSelectedPrio("normal")}},{itemId:"priority-low",text:"Faible",group:"priority",checked:!1,handler:function(){me.setSelectedPrio("low")}}]}},{iconCls:"btn-control-play-blue",itemId:"previewMenu",text:"Prévisualiser ce fichier",handler:function(){var records=me.getSelectedRecord();if(!records||0==records.length)return!1;window.open(records[0].get("preview_url"),"_blank")}}],listeners:{beforeshow:function(menu){var records=me.getSelectedRecord();if(!records)return!1;if(records.length>=1){var rec=records[0],priority=(rec.get("status"),rec.get("priority")),priorityMenu=menu.getComponent("priorityMenu"),excludeMenu=menu.getComponent("excludeMenu"),includeMenu=menu.getComponent("includeMenu"),previewMenu=menu.getComponent("previewMenu");if("no_dl"==priority)priorityMenu.hide(),excludeMenu.hide(),includeMenu.show(),previewMenu.hide();else{priorityMenu.show(),excludeMenu.show(),includeMenu.hide();var priorityItem=priorityMenu.menu.getComponent("priority-"+priority);priorityItem&&priorityItem.setChecked(!0),rec.get("preview_url")?previewMenu.show():previewMenu.hide()}}}}})),me.contextMenu}});Ext.define("Fbx.os.app.settings.ShareSamba",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel","Fbx.os.lib.FbxUtils","Ext.form.Label"],statics:{defaultName:"Partages de fichiers / Partages Windows",defaultWidth:450,defaultHeight:300,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#gerer-les-partages-windows"},launch:function(){var me=this;me.shareLbl=Ext.create("Ext.form.Label",{html:""}),me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"netshare/samba/",bodyPadding:10,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"textfield",fieldLabel:"Groupe de travail",name:"workgroup",vtype:"netbiosName",ttip:"Groupe de travail auquel votre Freebox appartiendra",boxLabel:""},{xtype:"checkboxfield",fieldLabel:"Activer le partage de fichiers",ttip:"Cette fonctionnalité vous permet de partager les fichiers de votre Freebox sur votre réseau local en utilisant le système de partage de Windows",boxLabel:"",name:"file_share_enabled"},{xtype:"checkboxfield",fieldLabel:"Activer le partage d'imprimantes",boxLabel:"",ttip:"Cette fonctionnalité vous permet de partager sur votre réseau une imprimante connectée en USB sur votre Freebox",name:"print_share_enabled"},{xtype:"checkboxfield",fieldLabel:"Accès authentifié",boxLabel:"",name:"logon_enabled",ttip:"Si vous activez cette option il vous sera demandé de vous authentifier pour accéder aux partages de votre Freebox",listeners:{change:function(field,newVal){var form=me.form.getForm(),logon_user=form.findField("logon_user");logon_user.reset(),logon_user.setDisabled(!newVal);var logon_password=form.findField("logon_password");logon_password.reset(),logon_password.setDisabled(!newVal),form.isValid()}}},{xtype:"textfield",disabled:!0,fieldLabel:"Utilisateur",name:"logon_user",ttip:"Nom d'utilisateur qui vous sera demandé pour accéder aux fichiers de votre Freebox",allowBlank:!1,validator:function(val){return Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>104?"Nom d'utilisateur trop long":!!/^[^\"\/\\[\]:;|=,+*?<>\n]+$/.test(val)||"Le nom d'utilisateur ne peut pas contenir les caractères ': ; \\ [ ] | = , + * ? < > \"' "}},{xtype:"textfield",disabled:!0,fieldLabel:"Mot de passe",inputType:"password",ttip:"Mot de passe qui vous sera demandé pour accéder aux fichiers de votre Freebox",name:"logon_password",boxLabel:"",validator:function(val){return Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>15?"Mot de passe trop long":!(val.indexOf("\n")>=0)||"Mot de passe incorrect"}},me.shareLbl]}),Fbx.os.gui.Environment.getNetworkConf(function(conf){me.shareLbl.setText("Vous pouvez accéder aux partages windows en tapant \\\\"+conf.name_netbios+" dans un explorateur Windows.")}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"})}});Ext.define("Fbx.os.app.settings.ports.PortInEditor",{extend:"Ext.window.Window",requires:["Ext.form.FieldSet","Ext.layout.component.FieldSet","Ext.form.field.ComboBox","Ext.form.field.Number","Fbx.os.lib.FbxUtils","Fbx.ux.form.field.HostSelector","Ext.form.Panel"],save:function(){var me=this,form=me.down("form").getForm();if(form.isValid()){var record=form.getRecord();form.updateRecord(record),record.save({success:function(){record.store.load(),me.hide()}})}},submitOnEnter:function(field,event){var me=this;event.getKey()==event.ENTER&&me.save()},initComponent:function(){var me=this;me.form=Ext.create("Ext.form.Panel",{trackResetOnLoad:!0,bodyPadding:10,layout:{align:"stretch",type:"vbox"},buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.hide()}},{iconCls:"btn-save",text:"Sauvegarder",formBind:!0,disabled:!0,handler:function(){me.save()}}],defaults:{anchor:"100%",labelWidth:250,listeners:{specialkey:function(field,ev){me.submitOnEnter(field,ev)}}},items:[{xtype:"checkbox",fieldLabel:"Autoriser les connexions entrantes",inputValue:!0,name:"enabled"},{xtype:"numberfield",fieldLabel:"Port entrant",name:"in_port",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:1}]}),Ext.apply(me,{layout:"fit",closeAction:"hide",modal:!0,title:"Connexions entrantes",width:500,items:[me.form]}),me.callParent(arguments)},setRecord:function(record){var me=this;if(!me.record||me.record!=record){var minPort=record.get("min_port"),maxPort=record.get("max_port"),form=me.form.getForm(),portField=form.findField("in_port");portField.setReadOnly(record.get("readonly")),portField.setMinValue(minPort),portField.setMaxValue(maxPort),portField.minText="Vous devez choisir un port supérieur à "+minPort,portField.maxText="Vous devez choisir un port inférieur à "+maxPort,me.record=record,me.form.getForm().loadRecord(record),me.setTitle(record.get("description"))}}});Ext.define("Fbx.os.app.settings.wifi.WifiMacFilter",{extend:"Ext.grid.Panel",requires:["Fbx.os.app.settings.WifiMacModel","Ext.grid.plugin.CellEditing","Ext.grid.column.Action","Ext.grid.column.Template","Fbx.os.lib.FbxUtils","Fbx.os.gui.grid.column.EnumColumn","Ext.data.ArrayStore","Fbx.os.app.lanbrowser.HostInfosWin","Fbx.os.app.lanbrowser.HostModel","Fbx.os.app.settings.WifiMacFilterEditor","Ext.data.Store"],addFilter:function(mac,type){var me=this,newRec=me.macFilterStore.findRecord("mac",mac,0,!1,!1,!1);if(newRec)newRec.set("type",type);else{newRec=me.macFilterStore.add({mac:mac,type:type})[0]}me.showEditor(newRec)},showEditor:function(rec){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.settings.WifiMacFilterEditor",{closeAction:"hide",listeners:{hide:function(){setTimeout(function(){me.macFilterStore.load()},300)}}})),me.editor.setRecord(rec),me.editor.show()},showHostDetailsWin:function(host){var detailWin=Ext.create("Fbx.os.app.lanbrowser.HostInfosWin");detailWin.loadById(host.id),detailWin.show()},initComponent:function(){var me=this;me.macFilterStore=Ext.getStore("macFilterStore"),me.macFilterStore||(me.macFilterStore=Ext.create("Ext.data.Store",{storeId:"macFilterStore",model:"Fbx.os.app.settings.WifiMacModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"mac",direction:"ASC"}],pageSize:0,autoLoad:!0})),Ext.applyIf(me,{store:me.macFilterStore,bodyPadding:0,hideHeaders:!0,padding:"10px 0",title:"Liste des filtres MAC",tbar:["->",{text:"Rafraîchir",iconCls:"btn-arrow-refresh",handler:function(){me.refresh()}},{text:"Vider la liste",iconCls:"btn-table-delete",handler:function(){Ext.MessageBox.confirm("Vider la liste ?","Êtes-vous sûr de vouloir vider la liste ?",function(btn){if("yes"==btn){var records=[];me.macFilterStore.each(function(r){records.push(r)}),me.macFilterStore.remove(records),me.macFilterStore.sync()}})}},{text:"Ajouter une règle de filtrage",iconCls:"btn-transmit-add",handler:function(){var recs=me.macFilterStore.add({});me.showEditor(recs[0])}}],columns:[{xtype:"templatecolumn",dataIndex:"hostname",tpl:'<div class="lan-host-img lan-host-{[values.host.reachable ? "on" : "off"]}  lan-{[values.host.host_type + "-" + (values.host.reachable ? "on" : "off")]}"></div>'},{xtype:"templatecolumn",dataIndex:"hostname",tpl:'<div><a href="#">{hostname:htmlEncode}</a></div><div style="margin-top: 10px;" class="dhcp-host-detail"><tpl if="comment != \'\'">{comment}<br /></tpl><tpl if="comment == \'\'">{mac}<br /></tpl></div>',flex:1},{xtype:"enumcolumn",dataIndex:"type",flex:1,strings:{whitelist:"Liste blanche",blacklist:"Liste noire"}},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-edit",tooltip:"Éditer",handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex));me.showEditor(rec)}}]},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);rec.phantom?me.destroy():Ext.MessageBox.confirm("Supprimer","Voulez-vous retirer cette adresse mac de la liste ?",function(btn){"yes"==btn&&rec.destroy()})}}]}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">La liste des adresses MAC est vide</div>'},listeners:{cellclick:function(grid,td,cellIndex,record,tr,rowIndex,e,eOpts){if("hostname"==grid.headerCt.getGridColumns()[cellIndex].dataIndex){e.stopEvent();var host=record.get("host");""!=host&&me.showHostDetailsWin(host)}},itemdblclick:function(grid,rec,item,index,e,eOpts){me.showEditor(rec)}}}),me.on("boxready",function(){me.macFilterStore.load()}),me.callParent(arguments)},isDirty:function(){return!1},refresh:function(){this.macFilterStore.load()}});Ext.define("Fbx.os.app.settings.wifi.WifiStatus",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.os.app.settings.wifi.WifiApModel","Fbx.ux.form.field.TemplatedDisplay","Fbx.os.app.settings.wifi.WifiApStations","Fbx.ux.form.field.EnumDisplay"],initComponent:function(){var me=this;me.wifiStations=Ext.create("Fbx.os.app.settings.wifi.WifiApStations",{title:"Stations Associées",disableBufferring:!0,autoScroll:!1,viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucune station associée</div>'}}),Ext.applyIf(me,{autoScroll:!0,items:[{xtype:"fieldset",title:"État Wi-Fi",layout:"hbox",items:[{xtype:"container",flex:1,bodyPadding:5,defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"enumdisplayfield",fieldLabel:"Etat de la carte Wi-Fi",name:"status.state",strings:Fbx.os.app.settings.wifi.WifiApModel.apStatusStr},{xtype:"enumdisplayfield",fieldLabel:"Bande Wifi",name:"config.band",strings:{"2d4g":"2.4 GHz","5g":"5 GHz","60g":"60 GHz"}},{xtype:"displayfield",fieldLabel:"Normes supportées",name:"capsStr"}]},{xtype:"container",flex:1,bodyPadding:5,defaults:{labelWidth:200,anchor:"100%"},items:[{xtype:"displayfield",fieldLabel:"Canal Wi-Fi Primaire",name:"status.primary_channel"},{xtype:"templateddisplayfield",fieldLabel:"Canal Wi-Fi Secondaire",name:"status.secondary_channel",tpl:'<tpl if="val">{val}</tpl><tpl if="!val">Désactivé</tpl>'},{xtype:"templateddisplayfield",fieldLabel:"Largeur de bande effective",name:"status.channel_width",tpl:'<div style="width: 200px;"><div style="float: left;">{val} MHz</div><tpl if="values[\'config.channel_width\'] != values.val">  <div class="btn-error" style="float: left; margin-left: 15px;"      data-qtip="La largeur de bande demandée n\'a pas pu être attribuée" > </div></tpl><div style="clear: both;"></div></div>',ttip:"En fonction de l'encombrement des canaux Wi-Fi environnants,  la largeur de bande effective peut être inférieure à celle configurée."}]}]},me.wifiStations]}),me.on("hide",function(){me.wifiStations.suspendRefresh=!0}),me.on("show",function(){me.wifiStations.suspendRefresh=!1}),me.callParent(arguments)},setRecord:function(rec){var me=this;me.updateRecord(rec),me.wifiStations.setRecord(rec)},updateRecord:function(rec){this.setValues(rec.raw)}});Ext.define("Fbx.os.app.settings.Switch",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.tab.Panel","Fbx.os.app.settings.SwitchPortModel","Fbx.os.app.settings.SwitchStatus","Fbx.ux.grid.RefreshGrid","Fbx.os.gui.grid.column.EnumColumn","Fbx.os.app.settings.SwitchGraph","Fbx.os.app.settings.SwitchConfig","Ext.data.Store","Ext.panel.Panel"],statics:{defaultName:"Réseau local / Switch",defaultWidth:800,defaultHeight:600,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#surveiller-l-activite-du-switch"},launch:function(){var me=this;me.store=Ext.create("Ext.data.Store",{storeId:"switchPorts",model:"Fbx.os.app.settings.SwitchPortModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"id",direction:"ASC"}],pageSize:0,autoLoad:!0}),me.grid=Ext.create("Fbx.ux.grid.RefreshGrid",{title:"",border:0,minHeight:120,region:"center",disableBufferring:!0,autoScroll:!1,store:me.store,selModel:{mode:"SINGLE"},refreshFreq:2e3,columns:[{dataIndex:"id",text:"#",width:45},{dataIndex:"name",text:"Port",width:70},{xtype:"enumcolumn",text:"Lien",dataIndex:"link",strings:{up:"Actif",down:"Inactif"}},{text:"Mode",dataIndex:"str"},{xtype:"templatecolumn",text:"Adresses MAC",flex:1,dataIndex:"mac_list",tpl:'<tpl for="mac_list">&bull; {mac} - {hostname}<br /></tpl>'}]}),me.tabPanel=Ext.create("Ext.tab.Panel",{flex:1,items:[{xtype:"switchgraph",title:"Courbe de débit",flex:1,bodyPadding:10},{itemId:"switchstatus",xtype:"switchstatus",title:"Statistiques",stateful:!0,stateId:"switch-status",flex:1},{xtype:"switchconfig",itemId:"switchconfig",title:"Configuration",bodyPadding:10,flex:1}]}),me.mon(me.grid,"itemclick",function(table,record,item){var portId=record.get("id");me.refreshTab(portId,record)}),me.mon(me.store,"load",function(){var portId=1,selModel=me.grid.getSelectionModel(),selection=selModel.getSelection();if(1!==selection.length)selModel.select(0);else{var rec=selection[0];portId=rec.get("id")}me.refreshTab(portId,rec)}),me.store.load(),me.panel=Ext.create("Ext.panel.Panel",{layout:{align:"stretch",type:"vbox"},items:[me.grid,me.tabPanel]}),this.mainWindow.add(me.panel)},refreshTab:function(portId,rec){var me=this;portId||(portId=1);var activeTab=me.tabPanel.getActiveTab();activeTab&&activeTab.refresh&&activeTab.refresh(portId,rec)}});Ext.define("Fbx.os.app.settings.wifi.WifiCardPanel",{extend:"Ext.tab.Panel",requires:["Fbx.os.app.settings.wifi.WifiStatus","Fbx.os.app.settings.wifi.WifiApConfig","Fbx.os.app.settings.wifi.WifiBssConfig","Fbx.os.app.settings.WifiRadar"],initComponent:function(){var me=this;me.bssStore=Ext.getStore("wifiBssStore"),me.wifiStatus=Ext.create("Fbx.os.app.settings.wifi.WifiStatus",{title:"État de la carte Wi-Fi",bodyPadding:10,layout:{align:"stretch",type:"vbox"}}),me.wifiRadar=Ext.create("Fbx.os.app.settings.WifiRadar",{title:"Radar"}),me.wifiConfig=Ext.create("Fbx.os.app.settings.wifi.WifiApConfig",{title:"Configuration Radio",bodyPadding:10}),me.wifiBssConfig=Ext.create("Fbx.os.app.settings.wifi.WifiBssConfig",{title:"Configuration Réseau",bodyPadding:10}),Ext.applyIf(me,{items:[me.wifiStatus,me.wifiConfig,me.wifiBssConfig,me.wifiRadar,{itemId:"freewifi",title:"FreeWifi",html:'La configuration du service FreeWifi est disponible à l\'adresse <a target="_blank" href="https://wifi.free.fr/">https://wifi.free.fr/</a>',bodyPadding:15}],listeners:{beforetabchange:function(tabPanel,newCard,oldCard,eOpts){if(me.isDirty())return me.performWhenSaved(function(){me.setActiveTab(newCard)}),!1;oldCard.suspendRefresh=!0,me.setRecord(me.record,newCard),newCard.suspendRefresh=!1}}}),me.callParent(arguments)},updateRecord:function(rec){var me=this,activeTab=me.getActiveTab();activeTab.updateRecord&&activeTab.updateRecord(rec),me.record=rec},getMainBss:function(){var me=this,mainBss=null;return me.bssStore.each(function(r){if(r.get("phy_id")==me.record.getId())return mainBss=r,!1}),mainBss},setRecord:function(rec,activeTab){var me=this;activeTab||(activeTab=me.getActiveTab()),me.record=rec;var mainBss=me.getMainBss();mainBss||console.warn("unable to find main bss"),activeTab.setRecord&&activeTab.setRecord(rec,mainBss)},performWhenSaved:function(callback){var me=this;me.isDirty()?Ext.MessageBox.confirm("Modifications non sauvegardées","Voulez-vous enregistrer les modifications ?",function(btn){if("yes"==btn){if(!me.isValid())return;me.save()}else me.reset();callback()}):callback()},isValid:function(){var me=this,activeTab=me.getActiveTab();return!activeTab.isValid||activeTab.isValid()},isDirty:function(){var me=this,activeTab=me.getActiveTab();return!!activeTab.isDirty&&activeTab.isDirty()},save:function(){var me=this,activeTab=me.getActiveTab();return activeTab.save?(activeTab.save(),!1):(console.warn("no save function"),me.reset(),!0)},reset:function(){var me=this,activeTab=me.getActiveTab();return activeTab.reset?activeTab.reset():(console.warn("no reset function"),me.setRecord(me.record)),!0}});Ext.define("Fbx.os.app.settings.Ftp",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel","Ext.form.Label","Ext.container.Container"],statics:{defaultName:"Partages de fichiers / FTP",defaultWidth:450,defaultHeight:460,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#gerer-le-ftp"},launch:function(){var me=this;me.weakIndicator=Ext.create("Ext.container.Container",{hidden:!0,html:'<div style="color: #ff4e00;">Votre mot de passe est trop simple !<br />L\'accès à distance ne pourra être activé tant que vous ne changerez pas de mot de passe</div>'}),me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"ftp/config/",bodyPadding:10,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"fieldset",title:"Paramètres",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkboxfield",fieldLabel:"Activer le serveur FTP",name:"enabled",ttip:"Le serveur FTP vous permet de transférer des fichiers sur votre Freebox",value:!1,boxLabel:"",listeners:{change:function(field,newVal){var form=me.form.getForm();form.findField("password").setDisabled(!newVal);var anonymous=form.findField("allow_anonymous");anonymous.setDisabled(!newVal),form.findField("allow_anonymous_write").setDisabled(!newVal||!anonymous.getValue())}}},{xtype:"displayfield",fieldLabel:"Nom d'utilisateur",value:"freebox",ttip:"Dans le cas où l'accès anonyme n'est pas activé, il est obligatoire d'utiliser le nom d'utilisateur freebox"},{xtype:"textfield",disabled:!0,fieldLabel:"Mot de passe FTP",inputType:"password",name:"password",boxLabel:"",ttip:"Mot de passe nécessaire à l'authentification FTP",listeners:{change:function(field,newVal){me.checkPasswordQuality()}}},me.weakIndicator,{xtype:"checkboxfield",fieldLabel:"Autoriser l'accès anonyme",name:"allow_anonymous",value:!1,disabled:!0,boxLabel:"",ttip:"Permet l'accès sans authentification à votre serveur FTP",listeners:{change:function(field,newVal){me.form.getForm().findField("allow_anonymous_write").setDisabled(!newVal)}}},{xtype:"checkboxfield",disabled:!0,fieldLabel:"Autoriser les écritures anonymes",name:"allow_anonymous_write",ttip:"Permet aux utilisateurs non authentifiés de modifier les fichiers stockés sur votre Freebox",boxLabel:""},{xtype:"label",padding:"0 0 0 5",html:'<div>Votre serveur FTP est accessible depuis votre réseau local sur <a href="ftp://mafreebox.freebox.fr/" target="_blank">ftp://mafreebox.freebox.fr/</a>.</div>'}]},{xtype:"fieldset",title:"Accès distant",itemId:"remote_access",disabled:!0,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkboxfield",fieldLabel:"Activer l'accès à distance",name:"allow_remote_access",ttip:"Permet d'accéder à votre serveur FTP à distance",boxLabel:"",listeners:{change:function(){me.updateFtpUrl()}}},{xtype:"numberfield",fieldLabel:"Port FTP de contrôle",name:"port_ctrl",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:0,ttip:"Port à utiliser pour les connexions ftp entrantes",listeners:{change:function(f,newVal){me.updateFtpUrl()}}},{xtype:"numberfield",fieldLabel:"Port FTP de données (PASV)",name:"port_data",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:0,ttip:"Port à utiliser pour le transfert de données en mode passif"},{xtype:"label",itemId:"remote_addr_display",padding:"0 0 0 5",html:""}]}]}),me.form.on("loaded",function(f,values){me.refrectQuality(values.weak_password),me.originalRemoteVal=values.allow_remote_access,me.remote_domain=values.remote_domain;var form=me.form.getForm(),port_ctrl=form.findField("port_ctrl"),port_data=form.findField("port_data"),minPort=0,maxPort=65535;void 0!==values.min_port&&void 0!==values.max_port&&(minPort=values.min_port,maxPort=values.max_port);var minTxt="Vous devez choisir un port supérieur à "+minPort,maxTxt="Vous devez choisir un port inférieur à "+maxPort;port_ctrl.setMinValue(minPort),port_ctrl.setMaxValue(maxPort),port_data.setMinValue(minPort),port_data.setMaxValue(maxPort),port_ctrl.minText=minTxt,port_ctrl.maxText=maxTxt,port_data.minText=minTxt,port_data.maxText=maxTxt,form.isValid(),me.updateFtpUrl()}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"}),me.mainWindow.getHeight()<Fbx.os.app.settings.Ftp.defaultHeight&&me.mainWindow.setHeight(Fbx.os.app.settings.Ftp.defaultHeight)},updateFtpUrl:function(){var me=this,form=me.form.getForm(),port=form.findField("port_ctrl").getValue(),enabled=form.findField("allow_remote_access").getValue(),remoteGroup=me.form.getComponent("remote_access"),displayField=remoteGroup.getComponent("remote_addr_display");if(enabled){var url="ftpes://freebox@"+me.remote_domain;21!=port&&(url+=":"+port),url+="/";var html='<div>Votre serveur FTP sera accessible à distance sur <a href="'+url+'" target="_blank">'+url+"</div>";displayField.update(html),displayField.show()}else displayField.hide()},refrectQuality:function(weak){var me=this,form=me.form.getForm(),remoteGroup=me.form.getComponent("remote_access"),remoteCheckbox=form.findField("allow_remote_access");weak?(me.weakIndicator.show(),remoteGroup.setDisabled(!0),remoteCheckbox.setValue(!1)):(me.weakIndicator.hide(),remoteGroup.setDisabled(!1),remoteCheckbox.setValue(me.originalRemoteVal))},checkPasswordQuality:function(){var me=this;me.qualityReq&&me.qualityReq.xhr&&me.qualityReq.xhr.abort();var form=me.form.getForm(),passwordField=form.findField("password");me.qualityReq=Ext.Ajax.request({method:"POST",url:FbxConf.apiBaseUrl+"login/quality/",params:{password:passwordField.getValue()},success:function(res){me.refrectQuality(!1)},failure:function(res){me.refrectQuality(!0)},callback:function(){me.qualityReq=null}})}});Ext.define("Fbx.os.app.settings.VpnClient",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.tab.Panel","Fbx.os.lib.FbxUtils","Fbx.ux.state.AjaxProvider","Ext.menu.Menu","Fbx.os.app.settings.VpnClientStatus","Fbx.os.app.settings.VpnClientConfig","Fbx.os.app.settings.VpnClientApps","Fbx.os.app.settings.VpnClientGraph","Fbx.os.app.settings.VpnClientLog"],statics:{defaultName:"Client VPN",defaultWidth:800,defaultHeight:400,allowMultipleInstance:!1,disabledInBridge:!0,docSection:"doc/index.html#client-vpn"},launch:function(){var me=this;me.configCards={},me.statusTab=Ext.create("Fbx.os.app.settings.VpnClientStatus",{title:"État de la connexion VPN"}),me.configTab=Ext.create("Fbx.os.app.settings.VpnClientConfig",{title:"Configuration VPN"}),me.appTab=Ext.create("Fbx.os.app.settings.VpnClientApps",{title:"Applications"}),me.graphTab=Ext.create("Fbx.os.app.settings.VpnClientGraph",{title:"Courbes de débit"}),me.logTab=Ext.create("Fbx.os.app.settings.VpnClientLog",{title:"Journal de connexion"}),me.win=Ext.create("Ext.tab.Panel",{layout:{align:"stretch",type:"vbox"},defaults:{bodyPadding:5},buttons:[{xtype:"button",iconCls:"btn-accept",text:"OK",handler:function(){me.close()}}],items:[me.statusTab,me.configTab,me.appTab,me.graphTab,me.logTab]}),this.mainWindow.add(this.win),this.callParent()}});Ext.define("Fbx.ux.tree.FsTree",{extend:"Ext.tree.Panel",requires:["Ext.tree.Panel","Fbx.os.app.explorer.ExplorerModel","Fbx.ux.grid.plugin.TreeMsEditing","Fbx.ux.tree.plugin.FsTreeViewDragDrop","Fbx.os.lib.FbxUtils","Ext.data.TreeStore"],mixins:{fsctxmenu:"Fbx.os.app.explorer.FsGridContextMenuMixin",fsgridkey:"Fbx.os.app.explorer.FsGridKeysMixin",dropupload:"Fbx.os.app.explorer.FsDropUploadMixin"},curPath:"",nameColumnIndex:0,ctxMenu:null,loadParent:function(){var me=this,parent=Fbx.os.lib.FbxUtils.base64_decode(me.curPath).replace(/\/[^\/]+$/,"");""!=(parent=Fbx.os.lib.FbxUtils.base64_encode(parent))&&me.curPath!=parent&&(me.setPath(parent,!0),me.fireEvent("pathchanged",me.curPath))},forceRefresh:function(){var me=this;me.setPath(me.curPath,!0)},setPath:function(path,force){var me=this;(path!=me.curPath||force)&&(me.curPath=path,force?me.folderStore.isLoading()||me.folderStore.load():me.loadCurPath())},loadCurPath:function(node){var prev,me=this,parts=Fbx.os.lib.FbxUtils.base64_decode(me.curPath).split("/"),curNode="";if(!me.folderStore.isLoading()&&me.folderStore.loaded)for(var i in parts){var dir=parts[i];if(""!=dir){prev=curNode,curNode+="/"+dir;var cNode=me.folderStore.getNodeById(Fbx.os.lib.FbxUtils.base64_encode(curNode));if(me.getSelectionModel().select(cNode),!cNode)return Ext.log({level:"warn",msg:"unable to find "+Fbx.os.lib.FbxUtils.base64_encode(curNode)+" setting path to "+prev}),void me.setPath(Fbx.os.lib.FbxUtils.base64_encode(prev),!0);if(cNode&&!cNode.isExpanded()&&cNode!=node)return void cNode.expand()}}},constructor:function(options){this.callParent(arguments),this.mixins.fsctxmenu.constructor.call(this,!0),this.mixins.fsgridkey.constructor.call(this),this.mixins.dropupload.constructor.call(this,!0)},initComponent:function(){var me=this;me.folderStore=Ext.create("Ext.data.TreeStore",{model:"Fbx.os.app.explorer.ExplorerModel",defaultRootId:"",defaultRootText:"MA FREEBOX",filters:[{property:"onlyFolder",value:1}],listeners:{load:function(tree,node,records,successfull){if(!successfull)return void me.loadParent();var rNode=me.getRootNode();rNode.set({name:"Ma Freebox"}),rNode.clearDirty(),me.folderStore.loaded=!0,me.loadCurPath(node)}}}),me.folderStore.loaded=!1,me.editPlugin=Ext.create("Fbx.ux.grid.plugin.TreeMsEditing",{listeners:{beforeedit:function(editor,e,eOpts){var rec=e.record;return!!rec.parentNode&&(!rec.parentNode.isRoot()&&void(me.isEditing=!0))},afteredit:function(){me.isEditing=!1}}}),Ext.apply(me,{animate:!1,collapsed:!1,autoScroll:!0,hideHeaders:!0,store:me.folderStore,displayField:"name",columns:[{xtype:"treecolumn",text:"",dataIndex:"name",flex:1,editor:{xtype:"textfield",allowBlank:!1}}],plugins:[me.editPlugin],viewConfig:{simpleSelect:!0,trackOver:!1,rootVisible:!0,plugins:{ptype:"fstreeviewdragdrop",appendOnly:!0,ddGroup:"fileDDGroup",dragText:"{0} dossier{1} sélectionné{1}"}}}),this.callParent(arguments),me.on("itemclick",function(view,rec,item,index,e,eOpts){me.setPath(rec.getId()),me.fireEvent("pathchanged",me.curPath),rec.isExpanded()||rec.expand(),e.stopEvent()}),me.on("beforeitemdblclick",function(view,rec,item,index,e,eOpts){return!rec.isLoading()&&(rec.isExpanded()&&rec.collapse(),!1)}),me.folderStore.load(),this.mon(Fbx.os.gui.Environment,"filemoved",function(changes){var needRefresh=!1;Ext.Array.each(changes,function(c){var p=Fbx.os.lib.FbxUtils.base64_decode(me.curPath),f=Fbx.os.lib.FbxUtils.base64_decode(c.from),t=Fbx.os.lib.FbxUtils.base64_decode(c.to);if(0==(p+"/").indexOf(f+"/")){var updatedPath=p.replace(f,t),prevFolder=me.folderStore.getNodeById(me.curPath);prevFolder&&(me.path=Fbx.os.lib.FbxUtils.base64_encode(updatedPath),needRefresh=!0)}var prevFolder=me.folderStore.getNodeById(c.from);prevFolder&&(needRefresh=!0),prevFolder=me.folderStore.getNodeById(c.to),prevFolder?needRefresh=!0:(prevFolder=me.folderStore.getNodeById(Fbx.os.lib.FbxUtils.dirname_b64(c.to)))&&(needRefresh=!0)}),needRefresh?me.forceRefresh():me.loadCurPath()}),this.mon(Fbx.os.gui.Environment,"filecopied",function(changes){var needRefresh=!1;Ext.Array.each(changes,function(c){var prevFolder=me.folderStore.getNodeById(c.to);prevFolder?needRefresh=!0:(prevFolder=me.folderStore.getNodeById(Fbx.os.lib.FbxUtils.dirname_b64(c.to)))&&(needRefresh=!0)}),needRefresh?me.forceRefresh():me.loadCurPath()}),this.mon(Fbx.os.gui.Environment,"filedeleted",function(changes){var needRefresh=!1;Ext.Array.each(changes,function(c){me.folderStore.getNodeById(c.from)&&(needRefresh=!0)}),needRefresh?me.forceRefresh():me.loadCurPath()}),me.addEvents("pathchanged")}});Ext.define("Fbx.os.app.settings.domains.DomainWizard",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.button.Button","Ext.panel.Panel","Ext.data.ArrayStore","Fbx.os.lib.FbxUtils","Ext.form.field.ComboBox","Ext.data.Store"],statics:{defaultName:"Configurer un nom de domaine",defaultWidth:400,defaultHeight:275,allowMultipleInstance:!1,modal:!0,beforeLaunch:function(cb){Fbx.os.app.settings.domains.DomainModel.getDomainsConf(function(cfg){cb()},function(){Ext.Msg.alert("Service non disponible","Ce service n'est pas disponible pour le moment")})}},winConfig:{resizable:!1,maximizable:!1,minimizable:!1},setCard:function(idx){var me=this,layout=me.panel.getLayout(),items=layout.getLayoutItems();layout.setActiveItem(items[idx]),layout.activeItem.prevIdx(!1)>=0?(me.btnPrev.setIconCls("btn-previous"),me.btnPrev.setText("Retour")):(me.btnNext.setIconCls("btn-cancel"),me.btnNext.setText("Annuler")),0==layout.activeItem.nextIdx(!1)?(me.btnNext.setIconCls("btn-accept"),me.btnNext.setText("Terminer")):(me.btnNext.setIconCls("btn-next"),me.btnNext.setText("Suivant"))},navigate:function(direction,force){var me=this,layout=me.panel.getLayout();if("next"==direction){var nextIdx=layout.activeItem.nextIdx(!0);if(nextIdx<0)return;if(0==nextIdx)return void me.close();me.setCard(nextIdx)}else{if(!layout.getPrev())return void me.close();var prevIdx=layout.activeItem.prevIdx(!0);if(prevIdx<0)return;me.setCard(prevIdx)}},launch:function(){var me=this;me.btnPrev=Ext.create("Ext.button.Button",{text:"Annuler",iconCls:"btn-cancel",handler:function(){me.navigate("prev")}}),me.btnNext=Ext.create("Ext.button.Button",{text:"Suivant",iconCls:"btn-next",handler:function(){me.navigate("next")}}),me.rootDomainsStore=Ext.create("Ext.data.ArrayStore",{fields:["domain"],data:[]}),me.domainsCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Domaine",name:"domain",labelWidth:175,store:me.rootDomainsStore,editable:!1,forceSelection:!0,displayField:"domain",valueField:"domain",queryMode:"local",lastQuery:"",listeners:{change:function(){me.updateDomainVal()}}}),Fbx.os.app.settings.domains.DomainModel.getDomainsConf(function(cfg){var data=[];for(var i in cfg.root_domains)data.push([cfg.root_domains[i]]);me.rootDomainsStore.loadData(data,!1),me.domainsCombo.setValue(cfg.root_domains[0])}),me.panel=Ext.create("Ext.panel.Panel",{title:"Étape 1/4 : Choix d'un nom de domaine",layout:"card",bodyPadding:10,items:[{xtype:"form",itemId:"dwiz-step1",border:0,padding:0,defaults:{anchor:"100%",labelWidth:100},items:[{xtype:"displayfield",value:"<div>Cet assistant va vous permettre de configurer un nom de domaine pour accéder à Freebox OS</div><br /><div>Si vous ne possédez pas de nom de domaine, vous avez la possibilité d'en choisir un gratuitement.</div>"},{xtype:"radiofield",flex:1,name:"owner",inputValue:"freebox",boxLabel:"Je veux choisir un nom de domaine Freebox personnalisé",checked:!0},{xtype:"radiofield",flex:1,name:"owner",inputValue:"user",boxLabel:"Je veux ajouter un nom de domaine que j'ai déja configuré"}],listeners:{show:function(){me.btnNext.setDisabled(!1),me.panel.setTitle("Étape 1/4 : Choix du type de nom de domaine")}},prevIdx:function(){return-1},nextIdx:function(){var form=me.panel.getComponent("dwiz-step1").getForm();return form.isValid()?"freebox"==form.getValues().owner?1:5:-1}},{xtype:"form",itemId:"dwiz-step2",border:0,padding:0,defaults:{anchor:"100%",labelWidth:175},items:[{xtype:"container",html:"Vous allez maintenant pouvoir choisir un nom de domaine personnalisé"},{xtype:"textfield",fieldLabel:"Sous domaine",name:"prefix",allowBlank:!1,minLength:3,maxLength:31,maskRe:/[a-z0-9-]/,listeners:{change:function(){me.updateDomainVal()},specialkey:function(field,e){e.getKey()==e.ENTER&&me.navigate("next")}}},me.domainsCombo,{xtype:"displayfield",fieldLabel:"Votre nom de domaine",name:"full_domain"},{xtype:"container",itemId:"step2-loading",html:'<div style="text-align: center;"><img src="resources/images/fbx/loading.gif" style="width: 32px; height: 32px;" alt=""/></div>',hidden:!0},{xtype:"container",itemId:"step2-suggestions",html:"",hidden:!0}],prevIdx:function(){return 0},nextIdx:function(process){if(!process)return-1;var step=me.panel.getComponent("dwiz-step2"),form=step.getForm();if(!form.isValid())return-1;var values=form.getValues(),domain=values.prefix+"."+values.domain;if(step.getComponent("step2-loading").setVisible(!0),!me.validating){me.validating=!0;var suggestField=step.getComponent("step2-suggestions");return suggestField.setVisible(!1),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/availability/"+domain,method:"GET",success:function(response){var res=response.jsonData.result;if(!res.available){form.findField("prefix").markInvalid("Ce nom de domaine n'est pas disponible");var html='<span style="color: red;">Ce nom de domaine est déjà réservé, les noms de domaines suivants sont disponibles:</span><br />';for(var i in res.suggestions)html+=res.suggestions[i]+", ";return html=html.slice(0,-2),step.getComponent("step2-loading").setVisible(!1),me.validating=!1,suggestField.update(html),void suggestField.setVisible(!0)}me.reserveDomain(values.prefix,values.domain)},failure:function(){step.getComponent("step2-loading").setVisible(!1),me.validating=!1}}),-1}},listeners:{show:function(){var form=me.panel.getComponent("dwiz-step2").getForm();me.panel.setTitle("Étape 2/4 - Choix d'un nom de domaine"),me.btnNext.setDisabled(!form.isValid())},validitychange:function(form,isValid){"dwiz-step2"==me.panel.getLayout().activeItem.itemId&&me.btnNext.setDisabled(!isValid)}}},{xtype:"form",itemId:"dwiz-step3",border:0,padding:0,defaults:{anchor:"100%",labelWidth:175},items:[{xtype:"container",html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>Le nom de domaine <span id="dwiz-domainName"></span> vous a bien été attribué  et sera utilisable d\'ici 24 heures maximum</div><br /><div>Vous avez maintenant la possibilité d\'obtenir gratuitement un certificat TLS qui vous permettra d\'accéder à distance de manière sécurisée à votre Freebox</div>'},{xtype:"radiofield",flex:1,name:"wantcert",inputValue:!0,boxLabel:"Je veux obtenir un certificat Let's Encrypt",checked:!0},{xtype:"radiofield",flex:1,name:"wantcert",inputValue:!1,boxLabel:"Non merci"}],prevIdx:function(){return-1},nextIdx:function(process){if(!process)return-1;var step=me.panel.getComponent("dwiz-step3"),form=step.getForm();return form.isValid()?form.getValues().wantcert?(me.requestCert(),-1):4:-1},listeners:{show:function(){me.panel.setTitle("Étape 3/4 - Configuration TLS"),me.btnPrev.setDisabled(!0)}}},{xtype:"container",itemId:"dwiz-step4",border:0,padding:0,html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>Votre demande de certificat TLS est en cours de traitement et le certificat devrait  être disponible d\'ici quelques heures maximum</div><br />',prevIdx:function(){return-1},nextIdx:function(){return 0},listeners:{show:function(){me.panel.setTitle("Étape 4/4 - Terminé")}}},{xtype:"container",itemId:"dwiz-step5",border:0,padding:0,html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>Si vous souhaitez par la suite demander un certificat TLS pour sécuriser l\'accès à distance à votre Freebox, vous pourrez le faire dans les réglages avancés, rubrique Nom de domaine</div><br />',prevIdx:function(){return 2},nextIdx:function(){return 0},listeners:{show:function(){me.panel.setTitle("Étape 4/4 - Terminé")}}},{xtype:"form",itemId:"dwiz-step6",border:0,padding:0,defaults:{anchor:"100%",labelWidth:175},items:[{xtype:"container",padding:"0 0 5 0",html:"<div>Vous allez maintenant pouvoir configurer votre nom de domaine</div>"},{xtype:"textfield",fieldLabel:"Nom de domaine",name:"domain_name",allowBlank:!1,vtype:"domainName",listeners:{specialkey:function(field,e){e.getKey()==e.ENTER&&me.navigate("next")}}},{xtype:"container",padding:"5 0",html:"<div>Assurez vous que votre nom de domaine pointe bien vers</div>"},{xtype:"displayfield",fieldLabel:"CNAME",name:"cname"},{xtype:"container",html:"ou"},{xtype:"displayfield",fieldLabel:"A",name:"record-a"},{xtype:"displayfield",fieldLabel:"AAAA",name:"record-aaaa"}],prevIdx:function(){return 0},nextIdx:function(process){if(!process)return-1;var step=me.panel.getComponent("dwiz-step6"),form=step.getForm();if(!form.isValid())return-1;var values=form.getValues();return Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/owned/",method:"POST",jsonData:{id:values.domain_name},success:function(){me.domainName=values.domain_name,me.setCard(6),Ext.get("dwiz-domainName2").update(me.domainName)}}),-1},listeners:{show:function(){var step=me.panel.getComponent("dwiz-step6"),form=step.getForm();me.panel.setTitle("Étape 2/4 - Ajout de votre nom de domaine"),Fbx.os.app.settings.domains.DomainModel.getDomainsConf(function(cfg){form.findField("cname").setValue(cfg.api_domain)}),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"connection/full/",method:"GET",success:function(response){var res=response.jsonData.result;form.findField("record-a").setValue(res.ipv4),form.findField("record-aaaa").setValue(res.ipv6)}})},validitychange:function(form,isValid){"dwiz-step6"==me.panel.getLayout().activeItem.itemId&&me.btnNext.setDisabled(!isValid)}}},{xtype:"form",itemId:"dwiz-step7",border:0,padding:0,defaults:{anchor:"100%",labelWidth:175},items:[{xtype:"container",html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>Le nom de domaine <span id="dwiz-domainName2"></span> a bien été ajouté</div><br /><div>Voulez-vous maintenant importer un certificat TLS pour ce domaine ?</div>'},{xtype:"radiofield",flex:1,name:"importcert",inputValue:!0,boxLabel:"Oui je souhaite importer un certificat TLS",checked:!0},{xtype:"radiofield",flex:1,name:"importcert",inputValue:!1,boxLabel:"Non merci"}],prevIdx:function(){return-1},nextIdx:function(process){if(!process)return-1;var step=me.panel.getComponent("dwiz-step7"),form=step.getForm();return form.isValid()?form.getValues().importcert?8:7:-1},listeners:{show:function(){me.panel.setTitle("Étape 3/4 - Configuration TLS"),me.btnPrev.setDisabled(!0)}}},{xtype:"container",itemId:"dwiz-step8",border:0,padding:0,html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>Si vous souhaitez par la suite importer un certificat TLS pour sécuriser l\'accès à distance à votre Freebox, vous pourrez le faire dans les réglages avancés, rubrique Nom de domaine</div><br />',prevIdx:function(){return 6},nextIdx:function(){return 0},listeners:{show:function(){me.panel.setTitle("Étape 4/4 - Terminé")}}},{xtype:"form",itemId:"dwiz-step9",border:0,padding:0,defaults:{anchor:"100%",labelWidth:100},items:[{xtype:"container",html:'<div>Vous allez maintenant importer un certificat pour le nom de domaine <span id="dwiz-domainName3"></span></div><br />'},{xtype:"combobox",fieldLabel:"Type de clé",name:"key_type",labelWidth:175,store:Ext.create("Ext.data.Store",{fields:["val","disp"],data:[{val:"rsa",disp:"RSA"},{val:"ec",disp:"ECDSA"}]}),editable:!1,forceSelection:!0,displayField:"disp",valueField:"val",queryMode:"local",value:"rsa",lastQuery:""},{xtype:"textareafield",name:"cert_pem",fieldLabel:"Certificat",allowBlank:!1,ttip:"Vous devez copier ici le contenu de votre certificat au format PEM"},{xtype:"textareafield",name:"key_pem",fieldLabel:"Clé privée",allowBlank:!1,ttip:"Vous devez copier ici le contenu de votre clé privée au format PEM"},{xtype:"textareafield",name:"intermediates",fieldLabel:"Certificat intermédiaire",allowBlank:!0,ttip:"Vous pouvez copier ici le contenu du certificat intermédiaire format PEM"}],prevIdx:function(){return 6},nextIdx:function(process){if(!process)return-1;var step=me.panel.getComponent("dwiz-step9"),form=step.getForm();if(!form.isValid())return-1;var values=form.getValues();return Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/owned/"+me.domainName+"/import_cert",method:"POST",jsonData:values,success:function(response){me.setCard(9)}}),-1},listeners:{show:function(){me.panel.setTitle("Étape 3/4 - Import certificat TLS"),me.mainWindow.setHeight(400),Ext.get("dwiz-domainName3").update(me.domainName)},validitychange:function(form,isValid){"dwiz-step9"==me.panel.getLayout().activeItem.itemId&&me.btnNext.setDisabled(!isValid)}}},{xtype:"container",itemId:"dwiz-step10",border:0,padding:0,html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div>Félicitations, votre certificat a bien été importé</div>',prevIdx:function(){return-1},nextIdx:function(){return 0},listeners:{show:function(){me.panel.setTitle("Étape 4/4 - Terminé")}}}],buttons:[me.btnPrev,me.btnNext]}),me.mainWindow.add(me.panel),me.callParent(arguments),me.mainWindow.on("close",function(){var instance=Fbx.os.core.TaskManager.getAppInstances("Fbx.os.app.settings.domains.Domains");instance&&instance.length?instance[0].reload():Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.domains.Domains")})},updateDomainVal:function(){var me=this;if(me.panel){var step=me.panel.getComponent("dwiz-step2"),form=step.getForm(),fullField=form.findField("full_domain"),values=form.getValues();fullField.setValue(values.prefix+"."+values.domain)}},reserveDomain:function(prefix,domain){var me=this,step=me.panel.getComponent("dwiz-step2");Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/reserve/",method:"POST",jsonData:{prefix:prefix,domain:domain},success:function(response){me.domainName=prefix+"."+domain,me.setCard(2),Ext.get("dwiz-domainName").update(me.domainName)},callback:function(){step.getComponent("step2-loading").setVisible(!1),me.validating=!1}})},requestCert:function(){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/owned/"+me.domainName+"/request_cert",method:"POST",jsonData:{key_type:"rsa"},success:function(response){me.setCard(3)}})}});Ext.define("Fbx.os.app.pvr.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.tab.Panel","Fbx.os.app.pvr.PrecordModel","Fbx.os.app.pvr.FrecordModel","Fbx.os.lib.FbxUtils","Ext.grid.feature.Grouping","Fbx.ux.grid.RefreshGrid","Fbx.os.app.pvr.PrecordEditor","Fbx.ux.grid.CtxMenuGrid","Ext.data.Store","Ext.menu.Menu","Fbx.ux.form.AjaxFormPanel"],statics:{defaultName:"Gestion des enregistrements",defaultWidth:800,defaultHeight:600,allowMultipleInstance:!1,docSection:"doc/index.html#application-gestion-des-enregistrements",__pvrCfg:null,getPvrCfg:function(cb){if(this.__pvrCfg)return void cb(this.__pvrCfg);var url=FbxConf.apiBaseUrl+"pvr/config",me=this;me.store;Ext.Ajax.request({url:url,method:"GET",success:function(response){me.__pvrCfg=response.jsonData.result,cb(me.__pvrCfg)}})}},launch:function(){var me=this;me.precordStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.pvr.PrecordModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"start",direction:"ASC"}],pageSize:0,autoLoad:!1,groupDir:"ASC",groupers:[{property:"day",sorterFn:function(a,b){return a.get("start")-b.get("start")}}],listeners:{load:function(){me.precordGrid&&me.precordGrid.setLoading(!1)}}}),me.frecordStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.pvr.FrecordModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"start",direction:"DESC"}],pageSize:0,autoLoad:!1,groupDir:"DESC",groupers:[{property:"day",sorterFn:function(a,b){return b.get("start")-a.get("start")}}],listeners:{load:function(){me.frecordGrid&&me.frecordGrid.setLoading(!1)}}}),me.channelDb=Fbx.os.app.tv.ChannelDb.getInstance(),me.channelDb.on("load",function(){me.precordStore.load(),me.frecordStore.load()}),me.channelDb.load(),me.__ackRefreshTimer=null,me.precordGrid=Ext.create("Fbx.ux.grid.RefreshGrid",{refreshFreq:3e4,title:"Enregistrements programmés",hideHeaders:!0,store:me.precordStore,selModel:{mode:"MULTI"},viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun enregistrement programmé</div>'},features:[{ftype:"grouping",collapsible:!1,groupHeaderTpl:"{name:capitalize}"}],dockedItems:[{xtype:"toolbar",items:[{xtype:"button",iconCls:"btn-epg",text:"Guide des programmes",handler:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.epg.app")}},{iconCls:"btn-add",text:"Programmer un enregistrement",handler:function(){me.showEditor()}},{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.reloadPstore()}},{iconCls:"btn-bullet-white",text:"Archiver les enregistrements terminés",handler:function(){me.precordStore.each(function(r){switch(r.get("state")){case"failed":case"finished":case"start_error":case"running_error":r.ackRecord(function(){me.__ackRefreshTimer&&clearTimeout(me.__ackRefreshTimer),me.__ackRefreshTimer=setTimeout(function(){me.reloadPstore()},500)})}})}}]}],columns:[{xtype:"templatecolumn",dataIndex:"enabled",tpl:'<img class="tv-channel-logo <tpl if="!enabled">grayscale</tpl>" src="{logo_url}" alt="{channel_name}"/>',width:90},{xtype:"templatecolumn",dataIndex:"name",tpl:'<div class="pvr-infos"><div class="pvr-name"> <tpl if="has_record_gen"><div class="btn btn-record-gen" style="float: left; margin-right: 5px;"></div></tpl>  <tpl if="name != \'\'">{name:htmlEncode}</tpl>  <tpl if="name == \'\'">Sans titre</tpl> </div><div class="pvr-subname"> <tpl if="subname != \'\'">{subname:htmlEncode}</tpl> &nbsp;</div><div class="pvr-detail"> <tpl if="channel">{[values.channel.name]}</tpl> <tpl if="!channel">{channel_name:htmlEncode}</tpl> - de {[Fbx.os.lib.FbxUtils.displayTime(values.start)]}    à {[Fbx.os.lib.FbxUtils.displayTime(values.end)]} - Durée: {[Fbx.os.lib.FbxUtils.formatDuration(values.end - values.start)]} </div></div>',flex:3},{xtype:"templatecolumn",dataIndex:"state",flex:1,tpl:'<div class="pvr-state"><div class="{iconCls}"></div><tpl if="error != \'none\'">  <div class="tv-prog-error-msg">    {[Fbx.os.app.pvr.PrecordModel.errorStr[values.error]]}  </div></tpl><tpl if="error == \'none\' &amp;&amp; conflict">{[values.overlap_list.length]} conflit{[values.overlap_list.length > 1 ? \'s\' : \'\' ]}</tpl><tpl if="error == \'none\' &amp;&amp; !conflict">{[Fbx.os.app.pvr.PrecordModel.stateStr[values.state]]}</tpl><tpl if="state == \'running\'">  <div class="tv-prog-progress-bar">    <div class="tv-prog-progress-bar-back">      <div class="tv-prog-progress-bar-fill" style="width: {progress}%;"></div>    </div>  </div></tpl></div>'}],listeners:{itemdblclick:function(grid,record){if(record.get("has_record_gen"))return void me.editRecordGen(record.get("record_gen_id"));me.showEditor(record,!1)}},getCtxMenu:function(){return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-edit",itemId:"editItem",cls:"default-item",text:"Editer cet enregistrement",handler:function(){var records=me.precordGrid.getSelectedRecord(),rec=records[0];if(rec.get("has_record_gen"))return void me.editRecordGen(rec.get("record_gen_id"));me.showEditor(rec,!1)}},"-",{iconCls:"btn-cancel",itemId:"cancelItem",text:"Annuler cet enregistrement",handler:function(){var records=me.precordGrid.getSelectedRecord();Ext.MessageBox.confirm("Annuler un enregistrement","Voulez-vous annuler cet enregistrement ?",function(btn){"yes"==btn&&(Ext.Array.each(records,function(r){me.precordStore.remove(r)}),me.precordStore.sync())})}},{iconCls:"btn-delete",itemId:"delItem",text:"Effacer cet enregistrement",handler:function(){var records=me.precordGrid.getSelectedRecord();Ext.MessageBox.confirm("Effacer un enregistrement","Voulez-vous effacer cet enregistrement ?",function(btn){"yes"==btn&&(Ext.Array.each(records,function(r){me.precordStore.remove(r)}),me.precordStore.sync())})}},{iconCls:"btn-stop",itemId:"stopItem",text:"Stopper cet enregistrement",handler:function(){me.precordGrid.getSelectedRecord()[0].stopRecord(function(){me.reloadPstore()})}},{iconCls:"btn-disabled",itemId:"disableItem",text:"Désactiver cet enregistrement",handler:function(){var records=me.precordGrid.getSelectedRecord(),rec=records[0];rec.set("enabled",!1),rec.save()}},{iconCls:"btn-delete",itemId:"deleteGen",text:"Supprimer ce générateur",handler:function(){var records=me.precordGrid.getSelectedRecord(),rec=records[0],rec_gen_id=rec.get("record_gen_id");rec_gen_id&&Fbx.os.app.pvr.RecordGenModel.load(rec_gen_id,{success:function(recgen){Ext.Msg.confirm("Supprimer ce générateur","Êtes-vous sûr de vouloir supprimer ce générateur ?",function(btn){"yes"==btn&&recgen.destroy({callback:function(){me.reloadPstore()}})})},failure:function(){me.reloadPstore()}})}},{iconCls:"btn-access-allowed",itemId:"enableItem",text:"Activer cet enregistrement",handler:function(){var records=me.precordGrid.getSelectedRecord(),rec=records[0];rec.set("enabled",!0),rec.save()}},{iconCls:"btn-access-allowed",itemId:"ackItem",text:"Archiver cet enregistrement",handler:function(){var records=me.precordGrid.getSelectedRecord();Ext.Array.each(records,function(r){r.isDone()&&r.ackRecord(function(){me.reloadPstore()})})}}],listeners:{beforeshow:function(menu){var records=me.precordGrid.getSelectedRecord();if(records.length<1)return!1;var rec=records[0],state=rec.get("state"),enabled=rec.get("enabled"),hasGen=rec.get("has_record_gen"),editItem=menu.getComponent("editItem"),delItem=menu.getComponent("delItem"),cancelItem=menu.getComponent("cancelItem"),enableItem=menu.getComponent("enableItem"),disableItem=menu.getComponent("disableItem"),stopItem=menu.getComponent("stopItem"),ackItem=menu.getComponent("ackItem"),deleteGen=menu.getComponent("deleteGen");editItem.setDisabled(records.length>1),editItem.setText(hasGen?"Editer ce générateur":"Editer cet enregistrement"),cancelItem.setVisible("waiting_start_time"==state&&!hasGen&&1==records.length);var isDone=rec.isDone();delItem.setVisible(isDone||records.length>1),ackItem.setVisible(isDone||records.length>1),enableItem.setVisible(hasGen&&!enabled&&1==records.length),disableItem.setVisible(hasGen&&"waiting_start_time"==state&&enabled&&1==records.length),stopItem.setVisible("running"==state&&1==records.length),deleteGen.setVisible(hasGen)}}})),me.ctxMenu}}),me.frecordGrid=Ext.create("Fbx.ux.grid.CtxMenuGrid",{title:"Enregistrements terminés",hideHeaders:!0,store:me.frecordStore,selModel:{mode:"MULTI"},viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucun enregistrement terminé</div>'},features:[{ftype:"grouping",collapsible:!1,groupHeaderTpl:"{name:capitalize}"}],dockedItems:[{xtype:"toolbar",items:[{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.reloadFstore()}}]}],columns:[{xtype:"templatecolumn",dataIndex:"enabled",tpl:'<img class="tv-channel-logo <tpl if="!enabled">grayscale</tpl>" src="{logo_url}" alt="{channel_name}"/>',width:90},{xtype:"templatecolumn",dataIndex:"name",tpl:'<div class="pvr-infos"><div class="pvr-name"> <tpl if="name != \'\'">{name:htmlEncode}</tpl>  <tpl if="name == \'\'">Sans titre</tpl> </div><div class="pvr-subname"> <tpl if="subname != \'\'">{subname:htmlEncode}</tpl> &nbsp;</div><div class="pvr-detail"> <tpl if="channel">{[values.channel.name]}</tpl> <tpl if="!channel">{channel_name:htmlEncode}</tpl> - de {[Fbx.os.lib.FbxUtils.displayTime(values.start)]}    à {[Fbx.os.lib.FbxUtils.displayTime(values.end)]}</div></div>',flex:3},{xtype:"templatecolumn",dataIndex:"state",flex:1,tpl:'<div class="pvr-detail">Durée: {[Fbx.os.lib.FbxUtils.formatDuration(values.end - values.start)]}</div><div class="pvr-detail">Taille: {[Fbx.os.lib.FbxUtils.fileSize(values.byte_size)]}</div>'}],listeners:{itemdblclick:function(grid,record){if(record.get("has_record_gen"))return void me.editRecordGen(record.get("record_gen_id"));me.showEditor(record,!1)}},getCtxMenu:function(){return me.fRecordCtxMenu||(me.fRecordCtxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-edit",itemId:"editItem",cls:"default-item",text:"Renommer cet enregistrement",handler:function(){var records=me.frecordGrid.getSelectedRecord(),rec=records[0];me.showEditor(rec,!1)}},{iconCls:"btn-stop",itemId:"stopItem",text:"Stopper cet enregistrement",handler:function(){me.precordGrid.getSelectedRecord()[0].stopRecord(function(){me.reloadPstore()})}},"-",{iconCls:"btn-delete",itemId:"delItem",text:"Effacer cet enregistrement",handler:function(){var records=me.frecordGrid.getSelectedRecord();Ext.MessageBox.confirm("Effacer un enregistrement","Voulez-vous effacer cet enregistrement ?",function(btn){"yes"==btn&&(Ext.Array.each(records,function(r){me.frecordStore.remove(r)}),me.frecordStore.sync())})}}],listeners:{beforeshow:function(menu){var records=me.frecordGrid.getSelectedRecord();if(records.length<1)return!1;var rec=records[0],state=rec.get("state");menu.getComponent("editItem").setVisible(1==records.length&&"running"!=state),menu.getComponent("stopItem").setVisible(1==records.length&&"running"==state)}}})),me.fRecordCtxMenu}}),me.configForm=Ext.create("Fbx.ux.form.AjaxFormPanel",{title:"Paramètres d'enregistrement",url:FbxConf.apiBaseUrl+"pvr/config/",bodyPadding:10,defaults:{labelWidth:400,anchor:"100%"},items:[{xtype:"checkboxfield",fieldLabel:"Archiver automatiquement les enregistrements",name:"auto_ack",ttip:"Lorsqu'un enregistrement se termine correctement et que cette option est activée, l'enregistrement  est automatiquement retiré de la liste des enregistrements programmés",boxLabel:""},{xtype:"fieldcontainer",fieldLabel:"Marges d'enregistrement par défaut",layout:"vbox",items:[{xtype:"numberfield",fieldLabel:"Avant (min)",labelWidth:85,allowDecimals:!1,name:"margin_before",minValue:0,maxValue:60,flex:2},{xtype:"numberfield",fieldLabel:"Après (min)",labelWidth:85,allowDecimals:!1,name:"margin_after",minValue:0,maxValue:60,flex:2}]}],transformAfterGet:function(values){return values.margin_before/=60,values.margin_after/=60,values},transformBeforePost:function(values){return values.margin_before*=60,values.margin_after*=60,values},listeners:{show:function(){me.configForm.load()},saved:function(form,values){Fbx.os.app.pvr.app.__pvrCfg=null}}}),me.win=Ext.create("Ext.tab.Panel",{items:[me.precordGrid,me.frecordGrid,me.configForm]}),me.mainWindow.add(me.win),this.callParent()},reloadPstore:function(){var me=this;me.precordGrid.setLoading(!0),me.precordStore.load()},reloadFstore:function(){var me=this;me.frecordGrid.setLoading(!0),me.frecordStore.load()},editRecordGen:function(rec_gen_id){var me=this;Fbx.os.app.pvr.RecordGenModel.load(rec_gen_id,{success:function(recgen){me.showEditor(recgen,!0)},failure:function(){me.reloadPstore()}})},showEditor:function(record,isGenerator){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.pvr.PrecordEditor",{listeners:{save:function(){me.reloadPstore(),me.reloadFstore()}}})),me.editor.setRecord(record,isGenerator),me.editor.show()}});Ext.define("Fbx.os.app.contacts.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.data.Store","Fbx.os.app.contacts.ContactModel","Ext.layout.container.Border","Ext.layout.container.Card","Ext.grid.Panel","Fbx.os.app.contacts.ContactList","Fbx.os.app.contacts.ContactEditor","Fbx.os.app.contacts.ContactViewer","Fbx.os.app.contacts.ContactImport","Fbx.os.app.contacts.Settings","Fbx.os.lib.FbxUtils","Fbx.os.app.contacts.ContactGroup","Ext.panel.Panel"],statics:{defaultName:"Mes Contacts",defaultWidth:800,defaultHeight:500,allowMultipleInstance:!1,docSection:"doc/index.html#gestion-des-contacts",getPrettyDisplayName:function(first,last,display_name,company){var contactApp=Fbx.os.core.TaskManager.getAppInstances("Fbx.os.app.contacts.app"),displayType="pseudo";if(contactApp){contactApp=contactApp[0];var settings=contactApp.getSettings();settings&&settings.displayType&&(displayType=settings.displayType)}if(""!=(display_name=Ext.String.trim(display_name)))return display_name;var display="";switch(displayType){case"last_first":display=Ext.String.trim(last+" "+first),""==display&&(display=display_name);break;case"first_last":default:display=Ext.String.trim(first+" "+last),""==display&&(display=display_name)}return display=Ext.String.trim(display),""==display&&(display=company),Ext.String.trim(display)}},layout:{type:"border"},config:{settings:{displayType:"first_last"}},applySettings:function(settings){var me=this;me.store&&(me.store.isLoading()||me.store.load()),this.callParent(arguments)},launch:function(){var me=this;me.store=Ext.create("Ext.data.Store",{storeId:"contactStore",model:"Fbx.os.app.contacts.ContactModel",pageSize:-1,remoteFilter:!0,remoteSort:!1,sorters:[{property:"display_name_pretty_lower",direction:"ASC"}],sortOnLoad:!0,listeners:{load:function(store){if(me.editor.getRecord())return void me.editor.setLoading(!1);var first=store.first();if(first){me.win.down("contactList").getSelectionModel().select(first)}else me.centerPanel.getLayout().setActiveItem(0),me.centerPanel.hide()}}});Ext.create("Ext.data.Store",{storeId:"contactGroupStore",model:"Fbx.os.app.contacts.ContactGroup",autoLoad:!0,pageSize:200,listeners:{load:{fn:function(store){var rec=(me.store,Ext.create("Fbx.os.app.contacts.ContactGroup",{id:0,name:"Tous les contacts",nb_contact:-1}));rec.fakeGroup=!0,store.insert(0,rec),rec.phantom=!1,Fbx.os.app.contacts.ContactModel.getContactNumber(function(tot){rec.set("nb_contact",tot),rec.dirty=!1}),me.win.down("contactList").groupList.select(rec)}}}});me.editor=Ext.create("Fbx.os.app.contacts.ContactEditor",{border:0,bodyPadding:10,autoScroll:!0,preventHeader:!0,app:me}),me.viewer=Ext.create("Fbx.os.app.contacts.ContactViewer",{border:0,bodyPadding:10,autoScroll:!0,preventHeader:!0}),me.centerPanel=Ext.create("Ext.panel.Panel",{region:"center",layout:"card",border:0,activeItem:0,hidden:!0,items:[me.viewer,me.editor]}),this.win=Ext.create("Ext.panel.Panel",{layout:{type:"border"},dockedItems:[{xtype:"toolbar",docked:"top",items:[{xtype:"button",text:"Paramètres",iconCls:"btn-setting-tools",handler:function(){me.showSettings()}},{xtype:"button",text:"Importer des contacts",iconCls:"btn-vcard-add",handler:function(){me.showImportContacts()}},{xtype:"button",text:"Exporter les contacts",iconCls:"btn-export-excel",handler:function(){window.open(FbxConf.apiBaseUrl+"contact/export/","_blank")}}]}],items:[{xtype:"contactList",app:me,region:"west",width:250,split:!0,store:me.store,listeners:{beforeselect:function(selection,record,index,opts){var editor=me.editor;return setTimeout(function(){editor.performWhenSaved(function(){me.centerPanel.show(),me.viewer.loadRecord(record),me.centerPanel.getLayout().setActiveItem(0),selection.select(index,!1,!0)})},100),!1},itemdblclick:function(g,record,item,index,e,eOpts){setTimeout(function(){me.centerPanel.show(),me.editor.loadRecord(record),me.centerPanel.getLayout().setActiveItem(1)},200)}}},me.centerPanel]}),this.mainWindow.add(this.win),this.callParent()},addContact:function(number,name){var me=this;me.centerPanel.getLayout().setActiveItem(1),me.centerPanel.show();var records=me.store.add({display_name:name}),record=records[0];record.numbers().add({number:number,type:"fixed"}),me.editor.loadRecord(record)},showContact:function(contact_id){var me=this;me.store.on("load",function(){var r=me.store.getById(contact_id);if(r){var list=me.win.down("contactList");setTimeout(function(){list.getView().focusRow(me.store.indexOfId(contact_id)),list.getSelectionModel().select(r)},200)}},me,{single:!0}),me.store.isLoading()||me.store.load()},showSettings:function(){var settingsWin=Ext.create("Fbx.os.app.contacts.Settings");settingsWin.app=this,settingsWin.show()},showImportContacts:function(){Ext.create("Fbx.os.app.contacts.ContactImport").show()},destroy:function(){this.centerPanel.destroy(),this.win.destroy(),this.editor.destroy(),this.viewer.destroy(),this.callParent()}});Ext.define("Shortcut",{extend:"Ext.data.Model",requires:["Ext.button.Button","Ext.XTemplate","Ext.container.Container"],fields:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"order",type:"int"},{name:"application",type:"string"},{name:"caption",type:"string"},{name:"qtip",type:"string"},{name:"hidden",type:"boolean",defaultValue:!1},{name:"isNew",type:"boolean",defaultValue:!1},{name:"restricted",type:"boolean",convert:function(v,r){if(Fbx.os.gui.Environment.isLogged)return!1;var classObj=Ext.ClassManager.get(r.get("application"));return classObj&&!classObj.isOpenBar}}],idProperty:"application"}),Ext.define("Fbx.os.gui.Desktop",{extend:"Ext.view.View",requires:["Ext.data.Store","Fbx.os.gui.ApplicationModel","Ext.menu.Menu","Fbx.os.core.task.Desktop"],stateId:"desktop",stateful:!0,maxz:0,cls:"desktop-main-elem",nbShortcutPerLine:4,shortcutWidth:130,shortcutHeight:150,disableMobileInfo:!1,prefCurVersion:1,getState:function(){var me=this,state=this.callParent();state||(state={});var shortcuts=[];return me.shortcutStore.each(function(rec){shortcuts.push(rec.data)}),state.shortcuts=shortcuts,state.disableMobileInfo=me.disableMobileInfo,state.version=me.prefCurVersion,state},applyState:function(state){var me=this;if(state.version!=me.prefCurVersion&&delete state.shortcuts,state.shortcuts){me.shortcuts=state.shortcuts;for(var i in state.shortcuts){var data=state.shortcuts[i];void 0==data.isNew&&(data.isNew=!1),me.addShortcut(data.caption,data.application,data.x,data.y,data.hidden,data.order,data.isNew)}}void 0==state.disableMobileInfo&&(state.disableMobileInfo=!1),state.disableMobileInfo&&(me.disableMobileInfo=!0),me.arrangeShortcuts(),this.callParent(arguments)},arrangeShortcuts:function(){var me=this;if(me.firstRefreshDone){var desktopBox=me.getEl().getBox(),shortcuts=[];me.shortcutStore.each(function(rec){rec.get("hidden")||Ext.Array.push(shortcuts,rec)});var nbLines=Math.floor((desktopBox.height-80)/me.shortcutHeight);nbLines>3&&(nbLines=3);var nbColsMax=Math.floor(desktopBox.width/me.shortcutWidth),nbColsMin=Math.ceil(shortcuts.length/nbLines);if(nbLines*nbColsMax<nbColsMax)me.nbShortcutPerLine=nbColsMax;else{me.nbShortcutPerLine=nbColsMin;for(var i=nbColsMin;i<nbColsMax;++i)if(shortcuts.length%i==0){me.nbShortcutPerLine=i;break}}me.nbShortcutLine=Math.ceil(shortcuts.length/me.nbShortcutPerLine);var shortcutsHeight=me.nbShortcutLine*me.shortcutHeight;me.shortcutOffsetY=80+desktopBox.height/2-shortcutsHeight,me.shortcutOffsetY<80&&(me.shortcutOffsetY=80);var shortcutsWidth=me.nbShortcutPerLine*me.shortcutWidth;me.shortcutOffsetX=(desktopBox.width-shortcutsWidth)/2,me.shortcutOffsetX<0&&(me.shortcutOffsetX=0);var logo=Ext.fly(document.getElementById("logo_freeboxos_outer"));if(logo){var box=logo.getBox(),logoX=(desktopBox.width-box.width)/2,logoY=(me.shortcutOffsetY-box.height)/2;Math.abs(logoX-box.x)+Math.abs(logoY-box.y)>10&&logo.setLocation(logoX,logoY);var desktop_guest=Ext.fly(document.getElementById("desktop_guest"));desktop_guest&&desktop_guest.setLocation(0,logoY+box.height-20)}var x=me.shortcutOffsetX,y=me.shortcutOffsetY,idx=0;Fbx.os.gui.Environment.isLogged||(y+=20),Ext.Array.sort(shortcuts,function(a,b){return a.get("order")-b.get("order")});var order=0;Ext.Array.each(shortcuts,function(rec){rec!=me.dragRec?rec.set({x:x,y:y,order:order}):rec.set({order:order}),idx+=1,order+=1,x+=me.shortcutWidth,idx>=me.nbShortcutPerLine&&(idx=0,x=me.shortcutOffsetX,y+=me.shortcutHeight)});var mobileInfo=Ext.fly(document.getElementById("mobileInfo"));if(mobileInfo){me.mobileInfoCloseBtn||(me.mobileInfoCloseBtn=Ext.create("Ext.button.Button",{renderTo:document.getElementById("mobileInfoClose"),iconCls:"btn-cancel",cls:"mobileClose",handler:function(){mobileInfo.hide(),me.disableMobileInfo=!0,me.arrangeShortcuts(),me.fireEvent("desktopconfigchange",me)}}));var box=mobileInfo.getBox();0!=idx&&(y+=me.shortcutHeight);var leftH=desktopBox.height-y;if(me.disableMobileInfo||leftH<box.height+30||!Fbx.os.gui.Environment.isLogged)mobileInfo.hide();else{mobileInfo.show();var logoX=(desktopBox.width-box.width)/2,logoY=y+(leftH-box.height)/2;Math.abs(logoX-box.x)+Math.abs(logoY-box.y)>10&&mobileInfo.setLocation(logoX,logoY)}}Ext.each(me.getNodes(),function(el){var rec=me.getRecord(el),elem=Ext.get(el);elem.setVisible(!rec.get("hidden")),elem.setLeftTop(rec.get("x"),rec.get("y"))})}},addShortcut:function(caption,appname,x,y,hidden,order,isNew){var me=this,appStore=Ext.getStore("appStore"),s=me.shortcutStore.getById(appname),app=appStore.getById(appname);app&&(s?s.set({x:x,y:y,order:order,caption:app.get("name"),hidden:hidden,qtip:app.get("qtip"),isNew:isNew}):(s=Ext.create("Shortcut",{x:x,y:y,order:order,caption:app.get("name"),application:appname,hidden:hidden,qtip:app.get("qtip"),isNew:isNew}),me.shortcutStore.add(s)))},restoreShortcuts:function(){var me=this;me.shortcuts=[],me.disableMobileInfo=!1,Ext.getStore("appStore").each(function(rec){rec.get("defaultDesktop")&&me.addShortcut(rec.get("name"),rec.get("application"),0,0,!1,rec.get("order"),rec.get("isNew"))}),me.arrangeShortcuts()},constrainToDesktop:function(pos,elemSize,adjustSize,cascade,cascadeDirection){var me=this,box=me.getEl().getBox(),adjust=!1;return cascade&&(pos[0]+=cascade*cascadeDirection.x,pos[1]+=cascade*cascadeDirection.y),pos[0]+elemSize[0]>=box.right&&(pos[0]=box.right-elemSize[0],adjust=!0,cascadeDirection&&(cascadeDirection.x*=-1)),pos[0]<box.x&&(pos[0]=box.x,adjust=!0,cascadeDirection&&(cascadeDirection.x*=-1)),pos[1]+elemSize[1]>=box.bottom&&(pos[1]=box.bottom-elemSize[1],adjust=!0,cascadeDirection&&(cascadeDirection.y*=-1)),pos[1]<box.y&&(pos[1]=box.y,adjust=!0,cascadeDirection&&(cascadeDirection.y*=-1)),adjustSize&&(pos[0]+elemSize[0]>box.right&&(elemSize[0]=box.right-pos[0],adjust=!0),pos[1]+elemSize[1]>box.bottom&&(elemSize[1]=box.bottom-pos[1],adjust=!0)),adjust},stopDrag:function(){var me=this;me.dragElem=null,me.dragRec=null,me.dragNearestPos=-1,me.arrangeShortcuts(),me.fireEvent("desktopconfigchange",me)},constructor:function(config){var me=this;Ext.state.Manager.setProvider(Fbx.os.gui.Environment.getStateProvider()),me.addEvents("desktopconfigchange"),me.shortcutStore=Ext.create("Ext.data.Store",{model:"Shortcut",data:[],autoLoad:!0}),me.restoreShortcuts();var shortcutTpl=new Ext.XTemplate('<tpl if="!Fbx.os.gui.Environment.accessibilityMode">  <a href="javascript:Fbx.os.gui.Environment.setAccessibility(true);" aria-label="Activer le mode accessibilité" style="width: 1px; height: 1px; position: absolute; top: 0px; left: 0px; overflow: hidden;" tabindex="1"></a>  <div class="fbxos-logo" id="logo_freeboxos_outer">    <img src="resources/images/fbx/logo_freeboxos.png" alt="logo Freebox OS" id="logo_freeboxos"/>    <div class="fbxos-version">      <div class="fbxos-version-sprite fbxos-version-v'+FbxConf.firmwareVersionMajor+'"></div>      <div class="fbxos-version-sprite fbxos-version-dot"></div>      <div class="fbxos-version-sprite fbxos-version-v'+FbxConf.firmwareVersionMinor+'"></div>    </div>  </div></tpl><tpl if="!Fbx.os.gui.Environment.isLogged">  <div role="presentation" id="desktop_guest" class="desktop-not-logged-msg">Mode invité</div></tpl><tpl if="Fbx.os.gui.Environment.accessibilityMode">  <div class="accessibilityLink">    <a href="javascript:Fbx.os.gui.Environment.setAccessibility(false);" tabindex="1" >Désactiver le mode accessibilité</a>  </div></tpl><div id="mobileInfo" role="banner">  <h3>Téléchargez l\'application Freebox Compagnon</h3>  <div role="button" id="mobileInfoClose" aria-label="Ne plus afficher cette bannière" tabindex="5002"></div>  <div style="text-align: center;" role="presentation">      <a href="https://itunes.apple.com/fr/app/freebox-compagnon/id529497059?mt=8" target="_blank" title="Télécharger sur l\'App Store" tabindex="5000"><img src="resources/images/fbx/app_store.png" style="width: 135px; height: 40px; margin: 5px;" alt="Télécharger sur l\'App Store" /></a><a href="https://play.google.com/store/apps/details?id=fr.freebox.android.compagnon" target="_blank" title="Télécharger sur Google Play" tabindex="5001"><img src="resources/images/fbx/play_store.png" style="width: 129px; height: 45px; margin: 2px;" alt="Télécharger sur Google Play" /></a>  </div></div><div role="navigation" tabindex="10"><tpl for=".">  <div role="presentation" class="desktop-icon-outer <tpl if="restricted">desk-restricted</tpl>">    <tpl if="isNew"><div role="presentation" class="desktop-icon-new"></div></tpl>    <div role="link" class="desktop-icon {[this.getClassName(values.application)]}" data-qtip="{qtip:htmlEncode}" aria-label="Lancer l\'application {caption:htmlEncode}" tabindex="{[100 + values.order]}"></div>    <span role="presentation" aria-label="">{caption:htmlEncode}</span>  </div></tpl></div>',{getClassName:function(str){return Fbx.os.gui.ApplicationModel.getIconCls(str,80)}}),desktopMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-recycle",text:"Rétablir les icônes par défaut",handler:function(){me.restoreShortcuts(),me.fireEvent("desktopconfigchange",me)}}]}),shortcutMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Ne plus afficher sur le bureau",iconCls:"btn-delete",handler:function(){var recs=me.getSelectionModel().getSelection();Ext.Array.each(recs,function(r){r.set("hidden",!0)}),me.arrangeShortcuts(),me.fireEvent("desktopconfigchange",me)}}]}),viewConfig={selModel:{mode:"MULTI"},trackOver:!0,blockRefresh:!0,tpl:shortcutTpl,store:me.shortcutStore,emptyText:"",itemSelector:"div.desktop-icon-outer",overItemCls:"desktop-over",selectedItemCls:"desktop-selected",prepareData:function(data){return Ext.apply(data,{caption:Ext.util.Format.ellipsis(data.caption,30)}),data},listeners:{afterrender:function(){var el=me.getEl();el.getRegion();el.on("mousemove",function(e,t){if(me.dragElem){var pos=e.getXY();pos[0]-=me.dragOffsetX,pos[1]-=me.dragOffsetY;var size=me.dragElem.getSize();if(me.constrainToDesktop(pos,[size.width,size.height]),!me.dragStarted&&(me.dragOrigin[0]-pos[0])*(me.dragOrigin[0]-pos[0])+(me.dragOrigin[1]-pos[1])*(me.dragOrigin[1]-pos[1])<1e3)return;me.dragStarted=!0,me.dragRec.set({x:pos[0],y:pos[1]});var nearestLine=Math.round((pos[1]-me.shortcutOffsetY)/me.shortcutHeight),nearestCol=Math.round((pos[0]-me.shortcutOffsetX)/me.shortcutWidth),nearestPos=nearestLine*me.nbShortcutPerLine+nearestCol;nearestPos<0&&(nearestPos=0),nearestPos!=me.dragNearestPos&&(me.shortcutStore.each(function(rec){if(!rec.get("hidden")){var curOrder=rec.get("order");curOrder>nearestPos?rec.set("order",curOrder+1):curOrder==nearestPos?rec.set("order",nearestPos>me.dragNearestPos?curOrder-1:curOrder+1):rec.set("order",curOrder-1)}}),me.dragNearestPos=nearestPos,me.dragRec.set("order",nearestPos)),me.arrangeShortcuts()}}),el.on("mouseout",function(e,t){if(me.dragElem&&me.dragStarted){var pos=e.getXY(),box=el.getBox();(pos[0]<box.x||pos[0]>box.right||pos[1]<box.y||pos[1]>box.bottom)&&me.stopDrag()}})},itemmouseleave:function(view,record,item,index,e,eOpts){e.stopEvent()},containercontextmenu:function(view,event){view.getSelectionModel().deselectAll(),event.stopEvent(),desktopMenu.showAt(event.getXY())},itemclick:function(view,rec,item,index){if(Fbx.os.lib.FbxUtils.isMobileDevice()){var app=rec.get("application");Fbx.os.core.TaskManager.startApplication(app)}},itemdblclick:function(view,rec,item,index){var app=rec.get("application");rec.set("isNew",!1),me.fireEvent("desktopconfigchange",me),me.arrangeShortcuts(),Fbx.os.core.TaskManager.startApplication(app)},itemcontextmenu:function(view,rec,node,index,event){me.dragElem&&me.stopDrag(),view.isSelected(node)||view.select(rec,!1),selectedRec=rec,event.stopEvent(),shortcutMenu.showAt(event.getXY())},beforecontainermousedown:function(view,e){e.stopEvent()},itemmousedown:function(view,record,item,index,e,eOpts){e.stopEvent(),view.select(record,!1);var el=me.getNode(record),elem=Ext.get(el),pos=e.getXY(),itemPos=elem.getXY();me.dragElem=elem,me.dragRec=record,me.dragOffsetX=pos[0]-itemPos[0],me.dragOffsetY=pos[1]-itemPos[1],me.dragOrigin=itemPos,me.dragStarted=!1},itemkeydown:function(view,rec,item,index,e,eOpts){e.keyCode!=Ext.EventObject.ENTER&&e.keyCode!=Ext.EventObject.RETURN||rec&&Fbx.os.core.TaskManager.startApplication(rec.get("application"))},itemmouseup:function(view,record,item,index,e,eOpts){me.dragElem&&me.stopDrag()},containermouseup:function(){me.dragElem&&me.stopDrag()},beforerefresh:function(){me.arrangeShortcuts()},refresh:function(v){me.arrangeShortcuts()},boxready:function(){me.arrangeShortcuts()},resize:function(){me.arrangeShortcuts(),Ext.WindowManager.each(function(w){if(w.isVisible()){var s=w.getSize(),size=[s.width,s.height],pos=w.getPosition();Fbx.os.gui.Environment.desktop.constrainToDesktop(pos,size)&&(w.setPosition(pos),w.setSize(size))}})}}};this.callParent([viewConfig]),this.addStateEvents("desktopconfigchange")}});Ext.define("Fbx.os.app.settings.ConnectionDynDns",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.ux.form.AjaxFormPanel","Ext.tab.Panel","Fbx.os.app.settings.ConnectionDynDnsFieldset","Fbx.os.app.settings.ConnectionDynDnsStatus"],statics:{defaultName:"Connexion Internet / DNS Dynamique",defaultWidth:450,defaultHeight:390,allowMultipleInstance:!1,disabledInBridge:!0,modal:!0},launch:function(){var me=this,providers=[{name:"dyndns",title:"DynDNS"},{name:"noip",title:"No-IP"},{name:"ovh",title:"OVH"}],items=[],itemsStatus=[];for(var i in providers){var provider=providers[i];items.push(Ext.create("Fbx.os.app.settings.ConnectionDynDnsFieldset",{title:provider.title,fieldPfx:provider.name+"."})),itemsStatus.push(Ext.create("Fbx.os.app.settings.ConnectionDynDnsStatus",{title:provider.title,fieldPfx:provider.name+"."}))}me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"connection/ddns/all/",bodyPadding:10,autoScroll:!0,title:"Configuration",itemId:"dyndnscfg",items:items,listeners:{show:function(form){form.load()}}}),me.formStatus=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"connection/ddns/all/status/",bodyPadding:10,autoScroll:!0,title:"État",items:itemsStatus,buttons:[],listeners:{show:function(form){form.load()}}}),me.tabPanel=Ext.create("Ext.tab.Panel",{items:[me.formStatus,me.form]}),this.mainWindow.add(me.tabPanel),me.callParent(arguments),me.formStatus.load()}});Ext.define("Fbx.os.app.settings.AdblockConfig",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel"],statics:{defaultName:"Blocage des publicités (Bêta)",defaultWidth:450,defaultHeight:250,allowMultipleInstance:!1},winConfig:{resizable:!1,maximizable:!1,minimizable:!1,stateful:!1},launch:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"connection/config/",bodyPadding:10,items:[{xtype:"fieldset",title:"Publicité",defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"checkboxfield",fieldLabel:"Blocage de publicité",name:"adblock",ttip:"Cette fonctionnalité vous permet de bloquer l'affichage des publicités lorsque vous naviguez sur internet",boxLabel:""},{border:0,html:'<div style="margin: 10px;">L\'activation peut entrainer le blocage de l\'affichage de publicités figurant sur les pages web que vous visitez.</div><div style="margin: 10px;">Elle est proposée à titre de test, des publicités peuvent continuer à s\'afficher malgré l\'activation.</div><div style="margin: 10px;">L\'option peut être désactivée à tout moment.</div>'},{xtype:"hidden",name:"adblock_not_set"}]}]}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"}),me.form.on("loaded",function(){me.form.getForm().findField("adblock_not_set").setValue(!1)}),me.form.on("saved",function(){Fbx.os.gui.Environment.fireEvent("toogleneedrefresh")})}});Ext.define("Fbx.os.app.settings.Reset",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.FieldSet","Ext.panel.Panel"],statics:{defaultName:"Réinitialiser la Freebox",defaultWidth:450,defaultHeight:580,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#reinitialiser-votre-freebox"},winConfig:{resizable:!1,maximizable:!1,minimizable:!1,stateful:!1},launch:function(){var me=this;me.panel=Ext.create("Ext.panel.Panel",{bodyPadding:10,defaults:{anchor:"100%"},items:[{xtype:"fieldset",title:"Préférences Freebox OS",padding:5,layout:{type:"vbox",align:"stretch"},items:[{xtype:"label",html:"Si vous rencontrez des problèmes avec Freebox OS vous pouvez réinitialiser les préférences de l'interface<br />Les réglages de votre Freebox seront préservés."},{xtype:"button",margin:5,iconCls:"btn-rescue",text:"Réinitialiser les préférences Freebox OS",handler:function(){Ext.Msg.confirm("Reinitialiser les préférences Freebox OS ?","Êtes-vous sûr de vouloir réinitialiser les préférences Freebox OS ?",function(btn){if("yes"===btn){var provider=Fbx.os.gui.Environment.getStateProvider();for(var k in provider.state)provider.clear(k);Fbx.os.core.AppSettings.resetSettings()}})}}]},{xtype:"fieldset",title:"Mode secours",padding:5,layout:{type:"vbox",align:"stretch"},items:[{xtype:"label",html:'Si vous rencontrez des problèmes avec votre Freebox vous pouvez redémarrer en mode secours. <br /><span class="bold">Attention</span> : Le disque dur ne sera pas disponible en mode secours.<br />Vos réglages seront préservés.'},{xtype:"button",margin:5,iconCls:"btn-rescue",text:"Redémarrer la Freebox en mode Secours",handler:function(){Ext.Msg.confirm("Redémarrer en mode secours ?","Êtes-vous sûr de vouloir redémarrer en mode secours ?",function(btn){"yes"==btn&&Fbx.os.gui.Environment.reboot("rescue",!0)})}}]},{xtype:"fieldset",title:"Mode Usine",padding:5,layout:{type:"vbox",align:"stretch"},items:[{xtype:"label",html:'Vous pouvez réinitialiser votre Freebox en redémarrant en mode usine.<br /><span class="bold" style="color: red;">Attention</span> : Tous vos réglages seront réinitialisés aux valeurs d\'origine.'},{xtype:"button",margin:5,iconCls:"btn-warn",text:"Redémarrer la Freebox en mode Usine",handler:function(){Ext.Msg.confirm("Redémarrer en mode usine ?",'Êtes-vous sûr de vouloir redémarrer en mode usine ?<br /><span class="bold">Votre configuration sera perdue !</span>',function(btn){"yes"==btn&&Fbx.os.gui.Environment.reboot("factory",!0)})}}]},{xtype:"fieldset",title:"Formatage du disque dur",padding:5,layout:{type:"vbox",align:"stretch"},items:[{xtype:"label",padding:5,html:'Si vous rencontrez des problèmes avec le disque dur de votre Freebox, vous pouvez le reformater. <br /><span class="bold" style="color: red;">Attention</span> : Toutes les données présentes sur votre Freebox seront perdues (y compris vos enregistrements TV).'},{xtype:"button",margin:5,iconCls:"btn-clear",text:"Formater le disque dur",handler:function(){Ext.Msg.confirm("Formater le disque dur de la Freebox ?",'Êtes-vous sûr de vouloir formater le disque dur ?<br /><span class="bold">Toutes les données du disque dur seront perdues !</span>',function(btn){"yes"==btn&&me.formatDisk()})}}]}],buttons:[{text:"Annuler",iconCls:"btn-cancel",handler:function(){me.close()}}]}),this.mainWindow.add(me.panel),me.callParent(arguments)},formatDisk:function(){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"storage/disk/",method:"GET",success:function(response){var res=response.jsonData.result;me.internalId=-1;for(var i in res){var d=res[i];if("internal"==d.type){me.internalId=d.id;break}}if(me.internalId<0)return void Ext.Msg.alert("Erreur","Impossible de trouver le disque dur interne");me.formatStarted=!1,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"storage/disk/"+me.internalId+"/format",method:"PUT",jsonData:{},success:function(response){Ext.Msg.progress("Formatage du disque","Formatage en cours, merci de patienter"),me.checkProgress()}})}})},checkProgress:function(){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"storage/disk/"+me.internalId,method:"GET",success:function(response){var res=response.jsonData.result;switch(res.state){case"formatting":if(me.formatStarted=!0,res.operation_pct){var infos=res.operation_pct,progress=infos.percent/100;Ext.Msg.updateProgress(progress,infos.percent+"% - étape "+(infos.done_steps+1)+"/"+infos.max_steps)}setTimeout(function(){Ext.Msg.toFront(),Ext.Msg.focus()},100);break;case"enabled":if(me.formatStarted)return void Ext.Msg.show({title:"Formatage OK",msg:"Le formatage est terminé",icon:Ext.window.MessageBox.INFO,buttons:Ext.Msg.OK});break;case"error":Ext.Msg.show({title:"Erreur détectées",msg:"Une erreur est survenue lors du formatage",icon:Ext.window.MessageBox.ERROR,buttons:Ext.Msg.OK})}setTimeout(function(){me.checkProgress()},1e3)}})}});Ext.define("Fbx.os.app.settings.ConnectionConfig",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel"],statics:{defaultName:"Connexion Internet / Configuration",defaultWidth:470,defaultHeight:400,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#configurer-votre-connexion"},launch:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"connection/config/",bodyPadding:10,items:[{xtype:"fieldset",title:"Ping",defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"checkboxfield",fieldLabel:"Réponse au ping",name:"ping",boxLabel:"",ttip:"Décochez cette case si vous souhaitez que votre Freebox ne réponde pas aux requêtes ping"}]},{xtype:"fieldset",title:"Accès à Freebox OS",defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"checkboxfield",fieldLabel:"Activer l'authentification par mot de passe",name:"remote_access",boxLabel:"",ttip:"Lorsque vous activez cette option vous pouvez accéder au contenu de votre freebox depuis n'importe quelle connexion internet, en utilisant votre mot de passe."},{xtype:"numberfield",fieldLabel:"Port accès distant (HTTP)",name:"remote_access_port",ttip:"Port sur lequel vous devrez vous connecter pour utiliser l'accès à distance",emptyText:80,maxValue:65535,minValue:0},{xtype:"numberfield",fieldLabel:"Port accès distant sécurisé (HTTPS)",name:"https_port",ttip:"Port sur lequel vous devrez vous connecter pour utiliser l'accès à distance sécurisé",emptyText:443,maxValue:65535,minValue:0}]},{xtype:"fieldset",title:"Wake on LAN",defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"checkboxfield",fieldLabel:"Proxy Wake on LAN",name:"wol",ttip:"Cette fonctionnalité vous permet d'allumer un PC connecté à votre Freebox à distance",boxLabel:""}]},{xtype:"fieldset",title:"Publicité",defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"checkboxfield",fieldLabel:"Blocage de publicité",name:"adblock",ttip:"Cette fonctionnalité vous permet de bloquer l'affichage des publicités lorsque vous naviguez sur internet",boxLabel:""},{xtype:"hidden",name:"adblock_not_set"}]}]}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"}),me.form.on("loaded",function(target,conf){var form=me.form.getForm();form.findField("adblock_not_set").setValue(!1);var minPort=0,maxPort=65535;void 0!==conf.remote_access_max_port&&void 0!==conf.remote_access_min_port&&(minPort=conf.remote_access_min_port,maxPort=conf.remote_access_max_port);var portField=form.findField("remote_access_port");portField.setMinValue(minPort),portField.setMaxValue(maxPort),portField.minText="Vous devez choisir un port supérieur à "+minPort,portField.maxText="Vous devez choisir un port inférieur à "+maxPort;var portField2=form.findField("https_port");portField2.setMinValue(minPort),portField2.setMaxValue(maxPort),portField2.minText=portField.minText,portField2.maxText=portField.maxText,form.isValid()})}});Ext.define("Fbx.os.app.settings.UpnpAv",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Checkbox","Fbx.ux.form.AjaxFormPanel"],statics:{defaultName:"Multimédia / UPnP AV",defaultWidth:450,defaultHeight:100,allowMultipleInstance:!1,disabledInBridge:!0,modal:!0,docSection:"doc/index.html#activer-l-upnp-av"},launch:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"upnpav/config/",bodyPadding:10,defaults:{anchor:"100%",labelWidth:150},items:[{xtype:"checkboxfield",fieldLabel:"Activer UPnP AV",name:"enabled",ttip:"Ce service vous permet de partager les fichiers multimédia de votre Freebox sur votre réseau local",boxLabel:""}]}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"})}});Ext.define("Fbx.os.app.settings.NetworkMode",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.ux.form.AjaxFormPanel","Ext.form.FieldSet","Ext.form.field.ComboBox","Ext.layout.component.FieldSet","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore","Ext.form.field.Text"],statics:{defaultName:"Réseau local / Mode Réseau",defaultWidth:450,defaultHeight:320,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#regler-le-mode-reseau"},launch:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"lan/config/",bodyPadding:10,defaults:{anchor:"100%"},items:[{xtype:"fieldset",title:"Mode réseau",defaults:{anchor:"100%",labelWidth:150},items:[{xtype:"combobox",fieldLabel:"Mode Réseau",name:"mode",ttip:"Permet de désactiver le mode routeur de votre Freebox si vous souhaitez utiliser un autre routeur",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["router","Routeur"],["bridge","Bridge"]]}),displayField:"label",valueField:"type",mode:"local",typeAhead:!1,listeners:{change:function(field,newVal,oldVal){me.form.getForm().findField("ip").setDisabled("bridge"==newVal)},select:function(field){me.form.getForm();"bridge"==field.getValue()&&Ext.Msg.show({title:"Êtes-vous sûr de vouloir passer en mode Bridge ?",msg:"Le mode bridge est recommandé aux personnes voulant utiliser leur propre routeur derrière leur connexion Free. Si vous activez ce mode, l'adresse IP publique assignée à votre connexion sera attribuée via DHCP à la première machine connectée sur les ports situés à l'arrière de votre Freebox Server.<br /><br />Si vous activez le mode bridge sur votre Freebox Server, cela va altérer le fonctionnement des services suivants :<br /><div style=\"padding-left: 15px;\">&bull; Le service UPnP A/V sera désactivé.<br />&bull; Le service UPnP IGD sera désactivé.<br />&bull; Le réseau personnel Wi-Fi du Freebox Server sera désactivé.<br />&bull; La TNT sera inaccessible en multiposte.<br />&bull; Le service proxy WOL fourni par le Freebox Server sera désactivé.<br />&bull; Le partage Windows du Freebox Server ne sera plus accessible via le voisinage réseau (mais toujours accessible via \\\\mafreebox.freebox.fr).<br />&bull; Les services de découverte (mDNS) des partages Mac OS seront inopérants.<br />&bull; Le ou les boitiers Freebox Player ne seront plus accessibles sur le LAN (ceci impacte uniquement le FreeStore et le navigateur Web).<br />&bull; Le service SeedBox sera désactivé.</div><br />Êtes-vous sûr de vouloir passer en mode Bridge ?<br />",fn:function(btn){"yes"!=btn&&field.setValue("router")},buttons:Ext.Msg.YESNO,icon:Ext.Msg.WARNING})}}},{xtype:"textfield",fieldLabel:"Adresse IP du Freebox Server",ttip:"Adresse IP de votre Freebox",name:"ip",vtype:"ip"}]},{xtype:"fieldset",title:"Nom d'hôte",defaults:{anchor:"100%",allowBlank:!1,labelWidth:150},items:[{xtype:"textfield",fieldLabel:"Nom du Freebox Server",ttip:"Nom qui sera affiché pour votre Freebox lorsque vous explorez votre réseau",name:"name",vtype:"netName",listeners:{change:function(field,newVal){var form=me.form.getForm(),unaccented=Fbx.os.lib.FbxUtils.stripAccents(newVal),name_dns=unaccented.toLowerCase().replace(/[^0-9a-z-]/g,"-");form.findField("name_dns").setValue(name_dns.substr(0,63));var name_mdns=unaccented.replace(/[^0-9a-zA-Z-]/g,"-");form.findField("name_mdns").setValue(name_mdns.substr(0,63));var name_netbios=unaccented.replace(/[^0-9a-zA-Z!#$%&()+,.;=@\[\]^_`{}~-]/g,"_");form.findField("name_netbios").setValue(name_netbios.substr(0,15))}}},{xtype:"textfield",fieldLabel:"Nom DNS",name:"name_dns",vtype:"dnsName"},{xtype:"textfield",fieldLabel:"Nom mDNS",name:"name_mdns",vtype:"mdnsName"},{xtype:"textfield",fieldLabel:"Nom Netbios",name:"name_netbios",vtype:"netbiosName"}]}],listeners:{loaded:function(form,settings){Fbx.os.gui.Environment.cacheNetworkConf(settings)},saved:function(form,settings){Fbx.os.gui.Environment.cacheNetworkConf(settings),Fbx.os.gui.Environment.fireEvent("toogleneedrefresh")}}}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"})}});Ext.define("Fbx.os.app.explorer.ShareLinkWin",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.ux.data.proxy.RestTree","Fbx.os.app.explorer.ShareLinkModel","Ext.grid.column.Date","Ext.grid.column.Template","Fbx.ux.grid.RefreshGrid","Ext.data.Store","Ext.selection.RowModel","Ext.menu.Menu"],uses:["Fbx.os.app.explorer.FileBrowserWindow"],statics:{defaultName:"Liens de partage",defaultWidth:800,defaultHeight:400,allowMultipleInstance:!1},launch:function(){var me=this;me.shareStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.explorer.ShareLinkModel",autoLoad:!0,filters:[{property:"internal",value:!1}]}),me.grid=Ext.create("Fbx.ux.grid.RefreshGrid",{suspendRefresh:!0,store:me.shareStore,autoScroll:!0,dockedItems:[{xtype:"toolbar",items:[{xtype:"button",iconCls:"btn-arrow-refresh",text:"Rafraîchir",handler:function(){me.shareStore.load()}},{text:"Partager un dossier",iconCls:"btn-share",handler:function(){var pathWindow=Ext.create("Fbx.os.app.explorer.FileBrowserWindow",{title:"Choix du dossier à partager",isPicker:!0,displayedMimeType:"inode/directory",allowMultipleSelect:!1,listeners:{filesselected:function(files){var path=files[0];Fbx.os.app.explorer.FsTask.handleShare(path)}}});pathWindow.setPath(""),pathWindow.show()}}]}],selModel:Ext.create("Ext.selection.RowModel",{mode:"MULTI"}),columns:[{dataIndex:"decoded_path",text:"Chemin",flex:1},{xtype:"templatecolumn",dataIndex:"expiredate",text:"Date d'expiration",width:150,tpl:'<tpl if="expire == 0">Pas d\'expiration</tpl><tpl if="expire != 0">{[Fbx.os.lib.FbxUtils.getParisMoment(values.expiredate).format(\'DD/MM/YYYY HH:mm:ss\')]}</tpl>'},{xtype:"templatecolumn",dataIndex:"fullurl",text:"Lien",flex:2,tpl:'<tpl if="fullurl == \'\'">Accès à distance désactivé !</tpl><tpl if="fullurl != \'\'"><a href="{fullurl:htmlEncode}" target="_blank">{fullurl:htmlEncode}</a> &nbsp;<a href="{mailto}" target="_blank"><img class="btn-email" style="vertical-align: middle;" src="data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" alt="email"/></a></tpl>'},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){var rec=me.shareStore.getAt(rowIndex);Ext.MessageBox.confirm("Supprimer","Voulez-vous supprimer ce lien de partage ?",function(btn){"yes"==btn&&(me.shareStore.remove(rec),me.shareStore.sync())})}}]}],getCtxMenu:function(){return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-delete",text:"Supprimer ce(s) lien(s)",handler:function(){var records=me.grid.getSelectedRecord();me.shareStore.remove(records),me.shareStore.sync()}}],listeners:{beforeshow:function(){if(0==me.grid.getSelectedRecord().length)return!1}}})),me.ctxMenu}}),this.mainWindow.add(me.grid),this.callParent(arguments)}});Ext.define("Fbx.os.app.help.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.container.Container","Ext.ux.IFrame","Ext.tree.Panel","Ext.data.TreeStore","Fbx.os.app.help.HelpModel","Ext.panel.Panel"],statics:{defaultName:"Aide Freebox OS",defaultWidth:800,defaultHeight:400,allowMultipleInstance:!1,isOpenBar:!0},setArgs:function(defaultSrc){this.docIframe.load(defaultSrc)},launch:function(defaultSrc){var me=this;defaultSrc&&""!=defaultSrc||(defaultSrc="doc/index.html"),me.docStore=Ext.create("Ext.data.TreeStore",{model:"Fbx.os.app.help.HelpModel",sorters:[{property:"order",direction:"ASC"}],listeners:{load:function(tree,node,records,successfull){if("root"==node.getId()){var root=records[0];me.tree.setRootNode(root),root.getChildAt(0).expand()}}}}),me.tree=Ext.create("Ext.tree.Panel",{region:"west",rootVisible:!1,animate:!1,store:me.docStore,width:300,hideHeaders:!0,split:!0,displayField:"title",columns:[{xtype:"treecolumn",flex:1,sortable:!1,dataIndex:"title"}],listeners:{itemclick:function(view,rec,item,index,e,eOpts){rec.isExpanded()||rec.expand(),me.docIframe.iframeEl.dom.contentWindow.location.hash=rec.get("id"),me.docIframe.iframeEl.scrollTo("top",0)}}});var index=defaultSrc.indexOf("#");index<0&&(index=defaultSrc.length),defaultSrc=defaultSrc.slice(0,index)+"?v="+FbxConf.docVersion+defaultSrc.slice(index),me.docIframe=Ext.create("Ext.ux.IFrame",{region:"center",src:defaultSrc,loadMask:!1,listeners:{boxready:function(){me.prevHash=" .. ",me.keepInSync=setInterval(function(){if(me.docIframe.iframeEl&&me.docIframe.iframeEl.dom){var hash=me.docIframe.iframeEl.dom.contentWindow.location.hash.toLowerCase();if(hash!=me.prevHash){me.prevHash=hash;var n=me.docStore.getNodeById(hash.substring(1));if(n){if(!n.isExpanded()){for(var p=n.parentNode;p&&!p.isExpanded();)p.expand(),p=p.parentNode;n.expand()}me.tree.getSelectionModel().select(n)}}}},500)}}}),me.panel=Ext.create("Ext.panel.Panel",{layout:{align:"stretch",type:"border"},items:[me.tree,me.docIframe]}),me.mainWindow.add(me.panel),me.callParent(arguments),me.docStore.load(),me.panel.on("destroy",function(){me.keepInSync&&clearInterval(me.keepInSync),me.keepInSync=void 0})}});Ext.define("Fbx.os.app.settings.storage.Storage",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.lib.FbxUtils","Ext.tab.Panel","Ext.panel.Panel","Ext.window.Window","Ext.container.Container","Fbx.os.app.settings.storage.DiskList","Fbx.os.app.settings.storage.RaidList"],statics:{defaultName:"Partages de fichiers / Disques",defaultWidth:800,defaultHeight:450,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#gerer-les-disques"},launch:function(){var me=this;me.diskTab=Ext.create("Fbx.os.app.settings.storage.DiskList",{title:"Disques"}),me.raidTab=Ext.create("Fbx.os.app.settings.storage.RaidList",{title:"Array Raid"});var items=[me.diskTab];Fbx.os.gui.Environment.boxHasRaid()&&items.push(me.raidTab),me.main=Ext.create("Ext.tab.Panel",{layout:"border",items:items}),this.mainWindow.add(me.main),this.mainWindow.focusOnToFront=!1,me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.ports.PortInConfig",{extend:"Ext.grid.Panel",requires:["Fbx.os.app.settings.ports.PortInModel","Ext.grid.column.Column","Ext.grid.column.Boolean","Ext.grid.column.Template","Fbx.os.app.settings.ports.PortInEditor","Ext.grid.feature.Grouping","Ext.data.Store"],initComponent:function(){var me=this;me.redirStore=Ext.create("Ext.data.Store",{storeId:"portRedir",model:"Fbx.os.app.settings.ports.PortInModel",remoteSort:!1,remoteFilter:!1,pageSize:0,groupField:"netns"}),Ext.apply(me,{store:me.redirStore,forceFit:!0,columns:[{xtype:"booleancolumn",text:"Autorisé",trueText:"Oui",falseText:"Non",width:60,dataIndex:"enabled"},{xtype:"booleancolumn",text:"Actif",trueText:"Oui",falseText:"Non",width:60,dataIndex:"active"},{xtype:"gridcolumn",text:"Description",dataIndex:"description",flex:4},{xtype:"templatecolumn",text:"Port entrant",flex:1,dataIndex:"in_port",tpl:'<tpl if="!values.port_valid"><span style="color: red; font-weight: bold;">{in_port}</span></tpl><tpl if="values.port_valid">{in_port}</tpl>'},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-edit",tooltip:"Éditer",handler:function(grid,rowIndex,colIndex){var rec=(grid.getStore(),grid.getStore().getAt(rowIndex));me.showEditor(rec)}}]}],features:[{ftype:"grouping",groupHeaderTpl:"<tpl if=\"name == 'init'\">Connexions entrantes</tpl><tpl if=\"name == 'vpn'\">Connexions entrantes VPN</tpl>"}],listeners:{itemdblclick:function(grid,rec,item,index,e,eOpts){me.showEditor(rec)}}}),me.callParent(arguments),me.mon(me,"show",function(){me.redirStore.load()}),me.redirStore.load()},showEditor:function(rec){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.settings.ports.PortInEditor")),me.editor.setRecord(rec),me.editor.show()}});Ext.define("Fbx.os.app.epg.app",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.app.epg.EpgComponent","Fbx.os.app.epg.EpgInfoWin","Ext.tab.Panel","Fbx.os.app.epg.EpgHighlights"],statics:{defaultName:"Guide des programmes TV",defaultWidth:1e3,defaultHeight:600,allowMultipleInstance:!1,isOpenBar:!0,docSection:"doc/index.html#guide-des-programmes"},launch:function(){var me=this;me.epg=Ext.create("Fbx.os.app.epg.EpgComponent",{title:"Semaine",itemId:"epg-complete",listeners:{programclick:function(epgCmp,channel,prog){me.showInfoWin(prog,channel)},startdrag:function(){me.hideInfoWin()}}}),me.highlights=Ext.create("Fbx.os.app.epg.EpgHighlights",{title:"Soirée",itemId:"epg-highlight",listeners:{programclick:function(epgCmp,channel,prog){me.showInfoWin(prog,channel)},startdrag:function(){me.hideInfoWin()}}}),me.win=Ext.create("Ext.tab.Panel",{items:[me.highlights,me.epg]}),me.mainWindow.add(me.win),this.callParent()},showInfoWin:function(prog,channel){var me=this;me.infoWin||(me.infoWin=Ext.create("Fbx.os.app.epg.EpgInfoWin")),me.infoWin.loadProg(prog,channel),me.infoWin.show()},hideInfoWin:function(){var me=this;me.infoWin&&me.infoWin.hide()}});Ext.define("Fbx.os.app.settings.WizardWifi",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.container.Container","Ext.panel.Panel","Ext.layout.container.Card","Ext.form.field.Text","Ext.form.Panel","Fbx.os.lib.FbxUtils","Ext.button.Button"],statics:{defaultName:"Assistant Wi-Fi",defaultWidth:450,defaultHeight:300,allowMultipleInstance:!1,modal:!0,disabledInBridge:!0,docSection:"doc/index.html#configurer-simplement-le-wi-fi"},winConfig:{resizable:!1,maximizable:!1,minimizable:!1},getWifiConfig:function(cb){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/wizard/",method:"GET",success:function(response){cb(response.jsonData.result)},failure:function(){me.close()}})},setWifiConfig:function(conf,cb){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/wizard/",method:"PUT",jsonData:conf,success:function(response){Fbx.os.gui.Environment.fireEvent("toogleneedrefresh"),cb(response.jsonData.result)}})},gotoPage:function(page){this.panel.getLayout().setActiveItem(page)},updateBtn:function(step){var me=this;0==step?(me.btnPrev.setVisible(!1),me.btnNext.setText("Démarrer"),me.btnNext.setIconCls("btn-next"),me.btnNext.setHandler(function(){me.gotoPage(step+1)})):1==step?(me.btnPrev.setText("Non"),me.btnPrev.setVisible(!0),me.btnPrev.setIconCls("btn-cancel"),me.btnPrev.setHandler(function(){Ext.Msg.confirm("Désactivation du Wi-Fi","Êtes-vous sûr de vouloir désactiver le module Wi-Fi de votre Freebox ?",function(btn){"yes"==btn&&me.setWifiConfig({enabled:!1},function(){Ext.Msg.alert("Wi-Fi désactivé","Le module Wi-Fi de votre Freebox a été désactivé",function(){me.gotoPage(step+2)})})})}),me.btnNext.setText("Oui"),me.btnNext.setIconCls("btn-next"),me.btnNext.setHandler(function(){me.gotoPage(step+1)})):2==step?(me.btnPrev.setText("Retour"),me.btnPrev.setIconCls("btn-previous"),me.btnPrev.setHandler(function(){me.gotoPage(step-1)}),me.btnNext.setText("Valider"),me.btnNext.setIconCls("btn-accept"),me.btnNext.setHandler(function(){Ext.Msg.confirm("Modification des paramètres Wi-Fi","Êtes-vous sûr de vouloir modifier les paramères Wi-Fi de votre Freebox ?<br />Si vous êtes connecté, en Wi-Fi vous risquez d'être déconnecté.",function(btn){if("yes"==btn){var values=me.form.getForm().getValues();me.setWifiConfig({enabled:!0,ssid:values.ssid,key:values.key},function(){me.gotoPage(step+1)})}})})):(me.btnPrev.setDisabled(!0),me.btnNext.setText("Terminer"),me.btnNext.setIconCls("btn-accept"),me.btnNext.setHandler(function(){me.close()}))},launch:function(defaultSrc){var me=this;me.btnPrev=Ext.create("Ext.button.Button",{iconCls:"btn-cancel",text:"Non"}),me.btnNext=Ext.create("Ext.button.Button",{text:"Oui",iconCls:"btn-next"}),me.form=Ext.create("Ext.form.Panel",{layoput:"hbox",bodyPadding:10,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"label",text:"Nom de votre réseau wifi :"},{xtype:"textfield",name:"ssid",allowBlank:!1,margin:"10px 0px",fieldLabel:"",value:"",validator:function(value){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value)>32)||"Votre nom de réseau est trop long !"}},{xtype:"label",text:"Mot de passe de votre réseau Wi-Fi :"},{xtype:"textfield",name:"key",margin:"10px 0px",value:"",validator:function(value){var keyLen=Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(value);return keyLen<8?"Votre clé Wi-Fi est trop courte !":!(keyLen>63)||"Votre clé Wi-Fi est trop longue !"}},{xtype:"label",text:"Le type de chiffrement utilisé sur votre réseau Wi-Fi sera WPA2-PSK/AES."}],listeners:{show:function(){me.panel.setTitle("> Étape 2/3 : Paramètres Wi-Fi"),me.updateBtn(2)}}}),me.panel=Ext.create("Ext.panel.Panel",{title:"> Introduction",layout:"card",buttons:[{iconCls:"btn-cancel",text:"Annuler",handler:function(){me.close()}},"->",me.btnPrev,me.btnNext],items:[{xtype:"panel",bodyPadding:10,border:0,items:[{xtype:"label",cls:"blabla",html:"<div><strong>Cet assistant vous permet de configurer facilement votre réseau sans fil Freebox.</strong></div><div>Si vous n'utilisez pas le réseau sans fil vous pouvez choisir de le désactiver</div><div>Sinon vous aurez la possibilité de personnaliser le nom et le mot de passe de votre réseau sans fil, les autres paramètres seront alors réglés automatiquement.</div><div>Pour configurer les paramètres avancés, utiliser l'applicatrion Wi-Fi dans la partie configuration avancée</div>"}],listeners:{show:function(){me.panel.setTitle("> Introduction"),me.updateBtn(0)}}},{xtype:"panel",bodyPadding:10,border:0,items:[{xtype:"label",cls:"blabla",html:"<div><strong>Voulez-vous utiliser la connection sans fil (Wi-Fi) de votre Freebox ?</strong></div><div>&bull; Si vous répondez non, la connection sans fil de votre Freebox sera désactivée. Vous devrez alors vous connecter avec un câble réseau afin d'avoir accès à internet</div><div>&bull; Si vous répondez oui, vous pourrez choisir le nom et le mot de passe de votre réseau dans l'écran suivant</div>"}],listeners:{show:function(){me.panel.setTitle("> Étape 1/3 : Activation du Wi-Fi"),me.updateBtn(1)}}},me.form,{xtype:"container",layout:"fit",html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div style="padding: 10px;">Votre configuration Wi-Fi a bien été mise à jour.</div>',listeners:{show:function(){me.panel.setTitle("> Étape 3/3 : Configuration terminée"),me.updateBtn(3)}}}]}),me.mainWindow.setLoading(!0),me.getWifiConfig(function(result){me.mainWindow.setLoading(!1),me.form.getForm().setValues({key:result.key,ssid:result.ssid})}),me.updateBtn(0),me.mainWindow.add(me.panel),me.callParent(arguments)}});Ext.define("Fbx.os.app.tv.app",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.app.tv.Player","Ext.panel.Panel","Fbx.os.app.tv.ChannelDb","Fbx.os.app.tv.BouquetModel","Fbx.os.app.tv.BouquetChannelModel","Fbx.os.app.tv.ChannelList","Fbx.os.app.tv.EpgDb","Fbx.os.app.tv.ProgramPanel","Fbx.os.app.tv.Settings","Ext.data.Store","Ext.toolbar.Toolbar","Ext.window.Window"],statics:{defaultName:"Freebox TV",defaultWidth:1024,defaultHeight:600,allowMultipleInstance:!1,isOpenBar:!0,docSection:"doc/index.html#application-tv",beforeLaunch:function(cb){if(!Fbx.os.app.tv.FlashPlayer.isAvailable()&&!Fbx.os.app.tv.VLCPlayer.isAvailable())return void Ext.Msg.alert("Impossible de visionner la TV",'Afin de pouvoir regarder la TV dans Freebox OS vous devez installer le plugin Flash ou le plugin VLC<br /><a href="http://get.adobe.com/fr/flashplayer/" target="_blank">Installer Flash Player</a> <br /><a href="http://www.videolan.org/vlc/" target="_blank">Installer VLC</a> <br />');Ext.Ajax.request({method:"GET",url:FbxConf.apiBaseUrl+"tv/status/",success:function(response){var infos=response.jsonData.result;return infos.tv_enabled?infos.from_ext?void Ext.Msg.alert("Flux TV inaccessibles","L'accès aux flux TV Freebox n'est pas possible à distance !"):void cb():void Ext.Msg.alert("Option tv désactivée","Vous devez activer l'option TV sur votre Freebox Player afin de pouvoir regarder la TV dans Freebox OS")}})},lastWatchedProp:"tv-lastWatched"},curChannel:"",curViewedChannel:"",loadBouquetChannels:function(bouquet_id){var me=this;me.bqChannelStore.proxy.url=FbxConf.apiBaseUrl+"tv/bouquets/"+encodeURIComponent(bouquet_id)+"/channels/",me.bqChannelStore.load()},launch:function(){var me=this;me.epgStore=Fbx.os.app.tv.EpgDb.getInstance(),me.mon(me.epgStore,"currentProgramAvailable",function(){me.refresh(),me.refreshProgram()}),me.bqChannelStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.tv.BouquetChannelModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"number",order:"ASC"}],filters:[function(r){return 0==r.get("sub_number")}],listeners:{load:function(store,records){if(""==me.curChannel){if(Fbx.os.app.tv.Settings.getUserPrefs().auto_resume){var rec=null,lastWatched=Ext.state.Manager.get(Fbx.os.app.tv.app.lastWatchedProp);lastWatched&&lastWatched.uuid||(lastWatched={uuid:"uuid-webtv-201"}),rec=me.bqChannelStore.findRecord("uuid",lastWatched.uuid,0,!1,!1,!0),rec||(rec=me.bqChannelStore.first());var channel=rec.get("channel");me.curChannel=channel,me.curViewedChannel=channel,me.refreshProgram(),me.playerPanel.zap(rec);var idx=me.bqChannelStore.indexOf(rec);me.channelList.findPlugin("deferredrenderer").scrollTo(idx,!0)}}}}}),me.bouquetStore=Ext.create("Ext.data.Store",{remoteSort:!1,remoteFilter:!0,model:"Fbx.os.app.tv.BouquetModel",listeners:{load:function(store,records){if(!records.length)return void Ext.Msg.alert("Erreur","Erreur lors du chargement de la liste des bouquets");for(var maxBq=records[0],i=1;i<records.length;++i)records[i].get("channel_count")>maxBq.get("channel_count")&&(maxBq=records[i]);me.loadBouquetChannels(maxBq.getId())}}}),me.channelDb=Fbx.os.app.tv.ChannelDb.getInstance(),me.channelDb.on("load",function(){me.bouquetStore.load()}),me.channelDb.load(),me.playerPanel=Ext.create("Fbx.os.app.tv.Player",{layout:"fit",region:"center",stateful:!0,stateId:"tv-player"}),me.epgPanel=Ext.create("Fbx.os.app.tv.ProgramPanel",{layout:"fit",region:"south",split:!1,collapsible:!0,floatable:!1,overflowX:"hidden",overflowY:"auto",stateId:"tv-epg",height:180,weight:10}),me.channelList=Ext.create("Fbx.os.app.tv.ChannelList",{layout:"fit",region:"west",split:!1,overflowX:"hidden",overflowY:"auto",store:me.bqChannelStore,collapsible:!0,floatable:!1,title:"Liste des chaînes",stateId:"tv-channel-list",width:300,weight:100,listeners:{itemclick:function(list,rec,item,idx){var channel=rec.get("channel");channel.uuid!=me.curChannel.uuid&&(me.curChannel=channel,me.refreshProgram())},itemdblclick:function(list,rec,item,idx){var channel=rec.get("channel");me.curChannel=channel,me.curViewedChannel=channel,me.playerPanel.zap(rec),Ext.state.Manager.set(Fbx.os.app.tv.app.lastWatchedProp,{uuid:rec.get("uuid")})}}}),me.toolbar=Ext.create("Ext.toolbar.Toolbar",{defaults:{scale:"medium"},dock:"top",items:[{xtype:"button",iconCls:"btn-24-epg",text:"Guide des programmes",handler:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.epg.app")}},{xtype:"button",iconCls:"btn-24-pvr",text:"Gérer les enregistrements",handler:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.pvr.app")}},{xtype:"button",tooltip:"Paramètres",text:"Paramètres",iconCls:"btn-24-setting-tools",handler:function(){me.showSettings()}}]}),me.win=Ext.create("Ext.panel.Panel",{stateful:!0,stateId:"tv-mainpanel",layout:{type:"border"},dockedItems:[me.toolbar],items:[me.epgPanel,me.channelList,me.playerPanel]}),me.mainWindow.add(me.win),this.callParent()},refreshProgram:function(){var me=this,prog=me.epgStore.getCurrentProgramForChannel(me.curChannel.uuid);me.epgPanel.setProgram(me.curChannel,prog)},refresh:function(){this.channelList.refresh()},showSettings:function(){var me=this;me.settingsWin||(me.settingsForm=Ext.create("Fbx.os.app.tv.Settings"),me.settingsWin=Ext.create("Ext.window.Window",{closeAction:"hide",height:300,width:600,resizable:!1,layout:"fit",title:"Paramètres TV",modal:!0,border:0,padding:0,items:[me.settingsForm],listeners:{}})),me.settingsWin.show()}});Ext.define("Fbx.os.app.settings.wifi.WifiGuest",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.data.Store","Fbx.os.app.settings.wifi.WifiCustomKeyModel","Fbx.os.app.settings.wifi.WifiGuestEditor","Ext.grid.Panel"],statics:{defaultName:"Wi-Fi Invité",defaultWidth:800,defaultHeight:600,allowMultipleInstance:!1,disabledInBridge:!0,modal:!0},launch:function(){var me=this;me.ckStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.wifi.WifiCustomKeyModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"start_date",direction:"DESC"}],pageSize:0}),me.grid=Ext.create("Ext.grid.Panel",{store:me.ckStore,viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun accès Wi-Fi invité</div>'},dockedItems:[{xtype:"toolbar",items:[{text:"Créer un accès Wi-Fi invité",iconCls:"btn-add",handler:function(){me.showWifiGuestEditor()}},{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.ckStore.load()}}]}],columns:[{dataIndex:"id",text:"Id",width:25},{dataIndex:"description",text:"Description",flex:1},{dataIndex:"params_str",text:"Paramètres",flex:1},{dataIndex:"users_str",text:"Utilisateurs",flex:1},{dataIndex:"expire_date",text:"Expiration",flex:1},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-qrcode",tooltip:"QR Code",handler:function(grid,rowIndex,colIndex){var rec=grid.getStore().getAt(rowIndex);me.showCustomKeyQrCode(rec)}}]},{xtype:"actioncolumn",width:30,items:[{iconCls:"btn-delete",tooltip:"Supprimer",handler:function(grid,rowIndex,colIndex){grid.getStore().getAt(rowIndex).destroy()}}]}],listeners:{itemdblclick:function(grid,record,item,index,e,eOpts){me.showCustomKeyQrCode(record)}}}),me.mainWindow.add(me.grid),me.callParent(arguments),me.ckStore.load(),me.loadApParams()},showCustomKeyQrCode:function(record){var me=this;if(me.bssParams){var canvasId="qrcode-canvas-"+Math.ceil(1e5*Math.random());Ext.Msg.alert("Code wifi invité",'<div style="text-align: center; width: 250px; margin: 0 auto;"><strong>Accès Wi-Fi invité</strong><br /><br /><div style="margin: 10px 0;">Depuis un smartphone, vous pouvez scanner ce QR Code pour vous connecter</div><div><canvas id=\''+canvasId+"'></canvas></div><br /><div>SSID: "+Ext.String.htmlEncode(me.bssParams.ssid)+"</div><div>Mot de passe: "+Ext.String.htmlEncode(record.data.params.key)+"</div><div>Expire: "+record.get("expire_date")+"</div><div>"+record.get("params_str")+"</div></div>");var canvas=document.getElementById(canvasId);Fbx.os.lib.FbxUtils.genWifiQrCode(me.bssParams.encryption,me.bssParams.ssid,record.data.params.key,me.bssParams.hide_ssid,canvas)}},showWifiGuestEditor:function(){var me=this;me.editor||(me.editor=Ext.create("Fbx.os.app.settings.wifi.WifiGuestEditor",{closeAction:"hide"}),me.editor.wifiGuest=me,me.editor.on("close",function(){me.ckStore.load()})),me.editor.loadValues({key:"",max_use_count:100,access_type:"full",duration:86400,description:""}),me.editor.show()},loadApParams:function(){var me=this;me.loadingAp||(me.loadingAp=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/ap/",method:"GET",callback:function(){me.loadingAp=!1,me.loadBssParams()},success:function(response){me.apsParams=response.jsonData.result}}))},loadBssParams:function(){var me=this;me.loadingBss||(me.loadingBss=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/bss/",method:"GET",callback:function(){me.loadingBss=!1},success:function(response){var bsss=response.jsonData.result;for(var i in bsss){var bss=bsss[i],params=bss.use_shared_params?bss.shared_bss_params:bss.bss_params;if(params.enabled)if(me.bssParams){var phy=me.apsParams[bss.phy_id];if(!phy)continue;"2d4g"===phy.config.band&&(me.bssParams=params)}else me.bssParams=params}me.bssParams||(Ext.Msg.alert("Wifi désactivé","Votre réseau personnel doit être activé"),me.close())}}))}});Ext.define("Fbx.os.app.settings.AirMedia",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel"],statics:{defaultName:"Multimédia / AirMedia",defaultWidth:450,defaultHeight:145,allowMultipleInstance:!1,disabledInBridge:!0,modal:!0,docSection:"doc/index.html#configurer-air-media"},launch:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"airmedia/config/",bodyPadding:10,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkboxfield",fieldLabel:"Activer AirMedia",name:"enabled",boxLabel:"",ttip:"AirMedia vous permet d'envoyer du contenu multimédia à votre Freebox",listeners:{change:function(field,newVal){me.form.getForm().findField("password").setDisabled(!newVal)}}},{xtype:"textfield",fieldLabel:"Mot de passe AirMedia",inputType:"password",name:"password",ttip:"(Optionnel) Ce mot de passe vous sera demandé pour pouvoir envoyer du contenu sur votre Freebox.",boxLabel:""}],listeners:{saved:function(){Fbx.os.gui.Environment.fireEvent("toogleneedrefresh")}}}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"})}});Ext.define("Fbx.os.app.quickstart.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.panel.Panel","Ext.layout.container.Card","Ext.container.Container","Ext.ux.IFrame","Ext.button.Button","Ext.XTemplate"],statics:{defaultName:"Premiers pas",defaultWidth:600,defaultHeight:570,allowMultipleInstance:!1,disableAnimation:!0,isOpenBar:!0,lastSeenProperty:"quickstart-lastseen",shouldLaunch:function(lastSeen){return!!Fbx.os.gui.Environment.isLogged&&(0==lastSeen||Fbx.os.app.quickstart.app.steps.length>lastSeen)},steps:[{title:"Bienvenue dans votre Freebox.",app:"",centerImg:"wizard_001.jpg",desc:"Depuis cet espace, consultez les informations relatives à votre connexion et gérez les différents services de votre Freebox : Wi-Fi, téléchargements, contrôle parental, téléphonie, etc."},{title:"Navigation générale",app:"",centerImg:"wizard_002.gif",desc:"<div>La navigation dans cet espace se fait comme sur votre ordinateur : double-cliquez sur une icône pour entrer dans l'application.</div><div>Chaque fenêtre qui s'ouvre peut être agrandie, réduite, fermée à l'aide de votre souris.</div><div>Un clic droit sur la souris vous offre une liste d'actions possibles pour l'élément sélectionné.</div>"},{title:"Navigation générale",app:"",centerImg:"wizard_003.gif",desc:'<div>Le bouton Free en bas à gauche offre un autre moyen d\'accéder aux rubriques proposées dans cet espace.</div><div>A droite, l\'icône <img src="resources/images/quickstart/wifi-toggle-on.png" style="width: 16px; height: 16px;" alt="icone wifi"/> permet de désactiver/activer votre réseau Wi-Fi.</div><div>Enfin, une aide est disponible pour chaque rubrique, accessible simplement via l\'icône <img src="resources/images/quickstart/help.png" style="width: 16px; height: 16px;" alt="icone aide"/></div>'},{title:"État de la Freebox",app:"Fbx.os.app.settings.ConnectionStatus",centerImg:"wizard_004.gif",desc:'<div>L\'application « État de la Freebox » vous permet d’obtenir les principales informations relatives à votre Freebox et à sa connexion Internet :</div><div class="quickstart-list">&bull; diagnostics du système et des services,<br />&bull; état de votre connexion,<br />&bull; courbes de débit.<br /></div>'},{title:"Explorateur de fichiers",app:"Fbx.os.app.explorer.app",centerImg:"wizard_005.gif",desc:'<div>L\'« Explorateur de fichiers » vous permet de gérer le contenu de votre Freebox :</div><div class="quickstart-list">&bull; copier, déplacer, renommer, supprimer des fichiers,<br />&bull; regarder une vidéo ou une photo stockée sur votre Freebox,<br />&bull; transférer des fichiers entre votre ordinateur et votre Freebox,<br />&bull; partager simplement un contenu stocké sur votre Freebox.<br /></div><div>De plus, vous pourrez accéder au contenu de votre Freebox à distance.</div>'},{title:"Téléchargements",app:"Fbx.os.app.downloader.app",centerImg:"wizard_006.gif",desc:"<div>L'application « Téléchargements » vous permet de télécharger des fichiers sur votre Freebox (BitTorrent, Newsgroups, HTTP et FTP) sans devoir laisser votre ordinateur allumé.</div><div>Il est aussi possible de s'abonner à des flux RSS et de télécharger automatiquement les épisodes de vos podcasts.</div>"},{title:"Contacts",app:"Fbx.os.app.contacts.app",centerImg:"wizard_007.gif",desc:"<div>L'application « Contacts » vous permet de gérer vos contacts sur la Freebox. Ils sont notamment utilisés pour afficher le nom de votre correspondant lors d'un appel.</div><div>Vous pouvez importer les contacts de vos différents carnets d’adresses (vcf, csv, ldif).</div>"},{title:"Journal d’appels",app:"Fbx.os.app.calls.app",centerImg:"wizard_008.gif",desc:"<div>Le « Journal d'appels » vous permet de consulter l'historique des appels émis, reçus ou manqués.</div><div>Le nom ou le pseudonyme de votre correspondant est affiché en utilisant votre base de contacts.</div>"},{title:"Contrôle parental",app:"Fbx.os.app.settings.ParentalFilterConfig",centerImg:"wizard_009.gif",desc:"<div>L'application « Contrôle parental » vous permet de restreindre l'accès internet en fonction de plages horaires données.</div><div>Vous pouvez définir des règles spécifiques pour chacun de vos périphériques, ou groupe de périphériques.</div>"},{title:"Paramètres de la Freebox",app:"Fbx.os.app.settings.app",centerImg:"wizard_010.gif",desc:"<div>L'application « Paramètres de la Freebox » vous permet :</div><div class=\"quickstart-list\">&bull; de configurer les fonctionnalités principales à l'aide d'assistants,<br />&bull; d'accéder aux réglages avancés de votre Freebox.<br /></div>"},{title:"Plus d'informations",app:"Fbx.os.app.help.app",centerImg:"wizard_011.gif",desc:"<div>Une aide complète est disponible pour chaque application. Vous y retrouverez le détail de toutes les fonctionnalités de votre Freebox.</div>"},{title:"Freebox OS version 2.1",app:"",centerImg:"wizard_v2_1.jpg",desc:'<div><strong>Freebox OS passe en version 2.1 !</strong></div><div>Parmi les nouveautés de la version 2.1, vous retrouverez :</div><div class="quickstart-list">&bull; un nouvel utilitaire de configuration Wi-Fi,<br />&bull; un client VPN,<br />&bull; un serveur VPN.<br /></div><div>Découvrez ces nouveautés dans les écrans suivants.</div>'},{title:"Radar Wi-Fi",app:"Fbx.os.app.settings.wifi.Wifi",centerImg:"wizard_012.gif",desc:"<div>L'application configuration Wi-Fi dispose maintenant d'une fonctionalité <strong>radar</strong> qui vous permet de visualiser la liste des points d'accès Wi-Fi à proximité de votre Freebox.</div><div>Vous aurez alors la possibilité de :</div><div class=\"quickstart-list\">&bull; choisir manuellement la canal Wi-Fi le moins encombré,<br />&bull; laisser la Freebox choisir automatiquement le meilleur canal.</div>"},{title:"Serveur VPN",app:"Fbx.os.app.settings.VpnServer",centerImg:"wizard_013.gif",desc:"<div>Le serveur VPN vous permet de vous connecter de manière sécurisée à votre Freebox pour :</div><div class=\"quickstart-list\">&bull; acheminer votre trafic via votre connexion Freebox,<br />&bull; accéder à votre réseau local depuis n'importe où</div><div>L'application vous permet de gérer la liste des utilisateurs pouvant se connecter à votre VPN</div>"},{title:"Client VPN",app:"Fbx.os.app.settings.VpnClient",centerImg:"wizard_014.jpg",desc:"<div>Le client VPN vous permet d'acheminer le trafic de certaines applications de la Freebox en utilisant une connexion VPN.</div><div>L'application vous permet de sélectionner la connexion à utiliser parmi les  serveurs VPN que vous aurez configurés.</div><div>La Freebox prend en charge les serveurs PPTP et OpenVPN</div>"},{title:"Freebox OS version 3.0",app:"",centerImg:"wizard_v3_0.jpg",desc:'<div><strong>Freebox OS passe en version 3.0 !</strong></div><div>Parmi les nouveautés de la version 3.0, vous retrouverez :</div><div class="quickstart-list">&bull; une application permettant de regarder la TV,<br />&bull; un gestionnaire d\'enregistrements TV,<br />&bull; le guide des programmes Freebox TV,<br />&bull; un mode invité vous permettant de regarder la tv sans vous identifier.<br /></div><div>Découvrez ces nouveautés dans les écrans suivants.</div>'},{title:"Application TV",app:"Fbx.os.app.tv.app",centerImg:"wizard_015.jpg",desc:"<div>L'application TV vous permet de regarder les chaînes du bouquet Freebox directement depuis votre navigateur.</div>"},{title:"Guide des programmes Freebox TV",app:"Fbx.os.app.pvr.app",centerImg:"wizard_016.gif",desc:"<div>Le guide des programmes vous permet de visualiser les programmes des chaînes de TV Freebox.</div><div>Vous pouvez programmer facilement un enregistrement à partir du guide des programmes  en cliquant sur la description du programme.</div><div>Un mode soirée vous permet de consulter rapidement les programmes de la soirée.</div>"},{title:"Freebox OS version 3.3",app:"Fbx.os.app.settings.domains.DomainWizard",centerImg:"wizard_v3_3.jpg",desc:"<div><strong>Freebox OS passe en version 3.3 !</strong></div><div>Avec cette version vous avez maintenant la possibilité de :</div><div class=\"quickstart-list\">&bull; choisir un nom de domaine personnalisé pour l'accès à distance,<br />&bull; obtenir un certificat TLS pour activer l'accès sécurisé (HTTPS) à Freebox OS,<br />&bull; importer votre certificat TLS<br /></div>"}]},winConfig:{resizable:!1,maximizable:!1,minimizable:!1,stateful:!1},gotoPage:function(page){var me=this;me.panel.getLayout().setActiveItem(page),me.updateBtn()},updateBtn:function(){var me=this,layout=me.panel.getLayout();me.btnPrev.setDisabled(!layout.getPrev()),layout.getNext()?(me.btnNext.setIconCls("btn-next"),me.btnNext.setText("Suivant")):(me.btnNext.setIconCls("btn-accept"),me.btnNext.setText("Terminer"))},launch:function(lastSeen){var me=this,tpl=new Ext.XTemplate('<div class="quickstart-step">  <div class="quickstart-title">{title}</div>  <div class="quickstart-desc">    {desc}    <tpl if="app != \'\'">      <div class="quickstart-launch"><a href="javascript:Fbx.os.core.TaskManager.startApplication(\'{app}\');">Lancer l\'application</a></div>    </tpl>  </div>  <img class="quickstart-img" src="resources/images/quickstart/{centerImg}" alt="" /></div>'),items=[];Ext.Array.each(Fbx.os.app.quickstart.app.steps,function(s){var c=Ext.create("Ext.container.Container",{html:" ",listeners:{boxready:function(){c.getEl().dom.innerHTML=tpl.apply(s)}}});Ext.Array.push(items,c)}),me.btnPrev=Ext.create("Ext.button.Button",{text:"Précédent",width:100,iconCls:"btn-previous",disabled:!0,handler:function(){var layout=me.panel.getLayout();layout.getPrev()&&(layout.prev(),me.updateBtn())}}),me.btnNext=Ext.create("Ext.button.Button",{text:"Suivant",width:100,iconCls:"btn-next",iconAlign:"right",handler:function(){var layout=me.panel.getLayout();layout.getNext()?(layout.next(),me.updateBtn()):me.mainWindow.close()}}),me.panel=Ext.create("Ext.panel.Panel",{cls:"quickstart-panel",layout:{type:"card"},items:items,buttons:[me.btnPrev,"->",me.btnNext],listeners:{boxready:function(){lastSeen&&me.gotoPage(lastSeen)}}}),this.mainWindow.add(me.panel),me.callParent(arguments),me.asked=!1,me.mainWindow.on("beforeclose",function(){if(!me.asked)return Ext.Msg.confirm("Démarrage rapide","Voulez-vous que cette présentation s'ouvre lors de votre prochaine visite ?",function(btn){me.asked=!0,me.mainWindow.close(),lastSeen="yes"==btn?0:Fbx.os.app.quickstart.app.steps.length,Fbx.os.gui.Environment.getStateProvider().set(Fbx.os.app.quickstart.app.lastSeenProperty,{lastSeen:lastSeen})}),!1})}});Ext.define("Fbx.os.app.settings.ConnectionStatus",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.layout.component.FieldSet","Ext.layout.container.Column","Ext.form.Panel","Ext.tab.Panel","Ext.grid.column.Date","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.SizeDisplay","Fbx.ux.form.field.EnumDisplay","Ext.form.field.Checkbox","Fbx.os.gui.grid.column.EnumColumn","Fbx.os.gui.chart.FlotRrdChart","Fbx.os.lib.FbxUtils","Fbx.os.app.settings.ConnectionHistory","Fbx.os.app.settings.ConnectionStatusXdsl","Ext.panel.Panel","Ext.form.FieldSet","Fbx.ux.form.AjaxFormPanel","Ext.data.Store","Fbx.os.app.settings.ExpModuleStatus"],statics:{defaultName:"État de la Freebox",defaultWidth:800,defaultHeight:500,allowMultipleInstance:!1,docSection:"doc/index.html#etat-de-la-freebox"},launch:function(){var me=this;me.downChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"net",flex:1,fields:[{name:"bw_down",label:"Débit maximum",color:"#115fa6"},{name:"rate_down",label:"Débit internet",color:"#94ae0a",lines:{fill:!0}}],yaxes:[{min:0,axisLabel:"Download",unit:"o/s"}],isRate:!0,autoRefresh:!0,precision:10,period:3600,suspendRefresh:!0,nbPointMax:0,legendPosition:"nw",area:!0}),me.upChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"net",flex:1,fields:[{name:"bw_up",label:"Débit maximum",color:"#115fa6"},{name:"rate_up",label:"Débit internet",lines:{fill:!0},color:"#a61120"}],yaxes:[{min:0,axisLabel:"Upload",unit:"o/s"}],isRate:!0,autoRefresh:!0,precision:10,period:3600,suspendRefresh:!0,nbPointMax:0,legendPosition:"nw",area:!0}),me.tabChart=Ext.create("Ext.panel.Panel",{title:"Courbes de Débit",layout:{align:"stretch",type:"vbox"},buttons:[{xtype:"button",text:"Heure",handler:function(){me.tabChart.setPeriod(3600)}},{xtype:"button",text:"Jour",handler:function(){me.tabChart.setPeriod(86400)}},{xtype:"button",text:"Semaine",handler:function(){me.tabChart.setPeriod(604800)}},{xtype:"button",text:"Mois",handler:function(){me.tabChart.setPeriod(2592e3)}}],items:[me.downChart,me.upChart],listeners:{beforehide:function(){me.downChart.suspendRefresh=!0,me.upChart.suspendRefresh=!0},beforeshow:function(){me.downChart.suspendRefresh=!1,me.upChart.suspendRefresh=!1,me.downChart.loadData(),me.upChart.loadData()}},setPeriod:function(period){me.downChart.setPeriod(period),me.upChart.setPeriod(period)}}),me.dslStatus=Ext.create("Ext.form.FieldSet",{flex:1,defaults:{labelWidth:200,anchor:"100%"},title:"État de la connexion xDSL",items:[{xtype:"enumdisplayfield",fieldLabel:"État de la ligne",strings:{down:"Désynchronisée",training:"Synchronisation en cours 1/4",started:"Synchronisation en cours 2/4",chan_analysis:"Synchronisation en cours 3/4",msg_exchange:"Synchronisation en cours 4/4",showtime:"Synchronisée",disabled:"Désactivée"},tpl:'<div class="xdsl-status xdsl-status-{val}">{valStr}</div>',name:"xdsl_status",ttip:"État de votre ligne xDSL"},{xtype:"enumdisplayfield",fieldLabel:"Protocole",strings:{t1413:"T1.413",adsl1_a:"ADSL",adsl2_a:"ADSL2",adsl2plus_a:"ADSL2+",readsl2:"ReachDSL",adsl2_m:"ADSL2 annex M",adsl2plus_m:"ADSL2+ annex M",vdsl2_8a:"VDSL",vdsl2_8b:"VDSL",vdsl2_8c:"VDSL",vdsl2_8d:"VDSL",vdsl2_12a:"VDSL",vdsl2_12b:"VDSL",vdsl2_17a:"VDSL",vdsl2_30a:"VDSL",unknown:"Inconnu"},name:"xdsl_protocol"},{xtype:"templateddisplayfield",name:"xdsl_uptime",fieldLabel:"Synchro depuis",tpl:"{[Fbx.os.lib.FbxUtils.formatDuration(values.val)]}",ttip:"Durée depuis laquelle votre ligne xDSL fonctionne sans déconnexion"}]}),me.ftthStatus=Ext.create("Ext.form.FieldSet",{flex:2,defaults:{labelWidth:200,anchor:"100%"},title:"État de la connexion FTTH",itemId:"ftthStatus",items:[{xtype:"enumdisplayfield",fieldLabel:"Type de connexion",strings:{p2p:"Point à point",pon:"PON"},name:"ftth_link_type"},{xtype:"templateddisplayfield",name:"ftth_link",fieldLabel:"Etat du lien",tpl:'<div class="ftth-status ftth-status-{val}">  <tpl if="val">Up</tpl><tpl if="!val">Down</tpl></div>'},{xtype:"templateddisplayfield",name:"ftth_sfp_present",fieldLabel:"Module Présent",tpl:'<tpl if="val">Oui</tpl><tpl if="!val">Non</tpl>'},{xtype:"templateddisplayfield",name:"ftth_sfp_has_signal",fieldLabel:"Signal",tpl:'<tpl if="val">Présent</tpl><tpl if="!val">Non détecté</tpl>'},{xtype:"templateddisplayfield",name:"ftth_sfp_alim_ok",fieldLabel:"Alimentation",tpl:'<tpl if="val">OK</tpl><tpl if="!val">Défectueux</tpl>'},{xtype:"displayfield",fieldLabel:"Marque SFP",name:"ftth_sfp_vendor"},{xtype:"displayfield",fieldLabel:"Modèle SFP",name:"ftth_sfp_model"},{xtype:"displayfield",fieldLabel:"Numéro de série du SFP",name:"ftth_sfp_serial"},{xtype:"templateddisplayfield",fieldLabel:"Puissance Reçue",name:"ftth_sfp_pwr_rx",tpl:'<tpl if="val">{[values.val / 100]} dBm</tpl><tpl if="!val">N/A</tpl>'},{xtype:"templateddisplayfield",fieldLabel:"Puissance Transmise",name:"ftth_sfp_pwr_tx",tpl:'<tpl if="val">{[values.val / 100]} dBm</tpl><tpl if="!val">N/A</tpl>'}]}),me.tabStatus=Ext.create("Ext.form.Panel",{layout:{align:"stretch",type:"hbox"},title:"État Internet",items:[{flex:1,xtype:"fieldset",defaults:{labelWidth:200,anchor:"100%"},title:"État de la connexion Internet",items:[{xtype:"enumdisplayfield",fieldLabel:"État de la connexion",strings:{up:"Connectée",down:"Déconnectée",going_down:"Déconnexion en cours",going_up:"Connexion en cours"},name:"state",tpl:'<div class="conn-status conn-status-{val}">{valStr}</div>'},{xtype:"enumdisplayfield",fieldLabel:"Type de connexion",strings:{xdsl:"xDSL",ftth:"FTTH"},name:"media"},{xtype:"displayfield",fieldLabel:"Adresse IPv4",name:"ipv4_str"},{xtype:"displayfield",fieldLabel:"Adresse IPv6",name:"ipv6"},{xtype:"sizedisplayfield",fieldLabel:"Reçu",name:"bytes_down"},{xtype:"sizedisplayfield",fieldLabel:"Émis",name:"bytes_up"},{xtype:"templateddisplayfield",fieldLabel:"Débit IP internet descendant",name:"rate_down",tpl:"{[Fbx.os.lib.FbxUtils.rateBits(values.val * 8)]} ({[Fbx.os.lib.FbxUtils.rate(values.val)]})",ttip:"Débit actuellement utilisé pour recevoir des données depuis internet"},{xtype:"templateddisplayfield",fieldLabel:"Débit IP internet montant",name:"rate_up",tpl:"{[Fbx.os.lib.FbxUtils.rateBits(values.val * 8)]} ({[Fbx.os.lib.FbxUtils.rate(values.val)]})",ttip:"Débit actuellement utilisé pour envoyer des données sur internet"},{xtype:"templateddisplayfield",fieldLabel:"Débit IP descendant (Max)",name:"bandwidth_down",tpl:"{[Fbx.os.lib.FbxUtils.rateBits(values.val)]} ({[Fbx.os.lib.FbxUtils.rate(values.val / 8)]})",ttip:"Débit maximum disponible sur votre Freebox pour recevoir des données depuis internet"},{xtype:"templateddisplayfield",fieldLabel:"Débit IP montant (Max)",name:"bandwidth_up",tpl:"{[Fbx.os.lib.FbxUtils.rateBits(values.val)]} ({[Fbx.os.lib.FbxUtils.rate(values.val / 8)]})",ttip:"Débit maximum disponible sur votre Freebox pour envoyer des données sur internet"}]},{xtype:"container",margin:"0 0 0 5",layout:{align:"stretch",type:"vbox"},flex:1,items:[me.dslStatus,me.ftthStatus]}]}),me.expModules=[Ext.create("Fbx.os.app.settings.ExpModuleStatus",{module_id:0}),Ext.create("Fbx.os.app.settings.ExpModuleStatus",{module_id:1})],me.expStatus=Ext.create("Fbx.ux.form.AjaxFormPanel",{disableLoadMask:!0,url:FbxConf.apiBaseUrl+"system/",layout:{align:"stretch",type:"vbox"},title:"Modules d'extension",items:[{height:210,xtype:"displayfield",name:"box_display"},{xtype:"container",flex:1,layout:{align:"stretch",type:"hbox"},items:me.expModules}],listeners:{beforeshow:function(){me.expStatus.load()},loaded:function(f,res){var box_display='<div style="width: 800px; height: 208px; margin: 0 auto; position: relative;">  <img style="width: 800px; height: 208px; position: absolute; top: 0; left: 0;" src="resources/images/fbx/gw_back_v7_empty.png" alt="vue arrière box v7"/>';res.expansions[0].probe_done&&(box_display+='<img style="width: 800px; height: 208px; position: absolute; top: 0; left: 0;" src="resources/images/fbx/gw_back_v7_'+res.expansions[0].type+'_0.png" />'),res.expansions[1].probe_done&&(box_display+='<img style="width: 800px; height: 208px; position: absolute; top: 0; left: 0;" src="resources/images/fbx/gw_back_v7_'+res.expansions[1].type+'_1.png" />'),box_display+="</div>";var form=f.getForm();form.findField("box_display").setValue(box_display),me.expModules.forEach(function(m){m.updateDisplay(form,res.expansions)})}}}),me.tabHistory=Ext.create("Fbx.os.app.settings.ConnectionHistory",{bodyPadding:0,layout:"fit",title:"Historique",viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun historique de connexion</div>',getRowClass:function(record,rowIndex,rowParams,store){return"connection-status-"+record.get("state")}}}),me.dslStats=Ext.create("Ext.form.Panel",{layout:{align:"stretch",type:"hbox"},suspendRefresh:!0,title:"Stats xDSL",itemId:"statsXdsl",items:[Ext.create("Fbx.os.app.settings.ConnectionStatusXdsl",{flex:1,fieldPfx:"down_",title:"Voie descendante",margin:{right:2}}),Ext.create("Fbx.os.app.settings.ConnectionStatusXdsl",{flex:1,fieldPfx:"up_",title:"Voie montante",margin:{left:2}})]}),me.snrChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"dsl",flex:1,fields:[{name:"snr_up",label:"Upload",color:"#a61120"},{name:"snr_down",label:"Download",color:"#94ae0a"}],yaxes:[{min:0,axisLabel:"Marge de bruit",unit:"dB"}],autoRefresh:!0,precision:1,valueScale:10,period:3600,suspendRefresh:!0,nbPointMax:0,legendPosition:"sw"}),me.synchroChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"dsl",flex:1,fields:[{name:"rate_up",label:"Upload",color:"#a61120"},{name:"rate_down",label:"Download",color:"#94ae0a"}],yaxes:[{min:0,axisLabel:"Débit brut",tickDecimals:1,unit:"Mb/s"}],autoRefresh:!0,precision:1,valueScale:1e3,period:3600,suspendRefresh:!0,nbPointMax:0,legendPosition:"sw"}),me.tabDslGraph=Ext.create("Ext.panel.Panel",{title:"Courbes xDSL",itemId:"tabDslGraph",layout:{align:"stretch",type:"vbox"},buttons:[{xtype:"button",text:"Heure",handler:function(){me.tabDslGraph.setPeriod(3600)}},{xtype:"button",text:"Jour",handler:function(){me.tabDslGraph.setPeriod(86400)}},{xtype:"button",text:"Semaine",handler:function(){me.tabDslGraph.setPeriod(604800)}},{xtype:"button",text:"Mois",handler:function(){me.tabDslGraph.setPeriod(2592e3)}}],items:[me.snrChart,me.synchroChart],listeners:{beforehide:function(){me.snrChart.suspendRefresh=!0,me.synchroChart.suspendRefresh=!0},beforeshow:function(){me.snrChart.suspendRefresh=!1,me.snrChart.loadData(),me.synchroChart.suspendRefresh=!1,me.synchroChart.loadData()}},setPeriod:function(period){me.snrChart.setPeriod(period),me.synchroChart.setPeriod(period)}});var loadTelStatus=function(){me.diagTab&&me.diagTab.isVisible()&&!me.telLoading&&(me.telLoading=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"phone/config/",method:"GET",silentError:!0,success:function(response){var res=response.jsonData.result,phoneStatus="",needReload=!1;switch(res.network){case"starting":needReload=!0,phoneStatus='<span style="color: orange;">Démarrage en cours</span>';break;case"working":phoneStatus='<span style="color: green;">OK</span>';break;case"unconfigured":needReload=!0,phoneStatus='<span style="color: red;">Service téléphonique non configuré</span>'}var form=me.diagTab.getForm();form&&(form.setValues({phone:phoneStatus}),needReload&&setTimeout(function(){loadTelStatus()},Fbx.os.gui.Environment.accessibilityMode?1e4:2e3))},callback:function(){me.telLoading=!1},failure:function(response){me.mainWindow&&me.mainWindow.isVisible()&&me.diagTab.getForm().setValues({phone:'<span style="color: red;">Erreur</span>'})}}))},loadConnStatus=function(){me.diagTab&&me.diagTab.isVisible()&&!me.connStatusLoading&&(me.connStatusLoading=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"connection",method:"GET",success:function(response){var res=response.jsonData.result,connStatus="up"===res.state?'<span style="color: green;">OK</span>':'<span style="color: red;">Connexion indisponible</span>';me.diagTab.getForm().setValues({net:connStatus}),setTimeout(function(){loadConnStatus()},Fbx.os.gui.Environment.accessibilityMode?1e4:2e3)},callback:function(){me.connStatusLoading=!1}}))},loadServicesStatus=function(){loadTelStatus(),loadConnStatus(),me.diagTab.down("ajaxform").load()};me.sensorFields=Ext.create("Ext.form.FieldSet",{title:"Température",layout:"column",margin:0,padding:"0 10 5 10",items:[{xtype:"container",layout:"vbox",width:"33.3%"},{xtype:"container",layout:"vbox",width:"33.3%"},{xtype:"container",layout:"vbox",width:"33.3%"}]}),me.fanFields=Ext.create("Ext.form.FieldSet",{title:"Ventilateur",layout:"column",margin:0,padding:"0 10 5 10",items:[{xtype:"container",layout:"vbox",width:"50%"},{xtype:"container",layout:"vbox",width:"50%"}]}),me.diagTab=Ext.create("Ext.form.Panel",{title:"Diagnostic",bodyPadding:10,items:[{xtype:"container",layout:"hbox",height:155,defaults:{height:"100%"},items:[{xtype:"fieldset",title:"Système",flex:1,margin:"0 5 0 0",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"ajaxform",url:FbxConf.apiBaseUrl+"system/",showApplyCancel:!1,showOkBtn:!1,disableLoadMask:!0,border:0,defaults:{anchor:"100%",labelWidth:160},items:[{xtype:"displayfield",name:"firmware_version",fieldLabel:"Version du micrologiciel"},{xtype:"displayfield",fieldLabel:"Version du matériel",name:"model_info.pretty_name"},{xtype:"displayfield",name:"mac",fieldLabel:"Adresse MAC"},{xtype:"displayfield",name:"serial",fieldLabel:"Numéro de série"},{xtype:"displayfield",name:"uptime",fieldLabel:"Allumée depuis"}],listeners:{loaded:function(form,values){var ajaxForm=me.diagTab.down("ajaxform"),sensors=values.sensors,cols=me.sensorFields.items;cols.each(function(c){c.removeAll()}),sensors.sort(function(a,b){return a.name>b.name});var idx=0,col=0,nb_per_col=Math.ceil(sensors.length/cols.length);Ext.Array.each(sensors,function(s){var f=Ext.create("Fbx.ux.form.field.TemplatedDisplay",{name:"sensor_values_"+s.id,fieldLabel:s.name,tpl:"{val} °C",labelWidth:190,value:s.value});idx===nb_per_col*(col+1)&&++col,cols.items[col].add(f),++idx});var fans=values.fans;cols=me.fanFields.items,cols.each(function(c){c.removeAll()}),fans.sort(function(a,b){return a.name>b.name}),idx=0,col=0,nb_per_col=Math.ceil(fans.length/cols.length),Ext.Array.each(fans,function(s){var f=Ext.create("Fbx.ux.form.field.TemplatedDisplay",{name:"fan_values_"+s.id,fieldLabel:s.name,tpl:"{val} Tours/min",margin:"0 15 0 0",labelWidth:200,value:s.value});idx===nb_per_col*(col+1)&&++col,cols.items[col].add(f),++idx}),ajaxForm.autoInterval||(ajaxForm.autoInterval=setInterval(function(){ajaxForm.isVisible()?ajaxForm.load():(clearInterval(ajaxForm.autoInterval),ajaxForm.autoInterval=void 0)},Fbx.os.gui.Environment.accessibilityMode?1e4:1e3)),me.diagTab.getForm().setValues({box_authenticated:values.box_authenticated})},hide:function(){var ajaxForm=me.diagTab.down("ajaxform");ajaxForm.autoInterval&&(clearInterval(ajaxForm.autoInterval),ajaxForm.autoInterval=void 0)}}}]},{xtype:"fieldset",title:"Services",flex:1,margin:"0 0 0 5",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"templateddisplayfield",fieldLabel:"Connexion internet",name:"net",value:"Tests en cours",tpl:"{val}"},{xtype:"templateddisplayfield",fieldLabel:"Authentification",name:"box_authenticated",tpl:'<tpl if="val"><span style="color: green;">OK</span></tpl><tpl if="!val"><span style="color: red;">Non</span></tpl>'},{xtype:"templateddisplayfield",fieldLabel:"Téléphonie",name:"phone",value:"Tests en cours",tpl:"{val}"}]}]},me.sensorFields,me.fanFields],listeners:{boxready:function(){loadServicesStatus()},beforeshow:function(){loadServicesStatus()}}});var tempFields=[];Ext.Array.each(Fbx.os.gui.Environment.systemInfos.sensors,function(s){tempFields.push({name:s.id,label:s.name})}),Ext.Array.each(Fbx.os.gui.Environment.systemInfos.fans,function(s){tempFields.push({name:s.id,label:s.name,yaxis:2})}),tempFields.sort(function(a,b){return a.label<b.label?1:-1}),me.tempChart=Ext.create("Fbx.os.gui.chart.FlotRrdChart",{db:"temp",autoRefresh:!0,precision:10,period:3600,suspendRefresh:!0,flex:1,fields:tempFields,yaxes:[{min:0,axisLabel:"Température °C",unit:"°C"},{min:0,position:"right",axisLabel:"Tours par minute",unit:"RPM"}]}),me.tabTempGraph=Ext.create("Ext.panel.Panel",{title:"Courbes de température",layout:{align:"stretch",type:"vbox"},buttons:[{xtype:"button",text:"Heure",handler:function(){me.tabTempGraph.setPeriod(3600)}},{xtype:"button",text:"Jour",handler:function(){me.tabTempGraph.setPeriod(86400)}},{xtype:"button",text:"Semaine",handler:function(){me.tabTempGraph.setPeriod(604800)}},{xtype:"button",text:"Mois",handler:function(){me.tabTempGraph.setPeriod(2592e3)}}],items:[me.tempChart],listeners:{beforehide:function(){me.tempChart.suspendRefresh=!0},beforeshow:function(){me.tempChart.suspendRefresh=!1,me.tempChart.loadData()}},setPeriod:function(period){me.tempChart.setPeriod(period)}});var refreshLteTimer,refreshLte=function(){refreshLteTimer&&clearTimeout(refreshLteTimer),refreshLteTimer=setTimeout(function(){me.lteInfos.isVisible()&&(me.lteInfos.isDirty()?refreshLte():me.lteInfos.load())},1e3)};me.lteInfos=Ext.create("Fbx.ux.form.AjaxFormPanel",{title:"xDSL + 4G",bodyPadding:10,disableLoadMask:!0,url:FbxConf.apiBaseUrl+"connection/lte/config",items:[{xtype:"container",layout:"hbox",items:[{xtype:"fieldset",title:"Configuration 4G",flex:1,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkboxfield",fieldLabel:"Activer la 4G",name:"enabled",ttip:"La combinaison de la 4G et du xDSL vous permet d'accélérer la vitesse de votre connexion Internet",checked:!0,boxLabel:""},{xtype:"combobox",hidden:!0,fieldLabel:"Connecteur d'antennes",name:"antenna",ttip:"A utiliser si vous connectez des antennes externes sur votre module",typeAhead:!1,editable:!1,store:new Ext.data.Store({fields:["val","name"],data:[{val:"internal",name:"interne"},{val:"external",name:"externe"},{val:"auto",name:"choix automatique"}]}),displayField:"name",valueField:"val",queryMode:"local"}]}]},{xtype:"container",layout:"hbox",height:180,defaults:{height:"100%"},items:[{xtype:"fieldset",title:"xDSL + 4G",flex:1,margin:"0 5 0 0",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"templateddisplayfield",fieldLabel:"Lien xDSL",name:"tunnel.xdsl.connected",tpl:'<tpl if="values.val">Connecté</tpl><tpl if="!values.val">Inactif</tpl>'},{xtype:"templateddisplayfield",fieldLabel:"Débit xDSL Download",name:"tunnel.xdsl.rx_used_rate",tpl:"{[Fbx.os.lib.FbxUtils.rate(values.val)]}"},{xtype:"templateddisplayfield",fieldLabel:"Débit xDSL Upload",name:"tunnel.xdsl.tx_used_rate",tpl:"{[Fbx.os.lib.FbxUtils.rate(values.val)]}"},{xtype:"templateddisplayfield",fieldLabel:"Lien 4G",name:"tunnel.lte.connected",tpl:'<tpl if="values[\'tunnel.lte.last_error\'] == \'remote_err_throttle\'">Fair Use dépassé<tpl else><tpl if="values.val">Connecté</tpl><tpl if="!values.val">Inactif</tpl></tpl>'},{xtype:"templateddisplayfield",fieldLabel:"Débit 4G Download",name:"tunnel.lte.rx_flows_rate",tpl:"{[Fbx.os.lib.FbxUtils.rate(values.val)]}"},{xtype:"templateddisplayfield",fieldLabel:"Débit 4G Upload",name:"tunnel.lte.tx_flows_rate",tpl:"{[Fbx.os.lib.FbxUtils.rate(values.val)]}"}]},{xtype:"fieldset",title:"État 4G",flex:1,margin:"0 0 0 5",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"enumdisplayfield",fieldLabel:"État du modem",name:"state",ttip:"État du modem 4G",strings:{stopped:"Arrêté",not_detected:'<span style="color: orange;">Détection du modem en cours</span>',starting:"Démarrage en cours",disabled:"Désactivé",no_sim:"Carte SIM non détectée",pin_locked:'<span style="color: red;">Carte SIM Vérouillée</span>',puk_locked:'<span style="color: red;">Carte SIM Vérouillée</span>',waiting_radio:'<span style="color: orange;">Recherche de signal radio</span>',waiting_network:"Connexion au réseau",connected:'<span style="color: green;">Connecté</span>'}},{xtype:"templateddisplayfield",fieldLabel:"État de la radio",name:"radio.associated",ttip:"État de la connexion radio 4G",tpl:'<tpl if="values.val === true"><span style="color: green;">Associé</span></tpl><tpl if="values.val === false"><span style="color: red;">Non Associé</span></tpl> <div style="float: right;" class="btn-sprite btn-signal-level-{[values["radio.signal_level"]]}"></div> <div style="clear: both;"></div>'},{xtype:"templateddisplayfield",fieldLabel:"État du Réseau",name:"network.pdn_up",ttip:"État du lien réseau 4G",tpl:'<tpl if="values.val"><span style="color: green;">Connecté</span></tpl><tpl if="!values.val"><span style="color: red;">Non Connecté</span></tpl>'},{xtype:"displayfield",fieldLabel:"GCID",name:"radio.gcid"}]}]},{xtype:"container",layout:"hbox",defaults:{height:180},items:[{xtype:"fieldset",title:"Radio / Canal 1",flex:1,margin:"0 5 0 0",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"templateddisplayfield",fieldLabel:"État du Canal 1",name:"radio.bands.0.enabled",tpl:'<tpl if="values.val"><span style="color: green;">Actif</span></tpl><tpl if="!values.val"><span style="color: red;">Non actif</span></tpl>'},{xtype:"enumdisplayfield",fieldLabel:"Bande de fréquence",name:"radio.bands.0.band",ttip:"État du modem 4G",strings:{7:"2600 MHz",3:"1800 MHz",28:"700 MHz"}},{xtype:"templateddisplayfield",fieldLabel:"rssi",name:"radio.bands.0.rssi",tpl:'<span style="color: {[Fbx.os.lib.FbxUtils.rssiLevelColor(values.val)]}">{val} dBm</span>',ttip:"Niveau de reception du signal"},{xtype:"templateddisplayfield",fieldLabel:"rsrp",name:"radio.bands.0.rsrp",tpl:'<span style="color: {[Fbx.os.lib.FbxUtils.rsrpLevelColor(values.val)]}">{val}</span>',ttip:"Niveau de reception du signal"},{xtype:"templateddisplayfield",fieldLabel:"rsrq",name:"radio.bands.0.rsrq",tpl:'<span style="color: {[Fbx.os.lib.FbxUtils.rsrqLevelColor(values.val)]}">{val}</span>',ttip:"Niveau de reception du signal"},{xtype:"displayfield",fieldLabel:"Cell Id",name:"radio.bands.0.pci",ttip:"Identifiant de l'émetteur radio"}]},{xtype:"fieldset",title:"Radio / Canal 2",flex:1,margin:"0 0 0 5",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"templateddisplayfield",fieldLabel:"État du Canal 2",name:"radio.bands.1.enabled",tpl:'<tpl if="values.val"><span style="color: green;">Actif</span></tpl><tpl if="!values.val"><span style="color: red;">Non actif</span></tpl>'},{xtype:"enumdisplayfield",fieldLabel:"Bande de fréquence",name:"radio.bands.1.band",ttip:"État du modem 4G",strings:{7:"2600 MHz",3:"1800 MHz",28:"700 MHz"}},{xtype:"templateddisplayfield",fieldLabel:"rssi",name:"radio.bands.1.rssi",tpl:'<span style="color: {[Fbx.os.lib.FbxUtils.rssiLevelColor(values.val)]}">{val} dBm</span>',ttip:"Niveau de reception du signal"},{xtype:"templateddisplayfield",fieldLabel:"rsrp",name:"radio.bands.1.rsrp",tpl:'<span style="color: {[Fbx.os.lib.FbxUtils.rsrpLevelColor(values.val)]}">{val}</span>',ttip:"Niveau de reception du signal"},{xtype:"templateddisplayfield",fieldLabel:"rsrq",name:"radio.bands.1.rsrq",tpl:'<span style="color: {[Fbx.os.lib.FbxUtils.rsrqLevelColor(values.val)]}">{val}</span>',ttip:"Niveau de reception du signal"},{xtype:"displayfield",fieldLabel:"Cell Id",name:"radio.bands.1.pci",ttip:"Identifiant de l'émetteur radio"}]}]}],listeners:{beforeshow:function(){me.lteInfos.load()},loaded:function(form,values){refreshLte();for(var field,entries=["band","rssi","rsrp","rsrq","pci"],f=me.lteInfos.getForm(),i=0;i<2;++i){var enabled=values.radio.bands&&values.radio.bands[i]&&values.radio.bands[i].enabled;for(var k in entries){var e="radio.bands."+i+"."+entries[k];field=f.findField(e),field.setVisible(enabled)}}field=f.findField("antenna"),field.setVisible(values.has_external_antennas)}}}),me.win=Ext.create("Ext.tab.Panel",{layout:{align:"stretch",type:"vbox"},defaults:{bodyPadding:5},buttons:[{xtype:"button",iconCls:"btn-accept",text:"OK",handler:function(){me.close()}}],items:[me.diagTab,me.tabStatus,me.expStatus,me.lteInfos,me.tabChart,me.tabHistory,me.dslStats,me.tabDslGraph,me.tabTempGraph],listeners:{tabchange:function(tabPanel,newCard,oldCard,eOpts){oldCard.suspendRefresh=!0,newCard.suspendRefresh=!1},boxready:function(){me.tabStatus.suspendRefresh=!1,me.refreshDsl(),me.refreshStatus(),Fbx.os.gui.Environment.boxHasExpansionModules()||me.expStatus.tab.hide(),me.tabStatus.suspendRefresh=!0}}}),this.mainWindow.add(this.win),this.callParent(),me.timer=setInterval(function(){me.refreshDsl(),me.refreshStatus()},Fbx.os.gui.Environment.accessibilityMode?1e4:1e3)},refreshDsl:function(){var me=this,form=me.dslStats;me.loading||form.suspendRefresh||(me.loading=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"connection/xdsl/",method:"GET",autorefresh:!0,disableCaching:!0,callback:function(){me.loading=!1},success:function(response){var data=response.jsonData.result;for(var i in data.up)data["up_"+i]=data.up[i];for(var i in data.down)data["down_"+i]=data.down[i];var f=form.getForm();f.setValues(data);for(var ginpFields=["rtx_tx","rtx_c","rtx_uc"],phyrFields=["rxmt","rxmt_corr","rxmt_uncorr"],directions=["up","down"],i=0,l=directions.length;i<l;++i){for(var d=directions[i],k=0,ll=phyrFields.length;k<ll;++k){var field=f.findField(d+"_"+phyrFields[k]);field.setVisible(data[d].phyr)}for(var k=0,ll=ginpFields.length;k<ll;++k){var field=f.findField(d+"_"+ginpFields[k]);field.setVisible(data[d].ginp)}}}}))},refreshStatus:function(){var me=this,form=me.tabStatus;if(!me.loading&&!form.suspendRefresh){Fbx.os.gui.Environment.boxHasExpansionModule("dsl_lte")||Fbx.os.gui.Environment.boxHasExpansionModule("dsl_lte_external_antennas")?me.lteInfos.tab.show():me.lteInfos.tab.hide(),me.loading=!0,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"connection/full/",method:"GET",disableCaching:!0,callback:function(){me.loading=!1,me.tabStatus.setLoading(!1)},success:function(response){var jsonData=response.jsonData;for(var i in jsonData.result.xdsl)jsonData.result["xdsl_"+i]=jsonData.result.xdsl[i];for(var i in jsonData.result.ftth)jsonData.result["ftth_"+i]=jsonData.result.ftth[i];"up"===jsonData.result.state?"ftth"===jsonData.result.media?(me.win.child("#statsXdsl").tab.hide(),me.win.child("#tabDslGraph").tab.hide(),me.ftthStatus.show(),me.dslStatus.hide(),me.tabDslGraph.hide()):(me.ftthStatus.hide(),me.dslStatus.show(),me.win.child("#statsXdsl").tab.show(),me.win.child("#tabDslGraph").tab.show()):(me.ftthStatus.show(),me.dslStatus.show(),me.win.child("#statsXdsl").tab.show(),me.win.child("#tabDslGraph").tab.show());var f=form.getForm(),rateType="ethernet"===jsonData.result.type?"Ethernet":"IP";f.findField("rate_down").setFieldLabel("Débit "+rateType+" descendant"),f.findField("rate_up").setFieldLabel("Débit "+rateType+" montant"),f.findField("bandwidth_down").setFieldLabel("Débit "+rateType+" descendant (Max)"),f.findField("bandwidth_up").setFieldLabel("Débit "+rateType+" montant (Max)");var hasSfp=jsonData.result.ftth.has_sfp;f.findField("ftth_sfp_vendor").setVisible(hasSfp),f.findField("ftth_sfp_model").setVisible(hasSfp),f.findField("ftth_sfp_serial").setVisible(hasSfp),f.findField("ftth_sfp_has_signal").setVisible(hasSfp),f.findField("ftth_sfp_alim_ok").setVisible(hasSfp),f.findField("ftth_link").setVisible(hasSfp),jsonData.result.ipv4_str=jsonData.result.ipv4;var range=jsonData.result.ipv4_port_range;"up"===jsonData.result.state&&range&&2===range.length&&(jsonData.result.ipv4_str+=" (Ports "+range[0]+" à "+range[1]+")"),f.setValues(jsonData.result)}})}},destroy:function(){this.timer&&clearInterval(this.timer)}});Ext.define("Fbx.os.app.settings.Lcd",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.FieldSet","Ext.form.field.Checkbox","Ext.form.field.ComboBox","Ext.slider.Single","Fbx.ux.form.AjaxFormPanel","Ext.form.Label","Ext.data.Store"],statics:{defaultName:"Divers / Afficheur",defaultWidth:450,defaultHeight:150,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#parametrer-l-afficheur-lcd-du-freebox-server"},launch:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"lcd/config/",bodyPadding:10,showApplyCancel:!1,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"slider",animate:!1,name:"brightness",value:100,minValue:0,maxValue:100,fieldLabel:"Luminosité de l'écran LCD",listeners:{changecomplete:function(field,newVal){me.form.submitForm(!1)}}},{xtype:"checkboxfield",fieldLabel:"Forcer l'orientation",name:"orientation_forced",value:!1,boxLabel:"",listeners:{change:function(field,newVal){me.form.getForm().findField("orientation").setDisabled(!newVal)}}},{xtype:"combobox",disabled:!0,fieldLabel:"Orientation",name:"orientation",typeAhead:!1,editable:!1,store:new Ext.data.Store({fields:["val","name"],data:[{val:0,name:"Horizontal"},{val:90,name:"90 degrés"},{val:180,name:"180 degrés"},{val:270,name:"270 degrés"}]}),displayField:"name",valueField:"val",mode:"local"}]}),me.mon(me.form.getForm(),"dirtychange",function(form,dirty){dirty&&me.form.submitForm(!1)}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"})}});Ext.define("Fbx.os.app.settings.VpnServer",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.tab.Panel","Fbx.os.lib.FbxUtils","Fbx.ux.state.AjaxProvider","Ext.menu.Menu","Fbx.os.app.settings.VpnServerModel","Fbx.os.app.settings.VpnServerStatus","Fbx.os.app.settings.VpnServerConfigOpenVPN","Fbx.os.app.settings.VpnServerConfigPPTP","Fbx.os.app.settings.VpnServerConfigIPSec","Fbx.os.app.settings.VpnServerUserGrid","Fbx.os.app.settings.VpnServerConnGrid","Ext.data.Store","Ext.menu.Item","Ext.panel.Panel"],statics:{defaultName:"Serveur VPN",defaultWidth:800,defaultHeight:480,allowMultipleInstance:!1,disabledInBridge:!0,docSection:"doc/index.html#serveur-vpn"},launch:function(){var me=this;me.configCards={},me.vpnStore=Ext.create("Ext.data.Store",{storeId:"vpnServerStore",model:"Fbx.os.app.settings.VpnServerModel",remoteSort:!1,remoteFilter:!1,pageSize:0,listeners:{load:function(store,records){Ext.Array.each(records,function(r){var id=r.getId(),iconCls="btn-vpn-"+r.get("type")+"-"+("started"==r.get("state")?"on":"off"),itemId="menu-vpn-"+id,prevItem=me.leftMenu.getComponent(itemId);if(prevItem)prevItem.setIconCls(iconCls);else{var item=Ext.create("Ext.menu.Item",{text:Fbx.os.app.settings.VpnServerModel.vpnPrettyNames[id],itemId:itemId,iconCls:iconCls,recId:id,handler:menuItemHandler});me.leftMenu.add(item)}if(!me.configCards[id]){var params={fieldSetTitle:"Configuration "+Fbx.os.app.settings.VpnServerModel.vpnPrettyNames[id],url:FbxConf.apiBaseUrl+"vpn/"+id+"/config/",vpnid:id};"openvpn"==r.get("type")?me.configCards[id]=Ext.create("Fbx.os.app.settings.VpnServerConfigOpenVPN",params):"pptp"==r.get("type")?me.configCards[id]=Ext.create("Fbx.os.app.settings.VpnServerConfigPPTP",params):"ipsec"==r.get("type")?me.configCards[id]=Ext.create("Fbx.os.app.settings.VpnServerConfigIPSec",params):console.warn("unexpected vpn type: "+r.get("type")),me.centerCard.add(me.configCards[id])}}),setTimeout(function(){me.centerCard.isVisible()&&me.vpnStore.load({autorefresh:!0})},5e3)}}}),me.statusCard=Ext.create("Fbx.os.app.settings.VpnServerStatus"),me.userCard=Ext.create("Fbx.os.app.settings.VpnServerUserGrid"),me.connCard=Ext.create("Fbx.os.app.settings.VpnServerConnGrid"),me.centerCard=Ext.create("Ext.panel.Panel",{layout:"card",region:"center",stateful:!0,stateId:"vpnserver-centercard",items:[me.statusCard,me.connCard,me.userCard]}),me.leftMenu=Ext.create("Ext.menu.Menu",{floating:!1,width:200,region:"west",split:!0,stateful:!0,stateId:"vpnserver-westpanel",showSeparator:!1,style:{border:0},items:[{xtype:"menuitem",canActivate:!1,plain:!0,cls:"bold",text:"État",padding:5},{xtype:"menuitem",text:"État",width:"100%",iconCls:"btn-system-monitor",handler:function(btn){me.switchCard(btn,me.statusCard,!1)}},{xtype:"menuitem",text:"Connexions",width:"100%",iconCls:"btn-connect",handler:function(btn){me.switchCard(btn,me.connCard,!1)}},{xtype:"menuitem",canActivate:!1,plain:!0,cls:"bold",text:"Configuration",padding:5},{xtype:"menuitem",text:"Utilisateurs",width:"100%",iconCls:"btn-user",handler:function(btn){me.switchCard(btn,me.userCard,!1)}}]});var menuItemHandler=function(item,e){me.configCards[item.recId]&&me.switchCard(item,me.configCards[item.recId],!1)};me.vpnStore.load(),this.win=Ext.create("Ext.panel.Panel",{stateful:!0,stateId:"vpnserver-mainpanel",layout:{type:"border"},items:[me.leftMenu,me.centerCard]}),this.mainWindow.add(this.win),this.callParent()},setBtnActive:function(btn){Ext.Array.each(btn.parentMenu.items.items,function(i){i.removeCls&&i.removeCls("dl-filter-active")}),btn.addCls("dl-filter-active")},switchCard:function(btn,newCard,force){var me=this,l=me.centerCard.getLayout(),curCard=l.getActiveItem();if(!force&&curCard&&curCard.isDirty&&curCard.isDirty())return void Ext.MessageBox.confirm("Parmètres non sauvegardés","Voulez vous sauvegarder vos modifications ?",function(rep){"yes"==rep?curCard.submit(function(success){success&&me.switchCard(btn,newCard,!0)}):me.switchCard(btn,newCard,!0)});l.setActiveItem(newCard),me.setBtnActive(btn)}});Ext.define("Fbx.os.app.settings.ConnectionIpv6Config",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel","Ext.tab.Panel"],statics:{defaultName:"Connexion Internet / Configuration IPv6",defaultWidth:500,defaultHeight:400,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#configurer-votre-connexion"},launch:function(){for(var me=this,delegationItems=[{xtype:"label",html:"Attention si vous configurez un <i>Next Hop</i> pour le premier subnet, il ne sera plus annoncé par la Freebox sur votre réseau"}],i=0;i<8;i++)Ext.Array.push(delegationItems,{xtype:"label",html:"<hr />"}),Ext.Array.push(delegationItems,{xtype:"displayfield",fieldLabel:"Prefixe",name:"delegations."+i+".prefix"}),Ext.Array.push(delegationItems,{xtype:"textfield",fieldLabel:"Next Hop",name:"delegations."+i+".next_hop"});me.delegationsFs=Ext.create("Ext.form.FieldSet",{title:"Délégation de prefixe",defaults:{anchor:"100%",labelWidth:80},items:delegationItems}),me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{autoScroll:!0,title:"Général",url:FbxConf.apiBaseUrl+"connection/ipv6/config/",bodyPadding:10,items:[{xtype:"fieldset",title:"IPv6",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"displayfield",fieldLabel:"Adresse IPv6 lien local",name:"ipv6ll",hidden:!0}]},{xtype:"fieldset",title:"Firewall",defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkboxfield",fieldLabel:"Activer le firewall IPv6",name:"ipv6_firewall",boxLabel:"",ttip:"Cochez cette case si vous souhaitez que votre Freebox filtre le traffic IPv6 entrant inconnu."}]},me.delegationsFs],transformBeforePost:function(values){for(var delegations=[],i=0;i<8;i++)delegations[i]=values.delegations[i];return values.delegations=delegations,values},listeners:{loaded:function(f,values){me.form.getForm().findField("ipv6ll").setVisible(values.ipv6_enabled)},saved:function(f,values){me.form.getForm().findField("ipv6ll").setVisible(values.ipv6_enabled)}}}),me.dhcpForm=Ext.create("Fbx.ux.form.AjaxFormPanel",{autoScroll:!0,title:"DHCPv6",url:FbxConf.apiBaseUrl+"dhcpv6/config/",bodyPadding:10,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"label",html:"Attention si vous activez le serveur DHCPv6, certains périphériques Android risquent de ne plus avoir de connectivité IPv6"},{xtype:"checkboxfield",fieldLabel:"Activer le serveur DHCPv6",name:"enabled",checked:!0,boxLabel:""}],listeners:{beforeshow:function(){me.dhcpForm.load()}}}),me.dnsForm=Ext.create("Fbx.ux.form.AjaxFormPanel",{autoScroll:!0,title:"DNS IPv6",url:FbxConf.apiBaseUrl+"dhcpv6/config/",bodyPadding:10,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkboxfield",fieldLabel:"Forcer l'utilisation de serveurs DNS IPv6 personnalisés",name:"use_custom_dns",checked:!0,boxLabel:"",listeners:{change:function(field,newVal){var form=me.dnsForm.getForm();form.findField("dns.0").setDisabled(!newVal),form.findField("dns.1").setDisabled(!newVal)}}},{xtype:"textfield",fieldLabel:"Serveur DNS IPv6 primaire",name:"dns.0",vtype:"ipv6",allowIPv4:!1},{xtype:"textfield",fieldLabel:"Serveur DNS IPv6 secondaire",name:"dns.1",vtype:"ipv6",allowIPv4:!1}],listeners:{beforeshow:function(){me.dnsForm.load()}},transformBeforePost:function(values){return{dns:[values.dns[0],values.dns[1]],use_custom_dns:values.use_custom_dns}}}),me.tabPanel=Ext.create("Ext.tab.Panel",{items:[me.form,me.dhcpForm,me.dnsForm]}),this.mainWindow.add(me.tabPanel),me.callParent(arguments),me.form.load({method:"GET"})}});Ext.define("Fbx.os.app.settings.Tnt",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.grid.Panel","Ext.panel.Panel","Fbx.os.app.settings.DvbFrontendModel","Fbx.os.app.settings.DvbServicesModel","Ext.view.View","Ext.ProgressBar","Ext.form.Label","Ext.toolbar.Fill","Ext.data.Store","Ext.button.Button","Ext.container.Container"],statics:{defaultName:"Paramètres TNT",defaultWidth:800,defaultHeight:600,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#configuration-d-une-cle-usb-tnt"},getSelectedReceiver:function(){var me=this,selModel=me.cardList.getSelectionModel(),sel=selModel.getSelection();return sel.length?sel[0]:null},showScanProgress:function(){var me=this;me.scanProgressBar.updateProgress(0," "),me.scanProgressBar.show(),me.statusLbl.show(),me.tbFill.hide(),me.getScanProgress(),me.scanStop.show(),me.scanAbort.show(),me.scanBtn.hide()},hideProgress:function(){var me=this;me.tbFill.show(),me.scanProgressBar.hide(),me.statusLbl.hide(),me.scanStop.hide(),me.scanAbort.hide(),me.scanBtn.show()},scanCancel:function(receiver,stop){var me=this,url=FbxConf.apiBaseUrl+"dvb/"+receiver.getId()+"/";url+=stop?"scan_stop":"scan_cancel",Ext.Ajax.request({url:url,method:"POST",success:function(){me.hideProgress(),me.loadServices(receiver),me.receiverStore.load()}})},startScan:function(receiver){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"dvb/"+receiver.getId()+"/scan_start",method:"POST",success:function(){me.showScanProgress(),me.receiverStore.load()}})},getScanProgress:function(){var me=this,rec=me.getSelectedReceiver();Fbx.os.app.settings.DvbFrontendModel.load(rec.getId(),{success:function(rec){if(rec.raw.scan.running){var services=rec.raw.scan.new_services;me.scanProgressBar.updateProgress(rec.raw.scan.progress/100,services.length+" chaîne(s) trouvée(s)"),me.serviceStore.loadData(services),me.refreshTimer=setTimeout(function(){me.getScanProgress()},1e3)}else me.loadServices(rec),me.hideProgress()},failure:function(){me.hideProgress(),me.receiverStore.load()}})},loadServices:function(rec){var me=this,sel=me.getSelectedReceiver();if(!sel||sel.getId()==rec.getId()){if(rec.raw.scan.running)return me.serviceStore.removeAll(),void me.showScanProgress();me.hideProgress(),me.serviceStore.clearFilter(!0),me.serviceStore.filter([{property:"frontend",value:rec.getId()}])}},launch:function(){var me=this;me.receiverStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.DvbFrontendModel",remoteSort:!1,remoteFilter:!1,pageSize:0,autoLoad:!0,listeners:{load:function(){var selModel=me.cardList.getSelectionModel();if(!selModel.getSelection().length){var first=me.receiverStore.first();first&&selModel.select(first)}}}}),me.serviceStore=Ext.create("Ext.data.Store",{remoteSort:!1,remoteFilter:!0,sorters:[{property:"lcn",direction:"ASC"}],model:"Fbx.os.app.settings.DvbServicesModel",autoLoad:!1}),me.cardList=Ext.create("Ext.grid.Panel",{region:"west",title:"Récepteurs TNT",store:me.receiverStore,width:200,selModel:{mode:"SINGLE"},hideHeaders:!0,columns:[{dataIndex:"name",hideable:!1,flex:1}],viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun récepteur TNT USB détecté sur le Freebox Server</div>'},listeners:{select:function(grid,rec,index,eOpts){me.refreshTimer&&(clearTimeout(me.refreshTimer),me.refreshTimer=null),me.loadServices(rec)}}}),me.scanBtn=Ext.create("Ext.button.Button",{text:"Lancer un scan",iconCls:"btn-magnifier",handler:function(){var receiver=me.getSelectedReceiver();if(!receiver)return void(0==me.receiverStore.count()&&Ext.Msg.alert("Aucun adaptateur TNT détecté","Vous devez brancher un récepteur TNT USB sur votre <br />Freebox Server pour pouvoir lancer un scan"));me.startScan(receiver)}}),me.scanStop=Ext.create("Ext.button.Button",{text:"Stopper le scan",iconCls:"btn-stop",hidden:!0,handler:function(){var receiver=me.getSelectedReceiver();receiver&&me.scanCancel(receiver,!0)}}),me.scanAbort=Ext.create("Ext.button.Button",{text:"Annuler le scan",iconCls:"btn-cancel",hidden:!0,handler:function(){var receiver=me.getSelectedReceiver();receiver&&me.scanCancel(receiver,!1)}}),me.serviceList=Ext.create("Ext.view.View",{store:me.serviceStore,autoScroll:!0,itemSelector:"div.dvbchannel",tpl:'<div><tpl for=".">  <div style="margin-bottom: 10px;" class="dvbchannel">    <div class="tnt-sprite tnt-logo_0 tnt-logo_{lcn}"></div>    <div class="dvbchannel-name">{name:htmlEncode}</div>  </div></tpl><div style="clear: both;"></div></div>',viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucune chaîne trouvée</div>'}}),me.statusLbl=Ext.create("Ext.form.Label",{hidden:!0,text:"Scan en cours ...",style:{color:"#FFF"}}),me.scanProgressBar=Ext.create("Ext.ProgressBar",{hidden:!0,flex:1,align:"center"}),me.tbFill=Ext.create("Ext.toolbar.Fill",{}),me.cont=Ext.create("Ext.container.Container",{layout:{type:"border"},defaults:{split:!0},items:[me.cardList,{xtype:"panel",layout:"fit",region:"center",title:"Liste des chaînes",items:[me.serviceList],bbar:[me.statusLbl," ",me.scanProgressBar,me.tbFill,me.scanBtn,me.scanStop,me.scanAbort]}]}),me.cont.on("hide",function(){me.refreshTimer&&(clearTimeout(me.refreshTimer),me.refreshTimer=null)}),this.mainWindow.add(me.cont),me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.ports.PortRedir",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.app.settings.ports.PortRedirConfig","Fbx.os.app.settings.ports.PortInConfig","Ext.tab.Panel"],statics:{defaultName:"Connexion Internet / Gestion des ports",defaultWidth:650,defaultHeight:460,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#gerer-les-redirections-de-port"},launch:function(args){var me=this;me.tabLanRedir=Ext.create("Fbx.os.app.settings.ports.PortRedirConfig",{title:"Redirections de ports"}),me.tabIncoming=Ext.create("Fbx.os.app.settings.ports.PortInConfig",{title:"Connexions entrantes"}),me.panel=Ext.create("Ext.tab.Panel",{items:[me.tabLanRedir,me.tabIncoming]}),this.mainWindow.add(me.panel),me.callParent(arguments),args&&args.ip&&me.tabLanRedir.redirStore.on("load",function(){var recs=me.tabLanRedir.redirStore.add({lan_ip:args.ip,src_ip:"0.0.0.0",enabled:!0});me.tabLanRedir.showEditor(recs[0])},me,{single:!0})}});Ext.define("Fbx.os.app.settings.PhoneFxsStatus",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.Panel","Fbx.ux.form.field.TemplatedDisplay","Fbx.ux.form.field.SizeDisplay","Fbx.ux.form.field.EnumDisplay","Fbx.os.app.settings.PhoneModel","Fbx.os.app.settings.PhoneStatusFieldset","Fbx.ux.form.AjaxFormPanel","Ext.data.Store","Ext.button.Button","Ext.container.Container"],statics:{defaultName:"Téléphonie / Filaire",defaultWidth:500,defaultHeight:290,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#configurer-la-telephonie-filaire"},launch:function(){var me=this;me.store=Ext.getStore("phoneStore"),me.store||(me.store=Ext.create("Ext.data.Store",{storeId:"phoneStore",model:"Fbx.os.app.settings.PhoneModel",remoteSort:!1,remoteFilter:!1,pageSize:0})),me.ringBtn=Ext.create("Ext.button.Button",{margin:5,iconCls:"btn-bell",text:"Faire sonner le téléphone",flex:1,handler:function(button){me.fxsRing()}}),me.form=Ext.create("Ext.form.Panel",{layout:"fit",bodyPadding:5,buttons:[me.ringBtn,{xtype:"button",iconCls:"btn-accept",text:"OK",handler:function(){me.close()}}],defaults:{anchor:"100%"},items:[{xtype:"phonestatusfieldset",type:"fxs",title:"Téléphone fixe"}]}),me.statusForm=Ext.create("Ext.form.Panel",{layout:"fit",bodyPadding:5,items:[{xtype:"fieldset",title:"Configuration",items:[{xtype:"enumdisplayfield",fieldLabel:"Service téléphonique",name:"network",ttip:"État de votre service téléphonique",strings:{working:"Opérationnel",unconfigured:'<span style="color: red;">Non configuré</span>'},labelWidth:200}]}]}),me.cont=Ext.create("Ext.container.Container",{layout:{align:"stretch",type:"vbox"},items:[me.statusForm,me.form]}),me.networkStatus="",me.form.mon(me.store,"load",function(){var fxs=me.store.findRecord("type","fxs",0,!1,!1,!0);fxs&&!me.form.up("window").suspendRefresh&&me.form.loadRecord(fxs),fxs&&fxs.get("is_ringing")?me.ringBtn.setText("Arrêter la sonnerie du téléphone"):me.ringBtn.setText("Faire sonner le téléphone"),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"phone/config/",method:"GET",success:function(response){var jsonData=response.jsonData,win=me.form.up("window");if(win&&!win.suspendRefresh){var form=me.statusForm.getForm();form&&form.setValues({network:jsonData.result.network})}}})}),this.mainWindow.add(me.cont),this.callParent(),me.timer=setInterval(function(){me.refreshStatus()},1e3),me.refreshStatus(),me.form.up("window").suspendRefresh=!1},refreshStatus:function(){var me=this;me.form.up("window").suspendRefresh||me.store.isLoading()||me.store.load({autorefresh:!0})},destroy:function(){this.timer&&clearInterval(this.timer),this.callParent(arguments)},fxsRing:function(){var me=this,url=FbxConf.apiBaseUrl+"phone/fxs_ring_stop/",fxs=me.store.findRecord("type","fxs",0,!1,!1,!0);fxs&&!fxs.get("is_ringing")&&(url=FbxConf.apiBaseUrl+"phone/fxs_ring_start/"),Ext.Ajax.request({url:url,method:"POST"})}});Ext.define("Fbx.os.app.calls.app",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.os.app.calls.CallModel","Ext.data.Store","Ext.grid.Panel","Ext.grid.column.Template","Ext.panel.Panel","Fbx.os.gui.grid.column.EnumColumn","Ext.button.Split","Ext.menu.Menu","Fbx.os.gui.grid.column.DurationColumn","Fbx.ux.grid.CtxMenuGrid","Ext.grid.feature.Grouping","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore"],statics:{defaultName:"Journal d'appels",defaultWidth:600,defaultHeight:400,allowMultipleInstance:!1,docSection:"doc/index.html#journal-d-appels"},getContactApp:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.contacts.app");var contactApp=Fbx.os.core.TaskManager.getAppInstances("Fbx.os.app.contacts.app");return contactApp=contactApp[0]},addContact:function(number,name){this.getContactApp().addContact(number,name)},showContact:function(contact_id){this.getContactApp().showContact(contact_id)},launch:function(){var me=this;me.store=Ext.create("Ext.data.Store",{model:"Fbx.os.app.calls.CallModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"datetime",direction:"DESC"}],pageSize:0,autoLoad:!0}),me.grid=Ext.create("Fbx.ux.grid.CtxMenuGrid",{title:"",hideHeaders:!0,store:me.store,viewConfig:{emptyText:'<div style="text-align: center; padding: 10px">Aucun historique d\'appels</div>'},dockedItems:[{xtype:"toolbar",items:[{iconCls:"btn-arrow-refresh",text:"Recharger",handler:function(){me.store.load()}},{iconCls:"btn-bullet-white",text:"Tout marquer comme lu",handler:function(){me.store.each(function(r){r.get("new")&&r.set("new",!1)}),me.store.sync()}},{text:"Vider l'historique",iconCls:"btn-delete",handler:function(){var recs=[];me.store.each(function(r){Ext.Array.push(recs,r)}),me.store.remove(recs),me.store.sync()}},"-",{xtype:"combo",editable:!1,forceSelection:!0,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["all","Tous les appels"],["incoming","Appels entrants"],["outgoing","Appels sortants"],["missed","Appels manqués"]]}),value:"all",displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,listeners:{change:function(combo,newval){switch(newval){case"all":me.store.clearFilter();break;case"incoming":me.store.clearFilter(!0),me.store.filter({filterFn:function(r){var type=r.get("type");return"missed"==type||"accepted"==type}});break;case"outgoing":me.store.clearFilter(!0),me.store.filter({property:"type",value:"outgoing"});break;case"missed":me.store.clearFilter(!0),me.store.filter({property:"type",value:"missed"})}}}}]}],columns:[{xtype:"templatecolumn",text:"Type d'appel",dataIndex:"type",tpl:'<div class="btn-32-call-{type}"> </div>',width:40},{xtype:"templatecolumn",text:"Nom",dataIndex:"name",tpl:'<tpl if="new"><div class="bold"></tpl>  <tpl if="name != number"><div class="call-log-name">{name:htmlEncode}</div></tpl>  <a class="call-log-number" href="#">{number}</a><tpl if="new"><div/></tpl>',flex:1},{xtype:"templatecolumn",text:"Heure d'appel",dataIndex:"niceCallDate",tpl:'<div class="call-log-date">{niceCallDate:htmlEncode}</div><tpl if="duration">  <div class="call-log-duration">Durée de l\'appel: {[Fbx.os.lib.FbxUtils.formatDuration(values.duration)]}</div></tpl><tpl if="!duration">  <div class="call-log-duration">Appel en cours</div></tpl>',flex:1}],listeners:{cellclick:function(grid,td,cellIndex,rec,tr,rowIndex,e,eOpts){var col=me.grid.columns[cellIndex];if(col)if("new"==col.dataIndex){var is_new=rec.get("new");rec.set("new",!is_new),rec.save()}else if("name"==col.dataIndex){var cId=rec.get("contact_id");0==cId?""!=rec.raw.number&&Ext.Msg.confirm("Ajout d'un nouveau contact","Voulez-vous créer un contact à partir de ce numéro ?",function(buttonId){"yes"==buttonId&&me.addContact(rec.get("number"))}):me.showContact(cId)}}},getCtxMenu:function(){return me.ctxMenu||(me.ctxMenu=Ext.create("Ext.menu.Menu",{items:[{iconCls:"btn-add",text:"Créer un nouveau contact",handler:function(){var records=me.grid.getSelectedRecord(),rec=records[0];me.addContact(rec.get("number"),rec.get("name"))}}],listeners:{beforeshow:function(){if(1!=me.grid.getSelectedRecord().length)return!1}}})),me.ctxMenu}}),me.cont=Ext.create("Ext.panel.Panel",{layout:{type:"fit"},items:[me.grid],buttons:["->",{text:"OK",iconCls:"btn-accept",handler:function(){me.mainWindow.close()}}]}),this.mainWindow.add(me.cont),me.callParent(arguments)}});Ext.define("Fbx.os.app.settings.WizardExternalDisk",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.container.Container","Ext.panel.Panel","Ext.layout.container.Card","Ext.form.Panel","Fbx.os.app.settings.storage.PartitionModel","Fbx.os.app.settings.storage.DiskModel","Ext.data.Store","Ext.button.Button","Ext.form.field.ComboBox","Ext.form.Label"],statics:{defaultName:"Configurer un disque externe",defaultWidth:400,defaultHeight:275,allowMultipleInstance:!1,modal:!0},winConfig:{resizable:!1,maximizable:!1,minimizable:!1},navigate:function(direction,force){var me=this,layout=me.panel.getLayout();if("next"===direction){if(layout.getNext()){if(!force&&layout.activeItem.canGoNext&&!layout.activeItem.canGoNext())return;layout.next()}}else layout.getPrev()?layout.prev():me.close();layout.getPrev()?(me.btnPrev.setIconCls("btn-previous"),me.btnPrev.setText("Retour")):(me.btnPrev.setIconCls("btn-cancel"),me.btnPrev.setText("Annuler")),layout.getNext()?(me.btnNext.setIconCls("btn-next"),me.btnNext.setText("Suivant")):(me.btnNext.setIconCls("btn-accept"),me.btnNext.setText("Terminer"))},__pollTimeout:null,__pollAttemps:0,__askOpenAgain:!0,pollDisk:function(){var me=this;me.partitionsStore.load(function(){return me.partitionsStore.count()>0?(me.navigate("next"),void me.diskCombo.select(me.partitionsStore.first())):(me.__pollAttemps+=1,me.__pollAttemps>15?void Ext.Msg.confirm("Aucun disque dur détecté","Aucun disque dur n'a été detecté, voulez vous réessayer ?",function(btn){"yes"===btn?(me.__pollAttemps=0,me.pollDisk()):me.close()}):void(me.__pollTimeout=setTimeout(function(){me.pollDisk()},1e3)))})},launch:function(){var me=this;me.partitionsStore=Ext.create("Ext.data.Store",{autoLoad:!1,remoteSort:!1,remoteFilter:!1,model:"Fbx.os.app.settings.storage.PartitionModel",filters:[function(item){var fstype=item.get("fstype");return"raid"!==fstype&&"empty"!==fstype}]}),me.btnPrev=Ext.create("Ext.button.Button",{text:"Annuler",iconCls:"btn-cancel",handler:function(){me.navigate("prev")}}),me.btnNext=Ext.create("Ext.button.Button",{text:"Suivant",iconCls:"btn-next",handler:function(){me.panel.getLayout().getNext()?me.navigate("next"):me.close()}}),me.diskCombo=Ext.create("Ext.form.field.ComboBox",{fieldLabel:"Disque dur",name:"media",store:me.partitionsStore,editable:!1,allowBlank:!1,forceSelection:!0,displayField:"description",valueField:"id",queryMode:"local",lastQuery:"",margin:"10 0",listeners:{change:function(combo,newVal){console.debug("newVal",newVal),me.btnNext.setDisabled(!newVal)}}}),me.panel=Ext.create("Ext.panel.Panel",{title:"Étape 1/4 : Configuration d'un disque dur",layout:"card",bodyPadding:10,items:[{xtype:"container",layout:"fit",html:"<div>Certaines fonctionnalités de votre Freebox nécessitent l'utilisation d'un disque dur.</div> <div>Voulez-vous configurer un disque dur maintenant ?</div>",listeners:{show:function(){me.panel.setTitle("Étape 1/4 : Configuration d'un disque dur"),me.btnNext.setDisabled(!1)}}},{xtype:"container",layout:"fit",html:'<div>Vous pouvez maintenant brancher un disque dur à votre Freebox</div><br /> <div>Attente de la détection d\'un disque dur externe ...</div> <br /><div style="text-align: center;"><img src="resources/images/fbx/loading.gif" style="width: 32px; height: 32px;" alt=""/></div>',listeners:{show:function(){me.panel.setTitle("Étape 2/4 - Détection d'un disque dur externe"),me.__pollAttemps=0,me.pollDisk(),me.btnNext.setDisabled(!0)}}},{xtype:"form",border:0,padding:0,defaults:{anchor:"100%",labelWidth:100},items:[{xtype:"label",text:"Sélectionnez le disque dur à utiliser :"},me.diskCombo],canGoNext:function(){var partition=me.diskCombo.getValue();if(!partition)return!1;var part=me.partitionsStore.getById(partition);if(!part)return!1;var fstype=part.get("fstype");return"empty"===fstype?(Ext.Msg.confirm("Formatage nécessaire",'Il semblerait que ce disque ne soit pas formaté.<br />Voulez vous formater votre disque dur maintenant ?<br /><span style="color: #C00;">ATTENTION: Si vous choisissez de formater votre disque  toutes les données présentes sur le disque seront perdues</span>',function(btn){"yes"===btn&&me.formatDisk(part)}),!1):"ext4"!==fstype?(Ext.Msg.confirm("Configuration non optimale",'<div>Pour des performances optimales votre disque dur doit être formaté en EXT4.Si vous ne formatez pas votre disque au format EXT4 vous risquez de rencontrer les problèmes suivants :<br /><ul>  <li>durée des enregistrements TV limitée</li>  <li>performances de lecture/écriture sur le disque réduites</li>  <li>performances du gestionnaire de téléchargement réduites</li></ul></div><div>Voulez vous reformater votre disque dur maintenant ?</div><div style="color: #C00; margin-top: 10px; font-weight: bold;"> ATTENTION: Si vous choisissez de formater votre disque  toutes les données présentes sur le disque seront perdues</span></div>',function(btn){"yes"===btn?me.formatDisk(part):Ext.Msg.confirm("Configuration non optimale","Voulez-vous continuer avec cette configuration non optimale ?",function(btn){"yes"===btn?me.pickDisk(part.get("label")):me.navigate("back",!0)})}),!1):(me.pickDisk(part.get("label")),!0)},listeners:{show:function(){me.panel.setTitle("Étape 3/4 : Sélection du disque dur"),me.btnNext.setDisabled(!me.diskCombo.getValue()),me.btnPrev.setDisabled(!1)}}},{xtype:"container",layout:"fit",html:'<img src="resources/images/fbx/dialog-ok.png" style="width: 64px; height: 64px; float: left; margin: 10px;" alt=""><div style="padding: 10px;">Votre Freebox est maintenant configurée pour utiliser votre disque externe.</div>',listeners:{show:function(){me.panel.setTitle("Étape 4/4 - Configuration terminée")}}}],buttons:[me.btnPrev,me.btnNext]}),me.mainWindow.on("close",function(){me.__askOpenAgain&&Ext.Msg.confirm("Ouvrir l'assistant à la prochaine visite","Voulez vous que cet assistant s'affiche lors de votre prochaine visite ?",function(btn){Fbx.os.gui.Environment.getStateProvider().set(Fbx.os.gui.Environment.externalProperty,{ignoreExternalHdd:"yes"!==btn})})}),me.mainWindow.add(me.panel),me.callParent(arguments)},pickDisk:function(label){var me=this;me.panel.setLoading(!0),me.__askOpenAgain=!1,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"system/",method:"PUT",jsonData:{user_main_storage:label},callback:function(){me.panel.setLoading(!1)},success:function(response){me.navigate("next",!0)}})},formatDisk:function(part){var me=this;me.panel.setLoading(!0),me.__diskId=part.get("disk_id"),Fbx.os.app.settings.storage.DiskModel.load(me.__diskId,{success:function(disk){if(disk.raw.partitions.length>1)return void Ext.Msg.alert("Formatage impossible","Ce disque contient plusieurs partitions. Il ne peut être formaté via cet utilitaire !");me.doFormat()},callback:function(){me.panel.setLoading(!1)}})},checkFormatProgress:function(){var me=this;Fbx.os.app.settings.storage.DiskModel.load(me.__diskId,{success:function(disk){switch(disk.get("state")){case"formatting":me.formatStarted=!0;var infos=disk.get("operation_pct");progress=infos.percent/100,Ext.Msg.updateProgress(progress,infos.percent+"% - étape "+(infos.done_steps+1)+"/"+infos.max_steps),Ext.Msg.toFront(),Ext.Msg.focus();break;case"enabled":if(me.formatStarted){if(Ext.Msg.show({title:"Formatage OK",msg:"Le formatage est terminé",icon:Ext.window.MessageBox.INFO,buttons:Ext.Msg.OK}),disk.raw.partitions.length>=1){var part=disk.raw.partitions[0];me.pickDisk(part.label)}return}break;case"error":Ext.Msg.show({title:"Erreur détectées",msg:"Une erreur est survenue lors du formatage",icon:Ext.window.MessageBox.ERROR,buttons:Ext.Msg.OK})}setTimeout(function(){me.checkFormatProgress()},1e3)}})},doFormat:function(){var me=this;me.formatStarted=!1,Ext.Ajax.request({url:FbxConf.apiBaseUrl+"storage/disk/"+me.__diskId+"/format",method:"PUT",jsonData:{table_type:"gpt",fs_type:"ext4",label:"Freebox"},success:function(response){Ext.Msg.progress("Formatage du disque","Formatage en cours, merci de patienter"),me.checkFormatProgress()}})},terminate:function(){var me=this;me.refreshInterval&&clearInterval(me.refreshInterval),Fbx.os.gui.Environment.getSystemInfos(null,!0),this.callParent(arguments)}});Ext.define("Fbx.os.app.settings.wifi.Wifi",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.grid.column.Template","Fbx.os.app.settings.wifi.WifiApModel","Fbx.os.app.settings.wifi.WifiCardPanel","Fbx.os.app.settings.wifi.WifiBssModel","Fbx.os.app.settings.WifiPlanning","Fbx.os.app.settings.wifi.WifiMacFilter","Fbx.ux.form.AjaxFormPanel","Ext.data.Store","Ext.button.Button","Fbx.ux.grid.RefreshGrid","Ext.panel.Panel","Ext.window.Window","Fbx.os.app.settings.wifi.WifiWps"],statics:{defaultName:"Réseau local / Wi-Fi",defaultWidth:850,defaultHeight:500,allowMultipleInstance:!1,modal:!0,disabledInBridge:!0,docSection:"doc/index.html#acceder-aux-parametrages-avances-du-wi-fi"},setArgs:function(args){var me=this;args.mac&&args.type&&(me.showMacFilter(),me.macFilterGrid.addFilter(args.mac,args.type))},toggleWifi:function(){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/config/",method:"PUT",jsonData:{enabled:!me.globalConf.enabled},success:function(a,b){Fbx.os.gui.Environment.fireEvent("toogleneedrefresh")}})},globalConf:{},loadGlobalConf:function(){var me=this;Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/config/",method:"GET",silentError:!0,success:function(response,req){me.globalConf=response.jsonData.result,me.updateToggleBtn()}})},updateToggleBtn:function(){var me=this;me.toggleButton.setText(me.globalConf.enabled?"Désactiver le Wifi":"Activer le Wifi"),me.toggleButton.setIconCls(me.globalConf.enabled?"btn-32-wifi-toggle-on":"btn-32-wifi-toggle-off")},launch:function(args){var me=this;me.phyStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.wifi.WifiApModel",autoLoad:!0,remoteSort:!1,remoteFilter:!1,sorters:[{property:"id",order:"ASC"}],pageSize:0,listeners:{load:function(){var sel=me.phyList.getSelectedRecord();if(0==sel.length){me.phyList.getSelectionModel().select(me.phyStore.first())}else{var rec=sel[0],upToDateRec=me.phyStore.getById(rec.getId());me.cardPanel.updateRecord(upToDateRec)}}}}),me.bssStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.settings.wifi.WifiBssModel",remoteSort:!1,remoteFilter:!1,pageSize:0,storeId:"wifiBssStore"}),me.bssStore.load(),me.toggleButton=Ext.create("Ext.button.Button",{text:"Désactiver le Wifi",iconCls:"btn-32-wifi-toggle-on",handler:function(){Ext.Msg.confirm((me.globalConf.enabled?"Désactivation":"Activation")+" du Wi-Fi","Êtes-vous sûr de vouloir "+(me.globalConf.enabled?"désactiver":"activer")+" le Wi-Fi de votre Freebox ?",function(btn){"yes"==btn&&me.toggleWifi()})}}),me.phyList=Ext.create("Fbx.ux.grid.RefreshGrid",{store:me.phyStore,region:"west",width:250,split:!0,hideHeaders:!0,dockedItems:[{xtype:"container",padding:2,dock:"bottom",layout:{align:"stretch",type:"vbox"},defaults:{margin:2,height:40},items:[{xtype:"button",text:"WPS",iconCls:"btn-32-wps",handler:function(){me.showWps()}},{xtype:"button",text:"Wi-Fi Invité",iconCls:"btn-32-wifi-toggle-on",handler:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.wifi.WifiGuest")}},{xtype:"button",text:"Gérer le filtrage mac",iconCls:"btn-32-lock-edit",handler:function(){me.showMacFilter()}},{xtype:"button",text:"Gérer la planification",iconCls:"btn-32-wifi-calendar",handler:function(){me.showPlanning()}},me.toggleButton,{xtype:"button",text:"Réinitialiser les réglages Wi-Fi",iconCls:"btn-32-delete",handler:function(){Ext.Msg.confirm("Réinitialiser les réglages Wi-Fi","Êtes-vous sûr de vouloir restaurer les paramètres Wi-Fi d'origine ?",function(btn){"yes"==btn&&Ext.Ajax.request({url:FbxConf.apiBaseUrl+"wifi/config/reset",method:"POST"})})}}]}],columns:[{xtype:"templatecolumn",flex:1,dataIndex:"name",tpl:'<div class="wifi-card">  <div class="wifi-card-infos">    <div class="wifi-card-name">{titleStr:htmlEncode}</div>    <div class="wifi-card-status">{statusStr}</div>  </div>  <div style="clear: float;"></div></div>'}],listeners:{select:function(grid,record,index){me.cardPanel.performWhenSaved(function(){me.cardPanel.setRecord(record)})}}}),me.cardPanel=Ext.create("Fbx.os.app.settings.wifi.WifiCardPanel",{region:"center"}),me.mainPanel=Ext.create("Ext.panel.Panel",{layout:{type:"border"},items:[me.phyList,me.cardPanel]}),Fbx.os.gui.Environment.on("toogleneedrefresh",function(){me.loadGlobalConf()}),me.mainPanel.on("boxready",function(){me.loadGlobalConf(),args&&me.setArgs(args)}),this.mainWindow.add(me.mainPanel)},showPlanning:function(){var me=this;me.planningWin||(me.planningForm=Ext.create("Fbx.os.app.settings.WifiPlanning"),me.planningWin=Ext.create("Ext.window.Window",{layout:"fit",closeAction:"hide",modal:!0,title:"Planification Wifi",width:800,items:[me.planningForm]})),me.planningWin.show(),me.planningForm.load()},showWps:function(){var me=this;me.wpsPanel||(me.wpsPanel=Ext.create("Fbx.os.app.settings.wifi.WifiWps")),me.wpsPanel.show()},showMacFilter:function(){var me=this;me.macFilterWin||(me.macFilterGrid=Ext.create("Fbx.os.app.settings.wifi.WifiMacFilter"),me.macFilterForm=Ext.create("Fbx.ux.form.AjaxFormPanel",{bodyPadding:10,autoScroll:!0,url:FbxConf.apiBaseUrl+"wifi/config/",defaults:{anchor:"100%",labelWidth:300},items:[{xtype:"combobox",fieldLabel:"Mode de Filtrage d'adresse MAC",name:"mac_filter_state",ttip:"Cette fonctionnalité vous permet soit d'exclure certains périphériques de votre réseau Wi-Fi (Liste noire) ou de n'autoriser que certains périphériques sur votre réseau Wi-Fi (Liste blanche)",editable:!1,store:new Ext.data.Store({fields:["type","name"],data:[{type:"disabled",name:"Désactivé"},{type:"whitelist",name:"Liste blanche"},{type:"blacklist",name:"Liste noire"}]}),displayField:"name",valueField:"type",mode:"local",typeAhead:!1},me.macFilterGrid]}),me.macFilterWin=Ext.create("Ext.window.Window",{layout:"fit",closeAction:"hide",modal:!0,title:"Filtrage Mac",width:800,height:450,items:[me.macFilterForm]})),me.macFilterWin.show(),me.macFilterForm.load()}});Ext.define("Fbx.os.app.settings.ShareAfp",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.field.Number","Ext.form.field.Checkbox","Ext.form.field.ComboBox","Ext.form.FieldSet","Ext.layout.component.FieldSet","Fbx.ux.form.AjaxFormPanel","Fbx.os.lib.FbxUtils","Ext.form.Label","Ext.data.Store"],statics:{defaultName:"Partages de fichiers / Partages Mac OS",defaultWidth:450,defaultHeight:220,allowMultipleInstance:!1,modal:!0,docSection:"doc/index.html#gerer-les-partages-mac"},setDisabled:function(fields,disabled){var me=this,form=me.form.getForm();for(var i in fields){var fname=fields[i],field=form.findField(fname);field&&(field.reset(),field.setDisabled(disabled))}},launch:function(){var me=this;me.form=Ext.create("Fbx.ux.form.AjaxFormPanel",{url:FbxConf.apiBaseUrl+"netshare/afp/",bodyPadding:10,defaults:{anchor:"100%",labelWidth:200},items:[{xtype:"checkboxfield",fieldLabel:"Activer le partage de fichiers",ttip:"Cette fonctionnalité vous permet de partager les fichiers de votre Freebox sur votre réseau local en utilisant le système de partage de Mac OS",boxLabel:"",name:"enabled",listeners:{change:function(field,newVal){me.setDisabled(["server_type","guest_allow"],!newVal)}}},{xtype:"combobox",fieldLabel:"Icône finder",ttip:"Icône qui représente votre Freebox sur le réseau",name:"server_type",disabled:!0,store:new Ext.data.Store({fields:["type","name"],data:[{type:"powerbook",name:"PowerBook"},{type:"powermac",name:"PowerMac"},{type:"macmini",name:"Mac mini"},{type:"imac",name:"iMac"},{type:"macbook",name:"MacBook"},{type:"macbookpro",name:"MacBook Pro"},{type:"macbookair",name:"MacBook Air"},{type:"macpro",name:"Mac Pro"},{type:"appletv",name:"Apple TV"},{type:"airport",name:"AirPort"},{type:"xserve",name:"XServe"}]}),displayField:"name",valueField:"type",mode:"local",typeAhead:!1,editable:!1},{xtype:"checkboxfield",fieldLabel:"Autoriser les accès invité",ttip:"Si vous activez cette fonctionnalité il sera possible de lire les fichiers de votre Freebox sans authentification depuis votre réseau local",boxLabel:"",disabled:!0,checked:!0,name:"guest_allow",listeners:{change:function(field,newVal){me.setDisabled(["login_name","login_password"],newVal),me.form.getForm().checkValidity()}}},{xtype:"textfield",disabled:!0,fieldLabel:"Utilisateur",name:"login_name",ttip:"Nom d'utilisateur qui vous sera demandé pour accéder aux fichiers de votre Freebox",allowBlank:!1,validator:function(val){return Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>128?"Nom d'utilisateur trop long":!(val.indexOf(":")>=0)||"Le nom d'utilisateur ne peut pas contenir le caractère ':' "}},{xtype:"textfield",disabled:!0,fieldLabel:"Mot de passe",inputType:"password",ttip:"Mot de passe qui vous sera demandé pour accéder aux fichiers de votre Freebox",name:"login_password",boxLabel:"",allowBlank:!1,validator:function(val){return!(Fbx.os.lib.FbxUtils.lengthInUtf8Bytes(val)>32)||"Mot de passe trop long"}}]}),this.mainWindow.add(me.form),me.callParent(arguments),me.form.load({method:"GET"})}});Ext.define("Fbx.os.app.settings.Dhcp",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.tab.Panel","Fbx.os.app.settings.DhcpConfig","Fbx.os.app.settings.DhcpStaticLeases","Fbx.os.app.settings.DhcpDynamicLeases","Ext.data.Store"],statics:{defaultName:"Réseau local / DHCP",defaultWidth:650,defaultHeight:460,allowMultipleInstance:!1,modal:!0,disabledInBridge:!0,docSection:"doc/index.html#gerer-le-dhcp"},launch:function(args){var me=this;me.store=Ext.create("Ext.data.Store",{storeId:"dhcpStaticLeaseStore",model:"Fbx.os.app.settings.DhcpStaticLeaseModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"mac",direction:"ASC"}],pageSize:0,autoLoad:!0}),me.dynStore=Ext.create("Ext.data.Store",{storeId:"dhcpDynamicLeaseStore",model:"Fbx.os.app.settings.DhcpDynamicLeaseModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"mac",direction:"ASC"}],pageSize:0,autoLoad:!0}),me.staticGrid=Ext.create("Fbx.os.app.settings.DhcpStaticLeases",{itemId:"dhcpstaticleases",xtype:"dhcpstaticleases",title:"Baux Statiques",bodyPadding:0,stateful:!0,stateId:"dhcp-statics-lease"}),me.tabPanel=Ext.create("Ext.tab.Panel",{autoScroll:!0,defaults:{bodyPadding:10},items:[{itemId:"dhcpconfig",xtype:"dhcpconfig",title:"Serveur DHCP",autoScroll:!0},me.staticGrid,{itemId:"dynamiclease",xtype:"dhcpdynamicleases",title:"Baux actifs",bodyPadding:0,stateful:!0,stateId:"dhcp-dynamic-lease",dhcpapp:me}]}),me.mon(me.tabPanel,"beforetabchange",function(panel,newCard,oldCard){if("dhcpstaticleases"==newCard.itemId){newCard.getStore().load()}}),args&&me.setArgs(args),this.mainWindow.add(me.tabPanel)},setArgs:function(args){var me=this;args&&args.mac&&me.store.on("load",function(){me.addStaticLease(args.mac,args.ip,args.comment)},me,{single:!0})},addStaticLease:function(mac,ip,comment){var me=this;me.tabPanel.setActiveTab(1);var record=me.store.findRecord("mac",mac,0,!1,!1,!1);if(!record){record=me.store.add({mac:mac,ip:ip,comment:comment})[0]}me.staticGrid.showEditor(record)}});Ext.define("Fbx.os.app.settings.domains.Domains",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.form.Panel","Ext.data.Store","Fbx.os.app.settings.domains.DomainModel","Ext.form.FieldSet","Fbx.os.lib.FbxUtils","Ext.button.Button","Fbx.ux.form.field.EnumDisplay","Fbx.os.app.settings.domains.DomainWizard","Fbx.ux.form.field.TemplatedDisplay"],statics:{defaultName:"Nom de domaine personnalisé",defaultWidth:850,defaultHeight:500,allowMultipleInstance:!1,beforeLaunch:function(cb){Fbx.os.app.settings.domains.DomainModel.getDomainsConf(function(cfg){cb()},function(){Ext.Msg.alert("Service non disponible","Ce service n'est pas disponible pour le moment")})}},launch:function(args){var me=this;me.domainStore=Ext.create("Ext.data.Store",{storeId:"domainStore",model:"Fbx.os.app.settings.domains.DomainModel",remoteSort:!1,remoteFilter:!1,pageSize:0,groupField:"ca"}),me.mainPanel=Ext.create("Ext.form.Panel",{bodyPadding:10,autoScroll:!0,tbar:[{xtype:"button",iconCls:"btn-arrow-refresh",text:"Rafraîchir",handler:function(){me.reload()}},{xtype:"button",iconCls:"btn-add",text:"Ajouter un nom de domaine",handler:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.domains.DomainWizard")}}],items:[]}),me.domainStore.on("beforeload",function(store,records){me.mainPanel.setLoading(!0)});var fields=["id","type","owner","defaultStr","certs"];me.buttons=[],me.domainStore.on("load",function(store,records){me.mainPanel.setLoading(!1);var values={},validIds={};Ext.Array.each(records,function(r){if("custom"==r.get("type")){var id=r.getId(),escId=id.replace(/\./g,"_"),fieldPfx=escId+".";for(var i in fields){var f=fields[i];Fbx.os.lib.FbxUtils.stringify(r.get(f),fieldPfx+f+".",values)}var itemId="domain-"+escId;validIds[itemId]=!0;var prevItem=me.mainPanel.getComponent(itemId);prevItem||(me.buttons[id]={del:Ext.create("Ext.button.Button",{iconCls:"btn-delete",itemId:fieldPfx+"btn-delete",text:"Supprimer ce domaine",handler:function(){Ext.Msg.show({title:"Suppression du domaine",msg:"Êtes vous sûr de vouloir supprimer ce nom de domaine ?<br >S'il s'agit d'un nom de domaine freebox il sera remis a disposition !<br />Les certificats TLS associés à ce domaine seront également supprimés<br />",buttons:Ext.Msg.YESNO,icon:Ext.Msg.WARNING,callback:function(res){"yes"==res&&r.destroy({callback:function(){me.reload()}})}})}}),setDefault:Ext.create("Ext.button.Button",{xtype:"button",iconCls:"btn-accept",itemId:fieldPfx+"btn-accept",text:"Utiliser par défaut",handler:function(){Fbx.os.app.settings.domains.DomainModel.setDefaultDomain(id,function(){me.reload()})}}),requestCert:Ext.create("Ext.button.Button",{xtype:"button",iconCls:"btn-ssl",itemId:fieldPfx+"btn-ssl",text:"Demander un certificat TLS",handler:function(){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"domain/owned/"+id+"/request_cert",method:"POST",jsonData:{key_type:"rsa"},success:function(response){me.reload()}})}})},prevItem=Ext.create("Ext.form.FieldSet",{itemId:itemId,title:id,padding:5,defaults:{anchor:"100%",labelWidth:250},items:[{xtype:"displayfield",fieldLabel:"Nom de domaine",name:fieldPfx+"id"},{xtype:"enumdisplayfield",fieldLabel:"Administrateur",name:fieldPfx+"owner",strings:Fbx.os.app.settings.domains.DomainModel.domainsOwners},{xtype:"displayfield",fieldLabel:"Nom par défaut",name:fieldPfx+"defaultStr",ttip:"Le nom de domaine par défaut sera le nom de domaine utilisé lors de la création de liens de partage"},{xtype:"container",itemId:"certs",layout:"hbox",columns:2,items:[]},{xtype:"container",layout:"hbox",defaults:{margin:"0 5px"},items:[{xtype:"tbspacer",flex:1},me.buttons[id].del,me.buttons[id].setDefault,me.buttons[id].requestCert]}]}),me.mainPanel.add(prevItem));var certs=r.get("certs"),certsContainer=prevItem.getComponent("certs");certsContainer.removeAll();for(key_type in certs){var prevCert=certsContainer.getComponent("cert-"+key_type);prevCert||(prevCert=Ext.create("Ext.form.FieldSet",{flex:1,margin:5,title:"Certificat TLS / "+Fbx.os.app.settings.domains.DomainModel.certsTypes[key_type],items:[{xtype:"enumdisplayfield",fieldLabel:"Type de clé",name:fieldPfx+"certs."+key_type+".key_type",strings:Fbx.os.app.settings.domains.DomainModel.certsTypes},{xtype:"enumdisplayfield",fieldLabel:"Etat",name:fieldPfx+"certs."+key_type+".status",strings:Fbx.os.app.settings.domains.DomainModel.certsStatus,tpl:'<span class="cert-status-{val}">{valStr}</span>'},{xtype:"templateddisplayfield",fieldLabel:"Expiration",name:fieldPfx+"certs."+key_type+".days_left",tpl:'<span <tpl if="val &lt; 7">style="color: orange; font-weight: bold;"</tpl>>dans {val} jour<tpl if="val &gt; 1">s</tpl></span>'}]}),certsContainer.add(prevCert))}me.buttons[id].del.setVisible("custom"==r.get("type"));me.buttons[id].setDefault.setVisible(!r.get("default")&&"custom"==r.get("type"));me.buttons[id].requestCert.setVisible("freebox"==r.get("owner")&&(!certs.rsa||"error"==certs.rsa.status))}}),me.mainPanel.items.each(function(item){validIds[item.itemId]||me.mainPanel.remove(item)}),me.mainPanel.getForm().setValues(values)}),me.domainStore.load(),me.mainWindow.add(me.mainPanel)},reload:function(){var me=this;Fbx.os.app.settings.domains.DomainModel.getDomainsConf(function(cfg){me.domainStore.load()},!0)}});Ext.define("Fbx.os.app.explorer.FileBrowser",{extend:"Ext.panel.Panel",requires:["Fbx.ux.toolbar.PathToolbar","Fbx.ux.tree.FsTree","Fbx.os.app.explorer.FileGrid","Fbx.os.app.explorer.ShareLinkWin","Fbx.os.app.explorer.PartitionsView","Ext.container.Container"],uses:["Fbx.os.app.explorer.FileBrowserWindow"],initialPath:"Lw==",displayedMimeType:"any",curPath:"",allowMultipleSelect:!0,isPicker:!1,isDirPicker:!1,refresh:function(){this.setPath(this.curPath,!0)},setPath:function(path,force){var me=this;(me.curPath!=path||force)&&(me.curPath=path,me.centerContainer&&("Lw=="==me.curPath||""==me.curPath?(me.centerContainer.getLayout().setActiveItem(1),me.home.refresh()):me.centerContainer.getLayout().setActiveItem(0)),me.grid&&me.grid.setPath(path,force),me.tree&&me.tree.setPath(path,force),me.pathToolbar&&me.pathToolbar.setPath(path,force),me.fireEvent("pathchanged",me.curPath))},getSelectedFiles:function(){var me=this,selModel=null;return selModel=me.isDirPicker?me.tree.getSelectionModel():me.grid.getSelectionModel(),selModel?selModel.getSelection():[]},initComponent:function(){var me=this;if(me.tree=Ext.create("Fbx.ux.tree.FsTree",{region:"west",stateful:!me.isPicker,stateId:"file-browser-fstree",width:220,split:!0,animate:!1,listeners:{pathchanged:function(newPath){me.setPath(newPath)}}}),me.isPicker&&"inode/directory"==me.displayedMimeType||(me.pathToolbar=Ext.create("Fbx.ux.toolbar.PathToolbar",{autoScroll:!1,dock:"top",listeners:{pathchanged:function(newPath){me.setPath(newPath)}}}),me.grid=Ext.create("Fbx.os.app.explorer.FileGrid",{region:"center",displayedMimeType:me.displayedMimeType,flex:1,dockedItems:[me.pathToolbar],selModel:{mode:me.allowMultipleSelect?"MULTI":"SINGLE"},listeners:{pathchanged:function(newPath){me.setPath(newPath)},filedbclicked:function(rec){me.fireEvent("filedbclicked",rec)}}}),me.home=Ext.create("Fbx.os.app.explorer.PartitionsView",{browser:me}),me.centerContainer=Ext.create("Ext.container.Container",{region:"center",layout:"card",border:0,items:[me.grid,me.home]})),me.isPicker){var items=[me.tree];"inode/directory"!=me.displayedMimeType?items.push(me.centerContainer):(me.tree.region="center",me.tree.width=void 0,me.tree.flex=1),Ext.apply(me,{layout:{align:"stretch",type:"border"},items:items})}else Ext.apply(me,{layout:{align:"stretch",type:"border"},dockedItems:[{xtype:"toolbar",dock:"top",items:[{xtype:"button",text:"Nouveau dossier",iconCls:"btn-folder",handler:function(){Fbx.os.app.explorer.FsTask.promptMkdir(me.curPath)}},{xtype:"button",text:"Uploader ici",iconCls:"btn-folder-add",handler:function(){Fbx.os.app.explorer.FsTask.handleUpload(me.curPath)}},{xtype:"button",text:"Rafraîchir",iconCls:"btn-arrow-refresh",handler:function(){me.setPath(me.curPath,!0)}},{xtype:"button",text:"Partages de fichier",iconCls:"btn-share",menu:{xtype:"menu",items:[{text:"Partager un dossier",iconCls:"btn-share",handler:function(){var pathWindow=Ext.create("Fbx.os.app.explorer.FileBrowserWindow",{title:"Choix du dossier à partager",isPicker:!0,isDirPicker:!0,displayedMimeType:"inode/directory",allowMultipleSelect:!1,listeners:{filesselected:function(files){var path=files[0];Fbx.os.app.explorer.FsTask.handleShare(path)}}});pathWindow.setPath(me.curPath),pathWindow.show()}},{text:"Partager ce fichier",iconCls:"btn-share",itemId:"shareItem",handler:function(){var files=me.getSelectedFiles();if(1==files.length){var file=files[0];Fbx.os.app.explorer.FsTask.handleShare(file.get("path"))}}},{text:"Gérer les partages",iconCls:"btn-share",handler:function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.explorer.ShareLinkWin")}}],listeners:{beforeshow:function(menu){var shareItem=menu.getComponent("shareItem"),files=me.getSelectedFiles();if(shareItem.setVisible(1==files.length),1==files.length){var file=files[0];shareItem.setText("dir"==file.get("type")?"Partager le dossier selectionné":"Partager le fichier sélectionné")}}}}}]}],items:[me.tree,me.centerContainer]});this.callParent(arguments),me.addEvents("pathchanged","filedbclicked"),me.setPath(me.initialPath),Fbx.os.gui.Environment.registerNotif("storage","partition_state_changed",this,function(){me.refresh()}),me.on("beforedestroy",function(){Fbx.os.gui.Environment.unregisterNotif(this)})}});Ext.define("SettingApp",{extend:"Ext.data.Model",fields:[{name:"tabidx",type:"number"},{name:"app",type:"string"},{name:"label",type:"string"},{name:"desc",type:"string"},{name:"iconCls",type:"string",convert:function(val,r){var app=r.get("app"),cls=app.replace("Fbx.os.app.settings.","settings-");return cls=cls.replace("Fbx.os.app.",""),cls=cls.replace(".app",""),cls=cls.replace(".","-"),"app-icons-32-"+cls.toLowerCase()}},{name:"separator",type:"bool",defaultValue:!1},{name:"disabledInBridge",type:"bool",convert:function(v,rec){var app=rec.get("app"),c=Ext.ClassManager.get(app);return!!c&&c.disabledInBridge}},{name:"disabled",type:"bool",defaultValue:!1}]}),Ext.define("Fbx.os.app.settings.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.grid.Panel","Ext.panel.Panel","Ext.view.View","Ext.data.Store","Ext.tab.Panel","Fbx.os.app.settings.ConnectionStatus","Fbx.os.app.settings.ConnectionConfig","Fbx.os.app.settings.ConnectionIpv6Config","Fbx.os.app.settings.ConnectionDynDns","Fbx.os.app.settings.PhoneFxsStatus","Fbx.os.app.settings.PhoneDectStatus","Fbx.os.app.settings.NetworkMode","Fbx.os.app.settings.wifi.Wifi","Fbx.os.app.settings.ParentalFilterConfig","Fbx.os.app.settings.ports.PortRedir","Fbx.os.app.settings.Dhcp","Fbx.os.app.settings.Switch","Fbx.os.app.settings.Ftp","Fbx.os.app.settings.ShareSamba","Fbx.os.app.settings.ShareAfp","Fbx.os.app.settings.AirMedia","Fbx.os.app.settings.UpnpAv","Fbx.os.app.settings.UpnpIgd","Fbx.os.app.settings.Lcd","Fbx.os.app.settings.License","Fbx.os.app.settings.Freeplugs","Fbx.os.app.settings.Accounts","Fbx.os.app.settings.WizardDect","Fbx.os.app.settings.WizardWifi","Fbx.os.app.settings.Reset","Fbx.os.app.lanbrowser.app","Fbx.os.app.settings.SpeedTest","Fbx.os.app.settings.AdblockConfig","Fbx.os.app.settings.VpnServer","Fbx.os.app.settings.Tnt","Fbx.os.app.settings.VpnClient","Fbx.os.app.settings.WizardExternalDisk","Fbx.os.app.settings.domains.Domains","Fbx.os.app.settings.wifi.WifiGuest","Fbx.os.app.settings.storage.Storage"],statics:{defaultName:"Paramètres de la Freebox",defaultWidth:800,defaultHeight:460,allowMultipleInstance:!1,docSection:"doc/index.html#parametres-de-la-freebox",prefsProp:"settings-app-prefs"},netConfApply:function(netConf){var me=this;me.store&&(me.store.each(function(rec){rec.get("disabledInBridge")&&rec.set("disabled","bridge"===netConf.mode)}),me.basicStore.each(function(rec){rec.get("disabledInBridge")&&rec.set("disabled","bridge"===netConf.mode)}))},launch:function(){var me=this,curTabIdx=1,noobsApps=[];Fbx.os.gui.Environment.boxHasDect()&&noobsApps.push({tabidx:curTabIdx++,app:"Fbx.os.app.settings.WizardDect",label:"Associer un DECT",desc:"Cette application vous permet d'associer un nouveau téléphone sans fil DECT à la base de votre Freebox."}),noobsApps.push({tabidx:curTabIdx++,app:"Fbx.os.app.settings.WizardWifi",label:"Assistant Wi-Fi",desc:"Cette application vous permet de modifier le nom et le mot de passe de votre réseau Wi-Fi."}),noobsApps.push({tabidx:curTabIdx++,app:"Fbx.os.app.settings.wifi.WifiGuest",label:"Wi-Fi invité",desc:"Cette application vous permet de créer un accès Wi-Fi pour vos invités"}),noobsApps.push({tabidx:curTabIdx++,app:"Fbx.os.app.settings.Accounts",label:"Gestion des accès",desc:"Cette application vous permet de gérer l'accès à votre Freebox."}),noobsApps.push({tabidx:curTabIdx++,app:"Fbx.os.app.settings.AdblockConfig",label:"Blocage des publicités",desc:"Cette application vous permet de contrôler l'activation du blocage des publicités."}),noobsApps.push({tabidx:curTabIdx++,app:"Fbx.os.app.settings.Reset",label:"Réinitialiser la Freebox",desc:"Cette application vous permet de réinitialiser les réglages de votre Freebox en cas de problème."}),Fbx.os.gui.Environment.boxHasHdd()||noobsApps.push({tabidx:curTabIdx++,app:"Fbx.os.app.settings.WizardExternalDisk",label:"Disque Externe",desc:"Cette application vous permet de configurer un disque externe pour votre Freebox"}),me.basicStore=Ext.create("Ext.data.Store",{model:"SettingApp",data:noobsApps});var fullApps=[];fullApps.push({separator:!0,label:"Connexion Internet",tabidx:-1}),fullApps.push({app:"Fbx.os.app.settings.ConnectionConfig",label:"Configuration",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.ConnectionIpv6Config",label:"Configuration IPv6",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.ConnectionDynDns",label:"DNS Dynamique",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.VpnServer",label:"Serveur VPN",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.VpnClient",label:"Client VPN",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.ports.PortRedir",label:"Gestion des ports",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.domains.Domains",label:"Nom de domaine",tabidx:curTabIdx++}),fullApps.push({separator:!0,label:"Téléphonie",tabidx:-1}),fullApps.push({app:"Fbx.os.app.settings.PhoneFxsStatus",label:"Filaire",tabidx:curTabIdx++}),Fbx.os.gui.Environment.boxHasDect()&&fullApps.push({app:"Fbx.os.app.settings.PhoneDectStatus",label:"DECT",tabidx:curTabIdx++}),fullApps.push({separator:!0,label:"Réseau local",tabidx:-1}),fullApps.push({app:"Fbx.os.app.settings.NetworkMode",label:"Mode Réseau",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.wifi.Wifi",label:"Wi-Fi",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.wifi.WifiGuest",label:"Wi-Fi invité",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.Dhcp",label:"DHCP",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.Switch",label:"Switch",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.Freeplugs",label:"Freeplugs",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.UpnpIgd",label:"UPnP IGD",tabidx:curTabIdx++}),fullApps.push({separator:!0,label:"Partage de fichiers",tabidx:-1}),fullApps.push({app:"Fbx.os.app.settings.storage.Storage",label:"Disques",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.Ftp",label:"FTP",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.ShareSamba",label:"Partages Windows",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.ShareAfp",label:"Partages Mac OS",tabidx:curTabIdx++}),fullApps.push({separator:!0,label:"Multimédia",tabidx:-1}),fullApps.push({app:"Fbx.os.app.settings.AirMedia",label:"AirMedia",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.UpnpAv",label:"UPnP AV",tabidx:curTabIdx++}),fullApps.push({separator:!0,label:"Divers",tabidx:-1}),fullApps.push({app:"Fbx.os.app.settings.Lcd",label:"Afficheur",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.License",label:"Mentions légales",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.SpeedTest",label:"Test de débit local",tabidx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.Tnt",label:"Configuration TNT",tabIdx:curTabIdx++}),fullApps.push({app:"Fbx.os.app.settings.Accounts",label:"Gestion des accès",tabIdx:curTabIdx++}),Fbx.os.gui.Environment.boxHasHdd()||fullApps.push({app:"Fbx.os.app.settings.WizardExternalDisk",label:"Disque Externe",tabidx:curTabIdx++}),me.store=Ext.create("Ext.data.Store",{model:"SettingApp",data:fullApps}),me.basicPanel=Ext.create("Ext.panel.Panel",{layout:"fit",autoScroll:!0,title:"Mode Simplifié",items:[{xtype:"grid",store:me.basicStore,hideHeaders:!0,columns:[{xtype:"templatecolumn",tpl:'<div role="presentation" class="setting-app <tpl if="disabled">setting-app-disabled</tpl>" id="{app}"><div role="img" class="thumb"><div role="link" aria-label="{label:htmlEncode}" class="setting-app-img {iconCls}"></div></div><span role="presentation">{label:htmlEncode}</span></div><div role="presentation" class="x-clear"></div>',width:100},{dataIndex:"desc",flex:1}],listeners:{itemclick:function(view,record,item,index,e,eOpts){if(Fbx.os.lib.FbxUtils.isMobileDevice()){var app=record.get("app");if(Ext.isEmpty(app))return;Fbx.os.core.TaskManager.startApplication(app)}},itemdblclick:function(view,record,item,index,e,eOpts){var app=record.get("app");Ext.isEmpty(app)||Fbx.os.core.TaskManager.startApplication(app)},itemkeydown:function(view,rec,item,index,e,eOpts){if((e.keyCode===Ext.EventObject.ENTER||e.keyCode===Ext.EventObject.RETURN)&&rec){var app=rec.get("app");if(Ext.isEmpty(app))return;Fbx.os.core.TaskManager.startApplication(app)}},boxready:function(dataview){dataview.getEl().unselectable()}}}]}),me.advancedPanel=Ext.create("Ext.panel.Panel",{layout:"fit",title:"Mode avancé",items:[{xtype:"dataview",store:me.store,autoScroll:!0,overItemCls:"setting-app-over",selectedItemCls:"setting-app-selected",cls:"setting-list-app",stateful:!1,itemSelector:"div.setting-app",tpl:['<tpl for=".">','<tpl if="separator">','<div class="x-clear"></div>',"<h3>{label}</h3>",'<div class="setting-app" style="display: none;"></div>',"</tpl>",'<tpl if="!separator">','<div role="image" class="setting-app <tpl if="disabled">setting-app-disabled</tpl>" id="{app}">','<div class="thumb"><div role="link" tabindex="{tabidx}" aria-label="Ouvrir l\'application réglages {label:htmlEncode}" class="setting-app-img {iconCls}"></div></div>','<span role="presentation">{label:htmlEncode}</span>',"</div>","</tpl>","</tpl>",'<div role="presentation" class="x-clear"></div>'],listeners:{itemkeydown:function(view,rec,item,index,e,eOpts){if((e.keyCode===Ext.EventObject.ENTER||e.keyCode===Ext.EventObject.RETURN)&&rec){var app=rec.get("app");if(Ext.isEmpty(app))return;Fbx.os.core.TaskManager.startApplication(app)}},itemclick:function(view,record,item,index,e,eOpts){if(Fbx.os.lib.FbxUtils.isMobileDevice()){var app=record.get("app");if(Ext.isEmpty(app))return;Fbx.os.core.TaskManager.startApplication(app)}},itemdblclick:function(view,record,item,index,e,eOpts){var app=record.get("app");Ext.isEmpty(app)||Fbx.os.core.TaskManager.startApplication(app)},boxready:function(dataview){dataview.getEl().unselectable()}}}]}),me.tabPanel=Ext.create("Ext.tab.Panel",{autoScroll:!1,items:[me.basicPanel,me.advancedPanel],listeners:{tabchange:function(panel,newCard){Ext.state.Manager.set(Fbx.os.app.settings.app.prefsProp,{lastMode:newCard===me.advancedPanel?"advanced":"simple"})}}}),this.mainWindow.add(me.tabPanel),this.callParent();var prefsProp=Ext.state.Manager.get(Fbx.os.app.settings.app.prefsProp);prefsProp&&"advanced"===prefsProp.lastMode&&me.tabPanel.setActiveTab(1),me.mon(Fbx.os.gui.Environment,"networkConfChanged",me.netConfApply,me),Fbx.os.gui.Environment.getNetworkConf(function(conf){me.netConfApply(conf)})}});Ext.define("Fbx.os.app.explorer.FileBrowserWindow",{extend:"Ext.window.Window",requires:["Fbx.os.app.explorer.FileBrowser"],modal:!0,width:600,height:400,stateId:"file-browser-window",stateful:!0,title:"Selectionnez un fichier",isPicker:!1,isDirPicker:!1,initialPath:"/",displayedMimeType:"any",closeAction:"hide",allowMultipleSelect:!0,setPath:function(path,force){this.browser.setPath(path,force)},initComponent:function(){var me=this;me.browser=Ext.create("Fbx.os.app.explorer.FileBrowser",{initialPath:me.initialPath,displayedMimeType:me.displayedMimeType,allowMultipleSelect:me.allowMultipleSelect,isPicker:me.isPicker,isDirPicker:me.isDirPicker,listeners:{filedbclicked:function(rec){me.fireEvent("fileselected",[rec.get("path")]),me.close()}}}),Ext.apply(me,{layout:"fit",items:[me.browser],bbar:[{xtype:"button",text:"Nouveau Dossier",iconCls:"btn-folder",handler:function(){var parent=me.browser.curPath,selection=me.browser.getSelectedFiles();if(selection&&1==selection.length){var rec=selection[0];"dir"==rec.get("type")&&(parent=rec.get("path"))}Fbx.os.app.explorer.FsTask.promptMkdir(parent)}},"->",{xtype:"button",text:"Annuler",iconCls:"btn-cancel",handler:function(){me.close()}},{xtype:"button",text:"Valider",iconCls:"btn-disk",handler:function(){var selection=me.browser.getSelectedFiles(),files=[];if(selection&&0!=selection.length?Ext.Array.each(selection,function(rec){rec.get&&("dir"==rec.get("type")&&"inode/directory"!=me.displayedMimeType||Ext.Array.push(files,rec.get("path")))}):"inode/directory"==me.displayedMimeType&&(files=[me.browser.curPath]),0==files.length){if("inode/directory"!=me.displayedMimeType)return void Ext.Msg.alert("Séléction vide","Vous devez séléctionner un fichier !");files=[me.browser.curPath]}me.fireEvent("filesselected",files),me.close()}}]}),this.callParent(arguments),me.addEvents("filesselected")}});Ext.define("Fbx.os.app.explorer.app",{extend:"Fbx.os.core.task.Desktop",requires:["Fbx.ux.toolbar.PathToolbar","Fbx.ux.tree.FsTree","Fbx.os.app.explorer.FileGrid","Fbx.os.app.explorer.FileBrowserWindow","Fbx.os.app.explorer.FileBrowser","Fbx.os.app.grillepain.lib"],statics:{defaultName:"Explorateur de fichiers",defaultWidth:800,defaultHeight:450,docSection:"doc/index.html#explorateur-de-fichiers",allowMultipleInstance:!0},initialPath:"Lw==",displayedMimeType:"any",constructor:function(config){this.callParent(arguments)},launch:function(path){var me=this;path&&(me.initialPath=path),me.win=Ext.create("Fbx.os.app.explorer.FileBrowser",{initialPath:me.initialPath,displayedMimeType:me.displayedMimeType,title:"",listeners:{pathchanged:function(newPath){var dirName=Fbx.os.lib.FbxUtils.basename(Fbx.os.lib.FbxUtils.base64_decode(newPath));me.mainWindow.setTitle("Explorateur: "+dirName)},filedbclicked:function(rec){switch(rec.get("mimetype")){case"application/x-par2":Fbx.os.app.explorer.FsTask.repairFile(rec.get("path"),!1,function(success,task){success&&Ext.Msg.alert("Vérification terminée","La vérification des fichiers est terminée")});break;case"application/x-nzb":case"application/x-bittorrent":Ext.Msg.confirm("Téléchargement","Voulez-vous lancer ce téléchargement ?",function(btn){"yes"==btn&&(Ext.Ajax.request({url:FbxConf.apiBaseUrl+"downloads/add",method:"POST",params:{download_url:"file://"+Fbx.os.lib.FbxUtils.base64_decode(rec.get("path"))},failure:function(){Ext.Msg.alert("Erreur","Erreur lors de l'ajout du téléchargement")}}),Fbx.os.core.TaskManager.startApplication("Fbx.os.app.downloader.app"))});break;case Fbx.os.app.grillepain.app.mimeType:Fbx.os.app.grillepain.lib.contextHandler(rec);break;default:rec.downloadFile(1)}}}}),me.mainWindow.add(me.win),me.callParent()}});Ext.define("Fbx.ux.form.field.PathPicker",{extend:"Ext.form.FieldContainer",alias:"widget.pathpicker",requires:["Fbx.os.app.explorer.FileBrowserWindow","Fbx.os.lib.FbxUtils"],title:"Selectionnez un dossier",allowMultipleSelect:!1,displayedMimeType:"inode/directory",pickDir:!0,openPathWin:function(){var me=this,form=me.up("form").getForm(),field=form.findField(me.name),force=!1;me.pathWindow?force=!0:me.pathWindow=Ext.create("Fbx.os.app.explorer.FileBrowserWindow",{title:me.title,isPicker:!0,isDirPicker:me.pickDir,displayedMimeType:me.displayedMimeType,allowMultipleSelect:me.allowMultipleSelect,listeners:{fileselected:function(file){var path=file[0];field.setValue(path),me.onPick&&me.onPick(path)},filesselected:function(files){var path=files[0];field.setValue(path),me.onPick&&me.onPick(path)}}});var curPath=field.getValue();curPath=curPath.replace(/\/$/,""),me.pathWindow.setPath(curPath,force),me.pathWindow.show()},initComponent:function(){var me=this;Ext.apply(me,{layout:"hbox",items:[{xtype:"textfield",fieldLabel:"",name:me.name,value:me.value,readOnly:!0,flex:1,processRawValue:function(val){return Fbx.os.lib.FbxUtils.base64_encode(val)},transformRawValue:function(val){return Fbx.os.lib.FbxUtils.base64_decode(val)},listeners:{focus:function(){me.openPathWin()},disable:function(){me.setDisabled(!0)},enable:function(){me.setDisabled(!1)}}},{xtype:"splitter"},{xtype:"button",text:"Modifier",handler:function(){me.openPathWin()}}]}),me.button&&me.items.push(me.button),me.ttip&&""!=me.ttip&&me.items.push({xtype:"displayfield",ttip:me.ttip}),me.listeners&&me.listeners.pick&&(me.onPick=me.listeners.pick),this.callParent(arguments)},clear:function(){var me=this;me.up("form").getForm().findField(me.name).setValue()},destroy:function(){var me=this;me.pathWindow&&me.pathWindow.destroy(),this.callParent(arguments)}});Ext.define("Fbx.os.app.downloader.Settings",{extend:"Fbx.ux.form.AjaxFormPanel",requires:["Fbx.ux.form.field.TimetableField","Ext.form.field.Number","Fbx.ux.form.field.PathPicker","Fbx.ux.form.field.NumberWithUnlimited","Ext.data.ArrayStore","Ext.form.RadioGroup","Ext.window.Window"],border:0,layout:"fit",title:"",url:FbxConf.apiBaseUrl+"downloads/config/",getDefaultDlDir:function(){return this.getValues().download_dir},getWindow:function(){var me=this;return me.settingsWin||(me.settingsWin=Ext.create("Ext.window.Window",{closeAction:"hide",height:500,width:600,resizable:!1,layout:"fit",title:"Paramètres",modal:!0,items:[me],listeners:{show:function(){me.load()},hide:function(){me.app.statsRefresh()}}})),me.settingsWin},initComponent:function(){var me=this;Ext.applyIf(me,{items:[{xtype:"tabpanel",defaults:{bodyPadding:10,border:0,layout:{align:"stretch",type:"vbox"}},items:[{xtype:"panel",title:"Limites de vitesse",items:[{xtype:"fieldcontainer",fieldLabel:"Normal",layout:{align:"stretch",type:"hbox"},defaults:{margin:"0 5",flex:1,anchor:"100%",minValue:0},items:[{xtype:"numberwithunlimitedfield",fieldLabel:"Download (ko/s)",name:"throttling.normal.rx_rate",ttip:"Débit en réception maximal en mode normal"},{xtype:"numberwithunlimitedfield",fieldLabel:"Upload (ko/s)",name:"throttling.normal.tx_rate",ttip:"Débit en émission maximal en mode normal"}]},{xtype:"fieldcontainer",fieldLabel:"Réduit",layout:{align:"stretch",type:"hbox"},defaults:{margin:"0 5",flex:1,anchor:"100%",minValue:0},items:[{xtype:"numberwithunlimitedfield",fieldLabel:"Download (ko/s)",name:"throttling.slow.rx_rate",ttip:"Débit en réception maximal en mode réduit"},{xtype:"numberwithunlimitedfield",fieldLabel:"Upload (ko/s)",name:"throttling.slow.tx_rate",ttip:"Débit en émission maximal en mode réduit"}]},{xtype:"radiogroup",fieldLabel:"Mode de planification",columns:2,items:[{boxLabel:"Utiliser la planification",name:"throttling.mode",inputValue:"schedule",ttip:"Le mode de téléchargement est choisi en respectant les plages horaires du tableau ci dessous"},{boxLabel:"Désactiver les transferts",name:"throttling.mode",inputValue:"hibernate",ttip:"Tous les transferts sont suspendus"},{boxLabel:"Forcer en mode réduit",name:"throttling.mode",inputValue:"slow",ttip:"Les transferts utilisent les limites de débit réduites définies ci-dessus"},{boxLabel:"Forcer en mode normal",name:"throttling.mode",inputValue:"normal",ttip:"Les transferts utilisent les limites de débit normales définies ci-dessus"}],listeners:{change:function(group,newVal){var mode=newVal["throttling.mode"];me.getForm().findField("throttling.schedule").setReadOnly("schedule"!=mode)}}},{xtype:"label",html:"Vous pouvez définir le mode de téléchargement à appliquer en fonction des plages horaires en coloriant le tableau ci-dessous. <br />Séléctionnez le mode de planification en cliquant sur les boutons sous le tableau, puis cliquez sur les cases du tableau pour appliquer."},{xtype:"timetablefield",name:"throttling.schedule",defaultState:"normal",readOnly:!0,states:{normal:{color:"#00AA00",color2:"#66CC66",legend:"Normal"},slow:{color:"#0000AA",color2:"#6666CC",legend:"Vitesse réduite"},hibernate:{color:"#AA0000",color2:"#CC6666",legend:"Désactivé"}}}]},{xtype:"panel",title:"Réglages généraux",defaults:{labelWidth:200},items:[{xtype:"numberfield",fieldLabel:"Nombre de téléchargements simultanés",name:"max_downloading_tasks",minValue:1,maxValue:20,ttip:"Au delà de cette limite, les téléchargements seront mis en file d'attente"},{xtype:"pathpicker",fieldLabel:"Dossier de téléchargement",name:"download_dir",ttip:"Par défaut, les téléchargements se feront dans ce dossier"},{xtype:"checkboxfield",fieldLabel:"Utiliser le dossier surveillé",name:"use_watch_dir",listeners:{change:function(checkbox,newVal){checkbox.up("form").getForm().findField("watch_dir").setDisabled(!newVal)}},ttip:"Cette option vous permet d'utiliser la fonctionnalité de dossier surveillé"},{xtype:"pathpicker",fieldLabel:"Dossier surveillé",name:"watch_dir",disabled:!0,ttip:"Si l'option dossier surveillé est activée, les fichiers .torrent et .nzb placés dans ce dossier seront automatiquement téléchargés"},{xtype:"label",text:"Si vous voulez utiliser des serveurs DNS différents pour le gestionnaire de téléchargement, vous pouvez saisir leur adresse ci dessous.Laissez le champ vide pour utilisez les serveurs dns par défaut",margin:"5 0"},{xtype:"textfield",vtype:"ipv6",allowIPv4:!0,fieldLabel:"Serveur DNS 1",ttip:"Serveur DNS primaire pour le gestionnaire de téléchargement",name:"dns1"},{xtype:"textfield",vtype:"ipv6",allowIPv4:!0,fieldLabel:"Serveur DNS 2",ttip:"Serveur DNS secondaire pour le gestionnaire de téléchargement",name:"dns2"}]},{xtype:"panel",title:"Newsgroups",items:[{xtype:"fieldset",title:"Serveur de news",defaults:{anchor:"100%"},items:[{xtype:"textfield",fieldLabel:"Serveur",name:"news.server",ttip:"Adresse du serveur de news"},{xtype:"fieldcontainer",layout:{align:"stretch",type:"hbox"},defaults:{flex:1,margin:"0 5"},fieldLabel:"",items:[{xtype:"numberfield",margin:"",fieldLabel:"Port",minValue:0,maxValue:65535,name:"news.port",ttip:"Port du serveur de news (par défault 119 ou 443 en SSL)"},{xtype:"checkboxfield",fieldLabel:"Utiliser SSL",name:"news.ssl",ttip:"Lorsque cette option est activée, la connexion au serveur de news sera chiffrée",listeners:{change:function(f,val){var form=me.getForm();if(form){var conField=form.findField("news.nthreads");conField.setMaxValue(val?10:30),conField.validate();var portField=form.findField("news.port");443!=portField.getValue()||val?119==portField.getValue()&&val&&portField.setValue(443):portField.setValue(119)}}}}]},{xtype:"numberfield",fieldLabel:"Nombre de connexions",labelWidth:200,minValue:1,maxValue:30,name:"news.nthreads",ttip:"Nombre maximum de connexions simultanées au serveur de news (limité a 10 connexions SSL)"}]},{xtype:"fieldset",title:"Identification",items:[{xtype:"fieldcontainer",layout:{align:"stretch",type:"hbox"},defaults:{flex:1,margin:"0 5"},items:[{xtype:"textfield",fieldLabel:"Utilisateur",name:"news.user",ttip:"Nom d'utilisateur sur le serveur de news (optionnel)"},{xtype:"textfield",fieldLabel:"Mot de passe",inputType:"password",name:"news.password",ttip:"Mot de passe sur le serveur de news (optionnel)"}]}]},{xtype:"fieldset",title:"Préférences",defaults:{labelWidth:325},items:[{xtype:"checkboxfield",fieldLabel:"Ne pas télécharger les par2 si non nécessaires",name:"news.lazy_par2",ttip:"Lorsque cette option est activée, les fichiers .par2 ne sont téléchargés que si une réparation est nécessaire"},{xtype:"checkboxfield",fieldLabel:"Réparation automatique",name:"news.auto_repair",ttip:"Lorsque cette option est activée, les fichiers téléchargés seront réparés si ils ont étés corrumpus en utilisant les fichiers .par2"},{xtype:"checkboxfield",fieldLabel:"Extraction automatique",name:"news.auto_extract",ttip:"Si le fichier téléchargé est une archive, il sera automatiquement extrait"},{xtype:"checkboxfield",fieldLabel:"Supprimer les fichiers après extraction",name:"news.erase_tmp",ttip:"Si le fichier téléchargé a pu être extrait, les fichiers d'archive seront supprimés à la fin de l'extraction"}]}]},{xtype:"panel",title:"Torrent",items:[{xtype:"fieldset",title:"Torrent",defaults:{labelWidth:300,anchor:"100%"},items:[{xtype:"numberfield",fieldLabel:"Nombre de pairs maximum",minValue:1,maxValue:300,name:"bt.max_peers",ttip:"Nombre maximum de pairs pour l'ensemble des téléchargements torrent"},{xtype:"numberwithunlimitedfield",fieldLabel:"Ratio de partage",minValue:0,maxValue:100,step:.1,name:"bt.stop_ratio",ttip:"Ratio de partage à atteindre avant d'arrêter de partager un fichier torrent"},{xtype:"combo",fieldLabel:"Chiffrement des connexions",name:"bt.crypto_support",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["unsupported","Désactivé"],["allowed","Autorisé"],["preferred","Préféré"],["required","Obligatoire"]]}),forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1,triggerAction:"all",lazyRender:!0,ttip:"Permet de définir le mode de chiffrement à utiliser lors de la connexion à un pair"},{xtype:"checkboxfield",fieldLabel:"Activer la DHT",name:"bt.enable_dht",ttip:"Active le mode décentralisé de BitTorrent"},{xtype:"checkboxfield",fieldLabel:"Activer l'échange de pairs",name:"bt.enable_pex",ttip:"Active l'extension d'échange de pairs de BitTorrent"},{xtype:"numberfield",fieldLabel:"Temps d'attente pour l'annonce sur un traqueur (en secondes)",minValue:10,maxValue:300,name:"bt.announce_timeout",ttip:"Temps d'attente maximal pour s'annoncer sur un traqueur"},{xtype:"numberfield",fieldLabel:"Port entrant principal",name:"bt.main_port",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:0,ttip:"Port à utiliser pour les connexions bittorrent entrantes"},{xtype:"numberfield",fieldLabel:"Port entrant DHT",name:"bt.dht_port",allowBlank:!1,allowDecimals:!1,maxValue:65535,minValue:0,ttip:"Port à utiliser pour la DHT"}]}]},{xtype:"panel",title:"Feeds",defaults:{labelWidth:200},items:[{xtype:"numberfield",minValue:10,fieldLabel:"Période de mise à jour (minutes)",name:"feed.fetch_interval",ttip:"Période de mise à jour automatique des flux RSS"},{xtype:"numberfield",minValue:10,maxValue:150,fieldLabel:"Nombre d'éléments à conserver",name:"feed.max_items",ttip:"Nombre maximum d'entrées à conserver pour chaque flux RSS"}]},{xtype:"panel",title:"BlockList",defaults:{labelWidth:200},items:[{xtype:"textarea",fieldLabel:"",name:"blocklist.sources",emptyText:"Listes d'URL de fichiers de blocage d'IP, séparées par un saut de ligne",allowBlank:!0,ttip:'Avec un filtre de type "peerblock", vous pouvez empêcher les échanges avec certains pairs'},{xtype:"displayfield",fieldLabel:"Note",labelWidth:50,value:"Les listes de blocages de pairs doivent être au format CIDR"}]}]}]}),me.on("saved",function(){me.app.curStats&&(me.app.curStats.nzb_config_status.status="not_checked")}),me.storageChecked=!1,me.portChecked=!1,me.on("loaded",function(target,config){if(!me.storageChecked){var defaultPath=Fbx.os.lib.FbxUtils.base64_decode(me.getDefaultDlDir()),volume=defaultPath.split("/")[1];Fbx.os.app.downloader.app.ensureVolumeIsAvailable(volume,function(available){me.storageChecked=!0,available||Ext.Msg.confirm("Support de stockage non disponible","Le dossier de téléchargement par défaut correspond à un support de stockage "+volume+" non disponible <br />Voulez vous changer le dossier de téléchargement par défaut ?",function(res){"yes"==res&&(me.getWindow().show(),me.down("tabpanel").setActiveTab(1))})})}var form=me.getForm(),bt_main_port=form.findField("bt.main_port"),bt_dht_port=form.findField("bt.dht_port"),minPort=0,maxPort=65535;void 0!==config.bt.min_port&&void 0!==config.bt.max_port&&(minPort=config.bt.min_port,maxPort=config.bt.max_port);var minTxt="Vous devez choisir un port supérieur à "+minPort,maxTxt="Vous devez choisir un port inférieur à "+maxPort;bt_main_port.setMinValue(minPort),bt_main_port.setMaxValue(maxPort),bt_dht_port.setMinValue(minPort),bt_dht_port.setMaxValue(maxPort),bt_main_port.minText=minTxt,bt_main_port.maxText=maxTxt,bt_dht_port.minText=minTxt,bt_dht_port.maxText=maxTxt,form.isValid(),me.portChecked||((config.bt.main_port<minPort||config.bt.main_port>maxPort||config.bt.dht_port<minPort||config.bt.dht_port>maxPort)&&Ext.Msg.confirm("Configuration Bittorrent invalide","Les ports sélectionnés pour le fonctionnement de Bittorrent ne sont pas disponibles<br />Voulez vous corriger votre configuration ?",function(res){"yes"==res&&(me.getWindow().show(),me.down("tabpanel").setActiveTab(3))}),me.portChecked=!0)}),me.callParent(arguments)},setValues:function(obj){var me=this;me.values={},Fbx.os.lib.FbxUtils.stringify(obj,"",me.values),me.values["throttling.schedule"]=obj.throttling.schedule,me.values["throttling.normal.rx_rate"]/=1e3,me.values["throttling.normal.tx_rate"]/=1e3,me.values["throttling.slow.rx_rate"]/=1e3,me.values["throttling.slow.tx_rate"]/=1e3,me.values["throttling.stop_ratio"]/=100,me.values["bt.stop_ratio"]/=100,obj.blocklist.sources&&obj.blocklist.sources.join?me.values["blocklist.sources"]=obj.blocklist.sources.join("\n"):me.values["blocklist.sources"]="",this.getForm().setValues(me.values)},getValues:function(){var obj=this.callParent(arguments);obj.bt.stop_ratio=Math.round(100*obj.bt.stop_ratio),obj.throttling.normal.rx_rate=Math.round(1e3*obj.throttling.normal.rx_rate),obj.throttling.normal.tx_rate=Math.round(1e3*obj.throttling.normal.tx_rate),obj.throttling.slow.rx_rate=Math.round(1e3*obj.throttling.slow.rx_rate),obj.throttling.slow.tx_rate=Math.round(1e3*obj.throttling.slow.tx_rate);var list=[],sources=obj.blocklist.sources.split("\n");return Ext.Array.each(sources,function(s){""!=(s=s.trim())&&Ext.Array.push(list,s)}),obj.blocklist.sources=list,obj}});Ext.define("Fbx.ux.form.field.FilePicker",{extend:"Fbx.ux.form.field.PathPicker",alias:"widget.filepicker",requires:["Fbx.os.app.explorer.FileBrowserWindow","Fbx.os.lib.FbxUtils"],title:"Selectionnez un fichier",displayedMimeType:"any",pickDir:!1});Ext.define("Fbx.os.app.downloader.DownloadFormBase",{extend:"Ext.form.Panel",requires:["Ext.form.Label","Ext.form.FieldSet","Ext.form.field.File","Ext.form.FieldContainer","Ext.layout.component.FieldSet","Ext.form.field.Checkbox","Fbx.ux.form.field.PathPicker","Fbx.os.lib.FbxUtils"],closeAction:"hide",preventHeader:!0,width:500,bodyPadding:10,title:"Ajouter un téléchargement",setDefaultDlPath:function(dir){this.getForm().setValues({download_dir:dir})},submitForm:function(){var me=this,win=me.up("window"),form=me.getForm();form.isValid()?form.submit({url:FbxConf.apiBaseUrl+"downloads/add",success:function(f,action){form.reset(),win.close(),Ext.getStore("dlStore").load()},failure:function(form,action){win.close()}}):Ext.Msg.alert("Failed","Paramètres invalides")},initComponent:function(){var me=this;Ext.applyIf(me,{defaults:{anchor:"100%"},buttons:[{text:"Ajouter",iconCls:"btn-add",formBind:!0,handler:function(){me.submitForm()}},{text:"Annuler",iconCls:"btn-cancel",handler:function(me){var win=me.up("window");me.up("form").getForm().reset(),win.close()}}]}),me.callParent(arguments)}});Ext.define("Fbx.os.app.downloader.DownloadForm",{extend:"Fbx.os.app.downloader.DownloadFormBase",alias:"widget.downloadForm",requires:["Fbx.ux.form.field.PathPicker"],initComponent:function(){var me=this;Ext.applyIf(me,{items:[{xtype:"fieldset",title:"Télécharger depuis une URL",defaults:{anchor:"100%"},items:[{xtype:"textfield",fieldLabel:"",name:"download_url",vtype:"downloadUrl",allowBlank:!1,listeners:{specialkey:function(field,event){event.getKey()==event.ENTER&&me.submitForm()}}},{xtype:"displayfield",fieldLabel:"schémas supportés",labelWidth:150,value:"(http://, https://, ftp://, magnet:)"}]},{xtype:"fieldset",title:"Destination",defaults:{anchor:"100%",labelWidth:100},items:[{xtype:"pathpicker",value:"/Disque dur/Téléchargements",fieldLabel:"",name:"download_dir"}]}]}),me.callParent(arguments),me.on("boxready",function(){me.mon(me.up("window"),"show",function(){me.getForm().findField("download_url").focus("",10)})})}});Ext.define("Fbx.os.app.downloader.DownloadFormFile",{extend:"Fbx.os.app.downloader.DownloadFormBase",alias:"widget.downloadFormFile",requires:["Fbx.ux.form.field.File","Fbx.ux.form.field.PathPicker"],initComponent:function(){var me=this;Ext.applyIf(me,{items:[{xtype:"fieldset",title:"Télécharger depuis un fichier",defaults:{anchor:"100%"},items:[{xtype:"ux_filefield",name:"download_file",fieldLabel:"Fichier"},{xtype:"displayfield",fieldLabel:"Fichiers supportés",value:".nzb, .torrent"},{xtype:"hidden",name:"csrf_token",value:FbxConf.csrfToken}]},{xtype:"fieldset",title:"Destination",defaults:{anchor:"100%",labelWidth:100},items:[{xtype:"pathpicker",value:"/Disque dur/Téléchargements",fieldLabel:"",name:"download_dir"},{xtype:"textfield",name:"archive_password",labelWidth:200,fieldLabel:"Mot de passe pour l'extraction",allowBlank:!0}]}]}),me.callParent(arguments)}});Ext.define("Fbx.os.app.downloader.DownloadFormAdvanced",{extend:"Fbx.os.app.downloader.DownloadFormBase",alias:"widget.downloadFormAdvanced",requires:["Ext.form.field.TextArea","Fbx.ux.form.field.PathPicker"],initComponent:function(){var me=this;Ext.applyIf(me,{items:[{xtype:"fieldset",title:"Télécharger depuis une liste d'URL",defaults:{anchor:"100%"},items:[{xtype:"textarea",fieldLabel:"",name:"download_url_list",emptyText:"Liste d'URL séparées par un saut de ligne",allowBlank:!1},{xtype:"displayfield",fieldLabel:"schémas supportés",labelWidth:150,value:"(http://, https://, ftp://, magnet:)"},{xtype:"checkboxfield",fieldLabel:"",boxLabel:"Téléchargement récursif",name:"recursive",checked:!1},{xtype:"checkboxfield",fieldLabel:"",name:"needauth",checked:!1,boxLabel:"Authentification nécessaire",listeners:{change:function(field,newVal){var form=me.getForm();form.findField("username").setDisabled(!newVal),form.findField("password").setDisabled(!newVal)}}},{xtype:"textfield",name:"username",fieldLabel:"Utilisateur",disabled:!0},{xtype:"textfield",name:"password",inputType:"password",fieldLabel:"Mot de passe",disabled:!0}]},{xtype:"fieldset",title:"Destination",defaults:{anchor:"100%",labelWidth:100},items:[{xtype:"pathpicker",value:"/Disque dur/Téléchargements",fieldLabel:"",name:"download_dir"}]}]}),me.callParent(arguments),me.on("boxready",function(){me.mon(me.up("window"),"show",function(){me.getForm().findField("download_url_list").focus("",10)})})}});Ext.define("Fbx.os.app.downloader.DownloaderToolbar",{extend:"Ext.toolbar.Toolbar",requires:["Ext.button.Button","Fbx.os.app.downloader.DownloadForm","Fbx.os.app.downloader.DownloadFormFile","Fbx.os.app.downloader.DownloadFormAdvanced","Fbx.os.app.downloader.Settings","Fbx.os.app.downloader.RssForm","Fbx.os.app.downloader.RssFeedModel","Ext.form.field.Text","Ext.window.Window"],speedDlAdd:function(){var me=this,download_url=me.speedDlField.getValue();me.app.addDlFromUrl(download_url,function(){me.speedDlField.setValue("")})},initComponent:function(){var me=this;me.settingsForm=Ext.create("Fbx.os.app.downloader.Settings"),me.settingsForm.app=me.app,me.settingsForm.load(),me.speedDlField=Ext.create("Ext.form.field.Text",{name:"speeddl",value:"",fieldLabel:"Ajout direct",cls:"center",labelWidth:80,flex:1,listeners:{specialkey:function(field,event){event.getKey&&event.getKey()==event.ENTER&&me.speedDlAdd()}}}),Ext.apply(me,{defaults:{scale:"medium"},items:[{xtype:"button",tooltip:"Nouveau téléchargement",iconCls:"btn-24-add",text:"Nouveau téléchargement",menu:[{text:"Téléchargement depuis une URL",iconCls:"btn-world-add",handler:function(){me.app.showDlView(),me.downloadForm||(me.downloadForm=Ext.create("Ext.window.Window",{title:"Téléchargement depuis une URL",layout:"fit",modal:!0,closeAction:"hide",items:{xtype:"downloadForm"}}));var dlDir=me.settingsForm.getDefaultDlDir();me.downloadForm.down("form").setDefaultDlPath(dlDir),me.downloadForm.show()}},{text:"Téléchargement depuis un fichier",iconCls:"btn-page-add",handler:function(){me.app.showDlView(),me.downloadFormFile||(me.downloadFormFile=Ext.create("Ext.window.Window",{title:"Téléchargement depuis un fichier",layout:"fit",modal:!0,closeAction:"hide",items:{xtype:"downloadFormFile"}}));var dlDir=me.settingsForm.getDefaultDlDir();me.downloadFormFile.down("form").setDefaultDlPath(dlDir),me.downloadFormFile.show()}},{text:"Téléchargement avancé",iconCls:"btn-cog-add",handler:function(){me.app.showDlView(),me.downloadFormAdvanced||(me.downloadFormAdvanced=Ext.create("Ext.window.Window",{title:"Téléchargement avancé",layout:"fit",modal:!0,closeAction:"hide",items:{xtype:"downloadFormAdvanced"}}));var dlDir=me.settingsForm.getDefaultDlDir();me.downloadFormAdvanced.down("form").setDefaultDlPath(dlDir),me.downloadFormAdvanced.show()}}]},"-",{xtype:"button",tooltip:"Paramètres",text:"Paramètres",iconCls:"btn-24-setting-tools",handler:function(){me.settingsForm.getWindow().show()}},"-",{xtype:"button",tooltip:"Gestion des téléchargements",iconCls:"btn-24-control-play-blue",text:"Gestion",menu:[{text:"Tout suspendre",tooltip:"Suspendre les téléchargements",iconCls:"btn-control-pause-blue",handler:function(){me.app.downloadList.doWhenSuspended(function(){me.app.dlStore.each(function(record){record.pause()})})}},{text:"Tout reprendre",tooltip:"Reprendre les téléchargements",iconCls:"btn-control-play-blue",handler:function(){me.app.downloadList.doWhenSuspended(function(){me.app.dlStore.each(function(record){record.resume()})})}},{text:"Supprimer les tâches terminées",tooltip:"Supprimer les tâches terminées",iconCls:"btn-delete",handler:function(){me.app.downloadList.getSelectionModel().deselectAll(),me.app.showDlView(),me.app.dlStore.each(function(record){"done"==record.get("status")&&record.destroy()})}}]},"-",{text:"Flux RSS",iconCls:"btn-24-rss-add",menu:[{text:"Nouveau flux RSS",tooltip:"Ajouter un flux RSS",iconCls:"btn-rss-add",handler:function(){me.app.showRssView(),me.getRssForm().show()}},{text:"Mettre à jour les RSS",tooltip:"Forcer la mise à jour des flux RSS",iconCls:"btn-rss-refresh",handler:function(){me.app.showRssView(),Fbx.os.app.downloader.RssFeedModel.fetch(),setTimeout(function(){me.app.refreshRssList()},3e3)}}]},"-",me.speedDlField,{xtype:"button",iconCls:"btn-24-add",text:"",handler:function(){me.speedDlAdd()}}]}),this.callParent(arguments)},getRssForm:function(){var me=this;return me.rssForm||(me.rssForm=Ext.create("Fbx.os.app.downloader.RssForm"),me.rssForm.app=me.app),me.rssForm},destroy:function(){this.settingsWin&&this.settingsWin.destroy(),this.downloadForm&&this.downloadForm.destroy(),this.downloadFormFile&&this.downloadFormFile.destroy(),this.downloadFormAdvanced&&this.downloadFormAdvanced.destroy(),this.rssForm&&this.rssForm.destroy(),this.callParent()}});Ext.define("Fbx.os.app.grillepain.Wizard",{extend:"Ext.window.Window",requires:["Ext.data.ArrayStore","Ext.data.Store","Ext.form.FieldSet","Ext.form.Panel","Ext.form.field.Radio","Ext.panel.Panel","Ext.window.Window","Fbx.os.app.grillepain.VmModel","Fbx.ux.form.field.FilePicker"],title:"Ajouter une VM",width:450,height:300,modal:!0,statics:{allowMultipleInstance:!1,disabledInBridge:!1,docSection:"doc/index.html#TODO"},iconCls:"btn-system-monitor",initComponent:function(){var me=this;me.name="",me.first=Ext.create("Ext.form.FieldSet",{flex:1,layout:"fit",items:[{xtype:"fieldcontainer",layout:"anchor",defaults:{anchor:"100%"},fieldDefaults:{labelAlign:"top"},items:[{fieldLabel:"Choisissez un nom pour votre VM (facultatif)",xtype:"textfield",name:"vm_name",allowBlank:!0,maxLength:30,enforceMaxLength:30,listeners:{change:function(_this,text){me.name=text}}},{xtype:"box",autoEl:"div",height:20},{fieldLabel:"Comment souhaitez-vous installer votre VM",xtype:"radiogroup",name:"install_method",id:"install-method",columns:1,vertical:!0,items:[{boxLabel:"Installer depuis une image ISO",name:"method",inputValue:"iso",handler:function(_this,checked){checked&&(me.first.navNext=me.iso)}},{boxLabel:"Utiliser une image de disque virtuel existante",name:"method",inputValue:"disk",handler:function(_this,checked){checked&&(me.first.navNext=me.disk)}},{boxLabel:"Choisir un système d'exploitation pré-installé parmi une liste",name:"method",inputValue:"cloud",handler:function(_this,checked){checked&&(me.first.navNext=me.cloud)}}]}]}]}),me.first.navPrev=!1,me.first.hasNext=!0,me.first.hasPrev=!1,me.iso=Ext.create("Ext.form.Panel",{flex:1,defaults:{labelWidth:150,anchor:"100%"},border:!1,items:[{fieldLabel:"Image ISO",xtype:"filepicker",name:"cd_path",allowBlank:!1,ttip:"Le fichier ISO qui servira de CD-ROM",displayedMimeType:"application/x-cd-image",listeners:{pick:function(disc){var disc_path=Fbx.os.lib.FbxUtils.base64_decode(disc);Fbx.os.app.grillepain.lib.checkArch(disc_path,"",function(){})}}},{fieldLabel:"Taille du disque (Go)",name:"disk_size",xtype:"numberfield",minValue:2,value:5,step:5,maxValue:1e4,ttip:"La taille totale du disque dur virtuel qui sera créé. Attention à ne pas dépasser le maximum disponible sur votre disque dur."}],listeners:{activate:function(){me.iso.getForm().getValues().cd_path||me.iso.query("[name=cd_path]")[0].openPathWin()}}}),me.iso.navPrev=me.first,me.iso.hasNext=!1,me.iso.hasPrev=!0,me.iso.doneCb=function(){var formValues=me.iso.getForm().getValues();if(!formValues.cd_path)return void Ext.Msg.alert("Selectionnez un fichier","Veuillez sélectionner une image ISO pour votre VM");Fbx.os.app.grillepain.lib.setupVmWithIso(me.name,formValues.cd_path,formValues.disk_size,function(){me.close()})},me.disk=Ext.create("Ext.form.Panel",{flex:1,defaults:{labelWidth:150,anchor:"100%"},border:!1,items:[{fieldLabel:"Image disque",xtype:"filepicker",name:"disk_path",allowBlank:!1,ttip:"Le fichier qui servira de disque dur principal à la VM",listeners:{pick:function(disk){var disk_path=Fbx.os.lib.FbxUtils.base64_decode(disk);Fbx.os.app.grillepain.lib.checkArch(disk_path,"",function(){var type="raw";(disk_path.endsWith(".img")||disk_path.endsWith(".qcow2"))&&(type="qcow2"),me.cont.query("[name=disk_type]")[0].setValue(type)})}}},{fieldLabel:"Type de disque",xtype:"combobox",name:"disk_type",allowBlank:!1,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["qcow2","Qcow2"],["raw","Raw"]]}),displayField:"label",valueField:"type",mode:"local",typeAhead:!1,ttip:"Le type d’image disque à utiliser"}],listeners:{activate:function(){me.disk.getForm().getValues().disk_path||me.disk.query("[name=disk_path]")[0].openPathWin()}}}),me.disk.navPrev=me.first,me.disk.hasNext=!1,me.disk.hasPrev=!0,me.disk.doneCb=function(){var formValues=me.disk.getForm().getValues();return formValues.disk_path?formValues.disk_type?void Fbx.os.app.grillepain.lib.setupVmWithDisk(me.name,formValues.disk_path,formValues.disk_type,function(){me.close()}):void Ext.Msg.alert("Selectionnez un type","Veuillez sélectionner un type d'image disque pour votre VM"):void Ext.Msg.alert("Selectionnez un fichier","Veuillez sélectionner une image disque pour votre VM")},me.cloud=Ext.create("Ext.form.Panel",{flex:1,defaults:{labelWidth:150,anchor:"100%"},border:!1,items:[{fieldLabel:"Système pré-installé",xtype:"combobox",name:"distro",allowBlank:!1,ttip:"Le système d’exploitation à télécharger pour votre VM",store:new Ext.data.ArrayStore({fields:["type","label"],data:[["http://ftp.free.fr/.private/ubuntu-cloud/releases/disco/release-20190619/ubuntu-19.04-server-cloudimg-arm64.img","Ubuntu 19.04 (Disco)"],["https://cloud-images.ubuntu.com/eoan/current/eoan-server-cloudimg-arm64.img","Ubuntu 19.10 (Eoan)"],["http://ftp.free.fr/.private/debian-cloud/current-9/debian-9-openstack-arm64.qcow2","Debian 9 (Stretch)"],["http://ftp.free.fr/.private/debian-cloud/testing/debian-testing-openstack-arm64.qcow2","Debian Testing"],["http://ftp.free.fr/pub/Distributions_Linux/Fedora/releases/30/Cloud/aarch64/images/Fedora-Cloud-Base-30-1.2.aarch64.qcow2","Fedora 30"]]}),forceSelection:!0,displayField:"label",valueField:"type",mode:"local",typeAhead:!1},{fieldLabel:"Clé SSH",xtype:"textfield",name:"ssh_key",ttip:"Votre clé SSH publique pour vous connecter"},{fieldLabel:"Mot de passe (déconseillé)",xtype:"textfield",name:"password",ttip:"Le mot de passe de l’utilisateur par défaut de ce système."}]}),me.cloud.navPrev=me.first,me.cloud.hasNext=!1,me.cloud.hasPrev=!0,me.cloud.doneCb=function(){var formValues=me.cloud.getForm().getValues();return formValues.distro?formValues.ssh_key||formValues.password?void Fbx.os.app.grillepain.lib.setupVmFromCloud(me.name,formValues.distro,formValues.ssh_key,formValues.password,function(){me.close()}):void Ext.Msg.alert("Identification","Veuillez fournir une clé ssh publique ou un mot de passe pour pouvoir vous connecter au système"):void Ext.Msg.alert("Selectionnez un système","Veuillez un système d’exploitation pour votre VM")},me.cont=Ext.create("Ext.panel.Panel",{layout:"card",bodyStyle:"padding:15px",width:500,height:500,defaults:{border:!1},bbar:[{id:"move-prev",text:"Annuler",iconCls:"btn-cancel",handler:function(_btn){me.navigate("prev")}},"->",{id:"move-next",iconCls:"btn-next",text:"Suivant",handler:function(_btn){me.navigate("next")}}],items:[me.first,me.iso,me.disk]}),me.wizLayout=me.cont.getLayout(),me.btnPrev=Ext.getCmp("move-prev"),me.btnNext=Ext.getCmp("move-next"),Ext.applyIf(me,{layout:"fit",items:[{xtype:"panel",layout:"fit",bodyStyle:{border:0},items:[me.cont]}]}),me.callParent(arguments)},navigate:function(direction){var me=this,current=me.wizLayout.getActiveItem();if("next"===direction)current.hasNext&&current.navNext?me.wizLayout.setActiveItem(current.navNext):current.hasNext||current.doneCb();else if(current.hasPrev&&current.navPrev)me.wizLayout.setActiveItem(current.navPrev);else if(!current.hasPrev)return void me.close();current=me.wizLayout.getActiveItem(),current.hasPrev?(me.btnPrev.setIconCls("btn-previous"),me.btnPrev.setText("Retour")):(me.btnPrev.setIconCls("btn-cancel"),me.btnPrev.setText("Annuler")),current.hasNext?(me.btnNext.setIconCls("btn-next"),me.btnNext.setText("Suivant")):(me.btnNext.setIconCls("btn-accept"),me.btnNext.setText("Terminer"))}});Ext.define("Fbx.os.app.downloader.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.tab.Panel","Fbx.os.gui.grid.column.PercentColumn","Fbx.os.gui.grid.column.FileSizeColumn","Fbx.os.gui.grid.column.TransferSpeedColumn","Fbx.os.lib.FbxUtils","Fbx.os.gui.chart.SpeedChart","Fbx.os.app.downloader.TaskFilesGrid","Fbx.os.app.downloader.DownloadListGrid","Fbx.os.app.downloader.DownloadTaskModel","Fbx.os.app.downloader.DownloadInfosWin","Fbx.os.app.downloader.DownloadBlockWin","Fbx.os.app.downloader.BtTrackerGrid","Fbx.os.app.downloader.BtPeerGrid","Fbx.os.app.downloader.BtBlacklistGrid","Fbx.ux.state.AjaxProvider","Ext.menu.Menu","Fbx.os.app.downloader.DownloaderToolbar","Fbx.os.app.downloader.RssListGrid","Fbx.os.app.downloader.RssItemsGrid","Fbx.os.app.downloader.TaskLogTab","Ext.toolbar.Toolbar","Ext.toolbar.TextItem","Ext.data.Store","Ext.form.Label","Ext.container.Container","Ext.panel.Panel","Ext.menu.Item"],statics:{defaultName:"Téléchargements",defaultWidth:950,defaultHeight:600,allowMultipleInstance:!1,disabledInBridge:!0,docSection:"doc/index.html#gestionnaire-de-telechargements",allowFileDrop:!0,droppableFiles:{"application/x-nzb":!0,"application/x-bittorrent":!0},beforeLaunch:function(cb){if(navigator&&navigator.registerProtocolHandler&&navigator.registerProtocolHandler("magnet","./#magnet|%s","Lien magnet"),!Fbx.os.gui.Environment.boxHasUserStorage())return void Ext.Msg.confirm("Support de stockage non configuré","Pour utiliser cette application vous devez sélectionner un support de stockage et le définir comme support de stockage principal<br />Voulez vous configurer le support de stockage principal ?",function(res){"yes"===res&&Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.WizardExternalDisk")});var main_storage=Fbx.os.gui.Environment.getUserStorageVolume();Fbx.os.app.downloader.app.ensureVolumeIsAvailable(main_storage,function(available){available?cb():Ext.Msg.alert("Support de stockage non disponible","Le support de stockage principal "+main_storage+" n'est pas disponible")})},ensureVolumeIsAvailable:function(volume,cb){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"storage/partition/",method:"GET",success:function(response){var partitions=response.jsonData.result,found=!1;if(partitions)for(var i=0;i<partitions.length;++i){var p=partitions[i];if(p.label===volume){"mounted"===p.state&&(found=!0);break}}cb(found)}})}},stats:{done:-1},launch:function(args){var me=this;this.dlStore=Ext.create("Ext.data.Store",{storeId:"dlStore",model:"Fbx.os.app.downloader.DownloadTaskModel",remoteSort:!1,remoteFilter:!1,sorters:[{property:"queue_pos",direction:"ASC"}],pageSize:0,listeners:{remove:function(store,rec){me.downloadList&&me.downloadList.refreshSelection()}}}),this.rxSpeedLabel=Ext.create("Ext.form.Label",{text:"Réception : -",width:150,padding:"5 0 0 5"}),this.rxSpeed=Ext.create("Fbx.os.gui.chart.SpeedChart",{color:"blue",height:60,width:150,margin:0,padding:0}),this.txSpeedLabel=Ext.create("Ext.form.Label",{text:"Émission : -",width:150,padding:"0 0 0 5"}),this.txSpeed=Ext.create("Fbx.os.gui.chart.SpeedChart",{color:"red",height:60,width:150,margin:0,padding:0,scale:1024}),this.mon(me.dlStore,"load",function(store,records){var menuDone=me.filterMenu.getComponent("done-menu");if(menuDone){var doneNb=0;Ext.Array.each(records,function(r){var s=r.get("status");"done"!==s&&"seeding"!==s||(doneNb+=1)}),doneNb?menuDone.setText("Terminés ("+doneNb+")"):menuDone.setText("Terminés"),me.stats.done>0&&me.stats.done!==doneNb&&menuDone.hasCls&&!menuDone.hasCls("bold")&&menuDone.addCls("bold"),me.stats.done=doneNb}!me.dlStore.isLoading()&&me.dlContainer.isVisible()&&me.refreshDetail()}),me.dlStore.load();var defaultRefresh=function(){var tab=me.win.down("tabpanel").getActiveTab(),records=me.getSelectedRecord(),store=tab.getStore();if(!records||records.length>1)return void store.removeAll();var rec=records[0];rec&&(store.clearFilter(!0),store.filter([{property:"task_id",value:rec.get("id")}]),tab.task_id=rec.get("id"))};if(this.fileDetailTab=Ext.create("Fbx.os.app.downloader.TaskFilesGrid",{title:"Fichiers",stateful:!0,stateId:"downloader-filedetailtab",refresh:defaultRefresh,listeners:{beforeshow:function(tab){tab.refresh()}}}),this.trackerList=Ext.create("Fbx.os.app.downloader.BtTrackerGrid",{title:"Traqueurs",stateful:!0,stateId:"downloader-trackergrid",refresh:defaultRefresh,listeners:{beforeshow:function(tab){tab.refresh()}}}),this.peerList=Ext.create("Fbx.os.app.downloader.BtPeerGrid",{title:"Pairs",stateful:!0,stateId:"downloader-peergrid",refresh:defaultRefresh,listeners:{beforeshow:function(tab){tab.refresh()}}}),this.blacklist=Ext.create("Fbx.os.app.downloader.BtBlacklistGrid",{title:"Blacklist",stateful:!0,stateId:"downloader-blacklistgrid",refresh:defaultRefresh,listeners:{beforeshow:function(tab){tab.refresh()}}}),this.logTab=Ext.create("Fbx.os.app.downloader.TaskLogTab",{title:"Journal",stateful:!0,stateId:"downloader-logstab",refresh:function(){var records=me.getSelectedRecord();if(records&&1===records.length){var rec=records[0];rec&&me.logTab.setRecord(rec)}},listeners:{beforeshow:function(tab){tab.refresh()}}}),me.piecesTab=Ext.create("Fbx.os.app.downloader.DownloadBlockWin",{title:"Pièces",stateful:!0,stateId:"downloader-piecestab",refresh:function(){var records=me.getSelectedRecord();if(records&&1===records.length){var rec=records[0];rec&&me.piecesTab.setRecord(rec)}},listeners:{beforeshow:function(tab){tab.refresh()}}}),me.downloadList=Ext.create("Fbx.os.app.downloader.DownloadListGrid",{region:"center",stateful:!0,stateId:"downloader-listgrid",minHeight:200,store:me.dlStore,filterOnLoad:!0,remoteFilter:!1,listeners:{itemclick:function(){me.refreshDetail()}}}),me.dlToolbar=Ext.create("Fbx.os.app.downloader.DownloaderToolbar",{dock:"top",app:me}),me.dlContainer=Ext.create("Ext.container.Container",{layout:{type:"border"},defaults:{split:!0},items:[me.downloadList,{stateful:!0,stateId:"downloader-tabs",xtype:"tabpanel",height:190,activeTab:0,region:"south",items:[this.fileDetailTab,this.logTab,this.trackerList,this.peerList,this.piecesTab,this.blacklist]}]}),me.rssItemList=Ext.create("Fbx.os.app.downloader.RssItemsGrid",{region:"south",stateful:!0,height:200,stateId:"downloader-rss-itemlist"}),me.rssList=Ext.create("Fbx.os.app.downloader.RssListGrid",{stateful:!0,itemList:me.rssItemList,region:"center",stateId:"downloader-rss-grid",listeners:{cellclick:function(g,td,cellIndex,rec,tr,rowIndex,e,eOpts){var store=me.rssItemList.getStore();store.clearFilter(!0),store.filter([{property:"feed_id",value:rec.get("id")}])},selectionchange:function(model,selected){var store=me.rssItemList.getStore();if(selected&&1===selected.length){var rec=selected[0];store.clearFilter(!0),store.filter([{property:"feed_id",value:rec.get("id")}])}else store.loadData([],!1)}}}),me.rssContainer=Ext.create("Ext.container.Container",{layout:{type:"border"},defaults:{split:!0},items:[me.rssList,me.rssItemList]}),me.centerCard=Ext.create("Ext.panel.Panel",{layout:"card",region:"center",stateful:!0,stateId:"downloader-centercard",items:[me.dlContainer,me.rssContainer]}),me.throttleTb=Ext.create("Ext.toolbar.Toolbar",{items:[{itemId:"btn-normal",tooltip:"Forcer en mode rapide",iconCls:"btn-rocket",enableToggle:!0,toggleGroup:"speed-btn",handler:function(){me.confirmLimitChange("normal")}},{itemId:"btn-slow",tooltip:"Forcer en mode réduit",iconCls:"btn-turtle",enableToggle:!0,toggleGroup:"speed-btn",handler:function(){me.confirmLimitChange("slow")}},{itemId:"btn-hibernate",tooltip:"Suspendre le téléchargement",iconCls:"btn-stop",enableToggle:!0,toggleGroup:"speed-btn",handler:function(){me.confirmLimitChange("hibernate")}},"->",{itemId:"btn-schedule",tooltip:"Utiliser la planification",iconCls:"btn-calendar-view-month",enableToggle:!0,handler:function(){me.confirmLimitChange("schedule")}}]}),me.scheduleStatsRefresh=function(){if(!me.statsRefreshTimer){if(me.downloadList.inFailure)return void setTimeout(function(){me.scheduleStatsRefresh()},5e3);me.statsRefreshTimer=setTimeout(function(){me.statsRefreshTimer=null,me.statsRefresh()},Fbx.os.gui.Environment.accessibilityMode?1e4:1e3)}},me.rssMenuItem=Ext.create("Ext.menu.Item",{iconCls:"btn-rss",text:"Flux RSS",handler:function(btn){me.setBtnActive(btn),me.showRssView()}}),me.statsRefresh=function(){if(!me.statsLoading){if(me.suspendRefresh||me.suspendStatsRefresh)return void me.scheduleStatsRefresh();me.statsLoading=!0,Fbx.os.app.downloader.DownloadTaskModel.getStats(function(result){if(me.statsLoading=!1,me.rssMenuItem&&me.rssMenuItem.el&&(result.nb_rss_items_unread>0?(me.rssMenuItem.setText("RSS ("+result.nb_rss_items_unread+")"),me.rssMenuItem.hasCls("bold")||me.rssMenuItem.addCls("bold")):(me.rssMenuItem.setText("RSS"),me.rssMenuItem.hasCls("bold")&&me.rssMenuItem.removeCls("bold"))),me.scheduleStatsRefresh(),me.rxSpeed.pushValue(result.rx_rate),me.txSpeed.pushValue(result.tx_rate),me.rxSpeedLabel.setText("Réception : "+Fbx.os.lib.FbxUtils.rate(result.rx_rate)),me.txSpeedLabel.setText("Émission : "+Fbx.os.lib.FbxUtils.rate(result.tx_rate)),me.throttleTb.items.each(function(btn){if(btn.toggle){var state=btn.getItemId().replace(/^btn-/,"");"schedule"==state?btn.toggle(result.throttling_is_scheduled,!0):btn.toggle(result.throttling_mode==state,!0)}}),"error"===result.nzb_config_status.status&&me.curStats&&"error"!==me.curStats.nzb_config_status.status){var error_str={none:"",nzb_authentication_required:"Le serveur de news demande une authentification",bad_authentication:"Les identifiants utilisés sur le serveur de news sont invalides",connection_refused:"Vérifiez le port et l'adresse du serveur de news"},err=error_str[result.nzb_config_status.error];Ext.Msg.alert("Impossible de se connecter au serveur de news",err)}me.curStats=result,me.statusBarConnStatus.setText(me.curStats.conn_ready?'<div class="btn-access-allowed" style="float: left; margin-right: 10px;"></div><span style="color: lightgreen;">Connecté</span>':'<div class="btn-access-denied" style="float: left; margin-right: 10px;"></div><span style="color: orange;" data-qtitle="Non connecté" data-qtip="Si vous avez configuré le gestionnaire de téléchargement pour utiliser un VPN vérifiez que le serveur est bien connecté. &lt;br&gt;Vérifiez que les ports entrants bittorrent ne sont pas désactivés dans la gestion des ports">Non connecté</span>'),me.statusBarNbTask.setText(me.curStats.nb_tasks_active+" tâche(s) active(s) / "+me.curStats.nb_tasks),me.statusBarDht.setText(me.curStats.dht_stats.enabled?"DHT activée : "+me.curStats.dht_stats.node_count+" noeuds actifs":"DHT désactivée"),me.statusBarBlocklist.setText(me.curStats.blocklist_entries?me.curStats.blocklist_entries+" règles de blocage / "+me.curStats.blocklist_hits+" pairs bloqués":"Liste de blocage désactivée"),me.statusBarRss.setText(me.curStats.nb_rss+" flux RSS / "+me.curStats.nb_rss_items_unread+" item(s) non lu(s)"),me.statusBarPeers.setText(me.curStats.nb_peer+" pair(s) bittorrent");var nzbTxt="";switch(me.curStats.nzb_config_status.status){case"ok":nzbTxt="Newsgroups OK";break;case"checking":nzbTxt="Test newsgroups en cours";break;case"error":var errorStr={nzb_authentication_required:"Identifiants nécessaires",bad_authentication:"Identifiants invalides",connection_refused:"Connexion refusée"},err=errorStr[me.curStats.nzb_config_status.error];nzbTxt='Erreur newsgroups: <span style="color: red;">'+err+"</span>";break;default:nzbTxt=""}me.statusBarNews.setText(nzbTxt)},function(ajaxResult){if(me.statsLoading=!1,ajaxResult.error_code&&"hdd_not_found"===ajaxResult.error_code||"hdd_not_mounted"===ajaxResult.error_code)return void me.close();me.statsRefreshTimer&&clearTimeout(me.statsRefreshTimer),me.statsRefreshTimer=setTimeout(function(){(me.win?me.win.up("window"):null)&&(me.statsRefreshTimer=null,me.scheduleStatsRefresh())},1e4)})}},me.statsRefresh(),me.setBtnActive=function(btn){Ext.Array.each(btn.parentMenu.items.items,function(i){i.removeCls&&i.removeCls("dl-filter-active")}),btn.addCls("dl-filter-active")},me.filterMenu=Ext.create("Ext.menu.Menu",{floating:!1,width:150,region:"west",split:!0,stateful:!0,stateId:"downloader-westpanel",showSeparator:!1,style:{border:0},dockedItems:[{xtype:"panel",layout:{type:"vbox",align:"stretch"},dock:"bottom",height:178,width:"100%",style:{"background-color":"#EEE"},bbar:me.throttleTb,items:[this.rxSpeedLabel,this.rxSpeed,this.txSpeedLabel,this.txSpeed]}],items:[{xtype:"menuitem",canActivate:!1,plain:!0,cls:"bold",text:"Téléchargements",padding:5},{xtype:"menuitem",text:"Tous",iconCls:"app-icons-16-downloader",width:"100%",cls:"dl-filter-active",handler:function(btn){me.setBtnActive(btn),me.applyDlFilter(!1)}},{xtype:"menuitem",iconCls:"btn-download-downloading",text:"En cours",handler:function(btn){me.setBtnActive(btn),me.applyDlFilter({filterFn:function(rec,id){var status=rec.get("status");return"done"!==status&&"error"!==status}})}},{xtype:"menuitem",iconCls:"btn-download-seeding",text:"Partagés",handler:function(btn){me.setBtnActive(btn),me.applyDlFilter({filterFn:function(rec,id){return"seeding"===rec.get("status")}})}},{xtype:"menuitem",iconCls:"btn-download-done",itemId:"done-menu",text:"Terminés",handler:function(btn){me.setBtnActive(btn),me.applyDlFilter({filterFn:function(rec,id){var status=rec.get("status");return"seeding"===status||"done"===status}}),btn.hasCls("bold")&&btn.removeCls("bold")}},{xtype:"menuitem",iconCls:"btn-download-error",text:"Erreurs",handler:function(btn){me.setBtnActive(btn),me.applyDlFilter({filterFn:function(rec,id){return"error"===rec.get("status")}})}},"-",{xtype:"menuitem",canActivate:!1,plain:!0,cls:"bold",text:"Flux RSS",padding:5},me.rssMenuItem]}),me.statusBarConnStatus=Ext.create("Ext.toolbar.TextItem",{text:""}),me.statusBarNbTask=Ext.create("Ext.toolbar.TextItem",{text:""}),me.statusBarDht=Ext.create("Ext.toolbar.TextItem",{text:""}),me.statusBarBlocklist=Ext.create("Ext.toolbar.TextItem",{text:""}),me.statusBarRss=Ext.create("Ext.toolbar.TextItem",{text:""}),me.statusBarPeers=Ext.create("Ext.toolbar.TextItem",{text:""}),me.statusBarNews=Ext.create("Ext.toolbar.TextItem",{text:""}),me.statusBar=Ext.create("Ext.toolbar.Toolbar",{height:25,cls:"downloader-statusbar",items:[me.statusBarConnStatus,"->",me.statusBarNbTask,"|",me.statusBarPeers,"|",me.statusBarDht,"|",me.statusBarBlocklist,"|",me.statusBarRss,"|",me.statusBarNews]}),this.win=Ext.create("Ext.panel.Panel",{stateful:!0,stateId:"downloader-mainpanel",layout:{type:"border"},bbar:me.statusBar,dockedItems:[me.dlToolbar],items:[me.centerCard,me.filterMenu],listeners:{boxready:function(){me.dlToolbar.speedDlField.focus("",100)}}}),this.mainWindow.add(this.win),args&&args.magnet){var idx=args.magnet.indexOf("&dn="),display_name=args.magnet;if(idx>0){var end=args.magnet.indexOf("&",idx+1);display_name=end>0?decodeURIComponent(args.magnet.substring(idx+4,end)):decodeURIComponent(args.magnet.substring(idx+4))}Ext.Msg.confirm("Ajout de téléchargement","Confirmez vous l'ajout du téléchargement "+display_name+"?",function(btn){"yes"===btn&&me.addDlFromUrl(args.magnet)})}this.callParent()},addDlFromUrl:function(download_url,cb){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"downloads/add",params:{download_url:download_url},success:function(response){cb&&cb()}})},confirmLimitChange:function(mode){var me=this,needConfirm=!0,title="Forcer le mode de téléchargement",msg="Voulez-vous désactiver la planification et ";if("schedule"===mode)me.curStats.throttling_is_scheduled&&(needConfirm=!1),title="Activer la planification",msg="Voulez-vous activer la planification des limites de téléchargements ?";else switch(me.curStats.throttling_is_scheduled||(needConfirm=!1),mode){case"normal":msg+="utiliser les limites de téléchargement normales ?";break;case"slow":msg+="utiliser les limites de téléchargement réduites ?";break;case"hibernate":msg+="suspendre les téléchargements ?"}needConfirm?(me.suspendStatsRefresh=!0,Ext.Msg.confirm(title,msg,function(btn){me.suspendStatsRefresh=!1,"yes"===btn&&Fbx.os.app.downloader.DownloadTaskModel.setThrottling(mode,me.statsRefresh)})):Fbx.os.app.downloader.DownloadTaskModel.setThrottling(mode,me.statsRefresh)},refreshRssList:function(){this.rssList.getStore().load()},showRssView:function(){var me=this;me.centerCard.getLayout().setActiveItem(1),me.refreshRssList()},showDlView:function(){var me=this;me.centerCard.getLayout().setActiveItem(0),me.dlStore.isLoading()||me.dlStore.load()},applyDlFilter:function(filter){var me=this;me.dlStore.clearFilter(!0),filter&&me.dlStore.filter(filter),me.showDlView()},refreshDetail:function(){var me=this,records=me.getSelectedRecord(),type="";if(records&&1===records.length){type=records[0].get("type"),type!==me.prevType&&(me.win.down("tabpanel").setActiveTab(0),me.prevType=type),me.logTab.setDisabled(!1),me.fileDetailTab.setDisabled(!1),me.trackerList.setDisabled("bt"!==type),me.peerList.setDisabled("bt"!==type),me.blacklist.setDisabled("bt"!==type),me.piecesTab.setDisabled("bt"!==type)}else{me.trackerList.setDisabled(!0),me.peerList.setDisabled(!0),me.fileDetailTab.setDisabled(!0),me.logTab.setDisabled(!0),me.blacklist.setDisabled(!0),me.piecesTab.setDisabled(!0);me.fileDetailTab.getStore().loadData({},!1),me.win.down("tabpanel").setActiveTab(0)}var activeTab=me.win.down("tabpanel").getActiveTab();"bt"!==type&&(activeTab!==me.trackerList&&activeTab!==me.peerList&&activeTab!==me.blacklist&&activeTab!==me.piecesTab||me.win.down("tabpanel").setActiveTab(0)),activeTab.refresh&&activeTab.refresh()},getSelectedRecord:function(){return this.downloadList.refreshSelection(),this.downloadList.getSelectedRecord()},stopRefresh:function(){this.refreshTimer&&clearTimeout(this.refreshTimer),this.statsRefreshTimer&&clearTimeout(this.statsRefreshTimer)},destroy:function(){this.stopRefresh(),this.rssList.destroy(),this.downloadList.destroy(),this.trackerList.destroy(),this.peerList.destroy(),this.blacklist.destroy(),this.callParent()},close:function(){this.stopRefresh(),this.callParent()},handleFileDrop:function(filesArray){try{Ext.Array.each(filesArray,function(f){var xhr=Ext.Ajax.newRequest({});xhr.onreadystatechange=function(){if(xhr&&4===xhr.readyState){var rep=xhr.responseText;try{var res=Ext.decode(rep);return!res.success&&res.msg&&Ext.Msg.alert("Erreur",res.msg),res}catch(e){Ext.Msg.alert("Erreur","Une erreur est survenue, vérifiez que le fichier que vous envoyez n'est pas trop gros")}}};var fd=new FormData;xhr.open("POST",FbxConf.apiBaseUrl+"downloads/add",!0),xhr.setRequestHeader("X-Fbx-Freebox0S",1),fd.append("download_file",f),fd.append("csrf_token",FbxConf.csrfToken),xhr.send(fd)})}catch(error){Ext.Msg.alert("Erreur","Une erreur est survenue pendant l'ajout du fichier")}}});Ext.define("Fbx.os.app.grillepain.app",{extend:"Fbx.os.core.task.Desktop",requires:["Ext.panel.Panel","Ext.grid.Panel","Ext.form.Panel","Ext.data.Store","Ext.data.ArrayStore","Ext.form.field.ComboBox","Ext.form.field.Checkbox","Ext.selection.RowModel","Ext.slider.Single","Fbx.os.app.grillepain.lib","Fbx.os.app.grillepain.Console","Fbx.os.app.grillepain.Screen","Fbx.os.app.grillepain.Wizard","Fbx.ux.form.AjaxFormPanel","Fbx.ux.form.field.FilePicker","Fbx.os.app.grillepain.VmModel"],statics:{grillePainEnabled:!0,defaultName:"Le Computer",defaultWidth:750,defaultHeight:490,allowMultipleInstance:!1,disabledInBridge:!1,docSection:"doc/index.html#TODO",contextText:"Lancer la VM",contextIcon:"btn-player-play",mimeType:"application/vnd.freebox.raw-disk-image",appDefinition:{name:"Computer",application:"Fbx.os.app.grillepain.app",order:120,defaultDesktop:!0,qtip:"Gérez votre vm",menu:"root",isNew:!0}},launch:function(){var me=this;Fbx.os.gui.Environment.boxHasGrillePain()&&(me.vmStore=Ext.create("Ext.data.Store",{model:"Fbx.os.app.grillepain.VmModel",listeners:{load:function(_t,records,_successful,_eOpts){me.vmSettings.disabled&&me.vmSettings.enable();var selRecs=me.vmList.selModel.getSelection(),formRec=me.vmSettings.getRecord();if(formRec&&formRec.phantom)return me.vmSettings.updateRecord(formRec),recs=me.vmStore.add(formRec),void me.vmList.selModel.select(recs[0]);if((!selRecs||0==selRecs.length||!formRec)&&records&&records.length>=1)return void me.vmList.selModel.select(me.vmStore.first());if(selRecs&&1==selRecs.length){var item=me.vmStore.getById(selRecs[0].get("id"));if(item)return void me.vmList.selModel.select(item)}var selected=[];for(x in selRecs){var item=me.vmStore.getById(selRecs[x].get("id"));item&&selected.push(item)}if(me.vmList.selModel.select(selected),formRec){var loaded=me.vmStore.getById(formRec.get("id"));if(loaded)return void me.updateForm(loaded)}if(selected.length>0)return void me.updateForm(selected[0]);me.vmSettings.getForm().reset(),me.vmSettings.disable()}}}),me.vmList=Ext.create("Ext.grid.Panel",{region:"west",border:0,width:350,hideHeaders:!0,store:me.vmStore,selModel:new Ext.selection.RowModel({mode:"MULTI"}),buttons:[{text:"Ajouter une VM",iconCls:"btn-add",id:"btn-add-vm",handler:function(){Ext.create("Fbx.os.app.grillepain.Wizard",{vm:me.vm}).show()}},{text:"Supprimer",iconCls:"btn-delete",handler:function(){var recs=me.vmList.selModel.getSelection(),vmMessage="cette VM";recs.length>1&&(vmMessage="ces "+recs.length+" VMs"),Ext.MessageBox.confirm("Suppression","Êtes-vous sûr de vouloir supprimer "+vmMessage+" ?",function(btn){"yes"==btn&&(me.vmStore.remove(recs),me.vmStore.save({success:function(){me.vmStore.count()>0&&me.vmList.selModel.select(me.vmStore.first()),me.vmStore.load()},failure:function(){me.vmStore.add(recs)}}),0==me.vmStore.count()&&me.vmStore.load())})}}],columns:[{xtype:"templatecolumn",width:40,tpl:'<div class="desktop-icon app-icons-80-grillepain" style="float: left;"></div>'},{dataIndex:"generated_name"}],viewConfig:{loadMask:!1,emptyText:'<div style="text-align: center; padding: 10px">Aucune VM</div>'},listeners:{select:function(_grid,rec,_item,_index,_e,_eOpts){me.vmSettings.disabled&&me.vmSettings.enable(),me.updateForm(rec);var toolbar=me.cont.getDockedItems('toolbar[dock="top"]')[0],onButton=toolbar.getComponent("on-button"),offButton=toolbar.getComponent("off-button");switch(rec.get("status")){case"running":onButton.disable(),offButton.enable();break;case"stopped":onButton.enable(),offButton.disable()}toolbar.getComponent("screen-button").setDisabled(!rec.get("enable_screen"))},beforedeselect:function(_this,record,_index,_eOpts){(record.phantom||record.dirty)&&me.vmSettings.updateRecord(record)}},forceFit:!0,renderTo:Ext.getBody()}),me.vmStore.load(),me.vmSettings=Ext.create("Fbx.ux.form.AjaxFormPanel",{region:"center",border:0,bodyPadding:10,flex:1,bodyStyle:{border:0},bodyPadding:10,layout:"anchor",defaults:{anchor:"100%"},items:[{xtype:"fieldset",flex:1,title:"État",defaults:{labelWidth:150,anchor:"100%"},items:[{fieldLabel:"Statut",xtype:"displayfield",name:"pretty_status"}]},{xtype:"fieldset",flex:1,title:"Configuration de la VM",defaults:{labelWidth:150,anchor:"100%"},items:[{fieldLabel:"Nom",xtype:"textfield",name:"name",allowBlank:!0,maxLength:30,enforceMaxLength:30,ttip:"Un nom à donner à votre VM"},{fieldLabel:"Image disque",xtype:"filepicker",name:"disk_path",allowBlank:!1,ttip:"Le fichier qui servira de disque dur principal à la VM",listeners:{pick:function(disk){var disk_path=Fbx.os.lib.FbxUtils.base64_decode(disk);Fbx.os.app.grillepain.lib.checkArch(disk_path,"",function(){var type="raw";(disk_path.endsWith(".img")||disk_path.endsWith(".qcow2"))&&(type="qcow2"),me.vmSettings.query("[name=disk_type]")[0].setValue(type)})}}},{fieldLabel:"Type de disque",xtype:"combobox",name:"disk_type",allowBlank:!1,store:new Ext.data.ArrayStore({fields:["type","label"],data:[["qcow2","Qcow2"],["raw","Raw"]]}),displayField:"label",valueField:"type",mode:"local",typeAhead:!1,ttip:"Le type d’image disque à utiliser"},{fieldLabel:"CD-ROM",xtype:"filepicker",name:"cd_path",allowBlank:!0,displayedMimeType:"application/x-cd-image",ttip:"Le fichier ISO qui servira de CD-ROM (facultatif)",listeners:{pick:function(disc){var disc_path=Fbx.os.lib.FbxUtils.base64_decode(disc);Fbx.os.app.grillepain.lib.checkArch(disc_path,"",function(){})}},button:{xtype:"button",text:"Ejecter",iconCls:"btn-control-eject-blue",handler:function(button){button.up("[name=cd_path]").clear()}}},{fieldLabel:"CPUs",name:"vcpus",xtype:"slider",afterSubTpl:'<div class="slider-label" style="width: 100%;"><span>1</span><span align="right" style="position: absolute;align-content: right;right: 32px;">'+me.totalCPUs()+"</span></div>",value:2,minValue:1,increment:1,maxValue:me.totalCPUs(),ttip:"Nombre de processeurs virtuels"},{fieldLabel:"RAM (Mo)",name:"memory",xtype:"numberfield",value:512,minValue:256,step:16,maxValue:me.totalMem(),ttip:"Mémoire totale affectée à la VM"},{fieldLabel:"Écran virtuel",name:"enable_screen",xtype:"checkboxfield",ttip:"Activer l’affichage dans la VM. Peut consommer plus de resources.",checked:!0},{fieldLabel:"Configuration cloud-init",name:"enable_cloudinit",xtype:"checkboxfield",ttip:'Pré-configurer la VM avec des paramètres cloud-init.io: fonctionne au premier boot des images de distribution Linux dites "cloud" ou "openstack".',handler:function(_this,checked){me.vmSettings.query("[name=cloudinit_hostname]")[0].setDisabled(!checked),me.vmSettings.query("[name=cloudinit_userdata]")[0].setDisabled(!checked)}},{fieldLabel:"Nom d’hôte cloud-init",name:"cloudinit_hostname",xtype:"textfield",itemId:"cloudinit-hostname",regex:/^[A-Za-z0-9-]{1,60}$/,regexText:"Le nom d’hôte contient des caractères invalides. Seuls les lettres sans accents et les chiffres sont autorisés.",maxLength:60,enforceMaxLength:!0,ttip:"Le nom d’hôte à configurer au premier démarrage pour une distribution Linux compatible cloud-init",disabled:!0},{fieldLabel:"cloud-init user-data",name:"cloudinit_userdata",xtype:"textareafield",itemId:"cloudinit-userdata",maxLength:4096,ttip:'Le contenu yaml brute du fichier "user-data" dans le format Cloud-config tel que décrit dans la documentation cloud-init.',disabled:!0}]}],submitForm:function(closeOnSubmit){if(me.vmSettings.isValid()){var rec=me.vmSettings.getRecord();me.vmSettings.updateRecord(rec),rec.save({callback:function(newrecord,_b,_c){me.vmSettings.loadRecord(newrecord),closeOnSubmit&&me.close()}})}}}),me.centerPanel=Ext.create("Ext.panel.Panel",{layout:"border",border:0,bodyStyle:{border:0},defaults:{split:!0,bodyPadding:15},items:[me.vmList,me.vmSettings]}),me.cont=Ext.create("Ext.panel.Panel",{layout:"fit",autoScroll:!0,items:[me.centerPanel],dockedItems:[{xtype:"toolbar",defaults:{border:0},items:[{iconCls:"btn-access-allowed",text:"Allumer",itemId:"on-button",handler:function(){me.currentVm().start()}},{iconCls:"btn-access-denied",text:"Éteindre",itemId:"off-button",handler:function(){me.currentVm().shutdown()}},{iconCls:"btn-system-monitor",text:"Console",handler:function(){var vm=me.currentVm(),console=Ext.create("Fbx.os.app.grillepain.Console",{vm:vm});console.show(),me.monitor(console,vm.get("id"))}},{iconCls:"btn-host-workstation",text:"Écran",itemId:"screen-button",handler:function(){var vm=me.currentVm(),screen=Ext.create("Fbx.os.app.grillepain.Screen",{vm:vm});screen.show(),me.monitor(screen,vm.get("id"))}}]}],listeners:{afterrender:function(){},resize:function(){}}}),me.mainWindow.add(me.cont),me.callParent(arguments),Fbx.os.gui.Environment.registerNotif("vm","state_changed",this,function(_x,_state){me.vmStore.load()}))},updateForm:function(rec){var me=this;me.vmSettings.show(),me.vmSettings.loadRecord(rec)},currentVm:function(){return this.vmList.selModel.getSelection()[0]},totalCPUs:function(){return Fbx.os.app.grillepain.lib.totalCPUs},totalMem:function(){return Fbx.os.app.grillepain.lib.totalMem},monitor:function(component,id){this.vmStore.addListener({load:function(_t,records,_successful,_eOpts){if(id)for(x in records)records[x].get("id")==id&&component&&component.isVisible()&&component.refreshStatus(records[x])}})}});Ext.define("Fbx.os.core.TaskManager",{singleton:!0,extend:"Ext.util.Observable",requires:["Ext.grid.Panel","Ext.picker.Date","Ext.form.Basic","Fbx.os.core.task.Desktop","Fbx.os.core.task.TaskModel","Ext.tip.QuickTipManager","Fbx.os.app.tv.app","Fbx.os.app.settings.app","Fbx.os.app.contacts.app","Fbx.os.app.explorer.app","Fbx.os.app.downloader.app","Fbx.os.app.calls.app","Fbx.os.app.lanbrowser.app","Fbx.os.app.help.app","Fbx.os.app.quickstart.app","Fbx.os.app.pvr.app","Fbx.os.app.epg.app","Fbx.os.app.grillepain.app"],lastTid:0,runningTaskCount:0,taskList:[],windowSink:null,focusedApp:null,setWindowSink:function(manager){this.windowSink=manager},getTask:function(tid){return this.taskList[tid]},getTasks:function(){return this.taskList},getTaskCount:function(){return this.runningTaskCount},taskKilled:function(tid){for(var me=this,i=0;i<me.taskList.length;i++)if(me.taskList[i].tid==tid){me.taskList.splice(i,1);break}me.runningTaskCount--,this.fireEvent("taskChanged")},allocTid:function(){return++this.lastTid},markFocused:function(task){this.focusedApp&&this.focusedApp.stateChanged(),this.focusedApp=task,"Fbx.os.app.quickstart.app"==task.className?document.location.hash="":document.location.hash="#"+task.className},getAppInstances:function(name){var me=this,classObj=Ext.ClassManager.get(name),instances=[];if(!classObj)return null;for(var i in me.taskList){var task=me.taskList[i];Ext.getClassName(task)==name&&Ext.Array.push(instances,task)}return instances.length?instances:null},startApplication:function(name,args){var me=this,qtip=Ext.tip.QuickTipManager.getQuickTip();qtip&&qtip.hide();var d=new Date;me.launchTime=d.getTime();var classObj=Ext.ClassManager.get(name);if(!classObj)return console.error("Unknown application : "+name),null;if(!classObj.isOpenBar&&!Fbx.os.gui.Environment.isLogged)return Fbx.os.gui.Environment.promptLogin(name),null;if(classObj.instances&&!classObj.allowMultipleInstance){for(var i in me.taskList){var task=me.taskList[i];if(Ext.getClassName(task)==name)return task.activate(),task.setArgs&&task.setArgs(args),task}return null}if(classObj.beforeLaunch)return void classObj.beforeLaunch(function(){me.__startApp(name,classObj,args)});classObj.disabledInBridge?Fbx.os.gui.Environment.getNetworkConf(function(netConf){"bridge"==netConf.mode?Ext.Msg.alert("Mode routeur requis","Cette fonctionnalité n'est pas disponible lorsque votre Freebox est configurée en mode Bridge !"):me.__startApp(name,classObj,args)}):me.__startApp(name,classObj,args)},__startApp:function(name,classObj,args){var me=this,task=Ext.create(name,{windowSink:me.windowSink,name:classObj.name});me.taskList.push(task),me.runningTaskCount++,task.launch(args),task.addListener("killed",me.taskKilled,me),me.fireEvent("appStarted",task),me.fireEvent("taskChanged"),_paq.push(["trackPageView","App/"+name])},applyNetConf:function(netConf){var me=this;if("bridge"==netConf.mode)for(var i in me.taskList){var task=me.taskList[i],classObj=Ext.ClassManager.getClass(task);if(classObj.disabledInBridge)return task.terminate(),task}},constructor:function(config){var me=this;return this.callParent(),me.addEvents({appStarted:!0,taskChanged:!0}),this}});Ext.define("Fbx.os.gui.panel.Taskbar",{extend:"Ext.container.Container",requires:["Ext.Button","Fbx.os.core.TaskManager","Ext.menu.Menu"],buttonsPerTid:null,nbBtn:0,setButton:function(btn){var app=btn.app,text=app.mainWindow.title;app.isMinimized()&&(text+=" (état minimisé)"),btn.el&&btn.el.dom&&btn.el.dom.setAttribute("aria-label",text),btn.setText(app.name),btn.btnEl&&btn.toggle(app.isFocused())},onTaskButtonClick:function(btn){var app=btn.app;app.isMinimized()||!app.isFocused()?app.activate():app.minimize()},updateAppButton:function(app){var me=this,b=me.buttonsPerTid[app.tid];null!=b&&me.setButton(b,app)},removeAppButton:function(tid){var me=this,b=me.buttonsPerTid[tid];null!=b&&(delete me.buttonsPerTid[tid],b.destroy(),me.nbBtn-=1)},onTaskChanged:function(task){return this.updateAppButton(task)},onTaskKilled:function(tid){return this.removeAppButton(tid)},getBtnCtxMenu:function(){var me=this;return me.btnCtxMenu||(me.btnCtxMenu=Ext.create("Ext.menu.Menu",{items:[{text:"Fermer",iconCls:"btn-cancel",handler:function(){me.btnCtxMenu.app.close()}},{text:"Maximiser",iconCls:"btn-application-double",handler:function(){me.btnCtxMenu.app.maximize()}}]})),me.btnCtxMenu},createAppButton:function(task){var me=this;if("desktop"==task.type){var app=task;app.addListener("killed",me.onTaskKilled,this),app.addListener("changed",me.onTaskChanged,this);var config={flex:1,enableToggle:!0,allowDepress:!1,scale:"large",toggleGroup:"taskbar",height:44,pressed:app.isFocused(),cls:"fbx-taskbar",iconCls:"app-icons-32-sprite "+app.getIconCls(32),handler:me.onTaskButtonClick,ariaLbl:"Barre des tâches - "+app.name,listeners:{afterrender:function(btn){var el=btn.getEl();btn.removeCls("x-btn-icon-text-left");var b=btn;el.on("contextmenu",function(e){var menu=me.getBtnCtxMenu();menu.app=b.app,menu.showAt(e.getXY())}),el.dom.setAttribute("tabindex",50+me.nbBtn)}}};me.vertical?(config.maxHeight=32,config.margin="0 0 5 0"):(config.maxWidth=200,config.margin="0 5 0 0");var b=Ext.create("Ext.Button",config);return b.app=app,app.taskbarBtn=b,me.setButton(b,app),me.buttonsPerTid[app.tid]=b,me.add(b),me.nbBtn+=1,b}},constructor:function(config){var me=this;me.buttonsPerTid={},config=Ext.apply(config,{layout:{type:"vbox",align:"stretch"},flex:1,listeners:{afterrender:function(){me.el.dom.setAttribute("role","menubar")}}}),config.vertical||(config.layout.type="hbox"),this.callParent([config]),Fbx.os.core.TaskManager.addListener("appStarted",me.createAppButton,this)}});Ext.define("Fbx.os.gui.PanelManager",{singleton:!0,requires:["Fbx.os.gui.PanelContainer","Fbx.os.gui.Panel","Fbx.os.gui.panel.StartMenu","Fbx.os.gui.panel.Taskbar","Fbx.os.gui.panel.ActivityBtn","Fbx.os.gui.panel.Clock","Fbx.os.gui.panel.Toggles","Fbx.os.gui.panel.ExternalDiskStatus"],conts:{},desktop:null,getContainers:function(){this.init();var c=[];for(var p in this.conts)c.push(this.conts[p]);return c},getContainer:function(region){return this.init(),conts[region]},init:function(){var me=this;if(!me.__ready){for(var regions=["south"],i=0;i<regions.length;i++){var cont=Ext.create("Fbx.os.gui.PanelContainer",{panelContainerPosition:regions[i],region:regions[i]});me.conts[regions[i]]=cont}this.loadPanels()}},loadPanels:function(){var me=this,panels=[{panelPosition:"south",panelSize:50,cls:"freeboxos-southbar",panelElements:[{type:"Fbx.os.gui.panel.StartMenu"},{type:"Fbx.os.gui.panel.Taskbar"}]}];Fbx.os.gui.Environment.isLogged&&(panels[0].panelElements.push({type:"Fbx.os.gui.panel.ActivityBtn",ariaLbl:"Liste des tâches en cours"}),panels[0].panelElements.push({type:"Fbx.os.gui.panel.Toggles"}),panels[0].panelElements.push({type:"Fbx.os.gui.panel.ExternalDiskStatus"})),panels[0].panelElements.push({type:"Fbx.os.gui.panel.Clock"});for(var i=0;i<panels.length;i++){var config=panels[i];config.panelContainer=me.conts[panels[i].panelPosition],Ext.create("Fbx.os.gui.Panel",config)}}});Ext.define("Fbx.os.gui.Environment",{singleton:!0,extend:"Ext.util.Observable",requires:["Fbx.Ajax","Fbx.MenuOverride","Ext.Button","Ext.container.Viewport","Fbx.os.core.TaskManager","Fbx.os.gui.Desktop","Fbx.os.gui.PanelManager","Ext.state.Manager","Fbx.ux.state.AjaxProvider","Ext.layout.container.Border","Fbx.os.lib.FbxUtils","Ext.data.ArrayStore","Ext.util.KeyMap","Fbx.os.gui.panel.TaskList","Ext.tip.QuickTipManager","Ext.state.CookieProvider","Fbx.os.gui.ApplicationModel","Ext.util.LocalStorage","Ext.state.LocalStorageProvider","Fbx.os.app.settings.WizardExternalDisk","Ext.container.Container"],desktop:null,accessibilityMode:!1,systemInfos:null,boxModelInfo:null,isLogged:!1,externalProperty:"env-external-notice",getStateProvider:function(){var me=this;return me.__stateProvider||(me.isLogged&&!me.storage_unavailable?me.__stateProvider=Ext.create("Fbx.ux.state.AjaxProvider"):Ext.util.LocalStorage.supported?me.__stateProvider=Ext.create("Ext.state.LocalStorageProvider"):me.__stateProvider=Ext.create("Ext.state.CookieProvider",{expires:new Date((new Date).getTime()+31536e6)})),me.__stateProvider},setStorageUnavailable:function(){var me=this;me.storage_unavailable||(me.storage_unavailable=!0,console.warn("storage is unavailble"),me.__stateProvider=null,me.getStateProvider())},setAccessibility:function(enabled){if(Fbx.os.gui.Environment.accessibilityMode!==enabled){var data={enabled:enabled};Fbx.os.gui.Environment.getStateProvider().set("accessibilityMode",data),setTimeout(function(){alert("Le mode accessibilité est maintenant "+(enabled?"activé":"désactivé")+".\nLa page va maintenant être rechargée"),location.reload(!0)},1e3)}},init:function(){var me=this;Ext.override(Ext.state.Provider,{encodeValue:function(value){return Ext.JSON.encode(value)},decodeValue:function(value){try{return Ext.JSON.decode(value)}catch(e){return null}}}),Ext.override(Ext.form.action.Submit,{handleResponse:function(response){var rs,errors,i,len,records,form=this.form,errorReader=form.errorReader;if(errorReader){if(rs=errorReader.read(response),records=rs.records,errors=[],records)for(i=0,len=records.length;i<len;i++)errors[i]=records[i].data;return errors.length<1&&(errors=null),{success:rs.success,errors:errors}}try{var res=Ext.decode(response.responseText);return!res.success&&res.msg&&Ext.Msg.alert("Erreur",res.msg),res}catch(e){Ext.Msg.alert("Erreur","Une erreur est survenue, vérifiez que le fichier que vous envoyez n'est pas trop gros")}}}),Ext.override(Ext.form.field.Date,{rawToValue:function(rawValue){var val=this.parseDate(rawValue);return val?(val.setTime(val.getTime()-6e4*val.getTimezoneOffset()),val):rawValue||null}}),Ext.override(Ext.form.FieldContainer,{initComponent:function(){return this.labelSeparator="&nbsp;:",this.callOverridden(arguments)}}),Ext.override(Ext.form.field.Base,{requires:["Ext.tip.QuickTipManager"],initComponent:function(){var me=this;return me.labelSeparator="&nbsp;:",me.ttip&&""!==me.ttip&&(me.beforeSubTpl||(me.beforeSubTpl=""),me.afterSubTpl||(me.afterSubTpl=""),me.beforeSubTpl+='<div role="presentation" style="padding-right: 30px; width: 100%; position: relative;">',me.afterSubTpl+='  <div role="tooltip" class="btn-help help-ttip" aria-label="'+Ext.String.htmlEncode(me.ttip)+'" data-qtip="'+Ext.String.htmlEncode(me.ttip)+'"></div></div>'),this.callOverridden(arguments)}});var toolTypesStr={close:"Fermer",collapse:"Réduire",down:"Bas",expand:"Etendre",gear:"Paramètres",help:"Aide",left:"Gauche",maximize:"Maximiser",minimize:"Minimiser",minus:"Moins",next:"Suivant",plus:"ajouter",prev:"précédant",print:"imprimer",refresh:"rafraîchir",restore:"restorer",right:"droite",save:"sauver",search:"chercher",toggle:"toggle",up:"haut"};return Ext.override(Ext.panel.Tool,{initComponent:function(){var me=this,tooltip=me.tooltip||me.qtip;tooltip&&""!==tooltip||!me.type||toolTypesStr[me.type]&&(me.ariaLbl=toolTypesStr[me.type]),me.callParent()},afterRender:function(){var me=this;me.callParent(),me.el.dom.setAttribute("role","button")}}),Ext.override(Ext.Component,{afterRender:function(){var me=this;me.callParent(),me.tooltip&&me.el.dom.setAttribute("aria-label",me.tooltip),me.ariaLbl&&me.el.dom.setAttribute("aria-label",me.ariaLbl)}}),Ext.override(Ext.data.proxy.Rest,{buildUrl:function(request){var me=this,operation=request.operation,records=operation.records||[],record=records[0],prevAppend=me.appendId;record&&record.phantom&&(me.appendId=!1);var res=this.callOverridden(arguments);return me.appendId=prevAppend,res}}),Ext.override(Ext.form.field.Checkbox,{onChange:function(newVal,oldVal){var me=this;me.inputEl&&me.inputEl.set({"aria-checked":newVal}),this.callOverridden(arguments)}}),Ext.override(Ext.data.Store,{loadRecords:function(records,options){var me=this;me.fireEvent("afterload",me,options&&options.autorefresh),me.callOverridden(arguments)}}),Ext.override(Ext.grid.column.Column,{getStateId:function(){var me=this;return me.dataIndex?me.dataIndex:me.callOverridden(arguments)}}),Ext.override(Ext.grid.column.Date,{defaultRenderer:function(value){var me=this,m=Fbx.os.lib.FbxUtils.getParisMoment(value),d=new Date(m.valueOf()+60*((new Date).getTimezoneOffset()+m.utcOffset())*1e3);return Ext.util.Format.date(d,me.format)}}),Ext.override(Ext.selection.Model,{deselectAll:function(suppressEvent){var me=this;me.callOverridden(arguments);me.selected.getCount();me.selected.getCount()&&me.selected.removeAll()},select:function(records,keepExisting,suppressEvent){var me=this;keepExisting||me.deselectAll(suppressEvent),me.callOverridden(arguments)}}),Fbx.os.lib.FbxUtils.init(),Ext.tip.QuickTipManager.init(),Fbx.os.gui.ApplicationModel.init(),Ext.apply(Ext.tip.QuickTipManager.getQuickTip(),{minWidth:250}),me.addEvents("networkConfChanged","filemoved","filecopied","filedeleted","toogleneedrefresh"),Ext.getDoc().on("contextmenu",function(e,t,eOpts){return"INPUT"==t.nodeName||"A"==t.nodeName&&"_blank"==t.getAttribute("target")||"OBJECT"==t.nodeName||(e.preventDefault(),!1)}),Fbx.os.gui.Environment.isLogged?Fbx.os.core.AppSettings.load(function(){me.init2()}):me.init2(),this},init2:function(){var me=this,stateProvider=Fbx.os.gui.Environment.getStateProvider(),d=stateProvider.get("accessibilityMode");d&&(Fbx.os.gui.Environment.accessibilityMode=d.enabled),me.desktop=Ext.create("Fbx.os.gui.Desktop");var center_cont=Ext.create("Ext.container.Container",{region:"center",layout:{type:"fit"},items:[me.desktop]}),conts=[];conts=conts.concat([center_cont],Fbx.os.gui.PanelManager.getContainers());Ext.create("Ext.container.Viewport",{layout:"border",items:conts});Fbx.os.core.TaskManager.setWindowSink(center_cont),me.mon(me,"networkConfChanged",Fbx.os.core.TaskManager.applyNetConf,Fbx.os.core.TaskManager),Fbx.os.gui.Environment.isLogged&&(me.taskWin=Ext.create("Fbx.os.gui.panel.TaskList",{desktopCenter:center_cont}));var data=stateProvider.get(Fbx.os.app.quickstart.app.lastSeenProperty,{lastSeen:0});Fbx.os.app.quickstart.app.shouldLaunch(data.lastSeen)&&Fbx.os.core.TaskManager.startApplication("Fbx.os.app.quickstart.app",data.lastSeen),Fbx.os.gui.Environment.isLogged?Fbx.os.gui.Environment.getSystemInfos(function(infos){switch(infos.disk_status){case"not_detected":case"disabled":case"error":return void(infos.box_authenticated&&Ext.Msg.alert("Problème de disque dur","Le disque dur de votre Freebox est actuellement indisponible, certains services risquent de ne pas fonctionner correctement. <br />Essayez de procéder à une vérification de votre disque dur",function(){Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.Storage")}))}if(!me.boxHasUserStorage()){if(!stateProvider.get(Fbx.os.gui.Environment.externalProperty,{ignoreExternalHdd:0}).ignoreExternalHdd)return void Fbx.os.core.TaskManager.startApplication("Fbx.os.app.settings.WizardExternalDisk")}Fbx.os.gui.Environment.boxHasGrillePain()?Fbx.os.app.grillepain.lib.getInfos(function(){me.init3()}):me.init3()}):me.init3()},init3:function(){if(""!==document.location.hash){var name=document.location.hash.substr(1);if("magnet|"===name.substr(0,7)){var magnet=decodeURIComponent(name.substr(7));if(""===magnet)return;if(!Fbx.os.gui.Environment.isLogged)return void Fbx.os.gui.Environment.promptLogin(name);Fbx.os.core.TaskManager.startApplication("Fbx.os.app.downloader.app",{magnet:magnet})}else Fbx.os.gui.Environment.isLogged&&Fbx.os.core.TaskManager.startApplication(name)}},boxHasHdd:function(){if(!this.boxModelInfo)throw"boxHasHdd called before box model info loaded";return this.boxModelInfo.has_internal_hdd},boxHasRaid:function(){if(!this.boxModelInfo)throw"boxHasRaid called before box model info loaded";return this.boxModelInfo.customer_hdd_slots>1},boxHasUserStorage:function(){if(!this.systemInfos)throw"boxHasUserStorage called before system info loaded";return this.systemInfos.user_main_storage&&""!==this.systemInfos.user_main_storage},boxHasDect:function(){if(!this.boxModelInfo)throw"boxHasDect called before box model info loaded";return this.boxModelInfo.has_dect},boxHasGrillePain:function(){if(!this.boxModelInfo)throw"boxHasGrillePain called before box model info loaded";return!!Fbx.os.app.grillepain.app.grillePainEnabled&&this.boxModelInfo.has_grillepain},boxHasExpansionModules:function(){if(!this.boxHasExpansionModules)throw"boxHasExpansionModule called before box model info loaded";return Fbx.os.gui.Environment.boxModelInfo.has_expansions},boxHasExpansionModule:function(exp_type){if(!this.boxModelInfo)throw"boxHasExpansionModule called before box model info loaded";if(!Fbx.os.gui.Environment.boxModelInfo.has_expansions)return!1;for(var i in Fbx.os.gui.Environment.systemInfos.expansions){var e=Fbx.os.gui.Environment.systemInfos.expansions[i];if(e.present&&e.supported&&e.type===exp_type)return!0}return!1},getUserStorageVolume:function(){if(!this.systemInfos)throw"getUserStorageVolume called before system info loaded";return this.systemInfos.user_main_storage},getSystemInfos:function(cb,forceRefresh){if(Fbx.os.gui.Environment.systemInfos&&!forceRefresh)return void(cb&&cb(Fbx.os.gui.Environment.systemInfos));Ext.Ajax.request({url:FbxConf.apiBaseUrl+"system/",method:"GET",success:function(response){var r=response.jsonData.result;Fbx.os.gui.Environment.systemInfos=r,Fbx.os.gui.Environment.boxModelInfo=r.model_info,cb&&cb(Fbx.os.gui.Environment.systemInfos)}})},promptLogin:function(app){Ext.Msg.confirm("Accès refusé !","Voulez-vous vous connecter pour accéder à cette fonctionnalité ?",function(rep){if("yes"===rep){var url="./login.php";app&&(url+="#"+app),document.location=url}})},__networkConf:null,cacheNetworkConf:function(conf){var me=this;me.__networkConf=conf,me.fireEvent("networkConfChanged",me.__networkConf)},getNetworkConf:function(callback,force){var me=this;if(this.__networkConf&&!force)return void(callback&&callback(this.__networkConf));Ext.Ajax.request({url:FbxConf.apiBaseUrl+"lan/config/",method:"GET",success:function(response){me.cacheNetworkConf(response.jsonData.result),callback&&callback(me.__networkConf)}})},notifyFileMove:function(files,dstDir,isDirRename){var changes=[],decoded=Fbx.os.lib.FbxUtils.base64_decode(dstDir);if(decoded){dstDir=decoded.replace(/\/$/,"");for(var i in files){var to,from=Fbx.os.lib.FbxUtils.base64_decode(files[i]);to=isDirRename?Fbx.os.lib.FbxUtils.base64_encode(dstDir):Fbx.os.lib.FbxUtils.base64_encode(dstDir+"/"+Fbx.os.lib.FbxUtils.basename(from)),Ext.Array.push(changes,{from:files[i],to:to})}changes.length&&Fbx.os.gui.Environment.fireEvent("filemoved",changes)}},notifyFileCopy:function(files,dstDir){var changes=[];dstDir=Fbx.os.lib.FbxUtils.base64_decode(dstDir).replace(/\/$/,"");for(var i in files){var from=Fbx.os.lib.FbxUtils.base64_decode(files[i]),to=Fbx.os.lib.FbxUtils.base64_encode(dstDir+"/"+Fbx.os.lib.FbxUtils.basename(from));Ext.Array.push(changes,{from:files[i],to:to})}changes.length&&Fbx.os.gui.Environment.fireEvent("filecopied",changes)},notifyFileDelete:function(files){var changes=[];for(var i in files){var from=files[i];Ext.Array.push(changes,{from:from,to:""})}changes.length&&Fbx.os.gui.Environment.fireEvent("filedeleted",changes)},__doReboot:function(mode){var jsonData={};mode&&(jsonData.mode=mode),Ext.Ajax.request({url:FbxConf.apiBaseUrl+"system/reboot/",method:"POST",jsonData:jsonData,success:function(response,opts){setTimeout(function(){document.location="./reboot.php"},500)}})},reboot:function(mode,noconfirm){var me=this;noconfirm?me.__doReboot(mode):Ext.MessageBox.confirm("Redémarrage","Êtes-vous sûr de vouloir redémarrer votre freebox ?",function(btn){"yes"==btn&&me.__doReboot(mode)})},__notifWs:null,__notifListeners:{},registerNotif:function(event_source,event_name,thiz,cb){if(!window.WebSocket)return console.warn("WebSocket non supporté"),!1;if(!Fbx.os.gui.Environment.__notifWs){var ws=new WebSocket(FbxConf.websocketBaseUrl+"event/");ws.onclose=function(e){console.warn("notif ws close",e),Fbx.os.gui.Environment.__notifWs=null},ws.onerror=function(ev){console.warn("notif ws onerror",ev),Fbx.os.gui.Environment.__notifWs=null},ws.onmessage=function(msg){var reply;try{reply=JSON.parse(msg.data)}catch(e){return console.error("Failed to parse response "+e,msg.data),void upload.ws.close(1007,"Invalid json "+e)}if(!reply.success)return void console.warn("event ws fail",reply);switch(reply.action){case"register":return;case"notification":var k=reply.source+"_"+reply.event,l=Fbx.os.gui.Environment.__notifListeners;if(!l[k])return;for(var idx in l[k])l[k][idx](idx,reply.result);break;default:return void console.warn("unexpected action: ",reply)}},ws.onopen=function(msg){var events=[];for(k in Fbx.os.gui.Environment.__notifListeners)events.push(k);var cmd=JSON.stringify({action:"register",events:events});ws.send(cmd)},Fbx.os.gui.Environment.__notifWs=ws}var k=event_source+"_"+event_name,l=Fbx.os.gui.Environment.__notifListeners,need_register=!1;if(l[k]||(l[k]={},need_register=!0),l[k][thiz.id]=cb,need_register&&Fbx.os.gui.Environment.__notifWs.readyState==WebSocket.OPEN){var cmd=JSON.stringify({action:"register",events:[k]});Fbx.os.gui.Environment.__notifWs.send(cmd)}},unregisterNotif:function(thiz){for(k in Fbx.os.gui.Environment.__notifListeners)delete Fbx.os.gui.Environment.__notifListeners[k][thiz.id]}});Ext.Loader.setConfig({enabled:!0,paths:{Ext:"ext/src",Fbx:"fbx"}}),Ext.application({name:"FreeboxOS",requires:["Ext.form.action.Submit","Fbx.Ajax","Fbx.os.gui.Environment"],launch:function(){Ext.Ajax.request({url:FbxConf.apiBaseUrl+"login/",method:"GET",success:function(response){var res=response.jsonData.result;Fbx.os.gui.Environment.isLogged=res.logged_in,Fbx.os.gui.Environment.init()}}),function(){var u=("https:"==document.location.protocol?"https":"http")+"://statsweb.proxad.net/";_paq.push(["setTrackerUrl",u+"piwik.php"]),_paq.push(["setSiteId","8"]);var d=document,g=d.createElement("script"),s=d.getElementsByTagName("script")[0];g.type="text/javascript",g.defer=!0,g.async=!0,g.src=u+"piwik.js",s.parentNode.insertBefore(g,s)}()}}),Ext.onReady(function(){Ext.USE_NATIVE_JSON=!0});Ext.onReady(function(){Ext.Date&&(Ext.Date.shortMonthNames=["Janv","Févr","Mars","Avr","Mai","Juin","Juil","Août","Sept","Oct","Nov","Déc"],Ext.Date.getShortMonthName=function(month){return Ext.Date.shortMonthNames[month]},Ext.Date.monthNames=["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],Ext.Date.monthNumbers={Janvier:0,Janv:0,"Février":1,"Févr":1,Mars:2,Avril:3,Avr:3,Mai:4,Juin:5,Juillet:6,Juil:6,"Août":7,Septembre:8,Sept:8,Octobre:9,Oct:9,Novembre:10,Nov:10,"Décembre":11,"Déc":11},Ext.Date.getMonthNumber=function(name){return Ext.Date.monthNumbers[Ext.util.Format.capitalize(name)]},Ext.Date.dayNames=["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],Ext.Date.getShortDayName=function(day){return Ext.Date.dayNames[day].substring(0,3)},Ext.Date.parseCodes.S.s="(?:er)",Ext.Date.getSuffix=function(){return 1==this.getDate()?"er":""}),Ext.util&&Ext.util.Format&&Ext.apply(Ext.util.Format,{thousandSeparator:".",decimalSeparator:",",currencySign:"€",dateFormat:"d/m/Y"})}),Ext.define("Ext.locale.fr.view.View",{override:"Ext.view.View",emptyText:""}),Ext.define("Ext.locale.fr.grid.plugin.DragDrop",{override:"Ext.grid.plugin.DragDrop",dragText:"{0} ligne{1} sélectionnée{1}"}),Ext.define("Ext.locale.fr.tab.Tab",{override:"Ext.tab.Tab",closeText:"Fermer cette onglet"}),Ext.define("Ext.locale.fr.view.AbstractView",{override:"Ext.view.AbstractView",loadingText:"En cours de chargement..."}),Ext.define("Ext.locale.fr.picker.Date",{override:"Ext.picker.Date",todayText:"Aujourd'hui",minText:"Cette date est antérieure à la date minimum",maxText:"Cette date est postérieure à la date maximum",disabledDaysText:"",disabledDatesText:"",nextText:"Mois suivant (CTRL+Flèche droite)",prevText:"Mois précédent (CTRL+Flèche gauche)",monthYearText:"Choisissez un mois (CTRL+Flèche haut ou bas pour changer d'année.)",todayTip:"{0} (Barre d'espace)",format:"d/m/y",startDay:1}),Ext.define("Ext.locale.fr.picker.Month",{override:"Ext.picker.Month",okText:"&#160;OK&#160;",cancelText:"Annuler"}),Ext.define("Ext.locale.fr.toolbar.Paging",{override:"Ext.PagingToolbar",beforePageText:"Page",afterPageText:"sur {0}",firstText:"Première page",prevText:"Page précédente",nextText:"Page suivante",lastText:"Dernière page",refreshText:"Actualiser la page",displayMsg:"Page courante {0} - {1} sur {2}",emptyMsg:"Aucune donnée à afficher"}),Ext.define("Ext.locale.fr.form.Basic",{override:"Ext.form.Basic",waitTitle:"Veuillez patienter..."}),Ext.define("Ext.locale.fr.form.field.Base",{override:"Ext.form.field.Base",invalidText:"La valeur de ce champ est invalide"}),Ext.define("Ext.locale.fr.form.field.Text",{override:"Ext.form.field.Text",minLengthText:"La longueur minimum de ce champ est de {0} caractère(s)",maxLengthText:"La longueur maximum de ce champ est de {0} caractère(s)",blankText:"Ce champ est obligatoire",regexText:"",emptyText:null}),Ext.define("Ext.locale.fr.form.field.Number",{override:"Ext.form.field.Number",decimalPrecision:2,minText:"La valeur minimum de ce champ doit être de {0}",maxText:"La valeur maximum de ce champ doit être de {0}",nanText:"{0} n'est pas un nombre valide",negativeText:"La valeur de ce champ ne peut être négative"}),Ext.define("Ext.locale.fr.form.field.File",{override:"Ext.form.field.File",buttonText:"Parcourir..."}),Ext.define("Ext.locale.fr.form.field.Date",{override:"Ext.form.field.Date",disabledDaysText:"Désactivé",disabledDatesText:"Désactivé",minText:"La date de ce champ ne peut être antérieure au {0}",maxText:"La date de ce champ ne peut être postérieure au {0}",invalidText:"{0} n'est pas une date valide - elle doit être au format suivant: {1}",format:"d/m/y",altFormats:"d/m/Y|d-m-y|d-m-Y|d/m|d-m|dm|dmy|dmY|d|Y-m-d"}),Ext.define("Ext.locale.fr.form.field.ComboBox",{override:"Ext.form.field.ComboBox",valueNotFoundText:void 0},function(){Ext.apply(Ext.form.field.ComboBox.prototype.defaultListConfig,{loadingText:"En cours de chargement..."})}),Ext.define("Ext.locale.fr.form.field.VTypes",{override:"Ext.form.field.VTypes",emailText:'Ce champ doit contenir une adresse email au format: "usager@example.com"',urlText:'Ce champ doit contenir une URL au format suivant: "http://www.example.com"',alphaText:"Ce champ ne peut contenir que des lettres et le caractère souligné (_)",alphanumText:"Ce champ ne peut contenir que des caractères alphanumériques ainsi que le caractère souligné (_)"}),Ext.define("Ext.locale.fr.form.field.HtmlEditor",{override:"Ext.form.field.HtmlEditor",createLinkText:"Veuillez entrer l'URL pour ce lien:"},function(){Ext.apply(Ext.form.field.HtmlEditor.prototype,{buttonTips:{bold:{title:"Gras (Ctrl+B)",text:"Met le texte sélectionné en gras.",cls:Ext.baseCSSPrefix+"html-editor-tip"},italic:{title:"Italique (Ctrl+I)",text:"Met le texte sélectionné en italique.",cls:Ext.baseCSSPrefix+"html-editor-tip"},underline:{title:"Souligné (Ctrl+U)",text:"Souligne le texte sélectionné.",cls:Ext.baseCSSPrefix+"html-editor-tip"},increasefontsize:{title:"Agrandir la police",text:"Augmente la taille de la police.",cls:Ext.baseCSSPrefix+"html-editor-tip"},decreasefontsize:{title:"Réduire la police",text:"Réduit la taille de la police.",cls:Ext.baseCSSPrefix+"html-editor-tip"},backcolor:{title:"Couleur de surbrillance",text:"Modifie la couleur de fond du texte sélectionné.",cls:Ext.baseCSSPrefix+"html-editor-tip"},forecolor:{title:"Couleur de police",text:"Modifie la couleur du texte sélectionné.",cls:Ext.baseCSSPrefix+"html-editor-tip"},justifyleft:{title:"Aligner à gauche",text:"Aligne le texte à gauche.",cls:Ext.baseCSSPrefix+"html-editor-tip"},justifycenter:{title:"Centrer",text:"Centre le texte.",cls:Ext.baseCSSPrefix+"html-editor-tip"},justifyright:{title:"Aligner à droite",text:"Aligner le texte à droite.",cls:Ext.baseCSSPrefix+"html-editor-tip"},insertunorderedlist:{title:"Liste à puce",text:"Démarre une liste à puce.",cls:Ext.baseCSSPrefix+"html-editor-tip"},insertorderedlist:{title:"Liste numérotée",text:"Démarre une liste numérotée.",cls:Ext.baseCSSPrefix+"html-editor-tip"},createlink:{title:"Lien hypertexte",text:"Transforme en lien hypertexte.",cls:Ext.baseCSSPrefix+"html-editor-tip"},sourceedit:{title:"Code source",text:"Basculer en mode édition du code source.",cls:Ext.baseCSSPrefix+"html-editor-tip"}}})}),Ext.define("Ext.locale.fr.grid.header.Container",{override:"Ext.grid.header.Container",sortAscText:"Tri croissant",sortDescText:"Tri décroissant",columnsText:"Colonnes"}),Ext.define("Ext.locale.fr.grid.GroupingFeature",{override:"Ext.grid.feature.Grouping",emptyGroupText:"(Aucun)",groupByText:"Grouper par ce champ",showGroupsText:"Afficher par groupes"}),Ext.define("Ext.locale.fr.grid.PropertyColumnModel",{override:"Ext.grid.PropertyColumnModel",nameText:"Propriété",valueText:"Valeur",dateFormat:"d/m/Y",trueText:"vrai",falseText:"faux"}),Ext.define("Ext.locale.fr.form.field.Time",{override:"Ext.form.field.Time",minText:"L'heure de ce champ ne peut être antérieure à {0}",maxText:"L'heure de ce champ ne peut être postérieure à {0}",invalidText:"{0} n'est pas une heure valide",format:"H:i",altFormats:"g:ia|g:iA|g:i a|g:i A|h:i|g:i|H:i|ga|h a|g a|g A|gi|hi|Hi|gia|hia|g|H"}),Ext.define("Ext.locale.fr.form.CheckboxGroup",{override:"Ext.form.CheckboxGroup",blankText:"Vous devez sélectionner au moins un élément dans ce groupe"}),Ext.define("Ext.locale.fr.form.RadioGroup",{override:"Ext.form.RadioGroup",blankText:"Vous devez sélectionner au moins un élément dans ce groupe"}),Ext.define("Ext.locale.fr.window.MessageBox",{override:"Ext.window.MessageBox",buttonText:{ok:"OK",cancel:"Annuler",yes:"Oui",no:"Non"}}),Ext.define("Ext.locale.fr.Component",{override:"Ext.Component"});


Partager le fichier freeboxos.min.js.js sur le Web et les réseaux sociaux:


Télécharger le fichier freeboxos.min.js.js


Télécharger freeboxos.min.js.js