// debugging

function debug(msg) {
    str = document.getElementById('debug').innerHTML;
    document.getElementById('debug').innerHTML = msg +  "<br />" + str;
}

function in_array(item,arr) {
  for(iii=0; iii<arr.length; iii++) {
    if (item == arr[iii]) { return true; }
  }
  return false;
}


// is existing? 

jQuery.fn.exists = function(){return jQuery(this).length>0;}


// array

function mySort(a, b) {
    return a[3] > b[3] ? 1 :
    a[3] < b[3] ? -1 :
    0;
}

// color

function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B)}
function toHex(h) {
  var char = "0123456789ABCDEF";
  return String(char.charAt(Math.floor(h / 16))) + String(char.charAt(h - (Math.floor(h / 16) * 16)));
} 


function hsvToRgb(h,s,v) {
    var s = s / 100,
        v = v / 100;
    var hi = Math.floor((h/60) % 6);
    var f = (h / 60) - hi;
    var p = v * (1 - s);
    var q = v * (1 - f * s);
    var t = v * (1 - (1 - f) * s);
    var rgb = [];
    switch (hi) {
        case 0: rgb = [v,t,p];break;
        case 1: rgb = [q,v,p];break;
        case 2: rgb = [p,v,t];break;
        case 3: rgb = [p,q,v];break;
        case 4: rgb = [t,p,v];break;
        case 5: rgb = [v,p,q];break;
    }
    var r = Math.min(255, Math.round(rgb[0]*256)),
        g = Math.min(255, Math.round(rgb[1]*256)),
        b = Math.min(255, Math.round(rgb[2]*256));
    return [r,g,b];

}	


		
// canvas

getContext = function(id) {
    var cv = document.getElementById(id);
    if(cv && cv.getContext) {
        return cv.getContext('2d');
    } else {
        return false;
    }
}

Circle = function(ctx,color,x,y,r) {
    ctx.fillStyle = color;
    ctx.beginPath();
    ctx.arc(x,y,r,0,Math.PI*2,true);
    ctx.closePath();
    ctx.fill();	
}


Rectangle = function(ctx,x,y,w,h,r) {
	ctx.beginPath();
	ctx.moveTo(x + r, y);
	ctx.lineTo(x + w - r, y);
	ctx.quadraticCurveTo(x + w, y, x + w, y + r);
	ctx.lineTo(x + w, y + h - r);
	ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
	ctx.lineTo(x + r, y + h);
	ctx.quadraticCurveTo(x, y + h, x, y + h - r);
	ctx.lineTo(x, y + r);
	ctx.quadraticCurveTo(x, y, x + r, y);
	ctx.closePath();
	ctx.fill();
}

// pseudo 3D

transform3DPointsTo2DPoints = function(point, axisRotations){

    var sx = Math.sin(PC_axis[0]);
	var cx = Math.cos(PC_axis[0]);
	var sy = Math.sin(PC_axis[1]);
	var cy = Math.cos(PC_axis[1]);
	var sz = Math.sin(PC_axis[2]);
	var cz = Math.cos(PC_axis[2]);
	var x,y,z, xy,xz, yx,yz, zx,zy, scaleFactor;
	
	x = point[0];
	y = point[1];
	z = point[2];

	// rotation around x
	xy = cx*y - sx*z;
	xz = sx*y + cx*z;
	// rotation around y
	yz = cy*xz - sy*x;
	yx = sy*xz + cy*x;
	// rotation around z
	zx = cz*yx - sz*xy;
	zy = sz*yx + cz*xy;
	
	scaleFactor = PS_focalLength/(PS_focalLength + yz);
	x = zx*scaleFactor + PS_offsetX;
	y = zy*scaleFactor + PS_offsetY;
	z = yz;
	
    return new Array(x,y,-z,scaleFactor,point[3],point[4]);
}
