//Toursearch calendar script

function ConstructCalendar(containerId)
{
    var calendar = new Object();
    calendar._container = document.getElementById(containerId);
    calendar._container.style.display = "none";
    
    var markup = "";
    markup += "<div id=\"in-cal\" class=\"in-cal\"><!--[if lte IE 6.5]><iframe></iframe><![endif]-->";
    markup += "<div class=\"kalendar\"><center>";
    markup += "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"196\"><tr class=\"cal-head\">";
    markup += "<td valign=\"top\" width=\"5px\"><a id=\""+containerId+"_prvLnk\" class=\"cal-link\" style=\"cursor:pointer\"><img src=\"/images/prev.gif\" width=\"5\" height=\"9\" align=\"top\" alt=\"Предыдущий\" border=0></a></td>";
    markup += "<td align=\"center\" width=\"186px\" class=\"kalendarhead\"><span id=\""+containerId+"_sheettitle\"></span></td>";
    markup += "<td valign=\"top\" align=\"right\" width=\"5px\"><a id=\""+containerId+"_nxtLnk\" class=\"cal-link\" style=\"cursor:pointer\"><img src=\"/images/next.gif\" align=\"top\" width=\"5\" height=\"9\" alt=\"Следующий\" border=\"0\"/></a></td>";
    markup += "</tr></table>";
    markup += "<div class=\"del\"></div>";
    markup += "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"tbdays\">";
    markup += "<tr class=\"days\"><td width=\"20\">пн</td><td width=\"20\">вт</td><td width=\"20\">ср</td><td width=\"20\">чт</td><td width=\"20\">пт</td><td width=\"20\">сб</td><td width=\"20\">вс</td></tr>";
    markup += "</table>";
    markup += "<div class=\"del\"></div>";
    markup += "<table id=\""+containerId+"_sheetdates\" class=\"tbdates\"></table>";
    markup += "</center></div>"; 
    markup += "</div>";
    calendar._container.innerHTML = markup;
    
    //fields
    calendar._curSheet = {"year" : new Date().getFullYear(), "month" : new Date().getMonth()};
    calendar._on = false;
    calendar._hold = false;
    calendar._activeDates = new Array();
    
    //functions
    calendar._stepBack = _stepBack;
    calendar._stepFwd = _stepFwd;
    calendar._drawSheet = _drawSheet;
    calendar._changeSheet = _changeSheet;
    calendar._constructDatesGrid = _constructDatesGrid ;
    calendar._onDateClick = _onDateClick;
    calendar._getDatesEdge = _getDatesEdge;
    
    //controls
    calendar._title = document.getElementById(containerId+"_sheettitle");
    calendar._dates = document.getElementById(containerId+"_sheetdates");
    calendar._prvLnk = document.getElementById(containerId+"_prvLnk");
    calendar._nxtLnk = document.getElementById(containerId+"_nxtLnk");
    registerEventHandler(calendar._prvLnk, "click", function(){calendar._stepBack();} );
    registerEventHandler(calendar._nxtLnk, "click", function(){calendar._stepFwd();} );
        
    
    //public functions
    calendar.setActiveDates = _setActiveDates;
    calendar.getSelectedDate = _getSelectedDate;
    calendar.selectDate = _selectDate;
    calendar.swtch = _switch;
	calendar.eventDateSelected = function(){};
	
	
	
	calendar._onCalendarClick = function()
	{
	    calendar._hold = true;	    
	}
	
	calendar._onBodyClick = function()
	{
	    if(calendar._hold == true)
	    {
	        calendar._hold = false;
	    }
	    else if(calendar._on)
	    {
	        calendar.swtch();	    
	    }
	    /*if(calendar._on && !calendar._opening)
	    {
	        var elem = event.srcElement;
    	    
	        if(elem != null)
	        {
	            var search = bubbleSearchElement(elem, calendar._container.id);
	            alert("elem" + search);
	            if(!search)
                    calendar.swtch();
	        }
	        
	        calendar._opening = false;	        
	    }*/
	}
	
	registerEventHandler(calendar._container, "click", calendar._onCalendarClick );
	registerEventHandler(document.body, "click", calendar._onBodyClick);
	
	var date = new Date();
	var nowyear = date.getFullYear();
	nowyear += 2;	
	date.setYear(nowyear);  
    
    return calendar;
}

function _drawSheet()
{
    var year = this._curSheet.year;
    var month = this._curSheet.month;
    this._prvLnk.style.visibility = "hidden";
    this._nxtLnk.style.visibility = "hidden";
    
    if(this._activeDates.length > 0 )
    {
        if(compareDates(new Date(year, month, 1), this._getDatesEdge(false)) == 1)
            this._prvLnk.style.visibility = "visible";
            
        if(compareDates(new Date(year, month, getMonthDaysCount(year, month)), this._getDatesEdge(true)) == -1)
            this._nxtLnk.style.visibility = "visible";
    }
        
    this._title.innerHTML = monthNames[month] + " " + year;    
    this._constructDatesGrid(year, month);
}

function _changeSheet(year, month)
{
    var newSheet = {"year" : year, "month" : month}
    this._curSheet = newSheet;
    this._drawSheet();    
}

function _constructDatesGrid(year, month)
{
    while(this._dates.rows.length != 0)
        this._dates.deleteRow(0);
        
    var d = new Date(year, month, 1);
    var firstDay = subDay(d.getDay());
    var daysCount = getMonthDaysCount(year, month);   
    var curDay = firstDay;  
    
    var row; 
    
    if(curDay > 0)
    {
        row = this._dates.insertRow(-1);        
        
        for(var i=0; i<curDay; i++)
        {
            var cell = row.insertCell(-1);
            cell.innerHTML = "&nbsp;";
            cell.width = "20px";
        }
    }

    for(var i=1; i<daysCount+1 ; i++)
    {        
        if(curDay == 0 || row == null)
            row = this._dates.insertRow(-1);
        
        var date = new Date(year, month, i);
        
        var cell = row.insertCell(-1);
        cell.innerHTML = i;
        cell.width = "20px";

        var setHandler = false;        
        var isActive = false;

        for(var j = 0; j < this._activeDates.length; j++)
        {
            if(compareDates(date, this._activeDates[j]) == 0)
            {
                isActive = true;
                break;
            }
        }
        
        if(this._selectedDate != null && compareDates(date, this._selectedDate) == 0)
        {
            setHandler = true;
            cell.style.cursor = "pointer";
            cell.className = "days_ch today";              
        }
        else if(isActive)
        {
            setHandler = true;
            cell.style.cursor = "pointer";
            cell.className = "redday";
        }
        else
        {
            cell.className = "days_ch";
        }
        
        if(setHandler)
        {
            var clndr = this;
            registerEventHandler(cell, "click", produceDateClickEventHandler(this, i));        
        }
        
        curDay = addDay(curDay);
    }
    
    if(curDay != 0)
    {       
        for(var i=curDay; i<7; i++)
        {
            var cell = row.insertCell(-1);
            cell.innerHTML = "&nbsp;";
            cell.width = "20px";
        }
    }
}

function produceDateClickEventHandler(calendar, dateNum)
{
    return function(){calendar._onDateClick(dateNum);}
}

function _onDateClick(day)
{
    var date = new Date(this._curSheet.year, this._curSheet.month, day);
    
    if(this.eventDateSelected)
    {
        this.eventDateSelected(date);
    }
        
    this.selectDate(date);
}

function _selectDate(date)
{
    if(this._activeDates.length > 0)
    {
        var isActive = false;
        
        for(var i = 0; i < this._activeDates.length; i++)
        {
            if(compareDates(date,this._activeDates[i]) == 0)
            {
                isActive = true;
                break;
            }
        }
        
        if(!isActive)
            this._selectedDate = this._getDatesEdge(false);
        else
            this._selectedDate = date;
            
        this._changeSheet(this._selectedDate.getFullYear(), this._selectedDate.getMonth());
        
        if(this._on)
            this.swtch();
    }
}

function _setActiveDates(dates)
{
    
    if(dates.length > 0)
    {
        this._activeDates = dates;
        
        if(this._selectedDate != null)
            this.selectDate(this._selectedDate);
        else
            this.selectDate(new Date());   
    }    
}

function _stepBack()
{
    if(!(this._curSheet.year == this._getDatesEdge(false).getFullYear() && this._curSheet.month == this._getDatesEdge(false).getMonth()))
    {
        var date = new Date(this._curSheet.year, this._curSheet.month, 1);
        date.setMonth(date.getMonth()-1); 
        this._changeSheet(date.getFullYear(), date.getMonth());
    }
}

function _stepFwd()
{
    if(!(this._curSheet.year == this._getDatesEdge(true).getFullYear() && this._curSheet.month == this._getDatesEdge(true).getMonth()))
    {
        var date = new Date(this._curSheet.year, this._curSheet.month, 1);
        date.setMonth(date.getMonth()+1); 
        this._changeSheet(date.getFullYear(), date.getMonth());
    }
    
}

function _switch( date )
{
    if(this._on)
    {
        this._container.style.display = "none";        
    }
    else
    {
		if( date!=null )
		{
			this.selectDate( date );
		}
        this._hold = true;
        this._container.style.display = "inline";
        this._drawSheet();        
        
    }
    
    this._on = !this._on;    
}

function _getSelectedDate()
{
    return _selectedDate;
}

function _getDatesEdge(max)
{
    var edge;
    
    if(this._activeDates.length > 0)
    {
        edge = this._activeDates[0];
    
        for(var i = 1; i < this._activeDates.length; i++)
        {
            if(max)
            {
                if(compareDates(this._activeDates[i], edge) == 1)
                    edge = this._activeDates[i];
            }
            else
            {//alert(this._activeDates[i]);
                if(compareDates(this._activeDates[i], edge) == -1)
                        edge = this._activeDates[i];    
            }
        }
    }
    
    return edge;
}


//Global

var monthNames = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"];

function addDay(day)
{
    day++;
    
    if(day == 7)
        day = 0;
        
    return day;        
}

function subDay(day)
{
    day--;
    
    if(day == -1)
        day = 6;
        
    return day;        
}

function getMonthDaysCount(year, month)
{
    var daysCount;
    
    switch(month)
    {
        case 1:
            var d = new Date(year, 1, 29);
            daysCount = d.getMonth() == 2 ? 28 : 29;
            break;
        case 0:
        case 2:
        case 4:
        case 6:
        case 7:
        case 9:
        case 11:
            daysCount = 31;
            break;
        default:
            daysCount = 30;
            break;
    }
    
    return daysCount;
}

function compareDates(date1, date2)
{
    var year1 = date1.getFullYear();
    var year2 = date2.getFullYear();
    
    if(year1 == year2)
    {
        var month1 = date1.getMonth();
        var month2 = date2.getMonth();
        if(month1 == month2)
        {
            var d1 = date1.getDate();
            var d2 = date2.getDate();

            if(d1 == d2)
                return 0;
            else if(d1 > d2)
                return 1;
            else
                return -1;
        }
        else if(month1 > month2)
            return 1;
        else
            return -1;
    }
    else if(year1 > year2)
        return 1;
    else
        return -1;
}

function bubbleSearchElement(nestedElement, id)
{
    if(nestedElement.id == id)
		return true;
	else if(nestedElement.parentElement)
		return bubbleSearchElement(nestedElement.parentElement , id);
		
	return false;
}

function registerEventHandler(element, evnt, handler)
{
    if(element.attachEvent)//IE
        element.attachEvent("on"+evnt, handler);
    else//Others
        element.addEventListener(evnt, handler, false);

}

function bindDateToField(field ,date)
{
    var datenum = date.getDate();
    var month = date.getMonth()+1;
    var year = date.getFullYear();
    
    var value = (datenum < 10 ? '0'+ datenum : datenum) + '.' +
                (month < 10 ? '0'+ month : month) + '.' +
                (year < 10 ? '0'+ year : year);
                
    field.value = value;
    
    if(field.onchange)
        field.onchange();
}
