(function() {
    var Dom = YAHOO.util.Dom,
        Event = YAHOO.util.Event,
        calendar,
        over_cal = false,
        cur_field = '';

    var init = function() {
        calendar = new YAHOO.widget.Calendar('calendar', 'calendarContainer', {navigator: true});
        calendar.selectEvent.subscribe(getDate, calendar, true);
        calendar.renderEvent.subscribe(setupListeners, calendar, true);
        Event.addListener(['datefrom', 'dateto'], 'focus', showCal);
        Event.addListener(['datefrom', 'dateto'], 'blur', hideCal);
        calendar.render();
    }

    var setupListeners = function() {
        Event.addListener('calendarContainer', 'mouseover', function() {
            over_cal = true;
        });
        Event.addListener('calendarContainer', 'mouseout', function() {
            over_cal = false;
        });
    }

	var isDate = function(dateStr)
	{
		var pieces = dateStr.split('/');
		if (pieces.length != 3)
			return false;

		var date = new Date(pieces[2], pieces[0] - 1, pieces[1]);
		var convertedDate = '' + date.getFullYear() + (date.getMonth()+1) + date.getDate();
		var givenDate = '' + pieces[2] + pieces[0] + pieces[1];
		return ( givenDate == convertedDate);
	}

    var getDate = function() {
            var calDate = this.getSelectedDates()[0];
            calDate = (calDate.getMonth() + 1) + '/' + calDate.getDate() + '/' + calDate.getFullYear();
            cur_field.value = calDate;            
            over_cal = false;
            hideCal();
    }

    var showCal = function(ev) {
        var tar = Event.getTarget(ev);
        cur_field = tar;
    
        var xy = Dom.getXY(tar),
            date = Dom.get(tar).value;
        if (date && isDate(date)) {
            calendar.cfg.setProperty('selected', date);
            calendar.cfg.setProperty('pagedate', new Date(date), true);
        } else {
            calendar.cfg.setProperty('selected', '');
            calendar.cfg.setProperty('pagedate', new Date(), true);
        }
        calendar.render();
        Dom.setStyle('calendarContainer', 'display', 'block');
        xy[1] = xy[1] + 20;
        Dom.setXY('calendarContainer', xy);
    }

    var hideCal = function() {
        if (!over_cal) {
            Dom.setStyle('calendarContainer', 'display', 'none');
        }
    }

    Event.addListener(window, 'load', init);
})();
