latestTimeInMins=1439;

$(document).ready(function(){
    bindTabClicks();
    bindExpandMenu();
});

function sortResults(sort){
	filters['sort'] = sort;
	filterFlights(filters, {'filterMessage': 'Sorting results...', 'instant': true});
	return true;
}

function filterFlights(filter, opts){
    return filterItems(filter, opts, 'airResults','/search/air/results/filter/');
}

function filterAirline(airline){
    return filterListItem(filterFlights,'airline',airline,'~','Filtering airlines...');
}

function filterStops(stop){
    return filterListItem(filterFlights,'stops',stop,'~','Filtering by stops...');
}

function clearFilter(filter){
    $(this).parent().hide();
    if (filter=='airline' || filter=='stops') {
        $('input[name='+filter+']').attr('checked', false);
        filters[filter] = ['~'];
        filterFlights(filters,{'filterMessage': 'Removing '+filter+' filter...'})
        //filterListItem(filterFlights,filter,elems[0],'~','Filtering airlines...');
        //(filter=='airline') ? (filterAirline(elems[0])) : (filterStops(elems[0]));
    } else if (filter=='price' || filter=='duration') {
        var min = $("#"+filter+"-slider").slider('option', 'min');
        var max = $("#"+filter+"-slider").slider('option', 'max');
        $("#"+filter+"-slider").slider('values',0,min);
        $("#"+filter+"-slider").slider('values',1,max);
        var formatFunc = (filter=='price') ? 
            (function(v){return '$'+v;}) : 
            (function(v){return parseInt(v/60) + 'h '+v%60+'m';});
        $("#"+filter+"-selection").val(formatFunc(min) + ' - ' + formatFunc(max));
        filters[filter] = false;
        filterFlights(filters, {'filterMessage': 'Removing '+filter+' filter...'});
    } else if (filter=='times') {
        for (var inx=0; inx<numLegs; inx++) {
            $('#cb-takeoff-'+inx).attr('checked', false);
            $('#cb-land-'+inx).attr('checked', false);
            toggleTimesSlider(inx,'takeoff',true);
            toggleTimesSlider(inx,'land',true);
        }
        filters[filter] = false;
        filterFlights(filters, {'filterMessage': 'Removing flight times filter...'});
    }
}

function clearFilters(){
    filters = {'page': None, 'sort': None, 'airline': '', 'stops': ''};
	filterFlights(filters, {"filterMessage": "Clearing filters...", 'instant': true});
}

function doFilter(filter, opts){
	filtersReady=true;
	if(filterFlights(filter, opts)){
		return true;
	}
	return false;
}

function setupSliders(settings){
    var settings = (settings == null) ? {} : settings;

    var price = (settings['price'] == null) ? [0,30000] : settings['price'];
    setupDoubleSlider(price,'price',function(v){return '$'+v;},5);
    
    var duration = (settings['duration'] == null) ? [0,1440] : settings['duration'];
    duration[0] = roundDown(duration[0],5);
    duration[1] = roundUp(duration[1],5);
    setupDoubleSlider(duration,'duration',function(v){return parseInt(v/60) + 'h '+v%60+'m';},5);
    
    // only show flight times slider(s) if settings contains it
    // (since we otherwise don't know how many sliders to show
    if (settings['times'] != null) {
        setupTimesSliders(settings['times']['minmax'],settings['times']['current']);
    }
}

function minutesToTime(v) {
    if (v < 0 || v > 1440) {
        return 'na'; // @todo: return something else?
    }
    // though max slider time may be 11:59pm, setting the slider
    // increment to 5 may result in v being midnight; if so, 
    // display as 11:59pm
    if (v==1440) {
        v=latestTimeInMins;
    }
    h=parseInt(v / 60);
    apm= (h >= 12) ? ('p') : ('a');
    if (h == 0){
        h = 12;
    } else if (h > 12) {
        h = h % 12;
    }
    m=v % 60;
    return h + ':' + ((m > 9) ? ('') : ('0')) + m + apm;
}

function setupTimesSliders(minmax,current) {
    numLegs = minmax.length; //for use in filterByTimes and clearFilter (whenever they're called)
    flightTimeRanges = minmax; //for use in toggleTimesSlider
    for (var lIdx=0; lIdx<numLegs; lIdx++) {
        setupTimesSlider(lIdx,numLegs,'takeoff',current[lIdx][0],current[lIdx][1]);
        setupTimesSlider(lIdx,numLegs,'land',current[lIdx][2],current[lIdx][3]);
    }
}

function filterByTimes() {
    // need to encorporate all slide times, ex. '2:00-7:00*17:00-20:00**12:00-15:00*19:00-23:00'
    var formatQSFunc = function(v){return (v>=0 && v<1440) ?(parseInt(v/60)+':'+v%60) : ('na')};
    timesStrArr = [];
    for (var inx=0; inx<numLegs; inx++) {
        timesStrArr[inx] = 
            formatQSFunc($('#times-slider-' + inx + '-takeoff').slider("values", 0)) + '-' +
            formatQSFunc($('#times-slider-' + inx + '-takeoff').slider("values", 1)) + '*' +
            formatQSFunc($('#times-slider-' + inx + '-land').slider("values", 0)) + '-' +
            formatQSFunc($('#times-slider-' + inx + '-land').slider("values", 1));
    }
    filters['times'] = timesStrArr.join('**');
    filterFlights(filters, {'filterMessage': 'Filtering by flight times...'});
}

function setupTimesSlider(lIdx, numLegs, tl, handlePosLeft, handlePosRight) {
    var formatFunc = minutesToTime;
    var thisSliderElem = "#times-slider-" + lIdx + '-' + tl;
    var selectionElem = "#times-selection-" + lIdx + '-' + tl;

    
    /* Need to make sure that handlePosLeft < handlePosRight, that 
       each is >=0 and <1440, and that each is a multiple of 5. */
    handlePosLeft = roundDown(parseInt(handlePosLeft), 5);
    handlePosRight = roundUp(parseInt(handlePosRight), 5);

    // make sure handlePosLeft is <= 11:50pm and handlePosRight is <= 11:59pm;
    // and then if handlePosLeft==handlePosRight, add 5 to handlePosRight
    // (and we know it won't go above 11:55 pm)
    // This fixes an IE7 bug with the slider.
    handlePosLeft = Math.min(handlePosLeft, 1430);
    handlePosRight = Math.max(Math.min(handlePosRight, latestTimeInMins), handlePosLeft+5)
    //alert('L:'+handlePosLeft+'  R:'+handlePosRight);

    $(selectionElem).val(formatFunc(handlePosLeft) + ' - ' + formatFunc(handlePosRight));
    $(selectionElem).focus(function(){ $(this).blur(); });

    $(thisSliderElem).slider({
        orientation: 'horizontal',
		range: true,
		min: 0,
		max: latestTimeInMins,
        values: [handlePosLeft,handlePosRight],
		step: 5,
		slide: function(event, ui) {
			resetTimer();
			$(".ui-slider-handle").blur();
			$(selectionElem).val(formatFunc(ui.values[0]) + ' - ' + formatFunc(ui.values[1]));
		},
		stop: function(e, u) {
			filterByTimes();
		}
    });
    return true;
}

function toggleTimesSlider(i,torl,isResultsPage)
{
    var formatFunc = minutesToTime;
    var cbSel = '#cb-'+torl+'-'+i;  // selector for checkbox controlling slider
    var selectionSel = "#times-selection-"+i+'-'+torl;
    var contSel = '#'+torl+'-'+i+'-container';
    var sliderSel = "#times-slider-"+i+'-'+torl;
    if ($(cbSel+':checked').val() == null) {
        // hide and reset slider handles and time range display
        $(contSel).addClass('hidden');
        var offset = (torl=='land') ? (2) : (0);
        var origMin = (isResultsPage) ? (flightTimeRanges[i][offset]) : (0);
        var origMax = (isResultsPage) ? (flightTimeRanges[i][offset+1]) : (1439);
        // only reset slider and refilter if handles are not at slider extremes
        if ($(sliderSel).slider('values',0) > origMin || 
            $(sliderSel).slider('values',1) <origMax) {
            $(sliderSel).slider('values',0,origMin);
            $(sliderSel).slider('values',1,origMax);
            var timeStr = formatFunc(origMin) + ' - ' + formatFunc(origMax);
            if (isResultsPage) {
                $(selectionSel).val(timeStr);
                filterByTimes();
            } else {
                $(selectionSel).text(timeStr);
            }
        }
    } else {
        $(contSel).removeClass('hidden');
        // @todo: show
    }
}

function setTimesSlider(i, tl, min, max) {
    $('#'+tl+'-'+i+'-container').removeClass('hidden');
    var sliderSel = "#times-slider-"+i+'-'+tl;
    $(sliderSel).slider('values',0,min);
    $(sliderSel).slider('values',1,max);
    $("#times-selection-"+i+'-'+tl).text(minutesToTime(min)+' - '+minutesToTime(max));
}

function pageResults(page){
	filters['page'] = page;
	moveToTop();
	filterFlights(filters, {'filterMessage': 'Loading page ' + page + '...', 'instant': true});
	return false;
}

function trackFlight(e, searchId, supplierId, resultId){
	$(e).addClass('ajaxInProcess');
	$(e).removeClass('graph-icon');
	$(e).html('saving...');
	$.ajax({
		type: 'GET',
		url: '/search/air/track/?searchId=' + searchId + '&supplierId=' + supplierId + '&resultId=' + resultId,
		dataType: 'json',
		cache: false,
		success: function(json){
			var itin = null;
			var itinGroup = null;
			if(!json['errors'].length){
				itin = json['itineraries'][0]['id']['itinId'];
				itinGroup = json['itineraries'][0]['id']['itinGroupId'];
				$(e).removeClass('ajaxInProcess');
				if (itinGroup){
					$(e).addClass('ajaxSuccess');
					$(e).html('Tracking in <a href="/mytrips/trip/?id=' + itinGroup + '">My Trips</a>');
				}else{
					$(e).addClass('ajaxError');
					$(e).html('An error occurred');
				}
			}else{
				if(json['errors'][0]['code'] == "NOUSER"){
					$(e).html(json['errors'][0]['message']);
					window.location = "/login/?returnTo=" + escape(window.location.pathname + window.location.search + '&track=' + resultId + '&supplierId=' +  supplierId + window.location.hash);
				}
				else{
					$(e).addClass('ajaxError');
					$(e).html('An error occurred');
				}
		   }
	   }
	});
}

function setupFormSlider(sliderElement, displayElement, valueHolder, selectedValues){
	var range = [0,1439];
	var selectedValues = typeof(selectedValues) != 'undefined' ? selectedValues : range;

	displayElement.html(minutesToTime(selectedValues[0]) + ' - ' + minutesToTime(selectedValues[1]));
	valueHolder.val(selectedValues)
	sliderElement.slider({
		orientation: 'horizontal',
		range: true,
		min: range[0],
		max: range[1],
		values: selectedValues,
		step: 5,
		slide: function(event, ui) {
			$('.ui-slider-handle').blur();
			displayElement.html(minutesToTime(ui.values[0]) + ' - ' + minutesToTime(ui.values[1]));
		},
		stop: function(e, u) {
			if(u.values[1] == 1440){
				u.values[1] = 1439;
			}
			valueHolder.val(u.values);
		}
	});
}
