var timeout_generation;var req_en_cour_gene=null;var req_queue_gene=new Array();function add_request_gene(request)
{req_queue_gene.push(request);process_request_gene();}
function process_request_gene()
{if(req_queue_gene.length==0||req_en_cour_gene!=null)return false;req_en_cour_gene=req_queue_gene.shift();if(window.XMLHttpRequest)
xhr_gene=new XMLHttpRequest();else if(window.ActiveXObject)
xhr_gene=new ActiveXObject("Microsoft.XMLHTTP");else
return(false);xhr_gene.onreadystatechange=function()
{if(xhr_gene.readyState==4)
{if(xhr_gene.status==200)
{if(req_en_cour_gene[0]=="profil")
{received_profil(xhr_gene.responseText);}
else if(req_en_cour_gene[0]=="genere")
{received_genere(xhr_gene.responseText);}
else
{}
req_en_cour_gene=null;process_request_gene();}
else
{}}}
if(visiteur==true)xhr_gene.open("POST","../ajax_generation.php",true);else xhr_gene.open("POST","ajax_generation.php",true);var params="rand="+Math.random()+"&";if(req_en_cour_gene[0]=="profil")params="profil=1";else if(req_en_cour_gene[0]=="genere")params="genere="+req_en_cour_gene[1]+"&behaviour="+req_en_cour_gene[2]+"&total_time="+req_en_cour_gene[3]+"&distance_parcouru="+req_en_cour_gene[4]+"&temps_tours="+req_en_cour_gene[5]+"&crash="+req_en_cour_gene[6]+"&v="+req_en_cour_gene[7]+"&a="+req_en_cour_gene[8]+"&f="+req_en_cour_gene[9]+"&type="+req_en_cour_gene[10];else return;xhr_gene.setRequestHeader("Content-type","application/x-www-form-urlencoded");xhr_gene.setRequestHeader("Content-length",params.length);xhr_gene.setRequestHeader("Connection","close");xhr_gene.send(params);}
charger_profil();function charger_profil()
{add_request_gene(new Array("profil"));}
var voiture_gene,conditions_gene,circuit_gene,course_gene;function received_profil(response)
{profil_str=response.split("%");if(profil_str[0]!="OK_COURSE"&&profil_str[0]!="OK_ESSAI")
{return;}
course_gene=new Object();course_gene.id_cd=profil_str[1];conditions_gene_str=profil_str[5].split("#");voiture_gene=new Object();voiture_gene.vitesse_base=parseFloat(conditions_gene_str[0]);voiture_gene.acceleration_base=parseFloat(conditions_gene_str[1]);voiture_gene.freinage_base=parseFloat(conditions_gene_str[2]);voiture_gene.comportement=parseFloat(conditions_gene_str[3]);voiture_gene.vitesse=voiture_gene.vitesse_base;voiture_gene.acceleration=voiture_gene.acceleration_base;voiture_gene.freinage=voiture_gene.freinage_base;voiture_gene.vitesse=voiture_gene.vitesse_base;voiture_gene.acceleration=voiture_gene.acceleration_base;voiture_gene.freinage=voiture_gene.freinage_base;voiture_gene.autonomie=parseFloat(conditions_gene_str[10]);voiture_gene.poids=parseFloat(conditions_gene_str[11]);conditions_gene=new Object();conditions_gene.arrets=conditions_gene_str[4];conditions_gene.tps_reaction=parseFloat(conditions_gene_str[5]);conditions_gene.risque=parseFloat(conditions_gene_str[6]);conditions_gene.retard=parseFloat(conditions_gene_str[7]);conditions_gene.experience=parseFloat(conditions_gene_str[8]);conditions_gene.tps_arrets=parseFloat(conditions_gene_str[9]);conditions_gene.type=profil_str[0];circuit_gene=new Object();circuit_gene.nb_tours=parseInt(profil_str[2]);circuit_gene.longueur_circuit_gene_metre=parseInt(profil_str[3]);circuit_gene.data=profil_str[4].split("#");circuit_gene.speed_cp=new Array();for(i=0;i<(circuit_gene.data).length-1;i++)
{speed_cp_buf=circuit_gene.data[i].split(";");circuit_gene.speed_cp[i]=new Array(parseFloat(speed_cp_buf[1]),parseFloat(speed_cp_buf[0]));}
circuit_gene.main_speed_cp=chargercircuit_gene(circuit_gene,false);circuit_gene.main_speed_cp_arret=chargercircuit_gene(circuit_gene,true);perform_behaviour5();add_request_gene(new Array("genere",course_gene.id_cd,course_gene.behaviour,course_gene.total_time,course_gene.distance_parcouru,course_gene.temps_tours,course_gene.crash,voiture_gene.vitesse,voiture_gene.acceleration,voiture_gene.freinage,profil_str[0]));}
function received_genere(response)
{timeout_generation=setTimeout('charger_profil()',100);}
function perform_behaviour5()
{debug=false;debug_str="";var behaviour=new Array();behaviour.push("0:0:0");previous_speed=0;avancement=0;temps_ecoule=conditions_gene.retard;behaviour.push("0:0:"+temps_ecoule);cumule_dist=0;temps_tours_cumule=0;temps_to_finish=0;temps_tours=new Array();nb_laps=circuit_gene.nb_tours;prev_lap=0;if(conditions_gene.arrets=="")
{arrets_tab=new Array(0,circuit_gene.nb_tours+1);}
else
{arrets_tab=conditions_gene.arrets.split(";");arrets_tab.unshift(0);arrets_tab.push(circuit_gene.nb_tours+1);}
next_arret_array_id=1;speed_cp_to_use=circuit_gene.main_speed_cp;sizeof_main_speed_cp=circuit_gene.main_speed_cp.length;plannifier_arret=0;if(arrets_tab[next_arret_array_id]==1)
{plannifier_arret=1;next_arret_array_id=2;}
crash=0;gonna_crash=-1;distance_parcouru=circuit_gene.longueur_circuit_gene_metre*nb_laps;crash_rate=Math.floor(100*Math.pow(conditions_gene.risque,2.65));if(Math.random()*100<crash_rate)
{gonna_crash=rand(1,(nb_laps-1)*circuit_gene.longueur_circuit_gene_metre);distance_parcouru=gonna_crash;crash=1;}
if(debug)debug_str+="Will crash : "+gonna_crash+" m : "+crash_rate+" %";for(var ps=1;ps<arrets_tab.length;ps++)
{if(((arrets_tab[ps]-arrets_tab[ps-1])-1)*circuit_gene.longueur_circuit_gene_metre>voiture_gene.autonomie*1000)
{gonna_crash=(arrets_tab[ps-1]*circuit_gene.longueur_circuit_gene_metre)+(voiture_gene.autonomie*1000)+Math.random()*1000;if(gonna_crash<distance_parcouru)
{distance_parcouru=gonna_crash;crash=2;}}}
temps_last_lap=0;place_to_write=-1;cp_id=0;lap=0;stop=false;decalage_temps=0;if(debug)
{debug_str+="<BR>PREVIOUS CP : "+cp_id+"_"+sizeof_main_speed_cp;debug_str+="<BR>";}
while(avancement<=nb_laps*circuit_gene.longueur_circuit_gene_metre&&stop==false)
{previous_cp=(cp_id-1+sizeof_main_speed_cp)%sizeof_main_speed_cp;if(cp_id==0&&lap==0)distance=speed_cp_to_use[cp_id][1];else if(cp_id==0&&lap>0)distance=speed_cp_to_use[cp_id][1]-speed_cp_to_use[previous_cp][1]+circuit_gene.longueur_circuit_gene_metre;else distance=speed_cp_to_use[cp_id][1]-speed_cp_to_use[previous_cp][1];if(plannifier_arret==0)
{speed_cp_to_use=circuit_gene.main_speed_cp;sizeof_main_speed_cp=circuit_gene.main_speed_cp.length;tour_arret=0;plannifier_arret=-1;}
else if(plannifier_arret==1)
{speed_cp_to_use=circuit_gene.main_speed_cp_arret;sizeof_main_speed_cp=circuit_gene.main_speed_cp_arret.length;tour_arret=1;plannifier_arret=-1;}
vitesse_limit_from=previous_speed;vitesse_limit_to=speed_cp_to_use[cp_id][0];if(gonna_crash!=-1&&avancement>gonna_crash)
{cp_buf=behaviour[behaviour.length-1].split(":");while(cp_buf[0]>=gonna_crash)
{behaviour.pop();cp_buf=behaviour[(behaviour.length-1)-1].split(":");}
stats_arret=stats_for_change_speed(voiture_gene,cp_buf[1],0);temps_before_crash=(gonna_crash-cp_buf[0])/(cp_buf[1]/3.6);behaviour.push(gonna_crash+":"+cp_buf[1]+":"+round(parseFloat(cp_buf[2])+parseFloat(temps_before_crash),1));behaviour.push(Math.floor(parseFloat(gonna_crash)+parseFloat(stats_arret[1]))+":0:"+round(parseFloat(cp_buf[2])+parseFloat(temps_before_crash)+parseFloat(stats_arret[0]),1));break;}
var ajout_potentiel=(vitesse_limit_to*conditions_gene.risque)/10;vitesse_limit_to+=rand(ajout_potentiel/2,ajout_potentiel);vitesse_limit_to-=rand(0,Math.floor(vitesse_limit_to*((1-voiture_gene.comportement)*3)))/10;var coef_essence=(arrets_tab[next_arret_array_id]-lap)*(circuit_gene.longueur_circuit_gene_metre/1000);voiture_gene.vitesse=voiture_gene.vitesse_base-(voiture_gene.vitesse_base*coef_essence/3500);voiture_gene.acceleration=voiture_gene.acceleration_base-(voiture_gene.acceleration_base*coef_essence/1300);vitesse_limit_to=vitesse_limit_to-(voiture_gene.vitesse_base*coef_essence)/4000;if(vitesse_limit_to<0)vitesse_limit_to=0;distance+=cumule_dist;stats_buf=stats_for_change_speed(voiture_gene,vitesse_limit_from,vitesse_limit_to);temps_reaction=conditions_gene.tps_reaction/1000;if(stats_buf[1]>distance||voiture_gene.vitesse<vitesse_limit_to)
{cumule_dist+=distance;}
else
{cumule_dist=0;borne_sup=voiture_gene.vitesse;if(vitesse_limit_from>vitesse_limit_to)borne_inf=vitesse_limit_from;else borne_inf=vitesse_limit_to;speed_buf=(borne_sup+borne_inf)/2;for(i=0;i<15;i++)
{source=1;stats1=stats_for_change_speed(voiture_gene,vitesse_limit_from,speed_buf);stats2=stats_for_change_speed(voiture_gene,speed_buf,vitesse_limit_to);dist_reaction=speed_buf*temps_reaction/3.6;dist_buf=stats1[1]+stats2[1]+dist_reaction;if(dist_buf>distance)borne_sup=speed_buf;else borne_inf=speed_buf;speed_buf=(borne_sup+borne_inf)/2;}
if(stats1[1]+stats2[1]+dist_reaction+0.5<distance||Math.floor(voiture_gene.vitesse,2)==Math.floor(speed_buf,2))
{source=2;new_dist_a=distance-(stats2[1]+dist_reaction);ecart=new_dist_a-stats1[1];stats1[1]=new_dist_a;stats1[0]=stats1[0]+ecart/(speed_buf/3.6);}
else if(round(vitesse_limit_to,2)==round(speed_buf,2))
{source=3;dist_reaction=distance-stats1[1];temps_reaction=dist_reaction/(speed_buf/3.6);stats2[0]=0;stats2[1]=0;}
if(debug)
{debug_str+="<BR><FONT SIZE=2>Av "+Math.floor(avancement)+" m, "+temps_ecoule+" s";debug_str+="<BR>Deb "+vitesse_limit_from+" km/h";debug_str+="<BR>Max "+speed_buf+" km/h";debug_str+="<BR>Fin "+vitesse_limit_to+" km/h";debug_str+="<BR>A :"+stats1[1]+" m, "+stats1[0]+" s";debug_str+="<BR>R :"+dist_reaction+" m, "+(temps_reaction)+" s";debug_str+="<BR>B :"+stats2[1]+" m, "+stats2[0]+" s";debug_str+="<BR>("+(stats1[1]+stats2[1]+dist_reaction)+" / "+distance+")</FONT><BR>";}
points_buf=new Array();points_buf[0]=round((avancement+stats1[1]),0)+":"+round(speed_buf,0)+":"+round((temps_ecoule+stats1[0]),1);points_buf[1]=round((avancement+stats1[1]+dist_reaction),0)+":"+round(speed_buf,0)+":"+round((temps_ecoule+stats1[0]+temps_reaction),1);points_buf[2]=round((avancement+stats1[1]+dist_reaction+stats2[1]),0)+":"+round(vitesse_limit_to,0)+":"+round((temps_ecoule+stats1[0]+temps_reaction+stats2[0]),1);temps_ecoule+=(stats1[0]+stats2[0]+temps_reaction);avancement+=distance;previous_speed=vitesse_limit_to;debug_str+="<BR>LAP : "+lap;if(cp_id==0&&lap>0)
{prev_lap=lap;debug_str+="END LAP !!!";inter_avancement=avancement-circuit_gene.longueur_circuit_gene_metre*lap;temps_at_last_cp=temps_ecoule-(stats1[0]+stats2[0]+temps_reaction);if(inter_avancement>dist_reaction+stats2[1])
{d=(circuit_gene.longueur_circuit_gene_metre*lap)-(avancement-distance);stats_t=stats_for_added_dist(voiture_gene,vitesse_limit_from,d,true);time_at_end=temps_at_last_cp+stats_t[0];vitesse_at_end=vitesse_limit_from+stats_t[1];place_to_write=0;if(round(voiture_gene.vitesse,2)==round(vitesse_at_end,2))
{stats_t_buf=stats_for_added_time(voiture_gene,vitesse_limit_from,stats_t[0],true);time_at_end+=(d-stats_t_buf[1])/(vitesse_at_end/3.6);}}
else if(inter_avancement>stats2[1])
{time_at_end=temps_at_last_cp+stats1[0]+(inter_avancement-stats2[1])/(speed_buf/3.6);vitesse_at_end=speed_buf;place_to_write=1;}
else
{d=(circuit_gene.longueur_circuit_gene_metre*lap)-(avancement-distance+stats1[1]+dist_reaction);stats_t=stats_for_added_dist(voiture_gene,speed_buf,d,false);time_at_end=temps_at_last_cp+stats1[0]+temps_reaction+stats_t[0];vitesse_at_end=speed_buf+stats_t[1];place_to_write=2;}
var point_to_write=round((circuit_gene.longueur_circuit_gene_metre*lap),0)+":"+round(vitesse_at_end,0)+":"+round(time_at_end,3);temps_au_tour=time_at_end-temps_last_lap;if(debug)debug_str+="<BR>Temps au tour :"+round(temps_au_tour,3)+" sec";temps_last_lap=time_at_end;temps_tours_cumule+=temps_au_tour;temps_tours.push(round(temps_au_tour,3));}
for(i=0;i<3;i++)
{if(place_to_write==i&&tour_arret<=1)
{debug_str+="<BR>PTW : "+point_to_write;behaviour.push(point_to_write);place_to_write=-1;if(lap==nb_laps)
{stop=true;debug_str+="STOP=true";break;}}
debug_str+="<BR>NPT : "+points_buf[i];behaviour.push(points_buf[i]);}
if(tour_arret==2&&cp_id==sizeof_main_speed_cp-1)
{temps_ecoule+=conditions_gene.tps_arrets;if(debug)debug_str+=" : ICI AJOUTER "+conditions_gene.tps_arrets+"sec !!!";}
if(tour_arret==1)tour_arret++;}
if(debug)debug_str+="<BR>"+lap+" : "+cp_id+" ("+previous_cp+") - "+avancement+" - "+distance;cp_id++;if(cp_id>=sizeof_main_speed_cp)
{cp_id=0;lap++;if(tour_arret==2)plannifier_arret=0;if(lap==arrets_tab[next_arret_array_id]-1&&lap<nb_laps-1)
{next_arret_array_id++;plannifier_arret=1;if(debug)debug_str+="<BR>Arret !!!";}}}
course_gene.behaviour=behaviour.join(';');last_cp=behaviour[behaviour.length-1].split(":");course_gene.total_time=last_cp[2];course_gene.distance_parcouru=distance_parcouru;course_gene.temps_tours=temps_tours.join(';');course_gene.crash=crash;if(debug)
{debug_str+="<BR>Temps au tour moyen : "+(temps_tours_cumule/nb_laps)+" sec";debug_str+="<BR>Distance parcouru : "+avancement+" / "+(circuit_gene.longueur_circuit_gene_metre*nb_laps)+" m";debug_str+="<BR>PTW : "+point_to_write;debug_str="<BR><BR>";debug_str+=behaviour.join("<BR>");}
if(debug)document.getElementById("a").innerHTML+=debug_str;}
function rand(a,b)
{return a+Math.round(Math.random()*(b-a));}
function round(a,b)
{return Math.floor(a*Math.pow(10,b))/Math.pow(10,b);}
function chargercircuit_gene(circuit_gene,arret)
{var debug=false;main_speed_cp=new Array();if(arret==true)circuit_gene.speed_cp.push(new Array(0,circuit_gene.longueur_circuit_gene_metre));speed_limits_inter=new Array();speed_limits_size=(circuit_gene.speed_cp).length-1;jump_next_cp=true;old_distance=0;for(cp_id=-1;cp_id<=speed_limits_size;cp_id++)
{next_cp_id=cp_id+1;if(next_cp_id>speed_limits_size)next_cp_id=0;if(cp_id==-1)vitesse_limit_from=0;else if(!jump_next_cp)vitesse_limit_from=circuit_gene.speed_cp[cp_id][0];vitesse_limit_to=circuit_gene.speed_cp[next_cp_id][0];if(debug==true)document.getElementById("a").innerHTML+="<BR>"+cp_id+">"+next_cp_id;if(cp_id==-1)distance=circuit_gene.speed_cp[next_cp_id][1];else distance=circuit_gene.speed_cp[next_cp_id][1]-circuit_gene.speed_cp[cp_id][1];if(jump_next_cp)distance+=old_distance;if(cp_id==speed_limits_size)distance=circuit_gene.longueur_circuit_gene_metre-circuit_gene.speed_cp[cp_id][1]+circuit_gene.speed_cp[0][1];if(debug==true)document.getElementById("a").innerHTML+=" BASE "+vitesse_limit_from+" > "+vitesse_limit_to+" km/h : DISP "+distance;if(!jump_next_cp)
{speed_limits_inter.push(circuit_gene.speed_cp[cp_id]);if(debug==true)document.getElementById("a").innerHTML+=" <BR>AJOUTER ICI !!!"+cp_id;}
if(vitesse_limit_from<vitesse_limit_to)
{if(vitesse_limit_to>voiture_gene.vitesse)
{if(debug==true)document.getElementById("a").innerHTML+=" VIRER INCAPABLE !!!";jump_next_cp=true;old_distance=distance;}
else
{stat=stats_for_change_speed(voiture_gene,vitesse_limit_from,vitesse_limit_to);dist_required=stat[1];if(debug==true)document.getElementById("a").innerHTML+=" # REQ > "+dist_required;if(dist_required<distance)jump_next_cp=false;else
{if(debug==true)document.getElementById("a").innerHTML+=" VIRER !!!";jump_next_cp=true;old_distance=distance;}}}
else jump_next_cp=false;}
if(debug==true)document.getElementById("a").innerHTML+="<BR>######";speed_limits_size=(speed_limits_inter.length)-1;jump_next_cp=false;old_distance=0;for(cp_id=speed_limits_size;cp_id>=0;cp_id--)
{previous_cp_id=cp_id-1;if(previous_cp_id<0)previous_cp_id=speed_limits_size;if(debug==true)document.getElementById("a").innerHTML+="<BR>PCPID"+previous_cp_id+" -> "+speed_limits_inter;vitesse_limit_from=speed_limits_inter[previous_cp_id][0];if(!jump_next_cp)vitesse_limit_to=speed_limits_inter[cp_id][0];if(debug==true)document.getElementById("a").innerHTML+="<BR>"+previous_cp_id+">"+cp_id;distance=speed_limits_inter[cp_id][1]-speed_limits_inter[previous_cp_id][1];if(jump_next_cp)distance+=old_distance;if(cp_id==0)distance=circuit_gene.longueur_circuit_gene_metre-speed_limits_inter[previous_cp_id][1]+speed_limits_inter[cp_id][1];if(debug==true)document.getElementById("a").innerHTML+=" BASE "+vitesse_limit_from+" > "+vitesse_limit_to+" km/h : DISP "+distance;if(!jump_next_cp)main_speed_cp.unshift(speed_limits_inter[cp_id]);if(vitesse_limit_from>vitesse_limit_to)
{stat=stats_for_change_speed(voiture_gene,vitesse_limit_from,vitesse_limit_to);dist_required=stat[1];if(debug==true)document.getElementById("a").innerHTML+=" # REQ > "+dist_required;if(dist_required<distance)jump_next_cp=false;else
{if(debug==true)document.getElementById("a").innerHTML+=" VIRER !!!";jump_next_cp=true;old_distance=distance;}}
else jump_next_cp=false;}
if(debug==true)document.getElementById("a").innerHTML+="<BR>";if(debug==true)
{speed_limits_size=main_speed_cp.length-1;for(cp_id=0;cp_id<=speed_limits_size;cp_id++)
{document.getElementById("a").innerHTML+="<BR>"+Math.floor(main_speed_cp[cp_id][1])+";"+Math.floor(main_speed_cp[cp_id][0]);}
document.getElementById("a").innerHTML+="<BR><BR>";}
return main_speed_cp;}
function stats_for_added_time(voiture_gene,current_speed,diff_time,acc)
{if(diff_time==0)return new Array(0,0);if(acc==true)
{if(current_speed>=voiture_gene.vitesse)return new Array(0,current_speed/3.6);time_1=-Math.log(1-current_speed/voiture_gene.vitesse)/voiture_gene.acceleration;time_2=parseFloat(time_1+diff_time);v1=voiture_gene.vitesse*Math.exp(-voiture_gene.acceleration*time_1);v2=voiture_gene.vitesse*Math.exp(-voiture_gene.acceleration*time_2);v_diff=v1-v2;distance_requise=(voiture_gene.vitesse/3.6)*((time_2-time_1)-((1/-voiture_gene.acceleration)*Math.exp(-voiture_gene.acceleration*time_2)-(1/-voiture_gene.acceleration)*Math.exp(-voiture_gene.acceleration*time_1)));return new Array(v_diff,distance_requise);}
else
{if(current_speed==0)return new Array(0,0);v_diff=voiture_gene.freinage*diff_time*3.6;dist_freinage=(Math.pow(current_speed/3.6,2)/(2*voiture_gene.freinage))-(Math.pow((current_speed-v_diff)/3.6,2)/(2*voiture_gene.freinage));return new Array(v_diff,dist_freinage);}}
function stats_for_change_speed(voiture_gene,current_speed,targeted_speed)
{if(current_speed==targeted_speed)return new Array(0,0);if(targeted_speed>current_speed)
{time1=-Math.log(1-current_speed/voiture_gene.vitesse)/voiture_gene.acceleration;time2=-Math.log(1-targeted_speed/voiture_gene.vitesse)/voiture_gene.acceleration;time_diff=time2-time1;distance_requise=(voiture_gene.vitesse/3.6)*((time2-time1)-((1/-voiture_gene.acceleration)*Math.exp(-voiture_gene.acceleration*time2)-(1/-voiture_gene.acceleration)*Math.exp(-voiture_gene.acceleration*time1)));return new Array(time_diff,distance_requise);}
else
{dist_freinage=(Math.pow(current_speed/3.6,2)/(2*voiture_gene.freinage))-(Math.pow(targeted_speed/3.6,2)/(2*voiture_gene.freinage));time_diff=(current_speed/3.6)/voiture_gene.freinage-(targeted_speed/3.6)/voiture_gene.freinage;return new Array(time_diff,dist_freinage);}}
function stats_for_added_dist(voiture_gene,current_speed,dist_diff,acc)
{if(dist_diff==0)return new Array(0,0);borne_sup=current_speed;if(acc==true)borne_inf=voiture_gene.vitesse;else borne_inf=0;speed_buf=(borne_sup+borne_inf)/2;stats=stats_for_change_speed(voiture_gene,current_speed,speed_buf);dist_buf=stats[1];for(i=0;i<15;i++)
{if(dist_buf<dist_diff)borne_sup=speed_buf;else borne_inf=speed_buf;speed_buf=(borne_sup+borne_inf)/2;stats=stats_for_change_speed(voiture_gene,current_speed,speed_buf);dist_buf=stats[1];}
return new Array(stats[0],speed_buf-current_speed);}


