function DT_DOM (depDate, retDate) {
	// Default options
	var options = {
		view_days: 19,
		diff_days: 2,
		day_width: 25,
		flight_height: 17,
		currency: 'Û',
		lang: 'en'
	};
	// Internal variables
	var that = this;
	var depDate, retDate;
	var priceAxis;
	var colorAxis;
	var dateAxis;
	
	this.flightbox_container,this.flightbox,this.price_axis,this.day_axis,this.colorbar,this.flight_area,this.flights_summary;
	this.flight_description;
	
	// Public functions
	this.init = function (el, html, settings) {
		this.setOptions(settings);
		
		this.flightbox_container = el;
		this.flightbox_container.append(html);
		this.flightbox = $("#dt_graph_flights");
		this.price_axis = $("#dt_graph_scala");
		this.day_axis = $("#dt_day_axis");
		this.colorbar = $("#dt_colormap");
		this.flight_area = $("#dt_flights_data");
		this.flights_summary = $("#dt_total_flights");
		this.flight_description = $("#dt_flight_description .box_content");
		this.scala_label = $("#dt_scala_label");
		this.flight_descriptionbox = $("#dt_flight_description");
		
		var Date0 = new Date(depDate.getFullYear(), depDate.getMonth(), depDate.getDate()-4,0,0,0);
		var Date1 = new Date(retDate.getFullYear(), retDate.getMonth(), retDate.getDate()+5,0,0,0);
		//alert(Date0.getTime()+" - "+Date1.getTime());
		dateAxis = new Axis_CLASS(Date1.getTime(), options.view_days*options.day_width, Date0.getTime(), 0);
		
	};
	this.dayAxis = function (day_str) {
		var interval = parseInt(depDate.diff(retDate));
		
		var dep = new Date(depDate.getFullYear(),depDate.getMonth(),depDate.getDate()-4);
		var month_old = "";
		var month = "";
		//for (true; parseInt(depDate.diff(dep))<=options.view_days-4; dep.setDate(dep.getDate()+1)) {
		for (var i=1; i<=options.view_days; i++) {
			var spec_class = (Math.abs(depDate.diff(dep)) <= options.diff_days || Math.abs(retDate.diff(dep)) <= options.diff_days) ? " dt_second": "";
			if (depDate.diff(dep) == 0 || retDate.diff(dep) == 0) spec_class = " dt_first";
			var day = dep.getDate();
			var word_day = getWordDay(dep.getDay());
			month = getWordMonth(dep.getMonth());
			if (month==month_old) month="";
			else month_old=month;
			if (interval+2*4+1 > options.view_days && depDate.diff(dep) == 5) {
				var new_dep = new Date(retDate.getFullYear(),retDate.getMonth(),retDate.getDate()-5);
				if (new_dep.diff(dep) != 0) {
					spec_class = "";
					day = "...";
					word_day = "&nbsp;";
					month = "";
				}
				dep = new_dep;
			}
			if (interval+2*4+1 < options.view_days && i==depDate.diff(dep)+5 && depDate.diff(dep)>dep.diff(retDate) ) {
				for (var j=0;j<(options.view_days-(interval+2*4+1));j++) {
					this.day_axis.append(day_str.replace("<!--PHP day-->", "...").replace("<!--PHP word_day-->", "&nbsp;").replace("<!--PHP spec_class-->", "").replace("<!--PHP month-->", ""));
					i++;
				}
			}
			this.day_axis.append(day_str.replace("<!--PHP day-->", day).replace("<!--PHP word_day-->", word_day).replace("<!--PHP spec_class-->", spec_class).replace("<!--PHP month-->", month));
			dep.setDate(dep.getDate()+1)
		}
		
	};
	
	this.setColorAxis = function (start, end, from, to) {
		colorAxis = new Gradient_CLASS(start, end, from, to);
	};
	this.drawColorBar = function (html, bins) {
		this.colorbar.html(colorAxis.getFullGradientBar(html, bins));
	};
	
	this.setPriceAxis = function (_max, _ymax, _min, _ymin) {
		priceAxis = new Axis_CLASS(_max, _ymax, _min, _ymin);
	};
	this.drawPriceAxis = function (html, label, tot, zoomFactor) {
		if (zoomFactor == null) zoomFactor = 0;
		var p_min=priceAxis._min;
		var p_max=priceAxis._max;
		var d = (p_max-p_min)/(tot-1);
		this.price_axis.html("");
		this.scala_label.html(label);		
		for (var i=0;i<tot;i++) {
			this.price_axis.append(html.replace("<!--PHP pos-->", Math.round(priceAxis.getPos(p_min+i*d))).replace("<!--PHP value-->", sRound(p_min+i*d, d)).replace("<!--PHP fontSize-->", ((tot-i-1)*zoomFactor)+1));
		}
	};
	
	this.cleanFlights = function () {
		this.flight_area.html("");
	};
	this.addFlight = function (f, html, descr_html, spec_class, onclick_call) {
		var dep = new Date(Date.parse(f.dep_takeoff));
		var ret = new Date(Date.parse(f.ret_takeoff));
		var dep_landing = new Date(Date.parse(f.dep_landing));
		var ret_landing = new Date(Date.parse(f.ret_landing));
		//var day = dep.getDate();
//		var word_day = getWordDay(dep.getDay());
//		month = getWordMonth(dep.getMonth());
		
		var Date0 = new Date(depDate.getFullYear(), depDate.getMonth(), depDate.getDate()-4,0,0,0);
		var Date1 = new Date(retDate.getFullYear(), retDate.getMonth(), retDate.getDate()+5,0,0,0);
		
		var color = colorAxis.getColor(dep.getUTCHours());
		//var left = Math.round(dateAxis.getPos(dep.getTime(), 0, false));
		//var width = Math.round((dateAxis.getPos(ret.getTime(), 0, false) - dateAxis.getPos(dep.getTime(), 0, false)));
		var left = Math.round((dep.getTime() - Date0.getTime())/(60*60*24*1000) * options.day_width);
		var width = options.view_days*options.day_width - Math.round((Date1.getTime() - ret.getTime())/(60*60*24*1000) * options.day_width) - left;
		var top = Math.round(priceAxis.getPos(f.price, options.flight_height));
		if (!top) return false;
		var booking_link = (f.BookingLink != undefined) ? f.BookingLink.replace('{lang}', options.lang) : "#";
		var supp_spec = f.supplier+" / "+f.BookingClass+"-Class<br /><span><a href='"+booking_link+"' title='Click for booking' target='_blank'>"+f.price+" "+options.currency+" click for booking</a></span>";
		for (var j=0; (j<f.others.length && j<3); j++) {
			var booking_link = (f.others[j].BookingLink != undefined) ? f.BookingLink.replace('{lang}', options.lang) : "#";
			class_spec = (f.others[j].BookingClass != "") ? " - "+f.others[j].BookingClass+" class" : "";
			supp_spec += "<br />"+f.others[j].supplier+" / "+f.others[j].BookingClass+"-Class<br /><span><a href='"+booking_link+"' title='Click for booking' target='_blank'>"+f.others[j].price+" "+options.currency+" click for booking</a></span>";
		}
		supp_spec = supp_spec.substr(0,supp_spec.length-1);
		
		var offset=this.flightbox_container.offset();
		offset.left = offset.left + parseInt(this.flightbox_container.css("padding-left").replace("px",""));
		offset.top = offset.top + parseInt(this.flightbox_container.css("padding-top").replace("px",""));		
		
		var d_html = descr_html.replace("<!--PHP departingDate-->", getTranslatedDate(dep)).replace("<!--PHP departingTime_takeoff-->", dep.getHours()+":"+dep.getMinutes()).replace("<!--PHP departingTime_landing-->", dep_landing.getHours()+":"+dep_landing.getMinutes()).replace("<!--PHP returningDate-->", getTranslatedDate(ret)).replace("<!--PHP returningTime_takeoff-->", ret.getHours()+":"+ret.getMinutes()).replace("<!--PHP returningTime_landing-->", ret_landing.getHours()+":"+ret_landing.getMinutes()).replace("<!--PHP Suppliers-->", supp_spec);
		
		var div_html = $(html.replace("<!--PHP color-->", color).replace("<!--PHP axis_pos[date]-->", left).replace("<!--PHP width[date]-->", width).replace("<!--PHP axis_pos[price]-->", top).replace("<!--PHP carrier-->", f.carrier).replace("<!--PHP carrier[img]-->", f.carrierImg).replace("<!--PHP supplier_spec-->", supp_spec).replace("<!--PHP supplier-->", f.supplier).replace("<!--PHP id-->", f.uniqueid).replace("<!--PHP price-->", f.price).replace("<!--PHP currency_symbol-->", options.currency)).addClass(spec_class).data('descr_id', "dt_flight_description").data('description', d_html).click( onclick_call ).hover(function (e) {
			var x = e.pageX; var y = e.pageY;
			x -= offset.left-15;
			y -= offset.top-15;
			
			that.flight_description.html( $(this).data('description') );
			that.flight_descriptionbox.css({left:x+'px',top:y+'px'}).show();
			flight_bar=this;
			
			$(document).bind("mousemove",function(e){
				var x, y, right, bottom;  
				try { x = e.pageX; y = e.pageY; } // FF
				catch(e) { x = event.clientX+document.body.scrollLeft; y = event.clientY + document.body.scrollTop; } // IE
				x -= offset.left-15;
				y -= offset.top-15;
				that.flight_descriptionbox.css({left:x+'px',top:y+'px'});
			});
		},
		function(){
			$(document).unbind("mousemove");
			flight_bar=null;
			that.flight_descriptionbox.hide();
		});
		this.flight_area.append(div_html);
		return true;
	};
	
	function getWordDay (num) {
		if (options.word_day == null) return "&nbsp;";
		return options.word_day[num];
	}
	function getWordMonth (num) {
		if (options.word_month == null) return "&nbsp;";
		return options.word_month[num];
	}
	function getTranslatedDate (d) {
		return getWordDay(d.getDay())+", "+d.getDate()+" "+getWordMonth(d.getMonth())+" "+d.getFullYear();
	}
	function sRound (num, d) {
		if (Math.abs(d)<=6) {
			var down = Math.floor(num/10)*10;
			var last = num-down;
			var diff = (last<3) ? 0 : ((last<8) ? 5 : 10);
			return down+diff;
		}
		num = Math.round(num/10)*10;
		return num;
	}
	
	
	this.setOptions = function (settings) {
		$.extend(options, settings);
	};

}

