diff options
Diffstat (limited to 'framework/Web/Javascripts/js/datepicker.js')
-rw-r--r-- | framework/Web/Javascripts/js/datepicker.js | 492 |
1 files changed, 236 insertions, 256 deletions
diff --git a/framework/Web/Javascripts/js/datepicker.js b/framework/Web/Javascripts/js/datepicker.js index b57da791..d4ba0d2c 100644 --- a/framework/Web/Javascripts/js/datepicker.js +++ b/framework/Web/Javascripts/js/datepicker.js @@ -1,103 +1,55 @@ -Prado.Calendar=Class.create(); -Prado.Calendar.Util=Class.create(); -Object.extend(Prado.Calendar.Util,{IsLeapYear:function(_1){ -return ((_1%4==0)&&((_1%100!=0)||(_1%400==0))); -},yearLength:function(_2){ -if(this.isLeapYear(_2)){ -return 366; -}else{ -return 365; -} -},dayOfYear:function(_3){ -var a=this.isLeapYear(_3.getFullYear())?Calendar.LEAP_NUM_DAYS:Calendar.NUM_DAYS; -return a[_3.getMonth()]+_3.getDate(); -},browser:function(){ -var _5={Version:"1.0"}; -var _6=parseInt(navigator.appVersion); -_5.nver=_6; -_5.ver=navigator.appVersion; -_5.agent=navigator.userAgent; -_5.dom=document.getElementById?1:0; -_5.opera=window.opera?1:0; -_5.ie5=(_5.ver.indexOf("MSIE 5")>-1&&_5.dom&&!_5.opera)?1:0; -_5.ie6=(_5.ver.indexOf("MSIE 6")>-1&&_5.dom&&!_5.opera)?1:0; -_5.ie4=(document.all&&!_5.dom&&!_5.opera)?1:0; -_5.ie=_5.ie4||_5.ie5||_5.ie6; -_5.mac=_5.agent.indexOf("Mac")>-1; -_5.ns6=(_5.dom&&parseInt(_5.ver)>=5)?1:0; -_5.ie3=(_5.ver.indexOf("MSIE")&&(_6<4)); -_5.hotjava=(_5.agent.toLowerCase().indexOf("hotjava")!=-1)?1:0; -_5.ns4=(document.layers&&!_5.dom&&!_5.hotjava)?1:0; -_5.bw=(_5.ie6||_5.ie5||_5.ie4||_5.ns4||_5.ns6||_5.opera); -_5.ver3=(_5.hotjava||_5.ie3); -_5.opera7=((_5.agent.toLowerCase().indexOf("opera 7")>-1)||(_5.agent.toLowerCase().indexOf("opera/7")>-1)); -_5.operaOld=_5.opera&&!_5.opera7; -return _5; -},ImportCss:function(_7,_8){ -if(this.browser().ie){ -var _9=_7.createStyleSheet(_8); -}else{ -var elm=_7.createElement("link"); -elm.rel="stylesheet"; -elm.href=_8; -if(headArr=_7.getElementsByTagName("head")){ -headArr[0].appendChild(elm); -} -} -}}); -Object.extend(Prado.Calendar,{NUM_DAYS:[0,31,59,90,120,151,181,212,243,273,304,334],LEAP_NUM_DAYS:[0,31,60,91,121,152,182,213,244,274,305,335]}); -Prado.Calendar.prototype={monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],shortWeekDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],format:"yyyy-MM-dd",css:"calendar_system.css",initialize:function(_11,_12){ -this.attr=_12||[]; -this.control=$(_11); +Prado.WebUI.TDatePicker=Class.create(); +Prado.WebUI.TDatePicker.prototype={MonthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],ShortWeekDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Format:"yyyy-MM-dd",FirstDayOfWeek:1,ClassName:"TDatePicker",FromYear:2000,UpToYear:2015,initialize:function(_1,_2){ +this.attr=_2||[]; +this.control=$(_1); this.dateSlot=new Array(42); this.weekSlot=new Array(6); -this.firstDayOfWeek=1; this.minimalDaysInFirstWeek=4; -this.currentDate=new Date(); -this.selectedDate=null; -this.className="Prado_Calendar"; -this.trigger=this.attr.trigger?$(this.attr.trigger):this.control; -Event.observe(this.trigger,"click",this.show.bind(this)); -Prado.Calendar.Util.ImportCss(document,this.css); -if(this.attr.format){ -this.format=this.attr.format; +this.selectedDate=this.newDate(); +if(this.attr.Trigger){ +this.trigger=$(this.attr.Trigger); +var _3=this.attr.TriggerEvent||"click"; +}else{ +this.trigger=this.control; +var _3=this.attr.TriggerEvent||"focus"; } +Event.observe(this.trigger,_3,this.show.bindEvent(this)); +Object.extend(this,_2); this.create(); -this.hookEvents(); },create:function(){ -var div; -var _14; -var _15; +var _4; +var _5; +var _6; var tr; var td; this._calDiv=document.createElement("div"); -this._calDiv.className=this.className; +this._calDiv.className=this.ClassName; this._calDiv.style.display="none"; -div=document.createElement("div"); -div.className="calendarHeader"; -this._calDiv.appendChild(div); -_14=document.createElement("table"); -_14.style.cellSpacing=0; -div.appendChild(_14); -_15=document.createElement("tbody"); -_14.appendChild(_15); +_4=document.createElement("div"); +_4.className="calendarHeader"; +this._calDiv.appendChild(_4); +_5=document.createElement("table"); +_5.style.cellSpacing=0; +_4.appendChild(_5); +_6=document.createElement("tbody"); +_5.appendChild(_6); tr=document.createElement("tr"); -_15.appendChild(tr); +_6.appendChild(tr); td=document.createElement("td"); -td.className="prevMonthButton"; -this._previousMonth=document.createElement("button"); -this._previousMonth.appendChild(document.createTextNode("<<")); -td.appendChild(this._previousMonth); +var _9=document.createElement("button"); +_9.className="prevMonthButton"; +_9.appendChild(document.createTextNode("<<")); +td.appendChild(_9); tr.appendChild(td); td=document.createElement("td"); -td.className="labelContainer"; tr.appendChild(td); this._monthSelect=document.createElement("select"); -for(var i=0;i<this.monthNames.length;i++){ +this._monthSelect.className="months"; +for(var i=0;i<this.MonthNames.length;i++){ var opt=document.createElement("option"); -opt.innerHTML=this.monthNames[i]; +opt.innerHTML=this.MonthNames[i]; opt.value=i; -if(i==this.currentDate.getMonth()){ +if(i==this.selectedDate.getMonth()){ opt.selected=true; } this._monthSelect.appendChild(opt); @@ -107,11 +59,11 @@ td=document.createElement("td"); td.className="labelContainer"; tr.appendChild(td); this._yearSelect=document.createElement("select"); -for(var i=1920;i<2050;++i){ +for(var i=this.FromYear;i<=this.UpToYear;++i){ var opt=document.createElement("option"); opt.innerHTML=i; opt.value=i; -if(i==this.currentDate.getFullYear()){ +if(i==this.selectedDate.getFullYear()){ opt.selected=false; } this._yearSelect.appendChild(opt); @@ -119,123 +71,152 @@ this._yearSelect.appendChild(opt); td.appendChild(this._yearSelect); td=document.createElement("td"); td.className="nextMonthButton"; -this._nextMonth=document.createElement("button"); -this._nextMonth.appendChild(document.createTextNode(">>")); -td.appendChild(this._nextMonth); +var _12=document.createElement("button"); +_12.appendChild(document.createTextNode(">>")); +td.appendChild(_12); tr.appendChild(td); -div=document.createElement("div"); -div.className="calendarBody"; -this._calDiv.appendChild(div); -this._table=div; -var _20; -_14=document.createElement("table"); -_14.className="grid"; -div.appendChild(_14); -var _21=document.createElement("thead"); -_14.appendChild(_21); +_4=document.createElement("div"); +_4.className="calendarBody"; +this._calDiv.appendChild(_4); +var _13=_4; +var _14; +_5=document.createElement("table"); +_5.className="grid"; +_4.appendChild(_5); +var _15=document.createElement("thead"); +_5.appendChild(_15); tr=document.createElement("tr"); -_21.appendChild(tr); +_15.appendChild(tr); for(i=0;i<7;++i){ td=document.createElement("th"); -_20=document.createTextNode(this.shortWeekDayNames[(i+this.firstDayOfWeek)%7]); -td.appendChild(_20); +_14=document.createTextNode(this.ShortWeekDayNames[(i+this.FirstDayOfWeek)%7]); +td.appendChild(_14); td.className="weekDayHead"; tr.appendChild(td); } -_15=document.createElement("tbody"); -_14.appendChild(_15); +_6=document.createElement("tbody"); +_5.appendChild(_6); for(week=0;week<6;++week){ tr=document.createElement("tr"); -_15.appendChild(tr); +_6.appendChild(tr); for(day=0;day<7;++day){ td=document.createElement("td"); td.className="calendarDate"; -_20=document.createTextNode(String.fromCharCode(160)); -td.appendChild(_20); +_14=document.createTextNode(String.fromCharCode(160)); +td.appendChild(_14); tr.appendChild(td); var tmp=new Object(); tmp.tag="DATE"; tmp.value=-1; -tmp.data=_20; +tmp.data=_14; this.dateSlot[(week*7)+day]=tmp; -Event.observe(td,"mouseover",this.hover.bind(this)); -Event.observe(td,"mouseout",this.hover.bind(this)); -} -} -div=document.createElement("div"); -div.className="calendarFooter"; -this._calDiv.appendChild(div); -_14=document.createElement("table"); -_14.className="footerTable"; -div.appendChild(_14); -_15=document.createElement("tbody"); -_14.appendChild(_15); -tr=document.createElement("tr"); -_15.appendChild(tr); -td=document.createElement("td"); -td.className="todayButton"; -this._todayButton=document.createElement("button"); -var _23=new Date(); -var _24=_23.getDate()+" "+this.monthNames[_23.getMonth()]+", "+_23.getFullYear(); -this._todayButton.appendChild(document.createTextNode(_24)); -td.appendChild(this._todayButton); -tr.appendChild(td); -td=document.createElement("td"); -td.className="clearButton"; -this._clearButton=document.createElement("button"); -var _23=new Date(); -_24="Clear"; -this._clearButton.appendChild(document.createTextNode(_24)); -td.appendChild(this._clearButton); -tr.appendChild(td); +Event.observe(td,"mouseover",this.hover.bindEvent(this)); +Event.observe(td,"mouseout",this.hover.bindEvent(this)); +} +} +_4=document.createElement("div"); +_4.className="calendarFooter"; +this._calDiv.appendChild(_4); +var _17=document.createElement("button"); +_17.className="todayButton"; +var _18=this.newDate(); +var _19=_18.getDate()+" "+this.MonthNames[_18.getMonth()]+", "+_18.getFullYear(); +_17.appendChild(document.createTextNode(_19)); +_4.appendChild(_17); +var _20=document.createElement("button"); +_20.className="clearButton"; +_19="Clear"; +_20.appendChild(document.createTextNode(_19)); +_4.appendChild(_20); document.body.appendChild(this._calDiv); this.update(); this.updateHeader(); -return this._calDiv; -},hookEvents:function(){ -this._previousMonth.hideFocus=true; -this._nextMonth.hideFocus=true; -this._todayButton.hideFocus=true; -Event.observe(this._previousMonth,"click",this.prevMonth.bind(this)); -Event.observe(this._nextMonth,"click",this.nextMonth.bind(this)); -Event.observe(this._todayButton,"click",this.selectToday.bind(this)); -Event.observe(this._clearButton,"click",this.clearSelection.bind(this)); -Event.observe(this._monthSelect,"change",this.monthSelect.bind(this)); -Event.observe(this._yearSelect,"change",this.yearSelect.bind(this)); -Event.observe(this._calDiv,"mousewheel",this.mouseWheelChange.bind(this)); -Event.observe(this._table,"click",this.selectDate.bind(this)); -Event.observe(this._calDiv,"keydown",this.keyPressed.bind(this)); +this.ieHack(true); +_9.hideFocus=true; +_12.hideFocus=true; +_17.hideFocus=true; +Event.observe(_9,"click",this.prevMonth.bindEvent(this)); +Event.observe(_12,"click",this.nextMonth.bindEvent(this)); +Event.observe(_17,"click",this.selectToday.bindEvent(this)); +Event.observe(_20,"click",this.clearSelection.bindEvent(this)); +Event.observe(this._monthSelect,"change",this.monthSelect.bindEvent(this)); +Event.observe(this._yearSelect,"change",this.yearSelect.bindEvent(this)); +Event.observe(this._calDiv,"mousewheel",this.mouseWheelChange.bindEvent(this)); +Event.observe(_13,"click",this.selectDate.bindEvent(this)); +},ieHack:function(_21){ +if(this.iePopUp){ +this.iePopUp.style.display="block"; +this.iePopUp.style.top=(this._calDiv.offsetTop-1)+"px"; +this.iePopUp.style.left=(this._calDiv.offsetLeft-1)+"px"; +this.iePopUp.style.width=Math.abs(this._calDiv.offsetWidth-2)+"px"; +this.iePopUp.style.height=(this._calDiv.offsetHeight+1)+"px"; +if(_21){ +this.iePopUp.style.display="none"; +} +} },keyPressed:function(ev){ +if(!this.showing){ +return; +} if(!ev){ ev=document.parentWindow.event; } var kc=ev.keyCode!=null?ev.keyCode:ev.charCode; -if(kc=Event.KEY_RETURN){ -this.setSelectedDate(this.currentDate); +if(kc==Event.KEY_RETURN){ +Event.stop(ev); this.hide(); -return false; } +var _24=function(_25,_26){ +_25=(_25+12)%12; +var _27=[31,28,31,30,31,30,31,31,30,31,30,31]; +var res=_27[_25]; +if(_25==1){ +res+=_26%4==0&&!(_26%400==0)?1:0; +} +return res; +}; if(kc<37||kc>40){ return true; } -var d=new Date(this.currentDate).valueOf(); +var _29=this.selectedDate; +var d=_29.valueOf(); if(kc==Event.KEY_LEFT){ +if(ev.ctrlKey||ev.shiftKey){ +_29.setDate(Math.min(_29.getDate(),_24(_29.getMonth()-1,_29.getFullYear()))); +d=_29.setMonth(_29.getMonth()-1); +}else{ d-=86400000; +} }else{ if(kc==Event.KEY_RIGHT){ +if(ev.ctrlKey||ev.shiftKey){ +_29.setDate(Math.min(_29.getDate(),_24(_29.getMonth()+1,_29.getFullYear()))); +d=_29.setMonth(_29.getMonth()+1); +}else{ d+=86400000; +} }else{ if(kc==Event.KEY_UP){ +if(ev.ctrlKey||ev.shiftKey){ +_29.setDate(Math.min(_29.getDate(),_24(_29.getMonth(),_29.getFullYear()-1))); +d=_29.setFullYear(_29.getFullYear()-1); +}else{ d-=604800000; +} }else{ if(kc==Event.KEY_DOWN){ -d+=604800000; +if(ev.ctrlKey||ev.shiftKey){ +_29.setDate(Math.min(_29.getDate(),_24(_29.getMonth(),_29.getFullYear()+1))); +d=_29.setFullYear(_29.getFullYear()+1); +}else{ +d+=7*24*61*60*1000; } } } } -this.setCurrentDate(new Date(d)); -return false; +} +this.setSelectedDate(d); +Event.stop(ev); },selectDate:function(ev){ var el=Event.element(ev); while(el.nodeType!=1){ @@ -247,7 +228,7 @@ el=el.parentNode; if(el==null||el.tagName==null||el.tagName.toLowerCase()!="td"){ return; } -var d=new Date(this.currentDate); +var d=this.newDate(this.selectedDate); var n=Number(el.firstChild.data); if(isNaN(n)||n<=0||n==null){ return; @@ -256,13 +237,10 @@ d.setDate(n); this.setSelectedDate(d); this.hide(); },selectToday:function(){ -this.setSelectedDate(new Date()); +this.setSelectedDate(this.newDate()); this.hide(); },clearSelection:function(){ -this.selectedDate=null; -if(isFunction(this.onchange)){ -this.onchange(); -} +this.setSelectedDate(this.newDate()); this.hide(); },monthSelect:function(ev){ this.setMonth(Form.Element.getValue(Event.element(ev))); @@ -273,62 +251,65 @@ if(e==null){ e=document.parentWindow.event; } var n=-e.wheelDelta/120; -var d=new Date(this.currentDate); -var m=this.getMonth()+n; +var d=this.newDate(this.selectedDate); +var m=d.getMonth()+n; this.setMonth(m); -this.setCurrentDate(d); return false; },onchange:function(){ this.control.value=this.formatDate(); },formatDate:function(){ -return Prado.Calendar.Util.FormatDate(this.selectedDate,this.format); -},setCurrentDate:function(_32){ -if(_32==null){ -return; +return this.selectedDate?this.selectedDate.SimpleFormat(this.Format):""; +},newDate:function(_35){ +if(!_35){ +_35=new Date(); +} +if(isString(_35)||isNumber(_35)){ +_35=new Date(_35); } -if(isString(_32)||isNumber(_32)){ -_32=new Date(_32); +return new Date(_35.getFullYear(),_35.getMonth(),_35.getDate(),0,0,0); +},setSelectedDate:function(_36){ +if(_36==null){ +return; } -if(this.currentDate.getDate()!=_32.getDate()||this.currentDate.getMonth()!=_32.getMonth()||this.currentDate.getFullYear()!=_32.getFullYear()){ -this.currentDate=new Date(_32); +this.selectedDate=this.newDate(_36); this.updateHeader(); this.update(); -} -},setSelectedDate:function(_33){ -this.selectedDate=new Date(_33); -this.setCurrentDate(this.selectedDate); if(isFunction(this.onchange)){ this.onchange(); } },getElement:function(){ return this._calDiv; },getSelectedDate:function(){ -return isNull(this.selectedDate)?null:new Date(this.selectedDate); -},setYear:function(_34){ -var d=new Date(this.currentDate); -d.setFullYear(_34); -this.setCurrentDate(d); -},setMonth:function(_35){ -var d=new Date(this.currentDate); -d.setMonth(_35); -this.setCurrentDate(d); +return isNull(this.selectedDate)?null:this.newDate(this.selectedDate); +},setYear:function(_37){ +var d=this.newDate(this.selectedDate); +d.setFullYear(_37); +this.setSelectedDate(d); +},setMonth:function(_38){ +var d=this.newDate(this.selectedDate); +d.setMonth(_38); +this.setSelectedDate(d); },nextMonth:function(){ -this.setMonth(this.currentDate.getMonth()+1); +this.setMonth(this.selectedDate.getMonth()+1); },prevMonth:function(){ -this.setMonth(this.currentDate.getMonth()-1); +this.setMonth(this.selectedDate.getMonth()-1); },show:function(){ if(!this.showing){ var pos=Position.cumulativeOffset(this.control); pos[1]+=this.control.offsetHeight; this._calDiv.style.display="block"; -this._calDiv.style.top=pos[1]+"px"; +this._calDiv.style.top=(pos[1]-1)+"px"; this._calDiv.style.left=pos[0]+"px"; -Event.observe(document.body,"click",this.hideOnClick.bind(this)); -var _37=Prado.Calendar.Util.ParseDate(Form.Element.getValue(this.control),this.format); -if(!isNull(_37)){ -this.selectedDate=_37; -this.setCurrentDate(_37); -} +this.ieHack(false); +this.documentClickEvent=this.hideOnClick.bindEvent(this); +this.documentKeyDownEvent=this.keyPressed.bindEvent(this); +Event.observe(document.body,"click",this.documentClickEvent); +var _40=Date.SimpleParse(Form.Element.getValue(this.control),this.Format); +if(!isNull(_40)){ +this.selectedDate=_40; +this.setSelectedDate(_40); +} +Event.observe(document,"keydown",this.documentKeyDownEvent); this.showing=true; } },hideOnClick:function(ev){ @@ -336,86 +317,85 @@ if(!this.showing){ return; } var el=Event.element(ev); -var _38=false; +var _41=false; do{ -_38=_38||el.className==this.className; -_38=_38||el==this.trigger; -_38=_38||el==this.control; -if(_38){ +_41=_41||el.className==this.ClassName; +_41=_41||el==this.trigger; +_41=_41||el==this.control; +if(_41){ break; } el=el.parentNode; }while(el); -if(!_38){ +if(!_41){ this.hide(); } },hide:function(){ if(this.showing){ this._calDiv.style.display="none"; +if(this.iePopUp){ +this.iePopUp.style.display="none"; +} this.showing=false; -Event.stopObserving(document.body,"click",this.hideOnClick.bind(this)); +Event.stopObserving(document.body,"click",this.documentClickEvent); +Event.stopObserving(document,"keydown",this.documentKeyDownEvent); } },update:function(){ -var _39=Prado.Calendar.Util; -var _40=this.currentDate; -var _41=_39.ISODate(new Date()); -var _42=isNull(this.selectedDate)?"":_39.ISODate(this.selectedDate); -var _43=_39.ISODate(_40); -var d1=new Date(_40.getFullYear(),_40.getMonth(),1); -var d2=new Date(_40.getFullYear(),_40.getMonth()+1,1); -var _46=Math.round((d2-d1)/(24*60*60*1000)); -var _47=(d1.getDay()-this.firstDayOfWeek)%7; -if(_47<0){ -_47+=7; -} -var _48=0; -while(_48<_47){ -this.dateSlot[_48].value=-1; -this.dateSlot[_48].data.data=String.fromCharCode(160); -this.dateSlot[_48].data.parentNode.className="empty"; -_48++; -} -for(i=1;i<=_46;i++,_48++){ -var _49=this.dateSlot[_48]; -var _50=_49.data.parentNode; -_49.value=i; -_49.data.data=i; -_50.className="date"; -if(_39.ISODate(d1)==_41){ -_50.className+=" today"; -} -if(_39.ISODate(d1)==_43){ -_50.className+=" current"; -} -if(_39.ISODate(d1)==_42){ -_50.className+=" selected"; +var _42=this.selectedDate; +var _43=(this.newDate()).toISODate(); +var _44=_42.toISODate(); +var d1=new Date(_42.getFullYear(),_42.getMonth(),1); +var d2=new Date(_42.getFullYear(),_42.getMonth()+1,1); +var _47=Math.round((d2-d1)/(24*60*60*1000)); +var _48=(d1.getDay()-this.FirstDayOfWeek)%7; +if(_48<0){ +_48+=7; +} +var _49=0; +while(_49<_48){ +this.dateSlot[_49].value=-1; +this.dateSlot[_49].data.data=String.fromCharCode(160); +this.dateSlot[_49].data.parentNode.className="empty"; +_49++; +} +for(i=1;i<=_47;i++,_49++){ +var _50=this.dateSlot[_49]; +var _51=_50.data.parentNode; +_50.value=i; +_50.data.data=i; +_51.className="date"; +if(d1.toISODate()==_43){ +_51.className+=" today"; +} +if(d1.toISODate()==_44){ +_51.className+=" selected"; } d1=new Date(d1.getFullYear(),d1.getMonth(),d1.getDate()+1); } -var _51=_48; -while(_48<42){ -this.dateSlot[_48].value=-1; -this.dateSlot[_48].data.data=String.fromCharCode(160); -this.dateSlot[_48].data.parentNode.className="empty"; -++_48; +var _52=_49; +while(_49<42){ +this.dateSlot[_49].value=-1; +this.dateSlot[_49].data.data=String.fromCharCode(160); +this.dateSlot[_49].data.parentNode.className="empty"; +++_49; } },hover:function(ev){ Element.condClassName(Event.element(ev),"hover",ev.type=="mouseover"); },updateHeader:function(){ -var _52=this._monthSelect.options; -var m=this.currentDate.getMonth(); -for(var i=0;i<_52.length;++i){ -_52[i].selected=false; -if(_52[i].value==m){ -_52[i].selected=true; -} -} -_52=this._yearSelect.options; -var _53=this.currentDate.getFullYear(); -for(var i=0;i<_52.length;++i){ -_52[i].selected=false; -if(_52[i].value==_53){ -_52[i].selected=true; +var _53=this._monthSelect.options; +var m=this.selectedDate.getMonth(); +for(var i=0;i<_53.length;++i){ +_53[i].selected=false; +if(_53[i].value==m){ +_53[i].selected=true; +} +} +_53=this._yearSelect.options; +var _54=this.selectedDate.getFullYear(); +for(var i=0;i<_53.length;++i){ +_53[i].selected=false; +if(_53[i].value==_54){ +_53[i].selected=true; } } }}; |