if(getQueryStringParameter("type")!= null && getQueryStringParameter("type") =='return')
{
    document.title= "Return Ticket Booking - Search Buses";
}

var bpsList = document.getElementById("bplist");
var dpsList = document.getElementById("dplist");
var bustypeList = document.getElementById("bustypelist");
var calendarDate = $("#calendar").val();

var bps = {};
var dps = {};
var processedRoutes = [];
var showPromoOffer = false;
var mSearchCount = 0;
var noOfBook = 0;
var noOfBOP = 0;
var noOfsoldOut = 0;
//var filterAtLoadTime = true;  
var ratingFilterUsed = false;
var colOnWhichToSort = 'sortCategory';
var orderOfSort = 'asc';



var originalurl = window.location.href;
originalurl = originalurl.toLowerCase();
var jsonUrl = originalurl.replace('selectbus.aspx', 'SearchResultsJSON.aspx');


function handleAllResults(data) {
    var x = eval('(' + data + ')');
    var rawData = x.data;

//    rawData.sort(function (a, b) {
//        if (!a.sortCategory || !b.sortCategory) return -1;
//        var diffCategory = a.sortCategory - b.sortCategory;
//        if (diffCategory == 0) return (a.departureTime - b.departureTime);
//        return diffCategory;
//    });

    loadData(rawData);
    //After first time sorting deafult to departure sort unless otherwise selected other column
    colOnWhichToSort = 'departureTimeString';
    unblock();
}

function handleResultsError() {
    var message = '<strong>No tickets were found for this route today.</strong><br/> Search results change daily based on availability. If you have an urgent requirement, please get in touch with our call center using the contact details mentioned on the home page. They will assist you to the best of their ability.';
    $("#bpDiv").hide();
    $("#ratingFilterMessageText").hide();
    displayError(message);
    unblock();
}

function unblock() {
    if ($.browser.msie) {
        $('#iefader').hide();
    }
    else {
        $.unblockUI();
    }
}

function block() {

    if ($.browser.msie) {
        $('#iefader').show();
    }
    else {
        var faderoptions = {
            message: $('#fader'),
            overlayCSS: {
                backgroundColor: '#fff',
                opacity: .9
            },
            css: {
                border: 'none',
                backgroundColor: '#fff',
                color: '#fff',
                left: '47%',
                width: '0%'
            }
        };
        $.blockUI(faderoptions);
    }
}

function getAllRoutes() {
    $.ajax({
        url: jsonUrl,
        cache: true,
        dataType: 'text',
        type: "GET",
        beforeSend: block,
        success: handleAllResults,
        error: handleResultsError
    });
}

function displayError(message) {
    var message = '<span class="big">Oops!</span><div class="flash" style="font-size:15px;" >' + message + '</div>'
    $("#NoResultText").html(message);
    $("#NoResultMsg").show();
    return;
}

function cluetipJquery() {
    //$('a.basic').cluetip({splitTitle: '|'});  
    $('a.basic').cluetip({
        splitTitle: '|',
        // use the invoking element's title attribute to populate the clueTip...
        width: '210',
        height: 'auto',
        dropShadow: true,
        // set to false if you don't want the drop-shadow effect on the clueTip
        dropShadowSteps: 1,
        showTitle: false // hide the clueTip's heading
    });
}

function modifyShow() {
    $("#search").toggle(200);
    if($("#search").css("opacity") == "0") {
        $("#modifyDiv").css("margin-top","20px")
    }
    else {
        $("#modifyDiv").css("margin-top","40px")
    }     
}


function initDataModel() {
    jQuery("#list4").jqGrid({
        afterInsertRow: function () {},
        datatype: "local",
        height: "auto",
        colNames: ['<span style="padding-left:10px"><u>Travels</u></span>', '<u>Bus type</u>', '<u>Departure</u>', '<u>Arrival</u>', '<u>Fare</u>', '<u>Seats</u>', '<u>Rating</u>', '<u>mTicket</u>', '<span style="padding-left:2px"><u>Status</u></span>'],
        colModel: [{
            name: 'travelsString',
            index: 'travelsString',
            width: 170,
            sorttype: "string",
            align: "left",
            fixed: true,
            title:false,
            resizable: false},
        {
            name: 'busType',
            index: 'busType',
            width: 130,
            sorttype: "string",
            align: "left",
            fixed: true,
            title:false,
            firstsortorder: "desc",
            resizable: false},
        {
            name: 'departureTimeString',
            index: 'departureTime',
            width: 110,
            align: "center",
            sorttype: "string",
            fixed: true,
            title:false,
            resizable: false},
        {
            name: 'arrivalTimeString',
            index: 'arrivalTime',
            width: 120,
            align: "center",
            sorttype: "string",
            title:false,
            fixed: true,
            title:false,
            resizable: false},
        {
            name: 'fareString',
            index: 'fareString',
            width: 70,
            align: "center",
            sorttype: "float",
            fixed: true,
            title:false,
            resizable: false},
        {
            name: 'seats',
            index: 'seats',
            width: 75,
            align: "center",
            sorttype: "int",
            title:false,
            firstsortorder: "desc",
            fixed: true,
            resizable: false},
        {
            name: 'ratingsString',
            index: 'ratingsString',
            sorttype: "string",
            width: 95,
            drag: false,
            title:false,
            align: "center",
            firstsortorder: "desc",
            fixed: true,
            resizable: false},
        {
            name: 'mTicketString',
            index: 'mTicketString',
            width: 90,
            align: "center",
            sorttype: "string",
            title:false,
            fixed: true,
            resizable: false},
        {
            name: 'bookingStatus',
            index: 'bookingStatus',
            width: 100,
            align: "right",
            title:false,
            sortable: true,
            fixed: true,
            resizable: false}],
        multiselect: false,
        imagepath: "/images",
        sortname: "departureTime",
        altRows: true,
        sortorder: "asc",
        rowNum: -1,
        loadComplete: function () {
            cluetipJquery();
        },
        onSortCol: function (index, iCol, sortorder) {            
                sortDataa(index, sortorder);
                return "stop";
        }
    });

}

function sortDataa(index, sortorder) {
    colOnWhichToSort = index;
    orderOfSort = sortorder;   
    filterResults();
}

function comparatorFunction(a, b) {
//This is some really clever code ;) u have been cautioned
    var a1;
    var b1; 
    if (colOnWhichToSort == "departureTimeString") {
        a1 = getDepatureTimeInMins(a,$("#bplist").val());
        b1 = getDepatureTimeInMins(b,$("#bplist").val());       
    }
    else if (colOnWhichToSort == "arrivalTimeString") {
        a1 = getArrivalTimeInMins(a,$("#dplist").val());
        b1 = getArrivalTimeInMins(b,$("#dplist").val());
    }
    else if (colOnWhichToSort == "fareString") {
        a1 = a.faresList[0];
        b1 = b.faresList[0];
    }
    else if (colOnWhichToSort == "busType") {
        a1 = getBusTypeInNumber(a);
        b1 = getBusTypeInNumber(b);               
    }
    else if (colOnWhichToSort == "seats") {
        a1 = a.seats=="-"?0:a.seats;
        b1 = b.seats=="-"?0:b.seats;               
    }
    else if (colOnWhichToSort == "bookingStatus") {
        a1 = a.sortCategory;
        b1 = b.sortCategory;               
    }
//this happens at load time -- not needed anymore
//    else if (colOnWhichToSort == "sortCategory") {
//        if (!a.sortCategory || !b.sortCategory) return -1;
//        var diffCategory = a.sortCategory - b.sortCategory;
//        if (diffCategory == 0) return (a.departureTime - b.departureTime);
//        return diffCategory;
//    }  
    else{
        a1 = a[colOnWhichToSort];
        b1 = b[colOnWhichToSort];
    }
    
    //when all else equal, sorting shud default to deptime in desc
    if(a1==b1){
        a1 = a.departureTime;
        b1 = b.departureTime;
        return a1-b1;
    }
     
    if (orderOfSort == "asc"){ 
        return a1<b1?-1:1;
    }    
    if (orderOfSort == "desc"){ 
        return a1<b1?1:-1;
    }    
    return 0;    
}

//Higher the number the better bus
function getBusTypeInNumber(route){
    var num = 0;
    try{
        //this order of cases is important!!    
        if(route.isAc) num = 10; 
        if(route.isSleeper) num = 5;             
        if(route.isNonAc) num = 1;
//        var busType = route.busType;
//        if(busType.match(/multi/i) != null) num =  11;
//        else if(busType.match(/volvo/i) != null) num =  10;
//        else if(busType.match(/benz/i) != null) num =  9;
//        else if(busType.match(/isuzu/i) != null) num =  8;
//        else if(busType.match(/lexia/i) != null) num =  8;
//        else if(busType.match(/non a\/c/i) != null) num =  1;
//        else num = 5;
    }catch(err){
       num = 0;
    }
    return num;
}

function loadData(rawData) {
    if (isNullOrEmpty(rawData) || rawData.toString() == "NaN") {
        var message = '<strong>No tickets were found for this route today.</strong><br/> Search results change daily based on availability.If you have an urgent requirement, please get in touch with our call center using the contact details mentioned on the home page. They will assist you to the best of their ability.'
        $("#loadingResults").hide();
        $("#bpDiv").hide();
        $("#ratingFilterMessageText").hide();
        displayError(message);
        $.unblockUI();
        return;
    }

    initDataModel();

    var sourceId = getQueryStringParameter('fromCityId');
    var destinationId = getQueryStringParameter('toCityId');

    for (var i = 0; i < rawData.length; i++) {
        var row = rawData[i];
        row.mysortc = i;

        if (row.busStatus == 'AVAILABLE') {
            noOfBook++;
        }
        if (row.busStatus == 'REQUEST') {
            noOfBOP++;
        }
        if (row.sortCategory == "4") {
            noOfsoldOut++;
        }
        row.bookingStatus = getButtonType(row);

        var fareString = '';
        for (var l = 0; l < row.faresList.length; l++) {
            fare = row.faresList[l];
            if (fare == 0) {
                fareString = '-';
            }
            else {
                fareString += fare + '/';
            }
        }
        if (fareString.length > 1 && fareString.charAt(fareString.length - 1) == '/') {
            fareString = fareString.substring(0, fareString.length - 1);
        }
        row.fareString = fareString;

        for (var c = 0; c < row.BPInformationList.length; c++) {
            bp = row.BPInformationList[c];
            bps[bp.bpLocation] = bp.bpLocation;
        }
        for (var c = 0; c < row.DPInformationList.length; c++) {
            dp = row.DPInformationList[c];
            dps[dp.bpLocation] = dp.bpLocation;
        }

        if (row.noOfseatsAvailable == 0) row.seats = '-';
        else row.seats = row.noOfseatsAvailable;

      if (!isNullOrEmpty(row.isSpecialFare) && row.isSpecialFare == true) {
             var toolT = "<div class='grayTextSmall' style='margin:5px;margin-top:20px;font-size:11px;font-weight:normal' >This bus has a high fare. </div><div class='grayTextSmall' style='margin:5px;font-size:11px;margin-top:15px;font-weight:normal' >The fare is set by the bus operator.</div>"
            fareString = row.fareString + "<div style='margin-top:8px;'><a class ='basic blueTextNormal' title =\""+toolT+"\">over priced </a></div>";
       }

        row.fareString = fareString;
        if (!isNullOrEmpty(row.package)) {
            row.fareString = row.fareString + "<br/><a class='tooltip moreinfolinks' href='#'>package</a>";
        }

        //move this into preprocess/loadData --DONE
        var ratingString = ' No reviews';
        var reviewText = ' No reviews';
        var reviewImage = "<div style='margin-left:25px'>-</div>";
        var reviewPoints = 0;
        var ratingToolTip = "<div style='text-align:left;'><span style='display:none;margin:5px'>" + parseFloat(reviewPoints).toFixed(1) + " / 5&nbsp;</span><div style='margin-left:18px'>" + reviewImage + "</div><div style='padding-top:7px;padding-left:9px'><div style='margin-left:9px;padding-top:2px'><a class ='basic blueTextNormal' style='height:30px;vertical-align:bottom;' href='#'  title=\"" + ratingString + "\"  onclick='customerReviews(" + row.routeId + ");return false;'><span style='display:none;'>(</span>" + reviewText + "<span style='display:none'>)</span></a></div></div></div>";       
        
        if (row.Rating != null && row.Rating["Reviews"] != "NR") {

            ratingString = getReviewString(row);

            reviewText = row.Rating["Count3"] + ' reviews';
            if (parseInt(row.Rating["Count3"]) == 1) {
                reviewText = row.Rating["Count3"] + ' review';
            }            
            reviewPoints = getReviewPoints(row);
           
            reviewImage = getReviewImage(reviewPoints);
            ratingToolTip = "<div style='text-align:left;padding-left:13px'><span style='display:none;margin:5px'>" + parseFloat(reviewPoints).toFixed(1) + " / 5&nbsp;</span><div>" + reviewImage + "</div><div style='padding-top:7px;padding-left:5px'><div style='text-align:left'><a class ='basic blueTextNormal' style='height:30px;vertical-align:bottom;' href='#'  title=\"" + ratingString + "\"  onclick='customerReviews(" + row.routeId + ");return false;'><span style='display:none;'>(</span>" + reviewText + "<span style='display:none'>)</span></a></div></div></div>";       
        
        }
        else if (row.Rating != null && row.Rating["Reviews"] == "NR" && row.Rating["opRanking"] != null && row.Rating["opRanking"] != 0.0  ) {
            
            reviewText = 'operator rating';
            reviewPoints = row.Rating["opRanking"];
            reviewImage = getReviewImage(reviewPoints);
            ratingString = "<div class='redTextBold' style='margin:15px;margin-top:20px;'>Operator rating</div> <div style='margin:15px;margin-top:20px'class='smallText'>This bus has not been rated yet.</div> <div style='margin:15px;margin-top:30px'class='smallText'>The rating that is shown is an</div>  <div style='margin:15px;margin-top:15px'class='smallText'>aggregate of the ratings of all</div><div style='margin:15px;margin-top:15px'class='smallText'>other buses by this operator.</div>";
            ratingToolTip = "<div style='text-align:left;'><span style='display:none;margin:5px'>" + parseFloat(reviewPoints).toFixed(1) + " / 5&nbsp;</span><div style='margin-left:12px'>" + reviewImage + "</div><div style='padding-top:7px;padding-right:5px'><div style='margin-left:9px;padding-top:2px'><a class ='basic blueTextNormal' style='height:30px;vertical-align:bottom;' href='#'  title=\"" + ratingString + "\"  onclick='customerReviews(" + row.routeId + ");return false;'><span style='display:none;'>(</span>" + reviewText + "<span style='display:none'>)</span></a></div></div></div>";       
        
        }

        var travelString = "<span class='BlueBold' >" + row.travelsName + "</span><br/>";
        var travelMoreInfo = "<div style='padding-left:5px'>" + travelString + "<div style='height:20px;padding-top:9px;'><a href='#' onclick='moreInfo(" + row.routeId + ");return false;' style='padding-top:4px;padding-left:0px'  class='blueTextNormal'>more info</a></div></div>"
        row.travelsString = travelMoreInfo;
        row.ratingsString = ratingToolTip;
        
       row.reviewPoints = reviewPoints;

        row.mTicketString = "<div style='text-align:center'> - </div>";
        if (row.isMTicket == true) {
            row.mTicketString = "<a class ='basic blueTextNormal' style='height:0px; vertical-align:bottom;' href='#' onclick=\"Javascript:window.open('/mTicket.aspx','_new','');return false;\" title=\"<div style='margin:7px'><div class='redTextBold' style='margin:10px'>mTicket (Get ticket on mobile)</div><div class='smalltext' style='margin:5px;padding-top:10px'><div style='margin:10px'>This bus can be boarded by </div> <div style='margin:10px'>simply showing the mTicket SMS.</div><div style='margin-left:10px;margin-top:20px;' class='grayTextSmall'><br />Click icon to view a sample SMS</div></div></div>\"><img src='/images/mTicketPostAidsrp.gif' alt='' /></a>";
        }

        processedRoutes[processedRoutes.length] = row;
//        if (!showPromoOffer) {
//            showPromoOffer = isPromotionalRoute(row);
//        }
    }
    if (showPromoOffer) $('#redBusOffer').show();
    //$('.loading').remove();
    $("#jqgh_travelsString").css({
        float: "left"
    }); // to make the first column to the left
    $("#jqgh_busType").css({
        float: "left"
    });


    bpsList.options.length = 0;
    dpsList.options.length = 0;

    bpsList.options[0] = new Option("-- Boarding points --", "");
    for (var key in bps) {
        var index = bpsList.options.length;
        bpsList.options[index] = new Option(key, bps[key]);
        //if(key == bpselected){bpsList.options[index].selected=true;}
    }
    dpsList.options[0] = new Option("-- Dropping points --", "");
    for (var key in dps) {
        var index = dpsList.options.length;
        dpsList.options[index] = new Option(key, dps[key]);
        //if(key == dpselected){dpsList.options[index].selected=true;}
    }
    sortBP('bplist');
    sortBP('dplist');
    setFilterValuesFromCookie();
    
    filterResults();

}
function getDepatureTimeInMins(route,bpselected)
{
    if (isNullOrEmpty(bpselected)) {
        return route.departureTime;
    }
    for (var c = 0; c < route.BPInformationList.length; c++) {
        bp = route.BPInformationList[c];
        if (bp.bpLocation == bpselected) {
            return bp.bpTime;
        }
    }
    return route.departureTime;

}
function getArrivalTimeInMins(route,bpselected)
{
    if (isNullOrEmpty(bpselected)) {
        return route.arrivalTime;
    }
    for (var c = 0; c < route.BPInformationList.length; c++) {
        bp = route.BPInformationList[c];
        if (bp.bpLocation == bpselected) {
            return bp.bpTime;
        }
    }
    return route.arrivalTime;

}
function getdepartureTime(route, bpselected) {
    if (isNullOrEmpty(bpselected)) {
        return route.departureTimeStringOrig;
    }
    for (var c = 0; c < route.BPInformationList.length; c++) {
        bp = route.BPInformationList[c];
        if (bp.bpLocation == bpselected) {
            return bp.bpTimeString;
        }
    }
    return route.departureTimeStringOrig;
}

function getarrivalTime(route, dpselected) {
    if (isNullOrEmpty(dpselected)) {
        return route.arrivalTimeStringOrig;
    }
    for (var c = 0; c < route.DPInformationList.length; c++) {
        dp = route.DPInformationList[c];
        if (dp.bpLocation == dpselected) {
            return dp.dpTimeString;
        }
    }
    return route.arrivalTimeStringOrig;
}

function trackFilterEvent() {
    try {
        pageTracker._trackEvent('searchFilter', $("#ratingFilter").val(), 'filter clicked');
    } catch (err) {}
    return;
}

function filterResults() {
    processedRoutes.sort(comparatorFunction);
    var bustype = $("#bustypelist").val();
    var bpselected = $("#bplist").val();
    var dpselected = $("#dplist").val();
    var ratingSelected = $("#ratingFilter").val();
    var rowNr = 0;
    var count = 0;
    var hiddenSeats = 0;
    //hide all mesages
    var showNotifyMe = false;
    $("#notifyMe").hide();
    $("#NoResultMsg").hide();

    var filteredBps = {};
    var filteredDps = {};
    var filteredBusTypes = {
        isAC: false,
        isNonAC: false,
        isSleeper: false
    };

    jQuery("#list4").clearGridData();

    //console.log(bustype + "-" + bpselected + "-" + dpselected + "-" + ratingSelected);
    for (var i = 0; i < processedRoutes.length; i++) {
        route = processedRoutes[i];
        if (route.operatorId == 172 || (route.operatorId == 163 && (route.seats > 0 && route.seats <= 6))) continue;
	//don't show vrl to corporate Users
        if(route.operatorId == 150 && readCookie('UserDet')!=null) continue;

        if (noOfBook > 0 && noOfBOP > 0 && route.busStatus == 'REQUEST') {
            continue;
        }

        if (routeContainsBP(route, bpselected) && routeContainsDP(route, dpselected) && routeContainsBusType(route, bustype) && !routeInRatingFilter(route, ratingSelected)) {
            if (route.seats != '-') {
                hiddenSeats += parseInt(route.seats);
            }
            continue;
        }

        if (routeContainsBP(route, bpselected) && routeContainsDP(route, dpselected) && routeContainsBusType(route, bustype) && routeInRatingFilter(route, ratingSelected)) {
            var depTime = getdepartureTime(route, bpselected);
            var arrTime = getarrivalTime(route, dpselected);

            var bpString = getBoardingDroppingString(route.BPInformationList, 'BP');
            var dpString = getBoardingDroppingString(route.DPInformationList, 'DP');

            route.departureTimeString = "<a class ='basic blueTextNormal' style='height:0px; vertical-align:bottom;' href='#' onclick='moreInfo(" + route.routeId + ");return false;'  title=\"" + bpString + "\"  >" + depTime + "</a>";
            if(arrTime != "00:05 AM"){
                route.arrivalTimeString = "<a class ='basic blueTextNormal' style='height:0px; vertical-align:bottom;' href='#' onclick='moreInfo("+route.routeId+");return false;' title=\""+dpString+ "\"  >"+arrTime+"</a>";
            }
            else{
                route.arrivalTimeString = "-";
            }
            jQuery("#list4").addRowData(rowNr++, route);
            //promotionalOffer(route);                 
            count++;

/*
            //code for smart filters..Ditched this feature
            for(var c=0;c<route.BPInformationList.length;c++){
                var bp = route.BPInformationList[c];    
                filteredBps[bp.bpLocation]=bp.bpLocation;            
            }
            for(var c=0;c<route.DPInformationList.length;c++){
                var dp = route.DPInformationList[c];    
                filteredDps[dp.bpLocation]=dp.bpLocation;            
            }
            
            //make true the corresponding bustype            
            if(route.isAc)
                filteredBusTypes.isAC = true;
            if(route.isNonAc)
                filteredBusTypes.isNonAC = true;
            if(route.isSleeper)
                filteredBusTypes.isSleeper = true;
            */
        }

    }

    $("#bpDiv").show();
    $("#ratingFilterMessageText").show();

    //hide "Try this" after using rating Filter once
    if (ratingFilterUsed) {
        $('#ratingFilterMessageText').hide();
    }

    if (ratingSelected == "all" || processedRoutes.length == count || hiddenSeats == 0) {
        
    } 
    else if(ratingSelected == "high"){
        $('#ratingFilterMessageText').css('width', '100%');
        $('#ratingFilterMessageText').html("<div class='flash' style='font-size:11px;margin:0px;padding:0px'><span  style='font-weight:bold'>" + hiddenSeats + "</span> lower rated seats <span style='font-weight:bold'>hidden</span> <br/>as they <span style='font-weight:bold'>aren't recommended</span>. <div style='padding-top:5px'>Choose 'Lower rated' to see them.</div></div>");
        $('#ratingFilterMessageText').show();
    }
    else if(ratingSelected == "low"){
        $('#ratingFilterMessageText').css('width', '100%');
        $('#ratingFilterMessageText').html("<div class='flash' style='font-size:11px;margin:0px;padding:0px'><span  style='font-weight:bold'>" + hiddenSeats + "</span> high rated seats <span style='font-weight:bold'>hidden.</span><div style='padding-top:5px'>Choose 'Higher rated' to see them.</div></div>");
        $('#ratingFilterMessageText').show();
    }
    else {
        $('#ratingFilterMessageText').show();
    }

    if (count == 0) {
        $("#results").hide();
        var message = "There are no results for the selected combination of bus type, boarding point, dropping point and ratings <br/> We request you to try another convenient combination or <a  href='javascript:void(0)' onclick='javascript:clearFilters();'>click here</a> to view all results";
        if(hiddenSeats != 0 && ratingSelected == "high"){
            message = "There are no higher rated buses for your search.<a href='javascript:void(0)' onclick='javascript:clearFilters();'>Click here</a> to view "+hiddenSeats+" lower rated seats that have been hidden as they aren't recommended.";
        }
        else if (hiddenSeats != 0 && ratingSelected == "low"){
            message = "There are no lower rated buses for your search. It is recommended that you view "+hiddenSeats+" higher rated seats by <a href='javascript:void(0)' onclick='return clearFilters();'>clicking here</a>."; 
        }
        displayError(message);
        $("#RequstDiv").hide();
    }
    else if (processedRoutes.length == noOfsoldOut) {
        showNotifyMe = true;
        $("#results").show();
        $("#NoResultMsg").hide();
    }
    else if (noOfBook > 0 && noOfBOP > 0) {
        $("#results").show();
        $("#RequstDiv").show();
    }
    else {
        $("#results").show();
        $("#NoResultMsg").hide();
        $("#RequstDiv").hide();
    }

    if (count <= 5 && count > 0) {
        var height = 300 - (count * 60);
        $("#hightDiv").css('height', "" + height + "");
    }
    else {
        $("#hightDiv").css('height', "0");
    }

    if (showNotifyMe) {
        $("#notifyMe").show();
    }

    $("#loadingResults").hide();
    $(".boardingAndDropping").show();
    cluetipJquery();

/*
    //code for smart filters -- Ditched this feature
    bpsList.options.length=0;
    dpsList.options.length=0;
    bustypeList.options.length = 0;

    
    //Fill busTypes List
    bustypeList.options[0] = new Option("-- Bus Type --","Any");
    if(filteredBusTypes.isAC)
        bustypeList.options[bustypeList.options.length] = new Option("A/C","A/C");
    if(filteredBusTypes.isNonAC)
        bustypeList.options[bustypeList.options.length] = new Option("Non A/C","Non A/C");
    if(filteredBusTypes.isSleeper)
        bustypeList.options[bustypeList.options.length] = new Option("Sleeper","Sleeper");  
        
    for(var k=0;k<bustypeList.options.length;k++)
    {
        if(bustypeList.options[k].value==bustype)
        {
            bustypeList.options[k].selected=true;
        }
    }    
         
    //TODO  - use normal sorted data binding --DONE
    bpsList.options[0] = new Option("-- Boarding points --","");
    for(var key in filteredBps){
        var index = bpsList.options.length;
        bpsList.options[index] = new Option(key, filteredBps[key]);        
        if(key == bpselected){bpsList.options[index].selected=true;}
    }                
    dpsList.options[0] = new Option("-- Dropping points --","");
    for(var key in filteredDps){
        var index = dpsList.options.length;
        dpsList.options[index] = new Option(key, filteredDps[key]);
        if(key == dpselected){dpsList.options[index].selected=true;}
    }     
    sortBP('bplist');
    sortBP('dplist');  
    */

}

function isNullOrEmpty(input) {
    if (input == null || input == '') {
        return true;
    }
    return false;
}
function clearFilters()
{
    $("#bplist").val('');
    $("#dplist").val('');
    $("#bustypelist").val('Any');
    $("#ratingFilter").val('all');
     $('#ratingFilterMessageText').hide();
    filterResults();  
}
function routeInRatingFilter(route, ratingSelected) {
    if (isNullOrEmpty(ratingSelected)) {
        return true;
    }
    if (ratingSelected == "all") {
        return true;
    }
    var serviceRating = 0;
    var busQuality = 0;
    var opRank = 0.1; //0.1 becoz we want to show buses with no rating nad operator ranking to show up in higherRated
    try {
        serviceRating = parseFloat(route.reviewPoints);
        busQuality = route.Rating.BusQuality1;
    } catch (e) {}

    try {
        if (route.Rating.Reviews == "NR") opRank = route.Rating.opRanking;
    } catch (e) {}
    
    var higherRatedBus = (serviceRating > 2.75 || busQuality > 4 || opRank > 3.5 || opRank == 0);
    
    if (ratingSelected == "high" && higherRatedBus ) {
        return true;
    }
    if (ratingSelected == "low" && !higherRatedBus) {
        return true;
    }
    return false;
}

function routeContainsBusType(route, bustype) {
    if (isNullOrEmpty(bustype)) {
        return true;
    }

    if (bustype == "Any") return true;
    if (bustype == "A/C") return route.isAc;
    if (bustype == "Non A/C") return route.isNonAc;
    if (bustype == "Sleeper") return route.isSleeper;

    return true;
}

function routeContainsBP(route, bpselected) {
    if (isNullOrEmpty(bpselected)) {
        return true;
    }
    for (var c = 0; c < route.BPInformationList.length; c++) {
        bp = route.BPInformationList[c];
        if (bp.bpLocation == bpselected) {
            return true;
        }
    }
    return false;
}

function routeContainsDP(route, dpselected) {
    if (isNullOrEmpty(dpselected)) {
        return true;
    }
    for (var c = 0; c < route.DPInformationList.length; c++) {
        dp = route.DPInformationList[c];
        if (dp.bpLocation == dpselected) {
            return true;
        }
    }
    return false;
}

function getTime(doj, timeInMins) {
    var date = new Date(doj);
    return date.getUTCMinutes(date.setMinutes(timeInMins));
}

function getButtonType(route) {
    var rid = route.routeId;
    var status = route.busStatus;
    var statusbn = "<a  href='" + sendSeatLayout(route) + "' alt='Request'  title='Tickets for this particular bus are available on request. Click on Book on phone, leave us your details, and we will get back to you at the earliest.'><img src='/images/Request.gif'  alt='Request'  /></a>";
    if (status == 'SOLDOUT') {
        statusbn = "<a  title='Tickets for this particular bus is not available / sold out.'><img src='/images/soldout.gif'  title='soldout' alt='Sold out' style='padding-right:5px' /></a>";
    }
    else if (status == 'AVAILABLE') {
        statusbn = "<a href='" + sendSeatLayout(route) + "' title='Click here to book now.' onclick='setFilterValuesInCookie();'>";
        statusbn += "<img src='/images/book.gif' alt='Available' style='padding-right:5px'/>";
        statusbn += "</a>";
    }
    else if (status == 'REMINDME') {
        statusbn = "<a  href='" + sendSeatLayout(route) + "' title='Booking for this bus opens on " + route.activationTime + "' onclick='setFilterValuesInCookie();'>";
        statusbn += "<img src='/images/remindme.jpg' alt='Chart not open' style='padding-right:5px' /></a><br/><div style='text-align:right;padding-right:10px'>chart not open</div>";
    }
    else if (status == 'BOOKSTAR') {
        statusbn = "<a  href='" + sendSeatLayout(route) + "' title= 'Tickets for this particular bus are not confirmed. Book an unconfirmed ticket and we will get back to you within 20 minutes once we confirm the ticket, else you will get a complete refund.'>";
        statusbn += "<img src='/images/bookAstr.gif' alt='Wating' style='padding-right:5px' /></a>";
    }

    return statusbn;
}

function sendSeatLayout(newrow) {
    var sourceId = getQueryStringParameter('fromCityId');
    var destinationId = getQueryStringParameter('toCityId');

    if (newrow.busStatus == 'AVAILABLE') {
        routeId = newrow.routeId;
        var specialFare = 'false';
        if (newrow.isSpecialFare == true) {
            specialFare = 'True';
        }
        url = "/Booking/SeatSelection.aspx?rt=" + routeId + "&doj=" + calendarDate + "&dep=" + newrow.departureTimeStringOrig + "&showSpInst=" + specialFare;
    }
    else if (newrow.busStatus == 'REQUEST') {

        url = "../TicketRequest.aspx?r=" + newrow.routeId + "&n=1&d=" + calendarDate + "&F=" + sourceId + "&T=" + destinationId + "&Typ=" + newrow.busType + "&Svn=" + newrow.serviceName + "&oid=" + newrow.operatorId + "&dep=" + newrow.departureTimeStringOrig;
    }
    else if (newrow.busStatus == 'REMINDME') {
        //http://www.redbus.in/TicketRequest.aspx?r=5124&n=1&d=7-Jan-2010&F=124&T=462&Typ=Volvo+A%2fC+Seater+%282%2b2%29&Svn=Hyd-Mumbai%20Volvo%20Bus%201&OId=314&dep=06:15%20PM&bookType=bno&OpensOn=08-Nov-2009
        url = "../TicketRequest.aspx?r=" + newrow.routeId + "&n=1&d=" + calendarDate + "&F=" + sourceId + "&T=" + destinationId + "&Typ=" + newrow.busType + "&Svn=" + newrow.serviceName + "&oid=" + newrow.operatorId + "&dep=" + newrow.departureTimeStringOrig + "&bookType=bno&OpensOn=" + newrow.activationTime;
    }
    else if (newrow.busStatus == 'BOOKSTAR') {
        url = "/Booking/SeatSelection.aspx?cf=MS&rt=" + newrow.routeId + "&n=1&doj=" + calendarDate + "&s=U&dep=" + newrow.departureTimeStringOrig + "&bs=0";
    }
    else {
        url = "/index.aspx?st=ErrorInSendingToSeatLayout";
    }


    if (sifyId.toString() != 'NaN') {
        url += "&SIFYAID=" + sifyId;
    }
    return url;
}
function setFilterValuesInCookie() {   
    clearFilterCookies();           
    if (!isNullOrEmpty($("#bustypelist").val())) {
        createCookie('_busType', $("#bustypelist").val(), 1);
    }
    if (!isNullOrEmpty($("#bplist").val())) {
        createCookie('_bp', $("#bplist").val(), 1);
    }
    if (!isNullOrEmpty($("#dplist").val())) {
        createCookie('_dp', $("#dplist").val(), 1);
    }
    if (!isNullOrEmpty($("#ratingFilter").val())) {
        createCookie('_rating', $("#ratingFilter").val(),1);
    }      
}
function setFilterValuesFromCookie() {
    if (!isNullOrEmpty(readCookie('_busType'))) {
        $("#bustypelist").val(readCookie('_busType'));
    }
    if (!isNullOrEmpty(readCookie('_bp'))) {
        $("#bplist").val(readCookie('_bp'));
    }
    if (!isNullOrEmpty(readCookie('_dp'))) {
        $("#dplist").val(readCookie('_dp'));
    }
    if (!isNullOrEmpty(readCookie('_rating'))) {
        $("#ratingFilter").val(readCookie('_rating'));
    }
}

function customerReviews(rid) {
    for (var i = 0; i < processedRoutes.length; i++) {
        var rowdet = processedRoutes[i];
        if (rowdet.routeId == rid) {
            var available = rowdet.noOfseatsAvailable;
            if (available == '-') available = 0;

            window.location = "/Booking/CustomerReviews.aspx?cf=MS&r=" + rowdet.routeId + "&d=" + calendarDate + "&av=" + available + "&status=" + rowdet.busStatus;
        }
    }
}

function moreInfo(rid) {
    for (var i = 0; i < processedRoutes.length; i++) {
        var rowdet = processedRoutes[i];
        if (rowdet.routeId == rid) {
            var available = rowdet.noOfseatsAvailable;
            if (available == '-') available = 0;

            window.location = "/ServiceDetails.aspx?cf=MS&r=" + rowdet.routeId + "&d=" + calendarDate + "&av=" + available + "&status=" + rowdet.busStatus;;
        }
    }
}

function sortBP(controlid) {
    var $dd = $('#' + controlid);
    if ($dd.length > 0) { // make sure we found the select we were looking for
        // save the selected value
        var selectedVal = $dd.val();
        // get the options and loop through them
        var $options = $('option', $dd);
        var arrVals = [];
        $options.each(function () {
            // push each option value and text into an array
            arrVals.push({
                val: $(this).val(),
                text: $(this).text()
            });
        });

        // sort the array by the value (change val to text to sort by text instead)
        arrVals.sort(function (a, b) {
            if (a.val > b.val) {
                return 1;
            }
            else if (a.val == b.val) {
                return 0;
            }
            else {
                return -1;
            }
        });

        // loop through the sorted array and set the text/values to the options
        for (var i = 0, l = arrVals.length; i < l; i++) {
            $($options[i]).val(arrVals[i].val).text(arrVals[i].text);
        }

        // set the selected value back
        $dd.val(selectedVal);
    }
}

function isPromotionalRoute(route) {
    var fromCityId = getQueryStringParameter('fromCityId');
    var toCityId = getQueryStringParameter('toCityId');
    var dojArray = getQueryStringParameter('doj').split('-');
    var dojTime = new Date(dojArray[1] + ' ' + dojArray[0] + ',' + dojArray[2]);
    var dayOfWeek = dojTime.getDay(); // 0: sunday
    var offerEndDate = new Date('Jul 31, 2009 ');
    if (dojTime > offerEndDate) return false;
    if (route.operatorId != 39) return false; //30 is oid of Danunjaya
    if (dayOfWeek == 5 || dayOfWeek == 6 || dayOfWeek == 0) return false;
    if ((fromCityId == 122 && toCityId == 124) || (fromCityId == 462 && toCityId == 124) || (fromCityId == 123 && toCityId == 124) || (fromCityId == 124 && toCityId == 462)) {
        return true;
    }
    return false;
}


function notifyMeRequest() {
    var bustype = $("#bustypelist").val();
    url = "../TicketRequest.aspx?r=0&n=1&d=" + getQueryStringParameter('doj') + "&F=" + getQueryStringParameter('fromCityId') + "&fromCityName=" + getQueryStringParameter('fromCityName') + "&T=" + getQueryStringParameter('toCityId') + "&toCityName=" + getQueryStringParameter('toCityName') + "&Typ=" + bustype + "&Svn=&oid=&dep=&bookType=notify&OpensOn=";
    window.location = url;
}

function callBackRequest() {
    var bustype = $("#bustypelist").val();
    url = "../TicketRequest.aspx?r=0&n=1&d=" + getQueryStringParameter('doj') + "&F=" + getQueryStringParameter('fromCityId') + "&fromCityName=" + getQueryStringParameter('fromCityName') + "&T=" + getQueryStringParameter('toCityId') + "&toCityName=" + getQueryStringParameter('toCityName') + "&Typ=" + bustype + "&Svn=&oid=&dep=&bookType=callBack&OpensOn=";
    window.location = url;
}

function getReviewString(row) {   
    var monthlyCount = parseFloat(row.Rating["Count1"]);
    var mbusQuality  =parseFloat(row.Rating["BusQuality1"]);
    var mStaffRating =parseFloat(row.Rating["StaffRating1"]);
    var mPunctuality =parseFloat(row.Rating["Punctuality1"]);
    var halfCount =parseFloat(row.Rating["Count2"]);
    var hbusQuality =parseFloat(row.Rating["BusQuality2"]);
    var hStaffRating =parseFloat(row.Rating["StaffRating2"]);
    var hPunctuality=parseFloat(row.Rating["Punctuality2"]);
    var totalCount =parseFloat(row.Rating["Count3"]);
    var tBusQualiyt =parseFloat(row.Rating["BusQuality1"]);
    var tStaffRating =parseFloat(row.Rating["StaffRating3"]);
     var tPunctualiy =parseFloat(row.Rating["Punctuality3"]);   
    
    var firtDivCount = "No";
    var secondDivCount = "No";

    var firstReviewString = " reviews";
    var secondReviewString = " reviews";

    var firstReviewCount = "Last 90 days ";

    var busQuality = 0;
    var punctuality = 0;
    var staffBehaviour = 0;

    var firtDivText = monthlyCount;

    if (monthlyCount != 0) {
        firtDivCount = monthlyCount;
        busQuality = mbusQuality
        punctuality = mPunctuality;
        staffBehaviour = mStaffRating;
        if (monthlyCount == 1) {
            firstReviewString = " review";
        }
    }
    else if (monthlyCount == 0 && halfCount != 0) {
        firstReviewCount = "Last 6 months";
        firtDivCount = halfCount;
        busQuality = hbusQuality
        punctuality = hPunctuality;
        staffBehaviour = hStaffRating;
        if (halfCount == 1) {
            firstReviewString = " review";
        }
    }
    if (totalCount != 0) {
        secondDivCount = totalCount;
        if (totalCount == 1) {
            secondReviewString = " review";
        }
        //  busQuality = tBusQualiyt
        //punctuality = tPunctualiy;
        //staffBehaviour = tStaffRating; 
    }

    var startString = "<table  cellpadding='0' cellspacing='0' width='100%' border='0px solid red'>";
    var firstDiv = "<tr><td colspan='3' class='redTextBold clutipHeading'>" + firstReviewCount + " (" + firtDivCount + " " + firstReviewString + ")</td></tr>";

    var firstDivContent = getRowString("Bus quality", busQuality) + getRowString("Punctuality", punctuality) + getRowString("Staff behaviour", staffBehaviour);
    var secondDiv = "<tr><td colspan='3' class='redTextBold clutipHeading'>All reviews (" + secondDivCount + " " + secondReviewString + ")</td></tr>";
    var secondDivContent = getRowString("Bus quality", tBusQualiyt) + getRowString("Punctuality", tPunctualiy) + getRowString("Staff behaviour", tStaffRating);
    var endString = "</table>"

    var htmlContent = startString + firstDiv + firstDivContent + secondDiv + secondDivContent + endString;

    return htmlContent;
}

function getReviewImage(avg) {
    
    var roundedValue = avg;
    var toolTip = roundedValue + "/5";
    var width = (avg * 20);
    if (roundedValue != 0) {

        return "<div class='rating_bar' title='" + parseFloat(avg).toFixed(1) + " / 5' ><div style='width:" + width + "%'></div></div>"
    }
    return " - ";
}

function getReviewPoints(row) {
   var avg = 0;
    if (parseInt(row.Rating["Count1"]) != 0) {
        avg = 4.5 * parseFloat(row.Rating["BusQuality1"]) + 4.5 * parseFloat(row.Rating["Punctuality1"]) + parseFloat(row.Rating["StaffRating1"]);
    }
    else if (parseInt(row.Rating["Count2"]) == 0 && parseInt(row.Rating["Count3"]) != 0) {
        avg = 4.5 * parseFloat(row.Rating["BusQuality2"]) + 4.5 * parseFloat(row.Rating["Punctuality2"]) + parseFloat(row.Rating["StaffRating2"]);
    }
    else if (parseInt(row.Rating["Count2"]) == 0 && parseInt(row.Rating["Count3"]) != 0) {
        avg = 4.5 * parseFloat(row.Rating["BusQuality3"]) + 4.5 * parseFloat(row.Rating["Punctuality3"]) + parseFloat(row.Rating["StaffRating3"]);
    }

    return (avg / 10).toFixed(1);

}


function getBoardingDroppingString(bpList, type) {
    bpList.sort(function (a, b) {
        var diffCategory = a.bpTime - b.bpTime;
        if (diffCategory == 0) return (a.bpTime - b.bpTime);
        return diffCategory;
    });
    var typeText = "Boarding points";

    if (type == 'DP') {
        typeText = "Dropping points";
    }
    var htmlContent = "";
    var startTag = "<div style='padding-left:10px;height:15px;'><div class='redTextBold'>" + typeText + "</div></div><br/><br/><br/><div style='padding-left:20px'><table id='mainTable' cellpadding='2px'>"
    var endTag = "</table></div>";

    for (var i = 0; i < bpList.length; i++) {
        var time = bpList[i].bpTimeString;
        if (type == 'DP') {
            time = bpList[i].dpTimeString;
        }
        startTag += "<tr height='10px' ><td class='smalltext' style='padding:2px; width:110px'>" + bpList[i].bpLocation + "</td><td class='smalltext' style='padding:10px 5px 5px;'>" + time + "</td></tr>"
    }
    startTag += endTag;
    htmlContent = startTag;
    return htmlContent;
}

function setSearchDetails(dateString) {
    var message = "<div style='border-bottom:1px solid #F3F3F3;padding:5px;padding-left:0px'><span class='grayTextBold'>" + getQueryStringParameter('fromCityName') + "-" + getQueryStringParameter('toCityName') + "</span><span class='smalltext'> | " + dateString + "</span></div>";
    $("#searchDetails").html(message);
    //$("#serviceChargeAnnaouncement").show();
}

function getRowString(reviewstring, rating) {
    //rating = Math.round(rating);
    var wid = 20 * rating;
    if (rating != 0) {
        return "<tr><td class='ratingSpan smallText'>" + reviewstring + "</td><td class='imgSpan'  style='padding-left:0px;border:0px solid red;' ><div class='rating_bar' ><div style='width:" + wid + "%'></div></div></td><td align='left' class='grayTextSmall' style='padding-left:0px;border:0px solid red;padding-right:10px'>" + parseFloat(rating).toFixed(1) + "</td></tr>";
    }
    return "";

}

function getDiscount(fare, discount, type) {
    var discountFare = 0;

    if (type == 1) {
        discountFare = fare - ((fare * discount) / 100);
    }
    else {
        discountFare = fare - discount;
    }
    return discountFare;
}

function noSeatsAvailable() {
    if (!isNullOrEmpty(getQueryStringParameter('msg')) && getQueryStringParameter('msg') == 'SeatsNotAvailable') {
        $("#alertMsg").html("Selected seats are no longer available. Please select another service.");
        $("#alertMsg").show();
    }
}

function init() {
    noSeatsAvailable();
    tooltip(); // jquery tooltip (jtooltip.js)
    setSearchDetails(doJ);
    getAllRoutes();
}
jQuery(document).ready(init);