BOC = new Object;

BOC.searchURL = '/boc/busqueda?';

LB = new Array();   //Lista de BOCs

//-----------------------

A = function(value) {
	value = value.toString();
	var year = Number(value.substr(0, 4));
	var month = Number(value.substr(4, 2));
	var day = Number(value.substr(6, 2));
	var number = Number(value.substr(8, 3));

    if (LB.length < (year + 1)) {
		LB.length = year + 1;
		LB[year] = new Array;
	}
	if (LB[year].length < (month + 1)) {
		LB[year].length = month + 1;
		LB[year][month] = new Array;
	}
	if (LB[year][month].length < (day + 1))	{
		LB[year][month].length = day + 1;
		LB[year][month][day] = number;
	}
}

//--------------------

function daysInMonth(month, year) {
  if (month == 2)	{
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
  }
  else {
    if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {
	  return 30;
    }
    else {
	  return 31;
	}
  }
}

//--------------------

BOC.testDate = function(dateStr) {
  if (!/^\d{2}\/\d{2}\/\d{4}$/.test(dateStr)) {
    return false;
  }

  var pos1 = dateStr.indexOf("/");
  var pos2 = dateStr.indexOf("/", pos1 + 1);
  var strDay = dateStr.substring(0, pos1);
  var strMonth = dateStr.substring(pos1 + 1, pos2);
  var strYear = dateStr.substring(pos2 + 1);

  if (strDay.charAt(0) == "0") strDay = strDay.substring(1);
  if (strMonth.charAt(0) == "0") strMonth = strMonth.substring(1);
  for (var i = 1; i <= 3; i++) {
    if (strYear.charAt(0) == "0") strYear = strYear.substring(1);
  }
  var month = parseInt(strMonth);
  var day = parseInt(strDay);
  var year = parseInt(strYear);

  if ((pos1 == -1) || (pos2 == -1)) {
    return false;
  }
  if ((strMonth.length < 1) || (month < 1) || (month > 12)) {
    return false;
  }
  if ((strDay.length < 1) || (day < 1) || day > daysInMonth(month, year)){
    return false;
  }

  return true;
}

//--------------------

BOC.getAbsolutePos = function(el) {
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if (is_div && el.scrollLeft)
		SL = el.scrollLeft;
	if (is_div && el.scrollTop)
		ST = el.scrollTop;
	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
	if (el.offsetParent) {
		var tmp = this.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
}

//--------------------

BOC.encodeUTF8 = function (value) {
	value = value.replace(/\r\n/g,"\n");
	var utftext = "";

	for (var n = 0; n < value.length; n++) {

		var c = value.charCodeAt(n);

		if (c < 128) {
			utftext += String.fromCharCode(c);
		}
		else if((c > 127) && (c < 2048)) {
			utftext += String.fromCharCode((c >> 6) | 192);
			utftext += String.fromCharCode((c & 63) | 128);
		}
		else {
			utftext += String.fromCharCode((c >> 12) | 224);
			utftext += String.fromCharCode(((c >> 6) & 63) | 128);
			utftext += String.fromCharCode((c & 63) | 128);
		}

	}

	return escape(utftext);
}

//--------------------

BOC.decodeUTF8 = function (utftext) {
	utftext = unescape(utftext);
	var string = "";
	var i = 0;
	var c = c1 = c2 = 0;

	while ( i < utftext.length ) {

		c = utftext.charCodeAt(i);

		if (c < 128) {
			string += String.fromCharCode(c);
			i++;
		}
		else if((c > 191) && (c < 224)) {
			c2 = utftext.charCodeAt(i+1);
			string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
			i += 2;
		}
		else {
			c2 = utftext.charCodeAt(i+1);
			c3 = utftext.charCodeAt(i+2);
			string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
			i += 3;
		}

	}
	return string;
}

//--------------------

BOC.formatNumber = function(value, length) {
	while (true) {
		if (String(value).length < length) {
			value = '0' + value;
	    }
		else break;
	}
	return value;
}

//-----------------------

BOC.julianDay = function(y, m, d) {
	var jy, ja, jm;	

	if( m > 2 ) {
		jy = y;
		jm = m + 1;
	} else {
		jy = y - 1;
		jm = m + 13;
	}

	var intgr = Math.floor( Math.floor(365.25 * jy) + Math.floor(30.6001 * jm) + d + 1720995 );

	//check for switch to Gregorian calendar
    var gregcal = 15 + 31*( 10 + 12*1582 );
	if (d + 31 * (m + 12 * y) >= gregcal ) {
		ja = Math.floor(0.01 * jy);
		intgr += 2 - ja + Math.floor(0.25*ja);
	}

    return intgr - 2000000;
}

//-----------------------

BOC.formatDate = function(date) {
	if (date.search('/') != -1)	{
		var values = date.split('/');
	}
	else if (date.search('-') != -1) {
		var values = date.split('-');
	}

	var y = parseInt(values[2], 10);
	if (y < 100) {
		if (y > 29) {
			y += 1900;
		}
		else {
			y += 2000;
		}
	}
	var m = parseInt(values[1], 10);
	var d = parseInt(values[0], 10);

	return this.julianDay(y, m, d);
}

//-----------------------

BOC.previousBulletinDate = function(daysBefore) {
  var year = LB.length - 1;
	var month = LB[year].length - 1;
	var day = LB[year][month].length - 1;

  var i = daysBefore - 1;
  if (i < 1) {
    return this.julianDay(year, month, day); 
  }
    
	day--;
	while (year >= 1980) {
		if (LB[year] != null){
			while (month >= 1) {
				if (LB[year][month] != null) {
					while (day >= 1) {
						if (LB[year][month][day] != null) {
              if (i > 1) {
                i--;
              }
              else {
							  return this.julianDay(year, month, day);
              }
						}
						day--;
					}
				}
				month --;
				day = 31;
			}
		}
		year--;
    day = 31;
		month = 12;
  }

  return this.julianDay(1980, 01, 01);
}

//-----------------------

BOC.getQueryVariable = function(variable) {
	var query = window.location.search.substring(1);  
	var vars = query.split("&");  
	for (var i=0; i<vars.length; i++) {    
		var pair = vars[i].split("=");    
		if (pair[0] == variable) {      
			return pair[1];      
		}   
	}
}


//-----------------------

BOC.fillDates = function() {
	var inputFromDate = document.getElementById("textFromDate");
	var inputToDate = document.getElementById("textToDate");
	if ((inputFromDate == null) || (inputToDate == null)) return;

  var currentDate = new Date();
  var currentDay = currentDate.getDate();
  var currentMonth = currentDate.getMonth() + 1;
  var currentYear = currentDate.getFullYear();

  inputToDate.value = this.formatNumber(currentDay, 2) + '/' + this.formatNumber(currentMonth, 2) + '/' + currentYear;
//  inputFromDate.value = this.formatNumber(currentDay, 2) + '/' + this.formatNumber(currentMonth, 2) + '/' + (currentYear - 10);

  if ((currentMonth == 2) && (currentDay == 29)) {
	  currentDay = 28;
  }
  inputFromDate.value = this.formatNumber(currentDay, 2) + '/' + this.formatNumber(currentMonth, 2) + '/' + (currentYear - 1);;
}

//-----------------------

BOC.fillQuery = function(input) {
/*  if (input == null) return;

  var query = this.getQueryVariable('q'); 
  if (query == null) return;
  query = this.decodeUTF8(query);

  var idx = query.indexOf('inmeta');
  if (idx >= 0) {
    query = query.substr(0, idx - 1);
  }

  input.value = query;*/
}

//-----------------------

BOC.fillYears = function(select) {	
	if (select == null) return;

	var yearParam = Number(this.getQueryVariable('year')); 
	
	for(var year in LB) {
		select.options[select.options.length] = new Option(year, year);
		if (year == yearParam) {
			var idxSelected = select.options.length - 1;
		}
	}

	if (select.options.length > 0) {
		if ((yearParam == null) || (!idxSelected)) {
			select.options[select.options.length - 1].selected = true;
		}
		else {
			select.options[idxSelected].selected = true;
	   	}
	}
}

//-----------------------

BOC.fillMonths = function(select) {	
	if (select == null) return;

	var yearParam = Number(this.getQueryVariable('year')); 
	var numberParam = Number(this.getQueryVariable('number')); 

    var now = new Date();
	var month = now.getMonth();
	
	if ((yearParam != null) && (numberParam != null)) {
		for (var monthIndex in LB[yearParam])	{
			for (var dayIndex in LB[yearParam][monthIndex]) {
				if (LB[yearParam][monthIndex][dayIndex] == numberParam) {
					month = monthIndex - 1;
				}
			}
		}
	}

	select.options[0] = new Option('Enero', 0);
	select.options[1] = new Option('Febrero', 1);
	select.options[2] = new Option('Marzo', 2);
	select.options[3] = new Option('Abril', 3);
	select.options[4] = new Option('Mayo', 4);
	select.options[5] = new Option('Junio', 5);
	select.options[6] = new Option('Julio', 6);
	select.options[7] = new Option('Agosto', 7);
	select.options[8] = new Option('Septiembre', 8);
	select.options[9] = new Option('Octubre', 9);
	select.options[10] = new Option('Noviembre', 10);
	select.options[11] = new Option('Diciembre', 12);

	select.options[month].selected = true;
}

//-----------------------

BOC.loadCalendarNavigator = function(element) {
	if (element == null) return;

    var now = new Date();
	var year = now.getFullYear();
	var month = now.getMonth() + 1;

	var calendarNavigator = new CALENDAR();
	calendarNavigator.offset = 2;
	calendarNavigator.onClick = 'BOC.searchByCalendar';

	calendarNavigator.show(year, month, element);
}

//-----------------------

BOC.loadCalendarPopup = function(input, element, button) {
	if ((input == null) || (element == null) || (button == null)) return;

	var pos = this.getAbsolutePos(button);
	element.style.left = pos.x + "px";
	element.style.top = (pos.y + 15) + "px";

	if (element.style.display == "none") element.style.display = "block"
	else element.style.display = "none";

	this.calendarPopup = new CALENDAR();

	var inputDate = input.value;
  if (/^\d{2}\/\d{2}\/\d{4}$/.test(inputDate)) {
		var values = inputDate.split('/');
  	var year = parseInt(values[2], 10);
  	var month = parseInt(values[1], 10);
  }
  else {
    var date = new Date();
    var year = date.getFullYear();
  	var month = date.getMonth() + 1;
  }

	this.calendarPopup.offset = 2;
	this.calendarPopup.popup = true;
	this.calendarPopup.onClick = 'BOC.setPopupDate';
	this.calendarPopup.input = input;
	this.calendarPopup.element = element;
	this.calendarPopup.allDaysLink = true;
	this.calendarPopup.show(year, month, element);
}

//-----------------------

BOC.searchFast = function() {
	var selectYear = document.getElementById("yearValueFSSelect");
	if (selectYear == null) return;

	var inputValue = document.getElementById("searchValueFSInput");
	if (inputValue == null) return;

    var year = selectYear.options[selectYear.selectedIndex].value;
	var searchValue = this.encodeUTF8(inputValue.value);

    var request = BOC.searchURL;
    request += "searchValue1=" + searchValue;
    request += "&selectScope1=1";
    var fromDate = '01/01/' + year;
    var toDate = '31/12/' + year;

    request += "&textFromDate=" + this.encodeUTF8(fromDate);
    request += "&textToDate=" + this.encodeUTF8(toDate);
    request += "&selectChapter=0";

	window.parent.location.href = request;
}

//-----------------------

BOC.checkSearchAdvanced = function() {
    var inputFromDate = document.getElementById("textFromDate");
    if (inputFromDate == null) {
        alert("ERROR: No se encontró el campo fromDateASInput");
        return false;
    }

    var inputToDate = document.getElementById("textToDate");
    if (inputToDate == null)  {
        alert("ERROR: No se encontró el campo toDateASInput");
        return false;
    }

 //comprobar las fechas, no más de 10 años.
    if (inputFromDate.value == '') {
        alert("Debe introducir un valor en \"Fecha desde\".");
        return false;
    }

    var fromDate = inputFromDate.value;
    if (!this.testDate(fromDate)) {
        alert("El valor en \"Fecha desde\" " + fromDate + " no es una fecha válida.");
        return false;
    }

    if (inputToDate.value == '') {
        alert("Debe introducir un valor en \"Fecha hasta\".");
        return false;
    }

    var toDate = inputToDate.value;
    if (!this.testDate(toDate)) {
        alert("El valor en \"Fecha hasta\" " + toDate + " no es una fecha válida.");
        return false;
    }

    fromDate = this.formatDate(fromDate);
    toDate = this.formatDate(toDate);
    if (fromDate > toDate) {
        alert("El valor en \"Fecha desde\" debe ser una fecha anterior o igual al valor en \"Fecha hasta\".");
        return false;
    }

    if ((toDate - fromDate) > 3653) {
        alert("La diferencia de fechas ha de ser menor que 10 años.");
        return false;
    }

    return true;
}

//-----------------------

BOC.searchByNumber = function() {
  var inputNumber = document.getElementById("numberValueNSInput");
  if ((inputNumber == null) || (inputNumber.value == "")) return;

  var number = inputNumber.value;
  if (!/^([0-9])*$/.test(number)) {
    alert("El valor " + number + " no es un número");
    return;
  }

  var selectScope = document.getElementById("yearValueNSSelect");
  if (selectScope == null) return;
  var year = selectScope.options[selectScope.selectedIndex].innerHTML;

  var month = LB[year][LB[year].length - 1];
  var lastnumber = month[month.length - 1];
  if ((number <= 0) || (number > lastnumber)) {
    alert("El número de boletín ha de estar entre 1 y " + lastnumber);
    return;
  }

  var request = '/boc/' + year + '/' + this.formatNumber(number, 3) + '/index.html';

  window.parent.location.href = request;
}


//-----------------------

BOC.searchByCalendar = function(date) {
	var dateSplit = date.split('-');

	var numberBoc = LB[dateSplit[0]][dateSplit[1]][dateSplit[2]];
	var request = '/boc/' + dateSplit[0] + '/' + this.formatNumber(numberBoc, 3) + '/index.html';

	window.parent.location.href = request;
}

//-----------------------

BOC.setPopupDate = function(date) {
	var dateSplit = date.split('-');

	this.calendarPopup.input.value = BOC.formatNumber(dateSplit[2], 2) + '/' + BOC.formatNumber(dateSplit[1], 2) + '/' + dateSplit[0];
	this.calendarPopup.hide();
}

//-----------------------

BOC.getNextBulletinURL = function(year, month, day) {
	day++;
	while (year < LB.length) {
		if (LB[year] != null){
			while (month < LB[year].length) {
				if (LB[year][month] != null) {
					while (day < LB[year][month].length) {
						if (LB[year][month][day] != null) {
							return '/boc/' + year + '/' + this.formatNumber(LB[year][month][day], 3) + '/index.html';
						}
						day++;
					}
				}
				month ++;
				day = 1;
			}
		}
		year++;
		day = 1;
		month = 1;
	}
}

//-----------------------

BOC.getPreviousBulletinURL = function(year, month, day) {
	day--;
	while (year >= 1980) {
		if (LB[year] != null){
			while (month >= 1) {
				if (LB[year][month] != null) {
					while (day >= 1) {
						if (LB[year][month][day] != null) {
							return '/boc/' + year + '/' + this.formatNumber(LB[year][month][day], 3) + '/index.html';
						}
						day--;
					}
				}
				month --;
				day = 31;
			}
		}
		year--;
    day = 31;
		month = 12;
	}
}

//-----------------------

BOC.fillPrevAndNextBulletin = function(ul, year, number) {
	var day = null;
    var arrayYear = LB[year];
	for (var monthIndex in arrayYear) {
		for (var dayIndex in arrayYear[monthIndex])	{
			if (arrayYear[monthIndex][dayIndex] == number) {
				var month = monthIndex;
				var day = dayIndex;
				break;
			}
		}
		if (day != null) break;
	}
	if (day == null) return;

    var prevURL = this.getPreviousBulletinURL(year, month, day);
	var nextURL = this.getNextBulletinURL(year, month, day);

	if ((prevURL != null) && (nextURL != null)) {
		ul.innerHTML = '<li class="nobarra"><a href="' + prevURL + '">Boletín anterior</a></li><li><a href="' + nextURL + '">Boletín siguiente</a></li>';
	}
	else if (prevURL != null) {
		ul.innerHTML = '<li class="nobarra"><a href="' + prevURL + '">Boletín anterior</a></li>';
	}
	else if (nextURL != null) {
		ul.innerHTML = '<li class="nobarra"><a href="' + nextURL + '">Boletín siguiente</a></li>';
	}
}

//-----------------------

function processFormKeyEvent(evt, elementId) {
   var code=0;
   evt = (evt)? evt : ((window.event)? window.event : "");
   if (evt.keyCode) code = evt.keyCode;        
   if (code == '13') {      
       sendBtn = document.getElementById(elementId);
       sendBtn.click();
       return false; 
   }  
}


