/**
 * NLBIBGraf - jQuery plugin
 *
 * (c) Inetis d.o.o. 2010
 * 
 * 
 * Json data primer;
 * 
 * {
 * 	'status': 'OK',
 * 	'locale': 'si' | 'en',						- locale za format datuma in decimalne vejice
 * 	'type': 'day' | 'month' | 'year',			- tip grafa: dnevni, mesečni ali letni
 * 	'x': 'date',								- tip podatkov na x osi
 * 	'y': 'double',								- tip podatkov na y osi
 * 	'dataLabels': ['L' | 'R'],					- kateri y osi ustrezajo podatki. vrstni red se mora ujemati z vrstnim redom grafov v data parametru 
 * 	'data': [[{'x':'...', 'y':'...'}],[], ...]	- podatki za graf(e).
 * }
 * 
 */

(function($){  
	$.fn.LJSEGraf = function(options) {  
	 
		var defaults = { 
			data: null,
			dataSource: '',
			st_dec: -1,
			locale: 'si', 
			width: 350,  										// širina grafa
			height: 160, 										// višina grafa
			bgColor: "#fff",									// barva ozadja
			font: "Arial",										// font za lable
			padding: {top: 7, right:20, bottom:20, left:45},	// odmik grafa od roba slike
			axisShow: {x:false, y:false},						// ali se izriše abscisna in ordinatna os
			axisColor: {x:"#ffffff", y:"#ffffff"},				// barva abscisne in ordinatne osi
			axisWidth: {x:1, y:1},								// debelina abscisne in ordinatne osi
			labels: {x:7, y:8},									// koliko lablov se izriše na oseh 
			labelSize: {x:4, y:0},								// dolžina črtice pri lablu
			labelColor: {x:"#28007d", y:"#28007d"},				// barva črtice pri lablu
			labelFontSize: { x:9, y:9},							// velikost fonta pri lablu
			labelFontColor: {x:"#000000", y:"#000000"},			// barva fonta za label
			labelFormat: { 										// format datuma na x osi
				x: {
					day: "hh:mm",
					month: "DD.MM",
					year: "DD.MM.YY"
				} 
			},
			labelShowFirst: {x:true, y:false},					// ali se prikaže prvi label
			labelShowLast: {x:true, y:false},					// ali se prikaže zadnji label
			labelGridShow: {vert: false, horiz:true},			// ali se izriše grid črte
			labelGridColor: {vert:"#ebebeb", horiz:"#ebebeb"},	// barva grid črte
			labelGridStyle: {vert:"", horiz:""},				// stil grid črte
			labelGridWidth: {vert:1, horiz:1},					// debelina grid črte
			labelGridBGShow: {vert: false, horiz:true},			// ali se za grid pobarva celo ozadje
			labelGridBGColors: ["#f8ffff","#ebf4fa"],			// barve ozadja
			grafPadding: {top:'10%', bottom:'10%'},				// odmik grafa od abscisne osi in vrha grafa
			plotColor: "#6bb5d4",								// barva črte grafa
			plotWidth: 1,										// debelina grafa črte
			plotFill: false,									// ali se pobarva področje pod grafom
			plotFillColor: "#0345ae",
			plotFillOpacity: 0.10,
			svgOffset: 0,
			plot: [
			       {
						type: "line",
			    	    color: "#6bb5d4",								// barva črte grafa
						width: 1,										// debelina grafa črte
						fill: false,									// ali se pobarva področje pod grafom
						fillColor: "#0345ae",
						fillOpacity: 0.10,
						style: ""
			    	   
			       },
			       {
			    	    type: "line",
						color: "#fe9916",
						width: 1,
						fill: false,
						fillColor: "#fe9916",
						fillOpacity: 0.10,
						style: "-"
			    	   
			       },
			       {
			    	    type: "bar",							// tip grafa so navpični pravokotniki
						color: "#fe9916",						// barva
						width: 5,								// širina pravokotnika
						fill: true,								
						fillColor: "#fe9916",
						fillOpacity: 1.0,
						style: ""
			    	   
			       }
			       
			       
			]
			
		};  
		
		var o = $.extend(defaults, options);  
		
		var DrawAxis = function(paper){
			if(o.axisShow.x){
			
				// horizontal
				var w = o.width - o.padding.left - o.padding.right;
				var x = o.padding.left;
				var y = o.height - o.padding.bottom + o.svgOffset;
				
				var c = "M"+ x +" "+ y +"L"+ (x+w) +" "+ y;
				paper.path(c).attr({
					"stroke": o.axisColor.x,
					"stroke-width": o.axisWidth.x
				});
				
				w = o.width - o.padding.left - o.padding.right;
				x = o.padding.left;
				y = o.padding.top + o.svgOffset;
				
				c = "M"+ x +" "+ y +"L"+ (x+w) +" "+ y;
				paper.path(c).attr({
					"stroke": o.axisColor.x,
					"stroke-width": o.axisWidth.x
				});
			}
			
			if(o.axisShow.y){
				// vertical
				var h = o.height - o.padding.top - o.padding.bottom;
				x = o.padding.left+o.svgOffset;
				y = o.padding.top;
				
				c = "M"+ x +" "+ y +"L"+ x +" "+ (y+h);
				paper.path(c).attr({
					"stroke": o.axisColor.y,
					"stroke-width": o.axisWidth.y
				});
				
				h = o.height - o.padding.top - o.padding.bottom;
				x = o.width - o.padding.right+o.svgOffset;
				y = o.padding.top;
				
				c = "M"+ x +" "+ y +"L"+ x +" "+ (y+h);
				paper.path(c).attr({
					"stroke": o.axisColor.y,
					"stroke-width": o.axisWidth.y
				});
			}
		};
		
		var DrawGrid = function(paper, xInterval, yInterval, data){
			if(o.labels.x > 1){
				var w = o.width - o.padding.left - o.padding.right;
				var dx;
				
				var labels = GetXLabelValues(xInterval, o.labels.x, data);
				
				for( var i=0; i<labels.length; i++){
					
					// draw vertical grids
					if( o.labelGridShow.vert && i>0){
						h = o.height - o.padding.top - o.padding.bottom;
						c = "M"+ x +" "+ y +"L"+ x +" "+ (y-h);
						paper.path(c).attr({
							"stroke": o.labelGridColor.vert,
							"stroke-width": o.labelGridWidth.vert,
							"stroke-dasharray": o.labelGridStyle.vert 
						});
						
					}
					
					
				}
			}
			
			if(o.labels.y > 1){
				var h = o.height - o.padding.top - o.padding.bottom;
				var dy = Math.round( h / (o.labels.y - 1));
				var dVal = Math.round( ((yInterval.max - yInterval.min) / (o.labels.y - 1)) * 100) / 100;
				
				var nDec = 0;
				
				// draw grid
				for( var i=0; i<o.labels.y; i++){
						
					var w = o.labelSize.y;
					var y = o.height - o.padding.bottom - i*dy+o.svgOffset;
					var x = o.padding.left;
										
					// draw horizontal grids
					if( o.labelGridShow.horiz && i>0){
						w = o.width - o.padding.left - o.padding.right;
						c = "M"+ x +" "+ y +"L"+ (x+w) +" "+ y;
						paper.path(c).attr({
							"stroke": o.labelGridColor.horiz,
							"stroke-width": o.labelGridWidth.horiz,
							"stroke-dasharray": o.labelGridStyle.horiz 
						});
						
					}
					
					// draw horizontal grid background fill
					if( o.labelGridBGShow.horiz && i>0){
						var y_1 = o.height - o.padding.bottom - (i-1)*dy+o.svgOffset;
						w = o.width - o.padding.left - o.padding.right;
						h = y_1 - y;
						
						paper.rect(x,y,w,h).attr({
							'fill': o.labelGridBGColors[i%2],
							"stroke": o.labelGridBGColors[i%2],
							"stroke-width": 1
						});
						
					}
				}
				
				i=o.labels.y-1;
				if( o.labelGridBGShow.horiz && i>0){
					var y = o.height - o.padding.bottom - i*dy+o.svgOffset;
					var y_1 = o.height - o.padding.bottom - (i-1)*dy+o.svgOffset;
					w = o.width - o.padding.left - o.padding.right;
					h = y_1 - y;
					
					paper.rect(x,y,w,h).attr({
						'fill': o.labelGridBGColors[i%2],
						"stroke": o.labelGridBGColors[i%2],
						"stroke-width": 1
					});
					
				}
												
			}
		};
		
		var DrawXLabels = function(paper, xInterval, data){
			if(o.labels.x > 1){
				var w = o.width - o.padding.left - o.padding.right;
				var dx;
				
				var labels = GetXLabelValues(xInterval, o.labels.x, data);
				
				for( var i=0; i<labels.length; i++){
					if(i==0 && !o.labelShowFirst.x) continue;
					if(i==labels.length-1 && !o.labelShowLast.x) continue;
					
					dx = w * GetRelativeDateValue(xInterval.min, labels[i].val, data.type) / GetRelativeDateValue(xInterval.min, xInterval.max, data.type); 
					
					var h = o.labelSize.x;
					var x = Math.round(o.padding.left+ dx) + o.svgOffset;
					var y = o.height - o.padding.bottom;
					
					var c = "M"+ x +" "+ y +"L"+ x +" "+ (y+h);
					if( h > 0){
						paper.path(c).attr({
							"stroke": o.labelColor.x,
							"stroke-width": o.axisWidth.x
						});
					}
					
					// draw horizontal labels
					var ty = (isIE())? o.labelFontSize.x+2 : o.labelFontSize.x/2+4;
					var text = paper.text(x,y, labels[i].text).attr({
						'fill': o.labelFontColor.x,
						'font-size': o.labelFontSize.x,
						'font-face': o.font
					});
					text.translate(0, ty );
					
				}
			}
		}
		
		var DrawYLabels = function(paper, yInterval, data, location){
			if(o.labels.y > 1){
				var h = o.height - o.padding.top - o.padding.bottom;
				var dy = Math.round( h / (o.labels.y - 1));
				var dVal = (yInterval.max - yInterval.min) / (o.labels.y - 1);
				
				var nDec = 0;
				if( o.st_dec >= 0 || data.st_dec && !isNaN(parseInt(data.st_dec, 10)) ){ 
					if(o.st_dec >= 0 )nDec = o.st_dec;
					else if( data.st_dec && !isNaN(parseInt(data.st_dec, 10))  ) nDec = parseInt(data.st_dec, 10);
				}else if(dVal < 5){
					nDec = 2;
				}
				
				var labels = [];
				for( var i=0; i<o.labels.y; i++){
					var ll = yInterval.min + i*dVal;
					if(dVal < 0.5){
						ll = Math.round(ll * 100) / 100;
					}else if( dVal < 5 ){
						ll = Math.round(ll * 10) / 10;
					}else{
						ll = Math.round(ll);
					}
					labels.push(ll)
				}
				
				// draw label ticks and labels
				for( var i=0; i<labels.length; i++){
					if(i==0 && !o.labelShowFirst.y) continue;
					if(i==labels.length-1 && !o.labelShowLast.y) continue;
					
					var w,y,x;
					w = o.labelSize.y;
					y = o.height - o.padding.bottom - ( h * (labels[i] - yInterval.min))/(yInterval.max - yInterval.min) +o.svgOffset;
					if( location == "left"){
						x = o.padding.left;
					}else{
						x = o.width - o.padding.right;
					}
					
					
					var c = "M"+ (x-w) +" "+ y +"L"+ x +" "+ y;
					if( w > 0){
						paper.path(c).attr({
							"stroke": o.labelColor.y,
							"stroke-width": o.axisWidth.y
						});
					}
					
					// draw vertical labels
					var val = FormatCurrency( labels[i] , nDec, o.locale);
					
					var text = paper.text(x,y, val).attr({
						'fill': o.labelFontColor.y,
						'font-size': o.labelFontSize.y,
						'font-face': o.font
					});
					
					if( location == "left"){
						text.translate(-1*(text.getBBox().width/2 + w + 5), 0);
					}else{
						text.translate((text.getBBox().width/2 + w + 5), 0);
					}
				}
								
			}
		};
		
		var PlotGraf = function(paper, data){
			
			var xInterval = GetXInterval(data, data.x );
			
			var yInterval=null, yInterval2=null;
			if( data.dataLabels && data.dataLabels.length > 0){
				yInterval = GetYInterval(data, data.y, "L" );
				yInterval2 = GetYInterval(data, data.y, "R" );
			}else{
				yInterval = GetYInterval(data, data.y, "L" );
			}
			
			if( xInterval == null || yInterval == null ) return;
			
			if( data.locale ) o.locale = data.locale;
			
			if( o.grafPadding.top.length > 0){
				var p = parseFloat( o.grafPadding.top.replace(/%/,'')) / 100
				yInterval.max += Math.round( ( yInterval.max - yInterval.min ) * p * 1000 ) / 1000;	
				if( yInterval2 != null){
					yInterval2.max += Math.round( ( yInterval2.max - yInterval2.min ) * p * 1000 ) / 1000;	
				}
			}
			
			if( o.grafPadding.bottom.length > 0){
				var p = parseFloat( o.grafPadding.bottom.replace(/%/,'')) / 100
				yInterval.min -= Math.round( ( yInterval.max - yInterval.min ) * p * 1000 ) / 1000;		
				if( yInterval.min < 0) yInterval.min = 0;
				if( yInterval2 != null){
					yInterval2.min -= Math.round( ( yInterval2.max - yInterval2.min ) * p * 1000 ) / 1000;		
					if( yInterval2.min < 0) yInterval2.min = 0;
				}
			}
			
			
			DrawGrid(paper, xInterval, yInterval, data);
			DrawXLabels(paper, xInterval, data);
			DrawYLabels(paper, yInterval, data, "left");
			if( yInterval2 != null) DrawYLabels(paper, yInterval2, data, "right");
			

			
			for(var j=data.data.length-1; j>=0; j--){
				var interval=yInterval;
				if( data.dataLabels && data.dataLabels.length > j && data.dataLabels[j] == "R") interval=yInterval2;
				
				if(o.plot[j].type == "bar"){
					PlotBars(paper, data, j, xInterval, interval);
				}else{
					PlotLine(paper, data, j, xInterval, interval);
				}
				
			}
		};
		
		var PlotLine = function(paper, data, j, xInterval, yInterval){
			
			var c = "";
			var cf = "";
			
			cf = "M"+(o.padding.left)+",";
			cf += (isIE()) ? o.height-o.padding.bottom+1 : o.height-o.padding.bottom;			
			
			for(var i=0; i<data.data[j].length; i++){
				
				var dx = GetRelativeDateValue(xInterval.min, ParseValue(data.data[j][i].x, data.x), data.type) / GetRelativeDateValue(xInterval.min, xInterval.max, data.type);
				var dy = (data.data[j][i].y - yInterval.min) / (yInterval.max - yInterval.min);
				
				var x = o.padding.left + dx * (o.width - o.padding.left - o.padding.right);
				var y = o.height - o.padding.bottom - dy * (o.height - o.padding.top - o.padding.bottom);
				
				c += ( c.length == 0) ? "M" : " L";
				c += x+","+y;
				
				
				if(isIE() && i == data.data.length-1){
					cf += "L"+ (x+1)+","+y;
				}else{
					cf += "L"+ x+","+y;
				}
				
				if( i == data.data.length-1 ) {
					cf += "L";
					cf += (isIE()) ? (x+1)+"," : x+",";
					cf += (isIE()) ? o.height-o.padding.bottom+1 : o.height-o.padding.bottom
				}
			}
			
			if(o.plot[j].fill){
				paper.path(cf).attr({
					"stroke": o.plot[j].fillColor,
					"stroke-width": 0,
					"fill": o.plot[j].fillColor,
					"fill-opacity": o.plot[j].fillOpacity
				});
			}
			
			paper.path(c).attr({
				"stroke": o.plot[j].color,
				"stroke-width": o.plot[j].width,
				"stroke-dasharray": o.plot[j].style 
			});
			
			
		}

		var PlotBars = function(paper, data, j, xInterval, yInterval){

			var dataCount = data.data[j].length;
			
			var min_dx = o.width - o.padding.left - o.padding.right;
			var tt_1 = 0;
			for(var i=0; i<data.data[j].length; i++){
				if(i==0) continue;
				var dx = GetRelativeDateValue(xInterval.min, ParseValue(data.data[j][i].x, data.x), data.type) / GetRelativeDateValue(xInterval.min, xInterval.max, data.type);
				var tt = dx * (o.width - o.padding.left - o.padding.right);
				//console.log(min_dx, tt, tt_1, dx);	
				if( (tt-tt_1) > 0 && (tt-tt_1) < min_dx ) min_dx = tt-tt_1;
				tt_1 = tt;
			}
			
			var barWidth = min_dx - 1;
			
			//console.log(barWidth);	
			
			if( barWidth > o.plot[j].width) barWidth = o.plot[j].width;
			if( barWidth < 1 ) barWidth = 1;
			//console.log(barWidth);	
			var c = "";			
			for(var i=0; i<data.data[j].length; i++){
				
				var dx = GetRelativeDateValue(xInterval.min, ParseValue(data.data[j][i].x, data.x), data.type) / GetRelativeDateValue(xInterval.min, xInterval.max, data.type);
				var dy = (data.data[j][i].y - yInterval.min) / (yInterval.max - yInterval.min);
				
				var x = o.padding.left + dx * (o.width - o.padding.left - o.padding.right);
				var y = o.height - o.padding.bottom - dy * (o.height - o.padding.top - o.padding.bottom);
				
				c = "M" + (x-barWidth/2)+","+ (o.height - o.padding.bottom );
				c += "L" + (x-barWidth/2)+","+ y;
				c += "L" + (x+barWidth/2)+","+ y;
				c += "L" + (x+barWidth/2)+","+ (o.height - o.padding.bottom );
				
				paper.path(c).attr({
					"stroke": o.plot[j].fillColor,
					"stroke-width": 0,
					"fill": o.plot[j].fillColor,
					"fill-opacity": o.plot[j].fillOpacity
				});
			

			}
			
		}
		
		
		/**
		 * Vrne min in max vrednost intervala poslanih podatkov
		 * data - podatki za graf
		 * what - za kateri podatek želimo interval ('x', 'y',...)
		 * type - tip podatka ['date','double','integer']
		 */
		var GetXInterval = function(data, type){
						
			if(data.interval && data.interval["x"]){
				var min = ParseValue( data.interval["x"]["min"], type);
				var max = ParseValue( data.interval["x"]["max"], type);
				return {'min':min, 'max':max};
			}else if( data.data && data.data.length > 0 ){
				var min = ParseValue( data.data[0][0]["x"], type);
				var max = ParseValue( data.data[0][0]["x"], type);
				for(var i=0; i<data.data.length; i++){
					for(var j=0; j<data.data[i].length; j++){
						var v = ParseValue( data.data[i][j]["x"], type);
						if( v < min) min = v;
						if( v > max) max = v;
					}
				}
				
			
				return {'min':min, 'max':max};
			}
			
			return null;
		};
		
		/**
		 * Vrne min in max vrednost intervala poslanih podatkov
		 * data - podatki za graf
		 * what - za kateri podatek želimo interval ('x', 'y',...)
		 * type - tip podatka ['date','double','integer']
		 * ordinata - katera ordinata ("L"-leva, "R"-desna)
		 */
		var GetYInterval = function(data, type, ordinata){
			var min=null,max=null;
			
			if(data.interval && data.interval["y"]){
				
				min = ParseValue( data.interval["y"]["min"], type);
				max = ParseValue( data.interval["y"]["max"], type);
				
			}else if( data.data && data.data.length > 0 ){
				
				if( data.dataLabels && data.dataLabels.length > 0){
					// če imamo več ordinat je obvezen dataLabels, ki pove kateri graf uporablja katero os
					// poiščemo min max za tiste grafe, ki uporabljajo to os
					var first=false;
					for(var i=0; i<data.dataLabels.length; i++){
						if( data.dataLabels[i] != ordinata ) continue;
						
						if(!first){
							min = max = ParseValue( data.data[i][0]["y"], type);
							first = true;
						}
						
						for(var j=0; j<data.data[i].length; j++){
							var v = ParseValue( data.data[i][j]["y"], type);
							if( v < min) min = v;
							if( v > max) max = v;
						}
					}
				}else{
					// ordinatna os je samo ena - poiščemo min max vseh grafov
					min = max = ParseValue( data.data[0][0]["y"], type);
					for(var i=0; i<data.data.length; i++){
						for(var j=0; j<data.data[i].length; j++){
							var v = ParseValue( data.data[i][j]["y"], type);
							if( v < min) min = v;
							if( v > max) max = v;
						}
					}
				}
			
				
			}

			return (min!=null && max!=null)? {'min':min, 'max':max} : null;

		};		
		
		/**
		 * Parsanje podatkov v pravilni podatkovni tip
		 * data - podatek
		 * type - tip podatka
		 */
		var ParseValue = function(data, type){
			if(type == "date"){
				var regexp = /(\d{2,4})\-(\d{1,2})\-(\d{1,2})T(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?/;
				var m = regexp.exec(data);
				
				var hh = parseInt(m[4],10);
				var mm = parseInt(m[5],10);
				var ss = parseInt(m[6],10);
				
				if(isNaN(hh)) hh = 0;
				if(isNaN(mm)) mm = 0;
				if(isNaN(ss)) ss = 0;
				
				return new Date(parseInt(m[1],10), parseInt(m[2],10)-1, parseInt(m[3],10), hh,mm,ss);
			}else if(type == "time"){
				var regexp = /(\d{1,2}):(\d{1,2})?:?(\d{1,2})?/;
				var d = new Date();
				var m = regexp.exec(data);
				var hh = parseInt(m[1],10);
				var mm = parseInt(m[2],10);
				var ss = parseInt(m[3],10);
				
				if(isNaN(hh)) hh = 0;
				if(isNaN(mm)) mm = 0;
				if(isNaN(ss)) ss = 0;
				
				return new Date(d.getFullYear(), d.getMonth()-1, d.getDate(), hh,mm,ss);	
			}else if(type == "double"){
				return parseFloat(data);
			}else if(type == "int"){
				return parseInt(data,10);
			}
			
			return ""+data;
		};
		
		/**
		 * Vrne array vrednosti za x datumske Lable. Labli se generirajo specifično  glede na tip.
		 * 
		 */
		var GetXLabelValues = function(interval, n, data){
			if( !interval) return null;
			
			if( data.xLabels && data.xLabels.length > 0){
			
				var labels = [];
				for(i=0; i<data.xLabels.length; i++){
					var d = ParseValue(data.xLabels[i], data.x);
					var dVal = (data.type != "numeric") ? FormatDate(o.labelFormat.x[data.type], d) : d; 
					labels.push({val:d, text:dVal});
				}
				return labels;
			}else{
			
				
				if( ( n = parseInt(n,10)) <= 1 ) return null;
				
				switch(data.type){
				case "day":
					var max = GetRelativeDateValue(interval.max,interval.min, "day" );
					var dx = Math.floor(max / (n));
					var labels = [];
					for(i=0; i<=n; i++){
						var d = new Date(interval.min.getTime() + i*dx*(1000));
						var dVal = FormatDate(o.labelFormat.x[data.type], d); 
						labels.push({val:d, text:dVal});
					}
					
					return labels;
					break;
				case "week":
					break;
				case "month":
					var max = GetRelativeDateValue(interval.max,interval.min, "month" );
					var dx = Math.floor(max / (n));
					var labels = [];
					for(i=0; i<=n; i++){
						var d = new Date(interval.min.getTime() + i*dx*(1000 * 60 * 60 * 24));
						var dVal = FormatDate(o.labelFormat.x[data.type], d); 
						labels.push({val:d, text:dVal});
					}
					
					return labels;
					break;
				case "year":
					
					var max = GetRelativeDateValue(interval.max,interval.min, "month" );
					var dx = Math.floor(max / (n));
					var labels = [];
					for(i=0; i<=n; i++){
						var d = new Date(interval.min.getTime() + i*dx*(1000 * 60 * 60 * 24));
						var dVal = FormatDate(o.labelFormat.x[data.type], d); 
						labels.push({val:d, text:dVal});
					}
									
					return labels;
					break;
				case "numeric":
					
					var dx = (interval.max - interval.min) / n;
					var labels = [];
					for(i=0; i<=n; i++){
						var d = Math.round(interval.min + i*dx);
						var dVal = d; 
						labels.push({val:d, text:dVal});
					}
									
					return labels;
					break;
				}
			}
			
		};
		
		/**
		 * Vrne array vrednosti za y Lable.
		 * 
		 */
		var GetYLabelValues = function(interval, n, data){
			if( !interval) return null;
			
			if( data.yLabels && data.yLabels.length > 0){
			
				var labels = [];
				for(i=0; i<data.yLabels.length; i++){
					var d = parseFloat(data.yLabels[i]);
					var dVal = d; 
					labels.push({val:d, text:dVal});
				}
				return labels;
			}else{
			
				
				if( ( n = parseInt(n,10)) <= 1 ) return null;
			
				
				var dy = (interval.max - interval.min) / n;
				var labels = [];
				for(i=0; i<=n; i++){
					var d = Math.round(interval.min + i*dy);
					var dVal = d; 
					labels.push({val:d, text:dVal});
				}
				return labels;

			}
			
		};		
		/**
		 * Pretvori datum v double vrednost relativno na referenčno vrednost (začetek intervala) 
		 * Znotraj dneva vrne razliko v sekundah, za teden in mesec vrne razliko v dnevih, za leto pa vrne razlikov mesecih
		 */
		var GetRelativeDateValue = function(ref, val, type){
			var out = 0;
			switch(type){
				case "day":
					out = (ref.getTime() - val.getTime()) / 1000; // razlika v sekundah
					break;
				case "week":
				case "month": // razlika v dnevih
					out = (ref.getTime() - val.getTime()) / (1000 * 60 * 60 * 24); 
					break;
				case "year": // razlika v mesecih
					out = MonthDiff(ref, val);
					break;
				case "numeric": 
					out = parseFloat(ref) - parseFloat(val);
			
			}
			return out;
		}
		
		var FormatDate = function(format, date){
			var months = {
            "si": ['jan','feb','mar','apr','maj','jun','jul','avg','sep','okt','nov','dec'],
            "en": ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
					};
			
			var d = date.getDate();
			var dd = (d<10) ? "0"+d : d; 
			var m = date.getMonth()+1;
			var mm = (m<10) ? "0"+m : m; 
			var yyyy = date.getFullYear();
			var y = yyyy - 2000; 
			var yy = (y<10) ? "0"+y : y;  
			var h = date.getHours();
			var hh = (h<10) ? "0"+h : h; 
			var mi = date.getMinutes();
			var mmi = (mi<10) ? "0"+mi : mi; 
			var s = date.getSeconds();
			var ss = (s<10) ? "0"+s : s; 
			
			format = format.replace(/YYYY/, '#1#');
			format = format.replace(/YY/, '#2#');
			format = format.replace(/MMM/, '#3#');
			format = format.replace(/MM/, '#4#');
			format = format.replace(/M/, '#5#');
			format = format.replace(/DD/, '#6#');
			format = format.replace(/D/, '#7#');
			format = format.replace(/hh/, '#8#');
			format = format.replace(/h/, '#9#');
			format = format.replace(/mm/, '#10#');
			format = format.replace(/m/, '#11#');
			format = format.replace(/ss/, '#12#');
			format = format.replace(/s/, '#13#');
			
			format = format.replace(/#1#/, yyyy);
			format = format.replace(/#2#/, yy);
			format = format.replace(/#3#/, months[o.locale][m-1]);
			format = format.replace(/#4#/, mm);
			format = format.replace(/#5#/, m);
			format = format.replace(/#6#/, dd);
			format = format.replace(/#7#/, d);
			format = format.replace(/#8#/, hh);
			format = format.replace(/#9#/, h);
			format = format.replace(/#10#/, mmi);
			format = format.replace(/#11#/, mi);
			format = format.replace(/#12#/, ss);
			format = format.replace(/#13#/, s);
			
			return format;
			
		}
		
		var MonthDiff = function(d1, d2){
			var monthDays = function(month,year){
				var _monthDays = [31,28,31,30,31,30,31,31,30,31,30,31];
				if( month == 2){
					return ( (year % 4 == 0 && year % 100 == 0) || year % 400 == 0 ) ? _monthDays[month-1]+1 : _monthDays[month-1];
				}else{
					return _monthDays[month-1];
				}
			};
			
			var t1 = 12 * d1.getFullYear() + d1.getMonth() + ( d1.getDate() / monthDays(d1.getMonth()+1, d1.getFullYear()) );
			var t2 = 12 * d2.getFullYear() + d2.getMonth() + ( d2.getDate() / monthDays(d2.getMonth()+1, d2.getFullYear()) );
			
			return (t2 -t1);
		}
		
		
		var FormatCurrency = function (val, st_dec, locale){
			
			if(st_dec == null) st_dec = 2;
			if(locale == null) locale = "si";
			
			var num = parseFloat(val);
			var positive = (num >= 0)? true : false;
			var t = Math.abs(num);
			var tt = Math.floor(t);
			var dec = t - tt;
			var out = "";
			var aa = tt;
			var b,i;
			i=0;
			
			b = Math.round(dec * Math.pow(10, st_dec));
			if (b == Math.pow(10, st_dec) ) {
				dec=0;
				aa++;
			}
   
			if (aa > 0){
				while (aa > 0){
					b = aa % 10;
					aa = Math.floor(aa / 10);
					if (i>0 && i % 3 == 0 ) out    = (locale=="si") ? "." + out : "," + out;
					out    = b + "" + out;
					i++;
				}
			}else{
				out = "0";
			}
			
			if(st_dec > 0){
				if (dec > 0){
					b = "" + Math.round(dec * Math.pow(10, st_dec));
					while(b.length < st_dec) b = "0"+b;
					out += (locale=="si") ? ","+b : "."+b;
				}else{
					b = "";
					while(b.length < st_dec) b += "0";
					out += (locale=="si") ? ","+b : "."+b;
				}
			}
			
			if (!positive) out = "-" + out;
			
			return out;
			
		};
		
		var isIE = function (){
			return /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent);
		}

		return this.each(function() {
			//console.log(this, $(this));
			
			$(this).html("");
			
			o.svgOffset = isIE()? 0 : 0.5;
			
			var paper = Raphael(this, o.width, o.height);
			paper.rect(0,0, o.width, o.height).attr({
				"stroke": o.bgColor,
				"fill": o.bgColor
			});
			
			DrawAxis(paper);
						
			if(o.dataSource.length > 0){
				// naredimo ajax request za podatke
				$.get(o.dataSource, function(data){
					if( data.length && data.substr(0,1) == '{'){
						
						var obj = $.parseJSON( data );
						if( obj && obj.status == 'OK') PlotGraf(paper, obj);
						
					}
				});
			}else if(o.data != null ){
			   //uporabimo o.data za vir podatkov in narišemo graf
			   PlotGraf(paper, o.data);
			  
			}
			
		});  
	};  
})(jQuery);  
