/**
класс objD3.js
общий класс для графики в библиотеке D3.js
==============================================================================================
функции класса: 
svgsize() - размер канвы, или любого другого DOM элемента
remove() - удаление элементов канвы
generateSvg() - формирование канвы
hyperbole() - формирование массива точек гиперболы
zoom() - увеличение
drawcircle() - нарисовать круг
makearrgradientcolors() - собирает массив градиента цветов
drawAxis() - рисование абциссы и ординаты
==============================================================================================
(c) Mychko Eduard, 2015, Moscow, Russia, eduard.mychko@gmail.com
==============================================================================================




СОХРАНЕНИЕ http://jsfiddle.net/plaliberte/HAXyd/


*/

var objD3 = {

	/*----------------------------размер канвы, или любого другого DOM элемента----------------------------------*/
	svgsize: function(elem,param){
		return objHelpers.getSizeElementDOM(elem,param); 
	},

	/*----------------------------------удаление элементов канвы----------------------------------------------------*/
	remove: function(where,what){
		where.selectAll(what).remove();
		return false;
	},
	
	/*----------------------------------формирование канвы----------------------------------------------------*/
	generateSvg: function(canvas,widthSVG,heightSVG,marginArr){
		var margin = {top: marginArr[0], right: marginArr[1], bottom: marginArr[2], left: marginArr[3]},
			width = widthSVG - margin.left - margin.right,
			height = heightSVG - margin.top - margin.bottom;
			var svg = d3.select(canvas).append("svg")
				.data([{ x: 50, y: 50 }])
				.attr("width", width + margin.left + margin.right)
				.attr("height", height + margin.top + margin.bottom)
				.append("g")
				.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
		return svg;  
	},
	
	/*---------------------------------генерация сетки---------------------------------*/
	makeGrid: function(svg,boxWidth,boxHeight,r,padd){
		  svg.append("g")
			    .attr("class", "line_grid")
			    .selectAll("line")
			    .data(d3.range(padd, boxWidth, r))
			    .enter().append("line")
			    .attr("x1", function(d) { return d; })
			    .attr("y1", padd)
			    .attr("x2", function(d) { return d; })
			    .attr("y2", boxHeight);

		   svg.append("g")
			    .attr("class", "line_grid")
			    .selectAll("line")
			    .data(d3.range(padd, boxHeight, r))
			    .enter().append("line")
			    .attr("x1", padd)
			    .attr("y1", function(d) { return d; })
			    .attr("x2", boxWidth)
			    .attr("y2", function(d) { return d; });
	},
	
	
	/*----------------------------------формирование массива точек гиперболы----------------------------------*/
	hyperbole: function(xBt,xMax,xStep){
		var hyperbole = [];
		for (var x = xBt; x <= xMax; x=x+xStep){
			var y = (1/ x);
			hyperbole.push([x,y]);
		}
		return hyperbole;
	},
	
	/*---------------------------------------увеличение--------------------------------------------*/
	zoom: function(elem){
		return false;
	},
	
	
	resizeSvg: function(canvas,svg){
		 
		var Width = objD3.svgsize(canvas,'width'); /* задаем ширину канвы */
		var Height =  objD3.svgsize(canvas,'height'); /* задаем высота канвы */

		 svg.attr("width",Width).attr("height", Height);
		
		return false;
	},
	
	/*--------------------------------------рисование абциссы и ординаты-----------------------------------------*/
	drawAxis: function(p){
		var yScale = d3.scale.linear()
					.domain([p.minY, p.maxY])
					.range([p.rangY1, p.rangY2]);
		
		var xScale = d3.scale.linear()
					.domain([p.minX, p.maxX])
					.range([p.rangX1, p.rangX2]);	
		
		var xAxis = d3.svg.axis()
				.scale(xScale)
				.innerTickSize([p.inTickSizeY])
			/*	.tickFormat(	 function(d) { return d/10;})*/
				.tickPadding([p.ticPadY])
				.orient("bottom"); 
		
		var yAxis = d3.svg.axis()
				.scale(yScale)
				.innerTickSize([p.inTickSizeX])
				/*.tickFormat(	 function(d) { return (Math.round(d*100))/100;})*/
  				.orient("left");
		
		p.svg.append("g")
			.attr("class", "axis")
			.attr("transform", "translate(0," + (p.height-50) + ")")
 			.call(xAxis);
		
		p.svg.append("g")
			.attr("class", "axis")
 			.call(yAxis);
		
		p.svg.append("g").selectAll("text")
                        .data(p.labels)
                        .enter()
                        .append("text")
						.attr("x", function(d) { return xScale(d.x);    })
						.attr("y", function(d) { return yScale(d.y);    })
						.text( function (d) { return d.text; })
						.attr("class","labelstext2");

		return false;
	},
	
	/*---------------------------------получить массив цветов с градиентом---------------------------------*/
	makearrgradientcolors: function(p){
 		var arr_color =[];
		for (var i = 0; i<=p.source.length; i++){
			arr_color.push(objHelpers.getFadeMiddleColor(p.startcolor,p.finishcolor,10,i));
		}
		return arr_color;
	},
	
	/*--------------------------------------нарисовать круг-------------------------------------------*/
	drawcircle: function(svg,x,y){
		svg.append("g")
	            .attr("transform", "translate(" +  x + "," + y + ")")
	            .attr("class", "second")
	            .attr("stroke", "rgb(255, 116, 0)")
	            .attr("stroke-width", "1")
	            .append("circle").attr({
	              r: 8,
	            })
	            .style("fill", "rgb(255, 116, 0)");
		return false;		
	},
};