 //global variables
var min=0;
var max=100;
var draggingDivIdDivId = "";
var dragOffset = 0;
var newPos1=0;
var newPos2=200;
var filterBlinkCounter=0;
var slider="";


// filterByAll()
// --------------------------------------------------------------------------------
// Called when the filter box knob has moved and changes the displayed  itineraries accordingly
//
function filterByAll(filterItem) {
	var changedStops = document.getElementById("maxstops").value;
	var airlineObj = document.getElementById("filterairline");
	var airline = airlineObj.options[airlineObj.selectedIndex].value;
	var connectAtObj = document.getElementById("select-connection");
	var connectAt = connectAtObj.options[connectAtObj.selectedIndex].value;
	//Price
	var minPrice = document.getElementById("slidercurrentMinValue1").value; 
	var maxPrice = document.getElementById("slidercurrentMaxValue1").value; 
	
	//Departure Time
	var minDepTime = document.getElementById("slidercurrentMinValue2").value; + ":00"; 
	var maxDepTime = document.getElementById("slidercurrentMaxValue2").value; + ":00"; 
	
	//Arrival Time
	var minArvTime = document.getElementById("slidercurrentMinValue3").value; + ":00"; 
	var maxArvTime = document.getElementById("slidercurrentMaxValue3").value; + ":00"; 
	
	
	//minStops, minPrice
	var arguments = "s=" + sessionId + "&tabId=" + tabId + "&startItinId=0&maxStops=" + changedStops + "&airline=" + airline + "&connection=" + connectAt + "&minPrice=" + minPrice + "&maxPrice=" + maxPrice + "&minDepTime=" + minDepTime + "&maxDepTime=" + maxDepTime  + "&minArvTime=" + minArvTime  + "&maxArvTime=" + maxArvTime +"&filterChange=Y" ;
	
	
	LoadAjaxCallFunction( '/jsp/home/resetFilterSS.jsp', arguments, resetFilterCallback);
	
	//Site catalyst tracking
	filterByAllSC(filterItem);
}

// resetFilterCallback()
// --------------------------------------------------------------------------------
// Callback after filter is reset and page can be rendered
//
function resetFilterCallback() {

	var posY = getScreenCenterY(); 
	document.getElementById("loading").style.top = posY +"px";
	document.getElementById('loading').style.display="";

	LoadAjaxInDivAndCallFunction('resultsContainer', '/jsp/home/renderResultsSS.jsp', "s=" + sessionId + "&tabId=" + tabId + "&startItinId=0", undisplayLoading);	

}



// selectMaxStops()
// --------------------------------------------------------------------------------
// Called when max stops radio button is clicked and changes the displayed  itineraries accordingly 
//
function selectMaxStops(stops)
{
	document.getElementById('maxstops').value = stops;
	filterByAll('stops');
}


// alignFilter()
// --------------------------------------------------------------------------------
// get the ratio between the slider length and the slider's value maximum
// 
function alignFilter(target) {
    var filter = target.parentNode;
	var sliderLength = filter.clientWidth - target.clientWidth+10;
    return sliderLength / max;
}


// function getHorizontalOffset(elem)
// --------------------------------------------------------------------------------
// get the left offset of the filter, needed for conversion of mouse coordinates
//
function getHorizontalOffset(elem) {
	var node = elem;
	var offset = node.offsetLeft;
		while(node.offsetParent) {
			node = node.offsetParent;
			if (node.nodeName.toLowerCase() != "html") {
				offset += node.offsetLeft;
			}
		}
	return offset;
}


// function getHorizontalScrollOffset()
// --------------------------------------------------------------------------------
// obtain the scrolling offsets if any
//
function getHorizontalScrollOffset() {
	var scrollOffset
	if (window.pageLeft !== undefined) {
			scrollOffset = window.pageLeft;
	}
	else if (document.documentElement && document.documentElement.scrollLeft !== undefined) {
		scrollOffset = document.documentElement.scrollLeft;
	}
	else if (document.body.scrollLeft !== undefined) {
		scrollOffset = document.body.scrollLeft;
	}
	return scrollOffset;
}


// function onFilterMouseDown(event)
// --------------------------------------------------------------------------------
// changes filter slider knob values
//
function onFilterMouseDown(event) {
	event = event || window.event;
	var target = event.target || event.srcElement;
	var sliderNumber = target.id.match('\[0-9]')[0];
    var know, newPos, value;
    if(sliderNumber!=1)
    {  
	     Knob = document.getElementById(target.id.replace(/Filter/, 'MinKnob'));
		 newPos = event.clientX - getHorizontalOffset(target)+ getHorizontalScrollOffset() - (Knob.clientWidth / 2);
    	 value = positionToValue(document.getElementById("sliderMinKnob" + sliderNumber), newPos);
	    var newValue1 = document.getElementById("slidercurrentMinPercent" + sliderNumber);
	    var newValue2 =  document.getElementById("slidercurrentMaxPercent" + sliderNumber);
	    
		if(Math.abs(value-newValue1.value)<Math.abs(value-newValue2.value)){
			changeValue(document.getElementById("sliderMinKnob" + sliderNumber), value,'Y');
		}
		else{
			changeValue(document.getElementById("sliderMaxKnob" + sliderNumber), value,'Y');
		}
	}
	else{
		 Knob = document.getElementById('sliderMaxKnob1');
		 newPos = event.clientX - getHorizontalOffset(target)+ getHorizontalScrollOffset() - (Knob.clientWidth / 2);
		 value = positionToValue(document.getElementById("sliderMaxKnob1"), newPos);
		//var newValue =  document.getElementById("slidercurrentMaxPercent1");
		changeValue(document.getElementById("sliderMaxKnob1"), value,'Y');
	}
	if (!document.activeElement || !document.activeElement !== Knob) {
		Knob.focus();
	}
	return false;
}


// function onKnobMouseDown(event)
// --------------------------------------------------------------------------------
// moves knob images when mouse button pressed and moved
//
function onKnobMouseDown(event) {
	event = event || window.event;
	var target = event.target || event.srcElement;
	draggingDivId = target.id;
	dragOffset = event.clientX - getHorizontalOffset(target.parentNode) - target.offsetLeft + getHorizontalScrollOffset();
	document.onmousemove = handleDrag;  //handles the movement
	document.onmouseup = stopDrag;      
	if (!document.activeElement || document.activeElement !== target) {
		target.focus();
	}
	cancelEvent(event);
	return false;
}


// function handleDrag(event)
// --------------------------------------------------------------------------------
// handles the knob images movement, moves object and calls changeValue function to change values
//
function handleDrag(event) {
	event = event || window.event;
	//check if image exists
	if (draggingDivId === "") {  
		return;
	}
	else {
		var target = document.getElementById(draggingDivId);
		var newPos = event.clientX - getHorizontalOffset(target.parentNode) + getHorizontalScrollOffset() - dragOffset;
		changeValue(target, positionToValue(target, newPos));
	}
}


// function stopDrag(event)
// --------------------------------------------------------------------------------
// stops the knob images movement on mouse up by clearing values and calls filterByAll() to display selected itineraries
//
this.stopDrag = function(event) {
	var filterItem;
	if(slider == "sliderMinKnob1") {
		filterItem = 'minPrice';
	} else if(slider == "sliderMaxKnob1") {
		filterItem = 'maxPrice';
	} else if(slider == "sliderMinKnob2") {
		filterItem = 'minDepTime';
	} else if(slider == "sliderMaxKnob2") {
		filterItem = 'maxDepTime';
	} else if(slider == "sliderMinKnob3") {
		filterItem = 'minArvTime';
	} else if(slider == "sliderMaxKnob3") {
		filterItem = 'maxArvTime';
	}  
	filterByAll(filterItem);
	draggingDivId = "";
	dragOffset = 0;
	document.onmousemove = null;
	document.onmouseup = null;
}


// function positionToValue(target, pos)
// --------------------------------------------------------------------------------
// returns the current knob value from it's position
//
function positionToValue(target, pos) {
	return Math.round(pos / alignFilter(target));
}


// function changeValue(target, value,initiateFilter)
// --------------------------------------------------------------------------------
// changes values of a particular knob
//
function changeValue(target, value,initiateFilter) {
	var ratio = alignFilter(target); //find where this knob is
	var sliderNumber = target.id.match('\[0-9]')[0];  //find the knob unique number
	var isMinSliderAvailable = document.getElementById("showMinKnob" + sliderNumber).value;  //are we working with 1 or 2 knobs
	
	var newValue1 = document.getElementById("slidercurrentMinPercent" + sliderNumber);    //get the last min value knob
    var newValue2 =  document.getElementById("slidercurrentMaxPercent" + sliderNumber);   //get the last max value knob
	
	
	var newValue = Math.min(Math.max(value, min), max);    //get the latest value and make sure it's not greater than max value
	if(isMinSliderAvailable == 'Y'){					   //check if it's 2 knob slider
	    if(target.id.indexOf("sliderMinKnob") == 0 ){
			if(newValue+25<=newValue2.value){				// for min knob: stop the drag at 30% so the two knobs are not too close
				newValue1.value =	newValue;
				var newPos = Math.round(newValue * ratio) ;
				target.style.left = newPos + "px";
		        var displayValue = changeDisplayValue(target,newValue,"slidercurrentMinValue",initiateFilter);	//displays the change
			}
	
		}
		else{
			if(newValue-25>=newValue1.value){	// for max knob: stop the drag at 30% so the two knobs are not too close
				newValue2.value =	newValue;
				var newPos = Math.round(newValue * ratio) ;
				target.style.left = newPos + "px";
				changeDisplayValue(target,newValue,"slidercurrentMaxValue",initiateFilter); //displays the change
			}
		}
	}
	else{  //update the value for single knob slider
		newValue2.value =	newValue;
		var newPos = Math.round(newValue * ratio) ;
		target.style.left = newPos + "px";
		changeDisplayValue(target,newValue,"slidercurrentMaxValue",initiateFilter);  //displays the change
	}
}


// function changeDisplayValue(target,newValue,currentSlider,initiateFilter)
// --------------------------------------------------------------------------------
// updates the changed value, displays the change and calls filterByAll to display latest itineraries
//
function changeDisplayValue(target,newValue,currentSlider,initiateFilter) {
	var adjTime;
  	var sliderNumber = target.id.match('\[0-9]')[0];
    var minValue = Number(document.getElementById("minValue" + sliderNumber).value);
    var maxValue =  Number(document.getElementById("maxValue" + sliderNumber).value);
    var prefix = document.getElementById("prefix" + sliderNumber).value;
    slider = target.id;
    var currentValue = parseInt(minValue + ((maxValue-minValue) * (newValue/100)));
    
	//creating an object to format the time
	var o = new timeObj(currentValue, document.getElementById("suffix" + sliderNumber).value);
    if(o.suffix == ':00') {
	   adjustTime(o);  
    }
    adjTime = o.displayValue;
    if(o.suffix==":00p"){
    	if(o.displayValue!=12)
    		adjTime+=12;
    }
    else if(o.displayValue==12){ adjTime+=12; }
    document.getElementById(currentSlider + sliderNumber).value = currentValue;
	updateValueIndicator(target.id.replace(/Knob/, 'Value'), prefix + o.displayValue + o.suffix );
	
		
	if(initiateFilter == 'Y') {
	 	var filterItem;
		if(slider == "sliderMinKnob1") {
			filterItem = 'minPrice';
		} else if(slider == "sliderMaxKnob1") {
			filterItem = 'maxPrice';
		} else if(slider == "sliderMinKnob2") {
			filterItem = 'minDepTime';
		} else if(slider == "sliderMaxKnob2") {
			filterItem = 'maxDepTime';
		} else if(slider == "sliderMinKnob3") {
			filterItem = 'minArvTime';
		} else if(slider == "sliderMaxKnob3") {
			filterItem = 'maxArvTime';
		}  
		filterByAll(filterItem);
	}
}


//function timeObj()
// --------------------------------------------------------------------------------
// creates object for formatting the time values
//
function timeObj(disp, s){
	this.displayValue=disp;
	this.suffix=s;
}


//adjustTime(fnc)
// --------------------------------------------------------------------------------
// helper function that formats time values by reference 
//
function adjustTime(fnc){ 
	if(fnc.displayValue=="24") { fnc.displayValue=12; fnc.suffix +="a";}
	else if(fnc.displayValue=="12") { fnc.suffix +="p";}
	else if(fnc.displayValue=="0") { fnc.displayValue=12; fnc.suffix +="a"; }
	else if(fnc.displayValue>12) {fnc.displayValue-=12; fnc.suffix +="p";}
	else {fnc.suffix +="a";}
	
}


// function updateValueIndicator(id, value)
// --------------------------------------------------------------------------------
// helper function used for displaying the knob value
function updateValueIndicator(id, value) {
	var elem = document.getElementById(id);
	elem.replaceChild(document.createTextNode(value), elem.firstChild);
}


// setHandlers(slider)
// --------------------------------------------------------------------------------
// initialization for each knob, called by initSlider() 
//
function setHandlers(slider) {
	slider.parentNode.onmousedown 	= onFilterMouseDown;
	slider.onmousedown 	= onKnobMouseDown;
	slider.parentNode.onfocus = function(event) {
		event = event || window.event;
		var target = event.target || event.srcElement;
		var Knob = document.getElementById(target.id.replace(/Filter/, 'MinKnob'));
		if (Knob)
			Knob.focus();
	}
}


// function cancelEvent(event)
// --------------------------------------------------------------------------------
// cross browser event cancelling 
//
function cancelEvent(event) {
	if (typeof event.stopPropagation == "function") {
		event.stopPropagation();
	}
	else if (typeof event.cancelBubble != "undefined") {
		event.cancelBubble = true;
	}
	if (event.preventDefault) {
		event.preventDefault();
	}
	return false;
}


var STR_PAD_LEFT = 1;
var STR_PAD_RIGHT = 2;
var STR_PAD_BOTH = 3;


// function pad(str, len, pad, dir)
// --------------------------------------------------------------------------------
// knob value display padding for hours values
//
function pad(str, len, pad, dir) {
    if (typeof(len) == "undefined") { var len = 0; }
    if (typeof(pad) == "undefined") { var pad = ' '; }
    if (typeof(dir) == "undefined") { var dir = STR_PAD_RIGHT; }
    if (len  >= str.length) {
        switch (dir){
            case STR_PAD_LEFT:
                str = Array(len + 1 - str.length).join(pad) + str;
            break;
            case STR_PAD_BOTH:
                var right = Math.ceil((padlen = len - str.length) / 2);
                var left = padlen - right;
                str = Array(left+1).join(pad) + str + Array(right+1).join(pad);
            break;
            default:
                str = str + Array(len + 1 - str.length).join(pad);
            break;
        } // switch
    }
    return str;
}


// initFilter
// --------------------------------------------------------------------------------
// Initialize the filter with default values
//
function initFilter(stops, currentPrice,minDepTime,maxDepTime,minArvTime,maxArvTime, airline, connection) {
	

	// set the stops
	if (stops != "-1") {
	
		document.getElementById("maxstops").value = stops;
		document.getElementById("stopradio" + stops).checked="true";
		
	}
	
	// Set the airline preference
	if (airline == "null" || airline == null ) {
	}
	else {
		document.getElementById( "filterairline" ).value = airline;
	}


	// Set the connection
	if (connection == "null" || connection == null ) {
	}
	else {
		document.getElementById( "select-connection" ).value = connection;
	}

	
	
	if(document.getElementById('sliderMaxKnob1')) {
		var sliderValue = 100;
		if(currentPrice) {
			var sliderValue = getSliderRelativeValue(1,currentPrice);
			document.getElementById('slidercurrentMaxValue1').value = currentPrice;
		}
		setHandlers(document.getElementById('sliderMaxKnob1'));
		changeValue(document.getElementById("sliderMaxKnob1"), sliderValue);
	}
	if(document.getElementById('sliderMaxKnob2')) {
		setHandlers(document.getElementById('sliderMinKnob2'));
		setHandlers(document.getElementById('sliderMaxKnob2'));
		
		
		var sliderValue = 0;
		if(minDepTime) {
			document.getElementById('slidercurrentMinValue2').value = minDepTime;
			sliderValue = getSliderRelativeValue(2,minDepTime);
		}
		changeValue(document.getElementById("sliderMinKnob2"),sliderValue)
		
		sliderValue = 100;
		if(maxDepTime) {
			document.getElementById('slidercurrentMaxValue2').value = maxDepTime;
			sliderValue = getSliderRelativeValue(2,maxDepTime);
		}
		changeValue(document.getElementById("sliderMaxKnob2"), sliderValue);
		
		
		document.getElementById("depMinTime").innerHTML=document.getElementById("sliderMinValue2").innerHTML;
		document.getElementById("depMaxTime").innerHTML=document.getElementById("sliderMaxValue2").innerHTML;
	}	
	if(document.getElementById('sliderMaxKnob3')) {
		setHandlers(document.getElementById('sliderMinKnob3'));
		setHandlers(document.getElementById('sliderMaxKnob3'));
		
		var sliderValue = 0;
		if(minArvTime) {
			document.getElementById('slidercurrentMinValue3').value = minArvTime;
			sliderValue = getSliderRelativeValue(3,minArvTime);
		}
		changeValue(document.getElementById("sliderMinKnob3"), sliderValue);
		sliderValue = 100;
		if(maxArvTime) {
			document.getElementById('slidercurrentMaxValue3').value = maxArvTime;
			sliderValue = getSliderRelativeValue(3,maxArvTime);
		}
		changeValue(document.getElementById("sliderMaxKnob3"), sliderValue);
		document.getElementById("arrivMinTime").innerHTML=document.getElementById("sliderMinValue3").innerHTML;
		document.getElementById("arrivMaxTime").innerHTML=document.getElementById("sliderMaxValue3").innerHTML;
	}
	//do the blinking
	setTimeout("blinkFilter()",1000);
}//End Slider Scripts


// function blinkFilter()
// --------------------------------------------------------------------------------
// makes filter border blink orange
function blinkFilter()
{
	filterBlinkCounter++;	
	if (filterBlinkCounter % 2 == 0) {
		document.getElementById("quotesTop").className="blinkTop";	
		document.getElementById("quotesContent").className="blinkMiddle";	
		document.getElementById("quotesBottom").className="blinkBottom";	
		if(document.getElementById("filterArrow"))
			document.getElementById("filterArrow").style.display="";
	}
	else {
		document.getElementById("quotesTop").className="whiteBoxTop";
		document.getElementById("quotesContent").className="whiteBoxMiddle";	
		document.getElementById("quotesBottom").className="whiteBoxBottom";	
		if(document.getElementById("filterArrow"))
			document.getElementById("filterArrow").style.display="none";
	}	
	if (filterBlinkCounter < 9) {
		setTimeout("blinkFilter()",1000);
	}
}//End blinkFilter Scripts


//Get the slider relative value
function getSliderRelativeValue(sliderNumber,currentValue) {
    var minValue = Number(document.getElementById("minValue" + sliderNumber).value);
    var maxValue =  Number(document.getElementById("maxValue" + sliderNumber).value);
    var currentValueDiff =currentValue - minValue;
    var relativeValue = 0;
    if(currentValueDiff > 0) {
    	relativeValue =  (currentValueDiff / (maxValue-minValue) ) * 100;
    }
    return relativeValue;
}