/*
 * LatLong object - methods summary
 *
 *   p = new LatLong('512839N', '0002741W')
 *   p = new LatLong(53.123, -1.987)
 *
 *   dist = LatLong.distHaversine(p1, p2)
 *   dist = LatLong.distCosineLaw(p1, p2)
 *   dist = LatLong.distVincenty(p1, p2)
 *
 *   brng = LatLong.bearing(p1, p2)
 *   dist = p1.distAlongVector(orig, dirn)
 *   p = LatLong.midPoint(p1, p2)
 *   p2 = p1.destPoint(initBrng, dist)
 *   brng = p.finalBrng(initBrng, dist)
 *
 *   dist = LatLong.distRhumb(p1, p2)
 *   brng = LatLong.brngRhumb(p1, p2)
 *   p2 = p1.destPointRhumb(brng, dist)
 *
 *   rad = LatLong.llToRad('51Âº28'39"N')
 *   latDms = p.latitude()
 *   lonDms = p.longitude()
 *   dms = LatLong.radToDegMinSec(0.1284563)
 *   dms = LatLong.radToBrng(0.1284563)
 *
 * properties:
 *   p.lat - latitude in radians (0=equator, pi/2=N.pole)
 *   p.lon - longitude in radians (0=Greenwich, E=+ve)
 *
 * Â© 2002-2005 Chris Veness, www.movable-type.co.uk
 */


/*
 * LatLong constructor:
 *
 *   arguments are in degrees: signed decimal or d-m-s + NSEW as per LatLong.llToRad()
 */
function LatLong(degLat, degLong) {
  this.lat = degLat;
  this.lon = degLong;
}


/*
 * Calculate distance (in km) between two points specified by latitude/longitude with Haversine formula
 *
 * from: Haversine formula - R. W. Sinnott, "Virtues of the Haversine",
 *       Sky and Telescope, vol 68, no 2, 1984
 *       http://www.census.gov/cgi-bin/geo/gisfaq?Q5.1
 */
LatLong.distHaversine = function(p1, p2) {
  var R = 6000; // earth's mean radius in km
  var dLat  = p2.lat - p1.lat;
  var dLong = p2.lon - p1.lon;

  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
          Math.cos(p1.lat) * Math.cos(p2.lat) * Math.sin(dLong/2) * Math.sin(dLong/2);
  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  var d = R * c;

  return d;
}


/*
 * Calculate distance (in km) between two points specified by latitude/longitude using law of cosines.
 */
LatLong.distCosineLaw = function(p1, p2) {
  var R = 6371; // earth's mean radius in km
  var d = Math.acos(Math.sin(p1.lat)*Math.sin(p2.lat) +
                    Math.cos(p1.lat)*Math.cos(p2.lat)*Math.cos(p2.lon-p1.lon)) * R;
  return d;
}


/*
 * calculate (initial) bearing (in radians clockwise) between two points
 *
 * from: Ed Williams' Aviation Formulary, http://williams.best.vwh.net/avform.htm#Crs
 */
LatLong.bearing = function(p1, p2) {
  var y = Math.sin(p2.lon-p1.lon) * Math.cos(p2.lat);
  var x = Math.cos(p1.lat)*Math.sin(p2.lat) -
          Math.sin(p1.lat)*Math.cos(p2.lat)*Math.cos(p2.lon-p1.lon);
  return Math.atan2(y, x);
}


/*
 * calculate distance of point along a given vector defined by origin point
 * and direction in radians (uses planar not spherical geometry, so only valid
 * for small distances).
 */
LatLong.prototype.distAlongVector = function(orig, dirn) {
  var dist = LatLong.distHaversine(this, orig);  // distance from orig to point
  var brng = LatLong.bearing(this, orig);        // bearing between orig and point
  return dist * Math.cos(brng-dirn);
}


/*
 * calculate midpoint of great circle line between p1 & p2.
 *   see http://mathforum.org/library/drmath/view/51822.html for derivation
 */
LatLong.midPoint = function(p1, p2) {
  var dLon = p2.lon - p1.lon;

  var Bx = Math.cos(p2.lat) * Math.cos(dLon);
  var By = Math.cos(p2.lat) * Math.sin(dLon);

  lat3 = Math.atan2(Math.sin(p1.lat)+Math.sin(p2.lat),
                    Math.sqrt((Math.cos(p1.lat)+Bx)*(Math.cos(p1.lat)+Bx) + By*By ) );
  lon3 = p1.lon + Math.atan2(By, Math.cos(p1.lat) + Bx);

  if (isNaN(lat3) || isNaN(lon3)) return null;
  return new LatLong(lat3*180/Math.PI, lon3*180/Math.PI);
}


/*
 * calculate destination point given start point, initial bearing and distance
 *   see http://williams.best.vwh.net/avform.htm#LL
 */
LatLong.prototype.destPoint = function(brng, dist) {
  var R = 6371; // earth's mean radius in km
  var p1 = this, p2 = new LatLong(0,0), d = parseFloat(dist)/R;  // d = angular distance covered on earth's surface
  brng = LatLong.degToRad(brng);

  p2.lat = Math.asin( Math.sin(p1.lat)*Math.cos(d) + Math.cos(p1.lat)*Math.sin(d)*Math.cos(brng) );
  p2.lon = p1.lon + Math.atan2(Math.sin(brng)*Math.sin(d)*Math.cos(p1.lat), Math.cos(d)-Math.sin(p1.lat)*Math.sin(p2.lat));

  if (isNaN(p2.lat) || isNaN(p2.lon)) return null;
  return p2;
}


/*
 * calculate final bearing arriving at destination point given start point, initial bearing and distance
 */
LatLong.prototype.finalBrng = function(brng, dist) {
  var p1 = this, p2 = p1.destPoint(brng, dist);
  // get reverse bearing point 2 to point 1 & reverse it by adding 180Âº
  var h2 = (LatLong.bearing(p2, p1) + Math.PI) % (2*Math.PI);
  return h2;
}


/*
 * calculate distance, bearing, destination point on rhumb line
 *   see http://williams.best.vwh.net/avform.htm#Rhumb
 */
LatLong.distRhumb = function(p1, p2) {
  var R = 6371; // earth's mean radius in km
  var dLat = p2.lat-p1.lat, dLon = Math.abs(p2.lon-p1.lon);
  var dPhi = Math.log(Math.tan(p2.lat/2+Math.PI/4)/Math.tan(p1.lat/2+Math.PI/4));
  var q = dLat/dPhi;
  if (!isFinite(q)) q = Math.cos(p1.lat);
  // if dLon over 180Â° take shorter rhumb across 180Â° meridian:
  if (dLon > Math.PI) dLon = 2*Math.PI - dLon;
  var d = Math.sqrt(dLat*dLat + q*q*dLon*dLon); 
  return d * R;
}


LatLong.brngRhumb = function(p1, p2) {
  var dLon = p2.lon-p1.lon;
  var dPhi = Math.log(Math.tan(p2.lat/2+Math.PI/4)/Math.tan(p1.lat/2+Math.PI/4));
  if (Math.abs(dLon) > Math.PI) dLon = dLon>0 ? -(2*Math.PI-dLon) : (2*Math.PI+dLon);
  return Math.atan2(dLon, dPhi);
}


LatLong.prototype.destPointRhumb = function(brng, dist) {
  var R = 6371; // earth's mean radius in km
  var p1 = this, p2 = new LatLong(0,0);
  var d = parseFloat(dist)/R;  // d = angular distance covered on earth's surface
  brng = LatLong.degToRad(brng);

  p2.lat = p1.lat + d*Math.cos(brng);
  var dPhi = Math.log(Math.tan(p2.lat/2+Math.PI/4)/Math.tan(p1.lat/2+Math.PI/4));
  var q = (p2.lat-p1.lat)/dPhi;
  if (!isFinite(q)) q = Math.cos(p1.lat);
  var dLon = d*Math.sin(brng)/q;
  // check for some daft bugger going past the pole
  if (Math.abs(p2.lat) > Math.PI/2) p2.lat = p2.lat>0 ? Math.PI-p2.lat : -Math.PI-p2.lat;
  p2.lon = (p1.lon+dLon+Math.PI)%(2*Math.PI) - Math.PI;
 
  if (isNaN(p2.lat) || isNaN(p2.lon)) return null;
  return p2;
}


/*
 * convert lat/long in degrees to radians, for handling input values
 *
 *   this is very flexible on formats, allowing signed decimal degrees (numeric or text), or
 *   deg-min-sec suffixed by compass direction (NSEW). A variety of separators are accepted 
 *   (eg 3Âº 37' 09"W) or fixed-width format without separators (eg 0033709W). Seconds and minutes
 *   may be omitted. Minimal validation is done.
 */
LatLong.llToRad = function(brng) {
  //if (!isNaN(brng)) return brng * Math.PI / 180;  // signed decimal degrees without NSEW
  return brng * Math.PI / 180;  // signed decimal degrees without NSEW
  /*brng = brng.replace(/[\s]*$/,'');               // strip trailing whitespace
  var dir = brng.slice(-1).toUpperCase();         // compass dir'n
  if (!/[NSEW]/.test(dir)) return NaN;            // check for correct compass direction
  brng = brng.slice(0,-1);                        // and lose it off the end
  var dms = brng.split(/[\s:,Â°Âºâ€²\'â€³\"]/);         // check for separators indicating d/m/s
  switch (dms.length) {                           // convert to decimal degrees...
    case 3:                                       // interpret 3-part result as d/m/s
      var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;
    case 2:                                       // interpret 2-part result as d/m
      var deg = dms[0]/1 + dms[1]/60; break;
    case 1:                                       // non-separated format dddmmss
      if (/[NS]/.test(dir)) brng = '0' + brng;    // - normalise N/S to 3-digit degrees
      var deg = brng.slice(0,3)/1 + brng.slice(3,5)/60 + brng.slice(5)/3600; break;
    default: return NaN;
  }
  if (/[WS]/.test(dir)) deg = -deg;               // take west and south as -ve
  return deg * Math.PI / 180;                     // then convert to radians
  */
}


/* 
 * convert degrees to radians - used for bearing, so 360Âº with no N/S/E/W suffix
 *   can accept d/m/s, d/m, or decimal degrees
 */
LatLong.degToRad = function(brng) {
  var dms = brng.split(/[\s:,ÂºÂ°\'\"â€²â€³]/)          // check for separators indicating d/m/s
  switch (dms.length) {                           // convert to decimal degrees...
    case 3:                                       // interpret 3-part result as d/m/s
      var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;
    case 2:                                       // interpret 2-part result as d/m
      var deg = dms[0]/1 + dms[1]/60; break;
    default: 
      var deg = parseFloat(brng); break;          // otherwise decimal degrees
  }
  return deg * Math.PI / 180;                     // then convert to radians
}


/*
 * convert latitude into degrees, minutes, seconds; eg 51Âº28'38"N
 */
LatLong.prototype.latitude = function() {
  return LatLong._dms(this.lat).slice(1) + (this.lat<0 ? 'S' : 'N');
}


/*
 * convert longitude into degrees, minutes, seconds; eg 000Âº27'41"W
 */
LatLong.prototype.longitude = function() {
  return LatLong._dms(this.lon) + (this.lon>0 ? 'E' : 'W');
}


/*
 * convert radians to (signed) degrees, minutes, seconds; eg -0.1rad = -000Â°05'44"
 */
LatLong.radToDegMinSec = function(rad) {
  return (rad<0?'-':'') + LatLong._dms(rad);
}


/*
 * convert radians to compass bearing - 0Â°-360Â° rather than +ve/-ve
 */
LatLong.radToBrng = function(rad) {
  return LatLong.radToDegMinSec((rad+2*Math.PI) % (2*Math.PI));
}


/*
 * convert radians to deg/min/sec, with no sign or compass dirn (internal use)
 */
LatLong._dms = function(rad) {
  var d = Math.abs(rad * 180 / Math.PI);
  d += 1/7200;  // add Â½ second for rounding
  var deg = Math.floor(d);
  var min = Math.floor((d-deg)*60);
  var sec = Math.floor((d-deg-min/60)*3600);
  // add leading zeros if required
  if (deg<100) deg = '0' + deg; if (deg<10) deg = '0' + deg;
  if (min<10) min = '0' + min;
  if (sec<10) sec = '0' + sec;
  return deg + '\u00B0' + min + '\u2032' + sec + '\u2033';
}


/*
 * override toPrecision method with one which displays trailing zeros in place
 *   of exponential notation
 *
 * (for Haversine, use 4 sf to reflect reasonable indication of accuracy)
 */
Number.prototype.toPrecision = function(fig) {
  var scale = Math.ceil(Math.log(this)*Math.LOG10E);
  var mult = Math.pow(10, fig-scale);
  return Math.round(this*mult)/mult;
}


/*
 * it's good form to include a toString method...
 */
LatLong.prototype.toString = function() {
  return this.latitude() + ', ' + this.longitude();
}

//addEvent(window, "load", sortables_init);

var SORT_COLUMN_INDEX;

function sortables_init() {
    // Find all tables with class sortable and make them sortable
    if (!document.getElementsByTagName) return;
    tbls = document.getElementsByTagName("table");
    for (ti=0;ti<tbls.length;ti++) {
        thisTbl = tbls[ti];
        if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) {
            //initTable(thisTbl.id);
            ts_makeSortable(thisTbl);
        }
    }
}

function ts_makeSortable(table) {
    if (table.rows && table.rows.length > 0) {
        var firstRow = table.rows[0];
    }
    if (!firstRow) return;
    
    // We have a first row: assume it's the header, and make its contents clickable links
    for (var i=0;i<firstRow.cells.length;i++) {
        var cell = firstRow.cells[i];
        var txt = ts_getInnerText(cell);
        cell.innerHTML = '<a href="#" class="sortheader" '+ 
        'onclick="ts_resortTable(this, '+i+');return false;">' + 
        txt+'<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';
    }
}

function ts_getInnerText(el) {
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return el };
	if (el.innerText) return el.innerText;	//Not needed but it is faster
	var str = "";
	
	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				str += ts_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

function ts_resortTable(lnk,clid) {
    // get the span
    var span;
    for (var ci=0;ci<lnk.childNodes.length;ci++) {
        if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
    }
    var spantext = ts_getInnerText(span);
    var td = lnk.parentNode;
    var column = clid || td.cellIndex;
    var table = getParent(td,'TABLE');
    
    // Work out a type for the column
    if (table.rows.length <= 1) return;
    var itm = ts_getInnerText(table.rows[1].cells[column]);
    sortfn = ts_sort_caseinsensitive;
    if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d\d\d$/)) sortfn = ts_sort_date;
    if (itm.match(/^\d\d[\/-]\d\d[\/-]\d\d$/)) sortfn = ts_sort_date;
    if (itm.match(/^[£$]/)) sortfn = ts_sort_currency;
    if (itm.match(/^[\d\.]+$/)) sortfn = ts_sort_numeric;
    SORT_COLUMN_INDEX = column;
    var firstRow = new Array();
    var newRows = new Array();
    for (i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }
    for (j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }

    newRows.sort(sortfn);

    if (span.getAttribute("sortdir") == 'down') {
        ARROW = '&nbsp;&nbsp;&uarr;';
        newRows.reverse();
        span.setAttribute('sortdir','up');
    } else {
        ARROW = '&nbsp;&nbsp;&darr;';
        span.setAttribute('sortdir','down');
    }
    
    // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
    // don't do sortbottom rows
    for (i=0;i<newRows.length;i++) { if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) table.tBodies[0].appendChild(newRows[i]);}
    // do sortbottom rows only
    for (i=0;i<newRows.length;i++) { if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) table.tBodies[0].appendChild(newRows[i]);}
    
    // Delete any other arrows there may be showing
    var allspans = document.getElementsByTagName("span");
    for (var ci=0;ci<allspans.length;ci++) {
        if (allspans[ci].className == 'sortarrow') {
            if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
                allspans[ci].innerHTML = '&nbsp;&nbsp;&nbsp;';
            }
        }
    }
        
    span.innerHTML = ARROW;
}

function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	else
		return getParent(el.parentNode, pTagName);
}
function ts_sort_date(a,b) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa.length == 10) {
        dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
    } else {
        yr = aa.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt1 = yr+aa.substr(3,2)+aa.substr(0,2);
    }
    if (bb.length == 10) {
        dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
    } else {
        yr = bb.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt2 = yr+bb.substr(3,2)+bb.substr(0,2);
    }
    if (dt1==dt2) return 0;
    if (dt1<dt2) return -1;
    return 1;
}

function ts_sort_currency(a,b) { 
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
    return parseFloat(aa) - parseFloat(bb);
}

function ts_sort_numeric(a,b) { 
    aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
    if (isNaN(aa)) aa = 0;
    bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}

function ts_sort_caseinsensitive(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}

function ts_sort_default(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}


function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
} 

function c(objet, myClass) { // v2.0 changeclass
    objet.className = myClass;
}	

function d(fichier) { // Fabrice v1.0  
    document.location=fichier ;
}

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];
            str=new String(value);
            if (str.substr(0,8)!='function')
            {
                
                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 mvd(arr)
{
    alert(dump(arr));
}
function isAlien(a) {
   return isObject(a) && typeof a.constructor != 'function';
}

function isArray(a) {
    return isObject(a) && a.constructor == Array;
}

function isBoolean(a) {
    return typeof a == 'boolean';
}

function isEmpty(o) {
    var i, v;
    if (isObject(o)) {
        for (i in o) {
            v = o[i];
            if (isUndefined(v) && isFunction(v)) {
                return false;
            }
        }
    }
    return true;
}

function isFunction(a) {
    return typeof a == 'function';
}

function isNull(a) {
    return typeof a == 'object' && !a;
}

function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}

function isObject(a) {
    return (a && typeof a == 'object') || isFunction(a);
}

function isString(a) {
    return typeof a == 'string';
}

function isUndefined(a) {
    return typeof a == 'undefined';
} 

function noteshow(my_note) {
    for (var i=0; i < 5; i++)
        $('star'+(i+1)).src = '/i/star_nok.png';
    for (var i=0; i < my_note; i++)
        $('star'+(i+1)).src = '/i/star_ok.png';
}

function notesave(key,note) {
    note=parseInt(note);
    if (note < 1 || note > 5)
    {
        alert('Erreur sur la note');
    }
    note_xml(key,$F('id_note'),note);
}
function noteclear() {
    setTimeout("notereset()", 300);
}
function notereset()
{
    noteshow($F('note'));
}


var ville;
var mdistance;

function str_replace(search, replace, subject) {
    return subject.split(search).join(replace);
}

function myEncodeUri(str)
{
  return str_replace("=", "%3D",encodeURI(str)); 
}

function calculDistance(points)
{
	mdistance=0;
    for(i=1;i<points.length;i++)
	{
        p1=new LatLong(points[i-1].x* Math.PI / 180,points[i-1].y* Math.PI / 180);
        p2=new LatLong(points[i].x* Math.PI / 180,points[i].y* Math.PI / 180);
        mdistance=mdistance+LatLong.distHaversine(p1, p2)*1000;
	}
	ddiv=$("distance");
    mdistance=mdistance*0.85;
	ddiv.innerHTML=Math.floor(mdistance)+" m";
}

function noone()
{
    return;
}
function beginLoading()
{
	$('loading').style.display='inline'; 
}
function endLoading()
{
    sortables_init();
	$('loading').style.display='none';
}
function doLogin(user,pass)
{
    var url = '/xml/login.php';
    var pars = 'username=' + user + '&password=' + pass +'&isajax=1';
    beginLoading();
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readUserResponse
        });
    
}

function doLogout()
{
    var url = '/xml/logout.php';
    var pars = 'isajax=1';
    beginLoading();
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readUserResponse
        });
    
}

function readContent(page)
{
    var pars = 'isajax=1';
    beginLoading();
    var myAjax = new Ajax.Updater(
        'page_content',
        page,
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function readListMessage(box,page)
{
    var pars = 'isajax=1&box='+box+'&page='+page;
    beginLoading();
    var myAjax = new Ajax.Updater(
        'page_content',
        '/view/message_box.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function createMarkerDepart(point)
{
    var icon = new GIcon();
    icon.image = "/i/depart.png";
    icon.iconSize = new GSize(16, 16);
    icon.iconAnchor = new GPoint(6, -8);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var marker = new GMarker(point, icon);
    GEvent.addListener(marker, "click", function() {
            var strtmp="D&eacute;part<br />";
            marker.openInfoWindowHtml(strtmp);
    });
    return marker;
}

function createMarkerArrive(point)
{
    var icon = new GIcon();
    icon.image = "/i/arrive.png";
    icon.iconSize = new GSize(16, 16);
    icon.iconAnchor = new GPoint(6, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var marker = new GMarker(point, icon);
    GEvent.addListener(marker, "click", function() {
            var strtmp="Arriv&eacute;e<br />";
            marker.openInfoWindowHtml(strtmp);
    });
    return marker;
}

function readContentMapFrance()
{
    var pars = 'isajax=1';
    beginLoading();
    var myAjax = new Ajax.Updater(
        'page_content',
        '/view/france_map.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: loadFranceMap
        });
}

function loadFranceMap()
{
    endLoading();
    div_map=$("map");
    div_map.style.width='750px';
    div_map.style.height='600px';
    
    map = new GMap2($("map"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(46.875213,2.460938), 6);
    beginLoading();
    var myAjax = new Ajax.Request('/xml/xml_point_france.php',
        {
            method: 'get',
            onComplete: readPointFrance
        });
}

function createMarkerVille(icon, point, ville, parcours) {
    var marker = new GMarker(point, icon);
    GEvent.addListener(marker, "click", function() {
            var strtmp=" Ville : <b>" + ville + "</b><br />";
            strtmp+="";
            for (var i = 0; i < parcours.length; i++) {
                strtmp+="<a href=\"javascript:readContentShowParcours('"+parcours[i].getAttribute("id")+"');\">" + parcours[i].getAttribute("name") + "</a><br />";
            }
            strtmp+="";
            marker.openInfoWindowHtml(strtmp);
    });
    return marker;
}

function readPointFrance(originalRequest)
{
    endLoading();
    xmldoc=originalRequest.responseXML;
    var markers = xmldoc.documentElement.getElementsByTagName("marker");
    
    var icon = new GIcon();
    icon.image = "/i/icon_"+site+".png";
    icon.iconSize = new GSize(15, 20);
    icon.iconAnchor = new GPoint(6, 8);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    for (var i = 0; i < markers.length; i++) {
        var parcours = markers.item(i).getElementsByTagName("parcours");
        var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
            parseFloat(markers[i].getAttribute("lng")));
        map.addOverlay(createMarkerVille(icon, point, markers[i].getAttribute("name"),parcours));
    }
}

function createMarkerDepart(point)
{
    var icon = new GIcon();
    icon.image = "/i/depart.png";
    icon.iconSize = new GSize(16, 16);
    icon.iconAnchor = new GPoint(6, -8);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var marker = new GMarker(point, icon);
    GEvent.addListener(marker, "click", function() {
            var strtmp="D&eacute;part<br />";
            marker.openInfoWindowHtml(strtmp);
    });
    return marker;
}

function createMarkerBorne(point,km)
{
    if (km!=0)
    {
      var icon = new GIcon();
      icon.image = '/bornes/borne_'+km+'.gif';
      icon.iconSize = new GSize(16, 32);
      icon.iconAnchor = new GPoint(16,32);
      icon.infoWindowAnchor = new GPoint(0,0);
      
      var marker = new GMarker(point, icon);
      /*GEvent.addListener(marker, "click", function() {
          var strtmp="Kilom&&eacute;tre "+km+"<br />";
          marker.openInfoWindowHtml(strtmp);
      });*/
      return marker;
    }
}

function createMarkerArrive(point)
{
    var icon = new GIcon();
    icon.image = "/i/arrive.png";
    icon.iconSize = new GSize(16, 16);
    icon.iconAnchor = new GPoint(6, 20);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var marker = new GMarker(point, icon);
    GEvent.addListener(marker, "click", function() {
            var strtmp="Arriv&eacute;e<br />";
            marker.openInfoWindowHtml(strtmp);
    });
    return marker;
}

function readContentParcours(page)
{
    var pars = 'isajax=1';
    var myAjax = new Ajax.Updater(
        'page_content',
        page,
        {
            parameters: pars,
            method: 'get',
            onComplete: readPays
        });
}
// a modifier pour que ca soit plus souple
function readContentShowParcours(parcours)
{
    var pars = 'isajax=1&parcours='+parcours;
    beginLoading();
    var myAjax = new Ajax.Updater(
        'page_content',
        '/view/parcours.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: readDetailParcours
        });
}
function readDetailParcours()
{
    endLoading();
    pars='isajax=1&parcours='+$F('id_parcours')
    beginLoading();
    var myAjax = new Ajax.Request('/xml/xml_data_parcours.php',
        {
            method: 'get',
            parameters: pars,
            onComplete: readParcours
        });
    
}
function readParcours(originalRequest)
{
    endLoading();
   	(new Image()).src = '/i/star_ok.png';
	(new Image()).src = '/i/star_nok.png';
    xmldoc=originalRequest.responseXML;
    div_map=$('map');
    div_map.style.width='750px'; 
    div_map.style.height='500px';
    element=xmldoc.getElementsByTagName('root').item(0);
    longitude=element.getElementsByTagName('longitude').item(0).firstChild.nodeValue;
    latitude=element.getElementsByTagName('latitude').item(0).firstChild.nodeValue;
    zoom=element.getElementsByTagName('zoom').item(0).firstChild.nodeValue;
    id=element.getElementsByTagName('id').item(0).firstChild.nodeValue;
    map=loadMap($("map"),parseFloat(latitude),parseFloat(longitude), parseFloat(zoom));
    markers=element.getElementsByTagName('parcours').item(0);
    marker=element.getElementsByTagName('markers').item(0);
    markerlist=marker.getElementsByTagName('marker');
    points=new Array();
    bounds = new GLatLngBounds();
    for (var i = 0; i < markerlist.length; i++) {
        lat=markerlist.item(i).getAttribute("lat");
        lng=markerlist.item(i).getAttribute("lng");
        np=new GPoint(lat,lng);
        if (i==0) depart=new GPoint(lat,lng);
        if (i==markerlist.length-1) arrive=new GPoint(lat,lng);
        points.push(np);
        bounds.extend(new GLatLng(lng,lat));
    }
    polyline=new GPolyline(points);
    map.addOverlay(polyline);
    map.addOverlay(createMarkerDepart(depart));
    map.addOverlay(createMarkerArrive(arrive));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setZoom(map.getBoundsZoomLevel(bounds));
    map.setCenter(bounds.getCenter());
    
    pt_kilo=element.getElementsByTagName('point_kilo').item(0);
    point_dist=pt_kilo.getElementsByTagName('points').item(0);
    pointlist=point_dist.getElementsByTagName('point');
    calculDistance(points);
    nbk=1;
    if (mdistance > 23000) nbk=2;
    if (mdistance > 50000) nbk=5;
    if (mdistance > 150000) nbk=10;
    tmp_div=nbk*20*50;
    for (var i = 0; i < pointlist.length; i++) {
        dbor=pointlist.item(i).getAttribute("dist");
        if (dbor%tmp_div==0 && i!=0)
        {
            lat=pointlist.item(i).getAttribute("lat");
            lng=pointlist.item(i).getAttribute("lng");
            np=new GPoint(lng,lat);
            map.addOverlay(createMarkerBorne(np,dbor/tmp_div*nbk));
            //map.addOverlay(createMarkerDepart(np));
        }
    }
    notereset();
}
function readUserResponse(originalRequest)
{
    endLoading();
    var myAjax = new Ajax.Updater(
        'menu_user',
        '/includes/menu.inc.php',
        {
            method: 'get',
            parameters: 'isajax=1'
        });
    readMessageResponse(originalRequest);
}
function readPays()
{
    var url = '/xml/xml_pays.php';
    var pars = 'isajax=1';
    beginLoading();
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: makeListPays
        });
}
function makeListPays(originalRequest)
{
    endLoading();
    xmldoc=originalRequest.responseXML;
    div_pays=$('list_pays');
    select = document.createElement('select');
    select.id='select_pays';
    select.onchange = function() 
    { 
        readRegion($F('select_pays'));
    };
    div_pays.appendChild(select);
    select.options[0] = new Option('Choisir le pays',0);
    for(i=0;i<xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('pays').length;i++)
    {
        element=xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('pays').item(i);
        name=element.firstChild.nodeValue;
        value=element.getAttribute("id");
        select.options[i+1] = new Option(name,value);
    }
}
function readRegion(pays)
{
    var url = '/xml/xml_region.php';
    var pars = 'isajax=1&pays='+pays;
    beginLoading();
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: makeListRegion
        });
}
function makeListRegion(originalRequest)
{
    endLoading();
    xmldoc=originalRequest.responseXML;
    div_region=$('list_pays');
    select = document.createElement('select');
    select.id='select_region';
    select.onchange = function() 
    { 
        readDepartement($F('select_region'));
    };
    div_region.appendChild(select);
    select.options[0] = new Option('Choisir la region',0);
    for(i=0;i<xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('region').length;i++)
    {
        element=xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('region').item(i);
        name=element.firstChild.nodeValue;
        value=element.getAttribute("id");
        select.options[i+1] = new Option(name,value);
    }
}
function readDepartement(region)
{
    var url = '/xml/xml_departement.php';
    var pars = 'isajax=1&region='+region;
    beginLoading();
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: makeListDepartement
        });
}
function makeListDepartement(originalRequest)
{
    endLoading();
    xmldoc=originalRequest.responseXML;
    div_region=$('list_pays');
    if ($('select_ville')!=null) div_region.removeChild($('select_ville'));
    if ($('select_departement')!=null) div_region.removeChild($('select_departement'));
    select = document.createElement('select');
    select.id='select_departement';
    select.onchange = function() 
    { 
        readVille($F('select_departement'));
    };
    div_region.appendChild(select);
    select.options[0] = new Option('Choisir le departement',0);
    for(i=0;i<xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('departement').length;i++)
    {
        element=xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('departement').item(i);
        name=element.firstChild.nodeValue;
        value=element.getAttribute("id");
        select.options[i+1] = new Option(name,value);
    }
}
function readVille(departement)
{
    var url = '/xml/xml_ville.php';
    var pars = 'isajax=1&departement='+departement;
    beginLoading();
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: makeListVille
        });
}
function makeListVille(originalRequest)
{
    endLoading();
    xmldoc=originalRequest.responseXML;
    div_region=$('list_pays');
    if ($('select_ville')!=null) div_region.removeChild($('select_ville'));
    select = document.createElement('select');
    select.id='select_ville';
    select.onchange = function() 
    { 
        readDataVille($F('select_ville'));
    };
    div_region.appendChild(select);
    select.options[0] = new Option('Choisir la ville',0);
    for(i=0;i<xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('ville').length;i++)
    {
        element=xmldoc.getElementsByTagName('root').item(0).getElementsByTagName('ville').item(i);
        name=element.firstChild.nodeValue;
        value=element.getAttribute("id");
        select.options[i+1] = new Option(name,value);
    }
}
function readToVille(id_ville)
{
    var url = '/view/depart_ville.php';
    ville=id_ville;
    var pars = 'isajax=1&ville='+ville;
    beginLoading();
    var myAjax = new Ajax.Updater(
        'page_content',
        url,
        {
            parameters: pars,
            method: 'get',
            onComplete: readDataVille
        });
}
function readDataVille(id_ville)
{
    var url = '/xml/xml_data_ville.php';
    ville=id_ville;
    if (typeof(ville)=='object')
    {
        ville=$F('id_ville');
    }
    var pars = 'isajax=1&ville='+ville;
    beginLoading();
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: loadMapVille
        });
}
function loadMapVille(originalRequest)
{
    endLoading();
    points=new Array();
    xmldoc=originalRequest.responseXML;
    element=xmldoc.getElementsByTagName('ville').item(0); 
    latitude=element.getElementsByTagName('latitude').item(0).firstChild.nodeValue; 
    longitude=element.getElementsByTagName('longitude').item(0).firstChild.nodeValue;
    ville=element.getElementsByTagName('id').item(0).firstChild.nodeValue;
    map=loadMap($("map"),latitude,longitude,14);
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
}
var points = [];
var polyline;
var map;
function loadMap(div_map,latitude,longitude,zoom) {
    if (!zoom) zoom=16;
    if (GBrowserIsCompatible()) {
        map = new GMap2(div_map);
        map.setCenter(new GLatLng(latitude,longitude), zoom);
        GEvent.addListener(map, "click", function(marker, point) {
                if (marker) {
                    point=marker.getPoint();
                    map.removeOverlay(marker);
                    unset=false;
                    for(i=0;i<points.length;i++)
                    {
                        pointc=points[i];
                        if (point.x==pointc.x && point.y==pointc.y)
                        {
                            unset=i;
                        }
                    }
                    if (unset!==false)
                    {
                        var points2 = [];
                        for(i=0;i<points.length;i++)
                        {
                            if (i!=unset) points2.push(points[i]);
                        }
                        points=points2;
                    }
                } else {
                    map.addOverlay(new GMarker(point));
                    points.push(point);
                }
                map.removeOverlay(polyline);
                polyline=new GPolyline(points);
                map.addOverlay(polyline);
                calculDistance(points);
        });
    } else { alert("Probleme de compatibilite de navigateur");}
    $('tools_parcours').style.display='inline';
    return map;
}
function saveParcours()
{
    if (points.length < 2) 
    {
        alert('vous devez avoir au moins 2 points pour définir un parcours');
        return false;
    }
    nom="";
    while(nom.length==0)
    {
        nom = prompt("Veuillez donner un nom a ce parcours :");
    }
    str='<parcours>';
    str+='<center>';
    glatlong=map.getCenter();
    str+='<marker lat="'+glatlong.y+'" lng="'+glatlong.x+'"/>';
    str+='</center>';
    str+='<distance>';
    str+=mdistance;
    str+='</distance>';
    str+='<zoom>'+map.getZoom()+'</zoom>';
    str+='<markers>';
    for(i=0;i<points.length;i++)
    {
        str+='<marker lat="'+points[i].x+'" lng="'+points[i].y+'"/>';
    }
    str+='</markers>';
    str+='<ville>';
    str+=ville;
    str+='</ville>';
    str+='<nom>';
    str+=nom;
    str+='</nom>';
    str+='</parcours>';
    var url = '/xml/save_parcours.php';
    var pars = 'xml_data='+myEncodeUri(str)+'&isajax=1';
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}
function saveDepart(ville)
{
    var url = '/xml/save_depart.php';
    var pars = 'isajax=1&id_ville='+ville;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31;
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30;}
		if (i==2) {this[i] = 29;}
   } 
   return this;
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strDay=dtStr.substring(0,pos1);
	var strMonth=dtStr.substring(pos1+1,pos2);
	var strYear=dtStr.substring(pos2+1);
	strYr=strYear;
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1);
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1);
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1);
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (pos1==-1 || pos2==-1){
		alert("Verifier le format : jj/mm/aaaa");
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("Le mois n'est pas valide");
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("le jour n'est pas valide");
		return false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("L'ann&eacute;e doit etre compris entre "+minYear+" et "+maxYear);
		return false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("Entrer une date valide");
		return false;
	}
    return true;
}

function saveBasket(basket)
{
    date='';
    while(date.length==0)
    {
        date = prompt("Date d'achat des chaussures (par exemple : 23/08/2006) :");
        if (!isDate(date)) date='';
    }
    
        
    var url = '/xml/save_basket.php';
    var pars = 'isajax=1&basket='+basket+'&date='+date;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function deleteBasket(id)
{
    var url = '/xml/delete_basket.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function saveContact(id)
{
    var url = '/xml/save_contact.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function deleteContact(id)
{
    var url = '/xml/delete_contact.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function deleteParcours(id)
{
    var url = '/xml/delete_parcours.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function renameParcours(id)
{
    nom="";
    while(nom.length==0)
    {
        nom = prompt("Renommer le parcours :");
    }
    var url = '/xml/rename_parcours.php';
    var pars = 'isajax=1&id='+id+'&name='+nom;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}


function deleteEntrainement(id)
{
    var url = '/xml/delete_entrainement.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function deleteMessage(id)
{
    var url = '/xml/delete_message.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'get',
            parameters: pars,
            onComplete: reloadMessageBox
        });
}
function reloadMessageBox(request)
{
  readMessageResponse(request)
  readListMessage('dest','1');
}

function showBoxMessage(id)
{
    var url = '/view/view_message.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Updater(
        'page_content',
        url,
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function answerMessage(id)
{
    var url = '/view/new_message.php';
    var pars = 'isajax=1&id='+id;
    var myAjax = new Ajax.Updater(
        'page_content',
        url,
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function sendMessage(dest,name,title,content)
{
    if (dest.length==0)
    {
        alert('Veuillez choisir un destinataire.');
        return;
    }
    if (title.length==0)
    {
        alert('Veuillez mettre un sujet a votre message.');
        return;
    }
    if (content.length==0)
    {
        alert('Veuillez remplir votre message.');
        return;
    }
    str='<message>';
    str+='<contenu><![CDATA[';
    str+=content;
    str+=']]></contenu>';
    str+='<sujet><![CDATA[';
    str+=title;
    str+=']]></sujet>';
    str+='<userid>';
    str+=dest;
    str+='</userid>';
    str+='<name>';
    str+=name;
    str+='</name>';
    str+='</message>';
    
    var url = '/xml/save_message.php';
    var pars = 'isajax=1&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
      {
        method: 'post',
        parameters: pars,
        onComplete: readRetourMessage
      });
}

function readRetourMessage(request)
{
  readMessageResponse(request)
  readListMessage('send','1');
}


function savePerformance(id)
{
    if ($F('temps_heure').length==0 || $F('temps_minute').length==0 || $F('temps_seconde').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    if ($F('depart_annee').length==0 || $F('depart_mois').length==0 || $F('depart_jour').length==0 || $F('depart_heure').length==0 || $F('depart_minute').length==0 || $F('depart_seconde').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    if ($F('puls_min').length==0 || $F('puls_avg').length==0 || $F('puls_max').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    if (isNaN($F('temps_heure')) || isNaN($F('temps_minute')) || isNaN($F('temps_seconde')))
    {
        alert('Erreur sur le temps. vous devez remplir toutes les elements avec des chiffres');
        return;
    }
    if (isNaN($F('depart_annee')) || isNaN($F('depart_mois')) || isNaN($F('depart_jour')) || isNaN($F('depart_heure')) || isNaN($F('depart_minute')) || isNaN($F('depart_seconde')))
    {
        alert('Erreur sur la date de depart. vous devez remplir toutes les elements avec des chiffres.');
        return;
    }
    if (isNaN($F('puls_min')) || isNaN($F('puls_avg')) || isNaN($F('puls_max')))
    {
        alert('Erreur sur les pulsations cardiaques. vous devez remplir toutes les elements avec des chiffres.');
        return;
    }
    str='<performance>';
    str+='<temps>';
    str+=(parseInt($F('temps_heure'))*3600+parseInt($F('temps_minute'))*60+parseInt($F('temps_seconde')));
    str+='</temps>';
    str+='<depart>';
    str+=$F('depart_annee')+'-'+$F('depart_mois')+'-'+$F('depart_jour')+' '+$F('depart_heure')+':'+$F('depart_minute')+':'+$F('depart_seconde');
    str+='</depart>';
    str+='<type>'+$F('type_performance')+'</type>';
    str+='<puls_min>'+$F('puls_min')+'</puls_min>';
    str+='<puls_avg>'+$F('puls_avg')+'</puls_avg>';
    str+='<puls_max>'+$F('puls_max')+'</puls_max>';
    str+='<nb_tours>'+$F('nb_tours')+'</nb_tours>';
    str+='<parcours>'+$F('id_performance_parcours')+'</parcours>';
    str+='<basket>'+$F('basket')+'</basket>';
    str+='</performance>';
    
    var url = '/xml/save_performance.php';
    var pars='isajax=1&update='+id+'&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}
function saveProfil()
{
    if ($F('nom').length==0 || $F('prenom').length==0 || $F('pseudo').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    
    if ($F('pseudo').search(/^[0-9A-Za-z]+$/) == -1)
    {
        alert("Votre pseudo ne doit pas contenir de caracteres speciaux");
	return ;
    }
    if ($F('prenom').search(/^[A-Za-z0-9-\s]+$/) == -1)
    {
        alert("Votre prenom ne doit pas contenir de caracteres speciaux");
	return;
    }
    if ($F('nom').search(/^[A-Za-z0-9-\s]+$/) == -1)
    {
        alert("Votre nom ne doit pas contenir de caracteres speciaux");
	return;
    } 
    str='<profil>';
    str+='<fname>';
    str+=$F('prenom');
    str+='</fname>';
    str+='<lname>';
    str+=$F('nom');
    str+='</lname>';
    str+='<pseudo>';
    str+=$F('pseudo');
    str+='</pseudo>';
    str+='</profil>';
    
    var url = '/xml/save_profil.php';
    var pars = 'isajax=1&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}
function saveComment()
{
    if ($F('commentaire').length==0)
    {
        alert('Vous devez mettre un commentaire');
        return;
    }
    str='<comment>';
    str+='<commentaire><![CDATA[';
    str+=str_replace("'"," ",str_replace("?"," ",$F('commentaire')));
    str+=']]></commentaire>';
    str+='<key>';
    str+=$F('key_comment');
    str+='</key>';
    str+='<id_key>';
    str+=$F('id_comment');
    str+='</id_key>';
    str+='</comment>';
        
    var url = '/xml/save_comments.php';
    var pars = 'isajax=1&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readRetourComment
        });
}

function readRetourComment(request)
{
  readMessageResponse(request)
  loadCommentaires($F('id_comment'),$F('key_comment'));
}

function loadCommentaires(id,key_d)
{
    var pars = 'isajax=1&id='+id+'&key_d='+key_d;
    beginLoading();
    var myAjax = new Ajax.Updater(
        'commentaires',
        '/view/commentaires.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function loadNote(id,key_d)
{
    var pars = 'isajax=1&id='+id+'&key_d='+key_d;
    beginLoading();
    var myAjax = new Ajax.Updater(
        'star',
        '/view/notes.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function viewWiki(id,key_d,current_id)
{
    if (current_id==undefined) current_id='';
    var pars = 'isajax=1&id='+id+'&key_d='+key_d+'&view=normal&current_id='+current_id;
    beginLoading();
    var myAjax = new Ajax.Updater(
        'wiki',
        '/view/wiki.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function viewHistoWiki(id,key_d)
{
    var pars = 'isajax=1&id='+id+'&key_d='+key_d+'&view=histo';
    beginLoading();
    var myAjax = new Ajax.Updater(
        'wiki',
        '/view/wiki.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function modifyWiki(id,key_d)
{
    var pars = 'isajax=1&id='+id+'&key_d='+key_d+'&view=modify';
    beginLoading();
    var myAjax = new Ajax.Updater(
        'wiki',
        '/view/wiki.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function saveWiki()
{
    if ($F('contenu_wiki').length==0)
    {
        alert('Vous devez mettre un contenu');
        return;
    }
    
    str='<wiki>';
    str+='<contenu><![CDATA[';
    str+=$F('contenu_wiki');
    str+=']]></contenu>';
    str+='<key>';
    str+=$F('key_wiki');
    str+='</key>';
    str+='<id_key>';
    str+=$F('id_wiki');
    str+='</id_key>';
    str+='</wiki>';
    
    var url = '/xml/save_wiki.php';
    var pars = 'isajax=1&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readRetourWiki
        });
}

function readRetourWiki(request)
{
  readMessageResponse(request);
  viewWiki($F('id_wiki'),$F('key_wiki'));
}

function changePassword()
{
    if ($F('motpasse1').length==0 || $F('motpasse2').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    if ($F('motpasse1')!=$F('motpasse2'))
    {
        alert('les deux mot de passe ne sont pas identiques');
        return;
    }
    str='<password>';
    str+='<motpasse>';
    str+=$F('motpasse1');
    str+='</motpasse>';
    str+='</password>';
    
    var url = '/xml/change_pass.php';
    var pars = 'isajax=1&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}


function sendInvitation()
{
    if ($F('email').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    str='<invitation>';
    str+='<email>';
    str+=$F('email');
    str+='</email>';
    str+='</invitation>';
    
    var url = '/xml/send_invit.php';
    var pars = 'isajax=1&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}
function saveTag(tag,key,id)
{
    if (tag.length==0)
    {
        alert('Vous devez remplir le contenu du tags');
        return;
    }
    
    var url = '/xml/save_tag.php';
    var pars = 'isajax=1&tag='+myEncodeUri(tag)+'&key='+key+'&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
                   onComplete: readRetourTag
        });
}

function addVin(appelation,region,pays)
{
    nom="";
    while(nom.length==0)
    {
        nom = prompt("Veuillez donner un nom a ce vin :");
    }
    str='<vin>';
    str+='<ind_appellation>';
    str+=appelation;
    str+='</ind_appellation>';
    
    str+='<region>';
    str+=region;
    str+='</region>';
    
    str+='<pays>';
    str+=pays;
    str+='</pays>';
    
    str+='<nom>';
    str+=nom;
    str+='</nom>';

    str+='</vin>';
    
    var url = '/xml/add_vin.php';
    var pars = 'xml_data='+myEncodeUri(str)+'&isajax=1';
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function addMillesime(id_vin)
{
    nom="";
    annee="";
    if (nom.length==0)
    {
        nom = prompt("Vous pouvez donner un nom a ce millesime (cuvee prestige, 1er grand cru,...) :");
    }
    
    while (annee.length==0)
    {
        annee = prompt("Veuillez indiquer l'annee du millésime :");
    }
    
    while (annee.length==0 && parseInt(annee)=="NaN") {
      annee = prompt("Veuillez indiquer un chiffre pour l'annee du millésime :");
    }
    str='<millesime>';
    str+='<annee>';
    str+=annee;
    str+='</annee>';
    
    str+='<vin>';
    str+=id_vin;
    str+='</vin>';
    
    str+='<nom>';
    str+=nom;
    str+='</nom>';

    str+='</millesime>';
    
    var url = '/xml/add_millesime.php';
    var pars = 'xml_data='+myEncodeUri(str)+'&isajax=1';
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function readRetourTag(request)
{
  readMessageResponse(request)
  loadTag($F('id_tag'),$F('key_tag'));
}


function loadTag(id,key_d)
{
    var pars = 'isajax=1&id='+id+'&key_d='+key_d;
    beginLoading();
    var myAjax = new Ajax.Updater(
        'tags',
        '/view/tags.php',
        {
            parameters: pars,
            method: 'get',
            onComplete: endLoading
        });
}

function note_xml(key,id,note)
{
    var url = '/xml/note.php';
    var pars = 'isajax=1&key='+key+'&note='+note+'&id='+id;
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readRetourNote
        });
}
function readRetourNote(request)
{
  readMessageResponse(request)
  //loadNote($F('id_note'),$F('key_note'));
}

function readMessageResponse(request)
{
    xmldoc=request.responseXML;
    element=xmldoc.getElementsByTagName('response').item(0);
    if (element.getElementsByTagName('redirect').length!=0)
    {
        if (element.getElementsByTagName('redirect').item(0).firstChild.nodeValue!=null)
        {
            if (element.getElementsByTagName('redirect').item(0).firstChild.nodeValue.length>0)
            {
                doRedirect(element.getElementsByTagName('redirect').item(0).firstChild.nodeValue);
            }
        }
    }
    if (element.getElementsByTagName('message').length!=0)
    {
        if (element.getElementsByTagName('message').item(0).firstChild.nodeValue!=null)
        {
            if (element.getElementsByTagName('message').item(0).firstChild.nodeValue.length>0)
            {
                showMessage(element.getElementsByTagName('message').item(0).firstChild.nodeValue);
                return ;
            }
        }
    }
    else if (element.getElementsByTagName('error').length!=0)
    {
        if (element.getElementsByTagName('error').item(0).firstChild.nodeValue!=null)
        {
            if (element.getElementsByTagName('error').item(0).firstChild.nodeValue.length>0)
            {
                showError(element.getElementsByTagName('error').item(0).firstChild.nodeValue);
                return ;
            }
        }
    }
}

function createAccount()
{
    if ($F('nom').length==0 || $F('prenom').length==0 || $F('pseudo').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    if ($F('motpasse1').length==0 || $F('motpasse2').length==0)
    {
        alert('Vous devez remplir toutes les elements.');
        return;
    }
    if ($F('motpasse1')!=$F('motpasse2'))
    {
        alert('les deux mot de passe ne sont pas identiques');
        return;
    }
    if ($F('pseudo').search(/^[0-9A-Za-z-\s]+$/) == -1)
    {
        alert("Votre pseudo ne doit pas contenir de caracteres speciaux");
	return;
    }
    if ($F('prenom').search(/^[0-9A-Za-z-\s]+$/) == -1)
    {
        alert("Votre prenom ne doit pas contenir de caracteres speciaux");
	return;
    }
    if ($F('nom').search(/^[0-9A-Za-z-\s]+$/) == -1)
    {
        alert("Votre nom ne doit pas contenir de caracteres speciaux");
	return;
    }

    str='<profil>';
    str+='<fname>';
    str+=$F('prenom');
    str+='</fname>';
    str+='<lname>';
    str+=$F('nom');
    str+='</lname>';
    str+='<pseudo>';
    str+=$F('pseudo');
    str+='</pseudo>';
    str+='<motpasse>';
    str+=$F('motpasse1');
    str+='</motpasse>';
    str+='</profil>';
    
    var url = '/xml/create_profil.php';
    var pars = 'isajax=1&hash='+$F('hash')+'&email='+$F('email')+'&xml_data='+myEncodeUri(str);
    var myAjax = new Ajax.Request(url,
        {
            method: 'post',
            parameters: pars,
            onComplete: readMessageResponse
        });
}

function showMessage(text)
{
    $('div_message').innerHTML=text;
    $('div_message').style.visibility='visible';
    setTimeout('hideMessage()',3000);
}
function hideMessage()
{
    $('div_message').style.visibility='hidden';
}
function showError(text)
{
    $('div_erreur').innerHTML=text;
    $('div_erreur').style.visibility='visible';
    setTimeout('hideError()',3000);
}
function hideError()
{
    $('div_erreur').style.visibility='hidden';
}
function doRedirect(text)
{
    setTimeout('doRedirectNow(\''+text+'\')',3000);
}
function doRedirectNow(url)
{
    location.href = url;
}

