this.global=this;function isDefined(name){return name in global;}
if(typeof(global.include)!=="function"){var include=function(script){document.write("<script type=\"text/javascript\" src=\""+script+"\"></script>");}}
function load(code){if(window.execScript){return window.execScript(code);}
global.eval(code);}
function extract(text,start,stop){var startIndex;if(!empty(start)){startIndex=text.indexOf(start);if(startIndex<0){return null;}
startIndex+=start.length;}
var stopIndex=text.indexOf(stop,startIndex);if(stopIndex<startIndex){return null;}
return text.substring(startIndex,stopIndex);}
function equals(a,b){if(!exists(a))
return!exists(b);if(!exists(b))
return!exists(a);if(a.Equatable)
return a.equals(b);if(b.Equatable)
return b.equals(a);return a==b;}
function internal(block){block();}
function pass(value){return value;}
pass.toTarget=pass;pass.toSource=pass;function invert(value){return!value;}
invert.toTarget=invert;invert.toSource=invert;function exists(value){return value!==undefined&&value!==null;}
function empty(value){return!exists(value)||value===""||(isArray(value)&&value.length===0)||(isObject(value)&&(value.Enumerable?value.isEmpty():!hasProperties(value)));}
function hasProperties(object){for(var key in object){return true;}
return false;}
function any(){for(var i=0,length=arguments.length;i<length;i++){var arg=arguments[i];if(exists(arg)){return arg;}}}
function tryAny(){for(var i=0;i<arguments.length;i++){var method=arguments[i];try{return method();}catch(e){}}}
function get(value,builder){return exists(value)?value:builder();}
function getByKey(object,property,value){return property in object?object[property]:value;}
function isObject(value){return typeof(value)=="object"&&value!==null;}
function isNumber(value){return typeof(value)=="number";}
function isString(value){return typeof(value)=="string";}
function isFunction(value){return typeof(value)=="function";}
function isArray(value){return value instanceof Array;}
function isDom(value){return exists(value)&&isNumber(value.nodeType);}
function init(object,property,value){var result=object[property];return exists(result)?result:object[property]=value;}
function obtain(object,property,initializer){var result=object[property];return exists(result)?result:object[property]=initializer();}
function obtainGet(object,property,initializer){var result=object.get(property);if(!exists(result)){result=initializer();object.set(property,result);}
return result;}
function obtainSet(object,property,key,value){obtain(object,property,newObject)[key]=value;}
function obtainAdd(object,property,value){obtain(object,property,newArray).push(value);}
function clone(object){var result=new object.constructor();for(var key in object){result[key]=object[key];}
return result;}
function extend(target,source){for(var key in source){target[key]=source[key];}
return target;}
function nothing(){}
function str(value){switch(typeof(value)){case"boolean":return value?"true":"false";case"number":case"object":if(value===null){return"";}
case"string":return String(value);default:return"";}}
function construct(type){return function(){return new type();};}
function provide(type){return function(value){return exists(value)?value:new type();};}
var newObject=construct(Object);var newArray=construct(Array);var getObject=provide(newObject);var getArray=provide(newArray);function objectize(key,value){var obj={};obj[key]=value;return obj;}
function setExisting(object,key,value){if(exists(value)){object[key]=value;}}
var Browser={IE:(window.attachEvent&&!window.opera)?extract(navigator.appVersion,"MSIE ",";"):false,Opera:window.opera?extract(navigator.appVersion,""," "):false,WebKit:navigator.appVersion.indexOf('AppleWebKit/')>-1?extract(navigator.appVersion,"AppleWebKit/"," "):false,Gecko:navigator.userAgent.indexOf('Gecko')>-1&&navigator.userAgent.indexOf('KHTML')==-1?extract(navigator.userAgent,"rv:",")"):false,KHTML:navigator.appVersion.indexOf('KHTML')>-1&&navigator.appVersion.indexOf('AppleWebKit')==-1?extract(navigator.appVersion,"KHTML/"," "):false,MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)};function times(number,iterator){for(var i=0;i<number;i++){iterator(i);}
return iterator.result;}
function iterate(list,iterator,offset){for(var i=any(offset,0),length=list.length;i<length;i++){iterator(list[i],i);}
return iterator.result;}
function iterateReplace(list,iterator,offset){for(var i=any(offset,0),length=list.length;i<length;i++){list[i]=iterator(list[i],i);}
return iterator.result;}
function enumerate(object,iterator){for(var key in object){iterator(object[key],key);}
return iterator.result;}
function enumerateReplace(list,iterator,offset){for(var i=any(offset,0),length=list.length;i<length;i++){list[i]=iterator(list[i],i);}
return iterator.result;}
function each(source,iterator){if(!exists(source)){return iterator.result;}
if(source.Enumerable){return source.each(iterator);}
if(isArray(source)||isNumber(source.length)){return iterate(source,iterator);}
if(isNumber(source)){return times(source,iterator);}
return enumerate(source,iterator);}
function builder(construct,build){var result=construct();var iterator=function(value,key){build(result,key,value);}
iterator.result=result;return iterator;}
function stacker(template){var result=[];var iterator;if(exists(template)){iterator=function(value,key){result.push(template(value,key));};}else{iterator=function(value){result.push(value);};}
iterator.result=result;return iterator;}
function mapper(template){var result={};var iterator;if(exists(template)){iterator=function(value,key){result[key]=template(value,key);};}else{iterator=function(value,key){result[key]=value;};}
iterator.result=result;return iterator;}
function writer(template){var iterator;if(exists(template)){iterator=function(value,key){iterator.result+=template(value,key);};}else{iterator=function(value,key){iterator.result+=value;};}
iterator.result="";return iterator;}
function linearizing(action){function iterator(item){if(isArray(item)){iterate(item,iterator);}else{action(item);}}
iterator.result=action.result;return iterator;}
function where(match,action){function iterator(item,key){if(match(item,key)){action(item);}}
iterator.result=action.result;return iterator;}
function existing(action){return where(exists,action);}
function processing(action,template){function iterator(value,key){action(template(value,key));}
iterator.result=action.result;return iterator;};function keyGetter(value,key){return key;};var $found={type:"Found"};function indexOf(items,match){var index=0;try{each(items,function(value,key){if(match(value,key)){throw $found;}
index++;});return null;}catch(e){if(e===$found){return index;}
throw e;}}
function search(items,match){var result;try{each(items,function(value,key){if(match(value,key)){result=[value,key];throw $found;}});return null;}catch(e){if(e===$found){return result;}
throw e;}}
function lookup(items,match){var result;try{each(items,function(value,key){result=match(value,key);if(exists(result)){throw $found;}});return null;}catch(e){if(e===$found){return result;}
throw e;}}
function match(value,key){if(exists(key)){return function(object){return object[key]===value;};}else{return function(object){return object===value;};}}
function matchGet(value,key){if(exists(key)){return function(object){return object[key].get()===value;};}else{return function(object){return object.get()===value;};}}
function isArrayOrListable(object){return isArray(object)||(object.Enumerable&&!object.Dictionary);}
function $A(list,offset,template){return iterate(list,stacker(template),offset);}
function translate(source,template){return each(source,stacker(template));}
function map(source,template){return each(source,mapper(template));}
function dict(source,template){return each(source,builder(newObject,function(target,key,value){var pair=template(value,key);target[pair[0]]=pair[1];}));}
function extractStrings(source,template){return translate(dict(source,function(value,key){return[template(value,key),null];}),function(value,key){return key;});}
function compact(list,offset,template){return iterate(list,existing(stacker(template)),offset);}
function linearize(list,offset,template){return iterate(list,linearizing(existing(stacker(template))),offset);}
function filter(list,match,offset,template){return iterate(list,where(match,stacker(template)),offset)}
function includes(collection,match){return exists(indexOf(collection,match));}
function concat(){var result=[];iterate(arguments,function(arg){if(exists(arg)){iterate(arg,function(item){result.push(item);});}});return result;}
function merge(){var result={};iterate(arguments,function(arg){if(exists(arg)){extend(result,arg);}});return result;}
function withoutProperties(object){var result=merge(object);iterate(arguments,function(property){delete result[property];},1);return result;}
function keys(source){return translate(source,keyGetter);};var values=translate;function addProperty(object,value,observer){var key=1;while(key in object){key++;}
object[key]=value;observer(value,key,null);return key;}
function changeProperty(object,key,value,observer){var old=object[key];if(!equals(old,value)){if(exists(value)){object[key]=value;}else{delete object[key];}
observer(value,key,old);}
return old;}
function changeProperties(object,values,observer){var changes={};enumerate(values,function(value,key){var old=object[key];if(!equals(old,value)){changes[key]=old;object[key]=value;}});enumerate(changes,function(value,key){observer(object[key],key,value);});return changes;}
function replaceProperties(object,values,observer){var changes=clone(values);enumerate(object,function(value,key){if(!(key in changes)){changes[key]=null;}});return changeProperties(object,changes,observer);}
function objectAccessor(object,key){return new Accessor(function(){return object[key];},function(value){var oldValue=object[key];object[key]=value;return oldValue;});}
function getWatchGetter(accessor){return new WatchGetter(accessor.get,accessor.observe,accessor.invokeObserver);}
function cannotGet(source){return source.CanGet?!source.canGet():false;}
function setter(accessor,value){return function(){accessor.set(value);};}
function getAccessorDeep(accessor){while(true){var value=accessor.get();if(!exists(value)||!value.Accessor){return accessor;}
accessor=value;}}
function date(year,month,day,hour,min,sec){return new Date(year,month-1,day,hour,min,sec);}
function copyDate(date){return new Date(date.getTime());}
function getArgumentsCount(func){var items=func.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",");return items.length==1&&!items[0]?0:items.length;}
function multiDictSet(dict,key,value){return obtain(dict,key,newWatchList).append(value);}
function tryGet(source,key){return exists(source)?source.get(key):null;}
function path(source,path){indexOf(path,function(step){if(!exists(source)){return true;}
source=source[step];});return source;}
function pathGet(source,path){indexOf(path,function(step){if(!exists(source)){return true;}
source=source.get(step);});return source;}
function redirectToRoomLoc(room,loc){indicoRequest('roomBooking.locationsAndRooms.getLink',{room:room,location:loc},function(result,error){if(!error&&result){window.location=result}else{new AlertPopup($T("Warning"),$T("Location not available")).open();}});}
function contains(text,string){return text.indexOf(string)!=-1;}
function startsWith(text,string){return string==text.slice(0,string.length);}
function endsWith(text,str){return str==text.slice(-str.length);}
var specialCharMap={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','\\':'\\\\','"':'\\"'};function escapeString(text){return"\""+text.replace(/[\x00-\x1f\\\"]/g,function(value){if(value in specialCharMap){return specialCharMap[value]}else{return"\\u00"+zeroPad(value.charCodeAt(0).toString(16),2);}})+"\"";}
function textTemplate(template){return function(args){return format(template,args);};}
function format(text,args){return text.replace(/(\{\{)|(\}\})|(\{[^\}]*\})/g,function(string){switch(string){case"{{":return"{";case"}}":return"}";}
if(!exists(args)){return"";}
return str(args[string.slice(1,-1)]);});}
function trim(text){return trimEnd(trimStart(text));}
function trimStart(text){return text.replace(/^\s+/,"");}
function trimEnd(text){return text.replace(/\s+$/,"");}
function padLeft(text,size,character){while(text.length<size){text=character+text;}
return text;}
function zeroPad(text,size){return padLeft(text,size,"0");}
function camelToDash(text){return text.replace(/[A-Z]/g,function(item){return"-"+item.toLowerCase();});}
function decodeHtml(html){var dom=obtain(decodeHtml,"dom",function(){return document.createElement("div");});dom.innerHTML=html;var result=[];var text="";(function fetch(dom){iterate(dom.childNodes,function(child){if(child.nodeType==1){result.push(text);text="";fetch(child);result.push(text);text="";}else{text+=child.nodeValue;}});})(dom);result.push(text);return result;}
function type(name,mixins,members,constructor){constructor=any(constructor,function(){});members=getObject(members);members[name]=constructor;members.constructor=constructor;constructor.prototype=members;constructor.mixins=[name];mixinType(constructor,mixins);this[name]=constructor;return constructor;}
function mixinType(target,mixins){var code=target.prototype;var mixs=target.mixins;iterate(mixins,function(mixinName){var mixinCode=eval(mixinName);enumerate(mixinCode.prototype,function(value,key){if(!exists(code[key])||code[key]===Object.prototype[key]){code[key]=value;}});if(exists(mixinCode.mixins)){iterate(mixinCode.mixins,function(item){if(!code[item]){mixs.push(item);}});}else{if(!code[mixinName]){mixs.push(mixinName);}
init(code,mixinName,mixinCode);}});return target;}
function mixinInstance(target,source,mixin){enumerate(mixin.prototype,function(value,key){target[key]=source[key];});return target;}
function Enum(){var self=this;iterate(arguments,function(item,index){self[item]=index;});}
function NamedEnum(){var self=this;iterate(arguments,function(item){self[item]=item;});}
type("Getter",[],{get:function(){}},function(get){this.get=get;});type("Accessor",["Getter"],{set:function(value){}},function(get,set){this.get=get;this.set=set;});type("Observable",[],{observe:function(observer){}},function(observer){this.observe=observer;});type("InvokableObservable",["Observable"],{invokeObserver:function(observer){}},function(observer,invokeObserver){this.observe=observer;this.invokeObserver=invokeObserver;});type("WatchGetter",["Getter","InvokableObservable"],{},function(get,observe,invokeObserver){this.get=get;this.observe=observe;this.invokeObserver=invokeObserver;});type("WatchAccessor",["WatchGetter","Accessor"],{},function(get,set,observe,invokeObserver){this.get=get;this.set=set;this.observe=observe;this.invokeObserver=invokeObserver;});type("CanGet",[],{canGet:function(){throw new Error("Not implemented");}});type("Refreshable",[],{refresh:function(){}},function(refresh){this.refresh=refresh;});var SourceState=new Enum("None","Loading","Loaded","Committing","Error");type("Source",["Refreshable"],{state:null,error:null});type("Enumerable",[],{each:function(iterator){},isEmpty:function(){}},function(each,isEmpty){this.each=each;this.isEmpty=isEmpty;});type("WatchListable",["Enumerable"],{observe:function(listObserver){}});type("List",["Enumerable"],{length:null,item:function(index){},accessor:function(index){var self=this;return new Accessor(function(){return self.item(index);},function(value){return self.replaceAt(index,value);});},allItems:function(){},append:function(item){},appendExisting:function(item){if(exists(item)){return this.append(item);}else{return this.length;}},appendMany:function(items){var self=this;each(items,function(item){self.append(item);});},insert:function(item,index){},remove:function(item){},removeMany:function(items){var self=this;each(items,function(item){self.remove(item);});},removeAt:function(index){},removeManyAt:function(indexes){var self=this;each(indexes,function(index){self.removeAt(index);});},replaceAt:function(index,item){var old=this.removeAt(index);this.insert(item,index);return old;},move:function(source,destination){var item=this.removeAt(source);this.insert(item,destination);return item;},clear:function(){},indexOf:function(item){}},function(array){array=getArray(array)
var self=this;this.length=new Getter(function(){return array.length;});this.item=function(index){return array[index];};this.allItems=function(){return array.slice(0);};this.append=function(item){array.push(item);return array.length-1;};this.insert=function(item,index){if(!exists(index)){index=0;}
array.splice(index,0,item);return index;};this.remove=function(item){var index=this.indexOf(item);if(exists(index)){array.splice(index,1);}
return index;};this.removeAt=function(index){return array.splice(index,1)[0];};this.clear=function(){var old=array;array=[];return old;};if(isFunction(array.indexOf)){this.indexOf=function(item){var index=array.indexOf(item);return(index===-1)?null:index;};}else{this.indexOf=function(item){for(var i in array){if(array[i]===item){return i;}}
return null;};}
this.each=function(iterator){return iterate(array,iterator);};this.isEmpty=function(){return array.length===0;};});type("Lookup",[],{get:function(key){throw new Error("Not implemented");}},function(values){this.get=function(key){var value=values[key];if(exists(value)){if(value.Getter){return value.get();}else if(isFunction(value)){return value();}}
return value;};});type("Dictionary",["Lookup","Enumerable"],{set:function(key,value){throw new Error("Not implemented");},getAll:function(){throw new Error("Not implemented");},update:function(values){throw new Error("Not implemented");},replace:function(values){throw new Error("Not implemented");},clear:function(){throw new Error("Not implemented");}});type("Attachable",[],{attach:function(item){throw new Error("Not implemented");}});type("EnumerableAttachable",["Attachable","Enumerable"]);type("Equatable",[],{equals:function(item){return this==item;}});function curry(method){var args=$A(arguments,1);return function(){return method.apply(this,concat(args,arguments));};}
function wrap(method,instance){return function(){return method.apply(instance,$A(arguments));}}
function apply(method,instance){var args=$A(arguments,2);return function(){return method.apply(instance,concat(args,arguments));};}
function methodize(object,key){return function(){var method=object[key];if(exists(method)){return method.apply(object,$A(arguments));}};}
function invoker(object,args){args=any(args,[]);return function Invoke(func){return(arguments.callee.result=func.apply(object,args));};}
function objectInvoker(object,args){args=any(args,[]);return function(key){var method=object[key];if(exists(method)){return method.apply(object,args);}};}
function methodInvoker(method,args){args=any(args,[]);if(isFunction(method)){return function(object){return method.apply(object,args);};}else{return function(object){var func=object[method];if(exists(func)){return func.apply(object,args);}};}}
function sequence(){var functions=compact(arguments);return function Sequence(){iterate(functions,invoker(this,$A(arguments)));};}
function commander(method){var objects=new Bag();return mixinInstance(function(){return objects.each(methodInvoker(method,$A(arguments)));},objects,Attachable);}
function commands(){var methods=new Bag();return mixinInstance(function(){return methods.each(invoker(this,$A(arguments)));},methods,Attachable);}
function command(method,caption){function Command(){return method.apply(this,$A(arguments));}
Command.caption=caption;return Command;}
function invoke(method){if(exists(method)){return method.apply(this,$A(arguments,1));}}
function delay(method,timeout){var id=setTimeout(method,timeout);return function(){clearTimeout(id);};}
function defer(method){return delay(method,1);}
function schedule(method){if(exists(method.scheduled)){return method.scheduled;}else{method.scheduled=defer(function(){delete method.scheduled;method();});return method.scheduled;}}
function delayedBind(target,key,builder){target[key]=function(){var args=$A(arguments);var method=builder.apply(this,args);target[key]=method;return method.apply(this,args);};}
function Point(x,y){if(!exists(x)){this.x=0;this.y=0;}else if(isObject(x)){this.x+=x.x;this.y+=x.y;}else if(!exists(y)){this.x=x;this.y=x;}else{this.x=x;this.y=y;}}
Point.fromPolar=function(r,a){return new Point(r*Math.cos(a),r*Math.sin(a));};Point.fromArray=function(array){return new Point(array[0],array[1]);};Point.fromVector=function(source,destination){return new Point(destination.x-source.x,destination.y-source.y);};Point.prototype={fromPolar:function(r,a){this.x=r*Math.cos(a);this.y=r*Math.sin(a);return this;},fromArray:function(array){this.x=array[0];this.y=array[1];return this;},toArray:function(){return[this.x,this.y];},getRadius:function(){return Math.sqrt(MathEx.sqr(this.x)+MathEx.sqr(this.y));},getAngle:function(){return Math.atan2(this.y,this.x);},move:function(x,y){if(isObject(x)){this.x+=x.x;this.y+=x.y;}else{this.x+=x;this.y+=y;}
return this;},scale:function(x,y){if(isObject(x)){this.x*=x.x;this.y*=x.y;}else if(!exists(y)){this.x*=x;this.y*=x;}else{this.x*=x;this.y*=y;}
return this;},getOffset:function(x,y){return new Point(this.x-x,this.y-y);},placeToCircle:function(cx,cy,r){var o=this.getOffset(cx,cy);var or=o.getRadius();if(or>r){this.fromPolar(r,o.getAngle());this.move(cx,cy);}
return this;},setMinimum:function(x,y){if(x<this.x){this.x=x;}
if(y<this.y){this.y=y;}},setMaximum:function(x,y){if(x>this.x){this.x=x;}
if(y>this.y){this.y=y;}}};var Rad={};times(4,function(value){Rad["q"+(value+1)]=Math.PI*(value+1)/2;});var MathEx={sqr:function(value){return value*value;},degToRad:function(value){return value*Math.PI/180;},radToDeg:function(value){return value*180/Math.PI;},getLength:function(pt1,pt2){return Point.fromVector(pt1,pt2).getRadius();},getPolylineLength:function(points){var length=0;var previous=null;each(points,function(point){if(exists(previous)){length+=MathEx.getLength(previous,point);}
previous=point;});return length;},getPointOnPolyline:function(points,offset){var pp=null;var previous=null;var result=lookup(points,function(point){if(exists(previous)){var vector=Point.fromVector(previous,point);var length=vector.getRadius();if(offset<length){var angle=vector.getAngle();vector.scale(offset/length).move(previous);vector.angle=angle;return vector;}
offset-=length;}
pp=previous;previous=point;});if(!exists(result)){result=new Point(previous);result.angle=MathEx.radToDeg(Point.fromVector(pp,previous).getAngle());}
return result;}};function even(number){return number%2===0;}
function odd(number){return number%2!==0;}
type("Bag",["EnumerableAttachable"],{},function(){var counter=0;var items={};var pendingItems=null;function getDetach(id){return function detach(){if(id in items){delete items[id];return true;}
return false;};}
this.each=function(iterator){pendingItems={};var result=enumerate(items,iterator);extend(items,pendingItems);pendingItems=null;return result;};this.attach=function(item){var id=counter++;if(exists(pendingItems)){pendingItems[id]=item;}else{items[id]=item;}
return getDetach(id);};});function watchize(target){if(!exists(target)||!isObject(target)){return target;}
if(isArray(target)){var list=new WatchList();iterate(target,function(item){list.append(watchize(item,setter));});return list;}
var object=new WatchObject();enumerate(target,function(target,key){object.set(key,watchize(target));init(object,key,object.accessor(key));});return object;}
function watch(target,commit){if(isObject(target)){if(target.WatchGetter){target.observe(function(value,old){if(exists(old)){unwatch(old,commit);}
if(exists(value)){watch(value,commit);}
commit();});}else if(target.WatchList){target.observe({itemAdded:function(item,index,self){watch(item,commit);commit();},itemRemoved:function(item,index,self){unwatch(item,commit);commit();}});}else if(target.WatchObject){target.observe(function(value,key,self,old){if(exists(old)){unwatch(old,commit);}
if(exists(value)){watch(value,commit);}
commit();});}else{each(target,function(value){watch(value,commit);});}}
return target;}
function unwatch(){}
function $V(source,template){return bind.toAccessor(new WatchValue(),source,template);}
function $C(source,template){return bind.accessor(new WatchValue(),source,template);}
type("WatchValue",["WatchAccessor"],{},function(value){var valueObservers=commands();this.WatchAccessor(function(){return value;},function(newValue){if(!equals(value,newValue)){var oldValue=value;value=newValue;valueObservers(newValue,oldValue);}},valueObservers.attach,function(observer){return observer(value,value);});});function watchSetter(init){var accessor=new WatchValue(init);return mixinInstance(function(value){accessor.set(value);return this;},accessor,WatchAccessor);}
type("WatchPair",["WatchValue"],{key:null},function(key,value){this.key=key;this.WatchValue(value);});function $L(source,template){return bind.toList(new WatchList(),source,template);}
type("WatchList",["WatchListable","List"],{accessor:function(index){var self=this;return new WatchAccessor(function(){return self.item(index);},function(value){return self.replaceAt(index,value);},function(observer){return self.observe({itemAdded:function(it,idx){if(idx==index){observer(it,self.item(index+1));}else if(idx<index){observer(self.item(index),self.item(index+1));}},itemRemoved:function(it,idx){if(idx==index){observer(self.item(index),it);}else if(idx<index){observer(self.item(index),self.item(index-1));}},itemMoved:function(it,idx){var src=idx[0];var dst=idx[1];if(src==index){if(dst!=index){observer(self.item(index),it);}}else if(src<index){if(dst>=index){observer(self.item(index),self.item(index-1));}}else{if(dst<=index){observer(self.item(index),self.item(index+1));}}}});},function(observer){var value=self.item(index);return observer(value,value);});}},function(){var self=this;var items=new List($A(arguments));var length=$V(items.length);var listObservers=commands();this.each=items.each;this.isEmpty=items.isEmpty;this.length=getWatchGetter(length);this.item=items.item;this.allItems=items.allItems;this.append=function(item){var index=items.append(item);listObservers("itemAdded",item,index,self);length.set(items.length.get());return index;};this.insert=function(item,index){if(!exists(index)||index<items.length.get()){index=items.insert(item,index);listObservers("itemAdded",item,index,self);length.set(items.length.get());return index;}
while(index-->items.length){self.append(null);}
return self.append(item);};this.remove=function(item){var index=items.remove(item);if(index>=0){listObservers("itemRemoved",item,index,self);length.set(items.length.get());}
return index;};this.removeAt=function(index){var item=items.removeAt(index);if(exists(item)){listObservers("itemRemoved",item,index,self);}
length.set(items.length.get());return item;};this.move=function(source,destination){var item=items.move(source,destination);listObservers("itemMoved",item,[source,destination],self);length.set(items.length.get());return item;};this.clear=function(){var old=items.clear();iterate(old,function(item){listObservers("itemRemoved",item,0,self);});length.set(items.length.get());return old;};this.indexOf=items.indexOf;this.observe=function(listObserver){var observer=isFunction(listObserver)?listObserver:function(evt){var eventObserver=listObserver[evt];if(exists(eventObserver)){eventObserver.apply(listObserver,$A(arguments,1));}};return listObservers.attach(observer);};});function processListable(source,processor){each(source,processor.itemAdded);if(source.WatchListable){return source.observe(processor);}}
function processListableAccessor(source,key,append,remove){processListable(source,{itemAdded:function(item){var accessor=item[key];if(exists(accessor)){bind.setter(accessor,accessor,function(value,old){if(exists(old)){remove(old);}
if(exists(value)){append(value);}});}},itemRemoved:function(item){var accessor=item[key];if(exists(accessor)){bind.stop(accessor);var old=accessor.get();if(exists(old)){remove(old);}}}});}
newWatchList=construct(WatchList);getWatchList=provide(WatchList);function $O(source,template){return bind.toDictionary(new WatchObject(),source,template);}
type("WatchObject",["Dictionary","Observable"],{add:function(value){},getter:function(key){var self=this;return new WatchGetter(function(){return self.get(key);},function(observer){return self.observe(function(value,key,self,old){return observer(value,old);},key);},function(observer){var value=self.get(key);return observer(value,value);});},accessor:function(key){var self=this;return new WatchAccessor(function(){return self.get(key);},function(value){return self.set(key,value);},function(observer){return self.observe(function(value,key,self,old){return observer(value,old);},key);},function(observer){var value=self.get(key);return observer(value,value);});}},function(){var self=this;var properties={};var propertyObservers={};var objectObservers=commands();var notify=function(value,key,old){var propertyObserver=propertyObservers[key];if(exists(propertyObserver)){propertyObserver(value,key,self,old);}
objectObservers(value,key,self,old);};this.each=function(iterator){return enumerate(properties,iterator);};this.isEmpty=function(){return!hasProperties(properties);};this.get=function(key){return properties[key];};this.set=function(key,value){return changeProperty(properties,key,value,notify);};this.getAll=function(){return clone(properties);};this.update=function(values){return changeProperties(properties,values,notify);};this.replace=function(values){return replaceProperties(properties,values,notify);};this.clear=function(){var old=properties;properties={};enumerate(old,function(value,key){notify(null,key,value);});return old;};this.observe=function(observer,key){if(exists(key)){var propertyObserver=propertyObservers[key];if(!exists(propertyObserver)){propertyObserver=commands();propertyObservers[key]=propertyObserver;}
return propertyObserver.attach(observer);}else{return objectObservers.attach(observer);}};this.add=function(value){return addProperty(properties,value,notify);};return mixWatchAccessors(this,arguments,this);});function watchType(name,properties,mixins){var create=type(name,any(mixins,[]),{},function(source){if(this instanceof arguments.callee){var object=new WatchObject();var self=this;iterate(create.mixins,function(mixin){mixWatchAccessors(self,self[mixin].watchProperties,object);});watchType.init(this,arguments);}else{return watchType.load(new arguments.callee(),source);}});create.watchProperties=properties;return create;}
watchType.init=function(target,values){var counter=0;iterate(target.constructor.mixins,function(mixin){iterate(target[mixin].watchProperties,function(property){target[property].set(values[counter++]);});});return target;}
watchType.load=function(target,object){if(object instanceof target.constructor){iterate(target.constructor.mixins,function(mixin){iterate(target[mixin].watchProperties,function(property){var value=object[property];if(exists(value)&&value.Getter){target[property].set(value.get());}});});}else{iterate(target.constructor.mixins,function(mixin){iterate(target[mixin].watchProperties,function(property){target[property].set(object[property]);});});}
return target;}
function mixWatchGetters(target,properties,object){if(!exists(object)){object=new WatchObject();}
iterate(properties,function(property){target[property]=object.getter(property);});return object;}
function mixWatchAccessors(target,properties,object){if(!exists(object)){object=new WatchObject();}
iterate(properties,function(property){target[property]=object.accessor(property);});return object;}
function mixWatchObject(target,accessors,getters,object){if(!exists(object)){object=new WatchObject();}
iterate(properties,function(property){target[property]=object.accessor(property);});iterate(getters,function(property){target[property]=object.getter(property);});return object;}
newWatchObject=construct(WatchObject);getWatchObject=provide(WatchObject);function $B(target,source,template){if(exists(target)&&target.XElement&&cannotGet(target)){return bind.element(target,source,template);}else{return bind(target,source,template);}}
var bind=function(target,source,template){if(!exists(source)){return bind.detach(target);}
if(!exists(target)){return obtainTemplate(template)(source);}
if(target.Accessor){return bind.accessor(target,source,template);}
if(target.List){return bind.toList(target,source,template);}
if(target.Dictionary){return bind.toDictionary(target,source,template);}
bind.detach(target);throw new Error("Not implemented.");};bind.element=function(target,source,template){return bind.attach(target,bind.internal.element(target,source,template));};bind.accessor=function(target,source,template,listenOnly){if(cannotGet(target)){if(cannotGet(source)){return bind.detach(target);}else{return bind.toAccessor(target,source,template);}}else if(source.Accessor){if(cannotGet(source)){return bind.toAccessor(source,target,template);}else{var toTarget,toSource;if(!exists(template)){toTarget=null;toSource=null;}else if(isString(template)){toTarget=template;toSource=function(value){source[template]=value;};}else{toTarget=template.toTarget;toSource=template.toSource;}
var lock={};bind.toAccessor(target,source,toTarget,listenOnly,lock);bind.toAccessor(source,target,toSource,true,lock);return target;}}else{return bind.toAccessor(target,source,template);}};bind.toAccessor=function(target,source,template,listenOnly,lock){return bind.setter(target,source,templatedSetter(template,function(value){if(lock){if(!lock.active){lock.active=true;target.set(value);lock.active=null;}}else{target.set(value);}}),listenOnly);};bind.toList=function(target,source,template){return bind.setter(target,source,function(value){if(!exists(value)){target.clear();return null;}
if(isArrayOrListable(value)){return bind.internal.list(target,value,template);}
return bind.internal.objectToList(target,value,template);});};bind.toDictionary=function(target,source,template){return bind.setter(target,source,function(value){if(!exists(value)){target.clear();return null;}
if(isArrayOrListable(value)){return bind.internal.listToDictionary(target,value,template);}
return bind.internal.objectToDictionary(target,value,template);});};bind.list=function(target,source,template){return bind.attach(target,bind.internal.list(target,source,template));};bind.objectToList=function(target,source,template){return bind.attach(target,bind.internal.objectToList(target,source,template));};bind.listToDictionary=function(target,source,template){return bind.attach(target,bind.internal.listToDictionary(target,source,template));};bind.objectToDictionary=function(target,source,template){return bind.attach(target,bind.internal.objectToDictionary(target,source,template));};bind.sequence=function(target,source,template){return bind.attach(target,bind.internal.sequence(target,source,template));};bind.listEx=function(target,source,template,offset,multiplier){return bind.attach(target,bind.internal.listEx(target,source,template,offset,multiplier));};bind.setter=function(target,source,setter,listenOnly){function gain(value,listenOnly){if(exists(value)&&value.Getter){return bind.internal.getter(gain,value,listenOnly);}
if(!listenOnly){setter(value)}}
return bind.attach(target,gain(source,listenOnly));}
bind.attach=function(target,stop){if(target.unbind){target.unbind();if(stop){target.unbind=stop;}else{delete target.unbind;}}else if(stop){target.unbind=stop;}
return target;};bind.detach=function(target){if(target.unbind){target.unbind();delete target["unbind"];}
return target;}
bind.internal={};bind.internal.element=function(target,source,template){if(!exists(target)){return obtainTemplate(template)(source);}
function gain(value){if(!exists(value)||value.XElement||!isObject(value)){target.clear();target.append(obtainTemplate(template)(value,target));return null;}
if(value.Getter){return bind.internal.getter(gain,value);}
if(isArrayOrListable(value)){return bind.internal.list(target,value,template);}
return bind.internal.list(target,$L(value),template);}
return gain(source);};bind.internal.getter=function(gain,value,listenOnly){var stop=gain(value.get(),listenOnly);if(value.WatchGetter){return sequence(stop,value.observe(sequence(stop,function(value){gain(value);})));}
return stop;}
bind.internal.list=function(target,list,template){template=obtainTemplate(template);function inserter(item,index){target.insert(template(item,target),index);}
target.clear();return processListable(list,{itemAdded:inserter,itemRemoved:function(item,index){target.removeAt(index);},itemMoved:function(item,source,destination){target.move(source,destination);}});};bind.internal.objectToList=function(target,object,template){template=obtainTemplate(template);if(object.WatchObject){var list=new WatchList();each(object,function(value,key){list.append(new WatchPair(key,value));});return sequence(bind.internal.list(target,list,template),object.observe(function(value,key,obj,old){if(exists(value)){var result=search(list,match(key,"key"));if(exists(result)){result[0].set(value);}else{list.append(new WatchPair(key,value));}}else{var index=indexOf(list,match(key,"key"));if(exists(index)){list.removeAt(index);}}}));}else{target.clear();each(object,function(value,key){target.append(template(new WatchPair(key,value),target));});}
return null;};bind.internal.listToDictionary=function(target,source,template){throw new Error("Not implemented.");};bind.internal.objectToDictionary=function(target,source,template){if(source.WatchObject){throw new Error("Not implemented.");}
if(exists(template)){source=map(source,template);}
target.update(source);return null;};bind.internal.sequence=function(target,list,template){template=obtainTemplate(template);function update(){target.clear();each(list,function(item,index){target.insert(template(item,index,target),index);});}
update();if(list.WatchList){return list.observe(update);}
return null;};bind.internal.listEx=function(target,list,template,offset,multiplier){template=obtainTemplate(template);if(!exists(offset)){offset=0;}
if(!exists(multiplier)){multiplier=1;}
function inserter(item,index){var items=template(item,target);var start=offset+multiplier*index;for(var i=0;i<multiplier;i++){target.insert(items[i],start+i);}}
each(list,inserter);if(list.WatchList){return list.observe({itemAdded:inserter,itemRemoved:function(item,index){index=offset+multiplier*index;times(multiplier,function(){target.removeAt(index);});},itemMoved:function(item,source,destination){source=offset+multiplier*source;destination=offset+multiplier*destination;times(multiplier,function(){target.move(source,destination);});}});}
return null;};function callOrGet(source){return isFunction(source)?source():source;}
function obtainTemplate(template){if(!exists(template)){return pass;}
if(isFunction(template)){return template;}
return function(value){return exists(value)?value[template]:null;};}
function templatedSetter(template,setter){if(!exists(template)){return setter;}
if(isFunction(template)){return function(value){setter(template(value));};}
return function(value){setter(exists(value)?value[template]:null);};}
function getNoneTemplate(substitution){return function(value){return exists(value)?value:callOrGet(substitution);};}
function getBlankTemplate(substitution){return function(value){return empty(value)?callOrGet(substitution):value;};}
function replaceEmpty(value,substitution){return empty(value)?callOrGet(substitution):value;}
function existenceTemplator(template,noneSubstitution,emptySubstitution){return function(value){return exists(value)?empty(value)?emptySubstitution:template(value):noneSubstitution;};}
function templateSplitter(templates,otherwise){otherwise=obtainTemplate(otherwise);return function(value){var template=templates[value];if(exists(template)){return template(value);}else{return otherwise(value);}};}
function splitter(values){if(values.Lookup){return function(key){return values.get(key);};}else{return function(key){return values[key];};}}
type("Chooser",["WatchAccessor"],{option:function(key){var self=this;return function(){self.set(key);};}},function(options){var value=$V();mixinInstance(this,value,WatchGetter);this.set=templatedSetter(splitter(options),value.set);});type("Switch",["WatchGetter"],{},function(){var state=$V();var self=this;mixinInstance(this,state,WatchGetter);iterate(arguments,function(value){if(isArray(value)){self[value[0]]=function(){iterate(value,function(item){state.set(item);});};}else{self[value]=function(){state.set(value);};}});});var Logic={onlyOne:function(accessors,defaultValue){iterate(accessors,function(accessor){accessor.observe(function(value){if(value!==defaultValue){iterate(accessors,function(acc){if(acc!==accessor){acc.set(defaultValue);}});}});});}}
var Json={validate:function(json){json=json.replace(/\\./g,'@').replace(/"[^"\\\n\r]*"/g,'');return(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(json);},read:function(json){try{if(!Json.validate(json)){throw"Invalid json.";}
return eval("("+json+")");}catch(e){throw"Cannot read json. "+e;}},write:function(object){if(!exists(object)){return"null";}
switch(typeof(object)){case"boolean":case"number":return str(object);case"string":return escapeString(object);case"object":if(object.Getter){return Json.write(object.get());}
if(object.Dictionary){object=object.getAll();}
if(object.Enumerable){return"["+object.each(stacker(Json.write)).join(",")+"]";}
if(isArray(object)){return"["+iterate(object,stacker(Json.write)).join(",")+"]";}
var properties=[];enumerate(object,function(value,key){if(!isFunction(value)){properties.push(escapeString(key)+":"+Json.write(value));}});return"{"+properties.join(",")+"}";default:throw"Invalid object: "+str(object);}}}
var $J=Json.write;function jsonAlert(arg){alert(Json.write(arg));}
var activeWebRequests=0
var ReadyState=new Enum("Uninitialized","Loading","Loaded","Interactive","Complete");function jsonRpcObject(url,method,params,dontWatch){var self=new Source();var sourceObject=mixWatchGetters(self,["state","error"]);var dataObject=new WatchObject();mixinInstance(self,dataObject,WatchObject);var updating=false;var requests={};function commit(key,value){var data={};var empty=true;enumerate(requests,function(value,key){if(value){data[key]=dataObject.get(key);empty=false;}});requests={};if(!empty){jsonRpcCommit(url,method,params,data,process,url);}}
function commitKey(key){if(!updating){requests[key]=true;defer(commit);}}
function process(result,error){if(exists(error)){sourceObject.update({state:SourceState.Error,error:error});}else{if(exists(result)){updating=true;if(!dontWatch){enumerate(result,function(value,key){dataObject.set(key,watch(watchize(value),curry(commitKey,key)));});}else{enumerate(result,function(value,key){dataObject.set(key,value);});}
updating=false;}
sourceObject.update({state:SourceState.Loaded,error:null});}}
dataObject.observe(function(value,key){commitKey(key);});self.refresh=function(){sourceObject.update({state:SourceState.Loading,error:null});return jsonRpc(url,method,params,process);};self.refresh();return self;}
function jsonRpcValue(url,method,params,def,dontStart,callback){var self=new Source();var object=mixWatchGetters(self,["state","error"]);object.set("data",def);mixinInstance(self,object.accessor("data"),WatchAccessor);function process(result,error){if(exists(error)){object.update({state:SourceState.Error,error:error});}else{object.update({state:SourceState.Loaded,data:result,error:null});if(callback){callback();}}}
self.set=function(value){var old=self.get();object.update({state:SourceState.Committing,error:null});jsonRpcCommit(url,method,params,value,process);return old;};self.refresh=function(){object.update({state:SourceState.Loading,error:null});return jsonRpc(url,method,params,process);};if(!dontStart){self.refresh();}
return self;}
function jsonRpcCommit(url,method,params,value,handler){var args;if(!exists(params)){args=value;}else if(isArray(params)){args=$A(params);args.push(value);}else if(isObject(params)){args=clone(params);args.value=value;}else{args=value;}
return jsonRpc(url,method,args,handler);}
function jsonRpc(url,method,params,handler){return jsonRequest(url,{version:"1.1",origin:location.href,method:method,params:params},function(response,error){if(exists(error)){handler(response,"SERVER: "+error);}else{handler(response.result,response.error);}});}
function jsonRequest(url,value,handler){return webRequest(url,"application/json",Json.write(value),function(result,error){handler(exists(result)?Json.read(result):result,error);});}
function webRequest(url,contentType,body,handler){var transport=Web.transport();try{transport.open("POST",url,true);transport.setRequestHeader("Accept","text/javascript, text/html, application/xml, text/xml, application/json, */*");transport.setRequestHeader("Content-Type",contentType);transport.onreadystatechange=function(){if(transport.readyState!=ReadyState.Complete){return;}
activeWebRequests--;delete transport.onreadystatechange;var status=transport.status;if(status>=200&&status<300){handler(transport.responseText,null);}else{handler(transport.responseText,[status,transport.statusText]);}}
transport.send(body);activeWebRequests++;}catch(e){handler(null,e);}
return function(){return transport.abort();};}
function webGet(url,handler){var transport=Web.transport();try{transport.open("GET",url,true);transport.setRequestHeader("Accept","text/javascript, text/html, application/xml, text/xml, application/json, */*");transport.setRequestHeader("Cache-Control","max-age=1000000000");transport.onreadystatechange=function(){if(transport.readyState!=ReadyState.Complete){return;}
transport.onreadystatechange=null;var status=transport.status;if(status>=200&&status<300){handler(transport.responseText,null);}else{handler(transport.responseText,[status,transport.statusText]);}};transport.send(null);}catch(e){handler(null,e);}
return function(){return transport.abort();};}
var Web={};if(exists(global.XMLHttpRequest)){Web.transport=function(){return new XMLHttpRequest();};}else{Web.transport=function(){return tryAny(function(){return new ActiveXObject('Msxml2.XMLHTTP');},function(){return new ActiveXObject('Microsoft.XMLHTTP');});};}
function parseTime(text){text=trim(text);if(text==""){return null;}
var hour=0;var min=0;if(/^\d{1,4}$/.test(text)){switch(text.length){case 1:hour=parseInt(text,10);break;case 2:hour=parseInt(text.substr(0,2),10);break;case 3:hour=parseInt(text.substr(0,1),10);min=parseInt(text.substr(1,2),10);break;case 4:hour=parseInt(text.substr(0,2),10);min=parseInt(text.substr(2,2),10);break;}}else{var match=/^(\d{1,2})[\W]+(\d{1,2})?$/.exec(text);if(!match){return null;}
hour=parseInt(match[1],10);var minText=any(match[2],"");if(minText!=""){min=parseInt(minText,10);}}
return[hour,min];}
function formatTime(time){return time.getHours().toString()+":"
+time.getMinutes().toPaddedString(2);}
function setTime(time,tuple){time.setHours(any(tuple[0],0),any(tuple[1],0),any(tuple[2],0),any(tuple[3],0));}
function getTime(time){return[time.getHours(),time.getMinutes(),time.getSeconds(),time.getMilliseconds()];}
function parseDate(text){text=trim(text);if(text==""){return null;}
var day=null;var month=null;var year=null;if(/^\d{1,8}$/.test(text)){switch(text.length){case 1:day=parseInt(text.substr(0,1),10);break;case 2:day=parseInt(text.substr(0,1),10);month=parseInt(text.substr(1,1),10);break;case 3:day=parseInt(text.substr(0,2),10);month=parseInt(text.substr(2,1),10);break;case 4:day=parseInt(text.substr(0,2),10);month=parseInt(text.substr(2,2),10);break;case 5:day=parseInt(text.substr(0,2),10);month=parseInt(text.substr(2,2),10);year=[parseInt(text.substr(4,1),10)];break;case 6:day=parseInt(text.substr(0,2),10);month=parseInt(text.substr(2,2),10);year=[parseInt(text.substr(4,2),10)];break;case 7:day=parseInt(text.substr(0,2),10);month=parseInt(text.substr(2,2),10);year=parseInt(text.substr(4,3),10);break;case 8:day=parseInt(text.substr(0,2),10);month=parseInt(text.substr(2,2),10);year=parseInt(text.substr(4,4),10);break;}}else{var match=/^(\d{1,2})[\W]+((\d{1,2})([\W]+(\d{1,4})?)?)?$/.exec(text);if(!match){return null;}
day=parseInt(match[1],10);var monthText=any(match[3],"");if(monthText!=""){month=parseInt(monthText,10);}
var yearText=any(match[5],"");if(exists(yearText)){year=parseInt(yearText,10);if(yearText.length<3){year=[year];}}}
return[day,month,year];}
function formatDate(date){return date.getDate().toString()+"."
+(date.getMonth()+1).toString()+"."
+date.getFullYear().toPaddedString(3);}
function setDate(date,tuple){var day=tuple[0];var month=tuple[1];var year=tuple[2];if(exists(year)){if(isArray(year)){year=Math.floor(date.getFullYear()/100)*100+year[0]}
date.setFullYear(year);}
if(exists(month)){date.setMonth(month-1);}
if(exists(day)){date.setDate(day);}}
function getDate(date){return[date.getDate(),date.getMonth()+1,date.getFullYear()];}
function __test__parseTime(){var results=[];iterate([["1",1,0],["12",12,0],["27",27,0],["123",1,23],["023",0,23],["1234",12,34],["0034",0,34],["1:",1,0],["12:",12,0],["3:4",3,4],["12:3",12,3],["02:3",2,3],["12:34",12,34],["00:34",0,34]],function(item){var result=parseTime(item[0]);if(result==null){if(item[1]!=null){results.push(format("{0}> {1}:{2} != null",[item[0],item[1],item[2]]));}}else{if(result[0]!=item[1]||result[1]!=item[2]){results.push(format("{0}> {1}:{2} != {3}:{4}",[item[0],item[1],item[2],result[0],result[1]]));}}});return results;}
function __test__parseDate(){var results=[];iterate([["2",2,null,null],["23",2,3,null],["231",23,1,null],["2310",23,10,null],["23104",23,10,[4]],["231045",23,10,[45]],["2310456",23,10,456],["23104567",23,10,4567],["23107",23,10,[7]],["231007",23,10,[7]],["2310007",23,10,7],["23100007",23,10,7],["30.",30,null,null],["2.10",2,10,null],["23.1",23,1,null],["23.10",23,10,null],["30.12.",30,12,null],["2.10.4",2,10,[4]],["23.1.4",23,1,[4]],["2.10.45",2,10,[45]],["23.1.45",23,1,[45]],["23.10.45",23,10,[45]],["2.10.4567",2,10,4567],["23.1.4567",23,1,4567],["23.10.4567",23,10,4567]],function(item){var result=parseDate(item[0]);if(result==null){if(item[1]!=null){results.push(format("{0}> {1}.{2}.{3} != null",[item[0],item[1],item[2],item[3]]));}}else{if(result[0]!=item[1]||result[1]!=item[2]||(result[2]!=item[3]&&(result[2]!=null&&item[3]!=null&&result[2][0]!=item[3][0]))){results.push(format("{0}> {1}.{2}.{3} != {4}.{5}.{6}",[item[0],item[1],item[2],item[3],result[0],result[1],result[2]]));}}});return results;}
function MimeType(name,classid,codebase,url){this.name=name;this.classid=classid;this.codebase=codebase;this.url=url;}
MimeType.QuickTime=new MimeType("image/x-quicktime","clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B","http://www.apple.com/qtactivex/qtplugin.cab","http://www.apple.com/quicktime/download/");MimeType.RealPlayer=new MimeType("audio/x-pn-realaudio-plugin","clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA",null,null);MimeType.Flash=new MimeType("application/x-shockwave-flash","clsid:D27CDB6E-AE6D-11cf-96B8-444553540000","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab","http://www.macromedia.com/go/getflashplayer");type("XElement",["List"],{observeClick:function(observer){return this.observeEvent("click",observer);},observeDblClick:function(observer){return this.observeEvent("dblclick",observer);},observeChange:function(observer){return this.observeEvent("change",observer);},observeMouseWheel:function(observer){},observeKeyPress:function(observer){return this.observeEvent("keypress",function(e){var key=e.keyCode||e.which;return observer(key);});},observeEvent:function(eventName,observer){var self=this;return obtain(obtain(this,"eventObservers",construct(Object)),eventName,function(){var observers=commands();self.dom["on"+eventName]=function(e){if(window.event){e=window.event;}
return observers(e);}
return observers;}).attach(observer);},observeEventEx:function(eventName,observer){return Dom.Event.observe(this.dom,eventName,observer);},dispatchEvent:function(eventName){return Dom.Event.dispatch(this.dom,eventName);},getters:{},setters:{},getAttribute:function(name){var getter=this.getters[name];return exists(getter)?getter.call(this):Dom.get(this.dom,name);},setAttribute:function(name,value){var setter=this.setters[name];if(exists(setter)){return setter.call(this,value);}
Dom.set(this.dom,name,value);return this;},attribute:function(values){var self=this;enumerate(values,function(value,name){if(name.charAt(0)=="$"){var key=name.substr(1);if(isFunction(self[key])){self[key](value);}else{self[key]=value;}}else{self.setAttribute(name,value);}});return this;},styleGetters:{},styleSetters:{},getStyle:function(key){var getter=this.styleGetters[key];return exists(getter)?getter(this.dom):Dom.Style.get(this.dom,name);},setStyle:function(key,value){var setter=this.styleSetters[key];if(exists(setter)){var self=this;enumerate(setter(value),function(v,k){Dom.Style.set(self.dom,k,v);});}else{Dom.Style.set(this.dom,key,value);}
return this;},style:function(values){var self=this;enumerate(values,function(value,key){self.setStyle(key,value);});return this;},accessor:function(name){var self=this;return new Accessor(function(){return self.getAttribute(name);},function(value){return self.setAttribute(name,value);});},styleAccessor:function(key){var self=this;return new Accessor(function(){return self.getStyle(key);},function(value){return self.setStyle(key,value);});},getContent:function(){return Dom.Content.get(this.dom);},addContent:function(value){schedule(this.itemsUpdated);return Dom.Content.add(this.dom,value);},setContent:function(value){schedule(this.itemsUpdated);return Dom.Content.set(this.dom,value);},getTag:function(){return this.dom.tagName.toLowerCase();},inTree:function(){return exists(this.dom.offsetParent());},getParent:function(){return $E(this.dom.parentNode);},detach:function(){var parent=this.getParent();if(exists(parent)){parent.remove(this);}},destroy:function(){delete this.dom.$element;delete this.dom;},each:function(iterator){return Dom.List.each(this.dom,function(item,index){return iterator($E(item),index);});},length:function(){return Dom.List.length(this.dom);},item:function(index){return $E(Dom.List.item(this.dom,index));},append:function(item){schedule(this.itemsUpdated);return Dom.List.append(this.dom,item);},insert:function(item,index){schedule(this.itemsUpdated);return Dom.List.insert(this.dom,item,index);},remove:function(item){schedule(this.itemsUpdated);return Dom.List.remove(this.dom,item)},removeAt:function(index){schedule(this.itemsUpdated);return Dom.List.removeAt(this.dom,index)},move:function(source,destination){schedule(this.itemsUpdated);return Dom.List.move(this.dom,source,destination);},clear:function(){schedule(this.itemsUpdated);return Dom.List.clear(this.dom);}},function(source,attributes){var self=this;self.itemsUpdated=commands();if(isString(source)){source=document.createElement(source);}else if(isArray(source)){source=Dom.createElementNS(document,source[0],source[1]);}
self.dom=source;try{source.$element=self;}catch(e){}
XElement.elements.push(self);self.length=new Getter(curry(XElement.getLength,self));if(exists(attributes)){self.attribute(attributes);}
iterate(arguments,function(item){self.addContent(item);},2);});XElement.prototype.setters.style=XElement.prototype.style;XElement.getLength=function(element){return Dom.List.length(element.dom);};XElement.elements=[];XElement.cleanNow=function(){var elements=[];var body=document.body;var html=body.parentNode;iterate(XElement.elements,function(item){if(item.dom&&item.dom.offsetParent||item===body||item===html){elements.push(item);}else{item.destroy();}});XElement.elements=elements;};XElement.clean=function(){schedule(XElement.cleanNow);};function $E(source){if(isString(source)){source=document.getElementById(source);}
if(!exists(source)){return source;}
var element=source.$element;if(exists(element)){return element;}
return new Html(source);}
type("Html",["XElement","WatchAccessor","CanGet"],{isField:function(){return exists(Html.isCheckField(this.dom));},isCheckField:function(){return Html.isCheckField(this.dom);},getters:merge(XElement.prototype.getters),setters:merge(XElement.prototype.setters),styleGetters:merge(XElement.prototype.styleGetters),styleSetters:merge(XElement.prototype.styleSetters),getStyleBase:XElement.prototype.getStyle,getStyle:function(key){var value=this.getStyleBase(key);return value=="auto"?null:value;},get:function(){var checkField=Html.isCheckField(this.dom);if(!exists(checkField)){return Dom.Content.get(this.dom);}else if(checkField){return this.dom.checked;}else{return this.dom.value;}},set:function(value){var checkField=Html.isCheckField(this.dom);if(!exists(checkField)){return Dom.Content.set(this.dom,$A(arguments));}else if(checkField){var checked=this.dom.checked;if(checked==!value){this.dom.checked=!checked;if(exists(this.observers)){this.observers(!checked);}}}else{this.dom.value=str(value);}},observe:function(observer){var checkField=Html.isCheckField(this.dom);if(!exists(checkField)){return;}else{var self=this;var notify=function(evt){observer(self.get());}
if(!exists(this.observers)){this.observers=commands();var notify=function(evt){self.observers(self.get());}
if(checkField){this.observeClick(notify);}else{this.observeChange(notify);}}
return this.observers.attach(observer);}},invokeObserver:function(observer){return observer(this.get());},notifyObservers:function(){if(this.observers){this.invokeObserver(this.observers);}},canGet:function(){return this.isField();}},Browser.IE?function(source,attributes){if(isString(source)){if(!empty(attributes.name)){source='<'+source+' name="'+attributes.name+'">';delete attributes.name;}}
this.XElement(source,attributes,$A(arguments,2));}:function(source,attributes){this.XElement(source,attributes,$A(arguments,2));});extend(Html,{toDimensions:function(value){return isNumber(value)?Math.round(value)+"px":value;},isCheckField:function(dom){switch(dom.tagName.toLowerCase()){case"input":switch(dom.type.toLowerCase()){case"checkbox":case"radio":return true;default:return false;}
case"select":case"textarea":return false;default:return null;}},makeAttributes:function(source,other){var attribs;if(exists(source)){attribs=isString(source)?{className:source}:source;if(exists(other)){extend(attribs,other);}}else{attribs=exists(other)?other:{};}
for(key in attribs){if(attribs[key]===undefined){delete attribs[key];}}
return attribs;},h:function(level,content,attributes){return new Html("h"+level,Html.makeAttributes(attributes),content);},input:function(type,attributes,value){return new Html("input",Html.makeAttributes(attributes,{type:type,value:value}));},edit:function(attributes,value){return new Html("input",Html.makeAttributes(attributes,{type:"text",value:value}));},checkbox:function(attributes,checked){if(Browser.IE){var checkedText=checked?" checked":"";return new Html("<input type=\"checkbox\""+checkedText+">",attributes);}else{var elem=new Html("input",Html.makeAttributes(attributes,{type:"checkbox"}));elem.set(checked);return elem;}},radio:function(attributes,checked){return new Html("input",Html.makeAttributes(attributes,{type:"radio",checked:checked}));},email:function(attributes){return new Html("input",Html.makeAttributes(attributes,{type:"text",vcard_name:"vCard.Email"}));},password:function(attributes){return new Html("input",Html.makeAttributes(attributes,{type:"password",autocomplete:"on"}));},hidden:function(attributes){return new Html("div",Html.makeAttributes(attributes)).style({display:"none"});}});iterate(["a","div","span","p","ul","ol","li","table","caption","thead","tfoot","tbody","tr","th","td","strong","em","emp","pre","small","h1","h2","h3","h4","h5","h6","form","button","label","textarea","img","select","option","optgroup","object","param","embed","iframe","br"],function(tag){Html[tag]=function(attributes){return new Html(tag,Html.makeAttributes(attributes),$A(arguments,1));};});Html.prototype.getters.enctype=function(){return this.dom.enctype;};Html.prototype.setters.enctype=function(value){this.dom.enctype=value;if("encoding"in this.dom){this.dom.encoding=value;}
return this.dom;};iterate(["className","htmlFor"],function(name){Html.prototype.getters[name]=function(){return this.dom[name];};Html.prototype.setters[name]=function(value){this.dom[name]=value;};});delayedBind(Html.prototype.styleGetters,"opacity",function(dom){return Dom.Style.get(dom,"opacity")===undefined?function(dom){var filter=dom.filters["opacity"];return exists(filter)?(filter.opacity/100):1;}:function(dom){var value=Dom.Style.get(dom,"opacity");return exists(value)?parseFloat(value):1;}});delayedBind(Html.prototype.styleSetters,"opacity",function(){return Browser.IE?function(value){return objectize("filter",(value==1||value==="")?"":("progid:DXImageTransform.Microsoft.Alpha(opacity="+Math.round(((value<0.00001)?0:value)*100)+")"));}:function(value){return objectize("opacity",(value==1||value==="")?"":(value<0.00001)?0:value);}});delayedBind(Html.prototype.styleGetters,"cssFloat",function(dom){return Dom.Style.get(dom,"cssFloat")===undefined?function(dom){return Dom.Style.get(dom,"styleFloat");}:function(dom){return Dom.Style.get(dom,"cssFloat");}});delayedBind(Html.prototype.styleSetters,"cssFloat",function(){return Browser.IE?function(value){return objectize("styleFloat",Html.toDimensions(value));}:function(value){return objectize("cssFloat",Html.toDimensions(value));}});iterate(["left","right","top","bottom","width","height","borderWidth","padding","paddingTop","paddingRight","paddingBottom","paddingLeft","margin","marginTop","marginRight","marginBottom","marginLeft","border","borderTop","borderRight","borderBottom","borderLeft","lineHeight"],function(key){Html.prototype.styleSetters[key]=function(value){return objectize(key,Html.toDimensions(value));};});iterate(["margin","padding","border"],function(name){iterate(["Top","Right","Bottom","Left"],function(dir){var key=name+dir;Html.prototype.styleSetters[key]=function(value){return objectize(key,Html.toDimensions(value));};});Html.prototype.styleSetters[name]=function(value){if(isObject(value)){var obj={};iterate(["Top","Right","Bottom","Left"],function(dir){var key=dir.toLowerCase();if(key in value){obj[name+dir]=value[key];}});return obj;}else{return objectize(name,Html.toDimensions(value));}};});iterate(["selected","disabled"],function(name){Html.prototype.getters[name]=function(){return exists(Dom.get(this.dom,name));};Html.prototype.setters[name]=function(value){return Dom.set(this.dom,name,value?name:null);};});Html.generateId=function(){return"_GID"+Html.generateId.current++;};Html.generateId.current=1;Html.addScript=function(path){var script=document.createElement("script");script.src=path;script.type="text/javascript";document.getElementsByTagName("head")[0].appendChild(script);};Html.Target={New:"_blank"};function getDom(object){if(!exists(object)){return Html.hidden().dom;}
if(isDom(object)){return object;}
if(object.XElement){return object.dom;}
return document.createTextNode(str(object));}
var Dom={Event:{observe:function(dom,eventName,observer){if(dom.addEventListener){dom.addEventListener(eventName,observer,false);return function(){dom.removeEventListener(eventName,observer,false);};}else{eventName="on"+eventName;dom.attachEvent(eventName,observer);return function(){dom.detachEvent(eventName,observer);};}},observeOnce:function(dom,eventName,observer){var stop;var method=function(evt){stop();observer(evt);};stop=Dom.observe(dom,eventName,method);return stop;},dispatch:function(dom,eventName){var event;if(document.createEvent){event=document.createEvent("HTMLEvents");event.initEvent(eventName,true,true);dom.dispatchEvent(event);}else{event=document.createEventObject();dom.fireEvent("on"+eventName,event);}
return event;}},List:{each:function(dom,iterator){return iterate(dom.childNodes,iterator);},length:function(dom){return dom.childNodes.length;},item:function(dom,index){return dom.childNodes[index];},append:function(dom,item){dom.appendChild(getDom(item));return dom.childNodes.length-1;},insert:function(dom,item,index){if(!exists(index)){index=0;}
var items=dom.childNodes;if(index<items.length){dom.insertBefore(getDom(item),items[index]);return index;}
while(index-->items.length){Dom.List.append(dom,null);}
return Dom.List.append(dom,item);},remove:function(dom,item){try{dom.removeChild(getDom(item));return Number.MAX_VALUE;}catch(e){return-1;}},removeAt:function(dom,index){var items=dom.childNodes;if(index>=items.length){return null;}
return dom.removeChild(items[index]);},clear:function(dom){var items=[];var item;while((item=dom.firstChild)){items.push(dom.removeChild(item));}
return items;}},Content:{get:function(dom){return any(dom.textContent,dom.innerText);},add:function(dom,value){if(!exists(value)){return 0;}
if(!isDom(value)){if(value.XElement){value=value.dom;}else{if(isArray(value)||value.Enumerable){var number=0;each(value,function(item){number+=Dom.Content.add(dom,item);});return number;}else{value=document.createTextNode(str(value));}}}
dom.appendChild(value);return 1;},set:function(dom){var old=Dom.List.clear(dom);iterate(arguments,function(value){if(exists(value)){Dom.Content.add(dom,value);}},1);return old;}},Style:{},getHead:function(){return obtain(Dom,"$head",function(){return document.getElementsByTagName("head")[0];});}};delayedBind(Dom,"createElementNS",function(){return document.createElementNS?function(document,uri,name){return document.createElementNS(uri,name);}:function(document,uri,name){var namespace=name.split(":",2)[0];if(!includes(document.namespaces,function(item){return item.name==namespace&&item.urn==uri;})){document.namespaces.add(namespace,uri);}
return document.createElement(name);};});Dom.get=function(dom,name){return dom[name];};delayedBind(Dom,"set",function(dom){return dom.setAttributeNS?function(dom,name,value){if(exists(value)){dom.setAttributeNS(null,name,value);}else{dom.removeAttributeNS(null,name);}
return dom;}:function(dom,name,value){dom[name]=value;return dom;};});delayedBind(Dom.Style,"get",function(document){return document.defaultView?function(dom,key){var value=dom.style[key];if(!exists(value)){var css=document.defaultView.getComputedStyle(dom,null);if(exists(css)){value=css[key];}}
return value;}:function(dom,key){return dom.style[key];};});Dom.Style.set=function(dom,key,value){if(exists(value)){dom.style[key]=value;}else{dom.style[key]="";}
return dom;}
var Style={getRaw:function(dom,key){var value=dom.style[key];if(!exists(value)&&exists(document.defaultView)){var css=document.defaultView.getComputedStyle(dom,null);if(exists(css)){value=css[key];}}
return value;},get:function(dom,key){var getter=Style.getters[key];if(exists(getter)){return getter(dom);}else{var value=Style.getRaw(dom,key);return value=="auto"?null:value;}},set:function(dom,key,value){var setter=Style.setters[key];if(exists(setter)){return setter(dom,value);}else{if(exists(value)){dom.style[key]=value;}else{dom.style[key]="";}
return dom;}},getValues:function(dom,keys){var values={};if(exists(keys)){iterate(keys,function(key){values[key]=Style.get(dom,key);});}else{var currentStyle=exists(dom.currentStyle)?dom.currentStyle:dom.style;enumerate(currentStyle,function(value,key){if(exists(value)&&!isFunction(value)){values[key]=Style.get(dom,key);}});}
return values;},setValues:function(dom,values){enumerate(values,function(value,key){Style.set(dom,key,value);});return dom;},getOpacity:function(dom){var value=dom.style.opacity;return exists(value)?parseFloat(value):1.0;},setOpacity:function(dom,value){dom.style.opacity=(value==1||value==='')?'':(value<0.00001)?0:value;return dom;},getFloat:function(dom){var style=dom.style;return(style.cssFloat===undefined)?style.styleFloat:style.cssFloat;},setFloat:function(dom,value){var style=dom.style;if(style.cssFloat===undefined){style.styleFloat=value;}else{style.cssFloat=value;}
return dom;}};Style.getters={};Style.setters={};enumerate({"opacity":"Opacity","float":"Float","styleFloat":"Float","cssFloat":"Float"},function(value,key){Style.getters[key]=Style["get"+value];Style.setters[key]=Style["set"+value];});extend(Html.prototype,{lookupField:function(){if(this.isField()){return this;}
return lookup(this,function(item){return item.lookupField();});}});internal(function(){function computeX(style){if(style.left<0){if(style.right<0){style.display="none";}else{style.width=-(style.left+style.right);style.left=null;}}else if(style.right<0){style.width=-(style.left+style.right);style.right=null;}}
function computeY(style){if(style.top<0){if(style.bottom<0){style.display="none";}else{style.height=-(style.top+style.bottom);style.top=null;}}else if(style.bottom<0){style.height=-(style.top+style.bottom);style.bottom=null;}}
function boolToScrolling(arg){return exists(arg)?arg?"auto":"hidden":null;}
extend(Html.prototype,{wrap:function(arg){return this.style({whiteSpace:exists(arg)?arg?"normal":"nowrap":null});},scrolling:function(){var style={};switch(arguments.length){case 0:style.overflow=null;break;case 1:style.overflow=boolToScrolling(arguments[0]);break;case 2:style.overflowX=boolToScrolling(arguments[0]);style.overflowY=boolToScrolling(arguments[1]);break;}
return this.style(style);},locateX:function(left,right){var style={left:left,right:right,width:null,position:"absolute"};computeX(style);return this.style(style);},locateY:function(top,bottom){var style={top:top,bottom:bottom,height:null,position:"absolute"};computeY(style);return this.style(style);},locate:function(top,left,bottom,right){var style={left:left,right:right,width:null,top:top,bottom:bottom,height:null,position:"absolute"};computeX(style);computeY(style);return this.style(style);},messageBox:function(width,height){return this.style({left:"50%",top:"40%",marginLeft:-width/2,marginTop:-height/2,width:width,height:height,display:"block",position:"fixed"});},fixedBox:function(top,left,bottom,right){var style={left:left,right:right,width:null,top:top,bottom:bottom,height:null,display:"block",position:"fixed"};computeX(style);computeY(style);return this.style(style);}})});extend(Html.prototype,{isBody:function(){return document.body===this.dom;},layout:function(layout){var self=this;invoke(self.removeLayout);if(isString(layout)){layout=Layout[layout];}
if(exists(layout)){var layoutElement=function(){schedule(function(){layout(self);});};self.removeLayout=self.itemsUpdated.attach(layoutElement);layoutElement();}
return self;},getOffsetParent:function(){return $E(this.getAttribute("offsetParent"));}});delayedBind(Html.prototype,"getAbsolutePosition",function(dom){return(this.dom.getBoundingClientRect&&!Browser.WebKit)?function(){var bound=this.dom.getBoundingClientRect();var html=document.documentElement;return new Point(Math.round(bound.left+html.scrollLeft-html.clientLeft),Math.round(bound.top+html.scrollTop-html.clientTop));}:function(){var position=new Point();var element=this;while(exists(element)&&!element.isBody()){position.move(new Point(element.getAttribute("offsetLeft"),element.getAttribute("offsetTop")));element=element.getOffsetParent();}
return position;}});var Layout={row:function(){var args=$A(arguments);return function(element){var prev=0;element.each(function(item,index){var pos=args[index];if(!exists(prev)){item.close();}else if(exists(pos)){item.locate(0,prev,0,-pos);}else{item.locate(0,prev,0,0);}
prev=pos;});}},rows:function(height,spacing){return function(element){var totalHeight=spacing;element.each(function(item){item.style({position:"absolute",display:"block",left:0,right:0,margin:0,padding:0,border:"0",width:null,top:totalHeight,height:height});totalHeight+=height+spacing;});element.style({height:totalHeight,display:"block",position:"relative"});};}}
var dictionaries={};function loadDictionary(language){include(languageDictionaryPath+language+".js");}
var defaultLanguage="en_US";var languageDictionaryPath=isDefined("TextRoot")?TextRoot:"texts";;loadDictionary(defaultLanguage);function getTemplate(key,language){if(exists(language)){var dictionary=dictionaries[language];if(exists(dictionary)){var template=dictionary[key];if(exists(template)){if(!isFunction(template)){template=textTemplate(template);dictionary[key]=template;}}
return template;}else{return null;}}else{return getTemplate(key,defaultLanguage);}}
var currentLanguage=null;function $T(key){var template=getTemplate(key,currentLanguage);if(exists(template)){return template($A(arguments,1));}else{return key;}}
extend(XElement.prototype,{visible:function(){var self=this;return new Accessor(function(){return self.getStyle("display")!="none";},function(value){return self.setStyle("display",value?null:"none");});},scroll:function(height,width){var style={overflow:"auto",height:height}
if(exists(width)){style.width=width;}
return this.setStyle(style);}});var Widget={view:function(properties){var context=new WidgetContext()
if(this instanceof WidgetContext){extend(context,this);context.parent=this;}
if(exists(properties)){extend(context,properties);}
var view=$V();mixinInstance(context,view,WatchGetter);context.navigate=function(target){context.render(view,target);return context;};return context;},navigator:function(target){return curry(this.navigate,target);},getTarget:function(target){throw new Exception("Cannot lookup target.",{target:target});},template:function(target,properties){var $=this;return function(item){var data={};if(exists(properties)){extend(data,properties);}
var view;if(exists(item)&&item.WatchGetter){if("key"in item){data.key=item.key;}
data.value=item.get();item.observe(function(value){view.value=value;view.navigate(target);});}else{data.value=item;}
view=$.view(target,data)
return view;};},presenter:function(source,target,properties){return this.template(target,properties)(source);},repeater:function(source,target,properties){return $L(source,this.template(target,properties));}};function WidgetContext(value){return(value===window)?new WidgetContext():value;}
WidgetContext.prototype=Widget;function WidgetBuilder(method,attributes){var builder=function(source,attribs){var args=$A(arguments);if(args.length>=2){args[1]=merge(args[1],attributes);}
return method.apply(this,args);};builder.customize=function(attribs){return WidgetBuilder(method,merge(attributes,attribs));};extend(builder,WidgetBuilder);return builder;}
function WidgetDocument(view,context,loaded){var hiddenElementCounter=0;var hiddenElements=new WatchObject();var overlayElements=new WatchList();WidgetDocument.attachHidden=function(element){var key=++hiddenElementCounter;hiddenElements.set(key,element);return function(){hiddenElements.set(key,null);};};WidgetDocument.setOverlay=function(elements){$B(overlayElements,elements);};window.onload=function(){invoke(loaded);var overlayContainer=Widget.block(overlayElements).fixedBox(0,0,0,0);$B(overlayContainer.styleAccessor("display"),overlayElements.length,function(value){return value==0?"none":"block";});$B($E(window.document.body),[Widget.block($L(hiddenElements,function(value){return value.get();})),Widget.block(Widget.view(view,context)),overlayContainer])};}
function WidgetPage(name,render){WidgetPage.pages[WidgetPage.getKey(name)]=function(context){context.page=name;return render(context);};};WidgetPage.pages={};WidgetPage.getKey=function(name){return"/"+name.join("/");};Widget.render=function(target,name){if(exists(this.parent)){name=concat(this.parent.page,name);}
target.set(WidgetPage.pages[WidgetPage.getKey(name)](this));return target;};function StyledItem(attributes,content){this.attributes=attributes;this.content=content;}
Widget.t=function(id){return id;};Widget.option=function(item){var option=Html.option();if(item.WatchPair){$B(option,item);$B(option.accessor("value"),item.key);$B(option.accessor("selected"),item.selected);$B(option.accessor("disabled"),item.disabled);}else{option.setAttribute("value",item);option.set(item);}
return option;};Widget.clickable=function(command,target){invoke(target.stopClickable);target.stopClickable=target.observeClick(function(event){command(event);return false;});if(target.getTag()=="a"){target.setAttribute("href","#");}
return command.caption;};Widget.image=function(url,text){return Html.img({alt:text,src:url});};Widget.object=function(type,params,width,height){if(Browser.IE){return Html.object({classid:type.classid,codebase:type.codebase,width:width,height:height},$A(params,0,function(value,key){return Html.param({name:key,value:value});}));}else{return Html.object({type:type.name,data:params.src,width:width,height:height},Html.param({name:"pluginurl",value:type.url}),$A(params,0,function(value,key){return Html.param({name:key,value:value});}));}};Widget.labelled=function(target,caption){var $=WidgetContext(this);var label=$.label(caption);target.setAttribute("id",label.getAttribute("htmlFor"));return[label,target];};Widget.label=function(caption){var $=WidgetContext(this);caption=$.getCaption(caption);caption.attributes.htmlFor=Html.generateId();return Html.label(caption.attributes,caption.content);};Widget.getCaption=function(caption){if(caption instanceof StyledItem){return caption;}
var text=str(caption);var parts=text.split("_",2);if(parts.length<2){return new StyledItem({},parts.join(""));}
if(parts[1]==""){return new StyledItem({},parts[0]);}
var accessKey=parts[1].slice(0,1);var nextPart=parts[1].slice(1);if(parts[0]==""){return new StyledItem({accessKey:accessKey.toLowerCase()},[Html.span("access-key",accessKey),nextPart]);}
return new StyledItem({accessKey:accessKey.toLowerCase()},[parts[0],Html.span("access-key",accessKey),nextPart]);};function WidgetControl(panelBuilder,itemTemplate,attributes){var controlBuilder=function(source){return bind.element(panelBuilder(attributes),source,itemTemplate);};controlBuilder.customize=function(attribs){return WidgetControl(panelBuilder,itemTemplate,merge(attributes,attribs));};extend(controlBuilder,WidgetBuilder);return controlBuilder;};Widget.link=WidgetControl(Html.a,Widget.clickable);Widget.button=WidgetControl(Html.button,Widget.clickable);Widget.text=WidgetControl(Html.span);Widget.inline=WidgetControl(Html.span,Widget.text);Widget.line=WidgetControl(Html.p);Widget.inlineBlock=WidgetControl(function(){return Html.span({display:"inline-block"});});Widget.block=WidgetControl(Html.div);Widget.wrap=WidgetControl(Html.p,Widget.text);Widget.lines=WidgetControl(Html.div,Widget.line);Widget.stack=WidgetControl(Html.div,Widget.block);Widget.listItem=WidgetControl(Html.li);Widget.unordered=WidgetControl(Html.ul,Widget.listItem);Widget.ordered=WidgetControl(Html.ol,Widget.listItem);Widget.select=WidgetControl(Html.select,Widget.option);Widget.list=Widget.unordered;Widget.header6=WidgetControl(Html.h6);Widget.header6.next=Widget.header6;times(5,function(index){var number=5-index;Widget["header"+number]=extend(WidgetControl(Html["h"+number]),{next:Widget["header"+(number+1)]});});Widget.header=Widget.header1;Widget.strong=WidgetControl(Html.strong);Widget.em=WidgetControl(Html.em);Widget.small=WidgetControl(Html.small);Widget.pre=WidgetControl(Html.pre);Widget.hidden=WidgetControl(Html.hidden);function WidgetEditor(target,template){return function(source){var element=isFunction(target)?target():target;var templator;if(!exists(template)){templator=template;}else if(isFunction(template)){templator=function(value){return template(value,source);};}else{templator={toTarget:function(value){return template.toTarget(value,source);},toSource:function(value){return template.toSource(value,source);}};}
return bind.accessor(element,source,templator);};};Widget.timeTemplate={toTarget:formatTime,toSource:function(value,source){var time=copyDate(source.get());setTime(time,parseTime(value));return time;}};Widget.dateTemplate={toTarget:formatDate,toSource:function(value,source){var date=copyDate(source.get());setDate(date,parseDate(value));return date;}};Widget.textEditor=WidgetEditor(Html.edit);Widget.timeEditor=WidgetEditor(Html.edit,Widget.timeTemplate);Widget.dateEditor=WidgetEditor(Html.edit,Widget.dateTemplate);Widget.multiLineEditor=WidgetEditor(Html.textarea);function WidgetTable(rows,headers,footers){if(headers){headers.isHeader=true;rows.head=$L([headers]);}
if(footers){rows.foot=$L([footers]);}
return Html.table(rows.tableAttributes,WidgetTable.rows(Html.thead(rows.headAttributes),rows.head),WidgetTable.rows(Html.tfoot(rows.footAttributes),rows.foot),WidgetTable.rows(Html.tbody(rows.bodyAttributes),any(rows.body,rows)));}
WidgetTable.cell=function(item,target,isHeader){constructor=isHeader?Html.th:Html.td;if(exists(item)){if(item.XElement){switch(item.getTag()){case"td":case"th":return item;default:return $B(constructor(),item);}}}else{return constructor();}};WidgetTable.headerCell=function(item,target){return WidgetTable.cell(item,target,true);};WidgetTable.row=function(row){var $=WidgetContext(this);if(row.XElement&&row.getTag()=="tr"){return row;}else{var template=row.isHeader?WidgetTable.headerCell:WidgetTable.cell;return $B(Html.tr(row.rowAttributes),any(row.cells,row),template);}};WidgetTable.rows=function(root,rows){if(rows){return $B(root,rows,WidgetTable.row);}};Widget.table=WidgetTable;function Field(name,caption,editor){this.name=name;this.caption=caption;this.editor=editor;};Widget.field=function(source,caption,editor){var $=WidgetContext(this);editor=any(editor,$.textEditor);return $.labelled(editor(source),caption)};Widget.form=function(source,style){var $=WidgetContext(this);return $.block([$.table($L(style.fields,function(field){return $.field(source[field.name],field.caption,field.editor);})),$.button(command(style.save,$.t("Save"))),$.button(command(style.cancel,$.t("Cancel")))]);};Widget.editableContainer=Widget.text;type("WidgetEditableContext",["Switch"],{},function(){this.Switch("view","edit",["save","view"]);this.view();});function WidgetEditable(view,edit){return function(source,context){var $=WidgetContext(this);if(!exists(context)){context=new WidgetEditableContext();}
var target=$.editableContainer();var stopView=null;var editor=null;var field={view:function(origin){if(exists(editor)){invoke(editor.stop);}
stopView=view(target,source,function(){context.edit();editor.activate();});},edit:function(origin){invoke(stopView);editor=edit(target,source);},save:function(origin){if(exists(editor)){invoke(editor.save);}}};var observer=objectInvoker(field);context.observe(observer);context.invokeObserver(observer);return target;};}
WidgetEditable.getTemplatedTextView=function(template){return function(target,source,edit){$B(target,source,template);return function(){bind.detach(target);};};};WidgetEditable.textView=WidgetEditable.getTemplatedTextView(null);WidgetEditable.getSelectViewTemplate=function(items){if(isArrayOrListable(items)){return null;}
return splitter(items);}
WidgetEditable.getClickableView=function(view){return function(target,source,edit){return sequence(target.observeClick(edit),view(target,source));};};WidgetEditable.textViewClickable=WidgetEditable.getClickableView(WidgetEditable.textView);WidgetEditable.getFieldEditor=function(fieldBuilder){return function(target,source){var field=fieldBuilder();var accessor=getAccessorDeep(source);field.set(accessor.get());$B(target,field);return{activate:function(){if(exists(field.dom.select)){field.dom.select();}else{field.dom.focus();}},save:function(){accessor.set(field.get());},stop:function(){bind.detach(target);}};};};WidgetEditable.textEdit=WidgetEditable.getFieldEditor(Html.edit);WidgetEditable.getSelectEdit=function(items){return WidgetEditable.getFieldEditor(function(){return Widget.select(items);});};Widget.textEditable=WidgetEditable(WidgetEditable.textView,WidgetEditable.textEdit);Widget.textEditableClickable=WidgetEditable(WidgetEditable.textViewClickable,WidgetEditable.textEdit);Widget.selectEditable=function(items,source,context){return WidgetEditable(WidgetEditable.getTemplatedTextView(WidgetEditable.getSelectViewTemplate(items)),WidgetEditable.getSelectEdit(items))(source,context);};Widget.selectEditableClickable=function(items,source,context){return WidgetEditable(WidgetEditable.getClickableView(WidgetEditable.getTemplatedTextView(WidgetEditable.getSelectViewTemplate(items))),WidgetEditable.getSelectEdit(items))(source,context);};Widget.menu=function(commands){return Widget.list($L(commands,Widget.link));};function Column(name,caption,editable){this.name=name;this.caption=caption;this.editable=editable;}
Widget.grid=function(source,style){var $=WidgetContext(this);var activeContext=null;function activateContext(context){if(activeContext==context){return;}
if(exists(activeContext)&&activeContext.get()=="edit"){activeContext.save();}
activeContext=context;}
var headRow=Html.tr({},Html.th());bind.listEx(headRow,style.columns,function(column,target){return[$B(Html.th(),column.caption)];},1);var head=$B(Html.thead(),headRow);var body=bind.listEx(Html.tbody(),$L(source),function(item,target){var context=new WidgetEditableContext();var row=Html.tr();row.set($B(Html.th({rowSpan:2}),item.key));bind.listEx(row,style.columns,function(column){var content=$V(item.value,column.name);if(exists(column.editable)){content=column.editable.call($,content,context);}
return[$B(Html.td(),content)];},1);var toolsCell=Html.td();var toolsRow=$B(Html.tr(),toolsCell);$B(toolsCell.accessor("colSpan"),style.columns.length);context.observe(objectInvoker({view:function(){toolsCell.clear();},edit:function(){activateContext(context);toolsCell.set(Widget.button(command(context.save,"Save")),Widget.button(command(context.view,"Cancel")),Widget.button(command(function(){source.set(item.key.get(),null);},"Delete")));}}));return[row,toolsRow];},0,2);return $B(Html.table(),[head,body]);};extend(Html.prototype,{visible:function(){var self=this;return new Accessor(function(){return self.style("display")!="none";},function(value){return self.style("display",value?null:"none");});},scroll:function(height,width){var style={overflow:"auto",height:height}
if(exists(width)){style.width=width;}
return this.style(style);},show:function(){return this.style({display:null,visibility:"visible"});},hide:function(){return this.style({display:null,visibility:"hidden"});},disable:function(){return this.setAttribute("disabled","disabled");},enable:function(){return this.setAttribute("disabled",null);},collapse:function(){return this.style({display:null,visibility:"hidden"});},hide:function(){return this.style({display:null,visibility:"hidden"});}});iterate(["padding","margin","border"],function(name){Html.prototype[name]=function(){var style={};switch(arguments.length){case 1:style[name]=arguments[0];break;case 2:style[name+"Top"]=arguments[0];style[name+"Right"]=arguments[1];style[name+"Bottom"]=arguments[0];style[name+"Left"]=arguments[1];break;case 4:style[name+"Top"]=arguments[0];style[name+"Right"]=arguments[1];style[name+"Bottom"]=arguments[2];style[name+"Left"]=arguments[3];break;}
return this.style(style);};});enumerate({relative:{set:{position:"relative"}},inline:{set:{display:"inline"}},block:{set:{display:"block"}},opacity:{args:["opacity"]},size:{args:["width","height","padding","margin","border"]},floating:{args:["cssFloat","width","height"],set:{position:"relative"}},fill:{args:["padding","margin","border"],set:{position:"absolute",width:"100%",height:"100%"}},place:{args:["top","left","bottom","right","padding","margin","border"],set:{position:"absolute"}},topLeft:{args:["left","top","width","height","padding","margin","border"],set:{position:"absolute",bottom:null,right:null}},topRight:{args:["right","top","width","height","padding","margin","border"],set:{position:"absolute",bottom:null,left:null}},bottomLeft:{args:["left","bottom","width","height","padding","margin","border"],set:{position:"absolute",top:null,right:null}},bottomRight:{args:["right","bottom","width","height","padding","margin","border"],set:{position:"absolute",top:null,left:null}},border:{args:["borderWidth","borderStyle","borderColor"]},color:{args:["color"]},background:{args:["background"]},lineHeight:{args:["lineHeight"]},textAlign:{args:["textAlign","verticalAlign"]},verticalAlign:{args:["verticalAlign"]}},function(def,name){Html.prototype[name]=function(){var style=getObject(def.set);iterate(arguments,function(arg,index){style[def.args[index]]=arg;});invoke(def.compute,style);return this.style(style);};});
