/*  Copyright Mihai Bazon, 2002, 2003  |  http://dynarch.com/mishoo/
 * ---------------------------------------------------------------------------
 *
 * The DHTML Calendar
 *
 * Details and latest version at:
 * http://dynarch.com/mishoo/calendar.epl
 *
 * This script is distributed under the GNU Lesser General Public License.
 * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
 *
 * This file defines helper functions for setting up the calendar.  They are
 * intended to help non-programmers get a working calendar on their site
 * quickly.  This script should not be seen as part of the calendar.  It just
 * shows you what one can do with the calendar, while in the same time
 * providing a quick and simple method for setting it up.  If you need
 * exhaustive customization of the calendar creation process feel free to
 * modify this code to suit your needs (this is recommended and much better
 * than modifying calendar.js itself).
 */

// $Id: calendar-setup.js,v 1.25 2005/03/07 09:51:33 mishoo Exp $

/**
 *  This function "patches" an input field (or other element) to use a calendar
 *  widget for date selection.
 *
 *  The "params" is a single object that can have the following properties:
 *
 *    prop. name   | description
 *  -------------------------------------------------------------------------------------------------
 *   inputField    | the ID of an input field to store the date
 *   displayArea   | the ID of a DIV or other element to show the date
 *   button        | ID of a button or other element that will trigger the calendar
 *   eventName     | event that will trigger the calendar, without the "on" prefix (default: "click")
 *   ifFormat      | date format that will be stored in the input field
 *   daFormat      | the date format that will be used to display the date in displayArea
 *   singleClick   | (true/false) wether the calendar is in single click mode or not (default: true)
 *   firstDay      | numeric: 0 to 6.  "0" means display Sunday first, "1" means display Monday first, etc.
 *   align         | alignment (default: "Br"); if you don't know what's this see the calendar documentation
 *   range         | array with 2 elements.  Default: [1900, 2999] -- the range of years available
 *   weekNumbers   | (true/false) if it's true (default) the calendar will display week numbers
 *   flat          | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID
 *   flatCallback  | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar)
 *   disableFunc   | function that receives a JS Date object and should return true if that date has to be disabled in the calendar
 *   onSelect      | function that gets called when a date is selected.  You don't _have_ to supply this (the default is generally okay)
 *   onClose       | function that gets called when the calendar is closed.  [default]
 *   onUpdate      | function that gets called after the date is updated in the input field.  Receives a reference to the calendar.
 *   date          | the date that the calendar will be initially displayed to
 *   showsTime     | default: false; if true the calendar will include a time selector
 *   timeFormat    | the time format; can be "12" or "24", default is "12"
 *   electric      | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close
 *   step          | configures the step of the years in drop-down boxes; default: 2
 *   position      | configures the calendar absolute position; default: null
 *   cache         | if "true" (but default: "false") it will reuse the same calendar object, where possible
 *   showOthers    | if "true" (but default: "false") it will show days from other months too
 *
 *  None of them is required, they all have default values.  However, if you
 *  pass none of "inputField", "displayArea" or "button" you'll get a warning
 *  saying "nothing to setup".
 */
Calendar.setup = function (params) {
	function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };

	param_default("inputField",     null);
	param_default("displayArea",    null);
	param_default("button",         null);
	param_default("eventName",      "click");
	param_default("ifFormat",       "%Y/%m/%d");
	param_default("daFormat",       "%Y/%m/%d");
	param_default("singleClick",    true);
	param_default("disableFunc",    null);
	param_default("dateStatusFunc", params["disableFunc"]);	// takes precedence if both are defined
	param_default("dateText",       null);
	param_default("firstDay",       null);
	param_default("align",          "Br");
	param_default("range",          [2009,2012]);
	param_default("weekNumbers",    true);
	param_default("flat",           null);
	param_default("flatCallback",   null);
	param_default("onSelect",       null);
	param_default("onClose",        null);
	param_default("onUpdate",       null);
	param_default("date",           null);
	param_default("showsTime",      false);
	param_default("timeFormat",     "24");
	param_default("electric",       true);
	param_default("step",           3);
	param_default("position",       null);
	param_default("cache",          false);
	param_default("showOthers",     false);
	param_default("multiple",       false);

	var tmp = ["inputField", "displayArea", "button"];
	for (var i in tmp) {
		if (typeof params[tmp[i]] == "string") {
			params[tmp[i]] = document.getElementById(params[tmp[i]]);
		}
	}
	if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
		alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");
		return false;
	}

	function onSelect(cal) {
		var p = cal.params;
		var update = (cal.dateClicked || p.electric);
		if (update && p.inputField) {
			p.inputField.value = cal.date.print(p.ifFormat);
			if (typeof p.inputField.onchange == "function")
				p.inputField.onchange();
		}
		if (update && p.displayArea)
			p.displayArea.innerHTML = cal.date.print(p.daFormat);
		if (update && typeof p.onUpdate == "function")
			p.onUpdate(cal);
		if (update && p.flat) {
			if (typeof p.flatCallback == "function")
				p.flatCallback(cal);
		}
		if (update && p.singleClick && cal.dateClicked)
			cal.callCloseHandler();
	};

	if (params.flat != null) {
		if (typeof params.flat == "string")
			params.flat = document.getElementById(params.flat);
		if (!params.flat) {
			alert("Calendar.setup:\n  Flat specified but can't find parent.");
			return false;
		}
		var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
		cal.showsOtherMonths = params.showOthers;
		cal.showsTime = params.showsTime;
		cal.time24 = (params.timeFormat == "24");
		cal.params = params;
		cal.weekNumbers = params.weekNumbers;
		cal.setRange(params.range[0], params.range[1]);
		cal.setDateStatusHandler(params.dateStatusFunc);
		cal.getDateText = params.dateText;
		if (params.ifFormat) {
			cal.setDateFormat(params.ifFormat);
		}
		if (params.inputField && typeof params.inputField.value == "string") {
			cal.parseDate(params.inputField.value);
		}
		//patch http://www.modperl.it/articles/jscalendar/
		               if (params.multiple) {
			                        cal.multiple = {};
			                       for (var i = params.multiple.length; --i >= 0;) {
			                                var d = params.multiple[i];
			                                var ds = d.print("%Y%m%d");
			                                cal.multiple[ds] = d;
			                        }
			               }

		cal.create(params.flat);
		cal.show();
		return false;
	}

	var triggerEl = params.button || params.displayArea || params.inputField;
	triggerEl["on" + params.eventName] = function() {
		var dateEl = params.inputField || params.displayArea;
		var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
		var mustCreate = false;
		var cal = window.calendar;
		//patch http://www.modperl.it/articles/jscalendar/
		if (dateEl && ! params.multiple)
			params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
		if (!(cal && params.cache)) {
			window.calendar = cal = new Calendar(params.firstDay,
							     params.date,
							     params.onSelect || onSelect,
							     params.onClose || function(cal) { cal.hide(); });
			cal.showsTime = params.showsTime;
			cal.time24 = (params.timeFormat == "24");
			cal.weekNumbers = params.weekNumbers;
			mustCreate = true;
		} else {
			if (params.date)
				cal.setDate(params.date);
			cal.hide();
		}
		if (params.multiple) {
			cal.multiple = {};
			for (var i = params.multiple.length; --i >= 0;) {
				var d = params.multiple[i];
				var ds = d.print("%Y%m%d");
				cal.multiple[ds] = d;
			}
		}
		cal.showsOtherMonths = params.showOthers;
		cal.yearStep = params.step;
		cal.setRange(params.range[0], params.range[1]);
		cal.params = params;
		cal.setDateStatusHandler(params.dateStatusFunc);
		cal.getDateText = params.dateText;
		cal.setDateFormat(dateFmt);
		if (mustCreate)
			cal.create();
		cal.refresh();
		if (!params.position)
			cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
		else
			cal.showAt(params.position[0], params.position[1]);
		return false;
	};

	return cal;
};



// this is the actual date status handler.  Note that it receives the
// date object as well as separate values of year, month and date, for
// your confort.
function dateStatusHandler(date, y, m, d) {
    if (dateIsSpecial(y, m, d)) return 'special';
    else return false;
    // return true above if you want to disable other dates
}
// this function returns true if the date is in the past
function dateIsInPast(date) {
    if (date >= today) return false;
    return true;
}

function dateChanged(calendar){
    if (calendar.dateClicked) {

      var el = document.getElementById("output");


	  el.innerHTML = "";

	  // Reset the "MA", in case one triggers the calendar again.
	  // CAREFUL!  You don't want to do "MA = [];".  We need to modify
	  // the value of the current array, instead of creating a new one.
	  // Calendar.setup is called only once! :-)  So be careful.
	  MA.length = 0;

	  // walk the calendar's multiple dates selection hash
	  var old = "";


		
	  var tab_des_semaines=new Array();
	  var x=0;
	  for (var j in calendar.multiple) { 
		  if (j) {
			  var e =  calendar.multiple[j];    		  
			  // we push it in the "MA", in case one triggers the calendar again.
			  if (d){MA[MA.length] = e;}
	    	  tab_des_semaines[x]=cal.multiple[j].print("Semaine %W %Y");
	      }   
		  x++;  	 
	  }
	  
	  // on trie le tableau associatif pour eliminer les doublons par la suite
	  tab_des_semaines.sort();

	  for (var i=0; i<x; i++){
		
	    // sometimes the date is not actually selected, that's why we need to check.
	    if (d) {
	    	var actu=tab_des_semaines[i];            
	        if (actu!=old){
					// OK, selected.  Fill an input field.  Or something.  Just for example,
					// we will display all selected dates in the element having the id "output".
					 el.innerHTML += tab_des_semaines[i] + "\r\n";			
	     	}
	        var old=tab_des_semaines[i];            
	    }
	  }
	
}}

function closed(cal) {

  // here we'll write the output; this is only for example.  You
  // will normally fill an input field or something with the dates.
  var el = document.getElementById("output");


  el.innerHTML = "";

  // Reset the "MA", in case one triggers the calendar again.
  // CAREFUL!  You don't want to do "MA = [];".  We need to modify
  // the value of the current array, instead of creating a new one.
  // Calendar.setup is called only once! :-)  So be careful.
  MA.length = 0;

  // walk the calendar's multiple dates selection hash
  var old = "";


	
  var tab_des_semaines=new Array();
  var x=0;
  for (var j in cal.multiple) { 
	  if (j) {
		  var e =  cal.multiple[j];    		  
		  // we push it in the "MA", in case one triggers the calendar again.
		  if (d){MA[MA.length] = e;}
    	  tab_des_semaines[x]=cal.multiple[j].print("Semaine %W (%B %Y)");
      }   
	  x++;  	 
  }
  
  // on trie le tableau associatif pour eliminer les doublons par la suite
  tab_des_semaines.sort();

  for (var i=0; i<x; i++){
	
    // sometimes the date is not actually selected, that's why we need to check.
    if (d) {
    	var actu=tab_des_semaines[i];            
        if (actu!=old){
				// OK, selected.  Fill an input field.  Or something.  Just for example,
				// we will display all selected dates in the element having the id "output".
				 el.innerHTML += tab_des_semaines[i] + "\r\n";			
     	}
        var old=tab_des_semaines[i];            
    }
  }
  cal.hide();

  return true;
};



function clicEventForWeekOnTextarea(cal) {
	
	var tabWeeks = new Array();
     // reset initial content
	 var el = document.getElementById("output");
	
	 el.innerHTML = "";
	
	  MA.length = 0;

	  // walk the calendar's multiple dates selection hash
	  var old = "";
	  
	  var tab_des_semaines = new Array();
	  var x = 0;
	  for (var j in cal.multiple) { 
		  if (j) { 
			  var e =  cal.multiple[j];    	
			  
			  // we push it in the "MA", in case one triggers the calendar again.
			  if (d){MA[MA.length] = e;}
			  
			  bool=false;
			  
			  for(w=0; w < tabWeeks.length;w++)
			  {
				
				if(tabWeeks[w]==cal.multiple[j].print("%W")+"_"+cal.multiple[j].print("%Y")) {
					var bool=true;
					break;
				}
		  	  }
			
			  if(bool==false) tabWeeks.push(cal.multiple[j].print("%W")+"_"+cal.multiple[j].print("%Y"));
			  //(cal.multiple[j].print("%Y"))
						 
			  // tab_des_semaines[x]=cal.multiple[j].print(trad_semaine_gts+" %W (%B %Y)");
	    	  tab_des_semaines[x] = cal.multiple[j].print(trad_semaine_gts+" %W %Y");
	      }   
		  x++;  	 
	  }
	
	  
	  // on trie le tableau associatif pour eliminer les doublons par la suite
	  tab_des_semaines.sort();
	  cpt_sem_1 = cpt_sem_2="0";
	  for (var i=0; i<x; i++){
		
	    // sometimes the date is not actually selected, that's why we need to check.
	    if (d) {
	    	var actu=tab_des_semaines[i];            
	        if (actu!=old){
					// OK, selected.  Fill an input field.  Or something.  Just for example,
					// we will display all selected dates in the element having the id "output".
					 el.innerHTML += tab_des_semaines[i] + "\r\n";
					 
					 if (tab_des_semaines[i].indexOf("2011","0") == "-1"){
						 //2012  -  price_localite_2
						 cpt_sem_1++;
					 }else{
						 //2010  - price_localite
						 cpt_sem_2++;
					 }
					 
	     	}
	        var old=tab_des_semaines[i];            
	    }
	  }
	  
	  var total_a_payer_old = document.encode.price_total.value;
	
	  /*removeFromTabtoCalendar(cal,"20090526");*/
	  //on calcule le total a payer _ prix de la localite x nb semaine 
	  var compt = parseInt(cpt_sem_1) + parseInt(cpt_sem_2);	 
	  var prix_loc = document.getElementById('price_localite').value;
	  var prix_loc_2 = document.getElementById('price_localite_2').value;
	  
	  
	  var total_a_payer = prix_loc*cpt_sem_2 + prix_loc_2*cpt_sem_1 ;	
	  document.encode.gts_nb_sem.value = compt;
	  document.encode.price_total.value = total_a_payer;

	  addLine(tabWeeks);
	  
	  if (total_a_payer_old!=total_a_payer){document.getElementById('calendar-content').style.display='none';}
	  return true;
}


function deleteGTSFromTab(i,url,offerid,customerid,communeid,site){
	
	if (confirm(trad_delete_gts)){

		var my_gts_type = document.getElementsByName("gts_to_delete_type");
		var my_gts_year = document.getElementsByName("gts_to_delete_year");
		var my_gts_week = document.getElementsByName("gts_to_delete_week");

		if (i!=''){				
						
			var pars = "type="+my_gts_type[i].value+"&commId="+communeid+"&offerid="+offerid+"&year="+my_gts_year[i].value+"&week="+my_gts_week[i].value+"&site="+site;				
			
			var rowgts_to_delete=document.getElementById("tr_gts_"+i);			
			rowgts_to_delete.style.visibility = 'hidden';
			rowgts_to_delete.style.display = 'none';
			
			var myAjax = new Ajax.Updater(
					'placeholder', 
					url, 
					{
						method: 'get',
						parameters: pars,
						onComplete: ok_for_gts_refresh
					}		
			);
		}			
	}	
}

function modifyGTSFromTab(i,url,offerid,customerid,communeid,site){
	
	if (confirm(trad_modify_gts)){
		
		var my_gts_type = document.getElementsByName("gts_to_delete_type");
		var my_gts_year = document.getElementsByName("gts_to_delete_year");
		var my_gts_week = document.getElementsByName("gts_to_delete_week");
		var my_gts_offerid = document.getElementsByName("gts_tableau_otheroffer["+i+"]");
		var my_gts_offerid_selected =my_gts_offerid[0].options[my_gts_offerid[0].selectedIndex].innerHTML;
		
		if (i!=''){				
						
			var pars = "type="+my_gts_type[i].value+"&commId="+communeid+"&offerid="+my_gts_offerid_selected+"&year="+my_gts_year[i].value+"&week="+my_gts_week[i].value+"&site="+site;				
			
			var rowgts_to_delete=document.getElementById("tr_gts_"+i);			
			rowgts_to_delete.style.visibility = 'hidden';
			rowgts_to_delete.style.display = 'none';
			
			var myAjax = new Ajax.Updater(
					'placeholder', 
					url, 
					{
						method: 'get',
						parameters: pars,
						onComplete: ok_for_gts_refresh
					}		
			);
		}		
	}	
}
function ok_for_gts_refresh(){
	reloadCalendarWithType();
	return true;
	
}


//Fonction qui recharge le calendrier gts en cas de changement de localité - ou achat-location-neuf
function reloadCalendarWithType(){

	var id_comm_gts=getElementTextNS("", "id", records[0].getElementsByTagName('localite')[0], [0]);
	var name_comm_gts=getElementTextNS("", "nom", records[0].getElementsByTagName('localite')[0], [0]);
	searchGtsForCalendar(id_comm_gts,name_comm_gts);
}		

function reloadCalendarWithType_keep_price(){
	var id_comm_gts=getElementTextNS("", "id", records[0].getElementsByTagName('localite')[0], [0]);
	var name_comm_gts=getElementTextNS("", "nom", records[0].getElementsByTagName('localite')[0], [0]);
	searchGtsForCalendar(id_comm_gts,name_comm_gts);
}	

function displayGTSPgmtion() {
	var bloc_gts_a_afficher=document.getElementById('bloc_gts_pgm');

	if (bloc_gts_a_afficher.style.display=='block'){
		bloc_gts_a_afficher.style.display='none';
	}else{
		bloc_gts_a_afficher.style.display='block';
	}
	
}


function displayGTSCdar(){
	document.getElementById('calendar-content').style.display='block';
	
}

var m_names = new Array("January", "February", "March", 
		"April", "May", "June", "July", "August", "September", 
		"October", "November", "December");

function Is() {
	agent = navigator.userAgent.toLowerCase();
	this.major = parseInt(navigator.appVersion);
	this.minor = parseFloat(navigator.appVersion);
	this.ns = ((agent.indexOf('mozilla') != -1) &&
	(agent.indexOf('spoofer') == -1) &&
	(agent.indexOf('compatible') == -1) &&
	(agent.indexOf('opera') == -1) &&
	(agent.indexOf('webtv') == -1) &&
	(agent.indexOf('hotjava') == -1));
	this.ns2 = (this.ns && (this.major == 2));
	this.ns3 = (this.ns && (this.major == 3));
	this.ns4 = (this.ns && (this.major == 4));
	this.ns6 = (this.ns && (this.major >= 5));
	this.ie = ((agent.indexOf("msie") != -1) &&
	(agent.indexOf("opera") == -1));
	this.ie3 = (this.ie && (this.major < 4));
	this.ie4 = (this.ie && (this.major == 4) &&
	(agent.indexOf("msie 4") != -1));
	this.ie5 = (this.ie && (this.major == 4) &&
	(agent.indexOf("msie 5.") != -1) &&
	(agent.indexOf("msie 5.5") == -1) &&
	(agent.indexOf("mac") == -1));
	this.iem5 = (this.ie && (this.major == 4) &&
	(agent.indexOf("msie 5.") != -1) &&
	(agent.indexOf("mac") != -1));
	this.ie55 = (this.ie && (this.major == 4) &&
	(agent.indexOf("msie 5.5") != -1));
	this.ie6 = (this.ie && (this.major == 4) &&
	(agent.indexOf("msie 6.") != -1));
	this.ie7 = (this.ie && (this.major == 4) &&
	(agent.indexOf("msie 7.0b") != -1));
	this.nsdom = (this.ns4 || this.ns6);
	this.ie5dom = (this.ie5 || this.iem5 || this.ie55);
	this.iedom = (this.ie4 || this.ie5dom || this.ie6);
	this.w3dom = (this.ns6 || this.ie6 ||this.ie7);
}

function premierlundi(semaine,annee)
{
    // Premier jour de l'année
    premier=new Date(annee,0,1);
    unjour=premier.getDay();
    if(unjour==0){unjour=7;}
    if(unjour>4){premieran=0;}else{premieran=-1;}
   // On crée une date avec les paramètres
   testDate=new Date(annee,0,((semaine+premieran)*7)); 
   // Chercher le jour de la semaine
   jsem=testDate.getDay();
   lundi=new Date(annee,0,((semaine+premieran)*7)+(1-jsem));
   var is = new Is();
   if (is.ie7 || is.ie6 ){ 
	   hack_annee=parseInt(lundi.getYear());
   }else{
	   hack_annee=parseInt(lundi.getYear())+1900;	
	   if (hack_annee>3000){hack_annee=hack_annee-1900;}
   } 
   hack_mois=m_names[(lundi.getMonth())];
   return lundi.getDate()+"th "+hack_mois+" "+hack_annee;
   
}

function dernierdimanche(semaine,annee)
{
    // Premier jour de l'année
    premier=new Date(annee,0,1);
    unjour=premier.getDay();
    if(unjour==0){unjour=7;}
    if(unjour>4){premieran=0;}else{premieran=-1;}
   // On crée une date avec les paramètres
   testDate=new Date(annee,0,((semaine+premieran)*7)); 
   // Chercher le jour de la semaine
   jsem=testDate.getDay(); 
   dimanche=new Date(annee,0,((semaine+premieran)*7)+(7-jsem));
   var is = new Is();
   if (is.ie7 || is.ie6 ){ 
	   hack_annee=parseInt(dimanche.getYear());
   }else{
	   hack_annee=parseInt(dimanche.getYear())+1900;	   
	   if (hack_annee>3000){hack_annee=hack_annee-1900;}
   }
   hack_mois=m_names[(dimanche.getMonth())];
   return dimanche.getDate()+"th "+hack_mois+" "+hack_annee;
}





