var jaxcorePurple = [102,74,157];	// #664A9D

var logoSettings = {
	sizeScale : 0.75,
	scale : 1,
	angle : 0,
	width : 461,
	height : 347,
	fgColor : '',
	bgColor : '',
	textColor : '',
	autoSize : true,
	autoSizeW : false,
	logoXAlign : 'left',
	bgGradient : true,
	fixedSize : false,
	offsetX : 0,
	offsetY : 0,
	textOffsetX : 0,
	textOffsetY : 0,
	showFont : true,
	text : 'j a x c o r e',
	font : 'VarelaRoundRegular',
	fontStyle : '',
	fontWeight : '',
	fontSize : 260,
	logoThickness : 25,
	textStrokeSize : 1,
	logoStrokeSize : 7,
	fillText : true,
	textBorder : 2,
	fillLogo : true,
	softEdge : false,
	mainColor : [0,0,0],
	bgRGB : jaxcorePurple,
	fgRGB : [255,255,255],
	glowSize : 30,
	glowSteps : 5,
	glowAlpha : 1
};


function drawJaxcore(ctx,cWidth,cHeight,logoSettings) {
	var w = logoSettings.width;
	var h = logoSettings.height;
	/*var x,y;
	y = -h/2;
	if (logoSettings.logoXAlign == 'left') {
		x = -w/2;
	}
	else {
		
	}
	x = 0;
	*/
	ctx.save();
	
	var s = cHeight/logoSettings.height;
	
	var sH = cHeight/logoSettings.height;
	var sW = cWidth/logoSettings.width;
	
	var logoScale;
	if (logoSettings.autoSize) {
		if (cHeight>cWidth) logoScale = sW*logoSettings.scale*logoSettings.sizeScale;
		else logoScale = sH*logoSettings.scale*logoSettings.sizeScale;
	}
	else logoScale = logoSettings.scale*logoSettings.sizeScale;
	
	if (logoSettings.autoSizeW) {
		logoScale = sW*logoSettings.scale*logoSettings.sizeScale;
	}
	
	var logoY = (logoSettings.height/2)*s*logoSettings.scale;
	
	var logoX,logoY;
	if (logoSettings.logoXAlign == 'left') {
		logoX = (logoSettings.width/2)*s*logoSettings.scale;
	}
	else {
		logoX = (logoSettings.width/2)*sW*logoSettings.scale;
	}
	
	var textX = logoSettings.width*s*logoSettings.scale*1.13;
	var textY = cHeight/2;
	
	var ft = (logoSettings.fontStyle!=''?logoSettings.fontStyle+' ':'')+(logoSettings.fontWeight!=''?logoSettings.fontWeight+' ':'')+logoSettings.fontSize+'px '+logoSettings.font;
	ft = ft.replace(/\s+/,' ');
	ctx.font = ft;
	
	var fgRGB = logoSettings.fgRGB;
	var rgbEnd = logoSettings.bgRGB;
	var mainColor = logoSettings.mainColor
	
	var rgbStart = mainColor;
	var rgbTextStart = logoSettings.mainColor;
	
	var canvasTextAlign = true;
	ctx.textAlign = 'left';
	ctx.textBaseline = 'middle';
	
	var half = [
			mainColor[0]+Math.floor(Math.abs((fgRGB[0]-mainColor[0])/2)),
			mainColor[1]+Math.floor(Math.abs((fgRGB[1]-mainColor[1])/2)),
			mainColor[2]+Math.floor(Math.abs((fgRGB[2]-mainColor[2])/2))
		];
	var q1 = [
			mainColor[0]+Math.floor(Math.abs((fgRGB[0]-mainColor[0])/4)),
			mainColor[1]+Math.floor(Math.abs((fgRGB[1]-mainColor[1])/4)),
			mainColor[2]+Math.floor(Math.abs((fgRGB[2]-mainColor[2])/4))
		];
	var q3 = [
			mainColor[0]+Math.floor(Math.abs((fgRGB[0]-mainColor[0])*3/4)),
			mainColor[1]+Math.floor(Math.abs((fgRGB[1]-mainColor[1])*3/4)),
			mainColor[2]+Math.floor(Math.abs((fgRGB[2]-mainColor[2])*3/4))
		];
		
	if (logoSettings.glowSize) {
		var glowSize = logoSettings.glowSize;
		var r,g,b;
		var steps = logoSettings.glowSteps; //Math.floor(glowSize/5);
		for (var i=0;i<steps;i++) {
			r = Math.round(rgbEnd[0]+i*(rgbStart[0]-rgbEnd[0])/steps);
			g = Math.round(rgbEnd[1]+i*(rgbStart[1]-rgbEnd[1])/steps);
			b = Math.round(rgbEnd[2]+i*(rgbStart[2]-rgbEnd[2])/steps);
			
			r2 = Math.round(rgbEnd[0]+i*(rgbTextStart[0]-rgbEnd[0])/steps);
			g2 = Math.round(rgbEnd[1]+i*(rgbTextStart[1]-rgbEnd[1])/steps);
			b2 = Math.round(rgbEnd[2]+i*(rgbTextStart[2]-rgbEnd[2])/steps);

			var stroke = 'rgb('+r+','+g+','+b+')';
			
			logoSettings.glowAlpha = 0.1;
			if (logoSettings.glowAlpha<1) {
				var fill = 'rgba('+r+','+g+','+b+','+logoSettings.glowAlpha+')';
			}
			else {
				var fill = 'rgb('+r+','+g+','+b+')';
			}
			
			drawLogo(ctx,logoX,logoY,w,h,logoSettings.angle,logoScale,logoSettings.logoThickness,null,logoSettings.logoStrokeSize + 7 + glowSize-i*(glowSize)/steps,stroke,fill);
			
			var buffer = 0;
			if (logoSettings.showFont) drawLogoText(textX,textY,logoScale,logoSettings.textStrokeSize + buffer + glowSize-i*(glowSize)/steps,stroke,fill);
		}
	}
	
	if (logoSettings.softEdge) {
		drawLogo(ctx,logoX,logoY,w,h,logoSettings.angle,logoScale,logoSettings.logoThickness,null,logoSettings.logoStrokeSize+7,getColor(q1));
		drawLogo(ctx,logoX,logoY,w,h,logoSettings.angle,logoScale,logoSettings.logoThickness,null,logoSettings.logoStrokeSize+5,getColor(half));
		drawLogo(ctx,logoX,logoY,w,h,logoSettings.angle,logoScale,logoSettings.logoThickness,null,logoSettings.logoStrokeSize+3,getColor(q3));
	}
	
	if (logoSettings.fillLogo) {
		drawLogo(ctx,logoX,logoY,w,h,logoSettings.angle,logoScale,logoSettings.logoThickness,null,logoSettings.logoStrokeSize,getColor(fgRGB),getColor(fgRGB));
	}
	else {
		drawLogo(ctx,logoX,logoY,w,h,logoSettings.angle,logoScale,logoSettings.logoThickness,null,logoSettings.logoStrokeSize,getColor(fgRGB));
	}
	
	if (logoSettings.showFont) {
		if (glowSize) {
			
			var gx1 = logoSettings.textBorder/2;
			var gx2 = logoSettings.textBorder/3;
			var gx3 = logoSettings.textBorder/6;
			drawLogoText(textX,textY,logoScale,logoSettings.textStrokeSize+gx1,getColor(q1));
			drawLogoText(textX,textY,logoScale,logoSettings.textStrokeSize+gx2,getColor(half));
			drawLogoText(textX,textY,logoScale,logoSettings.textStrokeSize+gx3,getColor(q3));
		}
		
		if (logoSettings.gradientFill) {
			drawLogoText(textX,textY,logoScale,null,null,null,true);
		}
		else if (logoSettings.fillText) {
			drawLogoText(textX,textY,logoScale,null,null,getColor(fgRGB));
		}
		else drawLogoText(textX,textY,logoScale,null,getColor(fgRGB));
	}

	ctx.restore();
}

function drawLogo(ctx,x,y,w,h,angle,scale,logoThickness,fillColor,lineWidth,strokeColor,fillColor) {
	ctx.save();
	ctx.translate(x,y);
	ctx.scale(scale,scale);
	ctx.rotate(angle);
	
	ctx.beginPath();
	ctx.lineCap = 'round';
	
	var t = Math.atan((h-160)/(w-160));
	var u = Math.PI/2-t;
	var ux = Math.sin(u)*58;
	var uy = Math.cos(u)*58;
	
	var radius = 58;
	var radiusOuter = radius+logoThickness/2;
	var radiusInner = radius-logoThickness/2;
	
	var tlX = -w/2+80;
	var tlY = -h/2+80;
	var brX = w/2-80;
	var brY = h/2-80;
	var blX = -w/2+80;
	var blY = h/2-80;
	var trX = w/2-80;
	var trY = -h/2+80;
	
	var r = 58+logoThickness/2;
	var a = Math.asin((logoThickness/2)/r);

	var ry = Math.sin(a)*r;
	var rx = Math.cos(a)*r;

	var dY = h/2-80-Math.sin(t+a)*r;
	var dX = Math.tan(u)*(dY);
	//jax.log.print('dX='+dX+' dY='+dY);
	
	var vX = w/2-80+Math.cos(t+Math.PI+a)*r-dX;
	var vY = Math.tan(t)*(vX);
	//jax.log.print(vX+' '+vY);
	
	var sRadius = 40/2+logoThickness/2;
	
	ctx.beginPath();
	ctx.lineCap = 'butt';
	ctx.lineJoint = 'miter';
	ctx.arc(tlX,tlY,radiusOuter,0,t-Math.PI*2+a,true); //tl
	ctx.lineTo(tlX+Math.cos(t+a)*r+dX,0);
	ctx.lineTo(tlX+Math.cos(t+a)*r,blY-Math.sin(t+a)*r);
	ctx.arc(blX,blY,radiusOuter,-t-a,-t-Math.PI*2+a,true); // bl
	ctx.lineTo(0,vY);
	ctx.lineTo(brX+Math.cos(t+Math.PI-a)*r,brY-Math.sin(t-a)*r);
	
	ctx.arc(brX,brY,radiusOuter,t-a-Math.PI,t+Math.PI+a,true); //br
	
	ctx.lineTo(brX+Math.cos(t+Math.PI+a)*r-dX,0);
	ctx.lineTo(brX+Math.cos(t+Math.PI+a)*r,tlY+Math.sin(t+a)*r);
	ctx.arc(trX,trY,radiusOuter,Math.PI-t-a,Math.PI-t+Math.PI*2+a,true);
	ctx.lineTo(0,-vY);
	ctx.lineTo(tlX+Math.cos(t-a)*r,tlY+Math.sin(t-a)*r);
	
	ctx.arc(tlX,tlY,radiusOuter,t-a,0,true); //close
	
	ctx.moveTo(tlX+radiusInner,tlY);
	ctx.arc(tlX,tlY,radiusInner,0,Math.PI*2,false);
	ctx.moveTo(brX+radiusInner,brY);
	ctx.arc(brX,brY,radiusInner,0,Math.PI*2,false);
	ctx.moveTo(blX+radiusInner,blY);
	ctx.arc(blX,blY,radiusInner,0,Math.PI*2,false);
	ctx.moveTo(trX+radiusInner,trY);
	ctx.arc(trX,trY,radiusInner,0,Math.PI*2,false);
	
	ctx.moveTo(sRadius,-h/2+logoThickness+(40-logoThickness));
	ctx.arc(0,-h/2+logoThickness+(40-logoThickness),40/2+logoThickness/2,0,Math.PI*2,false);
	ctx.moveTo(sRadius,+h/2-logoThickness-(40-logoThickness));
	ctx.arc(0,+h/2-logoThickness-(40-logoThickness),40/2+logoThickness/2,0,Math.PI*2,false);
	
	if (fillColor) {
		ctx.fillStyle = fillColor;
		ctx.fill();
	}
	
	ctx.lineWidth = lineWidth;
	ctx.strokeStyle = strokeColor;
	ctx.stroke();
	
	ctx.closePath();
	
	ctx.restore();
}

function drawLogoText(x,y,scale,lineWidth,strokeColor,fillColor, gradient) {
	ctx.save();
	ctx.translate(x,y);
	ctx.scale(scale,scale);
	if (gradient) {
		// Create gradients
		var lingrad = ctx.createLinearGradient(0,0,0,150);
		//lingrad.addColorStop(0, 'rgb(128,128,128)');
		//lingrad.addColorStop(0.18, 'rgb(88,88,88)');
		//lingrad.addColorStop(0.22, '#BEC5CE');
		//lingrad.addColorStop(0.25, 'rgb(215,215,215)');
		lingrad.addColorStop(0, 'rgb(200,200,200)');
		//lingrad.addColorStop(0.35, 'rgb(215,215,215)');
		lingrad.addColorStop(0.05, 'rgb(118,118,128)');
		lingrad.addColorStop(0.3, 'rgb(138,138,158)');
		ctx.fillStyle = lingrad;
		ctx.fillText(logoSettings.text,0,0);
	}
	else if (fillColor) {
		ctx.fillStyle = fillColor;
		ctx.fillText(logoSettings.text,0,0);
	}
	
	if (lineWidth) {
		ctx.lineWidth = lineWidth;
		ctx.strokeStyle = strokeColor;
		ctx.strokeText(logoSettings.text,0,0);
	}
	ctx.restore();
}

function getColor(color) {
	return 'rgb('+color[0]+','+color[1]+','+color[2]+')';
}
