From 1afc913c386bba8e6072c278b0eb4fd9818ab310 Mon Sep 17 00:00:00 2001 From: xue <> Date: Tue, 25 Apr 2006 01:27:04 +0000 Subject: Undo previous checkin (which goes int 3.0 branch and will be merged back). --- .../Web/Javascripts/colorpicker/colorpicker.js | 59 +-- framework/Web/Javascripts/datepicker/datepicker.js | 96 ++--- framework/Web/Javascripts/extended/event.js | 5 +- framework/Web/Javascripts/js/colorpicker.js | 36 +- framework/Web/Javascripts/js/datepicker.js | 86 ++--- framework/Web/Javascripts/js/prado.js | 5 +- framework/Web/Javascripts/js/validator.js | 237 +++--------- framework/Web/Javascripts/prado/form.js | 2 +- framework/Web/Javascripts/prado/validation3.js | 396 ++++----------------- framework/Web/UI/WebControls/TBaseValidator.php | 6 +- framework/Web/UI/WebControls/TCheckBox.php | 4 +- framework/Web/UI/WebControls/TCheckBoxList.php | 12 +- framework/Web/UI/WebControls/TCompareValidator.php | 16 +- .../Web/UI/WebControls/TDataTypeValidator.php | 8 +- framework/Web/UI/WebControls/TDatePicker.php | 45 +-- framework/Web/UI/WebControls/THtmlArea.php | 2 +- .../Web/UI/WebControls/TListControlValidator.php | 214 ----------- framework/Web/UI/WebControls/TRadioButton.php | 7 +- framework/Web/UI/WebControls/TRangeValidator.php | 41 ++- .../Web/UI/WebControls/TRequiredFieldValidator.php | 30 +- 20 files changed, 281 insertions(+), 1026 deletions(-) delete mode 100644 framework/Web/UI/WebControls/TListControlValidator.php (limited to 'framework/Web') diff --git a/framework/Web/Javascripts/colorpicker/colorpicker.js b/framework/Web/Javascripts/colorpicker/colorpicker.js index dc80f0c7..cc4587ff 100644 --- a/framework/Web/Javascripts/colorpicker/colorpicker.js +++ b/framework/Web/Javascripts/colorpicker/colorpicker.js @@ -83,7 +83,7 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, if(mode == "Full") this.initializeFullPicker(); } - this.show(mode); + this.show(); }, show : function(type) @@ -108,7 +108,6 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, if(type == "Full") { - this.observeMouseMovement(); var color = Rico.Color.createFromHex(this.input.value); this.inputs.oldColor.style.backgroundColor = color.asHex(); this.setColor(color,true); @@ -125,14 +124,8 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, this.element.style.display = "none"; this.showing = false; - Event.stopObserving(document.body, "click", this._documentClickEvent); + Event.stopObserving(document.body, "click", this._documentClickEvent); Event.stopObserving(document,"keydown", this._documentKeyDownEvent); - - if(this._observingMouseMove) - { - Event.stopObserving(document.body, "mousemove", this._onMouseMove); - this._observingMouseMove = false; - } } }, @@ -215,7 +208,7 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, { this.input.value = color.toString().toUpperCase(); this.button.style.backgroundColor = color.toString(); - if(typeof(this.onChange) == "function") + if(isFunction(this.onChange)) this.onChange(color); }, @@ -253,7 +246,7 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, TR(null, TD(null,'H:'), - TD(null,this.inputs['H'], '??')), + TD(null,this.inputs['H'], '°')), TR(null, TD(null,'S:'), @@ -340,46 +333,34 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, this._onMouseMove = this.onMouseMove.bind(this); Event.observe(this.inputs.background, "mousedown", this._onColorMouseDown); - Event.observe(this.inputs.selector, "mousedown", this._onColorMouseDown); Event.observe(this.inputs.hue, "mousedown", this._onHueMouseDown); - Event.observe(this.inputs.slider, "mousedown", this._onHueMouseDown); Event.observe(document.body, "mouseup", this._onMouseUp); - - this.observeMouseMovement(); + + //Because of using the CSS filter, IE can't do colour change quickly + //if(!Prado.Browser().ie) + Event.observe(document.body, "mousemove", this._onMouseMove); Event.observe(this.buttons.Cancel, "click", this.hide.bindEvent(this,this.options['Mode'])); Event.observe(this.buttons.OK, "click", this.onOKClicked.bind(this)); }, - observeMouseMovement : function() - { - if(!this._observingMouseMove) - { - Event.observe(document.body, "mousemove", this._onMouseMove); - this._observingMouseMove = true; - } - }, - onColorMouseDown : function(ev) { this.isMouseDownOnColor = true; this.onMouseMove(ev); - Event.stop(ev); }, onHueMouseDown : function(ev) { this.isMouseDownOnHue = true; this.onMouseMove(ev); - Event.stop(ev); }, onMouseUp : function(ev) { this.isMouseDownOnColor = false; this.isMouseDownOnHue = false; - Event.stop(ev); }, onMouseMove : function(ev) @@ -388,7 +369,6 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, this.changeSV(ev); if(this.isMouseDownOnHue) this.changeH(ev); - Event.stop(ev); }, changeSV : function(ev) @@ -396,25 +376,18 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, var px = Event.pointerX(ev); var py = Event.pointerY(ev); var pos = Position.cumulativeOffset(this.inputs.background); - var x = this.truncate(px - pos[0],0,255); var y = this.truncate(py - pos[1],0,255); + var h = this.truncate(this.inputs.H.value,0,360)/360; var s = x/255; var b = (255-y)/255; - var current_s = parseInt(this.inputs.S.value); - var current_b = parseInt(this.inputs.V.value); - - if(current_s == parseInt(s*100) && current_b == parseInt(b*100)) return; - - var h = this.truncate(this.inputs.H.value,0,360)/360; var color = new Rico.Color(); color.rgb = Rico.Color.HSBtoRGB(h,s,b); - this.inputs.selector.style.left = x+"px"; this.inputs.selector.style.top = y+"px"; @@ -430,10 +403,6 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, var y = this.truncate(py - pos[1],0,255); var h = (255-y)/255; - var current_h = this.truncate(this.inputs.H.value,0,360); - current_h = current_h == 0 ? 360 : current_h; - if(current_h == parseInt(h*360)) return; - var s = parseInt(this.inputs.S.value)/100; var b = parseInt(this.inputs.V.value)/100; var color = new Rico.Color(); @@ -503,8 +472,14 @@ Object.extend(Prado.WebUI.TColorPicker.prototype, var images = Prado.WebUI.TColorPicker.UIImages; var changeCss = color.isBright() ? 'removeClassName' : 'addClassName'; - Element[changeCss](this.inputs.selector, 'target_white'); - + Element[changeCss](this.inputs.selector, 'target_white'); +/* if(color.isBright()) + Element.removeCssClass(this.inputs.selector, 'target_white'); + //this.inputs.selector.src = images['target_black.gif']; + else + Element.addCssClass(this.inputs.selector, 'target_white'); + //this.inputs.selector.src = images['target_white.gif']; +*/ if(update) this.updateSelectors(color); }, diff --git a/framework/Web/Javascripts/datepicker/datepicker.js b/framework/Web/Javascripts/datepicker/datepicker.js index 79763811..e906120c 100644 --- a/framework/Web/Javascripts/datepicker/datepicker.js +++ b/framework/Web/Javascripts/datepicker/datepicker.js @@ -1,51 +1,10 @@ Prado.WebUI.TDatePicker = Class.create(); -Object.extend(Prado.WebUI.TDatePicker, -{ - /** - * @return Date the date from drop down list options. - */ - getDropDownDate : function(control) - { - var now=new Date(); - var year=now.getFullYear(); - var month=now.getMonth(); - var day=1; - - var month_list = this.getMonthListControl(control); - var day_list = this.getDayListControl(control); - var year_list = this.getYearListControl(control); - - var day = day_list ? $F(day_list) : 1; - var month = month_list ? $F(month_list) : now.getMonth(); - var year = year_list ? $F(year_list) : now.getFullYear(); - - return new Date(year,month,day, 0, 0, 0); - }, - - getYearListControl : function(control) - { - return $(control.id+"_year"); - }, - - getMonthListControl : function(control) - { - return $(control.id+"_month"); - }, - - getDayListControl : function(control) - { - return $(control.id+"_day"); - } -}); - Prado.WebUI.TDatePicker.prototype = { MonthNames : [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], - AbbreviatedMonthNames : ["Jan", "Feb", "Mar", "Apr", "May", - "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ShortWeekDayNames : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], @@ -229,7 +188,7 @@ Prado.WebUI.TDatePicker.prototype = var todayButton = document.createElement("button"); todayButton.className = "todayButton"; var today = this.newDate(); - var buttonText = today.SimpleFormat(this.Format,this); + var buttonText = today.SimpleFormat(this.Format); todayButton.appendChild(document.createTextNode(buttonText)); div.appendChild(todayButton); @@ -427,27 +386,20 @@ Prado.WebUI.TDatePicker.prototype = return false; }, - onChange : function() + onchange : function() { if(this.options.InputMode == "TextBox") - { this.control.value = this.formatDate(); - Event.fireEvent(this.control, "change"); - } else { - var day = Prado.WebUI.TDatePicker.getDayListControl(this.control); - var month = Prado.WebUI.TDatePicker.getMonthListControl(this.control); - var year = Prado.WebUI.TDatePicker.getYearListControl(this.control); + var day = $(this.options.ID+"_day"); + var month = $(this.options.ID+"_month"); + var year = $(this.options.ID+"_year"); var date = this.selectedDate; if(day) - { day.selectedIndex = date.getDate()-1; - } if(month) - { month.selectedIndex = date.getMonth(); - } if(year) { var years = year.options; @@ -455,20 +407,19 @@ Prado.WebUI.TDatePicker.prototype = for(var i = 0; i < years.length; i++) years[i].selected = years[i].value.toInteger() == currentYear; } - Event.fireEvent(day || month || year, "change"); } }, formatDate : function() { - return this.selectedDate ? this.selectedDate.SimpleFormat(this.Format,this) : ''; + return this.selectedDate ? this.selectedDate.SimpleFormat(this.Format) : ''; }, newDate : function(date) { if(!date) date = new Date(); - if(typeof(date) == "string" || typeof(date) == "number") + if(isString(date) || isNumber(date)) date = new Date(date); return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0,0,0); }, @@ -481,8 +432,8 @@ Prado.WebUI.TDatePicker.prototype = this.updateHeader(); this.update(); - if (typeof(this.onChange) == "function") - this.onChange(); + if (isFunction(this.onchange)) + this.onchange(); }, getElement : function() @@ -492,7 +443,7 @@ Prado.WebUI.TDatePicker.prototype = getSelectedDate : function () { - return this.selectedDate == null ? null : this.newDate(this.selectedDate); + return isNull(this.selectedDate) ? null : this.newDate(this.selectedDate); }, setYear : function(year) @@ -529,9 +480,8 @@ Prado.WebUI.TDatePicker.prototype = pos[1] += this.control.offsetHeight; else { - var dayList = Prado.WebUI.TDatePicker.getDayListControl(this.control); - if(dayList) - pos[1] += dayList.offsetHeight-1; + if($(this.options.ID+"_day")) + pos[1] += $(this.options.ID+"_day").offsetHeight-1; } this._calDiv.style.display = "block"; @@ -543,7 +493,7 @@ Prado.WebUI.TDatePicker.prototype = this.documentKeyDownEvent = this.keyPressed.bindEvent(this); Event.observe(document.body, "click", this.documentClickEvent); var date = this.getDateFromInput(); - if(date) + if(!isNull(date)) { this.selectedDate = date; this.setSelectedDate(date); @@ -558,7 +508,20 @@ Prado.WebUI.TDatePicker.prototype = if(this.options.InputMode == "TextBox") return Date.SimpleParse($F(this.control), this.Format); else - return Prado.WebUI.TDatePicker.getDropDownDate(this.control); + { + var now=new Date(); + var year=now.getFullYear(); + var month=now.getMonth(); + var date=1; + if($(this.options.ID+"_day")) + day = $F(this.options.ID+"_day"); + if($(this.options.ID+"_month")) + month = $F(this.options.ID+"_month"); + if($(this.options.ID+"_year")) + year = $F(this.options.ID+"_year"); + var newdate=new Date(year,month,day, 0, 0, 0); + return newdate; + } }, //hide the calendar when clicked outside any calendar @@ -647,10 +610,7 @@ Prado.WebUI.TDatePicker.prototype = hover : function(ev) { //conditionally add the hover class to the event target element. - if(ev.type == "mouseover") - Event.element(ev).addClassName("hover"); - else - Event.element(ev).removeClassName("hover"); + Element.condClassName(Event.element(ev), "hover", ev.type=="mouseover"); }, updateHeader : function () { diff --git a/framework/Web/Javascripts/extended/event.js b/framework/Web/Javascripts/extended/event.js index 13e875da..40cf60a1 100644 --- a/framework/Web/Javascripts/extended/event.js +++ b/framework/Web/Javascripts/extended/event.js @@ -95,10 +95,9 @@ Object.extend(Event, else if(element.fireEvent) { element.fireEvent('on'+type); - if(element[type]) - element[type](); + element[type](); } - else if(element[type]) + else element[type](); } }); \ No newline at end of file diff --git a/framework/Web/Javascripts/js/colorpicker.js b/framework/Web/Javascripts/js/colorpicker.js index b926dc93..27e180b0 100644 --- a/framework/Web/Javascripts/js/colorpicker.js +++ b/framework/Web/Javascripts/js/colorpicker.js @@ -257,7 +257,7 @@ this.input.parentNode.appendChild(this.iePopUp); if(mode == "Full") this.initializeFullPicker(); } -this.show(mode); +this.show(); }, show : function(type) { @@ -276,7 +276,6 @@ Event.observe(document,"keydown", this._documentKeyDownEvent); this.showing = true; if(type == "Full") { -this.observeMouseMovement(); var color = Rico.Color.createFromHex(this.input.value); this.inputs.oldColor.style.backgroundColor = color.asHex(); this.setColor(color,true); @@ -293,11 +292,6 @@ this.element.style.display = "none"; this.showing = false; Event.stopObserving(document.body, "click", this._documentClickEvent); Event.stopObserving(document,"keydown", this._documentKeyDownEvent); -if(this._observingMouseMove) -{ -Event.stopObserving(document.body, "mousemove", this._onMouseMove); -this._observingMouseMove = false; -} } }, keyPressed : function(event,type) @@ -373,7 +367,7 @@ updateColor : function(color) { this.input.value = color.toString().toUpperCase(); this.button.style.backgroundColor = color.toString(); -if(typeof(this.onChange) == "function") +if(isFunction(this.onChange)) this.onChange(color); }, getFullPickerContainer : function(pickerID) @@ -400,7 +394,7 @@ TD({className:'currentcolor',colSpan:2}, this.inputs['currentColor'], this.inputs['oldColor'])), TR(null, TD(null,'H:'), -TD(null,this.inputs['H'], '??')), +TD(null,this.inputs['H'], '°')), TR(null, TD(null,'S:'), TD(null,this.inputs['S'], '%')), @@ -469,39 +463,26 @@ this._onHueMouseDown = this.onHueMouseDown.bind(this); this._onMouseUp = this.onMouseUp.bind(this); this._onMouseMove = this.onMouseMove.bind(this); Event.observe(this.inputs.background, "mousedown", this._onColorMouseDown); -Event.observe(this.inputs.selector, "mousedown", this._onColorMouseDown); Event.observe(this.inputs.hue, "mousedown", this._onHueMouseDown); -Event.observe(this.inputs.slider, "mousedown", this._onHueMouseDown); Event.observe(document.body, "mouseup", this._onMouseUp); -this.observeMouseMovement(); +Event.observe(document.body, "mousemove", this._onMouseMove); Event.observe(this.buttons.Cancel, "click", this.hide.bindEvent(this,this.options['Mode'])); Event.observe(this.buttons.OK, "click", this.onOKClicked.bind(this)); }, -observeMouseMovement : function() -{ -if(!this._observingMouseMove) -{ -Event.observe(document.body, "mousemove", this._onMouseMove); -this._observingMouseMove = true; -} -}, onColorMouseDown : function(ev) { this.isMouseDownOnColor = true; this.onMouseMove(ev); -Event.stop(ev); }, onHueMouseDown : function(ev) { this.isMouseDownOnHue = true; this.onMouseMove(ev); -Event.stop(ev); }, onMouseUp : function(ev) { this.isMouseDownOnColor = false; this.isMouseDownOnHue = false; -Event.stop(ev); }, onMouseMove : function(ev) { @@ -509,7 +490,6 @@ if(this.isMouseDownOnColor) this.changeSV(ev); if(this.isMouseDownOnHue) this.changeH(ev); -Event.stop(ev); }, changeSV : function(ev) { @@ -518,12 +498,9 @@ var py = Event.pointerY(ev); var pos = Position.cumulativeOffset(this.inputs.background); var x = this.truncate(px - pos[0],0,255); var y = this.truncate(py - pos[1],0,255); +var h = this.truncate(this.inputs.H.value,0,360)/360; var s = x/255; var b = (255-y)/255; -var current_s = parseInt(this.inputs.S.value); -var current_b = parseInt(this.inputs.V.value); -if(current_s == parseInt(s*100) && current_b == parseInt(b*100)) return; -var h = this.truncate(this.inputs.H.value,0,360)/360; var color = new Rico.Color(); color.rgb = Rico.Color.HSBtoRGB(h,s,b); this.inputs.selector.style.left = x+"px"; @@ -537,9 +514,6 @@ var py = Event.pointerY(ev); var pos = Position.cumulativeOffset(this.inputs.background); var y = this.truncate(py - pos[1],0,255); var h = (255-y)/255; -var current_h = this.truncate(this.inputs.H.value,0,360); -current_h = current_h == 0 ? 360 : current_h; -if(current_h == parseInt(h*360)) return; var s = parseInt(this.inputs.S.value)/100; var b = parseInt(this.inputs.V.value)/100; var color = new Rico.Color(); diff --git a/framework/Web/Javascripts/js/datepicker.js b/framework/Web/Javascripts/js/datepicker.js index 19d39bbe..e82507ea 100644 --- a/framework/Web/Javascripts/js/datepicker.js +++ b/framework/Web/Javascripts/js/datepicker.js @@ -1,41 +1,10 @@ Prado.WebUI.TDatePicker = Class.create(); -Object.extend(Prado.WebUI.TDatePicker, -{ -getDropDownDate : function(control) -{ -var now=new Date(); -var year=now.getFullYear(); -var month=now.getMonth(); -var day=1; -var month_list = this.getMonthListControl(control); - var day_list = this.getDayListControl(control); - var year_list = this.getYearListControl(control); -var day = day_list ? $F(day_list) : 1; -var month = month_list ? $F(month_list) : now.getMonth(); -var year = year_list ? $F(year_list) : now.getFullYear(); -return new Date(year,month,day, 0, 0, 0); -}, -getYearListControl : function(control) -{ -return $(control.id+"_year"); -}, -getMonthListControl : function(control) -{ -return $(control.id+"_month"); -}, -getDayListControl : function(control) -{ -return $(control.id+"_day"); -} -}); Prado.WebUI.TDatePicker.prototype = { MonthNames : ["January","February","March","April", "May","June","July","August", "September","October","November","December" ], -AbbreviatedMonthNames : ["Jan", "Feb", "Mar", "Apr", "May", -"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ShortWeekDayNames : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], Format : "yyyy-MM-dd", FirstDayOfWeek : 1, @@ -169,7 +138,7 @@ this._calDiv.appendChild(div); var todayButton = document.createElement("button"); todayButton.className = "todayButton"; var today = this.newDate(); -var buttonText = today.SimpleFormat(this.Format,this); +var buttonText = today.SimpleFormat(this.Format); todayButton.appendChild(document.createTextNode(buttonText)); div.appendChild(todayButton); if(Prado.Browser().ie) @@ -323,27 +292,20 @@ var m = d.getMonth() + n; this.setMonth(m); return false; }, -onChange : function() +onchange : function() { if(this.options.InputMode == "TextBox") -{ this.control.value = this.formatDate(); -Event.fireEvent(this.control, "change"); -} else { -var day = Prado.WebUI.TDatePicker.getDayListControl(this.control); -var month = Prado.WebUI.TDatePicker.getMonthListControl(this.control); -var year = Prado.WebUI.TDatePicker.getYearListControl(this.control); +var day = $(this.options.ID+"_day"); +var month = $(this.options.ID+"_month"); +var year = $(this.options.ID+"_year"); var date = this.selectedDate; if(day) -{ day.selectedIndex = date.getDate()-1; -} if(month) -{ month.selectedIndex = date.getMonth(); -} if(year) { var years = year.options; @@ -351,18 +313,17 @@ var currentYear = date.getFullYear(); for(var i = 0; i < years.length; i++) years[i].selected = years[i].value.toInteger() == currentYear; } -Event.fireEvent(day || month || year, "change"); } }, formatDate : function() { -return this.selectedDate ? this.selectedDate.SimpleFormat(this.Format,this) : ''; +return this.selectedDate ? this.selectedDate.SimpleFormat(this.Format) : ''; }, newDate : function(date) { if(!date) date = new Date(); -if(typeof(date) == "string" || typeof(date) == "number") +if(isString(date)|| isNumber(date)) date = new Date(date); return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0,0,0); }, @@ -373,8 +334,8 @@ return; this.selectedDate = this.newDate(date); this.updateHeader(); this.update(); -if (typeof(this.onChange) == "function") -this.onChange(); +if (isFunction(this.onchange)) +this.onchange(); }, getElement : function() { @@ -382,7 +343,7 @@ return this._calDiv; }, getSelectedDate : function () { -return this.selectedDate == null ? null : this.newDate(this.selectedDate); +return isNull(this.selectedDate) ? null : this.newDate(this.selectedDate); }, setYear : function(year) { @@ -413,9 +374,8 @@ if(this.options.InputMode == "TextBox") pos[1] += this.control.offsetHeight; else { -var dayList = Prado.WebUI.TDatePicker.getDayListControl(this.control); -if(dayList) -pos[1] += dayList.offsetHeight-1; +if($(this.options.ID+"_day")) +pos[1] += $(this.options.ID+"_day").offsetHeight-1; } this._calDiv.style.display = "block"; this._calDiv.style.top = (pos[1]-1) + "px"; @@ -425,7 +385,7 @@ this.documentClickEvent = this.hideOnClick.bindEvent(this); this.documentKeyDownEvent = this.keyPressed.bindEvent(this); Event.observe(document.body, "click", this.documentClickEvent); var date = this.getDateFromInput(); -if(date) +if(!isNull(date)) { this.selectedDate = date; this.setSelectedDate(date); @@ -439,7 +399,20 @@ getDateFromInput : function() if(this.options.InputMode == "TextBox") return Date.SimpleParse($F(this.control), this.Format); else -return Prado.WebUI.TDatePicker.getDropDownDate(this.control); +{ +var now=new Date(); +var year=now.getFullYear(); +var month=now.getMonth(); +var date=1; +if($(this.options.ID+"_day")) +day = $F(this.options.ID+"_day"); +if($(this.options.ID+"_month")) +month = $F(this.options.ID+"_month"); +if($(this.options.ID+"_year")) +year = $F(this.options.ID+"_year"); +var newdate=new Date(year,month,day, 0, 0, 0); +return newdate; +} }, hideOnClick : function(ev) { @@ -511,10 +484,7 @@ this.dateSlot[index].data.parentNode.className = "empty"; }, hover : function(ev) { -if(ev.type == "mouseover") -Event.element(ev).addClassName("hover"); -else -Event.element(ev).removeClassName("hover"); +Element.condClassName(Event.element(ev), "hover", ev.type=="mouseover"); }, updateHeader : function () { var options = this._monthSelect.options; diff --git a/framework/Web/Javascripts/js/prado.js b/framework/Web/Javascripts/js/prado.js index c7145188..6737d4ce 100644 --- a/framework/Web/Javascripts/js/prado.js +++ b/framework/Web/Javascripts/js/prado.js @@ -1299,10 +1299,9 @@ element.dispatchEvent(event); else if(element.fireEvent) { element.fireEvent('on'+type); -if(element[type]) element[type](); } -else if(element[type]) +else element[type](); } }); @@ -1869,9 +1868,9 @@ lastFocus.value = options['EventTarget']; } $('PRADO_POSTBACK_TARGET').value = options['EventTarget']; $('PRADO_POSTBACK_PARAMETER').value = options['EventParameter']; +Event.fireEvent(form,"submit"); if(options['StopEvent']) Event.stop(event); -Event.fireEvent(form,"submit"); } Prado.Element = { diff --git a/framework/Web/Javascripts/js/validator.js b/framework/Web/Javascripts/js/validator.js index 38d8a2a4..7d343d87 100644 --- a/framework/Web/Javascripts/js/validator.js +++ b/framework/Web/Javascripts/js/validator.js @@ -26,7 +26,6 @@ if(this.managers[formID]) this.managers[formID].addValidator(validator); else throw new Error("A validation manager for form '"+formID+"' needs to be created first."); -return this.managers[formID]; }, addSummary : function(formID, validator) { @@ -34,11 +33,9 @@ if(this.managers[formID]) this.managers[formID].addSummary(validator); else throw new Error("A validation manager for form '"+formID+"' needs to be created first."); -return this.managers[formID]; } }); -Prado.ValidationManager = Class.create(); -Prado.ValidationManager.prototype = +Prado.Validation.prototype = { validators : [], summaries : [], @@ -59,12 +56,13 @@ return this._validateNonGroup(); _validateGroup: function(groupID) { var valid = true; +var manager = this; if(this.groups.include(groupID)) { this.validators.each(function(validator) { if(validator.group == groupID) -valid = valid & validator.validate(); +valid = valid & validator.validate(manager); else validator.hide(); }); @@ -75,10 +73,11 @@ return valid; _validateNonGroup : function() { var valid = true; +var manager = this; this.validators.each(function(validator) { if(!validator.group) -valid = valid & validator.validate(); +valid = valid & validator.validate(manager); else validator.hide(); }); @@ -272,9 +271,8 @@ enabled : true, visible : false, isValid : true, options : {}, -_isObserving : {}, +_isObserving : false, group : null, -manager : null, initialize : function(options) { options.OnValidate = options.OnValidate || Prototype.emptyFunction; @@ -284,7 +282,7 @@ this.options = options; this.control = $(options.ControlToValidate); this.message = $(options.ID); this.group = options.ValidationGroup; -this.manager = Prado.Validation.addValidator(options.FormID, this); +Prado.Validation.addValidator(options.FormID, this); }, getErrorMessage : function() { @@ -298,7 +296,6 @@ if(this.options.Display == "Dynamic") this.isValid ? this.message.hide() : this.message.show(); this.message.style.visibility = this.isValid ? "hidden" : "visible"; } -if(this.control) this.updateControlCssClass(this.control, this.isValid); if(this.options.FocusOnError && !this.isValid) Prado.Element.focus(this.options.FocusElementID); @@ -321,36 +318,33 @@ this.isValid = true; this.updateControl(); this.visible = false; }, -validate : function() +validate : function(manager) { if(this.enabled) -this.isValid = this.evaluateIsValid(); -this.options.OnValidate(this); +this.isValid = this.evaluateIsValid(manager); +this.options.OnValidate(this, manager); this.updateControl(); if(this.isValid) -this.options.OnSuccess(this); +this.options.OnSuccess(this, manager); else -this.options.OnError(this); -this.observeChanges(this.control); +this.options.OnError(this, manager); +this.observeChanges(manager); return this.isValid; }, -observeChanges : function(control) +observeChanges : function(manager) { -if(!control) return; -var canObserveChanges = this.options.ObserveChanges != false; -var currentlyObserving = this._isObserving[control.id+this.options.ID]; -if(canObserveChanges && !currentlyObserving) +if(this.options.ObserveChanges != false && !this._isObserving) { var validator = this; -Event.observe(control, 'change', function() +Event.observe(this.control, 'change', function() { if(validator.visible) { -validator.validate(); -validator.manager.updateSummary(validator.group); +validator.validate(manager); +manager.updateSummary(validator.group); } }); -this._isObserving[control.id+this.options.ID] = true; +this._isObserving = true; } }, trim : function(value) @@ -360,7 +354,7 @@ return typeof(value) == "string" ? value.trim() : ""; convert : function(dataType, value) { if(typeof(value) == "undefined") -value = this.getValidationValue(); +value = $F(this.control); var string = new String(value); switch(dataType) { @@ -369,116 +363,18 @@ return string.toInteger(); case "Double" : case "Float" : return string.toDouble(this.options.DecimalChar); +case "Currency" : +return string.toCurrency(this.options.GroupChar, this.options.Digits, this.options.DecimalChar); case "Date": -if(typeof(value) != "string") -return value; -else -{ var value = string.toDate(this.options.DateFormat); if(value && typeof(value.getTime) == "function") return value.getTime(); else return null; -} case "String": return string.toString(); } return value; -}, -getValidationValue : function(control) - { - if(!control) - control = this.control - switch(this.options.ControlType) - { - case 'TDatePicker': - if(control.type == "text") - return this.trim($F(control)); - else - { - this.observeDatePickerChanges(); -return Prado.WebUI.TDatePicker.getDropDownDate(control).getTime(); - } - default: - if(this.isListControlType()) - return this.getFirstSelectedListValue(); - else - return this.trim($F(control)); - } - }, -observeDatePickerChanges : function() - { - if(Prado.Browser().ie) - { - var DatePicker = Prado.WebUI.TDatePicker; - this.observeChanges(DatePicker.getDayListControl(this.control)); -this.observeChanges(DatePicker.getMonthListControl(this.control)); -this.observeChanges(DatePicker.getYearListControl(this.control)); - } - }, -getSelectedValuesAndChecks : function(elements, initialValue) -{ -var checked = 0; -var values = []; -var isSelected = this.isCheckBoxType(elements[0]) ? 'checked' : 'selected'; -elements.each(function(element) -{ -if(element[isSelected] && element.value != initialValue) -{ -checked++; -values.push(element.value); -} -}); -return {'checks' : checked, 'values' : values}; -}, -getListElements : function() -{ -switch(this.options.ControlType) -{ -case 'TCheckBoxList': case 'TRadioButtonList': -var elements = []; -for(var i = 0; i < this.options.TotalItems; i++) -{ -var element = $(this.options.ControlToValidate+"_"+i); -if(this.isCheckBoxType(element)) -elements.push(element); -} -return elements; -case 'TListBox': -var elements = []; -var element = $(this.options.ControlToValidate); -if(element && (type = element.type.toLowerCase())) -{ -if(type == "select-one" || type == "select-multiple") -elements = $A(element.options); -} -return elements; -default: -return []; -} -}, -isCheckBoxType : function(element) -{ -if(element && element.type) -{ -var type = element.type.toLowerCase(); -return type == "checkbox" || type == "radio"; -} -return false; -}, -isListControlType : function() -{ -var list = ['TCheckBoxList', 'TRadioButtonList', 'TListBox']; -return list.include(this.options.ControlType); -}, -getFirstSelectedListValue : function() -{ -var initial = ""; -if(typeof(this.options.InitialValue) != "undefined") -initial = this.options.InitialValue; -var elements = this.getListElements(); -var selection = this.getSelectedValuesAndChecks(elements, initial); -return selection.values.length > 0 ? selection.values[0] : initial; } } Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator, @@ -492,7 +388,7 @@ return true; } else { -var a = this.getValidationValue(); +var a = this.trim($F(this.control)); var b = this.trim(this.options.InitialValue); return(a != b); } @@ -500,24 +396,41 @@ return(a != b); }); Prado.WebUI.TCompareValidator = Class.extend(Prado.WebUI.TBaseValidator, { -evaluateIsValid : function() +_observingComparee : false, +evaluateIsValid : function(manager) { -var value = this.getValidationValue(); +var value = this.trim($F(this.control)); if (value.length <= 0) return true; var comparee = $(this.options.ControlToCompare); if(comparee) -var compareTo = this.getValidationValue(comparee); +var compareTo = this.trim($F(comparee)); else var compareTo = this.options.ValueToCompare || ""; var isValid =this.compare(value, compareTo); if(comparee) { this.updateControlCssClass(comparee, isValid); -this.observeChanges(comparee); +this.observeComparee(comparee, manager); } return isValid; }, +observeComparee : function(comparee, manager) +{ +if(this.options.ObserveChanges != false && !this._observingComparee) +{ +var validator = this; +Event.observe(comparee, "change", function() +{ +if(validator.visible) +{ +validator.validate(manager); +manager.updateSummary(validator.group); +} +}); +this._observingComparee = true; +} +}, compare : function(operand1, operand2) { var op1, op2; @@ -544,9 +457,9 @@ return (op1 == op2); }); Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator, { -evaluateIsValid : function() +evaluateIsValid : function(manager) { -var value = this.getValidationValue(); +var value = $F(this.control); var clientFunction = this.options.ClientValidationFunction; if(typeof(clientFunction) == "string" && clientFunction.length > 0) { @@ -558,9 +471,9 @@ return true; }); Prado.WebUI.TRangeValidator = Class.extend(Prado.WebUI.TBaseValidator, { -evaluateIsValid : function() +evaluateIsValid : function(manager) { -var value = this.getValidationValue(); +var value = this.trim($F(this.control)); if(value.length <= 0) return true; if(typeof(this.options.DataType) == "undefined") @@ -568,6 +481,7 @@ this.options.DataType = "String"; var min = this.convert(this.options.DataType, this.options.MinValue || null); var max = this.convert(this.options.DataType, this.options.MaxValue || null); value = this.convert(this.options.DataType, value); +Logger.warn(min+" <= "+value+" <= "+max); if(value == null) return false; var valid = true; @@ -580,9 +494,9 @@ return valid; }); Prado.WebUI.TRegularExpressionValidator = Class.extend(Prado.WebUI.TBaseValidator, { -evaluateIsValid : function() +evaluateIsValid : function(master) { -var value = this.getValidationValue(); +var value = this.trim($F(this.control)); if (value.length <= 0) return true; var rx = new RegExp(this.options.ValidationExpression); @@ -591,52 +505,3 @@ return (matches != null && value == matches[0]); } }); Prado.WebUI.TEmailAddressValidator = Prado.WebUI.TRegularExpressionValidator; -Prado.WebUI.TListControlValidator = Class.extend(Prado.WebUI.TBaseValidator, -{ -evaluateIsValid : function() -{ -var elements = this.getListElements(); -if(elements && elements.length <= 0) -return true; -this.observeListElements(elements); -var selection = this.getSelectedValuesAndChecks(elements); -return this.isValidList(selection.checks, selection.values); -}, -observeListElements : function(elements) - { -if(Prado.Browser().ie && this.isCheckBoxType(elements[0])) -{ -var validator = this; -elements.each(function(element) -{ -validator.observeChanges(element); -}); -} - }, -isValidList : function(checked, values) -{ -var exists = true; -var required = this.getRequiredValues(); -if(required.length > 0) -{ -if(values.length < required.length) -return false; -required.each(function(requiredValue) -{ -exists = exists && values.include(requiredValue); -}); -} -var min = typeof(this.options.Min) == "undefined" ? -Number.NEGATIVE_INFINITY : this.options.Min; -var max = typeof(this.options.Max) == "undefined" ? -Number.POSITIVE_INFINITY : this.options.Max; -return exists && checked >= min && checked <= max; -}, -getRequiredValues : function() -{ -var required = []; -if(this.options.Required && this.options.Required.length > 0) -required = this.options.Required.split(/,\s*/); -return required; -} -}); diff --git a/framework/Web/Javascripts/prado/form.js b/framework/Web/Javascripts/prado/form.js index 2beb945b..addad893 100644 --- a/framework/Web/Javascripts/prado/form.js +++ b/framework/Web/Javascripts/prado/form.js @@ -129,9 +129,9 @@ Prado.PostBack = function(event,options) $('PRADO_POSTBACK_TARGET').value = options['EventTarget']; $('PRADO_POSTBACK_PARAMETER').value = options['EventParameter']; + Event.fireEvent(form,"submit"); if(options['StopEvent']) Event.stop(event); - Event.fireEvent(form,"submit"); } /* diff --git a/framework/Web/Javascripts/prado/validation3.js b/framework/Web/Javascripts/prado/validation3.js index 4c189532..10169aab 100644 --- a/framework/Web/Javascripts/prado/validation3.js +++ b/framework/Web/Javascripts/prado/validation3.js @@ -1,58 +1,6 @@ /** - * Prado client-side javascript validation fascade. - * - * There are 4 basic classes, Validation, ValidationManager, ValidationSummary - * and TBaseValidator, that interact together to perform validation. - * The Prado.Validation class co-ordinates together the - * validation scheme and is responsible for maintaining references - * to ValidationManagers. - * - * The ValidationManager class is responsible for maintaining refereneces - * to individual validators, validation summaries and their associated - * groupings. - * - * The ValidationSummary take cares of display the validator error messages - * as html output or an alert output. - * - * The TBaseValidator is the base class for all validators and contains - * methods to interact with the actual inputs, data type conversion. - * - * An instance of ValidationManager must be instantiated first for a - * particular form before instantiating validators and summaries. - * - * Usage example: adding a required field to a text box input with - * ID "input1" in a form with ID "form1". - * - * - * - *
- *
- * - * - * - * - *
- *
- *
+ * Prado client-side javascript validation manager. */ Prado.Validation = Class.create(); @@ -106,7 +54,6 @@ Object.extend(Prado.Validation, * Add a new validator to a particular form. * @param string the form that the validator belongs. * @param object a validator - * @return object the manager */ addValidator : function(formID, validator) { @@ -114,14 +61,12 @@ Object.extend(Prado.Validation, this.managers[formID].addValidator(validator); else throw new Error("A validation manager for form '"+formID+"' needs to be created first."); - return this.managers[formID]; }, /** * Add a new validation summary. * @param string the form that the validation summary belongs. * @param object a validation summary - * @return object manager */ addSummary : function(formID, validator) { @@ -129,19 +74,14 @@ Object.extend(Prado.Validation, this.managers[formID].addSummary(validator); else throw new Error("A validation manager for form '"+formID+"' needs to be created first."); - return this.managers[formID]; } }); -Prado.ValidationManager = Class.create(); /** * Validation manager instances. Manages validators for a particular - * HTML form. The manager contains references to all the validators - * summaries, and their groupings for a particular form. - * Generally, Prado.Validation methods should be called rather - * than calling directly the ValidationManager. + * HTML form. */ -Prado.ValidationManager.prototype = +Prado.Validation.prototype = { validators : [], // list of validators summaries : [], // validation summaries @@ -180,12 +120,13 @@ Prado.ValidationManager.prototype = _validateGroup: function(groupID) { var valid = true; + var manager = this; if(this.groups.include(groupID)) { this.validators.each(function(validator) { if(validator.group == groupID) - valid = valid & validator.validate(); + valid = valid & validator.validate(manager); else validator.hide(); }); @@ -201,10 +142,11 @@ Prado.ValidationManager.prototype = _validateNonGroup : function() { var valid = true; + var manager = this; this.validators.each(function(validator) { if(!validator.group) - valid = valid & validator.validate(); + valid = valid & validator.validate(manager); else validator.hide(); }); @@ -520,9 +462,8 @@ Prado.WebUI.TBaseValidator.prototype = visible : false, isValid : true, options : {}, - _isObserving : {}, + _isObserving : false, group : null, - manager : null, /** * @@ -552,7 +493,7 @@ Prado.WebUI.TBaseValidator.prototype = this.message = $(options.ID); this.group = options.ValidationGroup; - this.manager = Prado.Validation.addValidator(options.FormID, this); + Prado.Validation.addValidator(options.FormID, this); }, /** @@ -577,8 +518,7 @@ Prado.WebUI.TBaseValidator.prototype = this.message.style.visibility = this.isValid ? "hidden" : "visible"; } - if(this.control) - this.updateControlCssClass(this.control, this.isValid); + this.updateControlCssClass(this.control, this.isValid); if(this.options.FocusOnError && !this.isValid) Prado.Element.focus(this.options.FocusElementID); @@ -617,23 +557,24 @@ Prado.WebUI.TBaseValidator.prototype = /** * Calls evaluateIsValid() function to set the value of isValid property. * Triggers onValidate event and onSuccess or onError event. + * @param Validation manager * @return boolean true if valid. */ - validate : function() + validate : function(manager) { if(this.enabled) - this.isValid = this.evaluateIsValid(); + this.isValid = this.evaluateIsValid(manager); - this.options.OnValidate(this); + this.options.OnValidate(this, manager); this.updateControl(); if(this.isValid) - this.options.OnSuccess(this); + this.options.OnSuccess(this, manager); else - this.options.OnError(this); - - this.observeChanges(this.control); + this.options.OnError(this, manager); + + this.observeChanges(manager); return this.isValid; }, @@ -641,28 +582,21 @@ Prado.WebUI.TBaseValidator.prototype = /** * Observe changes to the control input, re-validate upon change. If * the validator is not visible, no updates are propagated. - * @param HTMLElement control to observe changes */ - observeChanges : function(control) + observeChanges : function(manager) { - if(!control) return; - - var canObserveChanges = this.options.ObserveChanges != false; - var currentlyObserving = this._isObserving[control.id+this.options.ID]; - - if(canObserveChanges && !currentlyObserving) + if(this.options.ObserveChanges != false && !this._isObserving) { var validator = this; - - Event.observe(control, 'change', function() + Event.observe(this.control, 'change', function() { if(validator.visible) { - validator.validate(); - validator.manager.updateSummary(validator.group); + validator.validate(manager); + manager.updateSummary(validator.group); } }); - this._isObserving[control.id+this.options.ID] = true; + this._isObserving = true; } }, @@ -676,14 +610,14 @@ Prado.WebUI.TBaseValidator.prototype = /** * Convert the value to a specific data type. - * @param {string} the data type, "Integer", "Double", "Date" or "String" + * @param {string} the data type, "Integer", "Double", "Currency", "Date" or "String" * @param {string} the value to convert. * @type {mixed|null} the converted data value. */ convert : function(dataType, value) { if(typeof(value) == "undefined") - value = this.getValidationValue(); + value = $F(this.control); var string = new String(value); switch(dataType) { @@ -692,149 +626,18 @@ Prado.WebUI.TBaseValidator.prototype = case "Double" : case "Float" : return string.toDouble(this.options.DecimalChar); + case "Currency" : + return string.toCurrency(this.options.GroupChar, this.options.Digits, this.options.DecimalChar); case "Date": - if(typeof(value) != "string") - return value; + var value = string.toDate(this.options.DateFormat); + if(value && typeof(value.getTime) == "function") + return value.getTime(); else - { - var value = string.toDate(this.options.DateFormat); - if(value && typeof(value.getTime) == "function") - return value.getTime(); - else - return null; - } + return null; case "String": return string.toString(); } return value; - }, - - /** - * @return mixed control value to validate - */ - getValidationValue : function(control) - { - if(!control) - control = this.control - switch(this.options.ControlType) - { - case 'TDatePicker': - if(control.type == "text") - return this.trim($F(control)); - else - { - this.observeDatePickerChanges(); - - return Prado.WebUI.TDatePicker.getDropDownDate(control).getTime(); - } - default: - if(this.isListControlType()) - return this.getFirstSelectedListValue(); - else - return this.trim($F(control)); - } - }, - - /** - * Observe changes in the drop down list date picker, IE only. - */ - observeDatePickerChanges : function() - { - if(Prado.Browser().ie) - { - var DatePicker = Prado.WebUI.TDatePicker; - this.observeChanges(DatePicker.getDayListControl(this.control)); - this.observeChanges(DatePicker.getMonthListControl(this.control)); - this.observeChanges(DatePicker.getYearListControl(this.control)); - } - }, - - /** - * Gets numeber selections and their values. - * @return object returns selected values in values property - * and number of selections in checks property. - */ - getSelectedValuesAndChecks : function(elements, initialValue) - { - var checked = 0; - var values = []; - var isSelected = this.isCheckBoxType(elements[0]) ? 'checked' : 'selected'; - elements.each(function(element) - { - if(element[isSelected] && element.value != initialValue) - { - checked++; - values.push(element.value); - } - }); - return {'checks' : checked, 'values' : values}; - }, - - /** - * Gets an array of the list control item input elements, for TCheckBoxList - * checkbox inputs are returned, for TListBox HTML option elements are returned. - * @return array list control option elements. - */ - getListElements : function() - { - switch(this.options.ControlType) - { - case 'TCheckBoxList': case 'TRadioButtonList': - var elements = []; - for(var i = 0; i < this.options.TotalItems; i++) - { - var element = $(this.options.ControlToValidate+"_"+i); - if(this.isCheckBoxType(element)) - elements.push(element); - } - return elements; - case 'TListBox': - var elements = []; - var element = $(this.options.ControlToValidate); - if(element && (type = element.type.toLowerCase())) - { - if(type == "select-one" || type == "select-multiple") - elements = $A(element.options); - } - return elements; - default: - return []; - } - }, - - /** - * @return boolean true if element is of checkbox or radio type. - */ - isCheckBoxType : function(element) - { - if(element && element.type) - { - var type = element.type.toLowerCase(); - return type == "checkbox" || type == "radio"; - } - return false; - }, - - /** - * @return boolean true if control to validate is of some of the TListControl type. - */ - isListControlType : function() - { - var list = ['TCheckBoxList', 'TRadioButtonList', 'TListBox']; - return list.include(this.options.ControlType); - }, - - /** - * @return string gets the first selected list value, initial value if none found. - */ - getFirstSelectedListValue : function() - { - var initial = ""; - if(typeof(this.options.InitialValue) != "undefined") - initial = this.options.InitialValue; - var elements = this.getListElements(); - var selection = this.getSelectedValuesAndChecks(elements, initial); - return selection.values.length > 0 ? selection.values[0] : initial; } } @@ -861,7 +664,7 @@ Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator, } else { - var a = this.getValidationValue(); + var a = this.trim($F(this.control)); var b = this.trim(this.options.InitialValue); return(a != b); } @@ -883,6 +686,7 @@ Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator, * type before the comparison operation is performed. The following value types are supported: * - Integer A 32-bit signed integer data type. * - Float A double-precision floating point number data type. + * - Currency A decimal data type that can contain currency symbols. * - Date A date data type. The format can be by the DateFormat option. * - String A string data type. * @@ -899,34 +703,56 @@ Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator, */ Prado.WebUI.TCompareValidator = Class.extend(Prado.WebUI.TBaseValidator, { - //_observingComparee : false, + _observingComparee : false, /** * Compares the input to another input or a given value. */ - evaluateIsValid : function() + evaluateIsValid : function(manager) { - var value = this.getValidationValue(); + var value = this.trim($F(this.control)); if (value.length <= 0) return true; var comparee = $(this.options.ControlToCompare); if(comparee) - var compareTo = this.getValidationValue(comparee); + var compareTo = this.trim($F(comparee)); else - var compareTo = this.options.ValueToCompare || ""; + var compareTo = this.options.ValueToCompare || ""; var isValid = this.compare(value, compareTo); if(comparee) { this.updateControlCssClass(comparee, isValid); - this.observeChanges(comparee); + this.observeComparee(comparee, manager); } return isValid; }, + /** + * Observe the comparee input element for changes. + * @param object HTML input element to observe + * @param object Validation manager. + */ + observeComparee : function(comparee, manager) + { + if(this.options.ObserveChanges != false && !this._observingComparee) + { + var validator = this; + Event.observe(comparee, "change", function() + { + if(validator.visible) + { + validator.validate(manager); + manager.updateSummary(validator.group); + } + }); + this._observingComparee = true; + } + }, + /** * Compares two values, their values are casted to type defined * by DataType option. False is returned if the first @@ -990,9 +816,9 @@ Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator, /** * Calls custom validation function. */ - evaluateIsValid : function() + evaluateIsValid : function(manager) { - var value = this.getValidationValue(); + var value = $F(this.control); var clientFunction = this.options.ClientValidationFunction; if(typeof(clientFunction) == "string" && clientFunction.length > 0) { @@ -1014,6 +840,7 @@ Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator, * operation is performed. The following value types are supported: * - Integer A 32-bit signed integer data type. * - Float A double-precision floating point number data type. + * - Currency A decimal data type that can contain currency symbols. * - Date A date data type. The date format can be specified by * setting DateFormat option, which must be recognizable * by Date.SimpleParse javascript function. @@ -1029,11 +856,11 @@ Prado.WebUI.TRangeValidator = Class.extend(Prado.WebUI.TBaseValidator, { /** * Compares the input value with a minimum and/or maximum value. - * @return boolean true if the value is empty, returns false if conversion fails. + * Returns true if the value is empty, returns false if conversion fails. */ - evaluateIsValid : function() + evaluateIsValid : function(manager) { - var value = this.getValidationValue(); + var value = this.trim($F(this.control)); if(value.length <= 0) return true; if(typeof(this.options.DataType) == "undefined") @@ -1043,6 +870,8 @@ Prado.WebUI.TRangeValidator = Class.extend(Prado.WebUI.TBaseValidator, var max = this.convert(this.options.DataType, this.options.MaxValue || null); value = this.convert(this.options.DataType, value); + Logger.warn(min+" <= "+value+" <= "+max); + if(value == null) return false; @@ -1068,9 +897,9 @@ Prado.WebUI.TRegularExpressionValidator = Class.extend(Prado.WebUI.TBaseValidato /** * Compare the control input against a regular expression. */ - evaluateIsValid : function() + evaluateIsValid : function(master) { - var value = this.getValidationValue(); + var value = this.trim($F(this.control)); if (value.length <= 0) return true; @@ -1087,84 +916,3 @@ Prado.WebUI.TRegularExpressionValidator = Class.extend(Prado.WebUI.TBaseValidato Prado.WebUI.TEmailAddressValidator = Prado.WebUI.TRegularExpressionValidator; -/** - * TListControlValidator checks the number of selection and their values - * for a TListControl that allows multiple selections. - */ -Prado.WebUI.TListControlValidator = Class.extend(Prado.WebUI.TBaseValidator, -{ - /** - * @return true if the number of selections and/or their values - * match the requirements. - */ - evaluateIsValid : function() - { - var elements = this.getListElements(); - if(elements && elements.length <= 0) - return true; - - this.observeListElements(elements); - - var selection = this.getSelectedValuesAndChecks(elements); - return this.isValidList(selection.checks, selection.values); - }, - - /** - * Observe list elements for IE browsers of changes - */ - observeListElements : function(elements) - { - if(Prado.Browser().ie && this.isCheckBoxType(elements[0])) - { - var validator = this; - elements.each(function(element) - { - validator.observeChanges(element); - }); - } - }, - - /** - * Determine if the number of checked and the checked values - * satisfy the required number of checks and/or the checked values - * equal to the required values. - * @return boolean true if checked values and number of checks are satisfied. - */ - isValidList : function(checked, values) - { - var exists = true; - - //check the required values - var required = this.getRequiredValues(); - if(required.length > 0) - { - if(values.length < required.length) - return false; - required.each(function(requiredValue) - { - exists = exists && values.include(requiredValue); - }); - } - - var min = typeof(this.options.Min) == "undefined" ? - Number.NEGATIVE_INFINITY : this.options.Min; - var max = typeof(this.options.Max) == "undefined" ? - Number.POSITIVE_INFINITY : this.options.Max; - return exists && checked >= min && checked <= max; - }, - - /** - * @return array list of required options that must be selected. - */ - getRequiredValues : function() - { - var required = []; - if(this.options.Required && this.options.Required.length > 0) - required = this.options.Required.split(/,\s*/); - return required; - } -}); - - - - diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php index adbc85ae..c5b5e7a5 100644 --- a/framework/Web/UI/WebControls/TBaseValidator.php +++ b/framework/Web/UI/WebControls/TBaseValidator.php @@ -131,7 +131,6 @@ abstract class TBaseValidator extends TLabel implements IValidator */ protected function getClientScriptOptions() { - $control = $this->getValidationTarget(); $options['ID'] = $this->getClientID(); $options['FormID'] = $this->getPage()->getForm()->getClientID(); $options['Display'] = $this->getDisplay(); @@ -142,9 +141,8 @@ abstract class TBaseValidator extends TLabel implements IValidator $options['FocusElementID'] = $this->getFocusElementID(); } $options['ValidationGroup'] = $this->getValidationGroup(); - $options['ControlToValidate'] = $control->getClientID(); + $options['ControlToValidate'] = $this->getValidationTarget()->getClientID(); $options['ControlCssClass'] = $this->getControlCssClass(); - $options['ControlType'] = get_class($control); return $options; } @@ -165,7 +163,7 @@ abstract class TBaseValidator extends TLabel implements IValidator $manager['FormID'] = $formID; $options = TJavaScript::encode($manager); $scripts->registerPradoScript('validator'); - $scripts->registerEndScript($scriptKey, "new Prado.ValidationManager({$options});"); + $scripts->registerEndScript($scriptKey, "new Prado.Validation({$options});"); } if($this->getEnableClientScript()) $this->registerClientScriptValidator(); diff --git a/framework/Web/UI/WebControls/TCheckBox.php b/framework/Web/UI/WebControls/TCheckBox.php index 681c8748..ff7f57f7 100644 --- a/framework/Web/UI/WebControls/TCheckBox.php +++ b/framework/Web/UI/WebControls/TCheckBox.php @@ -340,7 +340,7 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl if($clientID!=='') $writer->addAttribute('id',$clientID); $writer->addAttribute('type','checkbox'); - if(($value = $this->getValueAttribute()) !== '') + if(($value=$this->getValueAttribute())!=='') $writer->addAttribute('value',$value); if(($uniqueID=$this->getUniqueID())!=='') $writer->addAttribute('name',$uniqueID); @@ -378,4 +378,4 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl } -?> +?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TCheckBoxList.php b/framework/Web/UI/WebControls/TCheckBoxList.php index de332897..2f0cce7c 100644 --- a/framework/Web/UI/WebControls/TCheckBoxList.php +++ b/framework/Web/UI/WebControls/TCheckBoxList.php @@ -47,7 +47,7 @@ Prado::using('System.Web.UI.WebControls.TCheckBox'); * @package System.Web.UI.WebControls * @since 3.0 */ -class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingContainer, IPostBackDataHandler, IValidatable +class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingContainer, IPostBackDataHandler { private $_repeatedControl; private $_isEnabled; @@ -381,16 +381,6 @@ class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingCont $this->setTabIndex($tabIndex); } } - - /** - * Returns the value to be validated. - * This methid is required by IValidatable interface. - * @return mixed the value of the property to be validated. - */ - public function getValidationPropertyValue() - { - return $this->getSelectedValue(); - } } ?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TCompareValidator.php b/framework/Web/UI/WebControls/TCompareValidator.php index b5ebd3ab..172e472f 100644 --- a/framework/Web/UI/WebControls/TCompareValidator.php +++ b/framework/Web/UI/WebControls/TCompareValidator.php @@ -31,6 +31,7 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * type before the comparison operation is performed. The following value types are supported: * - Integer A 32-bit signed integer data type. * - Float A double-precision floating point number data type. + * - Currency A decimal data type that can contain currency symbols. * - Date A date data type. The format can be specified by the * {@link setDateFormat DateFormat} property * - String A string data type. @@ -55,13 +56,12 @@ class TCompareValidator extends TBaseValidator } /** - * Sets the data type (Integer, Float, Date, String) that the values being - * compared are converted to before the comparison is made. + * Sets the data type (Integer, Float, Currency, Date, String) that the values being compared are converted to before the comparison is made. * @param string the data type */ public function setDataType($value) { - $this->setViewState('DataType',TPropertyValue::ensureEnum($value,'Integer','Float','Date','String'),'String'); + $this->setViewState('DataType',TPropertyValue::ensureEnum($value,'Integer','Float','Date','Currency','String'),'String'); } /** @@ -188,6 +188,16 @@ class TCompareValidator extends TBaseValidator return array(intval($value1), intval($value2)); case 'Float': return array(floatval($value1), floatval($value2)); + case 'Currency': + if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value1,$matches)) + $value1=floatval($matches[0]); + else + $value1=0; + if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value2,$matches)) + $value2=floatval($matches[0]); + else + $value2=0; + return array($value1, $value2); case 'Date': $dateFormat = $this->getDateFormat(); if($dateFormat!=='') diff --git a/framework/Web/UI/WebControls/TDataTypeValidator.php b/framework/Web/UI/WebControls/TDataTypeValidator.php index d78be7bf..81c23ce4 100644 --- a/framework/Web/UI/WebControls/TDataTypeValidator.php +++ b/framework/Web/UI/WebControls/TDataTypeValidator.php @@ -23,6 +23,7 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * The following data types are supported: * - Integer A 32-bit signed integer data type. * - Float A double-precision floating point number data type. + * - Currency A decimal data type that can contain currency symbols. * - Date A date data type. * - String A string data type. * For Date type, the property {@link setDateFormat DateFormat} @@ -45,13 +46,12 @@ class TDataTypeValidator extends TBaseValidator } /** - * Sets the data type (Integer, Float, Date, String) that the values being - * compared are converted to before the comparison is made. + * Sets the data type (Integer, Float, Currency, Date, String) that the values being compared are converted to before the comparison is made. * @param string the data type */ public function setDataType($value) { - $this->setViewState('DataType',TPropertyValue::ensureEnum($value,'Integer','Float','Date','String'),'String'); + $this->setViewState('DataType',TPropertyValue::ensureEnum($value,'Integer','Float','Date','Currency','String'),'String'); } /** @@ -85,6 +85,8 @@ class TDataTypeValidator extends TBaseValidator return preg_match('/^[-+]?[0-9]+$/',trim($value)); case 'Float': return preg_match('/^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value)); + case 'Currency': + return preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value)); case 'Date': $dateFormat = $this->getDateFormat(); if(strlen($dateFormat)) diff --git a/framework/Web/UI/WebControls/TDatePicker.php b/framework/Web/UI/WebControls/TDatePicker.php index 02386515..c6a2345b 100644 --- a/framework/Web/UI/WebControls/TDatePicker.php +++ b/framework/Web/UI/WebControls/TDatePicker.php @@ -245,16 +245,17 @@ class TDatePicker extends TTextBox /** * @return integer current selected date from the date picker as timestamp. */ - public function getTimeStamp() + public function getDate() { - return $this->getTimeStampFromText(); + $date = $this->getDateFromText(); + return $date[0]; } /** * Sets the date for the date picker using timestamp. * @param integer time stamp for the date picker */ - public function setTimeStamp($value) + public function setDate($value) { $date = TPropertyValue::ensureInteger($value); $formatter = Prado::createComponent('System.Util.TSimpleDateFormatter', @@ -262,34 +263,6 @@ class TDatePicker extends TTextBox $this->setText($formatter->format($date)); } - /** - * @return string the date string. - */ - public function getDate() - { - return $this->getText(); - } - - /** - * @param string date string - */ - public function setDate($value) - { - $this->setText($value); - } - - /** - * Returns the value to be validated. - * This methid is required by IValidatable interface. - * @return integer the value of the property to be validated. - */ - public function getValidationPropertyValue() - { - if($this->getText() === '') - return ''; - return $this->getTimeStamp(); - } - /** * Publish the date picker Css asset files. */ @@ -423,7 +396,6 @@ class TDatePicker extends TTextBox $date = $this->getLocalizedCalendarInfo(); $options['MonthNames'] = TJavaScript::encode($date->getMonthNames(),false); - $options['AbbreviatedMonthNames'] = TJavaScript::encode($date->getAbbreviatedMonthNames(),false); $options['ShortWeekDayNames'] = TJavaScript::encode($date->getAbbreviatedDayNames(),false); return $options; @@ -467,8 +439,7 @@ class TDatePicker extends TTextBox $writer->addAttribute('class', $class); $writer->renderBeginTag('span'); - $date = @getdate($this->getTimeStampFromText()); - + $date = $this->getDateFromText(); $this->renderCalendarSelections($writer, $date); //render a hidden input field @@ -510,9 +481,9 @@ class TDatePicker extends TTextBox /** * Gets the date from the text input using TSimpleDateFormatter - * @return integer current selected date timestamp + * @return array current selected date */ - protected function getTimeStampFromText() + protected function getDateFromText() { $pattern = $this->getDateFormat(); $pattern = str_replace(array('MMMM', 'MMM'), array('MM','MM'), $pattern); @@ -588,7 +559,7 @@ class TDatePicker extends TTextBox case 'MMM': case 'MM': return $info->getAbbreviatedMonthNames(); case 'M': - $array = array(); for($i=1;$i<=12;$i++) $array[$i-1] = $i; + $array = array(); for($i=1;$i<=12;$i++) $array[$i] = $i; return $array; default : return $info->getMonthNames(); } diff --git a/framework/Web/UI/WebControls/THtmlArea.php b/framework/Web/UI/WebControls/THtmlArea.php index 8e5fcd16..7e47d638 100644 --- a/framework/Web/UI/WebControls/THtmlArea.php +++ b/framework/Web/UI/WebControls/THtmlArea.php @@ -315,7 +315,7 @@ class THtmlArea extends TTextBox //default the variant to "en" if(count($variants) == 0) { - if(empty($culture)) + if($empty($culture)) return 'en'; $variants[] = strtolower($culture); } diff --git a/framework/Web/UI/WebControls/TListControlValidator.php b/framework/Web/UI/WebControls/TListControlValidator.php deleted file mode 100644 index 9264e891..00000000 --- a/framework/Web/UI/WebControls/TListControlValidator.php +++ /dev/null @@ -1,214 +0,0 @@ - - * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005 PradoSoft - * @license http://www.pradosoft.com/license/ - * @version $Revision: $ $Date: $ - * @package System.Web.UI.WebControls - */ - -/** - * Using TBaseValidator class - */ -Prado::using('System.Web.UI.WebControls.TBaseValidator'); - -/** - * TListControlValidator class. - * - * TListControlValidator checks the number of selection and their values - * for a TListControl that allows multiple selection. - * - * You can specify the minimum or maximum (or both) number of selections - * required using the {@link setMinSelection MinSelection} and - * {@link setMaxSelection MaxSelection} properties, respectively. In addition, - * you can specify a comma separated list of required selected values via the - * {@link setRequiredSelections RequiredSelections} property. - * - * Examples - * - At least two selections - * - * - * - * - * - * - * - * - * - * - "value1" must be selected and at least 1 other - * - * - * - * - * - * - * - * - * - * - * @author Xiang Wei Zhuo - * @version $Revision: $ $Date: $ - * @package System.Web.UI.WebControls - * @since 3.0 - */ -class TListControlValidator extends TBaseValidator -{ - /** - * @return int min number of selections - */ - function getMinSelection() - { - return $this->getViewState('MinSelection',''); - } - - /** - * @param int minimum number of selections. - */ - function setMinSelection($value) - { - $this->setViewState('MinSelection',$value,''); - } - - /** - * @return int max number of selections - */ - function getMaxSelection() - { - return $this->getViewState('MaxSelection',''); - } - - /** - * @param int max number of selections. - */ - function setMaxSelection($value) - { - $this->setViewState('MaxSelection',$value,''); - } - - /** - * Get a comma separated list of required selected values. - * @return string comma separated list of required values. - */ - function getRequiredSelections() - { - return $this->getViewState('RequiredSelections',''); - } - - /** - * Set the list of required values, using aa comma separated list. - * @param string comma separated list of required values. - */ - function setRequiredSelections($value) - { - $this->setViewState('RequiredSelections',$value,''); - } - - /** - * This method overrides the parent's implementation. - * The validation succeeds if the input component changes its data - * from the InitialValue or the input component is not given. - * @return boolean whether the validation succeeds - */ - public function evaluateIsValid() - { - $control=$this->getValidationTarget(); - - $exists = true; - list($count, $values) = $this->getSelection($control); - $required = $this->getRequiredValues(); - - //if required, check the values - if(!empty($required)) - { - if(count($values) < count($required) ) - return false; - foreach($required as $require) - $exists = $exists && in_array($require, $values); - } - - $min = $this->getMinSelection(); - $max = $this->getMaxSelection(); - - if($min !== '' && $max !=- '') - return $exists && $count >= intval($min) && $count <= intval($max); - else if($min === '' && $max !== '') - return $exists && $count <= intval($max); - else if($min !== '' && $max === '') - return $exists && $count >= intval($min); - } - - /** - * @param TListControl control to validate - * @return array number of selected values and its values. - */ - protected function getSelection($control) - { - $count = 0; - $values = array(); - - //get the data - foreach($control->getItems() as $item) - { - if($item->getSelected()) - { - $count++; - $values[] = $item->getValue(); - } - } - return array($count, $values); - } - - /** - * @return array list of required values. - */ - protected function getRequiredValues() - { - $required = array(); - $string = $this->getRequiredSelections(); - if(!empty($string)) - $required = preg_split('/,\s*/', $string); - return $required; - } - - /** - * Returns an array of javascript validator options. - * @return array javascript validator options. - */ - protected function getClientScriptOptions() - { - $options = parent::getClientScriptOptions(); - $control = $this->getValidationTarget(); - - if(!$control instanceof TListControl) - { - throw new TConfigurationException( - 'tlistcontrolvalidator_invalid_control', - $this->getID(),$this->getControlToValidate(), get_class($control)); - } - - $min = $this->getMinSelection(); - $max = $this->getMaxSelection(); - if($min !== '') - $options['Min']= intval($min); - if($max !== '') - $options['Max']= intval($max); - $required = $this->getRequiredSelections(); - if(strlen($required) > 0) - $options['Required']= $required; - $options['TotalItems'] = $control->getItemCount(); - - return $options; - } -} -?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TRadioButton.php b/framework/Web/UI/WebControls/TRadioButton.php index fd13e88c..9a523b55 100644 --- a/framework/Web/UI/WebControls/TRadioButton.php +++ b/framework/Web/UI/WebControls/TRadioButton.php @@ -101,14 +101,14 @@ class TRadioButton extends TCheckBox $this->setViewState('GroupName',$value,''); } -/* protected function getValueAttribute() + protected function getValueAttribute() { if(($value=parent::getValueAttribute())==='') return $this->getUniqueID(); else return $value; } -*/ + /** * @return string the name used to fetch radiobutton post data */ @@ -146,8 +146,7 @@ class TRadioButton extends TCheckBox $writer->addAttribute('id',$clientID); $writer->addAttribute('type','radio'); $writer->addAttribute('name',$this->getUniqueGroupName()); - if(($value = $this->getValueAttribute()) !== '') - $writer->addAttribute('value',$value); + $writer->addAttribute('value',$this->getValueAttribute()); if($this->getChecked()) $writer->addAttribute('checked','checked'); if(!$this->getEnabled(true)) diff --git a/framework/Web/UI/WebControls/TRangeValidator.php b/framework/Web/UI/WebControls/TRangeValidator.php index b7387522..56cc16bc 100644 --- a/framework/Web/UI/WebControls/TRangeValidator.php +++ b/framework/Web/UI/WebControls/TRangeValidator.php @@ -29,6 +29,7 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * operation is performed. The following value types are supported: * - Integer A 32-bit signed integer data type. * - Float A double-precision floating point number data type. + * - Currency A decimal data type that can contain currency symbols. * - Date A date data type. The date format can be specified by * setting {@link setDateFormat DateFormat} property, which must be recognizable * by {@link TSimpleDateFormatter}. If the property is not set, @@ -86,13 +87,13 @@ class TRangeValidator extends TBaseValidator } /** - * Sets the data type (Integer, Float, Date, String) that the values being - * compared are converted to before the comparison is made. + * Sets the data type (Integer, Float, Currency, Date, String) that the values + * being compared are converted to before the comparison is made. * @param string the data type */ public function setDataType($value) { - $this->setViewState('DataType',TPropertyValue::ensureEnum($value,'Integer','Float','Date','String'),'String'); + $this->setViewState('DataType',TPropertyValue::ensureEnum($value,'Integer','Float','Date','Currency','String'),'String'); } /** @@ -130,6 +131,8 @@ class TRangeValidator extends TBaseValidator return $this->isValidInteger($value); case 'Float': return $this->isValidFloat($value); + case 'Currency': + return $this->isValidCurrency($value); case 'Date': return $this->isValidDate($value); default: @@ -175,6 +178,38 @@ class TRangeValidator extends TBaseValidator return $valid; } + /** + * Determine if the value is a valid currency range, + * @param string currency value + * @return boolean true if within range. + */ + protected function isValidCurrency($value) + { + $minValue=$this->getMinValue(); + $maxValue=$this->getMaxValue(); + + $valid=true; + $value = $this->getCurrencyValue($value); + if($minValue!=='') + $valid=$valid && ($value>= $this->getCurrencyValue($minValue)); + if($maxValue!=='') + $valid=$valid && ($value<= $this->getCurrencyValue($minValue)); + return $valid; + } + + /** + * Parse the string into a currency value, return the float value of the currency. + * @param string currency as string + * @return float currency value. + */ + protected function getCurrencyValue($value) + { + if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value,$matches)) + return floatval($matches[0]); + else + return 0.0; + } + /** * Determine if the date is within the specified range. * Uses pradoParseDate and strtotime to get the date from string. diff --git a/framework/Web/UI/WebControls/TRequiredFieldValidator.php b/framework/Web/UI/WebControls/TRequiredFieldValidator.php index 04e333eb..ddbb12c8 100644 --- a/framework/Web/UI/WebControls/TRequiredFieldValidator.php +++ b/framework/Web/UI/WebControls/TRequiredFieldValidator.php @@ -21,9 +21,6 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * TRequiredFieldValidator makes the associated input control a required field. * The input control fails validation if its value does not change from * the {@link setInitialValue InitialValue} property upon losing focus. - * - * Validation will also succeed if input is of TListControl type and the number - * of selected values different from the initial value is greater than zero. * * @author Qiang Xue * @version $Revision: $ $Date: $ @@ -56,32 +53,12 @@ class TRequiredFieldValidator extends TBaseValidator * This method overrides the parent's implementation. * The validation succeeds if the input component changes its data * from the {@link getInitialValue InitialValue} or the input control is not given. - * - * Validation will also succeed if input is of TListControl type and the - * number of selected values different from the initial value is greater - * than zero. - * * @return boolean whether the validation succeeds */ protected function evaluateIsValid() { - $control = $this->getValidationTarget(); - $initial = trim($this->getInitialValue()); - if($control instanceof TListControl) - { - $count = 0; - foreach($control->getItems() as $item) - { - if($item->getSelected() && $item->getValue() != $initial) - $count++; - } - return $count > 0; - } - else - { - $value=$this->getValidationValue($control); - return trim($value)!==$initial || (is_bool($value) && $value); - } + $value=$this->getValidationValue($this->getValidationTarget()); + return trim($value)!==trim($this->getInitialValue()) || (is_bool($value) && $value); } /** @@ -92,9 +69,6 @@ class TRequiredFieldValidator extends TBaseValidator { $options = parent::getClientScriptOptions(); $options['InitialValue']=$this->getInitialValue(); - $control = $this->getValidationTarget(); - if($control instanceof TListControl) - $options['TotalItems'] = $control->getItemCount(); return $options; } } -- cgit v1.2.3