
jgrouse={_startupFile:'jgrouse.js',_closeHooks:[]};if(typeof jgrouse_config=='undefined')
{jgrouse_config={};}
jgrouse._global=this;jgrouse.$break="break exception";jgrouse.Exception=function(messageCode,params)
{this._messageCode=messageCode;this._params=params;}
jgrouse.Exception.prototype={toString:function()
{return this._messageCode;}}
jgrouse.notImplemented=function(methodName)
{throw new jgrouse.Exception('notImplemented '+methodName);}
jgrouse.addUnloadHook=function(func)
{jgrouse._closeHooks.push(func);}
jgrouse.dummy=function()
{}
jgrouse.log={NONE:0,ERROR:1,WARN:2,INFO:3,DEBUG:4,ALL:99,_map:{'NONE':0,'ERROR':1,'WARN':2,'INFO':3,'DEBUG':4,'ALL':99},_revMap:['N/A','ERROR','WARN','INFO','DEBUG'],_level:jgrouse_config.logLevel?jgrouse_config.logLevel:0,_handlers:{},_mapLevel:function(level)
{if(typeof level=='string')
{level=this._map[level.toUpperCase(level)]||0;}
return level;},strLevel:function(level)
{if(typeof level=='number')
{return this._revMap[level];}
return level;},log:function(level,message,sender)
{level=this._mapLevel(level);if(level<=jgrouse.log._level)
{jgrouse.forEach(jgrouse.log._handlers,function(handler,handlerName)
{if(handlerName=='.'||(sender&&sender.length>=handlerName.length&&sender.indexOf(handlerName)==0&&(sender.length==handlerName.length||sender.length[handler.length-1]=='.')))
{handler.log(level,message,sender);}});}},error:function(message,sender)
{this.log(this.ERROR,message,sender);},warn:function(message,sender)
{this.log(this.WARN,message,sender);},info:function(message,sender)
{this.log(this.INFO,message,sender);},debug:function(message,sender)
{this.log(this.DEBUG,message,sender);},setLevel:function(level)
{level=this._mapLevel(level);jgrouse.log._level=level;},addHandler:function(logger,loggerName)
{if(!loggerName)
{loggerName='.';}
jgrouse.log._handlers[loggerName]=logger;}}
jgrouse.log.setLevel(jgrouse.log._level);if(!jgrouse.logHandlers)
{jgrouse.logHandlers={};}
jgrouse.logHandlers.ConsoleLog=function()
{return this;}
jgrouse.logHandlers.ConsoleLog.prototype={log:function(level,message,sender)
{if(typeof console!='undefined')
{var msg=sender?sender:'';msg+='['+jgrouse.log.strLevel(level)+']:'+message;console.log(msg);}}}
if(jgrouse_config.initLogs)
{jgrouse_config.initLogs();}
jgrouse.getTransport=function()
{jgrouse.notImplemented('jgrouse.getTransport');};(function()
{var standardTransport=function()
{return new XMLHttpRequest();}
var ids=['Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP','Microsoft.XMLHTTP'];var found=null;var msTransport=function()
{if(found)
{return new ActiveXObject(found);}
else
{for(var i=ids.length-1;i>=0;i--)
{try
{var v=new ActiveXObject(ids[i]);found=ids[i];return v;}
catch(e)
{}}
if(found==null)
{throw'XMLHttpRequest is not available';}}}
jgrouse.getTransport=(jgrouse._global.XMLHttpRequest)?standardTransport:msTransport;})()
jgrouse.standardConstructor=function()
{if(!this._prototyping)
{this.initialize.apply(this,arguments);}
return this;}
jgrouse.create=function(className)
{var name=className.split('.');var current=jgrouse._global;for(var i=0;i<name.length-1;i++)
{var part=name[i];if(!current[part])
{current[part]={};}
current=current[part];}
var lastPart=name[name.length-1];current[lastPart]=function()
{return jgrouse.standardConstructor.apply(this,arguments);};return current[lastPart];}
jgrouse.define=function(subclassName,superclassName,properties)
{if(arguments.length==1&&typeof subclassName=='object')
{var v=subclassName;subclassName=v.subclassName;superclassName=v.superclassName;properties=v.properties;}
jgrouse.ClassLoader.instance.define(subclassName,superclassName,properties);}
jgrouse.module=function(name,requires,imports,body,postInit)
{if(arguments.length==1&&typeof name=='object')
{var v=name;name=v.name;requires=v.requires;body=v.body;imports=v.imports;postInit=v.postInit;}
if(jgrouse.ClassLoader.instance._deferLoading)
{jgrouse.ClassLoader.instance.addModule(name,requires,imports,body,postInit);}
else
{window.setTimeout(function()
{jgrouse.ClassLoader.instance.addModule(name,requires,imports,body,postInit);},1);}}
jgrouse.require=function(module,callback)
{var arr=null;if(typeof module=='string')
{arr=[module];}
else
{arr=module;}
function checker()
{for(var i=0;i<arr.length;i++)
{if(!jgrouse.ClassLoader.instance.isLoaded(arr[i]))
{return;}}
callback();}
for(var i=0;i<arr.length;i++)
{jgrouse.ClassLoader.instance.requireModule(arr[i],checker);}}
jgrouse.resolveName=function(name)
{var arr=name.split('.');var current=jgrouse._global;for(var i=0;i<arr.length;i++)
{var part=arr[i];if(current[part])
{current=current[part];}
else return null;}
return current;}
jgrouse.fullUrl=function(url)
{var d=url.split('?')[0].split('#')[0];if(d.indexOf('://')>0)
{return url;}
if(url.charAt(0)=='/')
{return window.location.protocol+'//'+window.location.hostname+url;}
d=window.location.href.split('?')[0].split('#')[0];if(d.charAt(d.length-1)!='/')
{var v=d.split('/');v.pop();d=v.join('/')+'/';}
return d+url;}
jgrouse.getImportString=function(utilName)
{var arr=utilName.split('.');var last=arr.pop();if(last=='*')
{var newName=arr.join('.');var baseObj=jgrouse.resolveName(newName);var result=[];jgrouse.forEach(baseObj,function(value,name)
{var res='var '+name+'='+newName+'.'+name+';';result.push(res);});return result.join(' ');}
else
{return'var '+last+'='+arr.join('.')+'.'+last+';'}}
jgrouse.forEach=function(arr,func,backwards)
{try
{if(arr instanceof Array)
{if(backwards)
{for(var i=arr.length-1;i>=0;i--)
{func(arr[i],i);}}
else
{for(var i=0;i<arr.length;i++)
{func(arr[i],i);}}}
else if(typeof arr=='object')
{var dummy={};for(var i in arr)
{if(arr[i]!=dummy[i])
{func(arr[i],i);}}}}
catch(ex)
{if(ex!=jgrouse.$break)
{throw ex;}}}
jgrouse.Module=function(name,requires,moduleImports,body,postInit,classLoader)
{this._name=name;if(typeof requires=='string')
{this._requires=[requires];}
else
{this._requires=requires;}
this._body=body;this._classes=[];this._classLoader=classLoader;if(typeof moduleImports=='string')
{this._moduleImports=[moduleImports];}
else
{this._moduleImports=moduleImports;}
this._postInit=postInit;this._resources={};return this;}
jgrouse.Module.prototype={_requiredLoaded:function()
{if(this._requires)
{for(var i=this._requires.length;i--;i>=0)
{if(!jgrouse.ClassLoader.instance._isLoaded(this._requires[i]))
{return false;}}}
return true;},_getModuleImports:function()
{var res='';if(this._moduleImports)
{jgrouse.forEach(this._moduleImports,function(item,index)
{res+=jgrouse.getImportString(item);});}
return'{'+res+'}';},initModule:function()
{jgrouse.log.info('initializing '+this._name);var strImp=this._getModuleImports();strImp+=' var thisModule = this;';this._body(strImp);for(var i=0;i<this._classes.length;i++)
{var cd=this._classes[i];this._classLoader._defineClass(cd);}
if(this._postInit)
{this._postInit(strImp);}},addClassDef:function(classDef)
{this._classes.push(classDef);},getImports:function(forClass)
{var res='';for(var i=0;i<this._classes.length;i++)
{var cd=this._classes[i];if(cd.className!=forClass)
{var cda=cd.className.split('.');var importName=cda[cda.length-1];var importString='var '+importName+'='+cd.className+';';res+=importString;}}
return res;},getResource:function(resourceName)
{var text=this._resources[resourceName];if(typeof text!='undefined')
{return text;}
text=this._classLoader._getResource(this._name,resourceName);this._resources[resourceName]=text;return text;}}
jgrouse.ClassLoader=function()
{this._allModules={};this._loadedModules={};this._pendingModules={};this._loadingModules={};this._namespaces={};this._callbacks={};this._debug=!!jgrouse_config.debug;this._currentModule=null;this._deferLoading=false;this._syncLoading=!!jgrouse_config.syncLoading;_currentURL:null;return this;}
jgrouse.ClassLoader.prototype={addNamespaceLocation:function(namespace,path)
{if(namespace[namespace.length-1]!='.')
{namespace+='.';}
this._namespaces[namespace]=path;},_getNamespacePathForModule:function(moduleName)
{for(var i in this._namespaces)
{if(moduleName.indexOf(i)==0)
{return this._namespaces[i];}}},setDeferLoading:function(doDefer)
{this._deferLoading=doDefer;if(!doDefer)
{this._doInitializeModules();}},_doInitializeModules:function()
{var v=true;while(v)
{v=this._checkNotLoadedModules();}},_isLoaded:function(name)
{return this._loadedModules[name]!=null;},_initModule:function(module)
{var oldModule=this._currentModule;this._currentModule=module;module.initModule();if(this._callbacks[module._name])
{jgrouse.forEach(this._callbacks[module._name],function(callback)
{callback();});delete this._callbacks[module._name];}
this._currentModule=oldModule;},isLoaded:function(moduleName)
{return!!this._loadedModules[moduleName];},_checkModule:function(module)
{if(!this._deferLoading)
{if(module._requiredLoaded())
{this._loadedModules[module._name]=module;delete this._pendingModules[module._name];this._initModule(module);return true;}
else
{this._pendingModules[module._name]=module;for(var i=module._requires.length-1;i>=0;i--)
{this._startModuleLoading(module._requires[i]);}}}
else
{this._pendingModules[module._name]=module;}
return false;},_checkNotLoadedModules:function()
{var tmp=[];var processed=false;for(var i in this._pendingModules)
{tmp.push(this._pendingModules[i]);}
for(var i=tmp.length-1;i>=0;i--)
{if(this._pendingModules[tmp[i]._name])
{processed|=this._checkModule(tmp[i]);}}
return processed;},_startModuleLoading:function(moduleName)
{if(!(this._allModules[moduleName]||this._loadingModules[moduleName]))
{this._loadingModules[moduleName]=true;this._doLoadModule(moduleName);}},getText:function(url,callback)
{var transport=jgrouse.getTransport();var async=!!callback;transport.open('GET',url,async);if(async)
{var f=function()
{if(transport.readyState==4)
{var oldURL=this._currentURL;this._currentURL=jgrouse.fullUrl(url);try
{jgrouse.log.debug('completed loading in async way '+url+' status='+transport.status);transport.onreadystatechange=jgrouse.dummy;if(transport.status>=200&&transport.status<300)
{callback(transport.responseText);}
else
{callback(transport);}}
finally
{this._currentURL=oldURL;}}}
transport.onreadystatechange=f;}
transport.send("");if(!async)
{if(transport.status>=200&&transport.status<300)
{return transport.responseText;}
else
{throw transport.statusText;}}},requireModule:function(moduleName,callback)
{if(!this._allModules[moduleName]||this._pendingModules[moduleName])
{if(callback)
{if(!this._callbacks[moduleName])
{this._callbacks[moduleName]=[callback];}
else
{this._callbacks[moduleName].push(callback);}}
this._startModuleLoading(moduleName);}
else
{callback();}},getResourcePath:function(moduleName,resourceName)
{var path=this._getNamespacePathForModule(moduleName);if(path)
{var fullPath=null;if(resourceName.charAt(0)!='/')
{var arr=moduleName.split('.');arr.pop();arr=arr.join('/')+'/';fullPath=path+arr+resourceName;}
else
{fullPath=path+resourceName.substr(1);}
return fullPath;}
else
{return null;}},_getResource:function(moduleName,resourceName)
{var path=this.getResourcePath(moduleName,resourceName);if(path)
{var text=null;try
{text=this.getText(path);}
catch(error)
{throw"Resource "+result+" could not be loaded; Error : "+error;}
return text;}
else
{throw"Cannot find namespace for module "+moduleName;}},_doLoadModule:function(moduleName)
{var athis=this;var path=this._getNamespacePathForModule(moduleName);function processLoad(text)
{if(typeof text=='string')
{if(athis._debug)
{var tag=document.createElement('script');tag.type="text/javascript";tag.src=result;jgrouse._srcTag.parentNode.appendChild(tag);}
else
{eval(text);}}
else
{var s="Cannot load module "+moduleName+" from path "+result+"; Error: "+text.statusText;jgrouse.log.error(s);throw s;}}
if(path)
{var arr=moduleName.split('.');var result=path+arr.join('/')+'.js';var text=null;if(this._syncLoading)
{try
{text=this.getText(result);}
catch(error)
{throw"Cannot load module "+moduleName+" from path "+result+"; Error: "+error;}
processLoad(text);}
else
{this.getText(result,processLoad)}}
else
{throw'Cannot determine path for '+moduleName;}},addModule:function(name,requires,imports,body,postInit)
{var module=new jgrouse.Module(name,requires,imports,body,postInit,this);delete this._loadingModules[name];this._allModules[name]=module;if(this._checkModule(module))
{this._doInitializeModules();}},_defineClass:function(classDef)
{var subclassName=classDef.className;var superclassName=classDef.superclassName;var properties=classDef.properties;var subclass=jgrouse.resolveName(subclassName);if(!subclass)
{subclass=jgrouse.create(subclassName);}
var superclass=superclassName?jgrouse.resolveName(superclassName):null;if(superclassName&&!superclass)
{throw new jgrouse.Exception('Base class '+superclassName+' not found');}
if(superclass)
{superclass.prototype._prototyping=true;subclass.prototype=new superclass();superclass.prototype._prototyping=false;}
var packageArr=subclassName.split('.');packageArr.pop();var packageName=packageArr.join('.');if(packageName.length==0)
{packageName='jgrouse._global';}
var embed='var _package = '+packageName+';'
+'var _class = '+subclassName+';'
+'var _className = \''+subclassName+'\';';if(superclass)
{embed+='var _super = function(obj, method, args) {'
+' var arr = []; for (var i = 2; i < arguments.length; i++) {arr.push(arguments[i])};'
+' return '+superclassName+'.prototype[method].apply(obj, arr) };';embed+='var _sup = function(obj, args) {'
+' var member = args.callee.__$memberName; '
+' return '+superclassName+'.prototype[member].apply(obj, args);};';}
if(jgrouse_config.nologs)
{embed+=['function l_log(level, msg) {} ','function l_error(msg){}','function l_warn(msg){}','function l_info(msg){}','function l_debug(msg){}'].join(' ');}
else
{embed+=['function l_log(level, msg) {jgrouse.log.log(level, msg, _className)};','function l_error(msg){l_log(jgrouse.log.ERROR, msg)};','function l_warn(msg){l_log(jgrouse.log.WARN, msg)};','function l_info(msg){l_log(jgrouse.log.INFO, msg)};','function l_debug(msg){l_log(jgrouse.log.DEBUG, msg)};'].join(' ');}
if(this._currentModule)
{embed+=this._currentModule.getImports(subclassName);}
embed='{'+embed+'}';subclass.prototype.RTTI=subclassName;subclass.prototype.superclass=superclass;var props=(typeof properties=='function'||properties instanceof Function)?properties(embed):properties;for(var p in props)
{var f=props[p];subclass.prototype[p]=f;if(typeof f=='function'&&f instanceof Function)
{f.__$memberName=p;}}
return subclass;},define:function(subclassName,superclassName,properties)
{var classdef={className:subclassName,superclassName:superclassName,properties:properties};if(this._currentModule)
{this._currentModule.addClassDef(classdef);}
else
{this._defineClass(classdef);}}}
jgrouse.ClassLoader._initHistoryIFrame=function()
{if(!jgrouse_config.nohistory)
{var historyFile=jgrouse.ClassLoader.instance.getResourcePath('jgrouse.browser.HistoryTracker','history.html');var hash=window.location.hash;if(hash&&hash!='#')
{hash=escape(hash.substring(1));historyFile+='?'+hash;}
document.writeln("<iframe id='_jgrouse_history_tracker' src='"+historyFile+"' "+"style='position:absolute; top:-1000px; left:-1000px'></iframe>");}}
jgrouse.ClassLoader._init=function()
{if(!jgrouse._srcTag)
{var data=document.getElementsByTagName("script");for(var i=data.length-1;i>=0;i--)
{var s=data[i];if(s.src&&s.src.indexOf(jgrouse._startupFile)>=0)
{jgrouse._srcTag=s;break;}}
var base=s.src.substring(0,s.src.length-jgrouse._startupFile.length);jgrouse.ClassLoader.instance=new jgrouse.ClassLoader();jgrouse.ClassLoader.instance.addNamespaceLocation('jgrouse',base);jgrouse.ClassLoader._initHistoryIFrame();}}
jgrouse.addUnloadHook(function()
{jgrouse._srcTag=null;});jgrouse.ClassLoader._init();jgrouse.ClassLoader.instance.setDeferLoading(true);jgrouse.module({name:'jgrouse.base',body:function(embed)
{eval(embed);jgrouse.define('jgrouse.BaseObject',null,function(salt)
{eval(salt);var current=0;function nextId()
{var res=current++;if(current==Number.MAX_VALUE)
{current=Number.MIN_VALUE;}
return res;}
return{initialize:function()
{this.__serialObjId=nextId();},equals:function(obj)
{return this===obj;},hashCode:function()
{return this.__serialObjId;}};})}})
jgrouse.module({name:'jgrouse.browser.Browser',requires:['jgrouse.base'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.browser.BaseBrowser','jgrouse.BaseObject',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');this._eventNameMap={'trueKeypress':'keypress'};this._cssMap={'float':'cssFloat'};this._historyTracker=null;},mapEventName:function(eventName)
{var n=this._eventNameMap[eventName];return n?n:eventName;},mapCssProperty:function(property)
{var v=this._cssMap[property];return v?v:property;},addListener:function(dom,eventName,listener,doCapture)
{dom.addEventListener(this.mapEventName(eventName),listener,doCapture);},removeListener:function(dom,eventName,listener,doCapture)
{dom.removeEventListener(this.mapEventName(eventName),listener,doCapture);},getAttribute:function(domNode,attrName)
{return domNode.getAttribute(attrName);},getAttributes:function(domNode)
{var attrs=domNode.attributes;var res=[];for(var i=attrs.length-1;i>=0;i--)
{var a=attrs.item(i);if(a.specified)
{res.push(a);}}
return res;},getComputedStyle:function(element,styleName)
{var s=this.mapCssProperty(styleName);return document.defaultView.getComputedStyle(element,null)[s];},clearAttributes:function(element)
{var attrs=element.attributes;var attrNames=[];for(var i=attrs.length-1;i>=0;i--)
{attrNames.push(attrs.item(i).nodeName);}
jgrouse.forEach(attrNames,function(itemName)
{attrs.removeNamedItem(itemName);});},cancelEvent:function(event)
{event.preventDefault();event.stopPropagation();},initHistoryTracker:function()
{this._historyTracker=new jgrouse.browser.TimerHistoryTracker(200);},fireHistoryChange:function()
{if(this._historyTracker)
{this._historyTracker.fireHistoryChange();}},setHistoryEntry:function(entry)
{if(this._historyTracker)
{this._historyTracker.setHistoryEntry(entry);}},normalizeAncor:function(ancor)
{return ancor;},getStyles:function(element)
{var res={};for(var i in element.style)
{var v=element.style[i];if(i!='cssText'&&i!='length'&&v&&typeof v!='function')
{res[i]=element.style[i];}}
return res;},scrollIntoView:function(domElement,align)
{domElement.scrollIntoView(true);},_internalScrollIntoView:function(domElement,align)
{var scrolls=[];var node=domElement.parentNode;var found=false;while(node!=document)
{var x=found?node.scrollLeft:null;var y=found?node.scrollTop:null;if(x===undefined)
{x=0;}
if(y===undefined)
{y=0;}
if(!found)
{var o=this.getComputedStyle(node,'overflow');found=o=='auto'||o=='scroll';}
l_debug(node.nodeName+' found = '+found+' x='+x+' y='+y);scrolls.push({x:x,y:y});node=node.parentNode;}
domElement.scrollIntoView(true);node=domElement.parentNode;while(node!=document)
{var v=scrolls[0];scrolls.splice(0,1);if(align==='top')
{v.y=0;}else
if(align==='left')
{v.x=0;}
if(v.x!==null)
{node.scrollLeft=v.x;}
if(v.y!==null)
{node.scrollTop=v.y;}
l_debug(node.nodeName+' x='+v.x+' y='+v.y+' left='+node.scrollLeft
+' top='+node.scrollTop);node=node.parentNode;}}};});jgrouse.define('jgrouse.browser.Mozilla','jgrouse.browser.BaseBrowser',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');l_info('mozilla!');}};});jgrouse.define('jgrouse.browser.Explorer','jgrouse.browser.BaseBrowser',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');this._cssMap['float']='styleFloat';},addListener:function(dom,eventName,listener,doCapture)
{var name=this.mapEventName(eventName);dom.attachEvent('on'+name,listener);},removeListener:function(dom,eventName,listener,doCapture)
{var name=this.mapEventName(eventName);dom.detachEvent('on'+name,listener);},getAttribute:function(domNode,attrName)
{return domNode.getAttribute(attrName,2);},getAttributes:function(domNode)
{var res=_sup(this,arguments);if(domNode.tagName.toLowerCase()=='input')
{var a=domNode.attributes['value'];if(!a.specified)
{res.push(a);}
var t=domNode.attributes['type'];if(!t.specified)
{res.push(t);}}
else if(domNode.tagName.toLowerCase()=='a')
{var a=domNode.attributes['href'];if(a.specified)
{a.value=domNode.getAttribute('href',2);}}
return res;},getComputedStyle:function(element,styleName)
{return element.currentStyle[this.mapCssProperty(styleName)];},clearAttributes:function(element)
{element.clearAttributes();},cancelEvent:function(event)
{event.returnValue=null;event.cancelBubble=true;},initHistoryTracker:function()
{if(!this._historyTracker)
{this._historyTracker=new jgrouse.browser.IFrameHistoryTracker(false);}},normalizeAncor:function(ancor)
{var a=ancor.split('#');if(a.length==1)
{return ancor;}
var href=window.location.href;var ha=href.split('#');if(ha[0]==a[0])
{return'#'+a[1];}
return ancor;},scrollIntoView:function(domElement,align)
{var p=domElement.offsetParent;p.scrollLeft=domElement.offsetLeft;p.scrollTop=domElement.offsetTop;}}});jgrouse.define('jgrouse.browser.KHTML','jgrouse.browser.BaseBrowser',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');this._eventNameMap['keypress']='keydown';},initHistoryTracker:function()
{this._historyTracker=new jgrouse.browser.IFrameHistoryTracker(true);},getStyles:function(element)
{var res={};for(var i=0;i<element.style.length;i++)
{var sn=element.style.item(i);res[sn]=element.style[sn];}
return res;}}});jgrouse.define('jgrouse.browser.Opera','jgrouse.browser.BaseBrowser',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');},addListener:function(dom,eventName,listener,doCapture)
{var name=this.mapEventName(eventName);dom.attachEvent('on'+name,listener);},removeListener:function(dom,eventName,listener,doCapture)
{var name=this.mapEventName(eventName);dom.detachEvent('on'+name,listener);},initHistoryTracker:function()
{this._historyTracker=new jgrouse.browser.IFrameHistoryTracker(true);},scrollIntoView:function(domElement,align)
{this._internalScrollIntoView(domElement,align);}}});},postInit:function(embed)
{eval(embed);function getBrowserClass()
{var userAgent=navigator.userAgent;var appName=navigator.appName;if(appName.indexOf('Microsoft')>=0&&userAgent.indexOf('MSIE')>=0)
{return'jgrouse.browser.Explorer';}
if(userAgent.match(/Konqueror|Safari|KHTML/))
{return'jgrouse.browser.KHTML';}
if(userAgent.indexOf('Gecko')>=0)
{return'jgrouse.browser.Mozilla';}
if(userAgent.indexOf('Opera')>=0)
{return'jgrouse.browser.Opera'}
return'jgrouse.browser.BaseBrowser';}
var bn=getBrowserClass();var bc=jgrouse.resolveName(bn);jgrouse.browser.instance=new bc();jgrouse.require('jgrouse.browser.HistoryTracker',function()
{jgrouse.browser.instance.initHistoryTracker();});}});jgrouse.module({name:'jgrouse.browser.HistoryTracker',requires:['jgrouse.util.TaskManager'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.browser.HistoryTracker','jgrouse.BaseObject',function(embed)
{eval(embed);return{initialize:function()
{this._currentHash=this._getHash();},setCurrentHash:function(value)
{this._currentHash=value;},_getHash:function()
{var v=window.location.hash;if(v)
{v=v.substring(1);}
return unescape(v);},getNewEntry:function(entry)
{var current=this._currentHash;if(entry)
{if(entry.charAt(0)=='#')
{if(!current)
{current='';}
current=current.split('#')[0]+entry;}
else
{current=entry;}}
return current;},setHistoryEntry:function(value)
{jgrouse.notImplemented(this.RTTI+'.setHistoryEntry');},fireHistoryChange:function()
{jgrouse.util.TaskManager.postPropertyChange('browserHistory',this._currentHash);}}});jgrouse.define('jgrouse.browser.TimerHistoryTracker','jgrouse.browser.HistoryTracker',function(embed)
{eval(embed);return{initialize:function(timeout)
{_super(this,'initialize');this._timer=window.setInterval(jgrouse.bind(this,this._onTimer),timeout);},setHistoryEntry:function(entry)
{var current=this.getNewEntry(entry);this.setCurrentHash(current);window.location.hash='#'+escape(current);this.fireHistoryChange();},_onTimer:function()
{var current=this._getHash();if(current!=this._currentHash)
{var old=this._currentHash;this._currentHash=current;this.fireHistoryChange();}}}});jgrouse.define('jgrouse.browser.IFrameHistoryTracker','jgrouse.browser.HistoryTracker',function(embed)
{eval(embed);return{initialize:function(dontSetHash)
{_super(this,'initialize');this._historyFile=jgrouse.ClassLoader.instance.getResourcePath('jgrouse.browser.HistoryTracker','history.html');this._dontSetHash=dontSetHash;this._iframeRef=null;},historyChanged:function(entry)
{this._currentHash=entry;if(!this._dontSetHash)
{window.location.hash='#'+entry;}
this.fireHistoryChange();},setHistoryEntry:function(entry)
{if(!this._iframeRef)
{this._iframeRef=document.getElementById('_jgrouse_history_tracker');}
var v=escape(this.getNewEntry(entry));if(!this._dontSetHash)
{window.location.hash='#'+v;}
this.setCurrentHash(v);if(this._iframeRef.contentWindow)
{this._iframeRef.contentWindow.location.href=this._historyFile+'?'+v;}
else
{var athis=this;window.setTimeout(function(){athis._iframeRef.contentWindow.location.href=athis._historyFile+'?'+v;},200)}}}});}});jgrouse.module({name:'jgrouse.coreutil',body:function(embed)
{jgrouse.copyAll=function(dst,src)
{for(var i in src)
{dst[i]=src[i];}}
jgrouse.copyNew=function(dst,src)
{for(var i in src)
{if(typeof dst[i]=='undefined')
{dst[i]=src[i];}}}
jgrouse.copyData=function(dst,src)
{for(var i in src)
{if(!(src[i]instanceof Function))
{dst[i]=src[i];}}}
jgrouse.syncData=function(dst,src,watcher)
{for(var i in src)
{if(!(src[i]instanceof Function))
{if(typeof dst[i]==undefined||dst[i]!==src[i])
{var oldValue=dst[i];dst[i]=src[i];if(watcher)
{watcher.onWatch(dst,i,dst[i],oldValue);}}}}
for(var i in dst)
{if(!(dst[i]instanceof Function))
{if(typeof src[i]=='undefined'&&typeof dst[i]!='undefined')
{var oldValue=dst[i];dst[i]=src[i];if(watcher)
{watcher.onWatch(dst,i,dst[i],oldValue);}}}}}
jgrouse.bind=function(obj,method,otherArgs)
{var args=arguments.length<=2?[]:jgrouse.toArray(arguments);args.splice(0,2);var m=(typeof method=='string')?obj[method]:method;return function()
{return m.apply(obj,jgrouse.toArray(arguments).concat(args));}}
jgrouse.eventExceptionHandler=null;jgrouse.bindAsEventListener=function(obj,method,otherArgs)
{var args=arguments.length<=2?[]:jgrouse.toArray(arguments);args.splice(0,2);var m=(typeof method=='string')?obj[method]:method;return function(event)
{var ev=event||window.event;try
{var res=m.apply(obj,[ev].concat(args));return res;}
catch(ex)
{if(jgrouse.eventExceptionHandler)
{if(!jgrouse.eventExceptionHandler(ev,ex))
{throw ex;}}}}}
jgrouse.delegate=function(dst,member,memberClass,exclude)
{if(typeof memberClass=='string')
{memberClass=jgrouse.resolveName(memberClass).prototype;}
var ex=['superclass','initialize'].concat(exclude?exclude:[]);for(var p in memberClass)
{var f=memberClass[p];if(!dst[p]&&f instanceof Function&&jgrouse.search(ex,p)<0)
{dst[p]=function()
{var mem=arguments.callee.member;var func=arguments.callee.method;var m=(typeof mem=='string')?this[mem]:mem;return func.apply(m,arguments);}
dst[p].member=member;dst[p].method=f;}}}
jgrouse.objectComparator=function(obj1,obj2)
{if(obj1===obj2)
{return true;}
if(obj1===undefined)
{return obj2==undefined;}
if(obj2===undefined)
{return false;}
if(obj1.equals&&obj2.equals)
{return obj1.equals(obj2);}
return false;}
jgrouse.perlify=function(func,argNames)
{return new function()
{if(arguments.length!=1||(arguments.length==1&&typeof arguments[0]!='object'))
{return func.apply(this,jgrouse.toArray(arguments));}
else
{var ar=[];var param=arguments[0];for(var i=0;i<argNames.length;i++)
{ar.push(param[argNames[i]]);}
return func.apply(this,ar);}}}
jgrouse.isEmpty=function(obj)
{var dummy={};for(var i in obj)
{if(obj[i]!=dummy[i])
{return false;}}
return true;}
jgrouse.toArray=function(data)
{if(data instanceof Array)
{return data.concat([]);}
if(data.toArray)
{return data.toArray();}
if(data.length)
{var res=[];for(var i=0;i<data.length;i++)
{res.push(data[i]);}
return res;}
return[];}
jgrouse.search=function(arr,item,comparator)
{if(comparator)
{for(var i=arr.length-1;i>=0;i--)
{if(comparator(item,arr[i])===true)
{return i;}}}
else
{for(var i=arr.length-1;i>=0;i--)
{if(arr[i]==item)
{return i;}}}
return-1;}}});jgrouse.module({name:'jgrouse.dom.Element',requires:['jgrouse.browser.Browser','jgrouse.string','jgrouse.coreutil'],body:function(embed)
{eval(embed);var browser=jgrouse.browser.instance;if(!jgrouse.dom)
{jgrouse.dom={};}
var garbageBin=document.createElement('div');garbageBin.className='__jgrouse_garbage_bin';function cleanupGarbage()
{garbageBin=null;}
jgrouse.addUnloadHook(cleanupGarbage);jgrouse.dom.Element={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12,disposeDom:function(element)
{garbageBin.appendChild(element);garbageBin.innerHTML='';},getAttribute:function(element,attrName)
{return browser.getAttribute(element,attrName);},getAttributes:function(element)
{return browser.getAttributes(element);},clearAttributes:function(element)
{browser.clearAttributes(element);},setAttribute:function(element,attrName,value)
{var lc=attrName.toLowerCase();if(lc=='style')
{jgrouse.dom.Element.setStyles(element,value);}
else if(lc=='class')
{element.className=value;}
else
{var camel=jgrouse.string.camelize(attrName);element.setAttribute(attrName,value)
element.attributes[attrName].nodeValue=value;element[camel]=value;}},setAttributes:function(element,attributes)
{jgrouse.dom.Element.clearAttributes(element);jgrouse.forEach(attributes,function(attrValue,attrName)
{jgrouse.dom.Element.setAttribute(element,attrName,attrValue);})},_setOneStyle:function(element,style,value)
{var s=jgrouse.string.camelize(style);var mapped=browser.mapCssProperty(s);element.style[mapped]=value;},_internalSetStyle:function(element,style,value)
{if(typeof style=='object')
{jgrouse.forEach(style,function(value,key)
{jgrouse.dom.Element._setOneStyle(element,key,value);});}
else
{jgrouse.dom.Element._setOneStyle(element,style,value);}},setStyles:function(element,style,value)
{jgrouse.dom.Element.clearStyles(element);if(arguments.length==2&&typeof style=='string')
{element.style.cssText=style;}
else
{jgrouse.dom.Element._internalSetStyle(element,style,value);}},addStyle:function(element,style,value)
{jgrouse.dom.Element._internalSetStyle(element,style,value);},getStyles:function(element)
{return jgrouse.browser.instance.getStyles(element);},clearStyle:function(element,styleName)
{jgrouse.dom.Element._setOneStyle(element,styleName,'');},getComputedStyle:function(element,style)
{return browser.getComputedStyle(element,jgrouse.string.camelize(style));},clearStyles:function(element)
{element.style.cssText='';},clearAttribute:function(element,attr)
{if(attr=='style')
{jgrouse.dom.Element.clearStyle(element);}
else
{if(attr=='class')
{attr='className';}
var v=element.removeAttribute(attr);if(typeof element[attr]!='undefined')
{try
{v&=delete element[attr];}
catch(ex)
{}}
return v;}},setClass:function(element,className)
{element.className=className;},addClassName:function(element,className)
{var current=element.className;if(current)
{var arr=current.split(' ');if(jgrouse.search(arr,className)<0)
{arr.push(className);element.className=arr.join(' ');}}
else
{element.className=className;}},removeClassName:function(element,className)
{var current=element.className;if(current)
{var arr=current.split(' ');var i=jgrouse.search(arr,className);if(i>=0)
{arr.splice(i,1);element.className=arr.join(' ');}}},hasClass:function(element,className)
{var current=element.className;if(current)
{var arr=current.split(' ');return jgrouse.search(arr,className)>=0;}
return false;},forEach:function(element,callback,backwards)
{var nodes=element.childNodes;if(backwards)
{for(var i=nodes.length-1;i>=0;i--)
{var node=nodes.item(i);callback(node,i);}}
else
{for(var i=0;i<nodes.length;i++)
{var node=nodes.item(i);callback(node,i);}}},forEachNode:function(element,callback,backwards)
{var nt=jgrouse.dom.Element.ELEMENT_NODE;jgrouse.dom.Element.forEach(element,function(node,index){if(node.nodeType===nt)
{callback(node,index);}},backwards);},walkTree:function(element,testCallback)
{function worker(elem)
{if(testCallback(elem))
{throw jgrouse.$break;}
jgrouse.dom.Element.forEach(elem,worker);}
try
{worker(element);}
catch(ex)
{if(ex!==jgrouse.$break)
{throw ex;}}},search:function(element,testCallback)
{var res=null;jgrouse.dom.Element.walkTree(element,function(element)
{if(testCallback(element))
{res=element;return true;}
return false;});return res;},collect:function(element,testCallback)
{var res=[];jgrouse.dom.Element.walkTree(element,function(element)
{if(testCallback(element))
{res.push(element);}});return res;},moveChildrenToNewParent:function(dstParent,srcParent)
{jgrouse.dom.Element.forEach(srcParent,function(dom)
{var fc=dstParent.firstChild;if(fc)
{dstParent.insertBefore(dom,fc);}
else
{dstParent.appendChild(dom);}},true);},isShowing:function(element)
{var current=element;while(current&&current!=document)
{if(current.style.display=='none')
{return false;}
current=current.parentNode;}
return current==document;},scrollIntoView:function(domElement,align)
{browser.scrollIntoView(domElement,align);}}}})
jgrouse.module({name:'jgrouse.dom.Event',requires:['jgrouse.util.Maps','jgrouse.util.Sets','jgrouse.browser.Browser','jgrouse.dom.Element'],imports:['jgrouse.util.ObjectMap','jgrouse.util.ObjectSet'],body:function(embed)
{eval(embed);var browser=jgrouse.browser.instance;function compare(item1,item2)
{return(item1===item2||(item1.eventName===item2.eventName&&item1.listener===item2.listener&&item1.doCapture===item2.doCapture));}
if(!jgrouse.dom)
{jgrouse.dom={};}
jgrouse.dom.Event={_listenersCache:new ObjectMap(),addListener:function(domElement,eventName,listener,doCapture)
{doCapture|=false;var listeners=this._listenersCache.get(domElement);if(typeof listeners=='undefined')
{listeners=new ObjectSet(compare);}
listeners.put({eventName:eventName,listener:listener,doCapture:doCapture});browser.addListener(domElement,eventName,listener,doCapture);},removeListener:function(domElement,eventName,listener,doCapture)
{doCapture|=doCapture;var listeners=this._listenersCache.get(domElement);if(listeners)
{var old=listeners.remove({eventName:eventName,listener:listener,doCapture:doCapture});browser.removeListener(domElement,eventName,listener,doCapture);return!!old;}
return false;},removeElementListeners:function(domElement)
{var listeners=this._listenersCache.get(domElement);if(listeners)
{listeners.forEach(function(item)
{browser.removeListener(domElement,item.eventName,item.listener,item.doCapture);})
this._listenersCache.remove(domElement);}},removeAllListeners:function()
{var athis=this;this._listenersCache.forEach(function(key,value)
{values.forEach(function(item)
{browser.removeListener(key,item.eventName,item.listener,item.doCapture);});});this._listenersCache.clear();},cancelEvent:function(event)
{browser.cancelEvent(event);}};function unloadAll()
{jgrouse.dom.Event.removeAllListeners();for(var i=jgrouse._closeHooks.length-1;i>=0;i--)
{jgrouse._closeHooks[i]();}
jgrouse._closeHooks=[];}
jgrouse.dom.Event.addListener(window,'unload',unloadAll);}});jgrouse.module({name:'jgrouse.string',body:function(embed)
{eval(embed);jgrouse.string={upperFirst:function(str)
{if(!str)
{return str;}
return str.substr(0,1).toUpperCase()+str.substr(1);},lowerFirst:function(str)
{if(!str)
{return str;}
return str.substr(0,1).toLowerCase()+str.substr(1);},camelize:function(str)
{if(!str)
{return str;}
var arr=str.split('-');arr[0]=jgrouse.string.lowerFirst(arr[0]);for(var i=arr.length-1;i>=1;i--)
{arr[i]=jgrouse.string.upperFirst(arr[i]);}
return arr.join('');},ltrim:function(str)
{for(var i=0;i<str.length;i++)
{var c=str.charAt(i);if(!(c==' '||c=='\f'||c=='\n'||c=='\r'||c=='\t'))
{return str.substring(i);}}
return'';},rtrim:function(str)
{for(var i=str.length-1;i>=0;i--)
{var c=str.charAt(i);if(!(c==' '||c=='\f'||c=='\n'||c=='\r'||c=='\t'))
{return str.substring(0,i+1);}}
return'';},trim:function(str)
{return jgrouse.string.rtrim(jgrouse.string.ltrim(str));}}}})
jgrouse.module({name:'jgrouse.util.Catalog',requires:['jgrouse.util.Maps','jgrouse.util.Sets'],imports:['jgrouse.util.ObjectMap','jgrouse.util.ObjectSet'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.util.Catalog','jgrouse.BaseObject',function(salt)
{eval(salt);return{initialize:function(boxComparator)
{_super(this,'initialize');this._boxes=new ObjectMap(boxComparator);},_createSet:function()
{return new ObjectSet(jgrouse.objectComparator);},add:function(key,value)
{var box=this._boxes.get(key);if(!box)
{box=this._createSet();this._boxes.put(key,box);}
box.put(value);},remove:function(key,value)
{var box=this._boxes.get(key);if(box)
{box.remove(value);}},removeBox:function(key)
{this._boxes.remove(key);},forEachInBox:function(key,iter)
{var box=this._boxes.get(key);if(box)
{box.forEach(function(value)
{iter(value,key);});}},forEach:function(iter)
{this._boxes.forEach(function(box,key)
{box.forEach(function(value)
{iter(value,key);});});},forEachBox:function(iter,backwards)
{this._boxes.forEach(iter,backwards);},removeAll:function(value)
{this._boxes.forEach(function(box,key)
{box.remove(value);});},clear:function()
{this._boxes.forEach(function(box,key)
{box.clear();});this._boxes.clear();},keys:function()
{return this._boxes.keys();}};});}});jgrouse.module({name:'jgrouse.util.Maps',requires:['jgrouse.base','jgrouse.coreutil'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.util.Map','jgrouse.BaseObject',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');},exists:function(key)
{jgrouse.notImplemented(this.RTTI+'.exists');},put:function(key,value)
{jgrouse.notImplemented(this.RTTI+'.put');},get:function(key)
{jgrouse.notImplemented(this.RTTI+'.get');},remove:function(key)
{jgrouse.notImplemented(this.RTTI+'.remove');},items:function()
{jgrouse.notImplemented(this.RTTI+'.items');},keys:function()
{jgrouse.notImplemented(this.RTTI+'.keys');},values:function()
{jgrouse.notImplemented(this.RTTI+'.values');},toArray:function()
{return this.items();},forEach:function(iterator,backwards)
{},clear:function()
{}}});jgrouse.define('jgrouse.util.ObjectMap','jgrouse.util.Map',function(salt)
{eval(salt);return{initialize:function(comparator)
{_super(this,'initialize');this._data=[];this._comparator=!!comparator?comparator:this._findKey;},_findKey:function(key,item)
{return(key===item.key);},_search:function(key)
{return jgrouse.search(this._data,key,this._comparator);},exists:function(key)
{return this._search(key)===0;},put:function(key,value)
{var index=this._search(key);if(index>=0)
{var old=this._data[index].value;this._data[index].value=value;return old;}
else
{this._data.push({key:key,value:value});return undefined;}},get:function(key)
{var index=this._search(key);return(index>=0)?this._data[index].value:undefined;},remove:function(key)
{var index=this._search(key);if(index>=0)
{var item=this._data[index].value;this._data.splice(index,1);return item;}
return undefined;},items:function()
{return[].concat(this._data);},keys:function()
{var res=[];jgrouse.forEach(this._data,function(item)
{res.push(item.key);});return res;},values:function()
{var res=[];jgrouse.forEach(this._data,function(item)
{res.push(item.value);})
return res;},forEach:function(iterator,backwards)
{jgrouse.forEach(this._data,function(entry,index)
{iterator(entry.value,entry.key);},backwards);},clear:function()
{this._data=[];}}});jgrouse.define('jgrouse.util.SimpleMap','jgrouse.util.Map',function(salt)
{eval(salt)
return{initialize:function(data)
{_super(this,'initialize');this._data=data?data:{};},exists:function(key)
{return this._data[key]!=undefined;},put:function(key,value)
{var old=this._data[key];this._data[key]=value;return old;},get:function(key)
{return this._data[key];},remove:function(key)
{var item=this._data[key];delete this._data[key];return item;},forEach:function(iterator)
{var d={};try
{for(var i in this._data)
{var v=this._data[i];if(v!=d[i])
{iterator(v,i);}}}
catch(ex)
{if(ex!=jgrouse.$break)
{throw ex;}}},items:function()
{var result=[];this.forEach(function(value,key)
{result.push({key:key,value:value});})
return result;},keys:function()
{var res=[];this.forEach(function(value,key)
{res.push(key);})
return res;},values:function()
{var res=[];this.forEach(function(value,key)
{res.push(value);})
return res;},toArray:function()
{return this.items();},clear:function()
{this._data={};}}})}});jgrouse.module
({name:'jgrouse.util.MvcDriver',requires:['jgrouse.util.PropertyChangeSupport'],imports:['jgrouse.util.PropertyChangeSupport','jgrouse.util.PropertyChangeEvent','jgrouse.util.Catalog'],body:function(embed)
{eval(embed);var ListenerAdaptor=function(listener,property)
{this._listener=listener;this._property=property;return this;}
ListenerAdaptor.prototype={equals:function(obj2)
{if(!obj2)
{return false;}
return(this===obj2)||(this._listener===obj2._listener&&this._property===obj2._property)}}
jgrouse.define('jgrouse.util.MvcPropertyChangeSupport','jgrouse.util.PropertyChangeSupport',function(salt)
{eval(salt);return{initialize:function(owner)
{_super(this,'initialize',owner);},triggerListener:function(listener,event)
{var ownerEvent=this._owner._currentEvent;if(!ownerEvent||(ownerEvent.getSender()!=listener._listener)||(ownerEvent.getPropertyName()!=listener._property))
{var newEvent=new PropertyChangeEvent(event.getSender(),listener._property,event.getNewValue(),event.getOldValue());_super(this,'triggerListener',listener._listener,newEvent);}},getListenerMethod:function(listener,propName)
{var setter='set'+jgrouse.string.upperFirst(propName);if(listener[setter])
{return setter;}
return _super(this,'getListenerMethod',listener,propName);}};});jgrouse.define('jgrouse.util.MvcDriver','jgrouse.BaseObject',function(salt)
{eval(salt);return{initialize:function(controller)
{_super(this,'initialize');this._viewPCS=new MvcPropertyChangeSupport(this);this._modelPCS=new Catalog(this._viewPropComparator);this._controller=controller;this._clean=null;this._dirty=null;this._pending=[];this._lock=0;},_viewPropComparator:function(key,item)
{var k=item.key;return key===k||(key.view===k.view&&key.property===k.property);},bind:function(view,viewProperty,modelProperty)
{view.addListener(viewProperty,this);this._viewPCS.addListener(modelProperty,new ListenerAdaptor(view,viewProperty));this._modelPCS.add({view:view,property:viewProperty},modelProperty);},unbind:function(view,viewProperty,modelProperty)
{view.removeListener(viewProperty,this);this._viewPCS.removeListener(modelProperty,new ListenerAdaptor(view,viewProperty));this._modelPCS.remove({view:view,property:viewProperty},modelProperty);},unbindView:function(view)
{view.removeListenerFull(view);var boxKeys=this._modelPCS.keys();var athis=this;jgrouse.forEach(boxKeys,function(boxKey,index)
{if(boxKey.view===view)
{athis._modelPCS.removeBox(boxKey);}});var mappings=[];this._viewPCS.forEach(function(listener,property)
{if(listener._listener===view)
{mappings.push({listener:listener,modelProperty:property});}});for(var i=0;i<mappings.length;i++)
{var m=mappings[i];this._viewPCS.removeListener(m.modelProperty,m.listener);}},getHandlerName:function(propName)
{return'onPropertyChanged';},_processPending:function()
{if(this._pending.length>0)
{var e1=this._pending[0];this._pending.splice(0,1);this.onPropertyChanged(e1);}},onPropertyChanged:function(event)
{if(this._lock===0)
{this._currentEvent=event;try
{this._internalPropertyChange(event);}
finally
{this._currentEvent=null;}
this._processPending();}
else
{this._pending.push(event);}},_setModelProperty:function(modelProperty,newValue,oldValue)
{var methodName=null;var us=jgrouse.string.upperFirst(modelProperty);if(modelProperty.indexOf('trigger')===0)
{methodName='on'+us;}
else
{methodName='set'+us;}
if(this._controller[methodName])
{this._controller[methodName](newValue,oldValue);}
else
{this._dirty[modelProperty]=newValue;}},_flush:function()
{this._lock++;try
{jgrouse.syncData(this._clean,this._dirty,this);}
finally
{this._lock--;}},_internalPropertyChange:function(event)
{var athis=this;var newValue=event.getNewValue();var oldValue=event.getOldValue();var key={view:event.getSender(),property:event.getPropertyName()};this._modelPCS.forEachInBox(key,function(modelProperty,index)
{athis._setModelProperty(modelProperty,newValue,oldValue);});this._flush();},setData:function(data)
{this._clean={};this._dirty={};jgrouse.copyData(this._dirty,data);this._controller.setData(this._dirty);this._flush();this._processPending();},onWatch:function(data,modelPropertyName,newValue,oldValue)
{this._viewPCS.firePropertyChange(modelPropertyName,newValue,oldValue);if(modelPropertyName.indexOf('trigger')===0)
{delete this._dirty[modelPropertyName];delete this._clean[modelPropertyName];}},setProperty:function(property,value)
{this._setModelProperty(property,value);this._flush();}}});jgrouse.define('jgrouse.util.BaseController','jgrouse.BaseObject',function(embed)
{eval(embed);return{initialize:function(data)
{_sup(this,arguments);this.setData(data?data:{});},setData:function(data)
{this._data=data;},getData:function()
{return this._data;}}});}})
jgrouse.module({name:'jgrouse.util.PropertyChangeSupport',requires:['jgrouse.util.Sets','jgrouse.util.Catalog','jgrouse.string'],imports:['jgrouse.util.Catalog','jgrouse.util.ObjectSet'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.util.PropertyChangeEvent',null,function(salt)
{eval(salt);return{initialize:function(sender,propertyName,newValue,oldValue)
{this._sender=sender;this._propertyName=propertyName;this._newValue=newValue;this._oldValue=oldValue;this._cancelled=false;},getSender:function()
{return this._sender;},getPropertyName:function()
{return this._propertyName;},getNewValue:function()
{return this._newValue;},getOldValue:function()
{return this._oldValue;},cancel:function()
{this._cancelled=true;},isCancelled:function()
{return this._cancelled;}}});jgrouse.define('jgrouse.util.PropertyChangeListener',null,function(salt)
{eval(salt);return{onPropertyChanged:function(event)
{jgrouse.NotImplemented(RTTI+'.onPropertyChanged');},getHandlerName:null}});jgrouse.define('jgrouse.util.PropertyChangeSupport','jgrouse.BaseObject',function(salt)
{eval(salt);return{initialize:function(owner)
{_super(this,'initialize');this._listeners=new ObjectSet(jgrouse.objectComparator);this._namedListeners=new Catalog();this._owner=owner;},addListener:function(propertyNameOrListener,listener)
{if(arguments.length===2)
{this._namedListeners.add(propertyNameOrListener,listener);}
else
{this._listeners.put(propertyNameOrListener);}},removeListener:function(propertyNameOrListener,listener)
{if(arguments.length===2)
{this._namedListeners.remove(propertyNameOrListener,listener);}
else
{this._listeners.remove(propertyNameOrListener);}},removeListenerFull:function(listener)
{this._listeners.remove(listener);this._namedListeners.removeAll(listener);},firePropertyChange:function(propertyName,newValue,oldValue,sender)
{var event=new PropertyChangeEvent(sender?sender:this._owner,propertyName,newValue,oldValue);this.handlePropertyChangeEvent(event);},handlePropertyChangeEvent:function(event)
{var athis=this;var propertyName=event.getPropertyName();this._namedListeners.forEachInBox(propertyName,function(listener)
{athis.triggerListener(listener,event);});if(!event.isCancelled())
{this._listeners.forEach(function(listener)
{athis.triggerListener(listener,event);});}},getListenerMethod:function(listener,propName)
{if(listener.getHandlerName)
{var v=listener.getHandlerName(propName);if(v)
{return v;}}
var v=jgrouse.string.upperFirst(propName);var m=null;if(propName.indexOf('trigger')===0)
{m='on'+v;if(listener[m])
{return m;}}
m='on'+v+'Changed';if(listener[m])
{return m;}
return'onPropertyChanged';},triggerListener:function(listener,event)
{if(listener!=event.getSender())
{var m=this.getListenerMethod(listener,event.getPropertyName());if(m!='onPropertyChanged')
{listener[m](event.getNewValue(),event.getOldValue());}
else
{if(listener[m])
{listener[m](event);}
else
{if(event.getPropertyName().indexOf('trigger')!=0)
{throw'Cannot find appropriate handler for property '+event.getPropertyName()
+' class='+listener.RTTI;}}}}},forEach:function(iter)
{this._namedListeners.forEach(iter);this._listeners.forEach(function(item)
{iter(item,null);});}}});}});jgrouse.module({name:'jgrouse.util.Sets',requires:['jgrouse.base','jgrouse.coreutil'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.util.Set','jgrouse.BaseObject',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');},putArray:function(values)
{var athis=this;jgrouse.forEach(values,function(item)
{athis.put(item);});},put:function(value)
{jgrouse.notImplemented(this.RTTI+'.put');},exists:function(item)
{jgrouse.notImplemented(this.RTTI+'.exists');},toArray:function()
{jgrouse.notImplemented(this.RTTI+'.toArray');},remove:function(item)
{jgrouse.notImplemented(this.RTTI+'.remove');},forEach:function(iterator,backwards)
{jgrouse.notImplemented(this.RTTI+'.forEach');},clear:function()
{jgrouse.notImplemented(this.RTTI+'.clear');}}});jgrouse.define('jgrouse.util.PrimitiveSet','jgrouse.util.Set',function(salt)
{eval(salt);return{initialize:function()
{_super(this,'initialize');this._data={};},put:function(value)
{this._data[value]=true;},exists:function(item)
{return this._data[item];},toArray:function()
{var arr=[];jgrouse.forEach(this._data,function(value,index)
{arr.push(index);});return arr;},remove:function(item)
{delete this._data[item];return item;},forEach:function(iterator,backwards)
{var index=0;jgrouse.forEach(this._data,function(value,item)
{iterator(item,index++);});},clear:function()
{this._data=[];}}});jgrouse.define('jgrouse.util.ObjectSet','jgrouse.util.Set',function(salt)
{eval(salt);return{initialize:function(comparator)
{_super(this,'initialize');this._data=[];this._comparator=comparator?comparator:this.__defComparator;},__defComparator:function(item1,item2)
{return item1===item2;},_search:function(item)
{return jgrouse.search(this._data,item,this._comparator);},put:function(value)
{var index=this._search(value);if(index<0)
{this._data.push(value);}},exists:function(item)
{return this._search(item)>=0;},toArray:function()
{return[].concat(this._data);},remove:function(item)
{var i=this._search(item);if(i>=0)
{this._data.splice(i,1);}
return item;},forEach:function(iterator,backwards)
{jgrouse.forEach(this._data,iterator,backwards);},clear:function()
{this._data=[];}}});}});jgrouse.module({name:'jgrouse.util.TaskManager',requires:['jgrouse.util.PropertyChangeSupport'],imports:['jgrouse.util.PropertyChangeSupport','jgrouse.util.PropertyChangeEvent'],body:function(embed)
{eval(embed);var timer=null;var queue=[];function asyncRunner()
{var tmp=queue;queue=[];timer=null;for(var i=0;i<tmp.length;i++)
{tmp[i]();}}
jgrouse.util.TaskManager={_pcs:null,post:function(func)
{queue.push(func);if(!timer)
{timer=window.setTimeout(asyncRunner,10);}},postPropertyChange:function(propertyName,newValue,oldValue,sender)
{var athis=this;this.post(function()
{athis._pcs.firePropertyChange(propertyName,newValue,oldValue,sender);})},onPropertyChanged:function(e)
{this.handlePropertyChangeEvent(e);}}
jgrouse.util.TaskManager._pcs=new PropertyChangeSupport(jgrouse.util.TaskManager),jgrouse.delegate(jgrouse.util.TaskManager,'_pcs',PropertyChangeSupport.prototype);jgrouse.define('jgrouse.util.EventPoller','jgrouse.BaseObject',function(embed)
{eval(embed);return{initialize:function(timeout)
{_sup(this,arguments);this._pcs=new PropertyChangeSupport(this);this._subscribersCount=0;this._timer=null;this._poller=jgrouse.bind(this,this.poll);this._timeout=timeout?timeout:500;},_checkSubscribers:function()
{if(this._subscribersCount&&!this._timer)
{this._timer=window.setInterval(this._poller,this._timeout);}
if(!this._subscribersCount&&this._timer)
{window.clearInterval(this._timer);this._timer=null;}},poll:function()
{jgrouse.notImplemented(RTTI+'.poll');},addListener:function(propertyNameOrListener,listener)
{this._pcs.addListener.apply(this._pcs,arguments);this._subscribersCount++;this._checkSubscribers();jgrouse.log.info('added subscriber, '+this._subscribersCount);},removeListener:function(propertyNameOrListener,listener)
{this._pcs.removeListener.apply(this._pcs,arguments);this._subscribersCount--;this._checkSubscribers();jgrouse.log.info('removed subscriber, '+this._subscribersCount);}}});}});jgrouse.module({name:'jgrouse.widgets.Application',requires:['jgrouse.widgets.Container'],imports:['jgrouse.dom.Event','jgrouse.dom.Element'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.ApplicationContainer','jgrouse.widgets.Container',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_sup(this,arguments);this.addStyles({width:'100%',height:'100%',overflow:'hidden'});this._resizeListener=jgrouse.bindAsEventListener(this,'windowResized');this._body=null;this._html=null;},render:function()
{_sup(this,arguments);Event.addListener(window,'resize',this._resizeListener);},dispose:function()
{Event.removeListener(window,'resize',this._resizeListener);_sup(this,arguments);},windowResized:function(e)
{this.layout();},layout:function()
{if(!this._body)
{this._body=document.getElementsByTagName('body')[0];this._html=document.getElementsByTagName('html')[0];}
var body=this._body;body.style.width=this._html.clientWidth+'px';body.style.height=this._html.clientHeight+'px';var width=this._body.clientWidth;var height=this._body.clientHeight;this.addStyles({width:width+'px',height:height+'px'});_sup(this,arguments);}}});},postInit:function(embed)
{eval(embed);var html=document.getElementsByTagName('html')[0];var body=document.getElementsByTagName('body')[0];var bodyMarginLeft=Element.getComputedStyle(body,'margin-left');var bodyMarginRight=Element.getComputedStyle(body,'margin-right');var bodyMarginTop=Element.getComputedStyle(body,'margin-top');var bodyMarginBottom=Element.getComputedStyle(body,'margin-bottom');html.style.overflow='hidden';body.style.margin='0px';body.style.overflow='hidden';jgrouse.widgets.ApplicationContainer.init=function(defLocation)
{var app=new jgrouse.widgets.ApplicationContainer();jgrouse.widgets.ApplicationContainer._instance=app;var body=document.getElementsByTagName('body')[0];var ht=document.getElementById('_jgrouse_history_tracker');if(ht)
{ht.parentNode.removeChild(ht);}
var div=document.createElement('div');Element.setStyles(div,{paddingLeft:bodyMarginLeft,paddingRight:bodyMarginRight,paddingTop:bodyMarginTop,paddingBottom:bodyMarginBottom,width:'100%',height:'100%'})
Element.moveChildrenToNewParent(div,body);body.appendChild(div);app.setTemplate(body);var controller=new jgrouse.util.BaseController();app.bind(new jgrouse.util.MvcDriver(controller));body.innerHTML='';app.add(body);if(ht)
{body.appendChild(ht);}
app.setDisplayed(false);app.setDisplayed(true);var loc=window.location.hash;if(!loc||loc=='#')
{loc=defLocation;}
if(loc)
{loc=loc.substring(1);}
jgrouse.require('jgrouse.browser.HistoryTracker',function()
{jgrouse.browser.instance.initHistoryTracker();jgrouse.util.TaskManager.post(function(){jgrouse.browser.instance.setHistoryEntry(loc)});});}}});jgrouse.module({name:'jgrouse.widgets.Button',requires:['jgrouse.widgets.InputControl'],imports:['jgrouse.widgets.InputControl'],body:function(embed)
{eval(embed);jgrouse.widgets.registerWidget('button','jgrouse.widgets.Button');jgrouse.define('jgrouse.widgets.Button','jgrouse.widgets.InputControl',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_super(this,'initialize',options,styles);this.setAttribute('type','button');}}});}});jgrouse.module({name:'jgrouse.widgets.Checkbox',requires:['jgrouse.widgets.InputControl'],imports:['jgrouse.widgets.InputControl'],body:function(embed)
{eval(embed);jgrouse.widgets.registerWidget('checkbox','jgrouse.widgets.Checkbox');jgrouse.define('jgrouse.widgets.Checkbox','jgrouse.widgets.InputControl',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_super(this,'initialize',options,styles);this.setAttribute('type','checkbox');this.enableEvent('click');},setModelValue:function(value)
{var v=this.getValue();this.setAttribute('checked',v==value);},onClick:function(event)
{var c=this._domElement.checked;this.setAttribute('checked',c);this.firePropertyChange('modelValue',c?this.getValue():null);}}});}});jgrouse.module({name:'jgrouse.widgets.Container',requires:['jgrouse.widgets.TemplateParser','jgrouse.util.MvcDriver','jgrouse.util.Sets','jgrouse.widgets.Widget'],imports:['jgrouse.widgets.TemplateParser','jgrouse.util.MvcDriver','jgrouse.util.PrimitiveSet','jgrouse.string.*'],body:function(embed)
{eval(embed);jgrouse.widgets.registerWidget('container','jgrouse.widgets.Container');jgrouse.define('jgrouse.widgets.Container','jgrouse.widgets.Widget',function(salt)
{eval(salt);return{initialize:function(options,styles)
{_super(this,'initialize',options,styles);this._layout=null;this._parentMvcDriver=null;this._data=null;this._exportedProps=new PrimitiveSet();this._externBindings=null;this._controllerClass=null;this._controllerFactory=null;},createController:function()
{if(this._controllerClass!=null)
{var cf=jgrouse.resolveName(this._controllerClass);if(cf===null)
{throw"Cannot find controller's constructor "+this._controllerClass;}
return new cf();}
else if(this._controllerFactory!=null)
{var cf=jgrouse.resolveName(this._controllerFactory);if(cf===null)
{throw"Cannot find controller's factory "+this._controllerFactory;}
return cf();}
return null;},setControllerClass:function(controllerClassName)
{this._controllerClass=controllerClassName;},setControllerFactory:function(controllerFactoryName)
{this._controllerFactory=controllerFactoryName;},onPropertyChanged:function(event)
{var propName=event.getPropertyName();if(this._exportedProps.exists(propName))
{var newEvent=new jgrouse.util.PropertyChangeEvent(this,propName,event.getNewValue(),event.getOldValue());this._parentMvcDriver.onPropertyChanged(newEvent);}},setData:function(data)
{this._data=data;this._mvcDriver.setData(data);},setTemplateName:function(templateName)
{var template=thisModule.getResource(templateName);this.setTemplate(template);},createLayout:function(template)
{if(!(template instanceof jgrouse.widgets.TemplateParser))
{return new TemplateParser(template);}
else
{return template.subTemplate();}},setTemplate:function(template)
{var layout=this.createLayout(template);this.setLayout(layout);},setLayout:function(layout)
{this._layout=layout;this._layout.doParse();var athis=this;this._layout.forEach(function(widget)
{athis._internalAddWidget(widget);});var members=this._layout.getMembers();if(members)
{members.forEach(function(member,memberName)
{var setter='set'+jgrouse.string.upperFirst(memberName);if(athis[setter])
{athis[setter](member);}
else
{athis[memberName]=member;}});}},bind:function(mvcDriver)
{var controller=this.createController();this._parentMvcDriver=mvcDriver;if(controller)
{var mvc=new MvcDriver(controller);_super(this,'bind',mvc);this.setData({});this._bindParentMvc();}
else
{if(this._externBindings)
{throw"Cannot use externBindings when container does not have own controller";}
_sup(this,arguments);}
this._bindChildren();},unbind:function()
{var hasOwn=this._parentMvcDriver&&(this._parentMvcDriver===this._mvcDriver);_sup(this,arguments);if(hasOwn)
{this._parentMvcDriver.unbind(this);}},_bindParentMvc:function()
{if(this._externBindings)
{var pairs=this._externBindings.split(';');for(var i=0;i<pairs.length;i++)
{var pair=pairs[i].split(':');var viewProp=trim(pair[0]);var modelProp=trim(pair[1]);if(!viewProp)
{viewProp='value';}
this._exportedProps.put(viewProp);this._parentMvcDriver.bind(this,viewProp,modelProp);}}},_bindChildren:function()
{var athis=this;if(this._layout)
{this._layout.forEach(function(item)
{item.bind(athis._mvcDriver);});}},add:function(parentDom,refPoint)
{this._layout.render(this.getDomElement());_sup(this,arguments);},remove:function(doDispose)
{if(this._layout&&this._domElement)
{this._layout.remove(this._domElement,doDispose);}
_sup(this,arguments);},dispose:function()
{if(this._layout)
{this._layout.dispose();}
_super(this,'dispose');},_internalAddWidget:function(widget)
{widget.setOwner(this);if(this._mvcDriver)
{widget.bind(this._mvcDriver);}
this.resetBounds();},addWidget:function(widget,constraints)
{this._internalAddWidget(widget);this._layout.addWidget(widget,constraints);},removeWidget:function(widget,doDispose)
{widget.setOwner(null);widget.unbind();var constraint=this._layout.removeWidget(widget,doDispose);this.resetBounds();return constraint;},setShowing:function(isShowing)
{_sup(this,arguments);this._layout.forEach(function(widget)
{widget.resetShowing();});this.resetBounds();},setExternBindings:function(bindings)
{this._externBindings=bindings;},layout:function()
{this._layout.layout();}}});}});jgrouse.module({name:'jgrouse.widgets.Expander',requires:['jgrouse.widgets.Container'],imports:['jgrouse.widgets.TemplateParser','jgrouse.dom.*'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.Expander','jgrouse.widgets.Container',function(embed)
{eval(embed);jgrouse.widgets.registerWidget('expander','jgrouse.widgets.Expander');return{initialize:function(options,styles)
{_sup(this,arguments);this._block=null;},render:function()
{_sup(this,arguments);this.setValue(this._value);},setValue:function(value)
{this._value=value;if(this._domElement)
{Element.addStyle(this._block,'display',this._value?'':'none');}},setTemplateManager:function(templateManager)
{var templateManager=templateManager.subTemplate();this.setTemplate(templateManager);}}});jgrouse.define('jgrouse.widgets.ExpanderController','jgrouse.util.BaseController',function(embed)
{eval(embed);return{onTriggerNodeToggle:function(nodeId)
{this._data[nodeId]=!this._data[nodeId];if(this._data[nodeId])
{this.setCurrentNode(nodeId);}},setCurrentNode:function(node)
{if(this._data.currentNode)
{this._data[this._data.currentNode]=false;}
this._data.currentNode=node;this._data[node]=true;}}});}});jgrouse.module({name:'jgrouse.widgets.Filler',requires:['jgrouse.widgets.Container','jgrouse.widgets.WidgetProxy'],imports:['jgrouse.dom.Element'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.Filler','jgrouse.widgets.WidgetProxy',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_sup(this,arguments);this.addStyles({overflow:'hidden'});},createBucket:function()
{jgrouse.notImplemented(this.RTTI+'createBucket');},getOwnTemplate:function()
{var s="<div _jgmember='_content' style='width:100%; height:100%; overflow:hidden'></div>";return s;},setTemplate:function(template)
{_sup(this,arguments);var filler=null;var athis=this;Element.forEachNode(template._currentNode,function(node,index)
{var f=Element.getAttribute(node,'_jg-filler');var bucket=athis.createBucket();if(f)
{filler=bucket;}
template._currentNode.replaceChild(bucket,node);bucket.appendChild(node);},true);this._filler=filler;}}});jgrouse.widgets.registerWidget('widthFiller','jgrouse.widgets.WidthFiller');jgrouse.define('jgrouse.widgets.WidthFiller','jgrouse.widgets.Filler',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_sup(this,arguments);this._safetyPadding=50;},createBucket:function()
{var d=document.createElement('div');Element.addStyle(d,{'float':'left',overflow:'hidden',height:'100%'});return d;},layout:function()
{_sup(this,arguments);if(this.isShowing())
{var content=this.getTargetNode();var width=0;var athis=this;Element.forEachNode(content,function(node,index)
{if(athis._filler!=node)
{width+=node.offsetWidth;}});var parentWidth=content.parentNode.clientWidth+this._safetyPadding;if(parentWidth)
{if(parentWidth<width)
{Element.addStyle(content,{width:(width+this._safetyPadding)+'px'});}
else
{Element.addStyle(content,{width:parentWidth+'px'});}}
var contentWidth=content.offsetWidth-this._safetyPadding;if(contentWidth<0)
{contentWidth=0;}
if(this._filler)
{var remaining=contentWidth-width;if(remaining>0)
{Element.clearStyle(this._filler,'display');Element.addStyle(this._filler,{width:remaining+'px'});}
else
{Element.addStyle(this._filler,{width:'0px'});Element.addStyle(this._filler,{display:'none'});}}}}}});jgrouse.widgets.registerWidget('heightFiller','jgrouse.widgets.HeightFiller');jgrouse.define('jgrouse.widgets.HeightFiller','jgrouse.widgets.Filler',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_sup(this,arguments);},createBucket:function()
{var d=document.createElement('div');Element.addStyle(d,{overflow:'hidden'});return d;},layout:function()
{_sup(this,arguments);if(this.isShowing())
{var content=this.getTargetNode();var height=0;var athis=this;Element.forEachNode(content,function(node,index)
{if(athis._filler!=node)
{height+=node.offsetHeight;}});var parentHeight=content.parentNode.clientHeight;if(parentHeight)
{if(parentHeight<height)
{Element.addStyle(content,{height:height+'px'});}
else
{Element.addStyle(content,{height:parentHeight+'px'});}}
var contentHeight=content.offsetHeight;if(this._filler)
{var remaining=contentHeight-height;if(remaining>0)
{Element.clearStyle(this._filler,'display');Element.addStyle(this._filler,{height:remaining+'px'});}
else
{Element.addStyle(this._filler,{height:'0px'});Element.addStyle(this._filler,{display:'none'});}}}}}});}})
jgrouse.module({name:'jgrouse.widgets.InputControl',requires:['jgrouse.widgets.Widget'],imports:['jgrouse.widgets.Widget'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.InputControl','jgrouse.widgets.Widget',function(salt)
{eval(salt);return{initialize:function(options,styles)
{_super(this,'initialize',options,styles);this._tagName='input';},setName:function(value)
{this.setAttribute('name',value);},getName:function()
{return this.getAttribute('name');},setValue:function(value)
{this.setAttribute('value',value);},getValue:function()
{return this._attributes.value;}}});}});jgrouse.module({name:'jgrouse.widgets.InputText',requires:['jgrouse.widgets.InputControl'],imports:['jgrouse.widgets.InputControl'],body:function(embed)
{eval(embed);jgrouse.widgets.registerWidget('inputText','jgrouse.widgets.InputText');jgrouse.define('jgrouse.widgets.InputText','jgrouse.widgets.InputControl',function(salt)
{eval(salt);return{initialize:function(options,styles)
{_super(this,'initialize',options,styles);this.setAttribute('type','text');this.enableEvent('change');},onChange:function(event)
{var val=this._domElement.value;var oldVal=this.getValue();this.setValue(val);this.firePropertyChange('value',val,oldVal);}}});}});jgrouse.module({name:'jgrouse.widgets.Layout',requires:['jgrouse.widgets.Widget'],imports:['jgrouse.util.ObjectMap'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.Layout','jgrouse.BaseObject',function(embed)
{eval(embed);return{initialize:function()
{_sup(this,arguments);this._widgetsMap=new ObjectMap();},addWidget:function(widget,constraint)
{this._widgetsMap.put(constraint,widget);},doParse:function()
{jgrouse.notImplemented(this.RTTI+".doParse");},render:function(parentDom)
{},remove:function(parentDom)
{this.forEach(function(widget)
{widget.setShowing(false);});},removeWidget:function(widget,doDispose)
{var constraint=null;this.forEach(function(w,d)
{if(w==widget)
{constraint=d;throw jgrouse.$break;}});if(constraint!==null)
{this._widgetsMap.remove(constraint);}
widget.remove(doDispose);return constraint;},dispose:function()
{this.forEach(function(widget,dom)
{widget.remove(true);});this._widgetsMap.clear();},getMembers:function()
{},forEach:function(callback)
{this._widgetsMap.forEach(callback);},layout:function()
{}}});}});jgrouse.module({name:'jgrouse.widgets.PageContainer',requires:['jgrouse.widgets.Container','jgrouse.widgets.SimpleLayout'],imports:['jgrouse.widgets.TemplateParser','jgrouse.dom.Event','jgrouse.dom.Element','jgrouse.string.*'],body:function(embed)
{eval(embed);jgrouse.widgets.registerWidget('pageContainer','jgrouse.widgets.PageContainer');jgrouse.define('jgrouse.widgets.PageContainer','jgrouse.widgets.Container',function(salt)
{eval(salt);return{initialize:function(options,styles)
{_sup(this,arguments);this._contentUrl=undefined;this._loader=jgrouse.bind(this,this._postLoad);this._originalHTML=null;this._currentContainer=null;},setContentUrl:function(url)
{var ancorName=null;if(url)
{var ancor=unescape(url);var a=ancor.split('#');ancor=a[0];ancorName=a[1];if(ancor)
{if(this._contentUrl!=ancor)
{this._contentUrl=ancor;var athis=this;jgrouse.ClassLoader.instance.getText(ancor+'?__jgdummy=1',function(text)
{athis._postLoad(text,ancorName);});}
else
{this._scrollToAncor(ancorName);}}
else
{this._scrollToAncor(ancorName);}}
else
{if(this._contentUrl||typeof this._contentUrl=='undefined')
{this._contentUrl=null;this._postLoad(this._originalHTML)}
else
{this._contentUrl=null;}}},render:function()
{if(!this._contentUrl)
{this.setContentUrl(null);}
_sup(this,arguments);},createLayout:function(template)
{var simpleLayout=new jgrouse.widgets.SimpleLayout();this._originalHTML=null;if(typeof template=='string')
{this._originalHTML=template;}
else
{var dom=null;if(template instanceof jgrouse.widgets.TemplateParser)
{dom=template._currentNode;}
else
{dom=template;}
this._originalHTML=dom.innerHTML;dom.innerHTML='';}
return simpleLayout;},_scrollToAncor:function(ancorName)
{if(ancorName)
{var ae=document.getElementsByName(ancorName)[0];if(ae)
{Element.scrollIntoView(ae,'left');}}
else
{if(this._domElement&&this._domElement.firstChild)
{Element.scrollIntoView(this._domElement.firstChild,'left');}}},_postLoad:function(text,ancorName)
{var insertText=(typeof text=='string')?text:text.responseText;var div=document.createElement('div');div.innerHTML=insertText;var root=null;var initScript=null;jgrouse.dom.Element.walkTree(div,function(node)
{if(node.id=='content')
{root=node;}
if(node.tagName&&node.tagName.toLowerCase()=='script'&&node.id=='init')
{initScript=node;}});if(!root)
{root=div;}
else
{root.parentNode.removeChild(root);jgrouse.dom.Element.disposeDom(div);}
var athis=this;function doProcess()
{if(athis._currentContainer)
{athis.removeWidget(athis._currentContainer,true);athis._currentContainer=null;}
var container=new jgrouse.widgets.Container();;athis._currentContainer=container;container.setTemplate(root);athis.addWidget(container);athis._scrollToAncor(ancorName);}
if(initScript)
{var s='var initFunc = function(callback){'+initScript.innerHTML+'}';eval(s);initFunc(doProcess);}
else
{doProcess();}},dispose:function()
{if(this._currentContainer)
{this._currentContainer.remove(true);}
_sup(this,arguments);}}});}});jgrouse.module({name:'jgrouse.widgets.Radiobutton',requires:['jgrouse.widgets.InputControl'],body:function(embed)
{eval(embed);jgrouse.widgets.registerWidget('radio','jgrouse.widgets.Radiobutton');jgrouse.define('jgrouse.widgets.Radiobutton','jgrouse.widgets.InputControl',function(embed)
{eval(embed);return{initialize:function(option,styles)
{_super(this,'initialize',option,styles);this.setAttribute('type','radio');this.enableEvent('click');},setModelValue:function(value)
{var v=this.getValue();this.setAttribute('checked',v==value);},onClick:function(event)
{this.setAttribute('checked',true);this.firePropertyChange('modelValue',this.getValue());}}});}});jgrouse.module({name:'jgrouse.widgets.SimpleLayout',requires:['jgrouse.widgets.Layout'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.SimpleLayout','jgrouse.widgets.Layout',function(embed)
{eval(embed);return{initialize:function()
{_sup(this,arguments);this._parentDom=null;this._counter=0;},addWidget:function(widget,constraint)
{_super(this,'addWidget',widget,this._counter++);if(this._parentDom)
{widget.add(this._parentDom);}},render:function(parentDom)
{this._parentDom=parentDom;this.forEach(function(widget)
{widget.add(parentDom);});},doParse:function()
{},remove:function(parentDom)
{this.forEach(function(widget)
{widget.remove(false);});this._parentDom=null;_sup(this,arguments);}}});}});jgrouse.module({name:'jgrouse.widgets.StaticText',requires:['jgrouse.widgets.Widget'],body:function(embed)
{eval(embed);jgrouse.widgets.registerWidget('staticText','jgrouse.widgets.StaticText');jgrouse.define('jgrouse.widgets.StaticText','jgrouse.widgets.Widget',function(salt)
{eval(salt);return{initialize:function(options,styles,text)
{_super(this,'initialize',options,styles);this._value=text;this._textNode=null;},render:function()
{_super(this,'render');if(this._value)
{this._textNode=document.createTextNode(this._value);this._domElement.appendChild(this._textNode);}},setTagName:function(tagName)
{this._tagName=tagName;},setTemplate:function(template)
{if(typeof template=='string')
{this.setValue(template)}
else
{this.setValue(template._currentNode.innerHTML);template._currentNode.innerHTML='';}},setValue:function(value)
{this._value=value;if(this._domElement)
{if(value)
{if(this._textNode)
{this._textNode.data=value;}
else
{this._textNode=document.createTextNode(value);this._domElement.appendChild(this._textNode);}}
else
{if(this._textNode)
{this._domElement.removeChild(this._textNode);this._textNode=null;}}}},getValue:function()
{return this._value;}}});jgrouse.widgets.registerWidget('link','jgrouse.widgets.Link');jgrouse.define('jgrouse.widgets.Link','jgrouse.widgets.StaticText',function(embed)
{eval(embed);return{initialize:function(options,styles,text)
{_sup(this,arguments);this._realRef=null;this._addToHistory=false;},setRealRef:function(href)
{this.setAttribute('href',href);},getClickValue:function()
{var v=_sup(this,arguments);if(typeof v=='undefined')
{v=this.getAttribute('href');}
return v;},setAddToHistory:function(value)
{this._addToHistory=value;},onClick:function(event)
{_sup(this,arguments);var clickValue=this.getClickValue();if(this._suppressDefault['click']&&this._addToHistory)
{jgrouse.browser.instance.setHistoryEntry(clickValue);}}}});jgrouse.widgets.registerWidget('slink','jgrouse.widgets.SLink');jgrouse.define('jgrouse.widgets.SLink','jgrouse.widgets.Link',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_sup(this,arguments);var href=options.href;this.setClickValue(jgrouse.browser.instance.normalizeAncor(href));this.setAttribute('href','#'+escape(href));this.setAddToHistory(true);this._suppressDefault['click']=true;}}});}});jgrouse.module({name:'jgrouse.widgets.TemplateParser',requires:['jgrouse.dom.Element','jgrouse.util.Maps','jgrouse.util.Catalog','jgrouse.widgets.Layout'],imports:['jgrouse.dom.Element','jgrouse.util.SimpleMap','jgrouse.util.ObjectMap','jgrouse.util.Catalog','jgrouse.string.*'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.TemplateParser','jgrouse.widgets.Layout',function(salt)
{eval(salt);return{initialize:function(data)
{_super(this,'initialize');this._root=null;this._idMap=new SimpleMap();this._idRef=new Catalog();this._idDomMap=new SimpleMap();this._currentNode=null;this._members=new SimpleMap();this._parentDom=null;this._orderedWidgets=[];this._initRoot(data);},_initRoot:function(data)
{var root=document.createElement('div');root.className='____templateRoot';if(typeof data=='string')
{root.innerHTML=data;}
else
{Element.moveChildrenToNewParent(root,data);}
this._root=root;this._currentNode=root;},getMembers:function()
{return this._members;},doParse:function()
{var athis=this;function runThis(node)
{athis._processNode(node);}
this._traverse(this._root,runThis)
this._resolveIdrefs();},_processOneNode:function(domNode)
{if(domNode.nodeType!=Element.ELEMENT_NODE)
{return;}
var attrs=Element.getAttributes(domNode);var standard={};var custom={};var spice={};for(var i=attrs.length-1;i>=0;i--)
{var attr=attrs[i];var n=attr.nodeName;if(standard[n]!==undefined||custom[n]!==undefined)
{continue}
var v=attr.value;var nl=n.toLowerCase();if(nl!=n)
{Element.clearAttribute(domNode,n);Element.setAttribute(domNode,nl,v);n=nl;}
if(nl!='style')
{if(nl=='id')
{var newVal=jgrouse.widgets.nextId()+'.'+v;this._idMap.put(v,newVal);attr.value=newVal;v=newVal;this._idDomMap.put(newVal,domNode);}
else
{var v1=v.toLowerCase();if(v1.indexOf('idref:')===0)
{var val=v1.substr(6);var ref=val.split('.')[0];this._idRef.add(ref,{ownerElement:domNode,name:attr.name,value:val});}}
if(n.charAt(0)=='_')
{custom[n]=v;}else
if(n.charAt(0)=='$')
{spice[n]=v;}
else
{standard[n]=v;}}}
var member=domNode;this.customize(domNode,standard,custom,spice);if(custom._jgtype)
{var widget=this._createWidget(domNode,standard,custom,spice);this.addWidget(widget,domNode);member=widget;}
if(custom._jgmember)
{this._members.put(custom._jgmember,member);}},_traverse:function(root,callback)
{var node=root.firstChild;var stack=[];while(node)
{callback(node);var ns=node.firstChild;if(ns)
{stack.push(node);}
else
{ns=node.nextSibling;if(!ns&&stack.length>0)
{do
{ns=stack.pop();ns=ns.nextSibling;}while(!ns&&stack.length>0);}}
node=ns;}},_processNode:function(domNode)
{var oldCurrent=this._currentNode;this._currentNode=domNode;this._processOneNode(domNode);this._currentNode=oldCurrent;},customize:function(domNode,standard,custom,spice)
{},_createWidget:function(node,standard,custom,spice)
{var widgetType=custom._jgtype;var widgetClass=jgrouse.widgets.getWidgetClass(widgetType);if(!widgetClass)
{throw new jgrouse.Exception("Cannot find class for widget "+widgetType);}
var styles=Element.getStyles(node);var widget=new widgetClass(standard,styles);if(widget.setTagName)
{widget.setTagName(node.tagName);}
function processSpice(spiceAlias,spiceName)
{var sn=spiceName.split('.');if(sn.length==1)
{var spiceInstance=widget.getSpice(spiceName);if(!spiceInstance)
{widget.addSpice(spiceName,spiceAlias);}}
else
{var spiceInstance=widget.getSpice(sn[0]);if(!spiceInstance)
{var refSpiceAlias=spice[sn[0]];if(!refSpiceAlias)
{throw'Cannot find spice definition for '+spiceName;}
processSpice(refSpiceAlias,sn[0]);spiceInstance=widget.getSpice(sn[0]);}
var setter='set'+upperFirst(camelize(sn[1]));if(!spiceInstance[setter])
{throw'Cannot find setter '+setter+' for spice '+sn[0];}
spiceInstance[setter](spiceAlias);}}
jgrouse.forEach(spice,processSpice);jgrouse.forEach(custom,function(value,name)
{if(name.indexOf('_jg')!=0)
{var n='set'+upperFirst(camelize(name.substring(1)));if(widget[n])
{widget[n](value);}
else
{throw new jgrouse.Exception('Method '+n+' not found in '+widget.RTTI);}}});if(widget.setTemplate)
{widget.setTemplate(this);}
else
{if(node.firstChild)
{node.innerHTML='';}}
return widget;},_resolveIdrefs:function()
{var athis=this;this._idRef.forEach(function(attr,oldId)
{var newVal=athis._idMap.get(oldId);var val=attr.value.split('.');val[0]=newVal;var v=val.join('.');attr.value=v;var attrDom=attr.ownerElement;var widget=athis._widgetsMap.get(attrDom);if(widget)
{widget.setAttribute(attr.name,v);}
else
{Element.setAttribute(attrDom,attr.name,v);}});},_domIndex:function(domElement)
{var target=this._parentDom?this._parentDom:this._root;var index=0;var node=domElement;while(node!=target)
{index++;node=node.parentNode;}
return index;},_sortWidgets:function(first,second)
{return first.index>second.index?1:first.index==second.index?0:-1;},render:function(parentDom)
{this._parentDom=parentDom;Element.moveChildrenToNewParent(parentDom,this._root);this.forEach(function(widget,dom)
{var domParent=dom.parentNode;widget.add(domParent,dom);});},addWidget:function(widget,dom)
{_sup(this,arguments);if(this._parentDom)
{widget.add(dom.parentNode,dom);}
var index=this._domIndex(dom);this._orderedWidgets.push({index:index,widget:widget});this._orderedWidgets.sort(this._sortWidgets);},removeWidget:function(widget,doDispose)
{for(var i=this._orderedWidgets.length;i>=0;i--)
{if(this._orderedWidgets[i].widget==widget)
{this._orderedWidgets.splice(i,1);break;}}
_sup(this,arguments);},remove:function(parentDom)
{if(this._root)
{Element.moveChildrenToNewParent(this._root,parentDom);}
this._parentDom=null;this._orderedWidgets=[];_sup(this,arguments);},dispose:function()
{_sup(this,arguments);this._idMap.clear();this._idRef.clear();this._idDomMap.clear();this._members.clear();Element.disposeDom(this._root);this._root=null;},subTemplate:function()
{return new _class(this._currentNode);},layout:function()
{jgrouse.forEach(this._orderedWidgets,function(item,index){var widget=item.widget;if(widget.layout)
{widget.layout();}});}}});}});jgrouse.module({name:'jgrouse.widgets.Widget',requires:['jgrouse.dom.Element','jgrouse.dom.Event','jgrouse.util.PropertyChangeSupport','jgrouse.util.Sets','jgrouse.util.MvcDriver','jgrouse.util.Maps','jgrouse.util.TaskManager'],imports:['jgrouse.util.PropertyChangeSupport','jgrouse.util.PropertyChangeEvent','jgrouse.dom.Element','jgrouse.dom.Event','jgrouse.util.SimpleMap','jgrouse.string.*'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.Widget','jgrouse.BaseObject',function(salt)
{eval(salt);var res={initialize:function(attributes,styles)
{_super(this,'initialize');this._attributes=attributes?attributes:{};this._styles=styles?styles:{};this._domElement=null;this._refPoint=null;this._pcs=new PropertyChangeSupport(this);this._owner=null;this._isShowing=false;this._tagName='div';if(!this._attributes.id)
{this._attributes.id=jgrouse.widgets.nextId();}
this._bindings=null;this._mvcDriver=null;this._enabledEvents={};this._clickValue=undefined;this._suppressDefault={};jgrouse.widgets._widgetInstances.put(this.__serialObjId,this);this._spices=new SimpleMap();this._cachedBounds=null;},applyAttributes:function()
{if(this._domElement)
{Element.setAttributes(this._domElement,this._attributes);Element.setStyles(this._domElement,this._styles);}},enableEvent:function(eventName)
{var arr=typeof eventName=='array'?eventName:[eventName];var athis=this;jgrouse.forEach(arr,function(ev)
{if(!athis._enabledEvents[ev])
{var name='on'+jgrouse.string.upperFirst(ev);var func=jgrouse.bindAsEventListener(athis,function(event)
{this[name](event);if(this._suppressDefault[ev])
{Event.cancelEvent(event);}});athis._enabledEvents[ev]=func;if(athis._domElement)
{Event.addListener(athis._domEvent,ev,func,true);}}});},setSuppressDefault:function(values)
{var arr=values.split(';');for(var i=0;i<arr.length;i++)
{this._suppressDefault[arr[i]]=true;}},_bindEnabledEvents:function()
{var athis=this;jgrouse.forEach(this._enabledEvents,function(func,eventName)
{Event.addListener(athis._domElement,eventName,func,true);})},clearEventListeners:function()
{Event.removeElementListeners(this._domElement);},disableEvent:function(eventName)
{if(this._enabledEvents)
{var func=this._enabledEvents[eventName];if(func)
{if(this._domElement)
{this.removeEventListener(this._domElement,eventName,func,true);}
delete this._enabledEvents[eventName];}}},setBindings:function(bindings)
{this._bindings=bindings;},unbind:function()
{if(this._mvcDriver)
{this._mvcDriver.unbind(this);var athis=this;this._spices.forEach(function(spice)
{athis._mvcDriver.unbind(spice);});if(this._bindings)
{var pairs=this._bindings.split(';');for(var i=0;i<pairs.length;i++)
{var viewProp=trim(pair[0]);if(viewProp.charAt(0)=='#')
{var modelProp=trim(pair[1]);this._mvcDriver.unbind(jgrouse.util.TaskManager,modelProp,viewProp.substring(1));}}}}
this._mvcDriver=null;},bind:function(mvcDriver)
{this.unbind();this._mvcDriver=mvcDriver;if(this._bindings)
{var pairs=this._bindings.split(';');for(var i=0;i<pairs.length;i++)
{var pair=pairs[i].split(':');var viewProp=trim(pair[0]);var modelProp=trim(pair[1]);if(!viewProp)
{viewProp='value';}
if(viewProp.charAt(0)=='#')
{var prop=viewProp.substring(1);this._mvcDriver.bind(jgrouse.util.TaskManager,modelProp,viewProp.substring(1));}
else if(viewProp.charAt(0)=='$')
{var props=viewProp.split('.');var member=props[0];var vp=props[1];var spice=this._spices.get(member);this._mvcDriver.bind(spice,vp,modelProp);}else
{this._mvcDriver.bind(this,viewProp,modelProp);if(viewProp.indexOf('trigger')==0)
{var base=viewProp.substr(7);var methodName='on'+upperFirst(base);if(this[methodName])
{this.enableEvent(base.toLowerCase());}}}}}},getMvcDriver:function()
{return this._mvcDriver;},_translateAttrName:function(attr)
{return(attr=='class')?'className':attr;},setAttribute:function(attrName,attrValue)
{this._attributes[attrName]=attrValue;if(this._domElement)
{Element.setAttribute(this._domElement,attrName,attrValue);}},getAttribute:function(attrName)
{return this._attributes[attrName];},addStyles:function(styleName,styleValue)
{if(arguments.length==2)
{this._styles[styleName]=styleValue;if(this._domElement)
{Element.addStyle(this._domElement,styleName,styleValue);}}
else
{var athis=this;jgrouse.forEach(styleName,function(value,name)
{athis.addStyles(name,value);});}},addClassName:function(className)
{var s=this.getAttribute('class');if(s)
{s=s.split(' ');}
else
{s=[];}
if(jgrouse.search(s,className)<0)
{s.splice(0,0,className);var v=s.join(' ');this.setAttribute('class',v);}},removeClassName:function(className)
{var s=this.getAttribute('class');if(s)
{s=s.split(' ');var i=jgrouse.search(s,className);if(i>=0)
{s.splice(i,1);this.setAttribute('class',s.join(' '));}}},getDomElement:function()
{if(!this._domElement)
{this.render();}
return this._domElement;},addSpice:function(spiceName,spiceAlias)
{var spiceClass=jgrouse.widgets.getSpiceClass(spiceAlias);if(spiceClass==null)
{throw'Cannot find class for spice '+spiceAlias;}
var spice=new spiceClass(this);this._spices.put(spiceName,spice);return spice;},getSpice:function(spiceName)
{return this._spices.get(spiceName);},_removeOneSpice:function(spice)
{if(spice)
{this._mvcDriver.unbind(spice);spice.destroy();}},removeSpice:function(spiceName)
{var spice=this._spices.remove(spiceName);this._removeOneSpice(spice);},render:function()
{this._domElement=document.createElement(this._tagName);this._domElement._jgwidget=this;this.applyAttributes();this._bindEnabledEvents();this.renderSpices();},renderSpices:function()
{this._spices.forEach(function(spice)
{spice.render();});},isShowing:function()
{return this._isShowing;},setOwner:function(owner)
{this._owner=owner;},add:function(parentDom,refPoint)
{if(parentDom)
{if(refPoint)
{parentDom.replaceChild(this.getDomElement(),refPoint);}
else
{parentDom.appendChild(this.getDomElement());}
this._refPoint=refPoint;}
this.resetShowing();},setDisplayed:function(isDisplayed)
{this.addStyles('display',isDisplayed?'':'none');this.resetShowing();},resetShowing:function()
{var showing=!!this._domElement&&this._owner?this._owner.isShowing():Element.isShowing(this._domElement);if(showing)
{showing&=this._styles.display!='none';}
this.setShowing(showing);},resetBounds:function()
{if(this.isShowing())
{var oldHeight=0;var oldWidth=0;var bounds=this._cachedBounds;if(bounds)
{oldHeight=this._cachedBounds.height;oldWidth=this._cachedBounds.width;}
else
{bounds={};this._cachedBounds=bounds;}
bounds.width=this._domElement.offsetWidth;bounds.height=this._domElement.offsetHeight;if(bounds.width!=oldWidth||bounds.height!=oldHeight)
{if(this.layout)
{this.layout();}}}
else
{this._cachedBounds=null;}},setShowing:function(isShowing)
{if(isShowing!=this._isShowing)
{this._isShowing=isShowing;this.resetBounds();this.firePropertyChange('showing',isShowing,!isShowing);}},remove:function(doDispose)
{if(this._domElement)
{var parentNode=this._domElement.parentNode;if(parentNode)
{if(this._refPoint)
{parentNode.replaceChild(this._refPoint,this._domElement);}
else
{parentNode.removeChild(this._domElement);}
this._refPoint=null;this.setShowing(false);}
if(doDispose)
{this.dispose();}}},dispose:function()
{this.disposeSpices();this.remove(false);if(this._domElement)
{this.clearEventListeners();Element.disposeDom(this._domElement);this._domElement._jgwidget=null;this._domElement=null;}
jgrouse.widgets._widgetInstances.remove(this.__serialObjId);},disposeSpices:function()
{this._spices.forEach(function(spice)
{spice.dispose();});},setDisabled:function(value)
{this.setAttribute('disabled',value);},setClickValue:function(value)
{this._clickValue=value;},getClickValue:function()
{return this._clickValue;},onClick:function(event)
{this.firePropertyChange('triggerClick',this.getClickValue());},setTagName:function(tagName)
{this._tagName=tagName;}};jgrouse.delegate(res,'_pcs',PropertyChangeSupport.prototype);return res;});jgrouse.define('jgrouse.widgets.Spice','jgrouse.BaseObject',function(embed)
{eval(embed);var res={initialize:function(widget)
{this._widget=widget;this._memberName=null;this._pcs=new PropertyChangeSupport(this);},setNodeMember:function(memberName)
{this._memberName=memberName;},getNode:function()
{return this._memberName?this._widget[this._memberName]:null;},getWidget:function()
{return this._widget;},render:function()
{},dispose:function()
{},addClassName:function(className)
{var element=this.getNode();if(element)
{Element.addClassName(element,className);}
else
{this.getWidget().addClassName(className);}},removeClassName:function(className)
{var element=this.getNode();if(element)
{Element.removeClassName(element,className);}
else
{this.getWidget().removeClassName(className);}},layout:function()
{}}
jgrouse.delegate(res,'_pcs',PropertyChangeSupport.prototype);return res;});},postInit:function(embed)
{eval(embed);var widgestry=new jgrouse.util.SimpleMap();var spices=new jgrouse.util.SimpleMap();jgrouse.widgets.registerWidget=function(widgetName,widgetClassName)
{widgestry.put(widgetName,widgetClassName);}
jgrouse.widgets.registerSpice=function(spiceName,spiceClassName)
{spices.put(spiceName,spiceClassName);}
jgrouse.widgets.getWidgetClass=function(widgetType)
{var name=widgestry.get(widgetType);return(name)?jgrouse.resolveName(name):null;}
jgrouse.widgets.getSpiceClass=function(spiceAlias)
{var name=spices.get(spiceAlias);return(name)?jgrouse.resolveName(name):null;}
var seed='jg'+String((new Date()).getTime())+'-';var counter=0;function nextId()
{return seed+(counter++);};jgrouse.widgets.nextId=nextId;jgrouse.widgets._widgetInstances=new SimpleMap();jgrouse.widgets.__disposeHook=function()
{jgrouse.widgets._widgetInstances.forEach(function(widget)
{widget.dispose();});jgrouse.widgets._widgetInstances.clear();}
jgrouse.addUnloadHook(jgrouse.widgets.__disposeHook);}});jgrouse.module({name:'jgrouse.widgets.WidgetProxy',requires:['jgrouse.widgets.TemplateParser','jgrouse.widgets.Container'],imports:['jgrouse.dom.Element'],body:function(embed)
{eval(embed);jgrouse.define('jgrouse.widgets.WidgetProxy','jgrouse.widgets.Container',function(embed)
{eval(embed);return{initialize:function(options,styles)
{_sup(this,arguments);this._content=null;},getOwnTemplate:function()
{return null;},setContent:function(content)
{this._content=content;},setTemplate:function(template)
{var ownTemplate=this.getOwnTemplate();if(!ownTemplate)
{ownTemplate='';}
_super(this,'setTemplate',ownTemplate);if(ownTemplate)
{if(!this._content)
{throw"Content node has not been defined";}
if(this._content instanceof jgrouse.widgets.Widget)
{throw"Content node cannot be a widget";}
Element.forEach(this._content,function(node,index)
{if(node.nodeType==Element.ELEMENT_NODE)
{throw"Content node must be empty";}});this._content.innerHTML='';}},add:function(parentDom,refPoint)
{var targetPoint=this._content?this._content:this.getDomElement();Element.moveChildrenToNewParent(targetPoint,refPoint);_sup(this,arguments);},remove:function(doDispose)
{var targetPoint=this._content?this._content:this.getDomElement();Element.moveChildrenToNewParent(this._refPoint,targetPoint);},getTargetNode:function()
{return this._content?this._content:this.getDomElement();}}})}});jgrouse.module({name:'jgrouse.widgets.spices.Spices',requires:['jgrouse.widgets.Widget'],imports:['jgrouse.string.*','jgrouse.dom.Element','jgrouse.dom.Event'],body:function(embed)
{eval(embed);jgrouse.widgets.registerSpice('rollover','jgrouse.widgets.spices.Rollover');jgrouse.define('jgrouse.widgets.spices.Rollover','jgrouse.widgets.Spice',function(embed)
{eval(embed);return{initialize:function(widget)
{_sup(this,arguments);this._mouseOverHandler=jgrouse.bindAsEventListener(this,this._mouseOver);this._mouseOutHandler=jgrouse.bindAsEventListener(this,this._mouseOut);this._isMouseOver=false;this._className=null;},setClassName:function(className)
{this._className=className;},render:function()
{var element=this.getNode();if(!element)
{element=this.getWidget().getDomElement();}
Event.addListener(element,'mouseover',this._mouseOverHandler,true);Event.addListener(element,'mouseout',this._mouseOutHandler,true);},dispose:function()
{var element=this.getNode();if(!element)
{element=this.getWidget()._domElement;}
if(element)
{Event.removeListener(element,'mouseover',this._mouseOverHandler,true);Event.removeListener(element,'mouseout',this._mouseOutHandler,true);}},_mouseOut:function(event)
{this._isMouseOver=false;if(this._className)
{this.removeClassName(this._className);}},_mouseOver:function(event)
{if(!this._isMouseOver&&this._className)
{this._isMouseOver=true;this.addClassName(this._className);}}}});jgrouse.widgets.registerSpice('highlight','jgrouse.widgets.spices.Highlight');jgrouse.define('jgrouse.widgets.spices.Highlight','jgrouse.widgets.Spice',function(embed)
{eval(embed);return{initialize:function(widget)
{_sup(this,arguments);this._state=false;this._className=null;},setState:function(value)
{var oldValue=this._state;this._state=value;if(this._className&&(oldValue!=value))
{if(value)
{this.addClassName(this._className);}
else
{this.removeClassName(this._className);}}},setClassName:function(value)
{this._className=value;}}});}});jgrouse.ClassLoader.instance.setDeferLoading(false);
