//algorithmic functions
function toRadians(angle) {
  var pi = Math.PI;
  var de_ra = (angle*(pi/180));
  return de_ra;
}
function tige(petals,center_x, center_y,aradius){
	//alert(arguments[0].length);
	//alert('tige '+petals);
	var leaves=new Object;
	leaves.x=[];
	leaves.y=[];
	for(var i=0;i<petals.length;i++){
		if(i==0){
			leaves.x.push(parseFloat(center_x)+parseFloat(aradius/2));
			leaves.y.push(parseFloat(center_y)+parseFloat(aradius/2));
		}else if(i==1){
			leaves.x.push(parseFloat(center_x)+parseFloat(aradius/2));
			leaves.y.push(parseFloat(center_y)-parseFloat(aradius/2));
}
	}
	return leaves;
}

function anemone(petals,center_x, center_y,aradius){
	//alert('anemone '+petals);
    	var leaves=new Object;
		leaves.x=[];
		leaves.y=[];
    	max=petals.length;
    	//leaves=new int[2][max];
		//!to check
    	var sum=0;
    	for(var i=0;i<petals.length;i++){
    		sum+=10;
    	}
    	var degree=sum/360.0;
        //double degree=360.0/sum;
//        debugln("Degree = "+degree);
    	//double jung=sum/2;
    	var dx=aradius;
        //int dx=petals[0];
    	var dy=0;
    	var oldangle=0.0;
    	for(var i=0;i<max;i++){
    		var angle=oldangle+10.0/degree;
    //    	double angle=oldangle+degree;
 		var x=Math.cos(toRadians(angle))*aradius;
  		var y=Math.sin(toRadians(angle))*aradius;
//    		double x=Math.cos(Math.toRadians(angle))*petals[i];
//    		double y=Math.sin(Math.toRadians(angle))*petals[i];
  //  		int adx = cx + dx; // absolute $dx
		var adx = parseFloat(center_x) + dx; // absolute $dx
		var ady = parseFloat(center_y) + dy; // absolute $dy
    		leaves.x.push(adx);
    		leaves.y.push(ady);
    		//debugln("Anemone from method: x: "+x+" y: "+y);
    		//debugln("Anemone from method: adx: "+adx+" ady: "+ady);
            dx=x;
            dy=y;

            oldangle=angle;
    	}
		//alert(leaves.x+"\n\n"+leaves.y);
    	return leaves;
    }

//profiling functions

function getTheTime(){
    var curDate=new Date();
	var theTime=curDate.getMinutes()+" / "+curDate.getSeconds()+" / "+curDate.getMilliseconds();
	return theTime;
}
function getMillis(){
    var curDate=new Date();
	var theTime=(curDate.getSeconds()*1000)+curDate.getMilliseconds();
	return theTime;
}

// debugging functions
/**
* Function : dump()
* Arguments: The data - array,hash(associative array),object
*    The level - OPTIONAL
* Returns  : The textual representation of the array.
* This function was inspired by the print_r function of PHP.
* This will accept some data as the argument and return a
* text that will be a more readable version of the
* array/hash/object that is given.
*/
function dump(arr,level) {
var dumped_text = "";
if(!level) level = 0;

//The padding given at the beginning of the line.
var level_padding = "";
for(var j=0;j<level+1;j++) level_padding += "    ";

if(typeof(arr) == 'object') { //Array/Hashes/Objects
 for(var item in arr) {
  var value = arr[item];
 
  if(typeof(value) == 'object') { //If it is an array,
   dumped_text += level_padding + "'" + item + "' ...\n";
   dumped_text += dump(value,level+1);
  } else {
   dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
  }
 }
} else { //Stings/Chars/Numbers etc.
 dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
}
return dumped_text;
} 

function tsr_isArray(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}
function inArray(val,ar){
	var_out=false;
	for(var i=0;i<ar.length;i++){
		if(val==ar[i]){
			var_out=ar[i];
			break;
}
}
	return var_out;
}
function debug_log(str_in){

	if(DEBUG==1){
		alert(str_in);
	}else if(DEBUG==2){
		//
}
}
function gan_compare(a,b){

    thediff=0;
    if(a>b){
	thediff=a-b;
    }else{
	thediff=b-a;
}
    return thediff;
}
