var mouseOffset = null;
var iMouseDown  = false;
var lMouseState = false;

var DragDrops   = [];
var dragHelper  = null;
var curTarget   = null;

var min = null;
var max = null;
var dragPos = null;
var Pos_S = null;
var Pos = null;
var slice = null;

var infos = new Array;
var limit = new Array;

var setLimit = new Array;
var setPos = new Array;

Number.prototype.NaN0=function(){return isNaN(this)?0:this;}

function CreateDragContainer(htmlelements){
	var cDrag        = DragDrops.length;
	DragDrops[cDrag] = [];
	for(var i=0; i<htmlelements.length; i++){
		var cObj = htmlelements[i];
		DragDrops[cDrag].push(cObj);
		cObj.setAttribute('DropObj', cDrag);
		for(var j=0; j<cObj.childNodes.length; j++){
			if(cObj.childNodes[j].nodeName=='#text') continue;
			cObj.childNodes[j].setAttribute('DragObj', cDrag);
		}
	}
}

function getPosition(e){
	var left = 0;
	var top  = 0;
		
	while (e.offsetParent){
		//left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
		//top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
		left += e.offsetLeft;
		top  += e.offsetTop;
		e     = e.offsetParent;
	}
	//left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
	//top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
	left += e.offsetLeft;
	top  += e.offsetTop;
	return {x:left, y:top};
}

function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}

function getMouseOffset(target, ev){
	ev = ev || window.event;
	var docPos    = getPosition(target);
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function mouseMove(ev){
	ev         = ev || window.event;
	var target   = ev.target || ev.srcElement;
	var mousePos = mouseCoords(ev);
	var dragObj = target.getAttribute('DragObj');
	if(dragObj!=null){
		if(iMouseDown && !lMouseState){
			curTarget     = target;
			mouseOffset   = getMouseOffset(target, ev);
			
			id = curTarget.id.substring(0,3);
			key = target.id.substring(3);
			for(var i=0; i<dragHelper[key].childNodes.length; i++)
				dragHelper[key].removeChild(dragHelper[key].childNodes[i]);
			
			dragHelper[key].appendChild(curTarget.cloneNode(true));
			//set position to actual one
			dragHelper[key].style.left = getPosition(curTarget).x+"px";
			dragHelper[key].style.display = 'block';
			dragHelper[key].firstChild.removeAttribute('DragObj');
			
			var dragConts = DragDrops[dragObj];
			var startWidth = parseInt(curTarget.offsetWidth);
			curTarget.setAttribute('startWidth', startWidth);
			curTarget.style.display = 'none';

			for(var i=0; i<dragConts.length; i++){
				with(dragConts[i]){
					var pos = getPosition(dragConts[i]);
					setAttribute('startWidth', parseInt(offsetWidth));
					setAttribute('startLeft', pos.x);
				}
			}
		}
	}

	if(curTarget){

		var move = mousePos.x - mouseOffset.x;
		if (move < limit_Pos_S[key]["max"] && move > limit_Pos_S[key]["min"] && Pos[key]["min"]+1 < Pos[key]["max"])
			dragHelper[key].style.left = move+"px";
		var dragConts  = DragDrops[curTarget.getAttribute('DragObj')];
		var activeCont = null;

		var xPos = mousePos.x - mouseOffset.x + (parseInt(curTarget.getAttribute('startWidth')) /2);

		var i=0;
		for(i=0; i<dragConts.length; i++){
			with(dragConts[i]){
				if((parseInt(getAttribute('startLeft')) < xPos) &&
					((parseInt(getAttribute('startLeft')) + parseInt(getAttribute('startWidth'))) > xPos)){
						activeCont = dragConts[i];
						break;
				}
			}
		}
		if(activeCont){
			if((curTarget.nextSibling) || (curTarget.parentNode!=activeCont)) {
				var targetId = curTarget.getAttribute("id");
				var prevPos = 0;
				prevPos = Pos[key][id];
				Pos[key][id] = i;
				if (Pos[key]["min"]<Pos[key]["max"]) {
					activeCont.appendChild(curTarget);
					if (i==0)
						value = Math.floor(infos[key].Min);
					else if (i==infos[key].initmax) {
						value = infos[key].Max;
						if (Math.floor(value)<value) value = Math.floor(value)+1;
					}
					else {
						if (Math.floor(slice[key]) == slice[key])
							value = infos[key].Min+i*slice[key];
						else
							value = Math.floor((infos[key].Min+i*slice[key])/10)*10;
					}
					setValue(id,key,value);
				}
				else
					Pos[key][id] = prevPos;
			}
			if(curTarget.style.display!=''){
				curTarget.style.display = '';
				curTarget.style.visibility = 'hidden';
			}
		} else {
			if(curTarget.style.display!='none'){
				curTarget.style.display = 'none';
			}
		}
	}
	lMouseState = iMouseDown;
	if(curTarget) return false;
}

function mouseUp(ev){
	//alert("mouseUp");
	if(curTarget){
		dragHelper[key].style.display = 'none';
		curTarget.style.display = '';
		curTarget.style.visibility = 'visible';
		waitReloadFilters();
	}
	curTarget  = null;
	iMouseDown = false;
}

function mouseDown(ev){
	//alert("mouseDown");
	ev         = ev || window.event;
	var target = ev.target || ev.srcElement;
	/*
	iMouseDown = true; seulement si on click sur un elem min ou max
	résout le bug de mouseUp qui ne se lance pas et iMouseDown qu ise remet jamais à false quand on relache la scrollbar sous IE
	*/
	if(target.id.indexOf("min")!=-1 || target.id.indexOf("max")!=-1) {
		iMouseDown = true;
		if(target.onmousedown || target.getAttribute('DragObj')){
			return false;
		}
	}
}

document.onmousemove = mouseMove;
document.onmousedown = mouseDown;
document.onmouseup   = mouseUp;

if ( window.onload != null ) {
	var oldOnload = window.onload;
	window.onload = function ( e ) {
		oldOnload( e );
		initDragable();
	};
}
else
	window.onload = initDragable;

//window.onload = function(e){
function initDragable(){
	min = new Array;
	max = new Array;
	limit_min = new Array;
	limit_max = new Array;
	dragPos = new Array;
	Pos_S = new Array;
	limit_Pos_S = new Array;
	Pos = new Array;
	slice = Array;
	dragHelper = new Array;
	
	for (var key in infos) {
		var diff = infos[key].Max - infos[key].Min;
		slice[key] = diff/infos[key].initmax;
		limit[key] = new Array;
		min[key] = document.getElementById("min"+key);
		max[key] = document.getElementById("max"+key);
		limit_min[key] = document.getElementById("min"+key+"limit");
		limit_max[key] = document.getElementById("max"+key+"limit");
		if (limit_min[key]==null) limit_min[key] = min[key];
		if (limit_max[key]==null) limit_max[key] = max[key];
		if (min[key]!=null && max[key]!=null) {
			Pos[key] = new Array;
			limit_Pos_S[key] = new Array;
			if (typeof(setPos[key]) != "undefined" && typeof(setPos[key].min) != "undefined")
				Pos[key]["min"] = setPos[key].min;
			else
				Pos[key]["min"] = 0;
			if (typeof(setPos[key]) != "undefined" && typeof(setPos[key].max) != "undefined")	
				Pos[key]["max"] = setPos[key].max;
			else
				Pos[key]["max"] = infos[key].initmax;
			Pos_S[key] = new Array;
			Pos_S[key]["min"] = getPosition(min[key]).x;
			//Pos_S[key]["max"] = getPosition(max[key]).x + max[key].style.width;
			Pos_S[key]["max"] = getPosition(max[key]).x;
			limit_Pos_S[key]["min"] = getPosition(limit_min[key]).x;
			limit_Pos_S[key]["max"] = getPosition(limit_max[key]).x;
			dragPos[key] = getPosition(document.getElementById(key+"0"));
			
			var htmlelements = new Array;
			for(var j=0; j<infos[key].initmax+1; j++) {
				htmlelements[j] = document.getElementById(key+j);
			}
			CreateDragContainer(htmlelements);
			dragHelper[key] = document.createElement('div');
			dragHelper[key].style.cssText = 'position:absolute;top:'+dragPos[key].y+'px;left:'+dragPos[key].x+'px;display:none;';
			document.body.appendChild(dragHelper[key]);
			if (typeof(setLimit[key]) != "undefined" && typeof(setLimit[key].min) != "undefined")
				setValue("min",key,setLimit[key].min);
			else
				setValue("min",key,Math.floor(infos[key].Min));
			if (typeof(setLimit[key]) != "undefined" && typeof(setLimit[key].max) != "undefined")
				setValue("max",key,setLimit[key].max);
			else {
				value = infos[key].Max;
				if (Math.floor(value)<value) value = Math.floor(value)+1;
				setValue("max",key,value);
			}
			setTitleValues(key);
		}
	}
	isLoaded();
	if (minicar) includeCarPage('caroffer',carUrl);
}

function setValue(id,key,value) {
	targetId = id+key;
	if (infos[key].ishour && value<10)
		value = "0"+value;
	document.getElementById(targetId+"_div").innerHTML = value+infos[key].suffix;
	limit[key][id] = value;
}

function setTitleValues(key) {
	if (infos[key].initmax<7) {
		mystep = Math.floor((infos[key].Max-infos[key].Min)/infos[key].initmax);
		for (var i=0; i<infos[key].initmax+1; i++) {
			value = infos[key].Min + i*mystep;
			document.getElementById(key+"title"+i).innerHTML = value+infos[key].suffix;
		}
	}
	else {
		var values = new Array();
		values[0] = Math.floor(infos[key].Min);
		value = infos[key].Max;
		if (Math.floor(value)<value) value = Math.floor(value)+1;
		values[infos[key].initmax] = value;
		var middle = Math.floor(infos[key].initmax/2);
		value = infos[key].Min+(infos[key].Max-infos[key].Min)/2;
		values[middle] = value;
		var quarter = infos[key].initmax/4;
		if (Math.floor(quarter) == quarter) {
			value = infos[key].Min+(infos[key].Max-infos[key].Min)/4;
			values[quarter] = value;
			values[quarter*3] = value*3;
		}
		for(var i in values) {
			value = values[i];
			if (i!=0 && i!=infos[key].initmax && Math.floor(slice[key]) != slice[key])
				value = Math.floor(value/10)*10;
			if (infos[key].ishour && value<10)
				document.getElementById(key+"title"+i).innerHTML = "0"+value+infos[key].suffix;
			else
				document.getElementById(key+"title"+i).innerHTML = value+infos[key].suffix;
		}
	}
}
