I have a custom validator attached to a date column in edit on an order entry system to insure that the user doesn't change the date to one already on another order item for that product
if the error is triggered in Firefox (but not in IE, Opera, Safari or Chrome) the date stops popping up for any other item on the page
the column from the grid
some Javascript
decorate the edit item
am I going about it the wrong way - or is there - gasp! - a bug?
I'm using the Q3 2011 version
if the error is triggered in Firefox (but not in IE, Opera, Safari or Chrome) the date stops popping up for any other item on the page
the column from the grid
<
telerik:GridDateTimeColumn
UniqueName
=
"ShipDate"
DataField
=
"ShipDate"
PickerType
=
"DatePicker"
HeaderText
=
"Ship Date"
DataFormatString
=
"{0:d}"
DataType
=
"System.DateTime"
>
<
HeaderStyle
Width
=
"60px"
/>
</
telerik:GridDateTimeColumn
>
var
j = 0;
function
ship_date_selected(sender, eventArgs) {
var
date = eventArgs._newValue;
// prevent loop
// var chk = eventArgs._oldValue;
if
(j > 0) {
return
;
}
var
oldDate = eventArgs.get_oldDate();
var
thisItem = document.getElementById(
'txtItemID'
);
// date already for Item
var
theGrid = $find(
"<%=rgEditOrder.ClientID %>"
).get_masterTableView();
var
j = $find(
"<%=rgEditOrder.ClientID %>"
)._editIndexes[0];
var
editRow = theGrid.get_dataItems()[j];
var
thisStore = theGrid.getCellByColumnUniqueName(editRow,
"StoreNumber"
).innerHTML;
for
(
var
i = 0; i < theGrid.get_dataItems().length; i++) {
var
row = theGrid.get_dataItems()[i];
if
(!row.get_isInEditMode()) {
var
ItemID = theGrid.getCellByColumnUniqueName(row,
"ItemID"
).innerHTML;
var
storeNumber = theGrid.getCellByColumnUniqueName(row,
"StoreNumber"
).innerHTML;
// alert(ItemID);
if
(parseInt(ItemID) == parseInt(thisItem.value)) {
if
(parseInt(storeNumber) == parseInt(thisStore)) {
var
ShipDate = theGrid.getCellByColumnUniqueName(row,
"ShipDate"
).innerHTML;
// alert(ShipDate);
if
(Date.parse(date) == Date.parse(ShipDate)) {
alert(
'Date already used '
+ ShipDate);
sender.set_selectedDate(oldDate);
i = 9999;
return
false
;
}
}
}
}
}
var
strSD = format_dates(date);
if
(!delivery_ok(strSD)) {
j++;
sender.set_selectedDate(oldDate);
alert(
'Invalid delivery date'
);
return
false
;
}
}
// validate that date supplied falls in one of three ship windows
function
delivery_ok(strSD) {
var
endDate1 = document.getElementById(
'rtbEnd1'
);
var
endDate2 = document.getElementById(
'rtbEnd2'
);
var
endDate3 = document.getElementById(
'rtbEnd3'
);
var
startDate1 = document.getElementById(
'rtbStart1'
);
var
startDate2 = document.getElementById(
'rtbStart2'
);
var
startDate3 = document.getElementById(
'rtbStart3'
);
// add century(20) to ship dates-mm/dd/yy->mm/dd/yyyy
var
vDate1 = format_dates(startDate1.value);
var
vDate2 = format_dates(startDate2.value);
var
vDate3 = format_dates(startDate3.value);
var
vEnd1 = format_dates(endDate1.value);
var
vEnd2 = format_dates(endDate2.value);
var
vEnd3 = format_dates(endDate3.value);
if
(vDate1 !=
''
) {
if
(Date.parse(strSD) >= Date.parse(vDate1) && Date.parse(strSD) <= Date.parse(vEnd1)) {
return
true
;
}
}
if
(vDate2 !=
''
) {
if
(Date.parse(strSD) >= Date.parse(vDate2) && Date.parse(strSD) <= Date.parse(vEnd2)) {
return
true
;
}
}
if
(vDate3 !=
''
) {
if
(Date.parse(strSD) >= Date.parse(vDate3) && Date.parse(strSD) <= Date.parse(vEnd3)) {
return
true
;
}
}
return
false
;
}
// append century(20) to date-mm/dd/yy->mm/dd/yyyy
// validate that date is in correct format-if error found
// return blank string
function
format_dates(strDate) {
var
i = 0;
var
arrDate;
// this routine makes no sense
for
(i = 0; i < 3; i++) {
if
(strDate.indexOf(
"/"
) != -1) {
arrDate = strDate.split(
"/"
);
if
(arrDate.length != 3) {
return
""
;
}
}
else
{
return
""
;
}
}
// prefix the year with century-hardcoded 20
var
ye =
"20"
+ arrDate[2].substring(arrDate[2].length - 2);
var
month = Number(arrDate[0]);
var
day = Number(arrDate[1])
// check month and day-month between 1 and 12,day between 1 and 31
// except April,June,September and November-and February
if
(month < 1 || month > 12) {
return
""
; }
if
(day < 1 || day > 31) {
return
""
; }
if
((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) {
return
""
;
}
// February-check against leap year
if
(month == 2) {
var
isleap = (ye % 4 == 0 && (ye % 100 != 0 || ye % 400 == 0));
if
(day > 29 || (day == 29 && !isleap)) {
return
""
; }
}
// no date errors encountered-rebuild date and return
var
strD = Number(arrDate[0]) +
"/"
+ Number(arrDate[1]) +
"/"
+ ye;
return
strD;
}
decorate the edit item
protected void rgEditOrder_ItemCreated(object source, GridItemEventArgs e)
{
GridEditableItem geItem;
// GridDataItem gdItem;
RadDatePicker rdpShipDate;
GridDateTimeColumnEditor ceShipDate;
TableCell tcShipDate;
CustomValidator cvShipDate;
RadNumericTextBox rntbQty;
// int MinQty;
if
(e.Item.IsInEditMode)
{ }
else
return
;
if
(e.Item is GridEditableItem)
{ }
else
return
;
geItem = (GridEditableItem)e.Item;
rdpShipDate = (geItem[
"ShipDate"
].Controls[0] as RadDatePicker);
rdpShipDate.ClientEvents.OnDateSelected =
"ship_date_selected"
;
rdpShipDate.AutoPostBack =
true
;
rdpShipDate.SelectedDateChanged += rdpShipDate_SelectedDateChanged;
txtShipDate.Value = rdpShipDate.ClientID;
ceShipDate = geItem.EditManager.GetColumnEditor(
"ShipDate"
) as GridDateTimeColumnEditor;
tcShipDate = (TableCell)ceShipDate.PickerControl.Parent;
cvShipDate =
new
CustomValidator();
cvShipDate.ID =
"cvShipDate"
;
cvShipDate.ControlToValidate = rdpShipDate.ID;
cvShipDate.ServerValidate += ShipDate_OnServerValidate;
cvShipDate.Text =
"*"
;
cvShipDate.ErrorMessage =
"Item already ordered on this ship date"
;
tcShipDate.Controls.Add(cvShipDate);
}
am I going about it the wrong way - or is there - gasp! - a bug?
I'm using the Q3 2011 version