/**
 * @fileoverview Search Results Page Adv. Filtering & Sort.
 *
 * Note: Uses children[0] rather than firstChild as FF gets a Text Object due to poor mark-up
 * @author Iain White iain.white@aot.com.au
 * @version 1.7
 */

if (NIN == undefined) var NIN = {};

NIN.SearchResults.Sort = {
    version: '1.7',
    tableId: 'ratesTable',
    rateOrderId: 'rateOrder',
    filterFormId: 'filterFrm',
    areaSelectId: 'fArea',
    areaDivId: 'areaContainer',
    sortFld: '',
    sortFldType: '',
    sortDec: false,
    tableCache: [],
    isCacheBuilt: false,
    isSorted: false,
    numFiltered: 0,    
    lastArea: null,
    lastAreaId: 0,
    lastHeaderId: 0,
    usedHeaderId: 0,
    rowsPerPage: 13,
    onBeforeFilter: null,
    onFilterComplete: null,
    onBeforeSort: null,
    onSortComplete: null,
    onBeforeCache: null,
    onCaheComplete: null,
	sortableItems: ['Name', 'Star', 'Location'],
	dayHeaders: [],
    filteredOn: null,
    areaHeader: 'Area-R',
    rateHeaders: ['RateAreaSpace', 'RateNavSpacer', 'RateNav', 'RateHeaderSpacer', 'RateHeader'],
    curMaxRate: null,
    curMinRate: null,
    priorityAmenity: ['fRA1', 'fPA3', 'fPA1', 'fPA4'],
    cheapestRoomRate: null,
    dearestRoomRate: null,
    areasWithContent: [],
    using: false,
    __construct: function() {
        //JADE.timeDiff.setStartTimer();
        this.using = true;
        this.mergeTables();
        //alert(JADE.timeDiff.getTimeDiff() / 1000 + ' seconds');
        this.cacheTable();
        //alert(JADE.timeDiff.getTimeDiff() / 1000 + ' seconds');
        var restored = this.restoreFromCookie();
        if (!restored) {
            this.setFilterFormFields();
        }
        //alert(JADE.timeDiff.getTimeDiff() / 1000 + ' seconds');
    },
    cacheTable: function()
    {
        var ratesTableEl = document.getElementById(this.tableId);
        if (!ratesTableEl) {
            return;
        }
        if (this.onBeforeCache && typeof(this.onBeforeCache) == 'function') {
            this.onBeforeCache();
        }
        var rowsEl = ratesTableEl.getElementsByTagName('tr');
        for (var i = 0; i < rowsEl.length; i++) {
            var row = rowsEl[i];
            var cellsEl = row.getElementsByTagName('td');
            var columnData = {};
            var cheapest = 999999;
            var dearest = 0;
            columnData.RedHot = false;
            for (var j = 0; j < cellsEl.length; j++) {
                var cell = cellsEl[j];
                if (cell.className == 'rateredhot'|| cell.className == 'rate_weekendredhot') {
                    columnData.RedHot = true;
                }
                var value = JADE.getInnerText(cell);
                // Firefox leaves in the inner text of the Tool Tip
                if (value.substring(0, 6) == '$Text[') {
                    var pos = value.indexOf(']');
                    if (pos != -1) {     
                        value = value.substring(pos + 1);
                    }
                    var pos2 = value.indexOf(']');
                    if (pos2 != -1) {     
                        value = value.substring(pos2 + 1);
                    }
                }
                switch (j) {
                    case 0:
                        // Property Name
                        var linksEl = cell.getElementsByTagName('a');
                        if (linksEl.length) {
                            var accommId = linksEl[0].href;
                            var pos = accommId.indexOf('AccommId=');
                            if (pos != -1) {
                                accommId = parseInt(accommId.substring(pos + 9));
                                columnData.AccommId = accommId;
                                // Set the AccommId as the TR Id
                                row.id = accommId;
                            }
                            columnData.Name = JADE.getInnerText(linksEl[0]);
                            columnData.Name = columnData.Name.replace(/^\s+|\s+$/g, '');
                            columnData.Name = columnData.Name.toLowerCase();
                            // Set Secret Stay flag
                            if (columnData.Name == 'secret stay') {
                                columnData.Secret = true;
                            } else {
                                columnData.Secret = false;
                            }
                            // Get location
                            var endName = /,\s\s/
                            var parts = value.split(endName);
                            if (parts.length > 1) {
                                var location = parts[1];
                                location = location.replace(/^\s+|\s+$/g, '');
                                columnData.Location = location;
                                //columnData.Location = columnData.Location.toLowerCase();
                            }
                            columnData.Star = '00';
                            // Star rating
                            var spansEl = cell.getElementsByTagName('span');
                            var tmpStar = 0;
                            for (var k = 0; k < spansEl.length; k++) {
                                var span = spansEl[k];
                                pos = span.id.indexOf('selfrate_');
                                if (pos != -1) {
                                    var star = parseInt(span.id.substring(pos + 9));
                                    if (star < 10) {
                                        star = star * 10;
                                    }
                                    columnData.Star = star;
                                    columnData.SelfRated = true;
                                }
                                if (span.className == 'fullstar') {
                                    tmpStar = tmpStar + 10;
                                }
                                if (span.className == 'halfstar') {
                                    tmpStar = tmpStar + 5;
                                }
                            }
                            spansEl = null;
                            delete spansEl;
                            if (tmpStar > 0) {
                                columnData.Star = tmpStar;
                                columnData.SelfRated = false;
                            }
                            linksEl = null;
                            delete linksEl;
                        }
                        // Area Header
                        var headerEl = cell.getElementsByTagName('h2');
                        for (var l = 0; l < headerEl.length; l++) {
                            if (headerEl[l].className == 'resultName') {
                                this.lastArea = value;
                                this.lastArea = this.lastArea.replace(/^\s+|\s+$/g, '');
                                this.lastAreaId = cell.parentNode.id;
                            }
                        }
                        headerEl = null;
                        delete headerEl;
                        break;
                    case 1:
                        columnData.FullRate = this.fixRate(value);
                        if (columnData.FullRate === "" || isNaN(columnData.FullRate)) {
                            columnData.FullRate = 999999;;
                        }
                        break;
                    case 2:
                        columnData.Rate1 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate1, cheapest);
                        dearest = this.checkForDearest(columnData.Rate1, dearest);
                        break;
                    case 3:
                        columnData.Rate2 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate2, cheapest);
                        dearest = this.checkForDearest(columnData.Rate2, dearest);
                        break;
                    case 4:
                        columnData.Rate3 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate3, cheapest);
                        dearest = this.checkForDearest(columnData.Rate3, dearest);
                        break;
                    case 5:
                        columnData.Rate4 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate4, cheapest);
                        dearest = this.checkForDearest(columnData.Rate4, dearest);
                        break;
                    case 6:
                        columnData.Rate5 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate5, cheapest);
                        dearest = this.checkForDearest(columnData.Rate5, dearest);
                        break;
                    case 7:
                        columnData.Rate6 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate6, cheapest);
                        dearest = this.checkForDearest(columnData.Rate6, dearest);
                        break;
                    case 8:
                        columnData.Rate7 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate7, cheapest);
                        dearest = this.checkForDearest(columnData.Rate7, dearest);
                        break;
                    case 9:
                        columnData.Rate8 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate8, cheapest);
                        dearest = this.checkForDearest(columnData.Rate8, dearest);
                        break;
                    case 10:
                        columnData.Rate9 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate9, cheapest);
                        dearest = this.checkForDearest(columnData.Rate9, dearest);
                        break;
                    case 11:
                        columnData.Rate10 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate10, cheapest);
                        dearest = this.checkForDearest(columnData.Rate10, dearest);
                        break;
                    case 12:
                        columnData.Rate11 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate11, cheapest);
                        dearest = this.checkForDearest(columnData.Rate11, dearest);
                        break;
                    case 13:
                        columnData.Rate12 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate12, cheapest);
                        dearest = this.checkForDearest(columnData.Rate12, dearest);
                        break;
                    case 14:
                        columnData.Rate13 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate13, cheapest);
                        dearest = this.checkForDearest(columnData.Rate13, dearest);
                        break;
                    case 15:
                        columnData.Rate14 = this.fixRate(value);
                        cheapest = this.checkForCheapest(columnData.Rate14, cheapest);
                        dearest = this.checkForDearest(columnData.Rate14, dearest);
                        break;
                }
            }
            cell = null;
            delete cell;
            cellsEl = null;
            delete cellsEl;
            // Set cheapest Rate for this row
            if (cheapest != 999999) {
                columnData.Cheapest = cheapest;
            }
            // Set dearest Rate for this row
            if (dearest != 0) {
                columnData.Dearest = dearest;
            }
            // Property / Room Amenities
            var classNames = row.className;
            var propAmenitiesRx = /\bPA\d+\b/
            var propAmenitiesClass = classNames.match(propAmenitiesRx);
            if (propAmenitiesClass) {
                columnData.PropAmenities = propAmenitiesClass[0].substring(2);
            }
            var roomAmenitiesRx = /\bRA\d+\b/
            var roomAmenitiesClass = classNames.match(roomAmenitiesRx);
            if (roomAmenitiesClass) {
                columnData.RoomAmenities = roomAmenitiesClass[0].substring(2);
            }
            var experiencesRx = /\bExp\d+\b/
            var experiencesClass = classNames.match(experiencesRx);
            if (experiencesClass) {
                columnData.Experiences = experiencesClass[0].substring(3);
            }
            var accomStyleRx = /\bAccomStyle\d+\b/
            var accomStyleClass = classNames.match(accomStyleRx);
            if (accomStyleClass) {
                columnData.AccomStyle = accomStyleClass[0].substring(10);
            }
            var roomTypeRx = /\bRoomType\d+\b/
            var roomTypeClass = classNames.match(roomTypeRx);
            if (roomTypeClass) {
                columnData.RoomType = roomTypeClass[0].substring(8);
            }
            
            // Only cache Rate TRs
            if (columnData.AccommId && columnData.Name) {
                columnData.Area = this.lastArea;
                columnData.AreaId = this.lastAreaId;
                this.addRow(columnData);
            }
        }
        //this.buildAreaSelect();
        this.isCacheBuilt = true;
        this.setMessageRow();
        if (this.onCacheComplete && typeof(this.onCacheComplete) == 'function') {
            this.onCacheComplete();
        }
        row = null;
        delete row;
        rowsEl = null;
        delete rowsEl;
        ratesTableEl = null;
        delete ratesTableEl;
    },
    fixRate: function(price)
    {
        var pos = price.indexOf('$');
        if (pos > -1) {
            price = price.substring(pos + 1);
        }
        price = parseInt(price);
        if (isNaN(price)) {
            price = 999999;
        }
        return price;
    },
    checkForCheapest: function(rate, cheapest)
    {
        if (!isNaN(rate)) {
            if (rate < cheapest) {
                cheapest = rate;
            }
        }
        return cheapest;
    },
    checkForDearest: function(rate, dearest)
    {
        if (!isNaN(rate) && rate != 999999) {
            if (rate > dearest) {
                dearest = rate;
            }
        }
        return dearest;
    },
    getCheapestRoom: function()
    {
        if (this.cheapestRoomRate) {
            return this.cheapestRoomRate;
        }
        var cheapest = 999999;
        for (var i = 0; i < this.tableCache.length; i++) {
            cheapest = this.checkForCheapest(this.tableCache[i].Cheapest, cheapest);
        }
        this.cheapestRoomRate = cheapest;
        return cheapest;
    },
    getDearestRoom: function()
    {
        if (this.dearestRoomRate) {
            return this.dearestRoomRate;
        }
        var dearest = 0;
        for (var i = 0; i < this.tableCache.length; i++) {
            dearest = this.checkForDearest(this.tableCache[i].Dearest, dearest);
        }
        this.dearestRoomRate = dearest;
        return dearest;
    },
    getCurrentRange: function()
    {
        var cheapestRoom = this.getCheapestRoom();
        var dearestRoom = this.getDearestRoom();
        var curMin = null;
        if (this.curMinRate) {
            curMin = this.curMinRate;
        } else {
            curMin = cheapestRoom;
        }
        var curMax = null;
        if (this.curMaxRate) {
            curMax = this.curMaxRate;
        } else {
            curMax = dearestRoom;
        }
        // Check within rage
        if (curMin < cheapestRoom) {
            curMin = cheapestRoom;
        }
        if (curMax > dearestRoom) {
            curMax = dearestRoom;
        }
        return {Min: curMin, Max: curMax};
    },
    addRow: function(data)
    {
        var i = this.tableCache.length;
        data.Original = i;
        this.tableCache[i] = data;
    },
    sortNumeric: function(a, b)
    {
        var aa = a[NIN.SearchResults.Sort.sortFld];
        var bb = b[NIN.SearchResults.Sort.sortFld];
        if (aa == bb) {
	        if (a.Name == b.Name) {
	            return 0;
	        }
            return (a.Name < b.Name) ? -1 : 1;
        }
        if (aa === "" && !isNaN(bb)) {
            return -1;
        }
        if (bb === "" && !isNaN(aa)) {
            return 1;
        }
        return aa - bb;
    },
    sortText: function(a, b)
    {
        var aa = a[NIN.SearchResults.Sort.sortFld];
        var bb = b[NIN.SearchResults.Sort.sortFld];
        if (aa == bb) {
	        if (a.Name == b.Name) {
	            return 0;
	        }
            return (a.Name < b.Name) ? -1 : 1;
        }
        return (aa < bb) ? -1 : 1;
    },
    sortWrapper: function(a, b)
    {
        // Swap parameters
        if (NIN.SearchResults.Sort.sortDec) {
            var c = a;
            a = b;
            b = c;
        }
        if (NIN.SearchResults.Sort.sortFldType == 'Text') {
            var s = NIN.SearchResults.Sort.sortText(a, b);
        } else {
            var s = NIN.SearchResults.Sort.sortNumeric(a, b);
        }
        if (s) {
            return s;
        } else {
            return 0;
        }
    },
    doSort: function(type)
    {
        NIN.SearchResults.showBusy();
        if (!this.isCacheBuilt) {
            return false;
        }
        if (type == 'Original') {
            this.sortFld = type;
            this.sortDec = false;
        } else {
            if (this.sortFld == type) {
        	    this.sortDec = !this.sortDec;
            } else {
        	    this.sortFld = type;
		    }
        }        
        if (this.onBeforeSort && typeof(this.onBeforeSort) == 'function') {
            this.onBeforeSort();
        }
        this.updateDirectionImages();
        // If not sorting by Rate Day SELECT set it to default
        if (type.match('^Rate') != 'Rate') {
            var orderEl = document.getElementById(this.rateOrderId);
            orderEl.options[0].selected = true;
            for (var i = 1; i < orderEl.options.length; i++) {
                orderEl.options[i].selected = false;
            }
            orderEl = null;
            delete orderEl;
        }
        if (type == 'Original') {      
            this.setMessageRow('Restoring original order...');
        } else {
            this.setMessageRow('Sorting on ' + this.fldToEnglish(this.sortFld) + '...');
        }
        switch(type) {
            case 'Name':
            case 'Location':
                this.sortFldType = 'Text';
                this.tableCache.sort(this.sortWrapper);
                break;
            default:
                this.sortFldType = 'Numeric';
                this.tableCache.sort(this.sortWrapper);
                break;
        }
        if (type == 'Original') {
            this.isSorted = false;
        } else {
            this.isSorted = true;
        }
        this.doReDrawTable();
        //this.storeInCookie();
        this.setMessageRow();
        if (this.onSortComplete && typeof(this.onSortComplete) == 'function') {
            this.onSortComplete();
        }
    },
    clearSort: function()
    {
        this.doSort('Original');
    },
    clearFilters: function()
    {
        NIN.SearchResults.Sort.filteredOn = null;
        //NIN.SearchResults.Sort.setSortFormFields();
        NIN.SearchResults.Sort.setFilterFormFields(false);
        NIN.SearchResults.Sort.processForm('clear');
    },
    doReDrawTable: function()
    {
        var orderArray = [];
        for (var i = 0; i < this.tableCache.length; i++) {
            orderArray[i] = this.tableCache[i].AccommId;
        }
        this.hideHeaders();
        this.reDrawTable(orderArray);
    },
    reDrawTable: function(orderArray)
    {
        var rowCounter = this.rowsPerPage - 1;
        var tableEl = document.getElementById(this.tableId);
        // Speed up re-redering
        tableEl.style.display = 'none'
        var lastAreaId = null;
        for (var i = 0; i < orderArray.length; i++) {
            var id = orderArray[i];
            var rowToMove = document.getElementById(id);
            if (rowToMove.style.display != 'none') {
                rowCounter++;
            }
            // Restore Original Order
            if (!this.isSorted) {
                // Do we need an Area header?
                cacheRow = this.getCacheRowById(id)
                if (this.tableCache[cacheRow].AreaId != lastAreaId) {
                    var areaFound = false;
                    for (var j = 0; j < this.areasWithContent.length; j++) {
                        if (this.areasWithContent[j] == this.tableCache[cacheRow].AreaId) {
                            areaFound = true;
                            break;
                        }
                    }
                    if (areaFound) {
                        var areaEl = document.getElementById(this.tableCache[cacheRow].AreaId);
                        // Move it here
                        //JADE.prependToTable(tableEl, areaEl);
                        if (tableEl.children) {
                            tableEl.children[0].appendChild(areaEl);
                        } else {
                            // For FireFox < 3
                            if (tableEl.firstChild.nextSibling) {
                                tableEl.firstChild.nextSibling.appendChild(areaEl);
                            } else {
                                tableEl.firstChild.appendChild(areaEl);
                            }
                        }
                        areaEl.style.display = '';
                        lastAreaId = this.tableCache[cacheRow].AreaId;
                        rowCounter = this.rowsPerPage;
                        areaEl = null;
                        delete areaEl;
                    }
                }
            }
            if (rowCounter == this.rowsPerPage) {
                // Display Rate Header
                this.usedHeaderId++;
                if (this.usedHeaderId <= this.lastHeaderId) {
                    this.hideShowRateHeaders(tableEl, this.usedHeaderId, true);
                }
                rowCounter = 0;
            }
            //JADE.prependToTable(tableEl, rowToMove);
            if (tableEl.children) {
                tableEl.children[0].appendChild(rowToMove);
            } else {
                // For FireFox < 3
                if (tableEl.firstChild.nextSibling) {
                    tableEl.firstChild.nextSibling.appendChild(rowToMove);
                } else {
                    tableEl.firstChild.appendChild(rowToMove);
                }
            }
        }
        // Speed up re-redering
        tableEl.style.display = ''
        tableEl = null;
        delete tableEl;
    },
    removeCache: function()
    {
        this.tableCache = null;
        //delete this.tableCache;
    },
    getNumRows: function()
    {
        return this.tableCache.length;
    },
    doFilter: function(propAmenities, roomAmenities, stars, showSelf, secretStays, hotDeals, areas, minRate, maxRate, experiences, accomStyle, roomType)
    {
        if (!this.isCacheBuilt) {
            return false;
        }
        this.areasWithContent = [];
        this.hideHeaders();
        this.filteredOn = {};
        if (propAmenities) {
            this.filteredOn.PAmenities = propAmenities;
        }
        if (roomAmenities) {
            this.filteredOn.RAmenities = roomAmenities;
        }
        if (stars.length > 0) {
            this.filteredOn.Stars = stars;
        }
        if (showSelf) {
            this.filteredOn.ShowSelf = true;
        }
        if (areas.length > 0 && areas[0] != 'All') {
            this.filteredOn.Areas = areas;
        }
        if (secretStays) {
            this.filteredOn.SecretStays = true;
        }
        if (hotDeals) {
            this.filteredOn.HotDeals = true;
        }
        if (minRate) {
            this.filteredOn.MinRate = minRate;
        }
        if (maxRate) {
            this.filteredOn.MaxRate = maxRate;
        }
        if (accomStyle) {
            this.filteredOn.AccomStyle = accomStyle;
        }
        if (roomType) {
            this.filteredOn.RoomType = roomType;
        }
        if (experiences) {
            this.filteredOn.Experiences = experiences;
        }
        this.numFiltered = 0;
        var tableEl = document.getElementById(this.tableId);
        // Speed up re-redering
        tableEl.style.display = 'none';
        var rowCount = this.rowsPerPage - 1;
        var lastAreaId = null;
        for (var i = 0; i < this.tableCache.length; i++) {
            var rowId = this.tableCache[i].AccommId;
            rowEl = document.getElementById(rowId);
            var matched = true;
            if (secretStays && hotDeals) {
                if (this.tableCache[i].Secret != true && this.tableCache[i].RedHot != true)
                matched = false;
            } else {
    			if (secretStays && this.tableCache[i].Secret != true) {
                    matched = false;
                }
                if (hotDeals && this.tableCache[i].RedHot != true) {
                    matched = false;
                }
            }
            if (accomStyle && (this.tableCache[i].AccomStyle & accomStyle) != accomStyle) {
                matched = false;
            }
            if (roomType && (this.tableCache[i].RoomType & roomType) != roomType) {
                matched = false;
            }
            if (experiences && (this.tableCache[i].Experiences & experiences) != experiences) {
                matched = false;
            }
            if (stars.length > 0) {
				var foundStar = false;				
				for (var j = 0; j < stars.length; j++) {                         	
               		if (this.tableCache[i].Star == stars[j]) {
						foundStar = true;
						continue;               		
               		}
               	}
               	if (!foundStar) {
                	matched = false;
                }
            }
            if (!showSelf && this.tableCache[i].SelfRated == true) {
                matched = false;
            }
            if (propAmenities && (this.tableCache[i].PropAmenities & propAmenities) != propAmenities) {
                matched = false;
            }
            if (roomAmenities && (this.tableCache[i].RoomAmenities & roomAmenities) != roomAmenities) {
                matched = false;
            }
            if (minRate && this.tableCache[i].Cheapest < parseInt(minRate)) {
                matched = false;
            }
            if (maxRate && this.tableCache[i].Dearest > parseInt(maxRate)) {
                matched = false;
            }
            if (areas.length > 0) {
                if (areas[0] != 'All') {
				    var foundArea = false;	
				    for (var j = 0; j < areas.length; j++) {
                        var pos = areas[j].indexOf('|');
                        if (pos != -1) {
                            var areaId = areas[j].substring(0, pos);
                            var location = areas[j].substring(pos + 1);
               		        if (this.tableCache[i].AreaId == areaId && this.tableCache[i].Location == location) {
						        foundArea = true;
						        continue;               		
               		        }
                        } else {
               		        if (this.tableCache[i].AreaId == areas[j]) {
						        foundArea = true;
						        continue;               		
               		        }
                        }
               	    }
               	    if (!foundArea) {
                	    matched = false;
                    }
                }
            }
            if (matched) {
                rowCount++;
                this.areasWithContent[this.areasWithContent.length] = this.tableCache[i].AreaId;
                // Sorted table does not have Area headers
                if (!this.isSorted) {
                    // Do we need an Area header?
                    if (this.tableCache[i].AreaId != lastAreaId) {
                        var areaFound = false;
                        for (var k = 0; k < this.areasWithContent.length; k++) {
                            if (this.areasWithContent[k] == this.tableCache[i].AreaId) {
                                areaFound = true;
                                break;
                            }
                        }
                        if (areaFound) {
                            var areaEl = document.getElementById(this.tableCache[i].AreaId);
                            // Move it here
                            //JADE.prependToTable(tableEl, areaEl);
                            if (tableEl.children) {
                                tableEl.children[0].appendChild(areaEl);
                            } else {
                                // For FireFox < 3
                                if (tableEl.firstChild.nextSibling) {
                                    tableEl.firstChild.nextSibling.appendChild(areaEl);
                                } else {
                                    tableEl.firstChild.appendChild(areaEl);
                                }
                            }
                            areaEl.style.display = '';
                            lastAreaId = this.tableCache[i].AreaId;
                            rowCount = this.rowsPerPage;
                            areaEl = null;
                            delete areaEl;
                        }
                    }
                }
                if (rowCount == this.rowsPerPage) {
                    // Display Rate Header
                    this.usedHeaderId++;
                    if (this.usedHeaderId <= this.lastHeaderId) {
                        this.hideShowRateHeaders(tableEl, this.usedHeaderId, true);
                    }
                    rowCount = 0;
                }
                rowEl.style.display = '';
            } else {
                rowEl.style.display = 'none';
                this.numFiltered++;
            }
            // To keep the headers in order, we move the Row, not just make it visable.
            //JADE.prependToTable(tableEl, rowEl);
            if (tableEl.children) {
                tableEl.children[0].appendChild(rowEl);
            } else {
                // For FireFox < 3
                if (tableEl.firstChild.nextSibling) {
                    tableEl.firstChild.nextSibling.appendChild(rowEl);
                } else {
                    tableEl.firstChild.appendChild(rowEl);
                }
            }
            rowEl = null;
            delete rowEl;
        }
        // Speed up re-redering
        tableEl.style.display = '';
        // Remove duplicate Area Ids
        this.areasWithContent = JADE.removeDupsArray(this.areasWithContent);
        //this.storeInCookie();
        this.setMessageRow();
        tableEl = null;
        delete tableEl;
    },
    setMessageRow: function(message)
    {
        var messageRowEl = document.getElementById('messageRow');
        if (messageRowEl) {
            if (message) {
                messageRowEl.innerHTML = '<p class="waitMessage">' + message + '</p>';
            } else {
                var str = '';
                if (this.numFiltered) {
                    str += '<span id="clerFiltersLink"><a href="#" onclick="NIN.SearchResults.Sort.clearFilters()"><img src="images/close.jpg" alt="clear" width="15" height="15" border="0"> Clear All Filters</a></span>';
               	}
                str += 'Displaying ';
                if (this.numFiltered) {
					str += '<b>' + (this.getNumRows() - this.numFiltered) + '</b> of ';                
                }
                str += '<b>' + this.getNumRows() + '</b> Hotels.';
                str += '&nbsp;&nbsp;&nbsp;Rooms from <b>$' + this.getCheapestRoom() + '</b>.';
                if (this.isSorted) {
                    str += '&nbsp;&nbsp;&nbsp;Sorted by ' + this.fldToEnglish(this.sortFld) + '.';
                }
                if (this.numFiltered) {
                    str += '&nbsp;&nbsp;&nbsp;Filtered on ' + this.fldToEnglish(this.filteredOn) + '.';
               	}
                if (this.numFiltered == 0) { 
                	str += '&nbsp;&nbsp;&nbsp;<i>Too many results?</i>&nbsp; Use the filters to instantly narrow down the list!';
				}
                if (this.numFiltered >= this.getNumRows()) {
                    str += '<br />' + '<span style="font-weight:bold;font-style:italic;color:#dd3300">Your filter choices have hidden all ' + this.getNumRows() + ' hotels!</span>';         
                }
                messageRowEl.innerHTML = '<p class="statusMessage">' + str + '</p>';
            }
            messageRowEl = null;
            delete messageRowEl;
        }
    },
    toggleFilters: function(forceOpen)
    {
        var filtersEl = document.getElementById('filtersDiv');
        var imageEl = document.getElementById('moreFiltersimg');
        if (filtersEl) {
            if (filtersEl.style.display == 'block' && !forceOpen) {
                filtersEl.style.display = 'none';
                if (imageEl) {
                    imageEl.src = 'images/sort-down.gif';
                }
            } else {
                filtersEl.style.display = 'block';
                if (imageEl) {
                    imageEl.src = 'images/sort-up.gif';
                }
            }
            filtersEl = null;
            delete filtersEl;
            imageEl = null;
            delete imageEl;
        }
    },
    doDaySelect: function()
    {
        var orderEl = document.getElementById(this.rateOrderId);
        if (orderEl.value != '0') {
            this.sortDec = false;
            this.doSort(orderEl.value);
        } else {
            this.clearSort();
        }
        orderEl = null;
        delete orderEl;
        return false;
    },
    processForm: function(cat)
    {
        NIN.SearchResults.showBusy();
        var filterFrmEl = document.getElementById(this.filterFormId);
        if (filterFrmEl) {
            var propAmenities = null;
            var roomAmenities = null;
            var stars = [];
            stars =  NIN.SearchResults.stars;
            var showSelf = true;
            var secretStays = NIN.SearchResults.secretStayOnly;
            var hotDeals = NIN.SearchResults.hotDealOnly;
            var areas = [];
            var experiences = null;
            var minRate = null;
            var maxRate = null;
            var accomStyle = null;
            var roomType = null;
            for (var i = 0; i < filterFrmEl.elements.length; i++) {
                var field = filterFrmEl.elements[i];
                if (field.type == "checkbox") {
                    if (field.checked == true) {
                        var fieldCat = field.id.substr(0, 3);
                        if (fieldCat == 'fPA') {
                            propAmenities = propAmenities | field.value;
                        }
                        if (fieldCat == 'fRA') {
                            roomAmenities = roomAmenities | field.value;
                        }                
                    }
                }
                if (field.type == "select-multiple") {
                    if (field.id == 'fExperience') {
                        for (var j = 0; j < field.options.length; j++) {
                            if (field.options[j].selected) {
                                 experiences = experiences | field.options[j].value;
                            }
                        }
                    }

                }
                if (field.type == "select-one") {
                    if (field.id == 'fArea') {
                        for (var j = 0; j < field.options.length; j++) {
                            if (field.options[j].selected) {
                                areas[areas.length] = field.options[j].value;
                            }
                        }
                    }
                    if (field.id == 'fStyle') {
                        accomStyle = field.options[field.selectedIndex].value;
                        if (accomStyle == 'All') {
                            accomStyle = null;
                        }
                    }
                    if (field.id == 'fRoomType') {
                        roomType = field.options[field.selectedIndex].value;
                        if (roomType == 'All') {
                            roomType = null;
                        }
                    }
                }
                if (field.type == "text") {
                    if (field.id == 'priceRange-min') {
                        if (field.value) {
                            minRate = field.value;
                            minRate = parseInt(minRate);
                            if (isNaN(minRate)) {
                                minRate = null;
                                alert('Min Rate must be an number.');
                                field.value = '';
                            }
                        }
                    }
                    if (field.id == 'priceRange-max') {
                        if (field.value) {
                            maxRate = field.value;
                            maxRate = parseInt(maxRate);
                            if (isNaN(maxRate)) {
                                minRate = null;
                                alert('Max Rate must be an number.');
                                field.value = '';
                            }
                        }
                    }
                }
            }
            field = null;
            delete field;
            filterFrmEl = null;
            delete filterFrmEl;
            if (!this.isCacheBuilt) {
                NIN.SearchResults.hideBusy();
                return false;
            }
            this.setMessageRow('Filtering on ' + cat + '...');
            this.doFilter(propAmenities, roomAmenities, stars, showSelf, secretStays, hotDeals, areas, minRate, maxRate, experiences, accomStyle, roomType);
        }
    },
    hideOneArea: function()
    {
        var areaEl = document.getElementById(this.areaSelectId);
        if (areaEl) {
            // If there is only 1 Area with 1 Location then do not show control
            if (areaEl.options.length == 1) {
                var areaDivEl = document.getElementById(this.areaDivId);
                if (areaDivEl) {
                    areaDivEl.style.display = 'none';
                    areaDivEl = null;
                    delete areaDivEl;
                }
            }
            areaEl = null;
            delete areaEl;
        }
    },            
   /* buildDaySelect: function()
    {
        var rateSelectEl = document.getElementById(this.rateOrderId);
    	for (var i = 0; i < this.dayHeaders.length; i++) {
            rateSelectEl.options[rateSelectEl.options.length] = new Option(this.dayHeaders[i], 'Rate' + (i + 1), false, false);
        }
        rateSelectEl = null;
        delete rateSelectEl;
    },
    buildAreaSelect: function()
    {
        var areaId = 0;
        var areas = [];
        var areaSelectEl = document.getElementById(this.areaSelectId);
    	for (var i = 0; i < this.tableCache.length; i++) {
            if (this.tableCache[i].AreaId != areaId) {
                var cur = areas.length;
                areas[cur] = {};
                var tmpAreaName = this.tableCache[i].Area.replace(/ Mouse over rates for inclusions$/, '');
                tmpAreaName = tmpAreaName.replace(/Accommodation$/, '');
                areas[cur].name = tmpAreaName;
                areas[cur].id = this.tableCache[i].AreaId;
                areas[cur].locations = [];
                areaId = this.tableCache[i].AreaId;
            }
            if (this.tableCache[i].Location != '??') {
                areas[cur].locations[areas[cur].locations.length] = this.tableCache[i].Location;
            }
        }
        // If there is only 1 Area with 1 Location then do not show control
        if (areas.length == 1 && areas[0].locations.length == 1) {
            var areaDivEl = document.getElementById(this.areaDivId);
            if (areaDivEl) {
                areaDivEl.style.display = 'none';
                areaDivEl = null;
                delete areaDivEl;
            }
        } else {
    	    for (var i = 0; i < areas.length; i++) {
                // Sort array
                areas[i].locations.sort() 
                // Remove duplicates
                areas[i].locations = JADE.removeDupsArray(areas[i].locations);
                var oGroup = document.createElement('optgroup'); 
                oGroup.label = areas[i].name; 
                areaSelectEl.appendChild(oGroup);
                areaSelectEl.options[areaSelectEl.options.length] = new Option('All of ' + areas[i].name, areas[i].id, false, false);
    	        for (var j = 0; j < areas[i].locations.length; j++) {
    	            areaSelectEl.options[areaSelectEl.options.length] = new Option(areas[i].locations[j], areas[i].id + '|' + areas[i].locations[j], false, false);
                } 
            }
        }
        areaSelectEl = null;
        delete areaSelectEl;
    },*/
    updateDirectionImages: function()
    {
 		for (var j = 0; j < this.sortableItems.length; j++) {
			var itemType = this.sortFld;    
            var rateRx = /\bRate\d+\b/
            var rate = itemType.match(rateRx);
            if (rate) {
				itemType = 'Day';            
            }
			if (this.sortableItems[j] != itemType) {
				var imageId = this.sortableItems[j] + 'Dir';
        		imageEl = document.getElementById(imageId);
            	imageEl.src = 'images/1x1.gif'
			} else {
  				var imageId = itemType + 'Dir';    
        		imageEl = document.getElementById(imageId);
        		if (imageEl) {
            		if (this.sortDec) {
                		imageEl.src = 'images/sort-down.gif'
            		} else {
                		imageEl.src = 'images/sort-up.gif'
            		}
        		imageEl = null;
                delete imageEl;
                }
			}		
		}   
    },
    hideHeaders: function()
    {
        // Hide all Area Headers
        var areaEl = document.getElementById(this.areaSelectId);
        if (areaEl) {
            var areaId = null;
            var lastAreaId = null;
            for (var i = 0; i < areaEl.options.length; i++) {
                areaId = areaEl.options[i].value;
                var pos = areaId.indexOf('|');
                if (pos != -1) {
                    areaId = areaId.substring(0, pos);
                } 
                if (areaId != lastAreaId) {
                    lastAreaId = areaId;
                    var areaHeaderEl = document.getElementById(areaId);
                    if (areaHeaderEl) {
                        areaHeaderEl.style.display = 'none';
                    }
                }
            }
            areaHeaderEl = null;
            delete areaHeaderEl;
            areaEl = null;
            delete areaEl;
        }

        // Hide all Rate Headers
        for (var i = 1; i <= this.lastHeaderId; i++) {
            this.hideShowRateHeaders(null, i, false);
        }
        this.usedHeaderId = 0;
        headerEl = null;
        delete headerEl;
    },
    mergeTables: function()
    {
        // Each Area and 'page' of Rates is a seperate table, to allow sorting merge all tables into the first one.
        var firstTable = true;
        var tablesFound = 0;
        var rateTablesFound = 0;
        // Todo: use get by classname
        var tablesEl = JADE.getElementsByClassName('Page_Border', null, 'table');
        //var tablesEl = document.getElementsByTagName('table');
        tablesFound = tablesEl.length;
        for (var i = 0; i < tablesEl.length; i++) {
            // Only Rates tables
            if (tablesEl[i].className == 'Page_Border') {
                rateTablesFound++;
                tablesEl[i].id = 'oldRateTable' + rateTablesFound;
                if (firstTable) {
                    tablesEl[i].id = this.tableId;
                    var tableEl = tablesEl[i];
                    // Speed up rendering
                    tableEl.style.display = 'none';
                    firstTable = false;
                    // Get the Rate Header information
                    var row = tablesEl[i].getElementsByTagName('tr')[4];
                    var cellsEl = row.getElementsByTagName('td');
                    for (var k = 0; k < cellsEl.length; k++) {
                        if (cellsEl[k].className == 'book_headbox' || cellsEl[k].className == 'head_weekend') {
                            var value = JADE.getInnerText(cellsEl[k]);
                            value = value.replace(/\W+/g, ' ');
                            value = value.replace(/^\s+|\s+$/g, '');
                            // Cope with Firefox not having a space
                            if (value != 'FullRate' && value != 'Full Rate' && value != 'Select Property' && value != 'SelectProperty') {
                                if (value.charAt(3) != 32) {
                                    value = value.substring(0, 3) + ' ' + value.substring(3); 
                                }
                                this.dayHeaders[this.dayHeaders.length] = value;
                            }
                        }
                    }
                    cellsEl = null;
                    delete cellsEl;
                    //this.buildDaySelect();
                    this.hideOneArea();
                }

                var rowsEl = tablesEl[i].getElementsByTagName('tr');

                // Do we have an Area header?
                var value = JADE.getInnerText(rowsEl[0]);
                this.lastHeaderId++;
                var rateHeaderOffset = 0;
                // Allow for empty Area header
                if (value.length <= 0) {
                    rowsEl[0].id = this.rateHeaders[0] + this.lastHeaderId;
                }
                // Every X rows or after an Area header there is 4 header rows
                rowsEl[1].id = this.rateHeaders[1] + this.lastHeaderId;
                rowsEl[2].id = this.rateHeaders[2] + this.lastHeaderId;
                rowsEl[3].id = this.rateHeaders[3] + this.lastHeaderId;
                rowsEl[4].id = this.rateHeaders[4] + this.lastHeaderId;

                // appendChild 'moves' existing DOM elements, 
                // so we loop round for each row and move it to the first table, 
                // but as it has moved the array is shorter and we need to keep moving the first array element.
                var numRows = rowsEl.length;
                for (var j = 0; j < numRows; j++) {
                    // Append this row to the first table
                    //JADE.prependToTable(tableEl, rowsEl[0]);
                    if (tableEl.children) {
                        tableEl.children[0].appendChild(rowsEl[0]);
                    } else {
                        // For FireFox < 3
                        if (tableEl.firstChild.nextSibling) {
                            tableEl.firstChild.nextSibling.appendChild(rowsEl[0]);
                        } else {
                            tableEl.firstChild.appendChild(rowsEl[0]);
                        }
                    }
                }
                rowsEl = null;
                delete rowsEl;
            }
        }
        // Remove the emptied tables
        for (var l = 1; l <= rateTablesFound; l++) {
            var id = 'oldRateTable' + l;
            var oldTableEl = document.getElementById(id);
            if (oldTableEl) {
                oldTableEl.parentNode.removeChild(oldTableEl);
                oldTableEl = null;
                delete oldTableEl;
            }
        }
        // Speed up rendering
        tableEl.style.display = '';
        tablesEl = null;
        delete tablesEl;
        // Sanity test
/*
        var headerCountFld = document.getElementById('headerCount');
        if (headerCountFld) {
            var pageSuppliedValue = headerCountFld.value;
            pageSuppliedValue = pageSuppliedValue - 1;
            if (pageSuppliedValue != rateTablesFound) {
//                alert('Warning.\n\n Found ' + rateTablesFound + ' Rate Tables, expected ' + pageSuppliedValue + '.');
            }
            headerCountFld = null;
            delete headerCountFld;
        }
*/
//        alert('Tables=' + tablesFound + ' Rate Tables=' + rateTablesFound);
    },
    storeInCookie: function()
    {
        if (!NIN.SearchResults.Sort.using) {
            return false;
        }
        var storeParams = {};
        // Fix Rate Range
        if (NIN.SearchResults.Sort.filteredOn) {
            if (NIN.SearchResults.Sort.filteredOn.MinRate == NIN.SearchResults.Sort.getCheapestRoom() && NIN.SearchResults.Sort.filteredOn.MaxRate == NIN.SearchResults.Sort.getDearestRoom()) {
                NIN.SearchResults.Sort.filteredOn.RateUser = false;
            } else {
                NIN.SearchResults.Sort.filteredOn.RateUser = true;
            }
        }
        storeParams.filteredOn = NIN.SearchResults.Sort.filteredOn;
        storeParams.sortFld = NIN.SearchResults.Sort.sortFld;
        storeParams.sortFldType = NIN.SearchResults.Sort.sortFldType;
        storeParams.sortDec = NIN.SearchResults.Sort.sortDec;
        var session = new JADE.Session(false);
        session.write("filterObj", storeParams);
        storeParams = null;
        delete storeParams;
//alert('Store: ' + window.name);
    },
    restoreFromCookie: function()
    {
//alert('Read: ' + window.name);
        var fromSession = false;
        var session = new JADE.Session(false);
        if (session.read('filterObj')) {
            fromSession = true;
            storedParams = session.read("filterObj");
            NIN.SearchResults.Sort.filteredOn = storedParams.filteredOn;
            NIN.SearchResults.Sort.sortFld = storedParams.sortFld;
            NIN.SearchResults.Sort.sortFldType = storedParams.sortFldType;
            NIN.SearchResults.Sort.sortDec = !storedParams.sortDec;
            storedParams = null;
            delete storedParams;
        }
        // Override Range Select if not used
        if (NIN.SearchResults.Sort.filteredOn) {
            if (!NIN.SearchResults.Sort.filteredOn.RateUser) {
                NIN.SearchResults.Sort.filteredOn.MinRate = NIN.SearchResults.Sort.getCheapestRoom();
                NIN.SearchResults.Sort.filteredOn.MaxRate = NIN.SearchResults.Sort.getDearestRoom();
            }
        }
        // Override with URL values
        NIN.SearchResults.Sort.setFromUrl();
        if (NIN.SearchResults.Sort.filteredOn) {
            NIN.SearchResults.Sort.setSortFormFields();
            NIN.SearchResults.Sort.setFilterFormFields(true);
            NIN.SearchResults.Sort.processForm('previous');
        }
        if (NIN.SearchResults.Sort.sortFld) {
            NIN.SearchResults.Sort.doSort(this.sortFld);
        }
        return fromSession;
    },
    setFromUrl: function()
    {
        if (!NIN.SearchResults.Sort.filteredOn) {
            NIN.SearchResults.Sort.filteredOn = {};
        }
        if (JADE.params["minPrice"]) {
            NIN.SearchResults.Sort.filteredOn.MinRate = JADE.params["minPrice"];
        }
        if (JADE.params["maxPrice"]) {
            NIN.SearchResults.Sort.filteredOn.MaxRate = JADE.params["maxPrice"];
        }
        if (JADE.params["secretStays"]) {
            NIN.SearchResults.Sort.filteredOn.SecretStays = 1;
        }
        if (JADE.params["hotDeals"]) {
            NIN.SearchResults.Sort.filteredOn.HotDeals = 1;
        }
        if (JADE.params["deals"]) {
            NIN.SearchResults.Sort.filteredOn.SecretStays = 1;
            NIN.SearchResults.Sort.filteredOn.HotDeals = 1;
        }
        if (JADE.params["starRating"]) {
            var starArray = [];
            starArray = JADE.params["starRating"].split('-');
            NIN.SearchResults.Sort.filteredOn.Stars = starArray;
        }
        if (JADE.params["minStar"]) {
            var starArray = [];
            for (var i = parseInt(JADE.params["minStar"]); i < 51; i += 5){
              starArray[starArray.length] = i;
            }
            NIN.SearchResults.Sort.filteredOn.Stars = starArray;
        }
        if (JADE.params["maxStar"]) {
            var starArray = [];
            for (var i = parseInt(JADE.params["maxStar"]); i > 9; i -= 5){
              starArray[starArray.length] = i;
            }
            NIN.SearchResults.Sort.filteredOn.Stars = starArray;
        }
        if (JADE.params["accomStyle"]) {
            NIN.SearchResults.Sort.filteredOn.AccomStyle = JADE.params["accomStyle"];
        }
        if (JADE.params["amenities"]) {
            var amenitiesArray = [];
            var propAmenities = 0;
            var roomAmenities = 0;
            amenitiesArray = JADE.params["amenities"].split('-');
            for (var i = 0; i < amenitiesArray.length; i++) {
                if (amenitiesArray[i].substr(0, 1).toUpperCase() == 'P') {
                    var num = parseInt(amenitiesArray[i].substr(1));
                    if (num && !isNaN(num)) {
                        propAmenities = propAmenities | num;
                    }
                }
                if (amenitiesArray[i].substr(0, 1).toUpperCase() == 'R') {
                    var num = parseInt(amenitiesArray[i].substr(1));
                    if (num && !isNaN(num)) {
                        roomAmenities = roomAmenities | num;
                    }
                }
            }
            if (propAmenities) {
                NIN.SearchResults.Sort.filteredOn.PAmenities = propAmenities;
            }
            if (roomAmenities) {
                NIN.SearchResults.Sort.filteredOn.RAmenities = roomAmenities;
            }
        }
    },
    fldToEnglish: function(fld) {
        // Take the sort / filter fields and return an English message
        var str = '';
        if (typeof fld == 'object') {
            if (this.filteredOn.PAmenities || this.filteredOn.RAmenities) {
                str += ', Amenities';
            }
            if (this.filteredOn.Stars) {
                str += ', Star Ratings';
            }
            if (!this.filteredOn.ShowSelf) {
                str += ', Hide Self Rated';
            }
            if (this.filteredOn.Areas) {
                str += ', Areas';
            }
            if (this.filteredOn.SecretStays) {
                str += ', Secret Stays Only';
            }
            if (this.filteredOn.HotDeals)
            {
                str += ', Hot Deals Only';
            }
            if (this.filteredOn.AccomStyle)
            {
                str += ', Accommodation Style';
            }
            if (this.filteredOn.RoomType)
            {
                str += ', Room Type';
            }
            if (this.filteredOn.Experiences)
            {
                str += ', Experiences';
            }
            if (this.filteredOn.MinRate && this.filteredOn.MaxRate) {
                    str += ', Rate between $' + this.filteredOn.MinRate + ' and $' + this.filteredOn.MaxRate;
            } else {
                if (this.filteredOn.MinRate)
                {
                    str += ', Min Rate of $' + this.filteredOn.MinRate;
                }
                if (this.filteredOn.MaxRate)
                {
                    str += ', Max Rate of $' + this.filteredOn.MaxRate;
                }
            }
            str = str.substring(2);
        } else {
            switch (fld) {
                case 'Name':
                    str = 'Hotel Name';
                    break;
                case 'Location':
                    str = 'Hotel Location';
                    break;
                case 'Cheapest':
                    str = 'Cheapest Room Rate';
                    break;
                case 'Star':
                    str = 'Star Rating';
                    break;
                case 'FullRate':
                    str = 'Full Room Rate';
                    break;
                case 'Rate1':
                case 'Rate2':
                case 'Rate3':
                case 'Rate4':
                case 'Rate5':
                case 'Rate6':
                case 'Rate7':
                case 'Rate8':
                case 'Rate9':
                case 'Rate10':
                case 'Rate11':
                case 'Rate12':
                case 'Rate13':
                case 'Rate14':
                case 'Rate15':
                    var rateNum = fld.substring(4);
                    str = 'Room rate for ' + this.dayHeaders[rateNum - 1];
                    break;
            }
            if (this.sortDec) {
                str += ' Descending';
            } else {
                str += ' Ascending';
            }
        }
        return str;
    },
    hideShowRateHeaders: function(tableEl, num, show)
    {
        for (var i = 0; i < 5; i++) {
            var id = this.rateHeaders[i];
            id = id + num;
            var headerEl = document.getElementById(id);
            if (headerEl) {
                if (tableEl) {
                    //JADE.prependToTable(tableEl, headerEl);
                    if (tableEl.children) {
                        tableEl.children[0].appendChild(headerEl);
                    } else {
                        // For FireFox < 3
                        if (tableEl.firstChild.nextSibling) {
                            tableEl.firstChild.nextSibling.appendChild(headerEl);
                        } else {
                            tableEl.firstChild.appendChild(headerEl);
                        }
                    }
                }
                if (show) {
                    headerEl.style.display = '';
                } else {
                    headerEl.style.display = 'none';
                }
                headerEl = null;
                delete headerEl;
            }
        }
    },
    getCacheRowById: function(id)
    {
        for (var i = 0; i < this.tableCache.length; i++)
        {
            if (this.tableCache[i].AccommId == id) {
                return i;
            }
        }
        return -1;
    },
    setFilterFormFields: function(restore)
    {
        NIN.SearchResults.stars = [];
        NIN.SearchResults.secretStayOnly = false;
        NIN.SearchResults.hotDealOnly = false;
        this.curMaxRate = this.getDearestRoom();
        this.curMinRate = this.getCheapestRoom();
        if (priceRangeSlider) {
            priceRangeSlider.setPointer(this.curMaxRate, this.curMinRate);
        }
        for (var k = 1; k <= 6; k++) { ;
            var fieldId = 'fStars' + k;
            var starEl = document.getElementById(fieldId);
            if (starEl) {
                starEl.className = 'starOff';
                starEl = null;
                delete starEl;
            }         
        }
        var secretEl = document.getElementById('fShhImg');
        if (secretEl) {
            secretEl.className = 'shhhOff';
            secretEl = null;
            delete secretEl;
        }
        var hotDealEl = document.getElementById('fHotDealImg');
        if (hotDealEl) {
            hotDealEl.className = 'hotDealOff';
            hotDealEl = null;
            delete hotDealEl;
        }
        var filterFrmEl = document.getElementById(this.filterFormId);
        if (filterFrmEl) {
            var paCount = 0;
            var raCount = 0;
            // Reset the form fields
            for (var i = 0; i < filterFrmEl.elements.length; i++) {
                var field = filterFrmEl.elements[i];
                if (field.type == "checkbox") {
                    var fieldCat = field.id.substr(0, 3);
                    if (fieldCat == 'fPA') {
                        paCount++;
                    }
                    if (fieldCat == 'fRA') {
                        raCount++;
                    }
                    if (restore) {
                        filterFrmEl[field.id].checked = false;
                    } else {
                        if (fieldCat != 'fSt' && fieldCat != 'fSr') {
                            filterFrmEl[field.id].checked = false;
                        } else {
                            filterFrmEl[field.id].checked = true;
                        }
                    }
                }
                if (field.type == "select-multiple") {
                    if (field.id == 'fExperience') {
                        for (var j = 0; j < filterFrmEl[field.id].options.length; j++) {
                            filterFrmEl[field.id].options[j].selected = false;
                            if (restore) {
                                if (this.filteredOn && this.filteredOn.Experiences) {
                                    if ((filterFrmEl[field.id].options[j].value & this.filteredOn.Experiences) == filterFrmEl[field.id].options[j].value) {
                                        filterFrmEl[field.id].options[j].selected = true;
                                    }
                                }
                            }
                        }
                    }
                    if (!restore) {
                        filterFrmEl[field.id].options[0].selected = true;
                    }
                }
                if (field.type == "select-one") {
                    if (field.id == 'fArea') {
                       var selectedOp = 0;
                        for (var j = 0; j < filterFrmEl[field.id].options.length; j++) {
                            filterFrmEl[field.id].options[j].selected = false;
                            if (restore) {
                                if (this.filteredOn && this.filteredOn.Areas) {
    				                for (var k = 0; k < this.filteredOn.Areas.length; k++) { 
                                        if (this.filteredOn.Areas[k] == filterFrmEl[field.id].options[j].value) {
                                            filterFrmEl[field.id].options[j].selected = true;
                                            selectedOp = j;
                                        }
                                    }
                                }
                            }
                        }
                        filterFrmEl[field.id].selectedIndex = selectedOp;
                    }
                    if (field.id == 'fStyle') {
                        var selectedOp = 0;
                        for (var j = 0; j < filterFrmEl[field.id].options.length; j++) {
                            filterFrmEl[field.id].options[j].selected = false;
                            if (restore) {
                                if (this.filteredOn && this.filteredOn.AccomStyle) {
                                    if (filterFrmEl[field.id].options[j].value == this.filteredOn.AccomStyle) {
                                        filterFrmEl[field.id].options[j].selected = true;
                                        selectedOp = j;
                                    }
                                }
                            }
                        }
                        filterFrmEl[field.id].selectedIndex = selectedOp;
                    }
                    if (field.id == 'fRoomType') {
                        var selectedOp = 0;
                        for (var j = 0; j < filterFrmEl[field.id].options.length; j++) {
                            filterFrmEl[field.id].options[j].selected = false;
                            if (restore) {
                                if (this.filteredOn && this.filteredOn.RoomType) {
                                    if (filterFrmEl[field.id].options[j].value == this.filteredOn.RoomType) {
                                        filterFrmEl[field.id].options[j].selected = true;
                                        selectedOp = j;
                                    }
                                }
                            }
                        }
                        filterFrmEl[field.id].selectedIndex = selectedOp;
                    }
                    if (!restore) {
                        filterFrmEl[field.id].selectedIndex = 0;
                        filterFrmEl[field.id].options[0].selected = true;
                    }
                }
                if (field.type == "text") {
                    field.value = '';
                    if (field.id == 'priceRange-max') {
                        field.value = this.curMaxRate;
                    }
                    if (field.id == 'priceRange-min') {
                        field.value = this.curMinRate;
                    }
                }
            }
            field = null;
            delete field;
            if (this.filteredOn) {
                if (this.filteredOn.PAmenities) {
                    for (var k = 0; k < paCount; k++) {
                        var amenityMask = Math.pow(2, k);
                        if ((this.filteredOn.PAmenities & amenityMask) == amenityMask) {
                            var fieldId = 'fPA' + (k + 1);
                            filterFrmEl[fieldId].checked = true;
                            for (l = 0; l < this.priorityAmenity.length; l++) {
                                if (this.priorityAmenity[l] == fieldId) {
                                    filterFrmEl['fAmenitie' + (l + 1)].checked = true;
                                }
                            }
                        }
                    }
                }
                if (this.filteredOn.RAmenities) {
                    for (var k = 0; k < raCount; k++) {
                        var amenityMask = Math.pow(2, k);
                        if ((this.filteredOn.RAmenities & amenityMask) == amenityMask) {
                            var fieldId = 'fRA' + (k + 1);
                            filterFrmEl[fieldId].checked = true;
                            for (l = 0; l < this.priorityAmenity.length; l++) {
                                if (this.priorityAmenity[l] == fieldId) {
                                    filterFrmEl['fAmenitie' + (l + 1)].checked = true;
                                }
                            }
                        }
                    }
                }
                if (this.filteredOn.Stars) {
                    NIN.SearchResults.stars = this.filteredOn.Stars;
                    for (var k = 0; k < this.filteredOn.Stars.length; k++) { 
                        var idNum = this.filteredOn.Stars[k] / 10;
                        idNum = parseInt(idNum);
                        var fieldId = 'fStars' + idNum;
                        var starEl = document.getElementById(fieldId);
                        if (starEl) {
                            starEl.className = 'starOn';
                            starEl = null;
                            delete starEl;
                        }         
                    }
                }
                if (this.filteredOn.SecretStays) {
                    NIN.SearchResults.secretStayOnly = this.filteredOn.SecretStays;
                    var secretEl = document.getElementById('fShhImg');
                    if (secretEl) {
                        secretEl.className = 'shhhOn';
                        secretEl = null;
                        delete secretEl;
                    }
                    var checkEl = document.getElementById('fSecritStay');
                    if (checkEl) {
                        checkEl.checked = true;
                        checkEl = null;
                        delete checkEl;
                    }
                }
                if (this.filteredOn.HotDeals) {
                    NIN.SearchResults.hotDealOnly = this.filteredOn.HotDeals;
                    var hotDealEl = document.getElementById('fHotDealImg');
                    if (hotDealEl) {
                        hotDealEl.className = 'hotDealOn';
                        hotDealEl = null;
                        delete hotDealEl;
                    }
                    var checkEl = document.getElementById('fHotDeal');
                    if (checkEl) {
                        checkEl.checked = true;
                        checkEl = null;
                        delete checkEl;
                    }
                }
                if (this.filteredOn.MaxRate) {
                    this.curMaxRate = this.filteredOn.MaxRate;
                    filterFrmEl['priceRange-max'].value = this.filteredOn.MaxRate;
                }
                if (this.filteredOn.MinRate) {
                    this.curMinRate = this.filteredOn.MinRate;
                    filterFrmEl['priceRange-min'].value = this.filteredOn.MinRate;
                }
            }
            filterFrmEl = null;
            delete filterFrmEl;
        }
    },
    setSortFormFields: function()
    {
        // Set day (Rate) selected
        if (this.sortFld.substr(0, 4) == 'Rate') {
            var dayField = document.getElementById(this.rateOrderId);
            if (dayField) {
                for (var i = 1; i < dayField.options.length; i++) {
                    if (dayField.options[i].value == this.sortFld) {
                        dayField.options[i].selected = true;
                        continue;
                    }
                }
            }
        }
    },
    clearRateRange: function()
    {
        var el = document.getElementById('minRate');
        if (el) {
            el.value = '';
        }
        var el = document.getElementById('maxRate');
        if (el) {
            el.value = '';
        }
        el = null;
        delete el;
        NIN.SearchResults.Sort.filteredOn.MinRate = null;
        NIN.SearchResults.Sort.filteredOn.MaxRate = null;
    }
};

//JADE.addLoadListener(NIN.SearchResults.Sort.__construct);
//JADE.addUnloadListener(NIN.SearchResults.Sort.removeCache);
JADE.addUnloadListener(NIN.SearchResults.Sort.storeInCookie);
