var MONTH_NAMES = new Array();
MONTH_NAMES['RUS'] = ["\u042f\u043d\u0432\u0430\u0440\u044c","\u0424\u0435\u0432\u0440\u0430\u043b\u044c","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0435\u043b\u044c","\u041c\u0430\u0439","\u0418\u044e\u043d\u044c","\u0418\u044e\u043b\u044c","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c","\u041e\u043a\u0442\u044f\u0431\u0440\u044c","\u041d\u043e\u044f\u0431\u0440\u044c","\u0414\u0435\u043a\u0430\u0431\u0440\u044c"];
MONTH_NAMES['UKR'] = ["\u042f\u043d\u0432\u0430\u0440\u044c","\u0424\u0435\u0432\u0440\u0430\u043b\u044c","\u041c\u0430\u0440\u0442","\u0410\u043f\u0440\u0435\u043b\u044c","\u041c\u0430\u0439","\u0418\u044e\u043d\u044c","\u0418\u044e\u043b\u044c","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c","\u041e\u043a\u0442\u044f\u0431\u0440\u044c","\u041d\u043e\u044f\u0431\u0440\u044c","\u0414\u0435\u043a\u0430\u0431\u0440\u044c"];
MONTH_NAMES['ENG'] = ["January","February","March","April","May","June","July","August","September","October","November","December"];

function Calendar()
{
    this.mainNode = null;
    this.root = null;    
    this.buffer = null;
    
    this.header = null;    
    this.body = null;
    
    this.date = new Date();   
    this.days = new Array(); 
    this.daysInMonth = 0;
    
    this.blankDaysRow = null;
    this.wasShown = false;
	
		this.fromYear = 1990;
		this.toYear = 2020;
    this.fromMonth = 0;
    this.toMonth = 11;
    this.fromDay = 0;
    this.toDay = 31;
	
    this.getResultFunction = null;
		this.target = null;
	
		this.monthSelector = null;
		this.yearSelector = null;
	
		this.selects = null;
    // this.lang = 'RUS';
    this.lang = window.location.href;
    this.lang = this.lang.substring( this.lang.indexOf('.ru')+1 | this.lang.indexOf('.com')+1 | this.lang.indexOf('.customers')+1 );
    this.lang = this.lang.substring( this.lang.indexOf('/')+1,  this.lang.indexOf('/',  this.lang.indexOf('/')+1) ).toUpperCase();
    this.initialized = false;
}

Calendar.prototype.setTarget = function(elem)
{
    var target = null;
    try
    {
        target = eval(elem)
    }
    catch(e)
    {
        target = null;
    }

    this.target = target;
}

Calendar.prototype.getTarget = function()
{
	return this.target;
}

Calendar.prototype.getDate = function()
{
	return new Date(this.date);
}

Calendar.prototype.setDate = function(date)
{
	this.date = date;
}

Calendar.prototype.getLang = function()
{
	return this.lang.toUpperCase();
}

Calendar.prototype.printResult = function(elem)
{
	var target = this.getTarget();
	var date = new Date(parseInt(elem.name));
	var dayNum = (date.getDate() < 10) ? '0' + date.getDate() : date.getDate();
	var month = date.getMonth() + 1;
	var monthNum = ( month < 10) ? '0' + month : month;
	var value = target.value;
	/* 03 dek'07 */
	// target.value = dayNum + '.' + monthNum + '.' + date.getFullYear();
	this.target[1].value = dayNum + '.' + monthNum + '.' + date.getFullYear();
	/* / 03 dek'07 */
	// alert(target +' / '+ target.tagName +' #'+  target.id +' .'+ target.className +' == '+ target.value)

	startD = (parent.document.search['search.startDate']) ? parent.document.search['search.startDate'] : document.search['search.startDate'];
	endD = (parent.document.search['search.endDate']) ? parent.document.search['search.endDate'] : document.search['search.endDate'];

	/* 03 dek'07 */
  // startDate = startD.value.split('.').reverse().join('');
	// endDate = endD.value.split('.').reverse().join('');
  startDate = startD[1].value.split('.').reverse().join('');
	endDate = endD[1].value.split('.').reverse().join('');
	/* / 03 dek'07 */

	/* 03 dek'07 */
  // if (startDate > endDate && (startD.value && endD.value))
  if (startDate > endDate && (startD[1].value && endD[1].value))
  /* / 03 dek'07 */
	{
		alert(parent.errorDate);
		target.value = value;
		return false;
	};
	this.process(false);
}

Calendar.prototype.setFromMonth = function(num)
{
	this.fromMonth = num;
}
Calendar.prototype.setToMonth = function(num)
{
	this.toMonth = num;
}
Calendar.prototype.setFromYear = function(num)
{
	this.fromYear = num;
}
Calendar.prototype.setToYear = function(num)
{
	this.toYear = num;
}
Calendar.prototype.setFromDay = function(num)
{
	this.fromDay = num;
}
Calendar.prototype.setToDay = function(num)
{
	this.toDay = num;
}

Calendar.prototype.nextMonth = function()
{
    var oldDate = new Date(this.date);
    var newDate = new Date(oldDate.setMonth(oldDate.getMonth() + 1, oldDate.getDate()));
    if(this.isValidDate(newDate, 'MONTH'))
    {
        this.date = newDate;
        this.process(true);
    }
}

Calendar.prototype.prevMonth = function()
{
    var oldDate = new Date(this.date);
    var newDate = new Date(oldDate.setMonth(oldDate.getMonth() - 1, oldDate.getDate()));
    if(this.isValidDate(newDate, 'MONTH'))
    {
        this.date = newDate;
        this.process(true);
    }
}

Calendar.prototype.setMonth = function(num)
{
    var newDate = new Date(this.date);
    newDate.setMonth(num, newDate.getDate());
    if(this.isValidDate(newDate, 'MONTH'))
    {
        this.date = new Date(newDate);
        this.process(true);
    }
    else
    {
        if(this.date.getFullYear() == this.fromYear)
        {
            newDate.setMonth(this.fromMonth, newDate.getDate());
        }
        else if(this.date.getFullYear() == this.toYear)
        {
            newDate.setMonth(this.toMonth, newDate.getDate());
        }
        this.date = new Date(newDate);
        this.process(true);
    }
}

Calendar.prototype.setYear = function(num)
{
    var newDate = new Date(this.date);
    newDate.setFullYear(num, newDate.getMonth(), newDate.getDate());
    if(this.isValidDate(newDate, 'YEAR'))
    {
        if(!this.isValidDate(newDate, 'MONTH'))
        {
            if(this.date.getFullYear() == this.fromYear)
            {
                newDate.setMonth(this.fromMonth, newDate.getDate());
            }
            else if(this.date.getFullYear() == this.toYear)
            {
                newDate.setMonth(this.toMonth, newDate.getDate());
            }
        }
        this.date = new Date(newDate);
        this.process(true);
    }
}

Calendar.prototype.isValidDate = function(date, mode)
{
    mode = (typeof(mode) == 'string') ? mode : "ALL";
    var from = 0;
    var to = 0;
    var curr = 0;
    if(mode.toUpperCase() == 'YEAR')
    {
        from = parseInt(this.fromYear);
        to = parseInt(this.toYear);
        curr = parseInt(date.getFullYear());
    }
    else if(mode.toUpperCase() == 'MONTH')
    {
        from = parseInt(this.fromYear + '' + ( (this.fromMonth < 10) ? '0'+this.fromMonth : this.fromMonth ));
        to = parseInt(this.toYear + '' + ( (this.toMonth < 10) ? '0'+this.toMonth : this.toMonth ));
        curr = parseInt(date.getFullYear() + '' + ( (date.getMonth() < 10) ? '0'+date.getMonth() : date.getMonth() ));
    }
    else
    {
        from = parseInt(this.fromYear + '' + ( (this.fromMonth < 10) ? '0'+this.fromMonth : this.fromMonth ) + '' + ( (this.fromDay < 10) ? '0'+this.fromDay : this.fromDay ));
        to = parseInt(this.toYear + '' + ( (this.toMonth < 10) ? '0'+this.toMonth : this.toMonth ) + '' + ( (this.toDay < 10) ? '0'+this.toDay : this.toDay ) );
        curr = parseInt(date.getFullYear() + '' + ( (date.getMonth() < 10) ? '0'+date.getMonth() : date.getMonth() ) + '' + ( (date.getDate() < 10) ? '0'+date.getDate() : date.getDate() ));
    }
    return (curr >= from && curr <= to);
}

Calendar.prototype.init = function (prefix)
{
    this.mainNode = document.getElementById(prefix);
    this.root = this.mainNode.getElementsByTagName('TABLE')[0];
    this.header = this.root.tHead;
    this.body = this.root.tBodies[this.root.tBodies.length - 1];

    if(!this.initialized)
    {
        this.initGlobalVariables();
    }
}

Calendar.prototype.show = function(x)
{
  if(!this.mainNode)
  {
		return false;
	}

  if(this.mainNode.offsetHeight > 0)
	{
		this.hide();
	}	
	else
	{
		this.process(true);
	}
}

Calendar.prototype.hide = function()
{
	this.process(false);
}

Calendar.prototype.process = function(show)
{
		parent.clearT();
		x = false;
		if(parent.bugIE) x = (this.root.parentNode.id.indexOf('1') > -1) ? 1 : 2;

    if(this.buffer == null)
    {
        this.buffer = this.root.cloneNode(true);
        this.buffer.style.display = 'none';
    }

    if(this.wasShown) // if was shown, then we need to clear old values
    {
        var count = this.root.tHead.rows.length;
        for(var i=0; i<count; i++)
        {
            this.root.tHead.deleteRow(i);
        }
        for(var i=0; i<this.root.tBodies.length; i++)
        {
            count = this.root.tBodies[i].rows.length;
            for(var j=count-1; j>=0; j--)
            {
                this.root.tBodies[i].deleteRow(j);
            }
        }

        // then insert default templates
        for(var i=0; i<this.buffer.tHead.rows.length; i++)
        {
            this.header.appendChild(this.buffer.tHead.rows[i].cloneNode(true));
        }
        for(var i=0; i<this.buffer.tBodies.length; i++)
        {
            for(var j=0; j<this.buffer.tBodies[i].rows.length; j++)
            {
                this.root.tBodies[i].appendChild(this.buffer.tBodies[i].rows[j].cloneNode(true));
            }
        }

        this.wasShown = false;
    }

    if(!show)
    {
			if(x) parent.document.getElementById('calendar'+x+'_DIV').firstChild.className='';
      this.root.parentNode.style.display = 'none';
      if (typeof(parent.bugIE)!="undefined" && typeof(parent.searchSelect)!="undefined") {
        parent.searchSelectParent.style.left = "0px";
        parent.searchSelect.style.marginLeft = "0px";
        parent.searchSelectParent.style.width = "174px";
        parent.searchSelect.style.visibility = 'visible';
      }
      return true;
    }

    this.parse(this.header);
    this.getDays();
    this.prepareDayRows();

	if(this.monthSelector)
	{
		this.initMonthSelect(this.monthSelector.id)
	}
	if(this.yearSelector)
	{
		this.setYearSelectedIndex();
	}

	if(show)
	{
      if (typeof(parent.Menu)!="undefined" && parent.Menu.close) {
        parent.Menu.clearTimeout();
        parent.Menu.close();
      }
			this.root.parentNode.style.display = 'block';
			if(x)
			{
				parent.document.getElementById('calendar'+x+'_DIV').firstChild.className = 'show';
				parent.document.getElementById('calendar'+x+'_DIV').firstChild.width = document.getElementsByTagName('table')[0].scrollWidth + 18;
				parent.document.getElementById('calendar'+x+'_DIV').firstChild.height = document.getElementsByTagName('table')[0].scrollHeight + 12;
			}
			this.wasShown = true;
	}
  // alert(typeof(parent.bugIE) +','+ typeof(parent.searchSelect))
  if (typeof(parent.bugIE)!="undefined" && typeof(parent.searchSelect)!="undefined") {
    // alert(parent.bugIE +', '+ parent.searchSelect)
    if (parent.bugIE && parent.searchSelect) {
      var myX = this.target.offsetLeft;
      var myY = this.target.offsetTop;
      var elCal = this.target;
      while(elCal.offsetParent) {
        elCal=elCal.offsetParent;
        myX += elCal.offsetLeft;
        myY += elCal.offsetTop;
        // alert(elCal +', '+ elCal.tagName +', '+ elCal.id +', '+ elCal.className );
      }
      var x1 = myX-102;
      var x2 = x1 + 192;
      var x3 = parent.searchSelect.myX;
      var x4 = parent.searchSelect.myX + parent.searchSelect.offsetWidth;
      // alert(4)
      var cross1 = x3>x1 && x3<x2;
      var cross2 = x4>x1 && x4<x2;
      var cross3 = x1<x3 && x2>x4;
      // alert(x1 +', '+ x2 +', '+ x3 +', '+ x4 +'\n'+ cross1 +', '+ cross2 +', '+ cross3);
      var cross = cross1 || cross2 || cross3;
      if (!cross) {
        parent.searchSelectParent.style.left = "0px";
        parent.searchSelect.style.marginLeft = "0px";
        parent.searchSelectParent.style.width = "174px";
      } else if (cross1) {
        var dx = x2 - x3;
        dx -= 1;
        parent.searchSelectParent.style.left = dx + "px";
        parent.searchSelect.style.marginLeft = -1*dx + "px";
        // alert(dx +'\n'+ searchSelectParent.style.left +'\n'+ searchSelect.style.marginLeft);
      } else if (cross2) {
        var dx = x4 - x1;
        parent.searchSelectParent.style.left = "0px";
        parent.searchSelect.style.marginLeft = "0px";
        parent.searchSelectParent.style.width = 174-dx +"px";
        // alert(dx +'\n'+ searchSelectParent.offsetWidth +'\n'+ searchSelect.offsetWidth);
      } else if (cross3) {
        parent.searchSelect.style.visibility = 'hidden';
      }
    }
  }
}

Calendar.prototype.parse = function(node, value)
{
    if(node.nodeType == 3)   // if text node
    {
        var text = node.nodeValue;
        var endIndex = text.indexOf(']');
        var startIndex = text.indexOf('[');

        while(endIndex > startIndex)
        {
            var paramName = text.substring(startIndex+1, endIndex);
            if(value)
            {
                text = text.replace('[' + paramName + ']', value);
            }
            else
            {
                text = text.replace('[' + paramName + ']', this.getParamValue(paramName));
            }

            endIndex = text.indexOf(']');
            startIndex = text.indexOf('[');
        }

        node.nodeValue = text;
    }
    else if(node.nodeType == 1) // if HTML object node
    {
        var nodes = node.childNodes;
		if(node.tagName == 'INPUT')
		{
			node.value = node.value.replace('[NUM]', value);
		}
        for(var i=0; i<nodes.length; i++)
        {
           this.parse(nodes[i], value); // recursive parse child nodes  
        }
    }
}

Calendar.prototype.getDays = function()
{
    this.days = new Array();
    var tmpDate = new Date(this.date);

    tmpDate.setDate(1);

    var offsetLeft = tmpDate.getDay() - 1;
    if(tmpDate.getDay() == 0)
    {
        offsetLeft = 6;
    }

    this.daysInMonth = getDaysInMonth(tmpDate);
    var offsetRight = 7 - ( new Date( tmpDate.setDate(this.daysInMonth) ) ).getDay();
    offsetRight = ( offsetRight == 7 ) ? 0 : offsetRight;

    var j = 1;
    for(var i = offsetLeft * -1; i < (this.daysInMonth + offsetRight); i++ )
    {
        if(this.daysInMonth <= i)
        {
            this.days[this.days.length] = j;
            j++;
        }
        else
        {
            this.days[this.days.length] = (i >= 0) ? i+1 : i;
        }
    }
}

Calendar.prototype.getParamValue = function(name)
{
    var result = '';

    switch(name)
    {
        case 'MONTH_NAME':
            result = MONTH_NAMES[this.lang][this.date.getMonth()];
            break;
        case 'FULL_YEAR':
            result = this.date.getFullYear();
            break;
    }

    return result;
}

Calendar.prototype.prepareDayRows = function()
{
    var rows = this.days.length / 7 - 1;

    for(var i=0; i<rows; i++)
    {
        this.body.appendChild( this.body.rows[0].cloneNode(true) );
    }

    var k = 0;
    var daysInPrevMonth = 0;
    for(var i=0; i<this.body.rows.length; i++)
    {
        tr = this.body.rows[i];
        for(var j=0; j<tr.cells.length; j++)
        {
            var day = new Date(this.date);

            var td = tr.cells[j];

            if(this.days[k] < 1) // if prev month
            {
                var month = this.date.getMonth() - 1;
                if( month < 0 )
                {
                    day.setFullYear(this.date.getFullYear() - 1, 11, day.getDate());
                }
                var prevMonthDays = getDaysInMonth(day);
                var dayNum = prevMonthDays + this.days[k] + 1;
                day.setMonth(day.getMonth(), dayNum);                
                td.className = 'prevMonth';
                daysInPrevMonth++;
            }
            else if(k >= this.daysInMonth + daysInPrevMonth) // if next month
            {
                td.className = 'nextMonth';
                day.setMonth(this.date.getMonth() + 1, this.days[k]);
            }
            else
            {
                day.setDate(this.days[k]);
                if(day.getDay() == 0 || day.getDay() == 6)
                {
                    td.className = 'holiday';
                }

                var now = new Date();
                if( day.getFullYear()+''+day.getMonth()+''+day.getDate() == now.getFullYear()+''+now.getMonth()+''+now.getDate() )
                {
                    td.className = 'today';
                }
            }

            var isValid = this.isValidDate(day);

            if(!isValid)
            {
                td.className = 'notValid';
            }

            this.parse(td, day.getDate());
            this.setDayClickHandler(td, day.getTime(), isValid);

            k++;
        }
    }
}

Calendar.prototype.setDayClickHandler = function(td, value, valid)
{
    var links = td.getElementsByTagName('INPUT');
    if(links.length == 0)
    {
        links = td.getElementsByTagName('A');
    }
    for(var i=0; i<links.length; i++)
    {
        if(valid)
        {
            links[i].name = value;
        }
        else
        {
            links[i].onclick = function() {return false;}
        }
    }
}

Calendar.prototype.initMonthSelect = function(id)
{
	this.monthSelector = getSelectById(id);

    if(!this.monthSelector)
	{
		alert('Ошибка инициализации!\nНе могу найти SELECT c ID="' + id + '"');
		return false;
	}

	this.monthSelector.options.length = 0;
	var index = 0;
    var selected = 0;
    for(var i = 1; i <= 12; i++)
	{
		if( this.toYear == this.date.getFullYear() && this.toMonth < i - 1 )
		{
			break;
		}
		else if( this.fromYear == this.date.getFullYear() && this.fromMonth > i - 1 )
		{
			continue;
		}
        if(i - 1 == this.date.getMonth())
        {
            selected = index;
        }
        appendOption(this.monthSelector, i - 1, MONTH_NAMES[this.lang][i-1], index );
		index++;
	}

	this.monthSelector.selectedIndex = selected;
}

Calendar.prototype.initYearSelect = function(id)
{
	this.yearSelector = getSelectById(id);

    if(!this.yearSelector)
	{
		alert('Ошибка инициализации!\nНе могу найти SELECT, c ID="' + id + '"');
		return false;
	}
	var index = 0;
	for(var i = this.toYear; i >= this.fromYear; i--)
	{
		appendOption(this.yearSelector, i, i, index);
		index++;
	}
	this.yearSelector.selectedIndex = (this.toYear - this.fromYear) - (this.date.getFullYear() - this.fromYear);
}

Calendar.prototype.setYearSelectedIndex = function()
{
	var index = (this.toYear - this.fromYear) - (this.date.getFullYear() - this.fromYear);
	getSelectById(this.yearSelector.id).selectedIndex = index;
}

Calendar.prototype.initGlobalVariables = function()
{
    var lang = getAttributeByName(this.mainNode, 'LANG');
    if(lang != '')
    {
        this.lang = lang.toUpperCase();
    }

    var fromDate = getAttributeByName(this.mainNode, 'FROM_DATE');
    if(fromDate != '')
    {
        var fromDateVals = fromDate.split('.');
        if(fromDateVals.length == 0)
        {
            this.setFromYear(parseInt(fromDate));
        }
        else if(fromDateVals.length == 2)
        {
            this.setFromMonth(parseInt(fromDateVals[0]) - 1);
            this.setFromYear(parseInt(fromDateVals[1]));
        }
        else if(fromDateVals.length == 3)
        {
            this.setFromDay(parseInt(fromDateVals[0]));
            this.setFromMonth(parseInt(fromDateVals[1]) - 1);
            this.setFromYear(parseInt(fromDateVals[2]));
        }
    }

    var toDate = getAttributeByName(this.mainNode, 'TO_DATE');
    if(toDate != '')
    {
        var toDateVals = toDate.split('.');
        if(toDateVals.length == 0)
        {
            this.setToYear(parseInt(toDate));
        }
        else if(toDateVals.length == 2)
        {
            this.setToMonth(parseInt(toDateVals[0]) - 1);
            this.setToYear(parseInt(toDateVals[1]));
        }
        else if(toDateVals.length == 3)
        {
            this.setToDay(parseInt(toDateVals[0]));
            this.setToMonth(parseInt(toDateVals[1]) - 1);
            this.setToYear(parseInt(toDateVals[2]));
        }
    }

    var target = getAttributeByName(this.mainNode, 'TARGET');
    if(target != '')
    {
        this.setTarget(target);
    }

    var startDate = getAttributeByName(this.mainNode, 'START_DATE');
    if(startDate != '')
    {
        var startDateVals = startDate.split('.');
        var startTime = new Date();

        if(startDateVals.length == 0)
        {
            startTime.setFullYear(parseInt(startDate));
        }
        else if(toDateVals.length == 2)
        {
            startTime.setFullYear(parseInt(startDateVals[1]), parseInt(startDateVals[0]) - 1);
        }
        else if(toDateVals.length == 3)
        {
            startTime.setFullYear(parseInt(startDateVals[2]), parseInt(startDateVals[1]) - 1, parseInt(startDateVals[0]));
        }

        if(this.isValidDate(startTime))
        {
            this.setDate(new Date(startTime));
        }
    }

    this.initialized = true;
}

function getSelectById(id)
{
	if(this.root)
	{
		if(!this.selects)
		{
			this.selects = this.root.getElementsByTagName('SELECT');
		}
		for(var i = 0; i < this.selects.length; i++)
		{
			if(this.selects[i].id == id)
			{
				return this.selects[i];
			}
		}
		return null;
	}
	else
	{
		return document.getElementById(id);
	}
}

function getDaysInMonth(date)
{
    var tmpDate = new Date(date);
    if( ( new Date( tmpDate.setDate(28) ) ).getMonth() != ( new Date( tmpDate.setDate(29) ) ).getMonth() )
    {
        return 28;
    }
    else if( ( new Date( tmpDate.setDate(29) ) ).getMonth() != ( new Date( tmpDate.setDate(30) ) ).getMonth() )
    {
        return 29;
    }
    else if( ( new Date( tmpDate.setDate(30) ) ).getMonth() != ( new Date( tmpDate.setDate(31) ) ).getMonth() )
    {
        return 30;
    }
    else
    {
        return 31;
    }
}

function appendOption(elem, value, text, index)
{
    elem.options[index] = new Option(text, value);
}

function getAttributeByName(elem, name)
{
	name = name.toUpperCase();
	try
	{
		var value = elem.getAttribute(name);
		return ( (value) ? value : '' );
	}
	catch(e)
	{
		return '';
	}
	return '';
}

