/* ######################################################################################################### */
/* # neoCalendar.js																							 */
/* # Autor: Cristian Rodriguez																				 */
/* # Descripción: Calendario multilenguaje configurable														 */
/* ######################################################################################################### */
/* 
	Parámetros 
	callerObj	:	[Requerido] referencia al input de origen-destino
	langID		:	[Opcional] ID de Idioma (1=english  2=spanish 3=portuguese) 
					(si no se suministra usa el default configurado )
	defaultDate	:	[Opcional] Fecha por default.
					(si no se suministra, se utiliza la fecha seteada en el input, de no existir usa fecha actual)
	dateFormat	:	[Opcional] Formato de visualización de la fecha.
					Formatos válidos:	dd/mm/aaaa	dd-mm-aaaa
										mm/dd/aaaa	mm-dd-aaaa
										d/m/aaaa		d-m-aaaa
										m/d/aaaa		m-d-aaaa
					(Si no se suministra usa el formato por default del idioma por default)
	dateAvailable:	[Opcional] En true permite clickear el dia seleccionado por defecto. Por default esta en true
*/										
/* ######################################################################################################### */



/*- Variables de Configuración.  ---- (ver neoCalendarThemes.txt para configuraciones predefinidas)--------- */
cfg_ncDefaultLang		= 'english' ;	// Idioma por default.
cfg_ncBodyBgColor		= '#5184D0' ;	// Color de fondo de la ventana.

cfg_ncCellTxt			= 'arial';		// Tipografía de las celdas.
cfg_ncCellTxtColor		= '#000000' ;	// Color tipografia.
cfg_ncCellTxtSize		= '11';			// Tamaño Tipografía(en px.)
cfg_ncCellColor			= '#ffffff' ;	// Color de fondo de las celdas.

cfg_ncHeaderTxt			= 'arial'	;	//Tipografía de encabezado.
cfg_ncHeaderTxtColor	= '#ffffff' ;	// Color tipografia.
cfg_ncHeaderTxtSize		= '11';			// Tamaño Tipografía(en px.)
cfg_ncHeaderCellColor	= '#99BFE9' ;	// Color de fondo las celdas.

cfg_ncActiveCellTxt		= 'arial';		// Tipografía de la celda activa.
cfg_ncActiveCellTxtColor= '#ffffff' ;	// Color tipografia.
cfg_ncActiveCellTxtSize	= '11';			// Tamaño Tipografía(en px.)
cfg_ncActiveCellColor	= '#B1CFE9' ;	// Color de fondo de la celda.

cfg_ncWKNDCellColor		= '#EEEEEE' ;	// Color de fondo de la celda corresp. a fines de semana.

cfg_ncOverTxtColor		= '#9980BA' ;	// Color  OVER del link
cfg_ncOverTxtEffect		= 'underline';	// Efecto OVER del link
cfg_ncActiveTxtEffect	= 'none' ;		// Efecto ACTIVE del link

cfg_ncSelectTxt			= 'tahoma';		// Tipografía de los Combos.
cfg_ncSelectTxtColor	= '#000000' ;	// Color tipografia.
cfg_ncSelectTxtSize		= '11';			// Tamaño Tipografía(en px.)
cfg_ncSelectBgColor		= '#ffffff' ;	// Color de fondo de los botones.

cfg_ncPanelBorderColor	= '#eeeeee' ;	// Color del borde del panel calendario. (en px.)
cfg_ncPanelBorderSize	= '0' ;			// Ancho del borde del panel calendario. (en px.)

cfg_ncLeftPos			= '' ;			// Posición horizontal de la ventana (en px.) -- [ opcional ] 
cfg_ncTopPos			= '' ;			// Posición Verical de la ventana.(en px.) -- [ opcional ]
													// (si se omiten los valores de posición la ventana se centra automáticamente.)
													
cfg_ncSizeH				= '185' ;		// Ancho de la ventana.(en px.) -- [ minimo=175 ]
cfg_ncSizeV				= '200' ;		// Alto de la ventana. (en px.) -- [ minimo=200 ]

cfg_blankChar			= ''		//	Caracter para las celdas vacías.
cfg_dateDigitSeparator	= '/' ;			// Caracter de separación de digitos de fecha ('/' o '-')
cfg_force2digits		= true ; 		// Usa siempre 2 dígitos para mostrar los dias y meses en el valor de retorno.
cfg_YearsBefore			= '' ;			// Cantidad de años a mostrar hacia atrás.	  [opcional] : '' =  desde 1900
cfg_YearsAfter			= '' ;			// Cantidad de años a mostrar hacia adelante. [opcional] : '' =  hasta 2099
cfg_CloseOnSelect		= true			// true = cierra automáticamente el popup cuando se selecciona una fecha.
cfg_dateAvailable		= true;
/* - fin de variables de Configuración. ------------------------------------------------------------------------- */




/* -------------------------------------------------------------------------------------------------------------- */
// Variables Globales
var ncLang ;
var ncCurrent_dateFormatMask ;
var ncCurrentDate ;
var ncCurrentMonth ;
var ncCurrentYear ;
var ncDaysArray ;
var ncMonthsArray ;
var ncStartYear ;
var ncEndYear ;
var ncConstD ;
var ncConstM ;
var ncConstY ;
var ncTitle ;
var ncCaller ;

// Constantes
english_dateFormatMask		= 'mm/dd/aaaa';
spanish_dateFormatMask		= 'dd/mm/aaaa';
portuguese_dateFormatMask	= 'dd/mm/aaaa';

english_Title			= 'Calendar';
english_DaysArray		= new Array('S','M','T','W','T','F','S') ;
english_MonthsArray		= new Array('January','February','March','April','May','June','July','August','September','October','November','December') ;

spanish_Title			= 'Calendario';
spanish_DaysArray		= new Array('D','L','M','M','J','V','S') ;
spanish_MonthsArray		= new Array('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre') ;

portuguese_Title		= 'Calendário';
portuguese_DaysArray	= new Array('D','S','T','Q','Q','S','S') ;
portuguese_MonthsArray	= new Array('Janeiro','Fevereiro','Marco','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro') ;

ncTdSelectorH	= 20 ;


/* -------------------------------------------------------------------------------------------------------------- */



/* -------------------------------------------------------------------------------------------------------------- */
/* Función Principal 																															*/
function neoCalendar(callerObj,langID,defaultDate,dateFormat, dateAvailableVar){
	ncCaller	= callerObj ;
	ncCallerDate = callerObj.value ;
	dateAvailable = dateAvailableVar ||cfg_dateAvailable ;
   // --- ICD Hack -----------------------------------
    ncCallerDate = replaceChar(ncCallerDate,".","/");
   // ------------------------------------------------
	if (langID == '' || langID == 1 ){ ncLang = 'english' }
	else if (langID == 2 ){ ncLang = 'spanish' }
	else if (langID == 3 ){ ncLang = 'portuguese' }
	else{	ncLang = cfg_ncDefaultLang	}

	ncTitle = eval(ncLang + '_Title');
	ncDaysArray = eval(ncLang + '_DaysArray');
	ncMonthsArray = eval(ncLang + '_MonthsArray');

	if (dateFormat =='' || dateFormat == null || !dateFormat ){ncCurrent_dateFormatMask = eval( ncLang + '_dateFormatMask'	)}
	else{ncCurrent_dateFormatMask =  dateFormat	}

	if (defaultDate == '' || defaultDate == null || !defaultDate ){	// si no se recibe fecha default por parametro
		if (isNaN(eval(ncCallerDate))){							// si el valor de fecha del input es inválido
		//if (isNaN(callerObj.value)){
				ncCurrentDate = new Date()								// genero un objeto fecha (hoy)
		}
		else { ncCurrentDate = new Date(formatDate(ncCallerDate,ncCurrent_dateFormatMask,english_dateFormatMask)) }  // formateo fecha  input p/ uso interno.
	} 
	else {ncCurrentDate = new Date(formatDate(defaultDate,ncCurrent_dateFormatMask,english_dateFormatMask))} // formateo fecha parametro p/ uso interno.
	
	
	
	ncConstD		= ncCurrentDate.getDate() ;				// guarda el dia de hoy y lo mantiene
	ncCurrentMonth	= ncCurrentDate.getMonth() ;
	ncConstM		= ncCurrentMonth ;							// guarda el mes de hoy y lo mantiene 
	ncCurrentYear	= ncCurrentDate.getFullYear() ;
	ncConstY		= ncCurrentYear ;								// guarda el año de hoy y lo mantiene 
	if(cfg_YearsBefore==''){cfg_YearsBefore=1000}
	if(cfg_YearsAfter==''){cfg_YearsAfter=1000}
	if ( ncCurrentYear - cfg_YearsBefore <1900){ncStartYear = 1900}
	else{ ncStartYear = ncCurrentYear - cfg_YearsBefore}
	
	if ( ncCurrentYear + cfg_YearsAfter > 2099){ncEndYear = 2099}
	else{ ncEndYear = ncCurrentYear + cfg_YearsAfter}
	
	if(!window.ncWindow ||window.ncWindow.closed ){ // si la ventana no existe o fué cerrada...
		ncWindow = createCalendarWindow(cfg_ncSizeH,cfg_ncSizeV,cfg_ncLeftPos,cfg_ncTopPos)
	}
	else{ ncWindow.focus()} // pone en foco a la ventana.
}
/* -------------------------------------------------------------------------------------------------------------- */



/* Devuelve la fecha al campo del formulario. ------------------------------------------------------------------- */
function ncReturnValue(pDay){

	ncCurrentDate.getMonth()==0 ? month =12 : month = ncCurrentDate.getMonth() ; // parche por el mes 12
	ncCurrentDate.getMonth()==0 ? year = ncCurrentDate.getFullYear()-1: year = ncCurrentDate.getFullYear() ;
	returnDate = month + cfg_dateDigitSeparator + pDay + cfg_dateDigitSeparator + year

	formatedDate	= formatDate(returnDate,english_dateFormatMask,ncCurrent_dateFormatMask);

	// --- ICD Hack -----------------------------------
	//formatedDate = replaceChar(formatedDate,"/",".");
	// ------------------------------------------------

	ncCaller.value = formatedDate ;

	if (cfg_CloseOnSelect){	window.ncWindow.close()	}

}

/* -------------------------------------------------------------------------------------------------------------- */



/* Función auxiliar de formateo de fecha según las máscaras especificadas. -------------------------------------- */
function formatDate(pDate,pInMask,pOutMask){
	aMaskParts	= pDate.split(cfg_dateDigitSeparator) ;
	yearPart	= aMaskParts[2] ;

	switch (pInMask){
			case spanish_dateFormatMask:
				dayPart	= aMaskParts[0] ;	monthPart	= aMaskParts[1] ;
				break ;
			case portuguese_dateFormatMask:
				dayPart	= aMaskParts[0] ;	monthPart = aMaskParts[1] ;
				break ;
			case english_dateFormatMask:
				dayPart	= aMaskParts[1] ;	monthPart	= aMaskParts[0] ;
				break ;
	}

	if (cfg_force2digits){ // formato con 2 digitos para dia y dos para mes
		if (dayPart.length <2)  { dayPart ='0'+dayPart}
		if (monthPart.length <2){ monthPart ='0'+monthPart}
	}
	//Valida si el dia es 00 (bug), no envia nada.
	if (dayPart == '00'){
		pDate = '';
	}else{
		switch (pOutMask){
			case spanish_dateFormatMask:
				pDate = dayPart + cfg_dateDigitSeparator + monthPart + cfg_dateDigitSeparator +yearPart
				break ;
			case portuguese_dateFormatMask:
				pDate = dayPart + cfg_dateDigitSeparator + monthPart + cfg_dateDigitSeparator +yearPart
				break ;
			case english_dateFormatMask:
				pDate = monthPart + cfg_dateDigitSeparator + dayPart + cfg_dateDigitSeparator +yearPart
				break ;
		}
	}
	return (pDate)
}
/* -------------------------------------------------------------------------------------------------------------- */



/* Genera el documento HTML de la ventana pop-up. --------------------------------------------------------------- */
function newWinHtml(winObj){
	document.all ? lPos = '-5' : lPos ='0'
	document.all ? tPos = ncTdSelectorH +8 : tPos =ncTdSelectorH +5
	if (document.layers){
		popAutoCheck="<script>\
		openerUrl = opener.location.href;\
		openerUrl = openerUrl.substring( openerUrl.lastIndexOf('/')+1,openerUrl.length);\
		openerUrl = openerUrl.substring( 0,openerUrl.lastIndexOf('.asp')+4);\
		function popAutoCheck(urlToCheck){\
			self.onerror = quitPopup ;\
			if (opener.location.href.indexOf(urlToCheck)==-1){	quitPopup();}\
			else{setTimeout('popAutoCheck(\"'+urlToCheck+'\")',1000);}\
		}\
		function quitPopup(Event){alert(Event.number);self.close()}\
		onload autoCheck;\
		function autoCheck(){ popAutoCheck(openerUrl)}\
	</script>"
	}
	else{
		popAutoCheck="<script>\
		openerUrl = opener.location.href;\
		openerUrl = openerUrl.substring( openerUrl.lastIndexOf('/')+1,openerUrl.length);\
		openerUrl = openerUrl.substring( 0,openerUrl.lastIndexOf('.asp')+4);\
		function popAutoCheck(urlToCheck){\
			try{\
				if (opener.location.href.indexOf(urlToCheck)==-1){ quitPopup(); }\
				else{setTimeout('popAutoCheck(\"'+urlToCheck+'\")',1000);	}\
			}\
			catch(error){quitPopup()}\
		}\
		function quitPopup(){self.close()}\
		popAutoCheck(openerUrl);\
	</script>"
	}
	
	HtmlStyles	='<Style>\n\
 .ncCell{font-family:'+cfg_ncCellTxt+';font-size:'+cfg_ncCellTxtSize+'px;color:'+cfg_ncCellTxtColor+';background-color:'+cfg_ncCellColor+'}\n\
 .ncHeader{font-family:'+cfg_ncHeaderTxt+';font-size:'+cfg_ncHeaderTxtSize+'px;color:'+cfg_ncHeaderTxtColor+';background-color:'+cfg_ncHeaderCellColor+'}\n\
 .ncActiveCell{font-family:'+cfg_ncActiveCellTxt+';font-size:'+cfg_ncActiveCellTxtSize+'px;color:'+cfg_ncActiveCellTxtColor+';background-color:'+cfg_ncActiveCellColor+'}\n\
 .ncWKND{font-family:'+cfg_ncCellTxt+';font-size:'+cfg_ncCellTxtSize+'px;color:'+cfg_ncCellTxtColor+';background-color:'+cfg_ncWKNDCellColor+'}\n\
 a.lnk1 {color:'+cfg_ncCellTxtColor+';text-decoration:'+cfg_ncActiveTxtEffect+'}\n\
 a.lnk1:active,link,visited{color:'+cfg_ncCellTxtColor+';text-decoration:'+cfg_ncActiveTxtEffect+'}\n\
 a.lnk1:hover{color:'+cfg_ncOverTxtColor+';text-decoration:'+cfg_ncOverTxtEffect+'}\n\
 .ncPanel{border:'+cfg_ncPanelBorderSize+'px solid '+cfg_ncPanelBorderColor+'}\n\
 .ncSelect{font-family:'+cfg_ncSelectTxt+';font-size:'+cfg_ncSelectTxtSize+'px;color:'+cfg_ncSelectTxtColor+';background-color:'+cfg_ncSelectBgColor+'}\n\
 #ncLayPanel{position:absolute;top:'+tPos+';left:'+lPos+';width:'+parseInt(cfg_ncSizeH)+';height:50;border:0px solid black}\n\
</Style>\n'
	HtmlStart	 = '<Html>\n<Head>\n<Title>'+ncTitle+'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</Title>\n' ;
	HtmlStart	+= HtmlStyles  ;
	HtmlStart	+= '<script>function doNothing(){void(1972)}onerror=doNothing;</script>'
	HtmlStart	+= popAutoCheck +'\n</Head>\n<Body topmargin="4" leftmargin="0" marginwidth="0" marginheight="0" bgcolor="'+cfg_ncBodyBgColor+'">\n' ;
	HtmlForm	 = '<form name="dateSelector">\n'
	HtmlForm	+= ' <table width="95%" align="center" cellpadding="1" cellspacing="0" border="0">\n  <tr>\n   <td width="50%" height="'+ncTdSelectorH+'">\n  ' ;
	HtmlForm	+= '  <select name="months" class="ncSelect" onchange="opener.ncCurrentMonth=this.options[this.selectedIndex].value;opener.reDraw()">\n' ;
	for (i=0;i< ncMonthsArray.length;i++){
		ncCurrentMonth ==i? varSelected=' selected':varSelected=''
		HtmlForm+= '     <option value="'+i+'"'+varSelected+'>'+ncMonthsArray[i]+'</option>\n';
	}
	HtmlForm	+= '    </select>\n   </td>\n   <td width="50%" align="right">\n ' ;
	HtmlForm	+= '   <select name="years" class="ncSelect" style="width:60px" width="50" onchange="opener.ncCurrentYear=this.options[this.selectedIndex].value;opener.reDraw()">\n';
	for (i=ncStartYear;i<=ncEndYear;i++){
		ncCurrentYear ==i? varSelected=' selected':varSelected=''
		HtmlForm+= '     <option value="'+i+'"'+varSelected+'>&nbsp;'+i+'&nbsp;</option>\n';
	}
	HtmlForm	+= '    </select>\n   </td>\n  </tr>\n </table>\n</form>\n' ;
	HtmlEnd		 = '<div id="ncLayPanel" name="ncLayPanel">\n'+createPanelTable(ncCurrentMonth,ncCurrentYear)+'</div>\n</Body>\n</Html>' ;
	winObj.document.open();
	winObj.document.write ('')	;
	winObj.document.writeln (HtmlStart);
	winObj.document.writeln (HtmlForm);
	winObj.document.writeln (HtmlEnd);
	winObj.document.close();
}
/* -------------------------------------------------------------------------------------------------------------- */



/* Función auxiliar que genera el HTML para el panel de calendario. --------------------------------------------- */
function createPanelTable(pMonth,pYear){
	ncCurrentDate.setMonth(pMonth);
	ncCurrentDate.setFullYear(pYear);
	tdW	= parseInt(((cfg_ncSizeH ) - (cfg_ncPanelBorderSize/7)) /7)-3 ;
	tdH	= parseInt(((cfg_ncSizeV ) - (cfg_ncPanelBorderSize/7)) /7)-9;
	(!document.layers && !document.all)? tdW +=2  : tdW=tdW  ;
	HtmlPanel	 =' <table align="center" cellpadding="0" cellspacing="'+cfg_ncPanelBorderSize+'" bordercolor="'+cfg_ncPanelBorderColor+'" bgcolor="'+cfg_ncPanelBorderColor+'">\n' ;
	HtmlPanel	+='  <tr>\n' ;
	for (i=0;i< 7;i++){ // header
		HtmlPanel	+='   <td width="'+tdW+'" height="'+tdH+'" class="ncHeader" align="center">'+ncDaysArray[i]+'</td>\n' ;
	}
	HtmlPanel	+='  </tr>\n' ;
	ncCurrentDate.setDate(1);
	diaInicio = ncCurrentDate.getDay()
	loopCounter = 0;	
	dayNumber  = 1;

	for (a=0;a<6;a++){	// TRs dias
		if (ncCurrentDate.getMonth()!=pMonth){break} // sale si cambia el mes
		HtmlPanel	+='  <tr>\n' ;
		for (d=0;d<7;d++){	// TDs Dias
			if (ncCurrentDate.getMonth()!=pMonth){HtmlPanel += completeRow(d);break} // sale si cambia el mes
			d==0 || d==6? tdClass='ncWKND':tdClass='ncCell' ;
			txtCell= cfg_blankChar ;
			if (loopCounter >= diaInicio ){
				txtCell= '<a href="#" class="lnk1" onclicK="opener.ncReturnValue('+dayNumber+');return false">'+dayNumber+'</a>' ;
				dayNumber +=1
			}
			if(dayNumber-1 ==  ncConstD && ncCurrentDate.getMonth()== ncConstM && ncCurrentDate.getFullYear() == ncConstY ){
					tdClass='ncActiveCell';txtCell= dayNumber-1
			}
			
			if (dateAvailable)
				HtmlPanel	+='   <td width="'+tdW+'" height="'+tdH+'" class="'+tdClass+'" align="center"><a href="#" class="'+tdClass+'" onClick="self.opener.ncReturnValue('+(dayNumber-1)+');return false">'+txtCell+'</a></td>\n' ;
			else
				HtmlPanel	+='   <td width="'+tdW+'" height="'+tdH+'" class="'+tdClass+'" align="center">'+txtCell+'</td>\n' ;
				
			loopCounter	+=1
			ncCurrentDate.setDate(dayNumber)
		}
		HtmlPanel	+='  </tr>\n' ;
	}
	HtmlPanel	+=' </table>\n' ;
	return (HtmlPanel)	
}
/* Completa los cuadros faltantes de la semana despues de fin de mes. --------------------------------------------*/
function completeRow(actualTD){
	completion=''
	if (actualTD != 7){
		for(i=actualTD;i<7;i++){
			i==6? tdClass='ncWKND':tdClass='ncCell';
			completion +='   <td class="'+tdClass+'" align="center">'+cfg_blankChar+'</td>\n' ;
		}
	}
	return (completion)
}
/* -------------------------------------------------------------------------------------------------------------- */



/* Regenera el panel de calendario cuando ocuure un cambio de mes o año desde los selectores. ------------------- */
function reDraw(){
	newPanel = createPanelTable(ncCurrentMonth,ncCurrentYear)
	if (document.layers){
		window.ncWindow.document.layers['ncLayPanel'].document.open();
		window.ncWindow.document.layers['ncLayPanel'].document.write(newPanel);
		window.ncWindow.document.layers['ncLayPanel'].document.close();
	}
	else{	window.ncWindow.document.getElementById("ncLayPanel").innerHTML = newPanel	}
}


/* Crea y posiciona la ventana pop-up. -------------------------------------------------------------------------- */
function createCalendarWindow(ancho,alto,xPos,yPos){
	if (ancho =='' || ancho == null || isNaN(ancho) || !ancho || ancho < 175 ){cfg_ncSizeH = 175; ancho = cfg_ncSizeH}
	if (alto ==''  || alto == null  || isNaN(alto)  || !alto  || alto  < 190) {cfg_ncSizeV = 190; alto  = cfg_ncSizeV}
	if (xPos =='' || xPos == null){ xPos = parseInt(screen.width /2 - ancho/2)}
	if (yPos =='' || yPos == null){ yPos = parseInt(screen.height /2 - alto/2)}
	
	document.layers ? alto -=20 :alto=alto ;
	document.layers ? ancho -=7 :ancho=ancho ;
	(!document.layers && !document.all)?  alto -=28 :alto=alto ;
	
	features =  "width="+1+",height="+1+",top="+yPos+
	            ",left="+xPos+",resizable=no,directories=no,menubar=no,toolbar=no,scrollbars=no;modal=yes"
	newWin = open('','',features);
	newWin.resizeTo(ancho,alto);
	newWinHtml (newWin)
//alert(features)
	newWin.moveTo(xPos,yPos);
	return newWin
}
/* -------------------------------------------------------------------------------------------------------------- */
function replaceChar(input,cual,porcual){
	if (input.indexOf(cual)==-1){ return input ; } 	// si no existe el caracter especificado dentro
												 	// del string, devuelve el string original
	else {
		output = input.replace(cual,porcual);
		while (output.indexOf(cual)!= -1){
				output = output.replace(cual,porcual);
			}
		return output ;
	}
}

