var expd = new Date();
expd.setTime(expd.getTime() + 15*60*1000);

function Store(date,nights){
  var val = date.getFullYear() +"-"+ date.getMonth() +"-"+ date.getDate() +"-"+ nights;
  val = Base64Encode(val);
  SetCookie("HSRD",val,expd);
}
function Restore(){
 var s =  GetCookie("HSRD");
 if ( !s ) {
   setInit(today,true);
   setNights(0,true);
   setFin(today,true);
   return;
 }
 s=Base64Decode(s);
 var aux1 = s.split("-");
 if (aux1[3]){
   var _nights=aux1[3];
   var _date=new Date(aux1[0],aux1[1],aux1[2],0,0,0);
   setInit(_date,true);
   setNights(_nights,true);
 }
}


function getMonthNumber(m){
 var c= m.toUpperCase();
 for(var i =0; i < arr_months.length; i++) if (arr_months[i].toUpperCase() == c) return(i);
}
function getWeekStart(){
  return n_weekstart;
}
function getWeekDays(){
  return week_days;
}
function getFullMonth(i){
  return full_arr_months[i];
}
function getMonth(i){
  return arr_months[i];
}
function getWeekDay(i){
  return week_days[i];
}

function calendarwrapper(){ 
   calendar.setassign(this);
   this.setDatefromCalendar = calendarwrapper_setDatefromCalendar;
   this.ShowCalendar = calendarwrapper_ShowCalendar;
}
function calendarwrapper_ShowCalendar(type){
 try {
  var checkin=getInit();
  var checkout=getFin();
  if (!checkin || !checkout) {
     alert("!checkin || !checkout" + checkin + " " + checkout);
     return;
  }
 } catch (e) {
    alert("checkin o checkout calendarwrapper_ShowCalendar(" + type + ") " + e);
 } 
 if (type == 'init') {
    calendar.select('initDate','initdate',[checkinTxt,checkin] ,[checkoutTxt,checkout]);
 }
 if (type == 'initfrom') {
    calendar.select('initDate','initdate',[checkFromTxt,checkin] ,[checkToTxt,checkout]);
 }  
 if (type == 'fin') {
    calendar.select('endDate','enddate',[checkoutTxt,checkout] ,[checkoutTxt,checkin]);
 }
 if (type == 'finto') {
    calendar.select('endDate','enddate',[checkToTxt,checkout] ,[checkFromTxt,checkin]);
 }  
}

function calendarwrapper_setDatefromCalendar(date,select){
   if (select=='initDate') {
        setInit(date);
        var fin =getFin();
        if (fin < date ) {
           setFin(date);
           setNights(0);
        } else {
           setNights(getNights(date,fin));
           setFin(fin);
        }
        writetoId('initdate','&nbsp;',document);   
   }     
   else {
        setFin(date);
        var ini= getInit();
        if ( date < ini ) {
           setInit(date);
           setNights(0);
        } else {
           setNights(getNights(ini,date));
        }
        writetoId('enddate','&nbsp;',document);
   }     
}    

function ChangeSelect (select){
   if (select=='initDate')
        var date=getInit();
   else if (select=='endDate' || select=='nights' )
        var date=getFin();  
   calendarwrapper_setDatefromCalendar(date,select);
}

function str2dt (str_datetime) {
 var aux1 = str_datetime.split(":");
 var aux2 = aux1[0].split(dsymbol);
 if (aux2[2]) {
   if (aux1[3]) return (new Date (aux2[yp],aux2[mp]-1,aux2[dp],aux1[1],aux1[2],aux1[3]) );
   else         return (new Date (aux2[yp],aux2[mp]-1,aux2[dp],0,0,0) );
 } else  return alert("Invalid Datetime format: "+ str_datetime);
}

function dt2dtstr (dt_datetime) {
 var ret =      ( yp==0 ? dt_datetime.getFullYear() : mp == 0 ? dt_datetime.getMonth() : dt_datetime.getDate()) ;
 ret += dsymbol+( yp==1 ? dt_datetime.getFullYear() : mp == 1 ? dt_datetime.getMonth() : dt_datetime.getDate()) ;
 ret += dsymbol+( yp==2 ? dt_datetime.getFullYear() : mp == 2 ? dt_datetime.getMonth() : dt_datetime.getDate()) ;
 return ret;
}

function dt2tmstr (dt_datetime) {
 return ( "" + dt_datetime.getHours() +":"+ dt_datetime.getMinutes() +":"+ dt_datetime.getSeconds());
}

function dt2fullstr(d){
  var h=fullformat;
  var h=h.replace(/dd/,d.getDate());
  var h=h.replace(/yyyy/,d.getFullYear());
  var h=h.replace(/yy/,d.getYear());
  var h=h.replace(/MMMM/,getFullMonth(d.getMonth()));
  var h=h.replace(/MMM/,getMonth(d.getMonth()));
  var h=h.replace(/MM/,d.getMonth());
  return h;
}

function getNights(d1,d2){
    var day = 3600*24*1000;
    var diference = (d2 - d1);
    return Math.round(diference/day);
} 

function setInit(d,t){
  setValueByName(calendar_document,'initDay',d.getDate());
  setValueByName(calendar_document,'Day',d.getDate());
  setValueByName(calendar_document,'initMonth',d.getMonth());
  setValueByName(calendar_document,'Month',d.getMonth());
  setValueByName(calendar_document,'initYear',d.getFullYear());
  setValueByName(calendar_document,'Year',d.getFullYear());
  writetoId('initweekdaytxt',getWeekDay(d.getDay()),calendar_document) ;
  writetoId('weekdaytxt',getWeekDay(d.getDay()),calendar_document) ;
  setValueByName(calendar_document,'initDateTxt',dt2dtstr(d));
  setValueByName(calendar_document,'DateTxt',dt2dtstr(d));
  writetoId('initdatefull',dt2fullstr(d),calendar_document) ;
  writetoId('datefull',dt2fullstr(d),calendar_document) ;
  if (!t) Store(d,getNights(d,getFin()));
}

function setNights(n,t){
  writetoId('nightstxt', n, calendar_document);
  writetoId('daystxt', n+1, calendar_document);
  setValueByName(calendar_document,'nights', n);
  if (!t) Store(getInit(),n);
}

function getInit(){
  var m=getValueByName(calendar_document,'initMonth');
  var t=getValueByName(calendar_document,'initDateTxt');
  if ( m ) {
    var d=getValueByName(calendar_document,'initDay');
    var y=getValueByName(calendar_document,'initYear');
    return new Date(y,m,d);
  } else if (t) {
    var dat= str2dt (t);
    return dat;
  } else {
    alert("No se ha definido initMonth, initDay, initYear o initDateTxt");
  } 
}
function setFin(d){
  setValueByName(calendar_document,'endDay',d.getDate());
  setValueByName(calendar_document,'endMonth',d.getMonth());
  setValueByName(calendar_document,'endYear',d.getFullYear());
  writetoId('endweekdaytxt',getWeekDay(d.getDay()),calendar_document);
  setValueByName(calendar_document,'endDateTxt',dt2dtstr(d));
  writetoId('enddatefull',dt2fullstr(d),calendar_document) ;
  
}
function getFin(){
  var m=getValueByName(calendar_document,'endMonth');
  var t=getValueByName(calendar_document,'endDateTxt');
  var n=getValueByName(calendar_document,'nights');
  if ( m ) {
    var d=getValueByName(calendar_document,'endDay');
    var y=getValueByName(calendar_document,'endYear');
    return new Date(y,m,d);
  } else if (t) {
    var dat= str2dt (t);
    return dat;
  } else if (n) {
    var fin = getInit();
    fin.setDate(fin.getDate() + parseInt(n));
    return fin;
  } else {
    alert("No se ha definido endMonth, endDay, endYear o endDateTxt o nights");
  } 
}
// Aux func to Base64Encode
function base64ToAscii(c)
{
	var theChar = 0;
	if (0 <= c && c <= 25) theChar = String.fromCharCode(c + 65);
	else if (26 <= c && c <= 51) theChar = String.fromCharCode(c - 26 + 97);
	else if (52 <= c && c <= 61) theChar = String.fromCharCode(c - 52 + 48);
	else if (c == 62) theChar = '+';
	else if( c == 63 ) theChar = '/';
	else theChar = String.fromCharCode(0xFF);
	return theChar;
}

// Converts each character to %xx, not only "-/?&..."
function Base64Encode(str) {
	var result = "";
	var i = 0;
	var sextet = 0;
	var leftovers = 0;
	var octet = 0;
	for (i=0; i < str.length; i++) {
		octet = str.charCodeAt(i);
		switch( i % 3 )	{
			case 0:	sextet = ( octet & 0xFC ) >> 2;	leftovers = octet & 0x03; break;
			case 1: sextet = ( leftovers << 4 ) | ( ( octet & 0xF0 ) >> 4 ); leftovers = octet & 0x0F;	break;
			case 2: sextet = ( leftovers << 2 ) | ( ( octet & 0xC0 ) >> 6 ); leftovers = ( octet & 0x3F ); break;
		}
		result = result + base64ToAscii(sextet);
		if( (i % 3) == 2 ) result = result + base64ToAscii(leftovers);
	}
	switch( str.length % 3 ) {
		case 0:	break ;
		case 1: leftovers =  leftovers << 4; result = result + base64ToAscii(leftovers); result = result + "=="; break;
		case 2: leftovers = leftovers << 2; result = result + base64ToAscii(leftovers); result = result + "="; break ;
	}
	return result;
}

// return int 0-15, args '0'-'F'
function hexval(c) {
	if (String('0').charCodeAt(0) <= c && c <= String('9').charCodeAt(0))
		return c - String('0').charCodeAt(0);
	if (String('A').charCodeAt(0) <= c && c <= String('F').charCodeAt(0))
		return c - String('A').charCodeAt(0) + 10;
	if (String('a').charCodeAt(0) <= c && c <= String('f').charCodeAt(0))
		return c - String('a').charCodeAt(0) + 10;
	return 0;
}

// Inverts Base64Encode
function Base64Decode(str, is_binary) {
	var result = "";
	var i = 0;
	var x;
	var shiftreg = 0;
	var count = -1;
	for (i=0; i < str.length; i++) {
		c = str.charAt(i);
		if ('A' <= c && c <= 'Z') x = str.charCodeAt(i) - 65;
		else if ('a' <= c && c <= 'z') x = str.charCodeAt(i) - 97 + 26;
		else if ('0' <= c && c <= '9') x = str.charCodeAt(i) - 48 + 52;
		else if (c == '+') x = 62;
		else if (c == '/') x = 63;
		else continue;
		count++;
		switch (count % 4) {
			case 0:	shiftreg = x; continue;
			case 1:	v = (shiftreg<<2) | (x >> 4); shiftreg = x & 0x0F; break;
			case 2:	v = (shiftreg<<4) | (x >> 2); shiftreg = x & 0x03; break;
			case 3:	v = (shiftreg<<6) | (x >> 0); shiftreg = x & 0x00; break;
		}
		if (!is_binary && (v < 32 || v > 126) && (v != 0x0d) && (v != 0x0a)) {
			result = result + "<";
			result = result + "0123456789ABCDEF".charAt((v/16)&0x0F);
			result = result + "0123456789ABCDEF".charAt((v/1)&0x0F);
			result = result + ">";
		}
		else result = result + String.fromCharCode(v);
	}
	return result.toString();
}

