/*******************************************************************************
	EasyWEB	5

	@Copyright 	Synerway Sp. z o. o. http://www.synerway.pl/
			All rights reserved

	@Author		Antoni Jakubiak <a.jakubiak@synerway.pl>


	@Description	Wybieranie daty d-Ym zintegrowane z kalendarzykiem jscalendar

			Funkcje publiczne posluguja sie data w formacie 'Y-m-d'
			Funkcje prywatne uzywaja daty w obiekcie Date js

	$Id: dateselect.js,v 1.1 2007/10/31 10:27:19 mwlodar Exp $
*******************************************************************************/


/**
 * Utworzenie obiektu
 */
function DateSelect( iId )   {
	/**
	 * identyfikator, wszystkie elementy powinny miec odpowiednie _id
	 */
	this._id = iId;
	/**
	 * ja byc ja
	 */
	var oThis = this;
	/**
	 * Inicjacja obiektu kalendarzyka
	 */
	Calendar.setup({
		daFormat       : "%Y-%m-%d",
		displayArea    : oThis._id + "_value",
		button         : oThis._id + "_button",
		range          : new Array( this._getFirstDate().getFullYear(), this._getLastDate().getFullYear() ),
		onUpdate       : function( cal ) { oThis._updateCalendar( cal ); },
		dateStatusFunc : function( date ) { return oThis._getDateStatus( date ); },
		showsTime      : false,
		singleClick    : true
	});
	/**
	 * Ustalenie zakresow z selektow
	 */
	this.setRange( this.formatDate( this._getFirstDate() ), this.formatDate( this._getLastDate() ) );
	this.set( this.formatDate( this._getFirstDate() ) );
	/**
	 * funkcja, ktora ma zostac uruchomina w momencie gdy elementy selektora sie zmieniaja
	 */
	document.getElementById( this._id + '_Ym' ).onchange = function() { oThis._updateSelect(); };
	document.getElementById( this._id + '_d' ).onchange = function() { oThis._updateSelect(); };


}


/**
 * Ustawienie aktualnej daty
 */
DateSelect.prototype.set = function( dateString ) {
	var date = typeof dateString == 'string' ? this.parseDate( dateString ) : dateString;
	if ( date >= this._getFirstDate() && date <= this._getLastDate() ) {
		this._setCalendar( date );
		this._setSelect( date );
	}
}
/**
 * Pobranie aktualnej daty z obiektu
 */
DateSelect.prototype.get = function() {
	return this.formatDate( this.parseDate( document.getElementById( this._id + '_value' ).innerHTML ) );
}
/**
 * Zwraca date dla pierwszego dnia w przedziale w selektach
 */
DateSelect.prototype._getFirstDate = function() {
	var Yms = document.getElementById( this._id + '_Ym' );
	var Ymd = Yms.options[0].value + '-01';
	return this.parseDate( Ymd );
}
/**
 * Zwraca date dla ostatniego dnia w przedziale w selektach
 */
DateSelect.prototype._getLastDate = function() {
	var Yms = document.getElementById( this._id + '_Ym' );
	var Ymd = Yms.options[ Yms.options.length - 1 ].value + '-01';
	var d = this.parseDate( Ymd );
	d.setDate( d.getMonthDays() );
	return d;
}




/**
 * Funkcja uruchamiana po wybraniu daty
 */
DateSelect.prototype._updateCalendar = function( cal ) {
	this._setCalendar( cal.date );
	this._setSelect( cal.date );
	this._onchange();
}

/**
 * Funkcja odpalana gdy elementy selecta sie zmienia
 */
DateSelect.prototype._updateSelect = function() {
 	var dateString = this._getSelectedValue( document.getElementById( this._id + '_Ym' ) );
	var d1 = this.parseDate( dateString + '-' + this._getSelectedValue( document.getElementById( this._id + '_d' ) ) );
	var d2 = this.parseDate( dateString + '-01' );
	if ( d1.getMonth() != d2.getMonth() ) {
		// mamy 30 lutego, 31 kwietnia lub itp
		d1 = d2;
		d1.setDate( d1.getMonthDays() );
	}
	if ( d1 < this._rangeStartDate ) {
		d1 = this._rangeStartDate;
	} else if ( d1 > this._rangeEndDate ) {
		d1 = this._rangeEndDate;
	}
	this._setSelect( d1 );
	this._setCalendar( d1 );
	this._onchange();
}




/**
 * Ustawienie daty dla selektow
 */
DateSelect.prototype._setSelect = function( date ) {
	var Ym = date.getFullYear() + '-' + this._formatDatePart( date.getMonth()+1 );
	var d  = '' + date.getDate();
	var oThis = this;
	this._setSelectByValue( document.getElementById( oThis._id + '_Ym' ), Ym );
	this._setSelectByValue( document.getElementById( oThis._id + '_d' ), d );
}
/**
 * Ustawienie daty dla selektow
 */
DateSelect.prototype._setCalendar = function( date ) {
	document.getElementById( this._id + '_value' ).innerHTML = this.formatDate( date );
}

/**
 * Pobiera string w formacie yyyy-mm-dd i zwraca obiekt Date
 */
DateSelect.prototype.parseDate = function( dateString ) {
	var str = new String(dateString);
	var array = str.split('-');
	if (array.length!=3) {
		return null;
	}
	var year = array[0];
	var month = array[1].charAt(0)=='0' ? parseInt(array[1].substr(1, 1)) : parseInt(array[1]);
	var day = array[2].charAt(0)=='0' ? parseInt(array[2].substr(1, 1)) : parseInt(array[2]);
	var date = new Date(year, month-1, day);
	if (isNaN(date)) {
		return null;
	}
	date.setHours(0);
	date.setMinutes(0);
	date.setSeconds(0);
	date.setMilliseconds(0);
	return date;
}



/**
 * Zamienia obiekt Date na string w formacie YYYY-MM-DD.
 */
DateSelect.prototype.formatDate = function( date ) {
	return date.getFullYear() + "-" + this._formatDatePart(date.getMonth()+1) +
		"-" + this._formatDatePart(date.getDate());
}
/**
 * Uzupelnia element daty o 0 z przodu
 */
DateSelect.prototype._formatDatePart = function( value ) {
	var v = new String(value);
	return v.length==1 ? "0"+v : v;
}

/**
 * Ustawienie elementu typu select na dana wartosc
 */
DateSelect.prototype._setSelectByValue = function ( selectElement , value ) {
	// czy to cos ma opcjie
	if( !selectElement.options ) {
		return;
	}
	for( var i=0; i<selectElement.options.length; i++ ) {
		if( selectElement.options[i].value != value ) {
			continue;
		}
		selectElement.selectedIndex = i;
		return;
	}
}

/**
 * Zwraca wybrana wartosc dla selecta
 */
DateSelect.prototype._getSelectedValue = function ( selectElement ) {
	if ( ! selectElement ) return;
	return selectElement.options[ selectElement.selectedIndex ].value;
}

/**
 * Pobiera status dla danej daty.
 * 	Zwraca true, gdy element ma nie byc pokazywany.
 *	w przeciwynym wypadku zwraca false
 */
DateSelect.prototype._getDateStatus = function ( date ) {
	if ( date < this._rangeStartDate || date > this._rangeEndDate ) {
		return true;
	}
	return false;
	// return this._rangeStartDate > date || this._rangeEndDate < date;
}
/**
 * Pobierania nazwy dla miesiaca
 */
DateSelect.prototype._getMonthString = function ( month ) {
	return 'aaa' + month;
}
/**
 * Ustalenie zakresow
 */
DateSelect.prototype.setRange = function( iRangeStartDateString, iRangeEndDateString ) {
	var rs = iRangeStartDateString ? this.parseDate( iRangeStartDateString ) : this._rangeStartDate;
	var re = iRangeEndDateString   ? this.parseDate( iRangeEndDateString )   : this._rangeEndDate;
	if ( rs >= this._getFirstDate() ) {
		this._rangeStartDate = rs;
	} else {
		this._rangeStartDate = this._getFirstDate();
	}
	if (re <= this._getLastDate() ) {
		this._rangeEndDate   = re;
	} else {
		this._rangeEndDate   = this._getLastDate();
	}
}


/**
 * Funkcja odpalana po zmianie daty obojetnie czy z kalendarza, czy z selektow.
 * Jezeli mamy jakis callback to go uruchamiamy
 */
DateSelect.prototype._onchange = function() {
	if ( this._onchangeCallback ) {
		this._onchangeCallback( this );
	}
}
/**
 * ustawienie funkcji zwrotne uruchamianej podczas modyfikacji
 */
DateSelect.prototype.setOnchangeCallback = function ( iCallback ) {
	this._onchangeCallback = iCallback;
}





