/**
 * Ce fichier concerne toutes les transformations concernant
 * les coordonnées galaxtiques 
 * @autor Ammari Fethi
 * @version 0.1 
 */

/**
 *La fonction Aitoffprojection prend en arguments les coordonnées x et y
 * de la carte pour calculer (λ) et (φ)
 *@param{absx}
 *@param{ordy}
 *@return Longitude (λ) Latitude (φ)
 */

	function Aitoffprojection(absx,ordy){

		var XMAX=987;
		var XMIN=5 ;
		var YMAX= 493 ;
		var YMIN=5;
		var x,y;
		var factor;
		var ux, uy , uz;
		x=absx;
		y=ordy;

 		var ym = YMAX-YMIN;
 		var rac = 2.0*Math.sqrt(2.0);
  		factor = (YMAX-YMIN)/(2.0*Math.sqrt(2.0));
 		var xm =-1*(x-((XMAX+XMIN)/2.0));
 		var ymn =-1*(y-((YMAX+YMIN)/2.0));
  		x= -1*(x-((XMAX+XMIN)/2.0))/factor ;
  		y= -1*(y-((YMAX+YMIN)/2.0))/factor ;
 		var s ;
		 var r = (Math.pow(x,2)+4*Math.pow(y,2))/8.0;
 		if (r>1){
 		 		return ([-1,-1]) ;
 		}
 		ux= eval(1-r);
 		
		s=Math.sqrt(1.0-(r/2.0));
 		
 		uy=x*s/2.0;
 		
 		uz=y*s;
 		
 		r=Math.sqrt(Math.pow(ux,2)+Math.pow(uy,2));
 		
 		if(r)
 		{
 		s=ux ;
 		
 		ux = (Math.pow(s,2)-Math.pow(uy,2))/r;
 		
 		uy = (2*s*uy)/r;
 		

 		}
 		
 		r=Math.pow(ux,2)+Math.pow(uy,2);
 		
 		var ra ,dec ;

 		ra=0;
 		if(r==0){
 		ra=999.0,dec=99.0;
 			if(uz==0){return ([ra,dec]);
			}
 			if(uz>0){ra=0;dec=90;return([ra,dec]);
			}
 		else{ra=0;dec=-90;return([ra,dec]);
     			}
		}

 		
 		dec =(180/Math.PI)*Math.atan(uz/Math.sqrt(r));
 		
 		ra  =(180/Math.PI)*Math.atan2(uy,ux);
 		

 		if (ra<0) ra+=360;
 		
		return ([ra,dec]) ;
 	}
/** 
 * matrice J2000 
 * Galactic coordinate transformations 
 */
	var gal_2000 = new Array(3);

 	gal_2000 [0] = [ -0.054875539726, -0.873437108010, -0.483834985808];
        gal_2000 [1] = [  0.494109453312, -0.444829589425,  0.746982251810];
	gal_2000 [2] = [ -0.867666135858, -0.198076386122,  0.455983795705];
			
	
/** 
 * function cosd qui calucle le cos de x en degre
 * @param {x}
 * @return le cosinus de x en degre
 */ 
	function cosd (x){
	
		return  Math.cos((x*Math.PI)/180);
	}
/**
 *function qui retourn le cosinus de x en radian
 *@param{x}
 *@return le cos de x en radian	
 */	
	function getCos(x){
   		
		return Math.cos(x)
	}

/**
 *function return le sinus de x en radian
 *@param{x}
 *@return le sinus de x en radian		
 */
      
	function getSin(x){

	      	return Math.sin(x)
     	}

/**
 * function sind  calcule le sinus de x en degre
 * @param {x}
 * @return le sinus de x en degre	
 */

	function sind(x){
		
		return Math.sin((x*Math.PI)/180);
	}
/**
 * function tand  calcule la tangent de x en degre
 * @param {x}
 * @return la tan de x en degre	
 */

        function tand(x){
			
		return Math.tan((x*Math.PI)/180);
	}

/**
 *function qui calcule la tangent de x en radian
 *@param{x}
 *@return la tangente de x en radian			
 */
	function getTan(x) {

   		return Math.tan(x)
	}
/**
 *function qui calcule l'arctangent de x en radian
 *@param{x}
 *@return l'arctangente de x en radian			
 */
	function getAtan(x) {

	   	return Math.atan(x)
	}
/**
 * function  qui calucle l'arctangent de x en degre
 * @param {x}
 * @return l'arctangente de x en degre	
 */
	
	function atand(x){
	 
		return 180/Math.PI*Math.atan(x);
	}

/**
 *function qui calcule le l'arctangent de y/x en radian
 *@param{x}
 *@param{y}
 *@return l'arctangente  de y/x en radian			
 */
	function getAtan2(y,x) {
   		
		return Math.atan2(y,x)
	}

/**
 *function qui calcule le l'arctangent de y/x en degre
 *@param{x}
 *@param{y}
 *@return l'arctangente  de y/x en degre			
 */	
 
	
	function atan2d(x,y){

		return 180/Math.PI*Math.atan2(x,y);
	
	}
/**
 *function Transforamtion des coordonnées polaires en vecteur d'unité
 *@param{o}
 *@return les coordonées caratésiennes (X,Y,Z) 	
 */
	function tr_ou(o){

	 var l = o[0];
	 var b = o[1];
	 var cosdec= cosd(b);
	 var X = cosdec * cosd(l);
	 var Y = cosdec * sind(l);
	 var Z = sind(b);

		return([X,Y,Z]);
	}

/**
 *fonction qui calcule le vecteur (x,y,z)
 *par rapport a la matrice de rotations  J2000 et vecteur unités (X,Y,Z)
 *@param{XYZ} vecteur d'unité (X,Y,Z)
 *@param{R} matrice de rotation	
 */
	function tr_uu1(XYZ , R ){

	 var val;
 	 var u_stack  = new Array();
	 for (var i =0 ; i<3 ;i++){
		for(var j=0,val=0;j<3;j++){
			val +=R[j][i]*XYZ[j]; 
	        }
	 u_stack[i]= val ;
         }
		return u_stack;
	}
        
/**
 *function qui calcule ra et dec 
 *a partir du vecteur unitaire (x,y,z) et ((λ),(φ))
 *@param{u} tableau [x,y,z]
 *@param{o} tableau [Longitude (λ), Latitude (φ)]
 *@return ascension droite et la déclinaison (ra,dec)	
 */
        function tr_uo(u ,o){

  	 var r2 ;
	 var ra;
	 var dec;
	 var l = o[0];
	 var b = o[1];
         var x = u[0];
	 var y = u[1];     
	 var z = u[2];		
	 r2 = Math.pow(x,2) + Math.pow(y,2) ;
	 if(r2 ==0 ){
	  ra =999.0; dec = 99.0;
            if(z==0.0) { 
		return ([ra,dec]);
	    }
            if (z>0.0){
		dec =90.0 ;ra =0 ;
		
	    }else{
		dec = -90.0 ; ra =0;

		}
            	return ([ra,dec]);
	}
        dec = atand(z/Math.sqrt(r2));
   	ra  = atan2d(y,x);
   	if (ra < 0){ 
		ra +=360;
  	}
		return ([ra,dec]);
	}
/**
 *function qui transforme (ra,dec) 
 * ra  --> (h:m:s)  
 * dec --> (°:“:´)
 *@param{o} [ra,dec]
 *@return tableau  	
 */

	function transformation(o){

	 var ra  = o[0];
	 var dec = o[1];
	 if(  dec >0 ){
           	
		var dech = parseInt(dec);
        	var decm = (dec-dech)*60 ;
        	var decmi = parseInt(decm);
        	var decs = (decm-decmi)*60
		var decsi = parseInt(decs);
		if(dech  <10){ 
			dech ="0"+dech;
		}
		if(decmi <10){ 
			decmi ="0"+decmi;
		}
		if(decsi <10){ 
			decsi="0"+decsi;
		}
   		var dect = "+"+dech+"&deg;"+decmi+"&#146;"+decsi+"&#148;";
	 }else{
	 	dec =Math.abs(dec);
		var dech = Math.abs(parseInt(dec));
	        var decm = (dec-dech)*60 ;
        	var decmi = parseInt(decm);
        	var decs = (decm-decmi)*60;
		var decsi = parseInt(decs);

		if( Math.abs(dech)  <10){ 
			dech ="0"+Math.abs(dech);
		}
		if( Math.abs(decmi) <10){ 
			decmi ="0"+Math.abs(decmi);
		}
		if( Math.abs(decsi) <10){ 
			decsi="0"+Math.abs(decsi);
		}
   		var dect = "-"+dech+"&deg;"+decmi+"&#146;"+decsi+"&#148;";
         	}

	 var rah = ra/15;
	 var rah1 =parseInt(rah);
         var ram = (rah-rah1)*60 ;
         var rami = parseInt(ram);
         var ras = (ram-rami)*60;
	 var rasi = parseInt(ras);
	 if (rah1 < 10 ){ 
		rah1 = "0" +rah1 ;
	 }
         if(rami  < 10 ){ 
		rami = "0" +rami;
	 }
         if(rasi  < 10 ){
		 rasi = "0" +rasi;
	 }
   	 var rat = rah1+"h"+rami+"m"+rasi+"s";
	
		return([rat,dect]);
         }
/**
 *fonction qui calcule ra ,dec,(λ),(φ)
 *@param o [(λ),(φ)]
 *@return [(trans1),(trans2),(ra),(dec),(λ),(φ)]
 */


	function test(o){
    	
	 var radec = new Array();
         var trans = new Array();
	 if (o[0]==-1 && o[1]==-1){
	        o[0]="";
		o[1]="";
        	radec[0]="";
        	radec[1]="";
		trans[0]="";
		trans[1]="";
	 }else{

	 	var XYZ = new Array();

	dojo.profile.start("tr_ou");
	XYZ = tr_ou(o);
	dojo.profile.end("tr_ou");

        	var xyz = new Array();
	dojo.profile.start("tr_uu1");
       		xyz = tr_uu1(XYZ,gal_2000);
	dojo.profile.end("tr_uu1");

	      dojo.profile.start("tr_uo");
        	radec = tr_uo(xyz,o);
		dojo.profile.end("tr_uo");
		dojo.profile.start("transformation1");
		trans =  transformation(radec);
		dojo.profile.end("transformation1");
	
}


	return  ([trans[0],trans[1],radec[0],radec[1],parseInt(o[0]*100)/100,parseInt(o[1]*100)/100]) ;
	}

