var
MonthNames = [
"January"
,
"February"
,
"March"
,
"April"
,
"May"
,
"June"
,
"July"
,
"August"
,
"September"
,
"October"
,
"November"
,
"December"
];
var
DayNames = [
"Sunday"
,
"Monday"
,
"Tueday"
,
"Wednesday"
,
"Thursday"
,
"Friday"
,
"Saturday"
];
var
ShortMths = [
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"Jun"
,
"Jul"
,
"Aug"
,
"Sep"
,
"Oct"
,
"Nov"
,
"Dec"
];
var
ShortDays = [
"Sun"
,
"Mon"
,
"Tue"
,
"Wed"
,
"Thu"
,
"Fri"
,
"Sat"
];
var
AddEvent =
function
(elem, eventType, func) {
if
( elem.addEventListener )
AddEvent =
function
(elem, eventType, func) {
elem.addEventListener(eventType, func, false);
};
else
if
( elem.attachEvent )
AddEvent =
function
(elem, eventType, func) {
elem.attachEvent(
'on'
+ eventType, func);
};
else
AddEvent =
function
(elem, eventType, func) {
elem[
'on'
+ eventType] = func;
};
AddEvent(elem, eventType, func);
};
var
SortTable =
function
(tbl, col) {
SortElements(tbl,
'tr'
,
'td'
, col);
};
var
SortElements =
function
(parentEl, childTag, colTag, colIndex) {
var
i, j, cTags = {}, startAt = 0, childLen, aChild, elem,
sortBy, content, elems = [], sortedLen, frag, hdrsLen, hdr;
var
parent = (typeof parentEl ===
'string'
) ?
document.getElementById(parentEl) : parentEl;
var
AscText =
function
(a, b) {
var
x = a.data, y = b.data,
xNum = parseFloat(x), yNum = parseFloat(y);
if
( !isNaN(xNum) && !isNaN(yNum) && (xNum - yNum) )
return
xNum - yNum;
return
((x < y) ? -1 : ((x > y) ? 1 : 0));
};
var
DescText =
function
(a, b) {
var
x = a.data, y = b.data,
xNum = parseFloat(x), yNum = parseFloat(y);
if
( !isNaN(xNum) && !isNaN(yNum) && (yNum - xNum) )
return
yNum - xNum;
return
((x > y) ? -1 : ((x < y) ? 1 : 0));
};
var
AscNum =
function
(a, b) {
return
a.data - b.data;
};
var
DescNum =
function
(a, b) {
return
b.data - a.data;
};
if
(parent.nodeName.toLowerCase() ==
'table'
) {
if
( childTag ==
'tr'
) {
sortBy = parent.rows[0].cells[colIndex].sortBy ||
'text'
;
}
parent = parent.tBodies[0] || parent;
if
( parent.rows[0].cells[0].nodeName.toLowerCase() ==
'th'
) {
startAt = 1;
}
}
cTags = parent.getElementsByTagName(childTag);
if
( typeof colIndex ==
'undefined'
) {
sortBy =
'text'
;
}
for
(i = startAt, childLen = cTags.length; i < childLen; i++) {
aChild = cTags[i];
elem = (colTag) ? aChild.getElementsByTagName(colTag)[colIndex] : aChild;
if
(elem) {
if
( !sortBy ) {
sortBy = (typeof elem.numberValue !=
'undefined'
) ?
'number'
:
((typeof elem.dateValue !=
'undefined'
) ?
'date'
:
'text'
);
}
switch
(sortBy) {
case
'text'
:
content = (elem.getAttribute(
'sort'
) ||
elem.firstChild.nodeValue).toLowerCase();
break
;
case
'number'
:
content = elem.numberValue;
break
;
case
'date'
:
content = elem.dateValue;
break
;
default
:
content = (elem.getAttribute(
'sort'
) ||
elem.firstChild.nodeValue).toLowerCase();
break
;
}
j = elems.length;
if
( !aChild.id )
aChild.id =
'tempSortID'
+ j;
elems[j] = { data: content, tempID: aChild.id };
}
}
if
( typeof colIndex ==
'undefined'
) colIndex = 0;
if
( parent.prevTag && parent.prevTag == ((typeof colTag ==
'undefined'
) ?
childTag : colTag) ) {
if
(parent.prevCol == colIndex) {
parent.prevSort = (parent.prevSort ==
'asc'
) ?
'desc'
:
'asc'
;
}
else
{
parent.prevCol = colIndex;
parent.prevSort =
'asc'
;
}
}
else
{
parent.prevTag = ((typeof colTag ==
'undefined'
) ? childTag : colTag);
parent.prevCol = colIndex;
parent.prevSort =
'asc'
;
}
if
( parent.prevSort ===
'desc'
) {
switch
(sortBy) {
case
'text'
: elems.sort(DescText);
break
;
case
'number'
: elems.sort(DescNum);
break
;
case
'date'
: elems.sort(DescNum);
break
;
default
: elems.sort(DescText);
break
;
}
}
else
{
switch
(sortBy) {
case
'text'
: elems.sort(AscText);
break
;
case
'number'
: elems.sort(AscNum);
break
;
case
'date'
: elems.sort(AscNum);
break
;
default
: elems.sort(AscText);
break
;
}
}
frag = document.createDocumentFragment();
for
(i = 0, sortedLen = elems.length; i < sortedLen; i++) {
elem = document.getElementById(elems[i].tempID);
frag.appendChild(elem);
if
( (elem.id).
substr
(0,10) ==
'tempSortID'
)
elem.removeAttribute(
'id'
);
}
parent.appendChild(frag);
elems = null;
return
parent.prevSort;
};
var
AddSortToTables =
function
() {
var
tables = document.getElementsByTagName(
'table'
), i, j,
tblLen, tbl, hdrs, hdrsLen;
function
PreserveSortScope(a,b,c,d) {
return
function
() {
SortElements(a, b, c, d);
}
}
for
( i = 0, tblLen = tables.length; i < tblLen; i++ ) {
tbl = tables[i];
if
( tbl.className.indexOf(
'sortIt'
) + 1) {
hdrs = tbl.getElementsByTagName(
'th'
);
if
( hdrs ) {
for
( j = 0, hdrsLen = hdrs.length; j < hdrsLen; j++ ) {
AddEvent(hdrs[j],
'click'
,PreserveSortScope(tbl,
'tr'
,
'td'
,j));
if
( !hdrs[j].title ) hdrs[j].setAttribute(
'title'
,
'Click to sort'
);
}
}
}
}
};
var
AddSortByDate =
function
(tbl, col, dateMask) {
var
i, rLen, cell;
while
( col.length ) AddSortByDate(tbl,col.pop(),dateMask);
if
((col
instanceof
Array) || isNaN(col))
return
;
var
tbl = (typeof tbl ===
'string'
) ? document.getElementById(tbl) : tbl;
tbl.rows[0].cells[col].sortBy =
'date'
;
AddSortByDate2(tbl,
'tr'
,
'td'
, col, dateMask);
};
var
AddSortByDate2 =
function
(parentEl, childTag, colTag, colIndex, dateMask) {
var
kids, startAt = 0, i, rLen, cell;
var
parent = (typeof parentEl ===
'string'
) ?
document.getElementById(parentEl) : parentEl;
if
( parent.nodeName.toLowerCase() ==
'table'
) {
parent = parent.tBodies[0] || parent;
startAt = ( parent.rows[0].cells[0].nodeName.toLowerCase() ==
'th'
) * 1;
}
kids = parent.getElementsByTagName(childTag);
for
( i = startAt, rLen = kids.length; i < rLen; i++) {
cell = kids[i].getElementsByTagName(colTag)[colIndex];
if
(cell) {
if
( typeof cell.numberValue !=
'undefined'
)
delete
cell.numberValue;
if
(cell.getAttribute(
'sort'
)) {
cell.dateValue =
new
Date
(cell.getAttribute(
'sort'
));
}
else
{
cell.dateValue =
new
Date
(StringToDate(cell.firstChild.nodeValue,
dateMask));
}
if
(cell.dateValue.toString() ==
"NaN"
|| cell.dateValue.toString() ==
"Invalid Date"
) {
cell.dateValue = 0;
}
}
}
};
var
AddSortByNumber =
function
(tbl, col) {
var
i, rLen, cell, tempNum;
while
( col.length ) AddSortByNumber(tbl,col.pop());
if
((col
instanceof
Array) || isNaN(col))
return
;
tbl = (typeof tbl ===
'string'
) ? document.getElementById(tbl) : tbl;
tbl.rows[0].cells[col].sortBy =
'number'
;
AddSortByNumber2(tbl,
'tr'
,
'td'
,col);
};
var
AddSortByNumber2 =
function
(parentEl, childTag, colTag, colIndex) {
var
kids, startAt = 0, i, rLen, cell, tempNum;
var
parent = (typeof parentEl ===
'string'
) ?
document.getElementById(parentEl) : parentEl;
if
( parent.nodeName.toLowerCase() ==
'table'
) {
parent = parent.tBodies[0] || parent;
startAt = (parent.rows[0].cells[0].nodeName.toLowerCase() ==
'th'
) * 1;
}
kids = parent.getElementsByTagName(childTag);
for
(i = startAt, rLen = kids.length; i < rLen; i++) {
cell = kids[i].getElementsByTagName(colTag)[colIndex];
if
(cell) {
if
( typeof cell.dateValue !=
'undefined'
)
delete
cell.dateValue;
tempNum = cell.getAttribute(
'sort'
) || cell.firstChild.nodeValue;
tempNum = tempNum.replace(/[^0-9.-]/g,
''
);
cell.numberValue = parseFloat(tempNum);
if
(isNaN(cell.numberValue))
cell.numberValue = 0.0;
}
}
};
var
StringToDate =
function
(sDate, sFormat, cutOff) {
var
sParsed, fndSingle;
sDate = sDate.toString().toUpperCase();
sFormat = sFormat.toUpperCase();
if
(sFormat.search(/MMMM|MMM/) + 1) {
sDate = sDate.replace(
new
RegExp(
'('
+ ShortMths.join(
'|'
) +
')[A-Z]*'
,
'gi'
),
function
(m) {
var
i = ShortMths.indexOf(m.charAt(0).toUpperCase() +
m.
substr
(1, 2).toLowerCase()) + 1;
return
((i < 10) ?
"0"
+ i :
""
+ i).toString();
});
sFormat = sFormat.replace(/MMMM|MMM/g,
'MM'
);
}
if
(sFormat.search(/DDDD|DDD/) + 1) {
sDate = sDate.replace(
new
RegExp(
'('
+ ShortDays.join(
'|'
) +
')[A-Z]*'
,
'gi'
),
''
);
sFormat = sFormat.replace(/DDDD|DDD/g,
''
);
}
sDate = sDate.replace(/(^|\D)(\d)(?=\D|$)/g,
function
(
$0
,
$1
,
$2
) {
return
$1
+
'0'
+
$2
;
});
sFormat = sFormat.replace(/(^|[^DMY])(D|M)(?=[^DMY]|$)/g,
function
(
$0
,
$1
,
$2
){
return
$1
+
$2
+
$2
;
});
fndSingle = sFormat.search(/(^|[^D])D([^D]|$)|(^|[^M])M([^M]|$)/)+1;
if
( fndSingle )
return
''
;
sFormat = sFormat.replace(/(^|[^Y])(YY)(?=[^Y]|$)/g,
function
(
$0
,
$1
,
$2
, index) {
var
tempDate = sDate.
substr
(0, index + 1);
tempDate += (cutOff) ? ((parseInt(sDate.
substr
(index + 1, 2),10) > cutOff) ?
'19'
:
'20'
) :
'20'
;
tempDate += sDate.
substr
(index + 1);
sDate = tempDate;
return
$1
+
$2
+
$2
;
});
sParsed = (
'YYYY/MM/DD'
).replace(/YYYY|MM|DD/g,
function
(m){
return
(sFormat.indexOf(m) + 1) ?
sDate.
substr
(sFormat.indexOf(m), m.length) :
''
;
});
if
(sParsed.charAt(0) ==
'/'
) {
sParsed = (
new
Date
().getFullYear()) + sParsed;
}
if
(sParsed.charAt(sParsed.length - 1) ==
'/'
) {
sParsed +=
'01'
;
}
return
( sParsed.length == 10 ) ? sParsed :
''
;
};