	var TimezoneOffset = 9.5;  // adjust for time zone
	
	var localtime           = new Date();
	
	var ms = localtime.getTime() + (localtime.getTimezoneOffset() * 60000) + TimezoneOffset * 3600000;

	localtime				= new Date(ms);
	
    var calendarMonths      = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
    var daysOfWeek          = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    
    var daysPerWeek         = 7;
    var daysPerMonth        = 31;
    
    var startDate           = new Date();
    var endDate             = new Date();
    
    var startCalendar       = new Date();
    var endCalendar         = new Date();

    var limitCalendar       = true;
    var limitYear           = localtime.getUTCFullYear() + 4;
    var regexDate           = /^([0-9]{4,})-([0-9]{1,})-([0-9]{1,})\s{0,}/g;
    
    var YEAR                = 1;
    var MONTH               = 2;
    var DAY                 = 3;

    function daysInMonth(month,year) {
    	var m = [31,28,31,30,31,30,31,31,30,31,30,31];
    	if (month != 1) return m[month];
    	if (year%4 != 0) return m[1];
    	if (year%100 == 0 && year%400 != 0) return m[1];
    	return m[1] + 1;
    } 
    
    
    function selectDateByName(dateName)
    {
        day =  localtime.getUTCDate();
        month =  localtime.getUTCMonth();
        year =  localtime.getUTCFullYear();

    	switch(dateName)
    	{
    		case 'today':
    			
    	        startDate.setUTCDate(day);
    	        startDate.setUTCMonth(month);
    	        startDate.setFullYear(year);
    	        
    	        endDate.setUTCDate(day);
    	        endDate.setUTCMonth(month);
    	        endDate.setUTCFullYear(year);
    	        
    	        renderCalendar('start', startDate.getUTCMonth(), startDate.getUTCFullYear());
    	        renderCalendar('end', endDate.getUTCMonth(), endDate.getUTCFullYear());
    	        
    	        id = startDate.getUTCFullYear()+'-'+(startDate.getUTCMonth()+1)+'-'+startDate.getUTCDate();
    	        idE = endDate.getUTCFullYear()+'-'+(endDate.getUTCMonth()+1)+'-'+endDate.getUTCDate();
    	        
    	        setDate('start', $(id));
    	        setDate('end', $(idE));
    	        
    		break;
    		
    		case 'yesterday':
    			
    			yesterday = day - 1;
    	         if(yesterday < 0)
    	         {
    	        	 if(month==0)
    	        	 {
    	        		 month = 12;
    	        		 year = year-1;
    	        	 }
    		         month = month;
    		         yesterday = daysInMonth(month)+(day);
    	         }
    	         
    	        startDate.setUTCDate(yesterday);
    	        startDate.setUTCMonth(month);
    	        startDate.setFullYear(year);
    	        
    	        endDate.setUTCDate(yesterday);
    	        endDate.setUTCMonth(month);
    	        endDate.setUTCFullYear(year);
    	        
    	        renderCalendar('start', startDate.getUTCMonth(), startDate.getUTCFullYear());
    	        renderCalendar('end', endDate.getUTCMonth(), endDate.getUTCFullYear());
    	        
    	        id = startDate.getUTCFullYear()+'-'+(startDate.getUTCMonth()+1)+'-'+startDate.getUTCDate();
    	        idE = endDate.getUTCFullYear()+'-'+(endDate.getUTCMonth()+1)+'-'+endDate.getUTCDate();
    	        
    	        setDate('start', $(id));
    	        setDate('end', $(idE));
    			break;
    		
    		case 'last-seven':
    			
    			break;
    			
    		case 'last-month':
    			lastmonth = month-1;
    			
    			if(lastmonth<0)
    			{
    				lastmonth = 11;
    				year = year-1;
    			}
    			
	   	        startDate.setUTCDate(1);
	   	        startDate.setUTCMonth(lastmonth);
	   	        startDate.setFullYear(year);
	   	        
	   	        endDate.setUTCMonth(lastmonth);
	   	        endDate.setUTCDate(daysInMonth(lastmonth));
	   	        endDate.setUTCFullYear(year);
	   	        
	   	        renderCalendar('start', startDate.getUTCMonth(), startDate.getUTCFullYear());
	   	        renderCalendar('end', endDate.getUTCMonth(), endDate.getUTCFullYear());
	   	        
	   	        id = startDate.getUTCFullYear()+'-'+(startDate.getUTCMonth()+1)+'-'+startDate.getUTCDate();
	   	        idE = endDate.getUTCFullYear()+'-'+(endDate.getUTCMonth()+1)+'-'+endDate.getUTCDate();
	   	        
	   	        setDate('start', $(id));
	   	        setDate('end', $(idE));

    			break;
    			
    		case 'this-month':
    				   	         
	   	        startDate.setUTCDate(1);
	   	        startDate.setUTCMonth(month);
	   	        startDate.setFullYear(year);

	   	        endDate.setUTCDate(day);
	   	        endDate.setUTCMonth(month);
	   	        endDate.setUTCFullYear(year);
	   	        
	   	        renderCalendar('start', startDate.getUTCMonth(), startDate.getUTCFullYear());
	   	        renderCalendar('end', endDate.getUTCMonth(), endDate.getUTCFullYear());
	   	        
	   	        id = startDate.getUTCFullYear()+'-'+(startDate.getUTCMonth()+1)+'-'+startDate.getUTCDate();
	   	        idE = endDate.getUTCFullYear()+'-'+(endDate.getUTCMonth()+1)+'-'+endDate.getUTCDate();
	   	        
	   	        setDate('start', $(id));
	   	        setDate('end', $(idE));
    			
    			
    		default:
    			break;
    		
    	}
    	
    }
    
    
    function selectDateRange(dateRange)
    {
      
         day =  (localtime.getUTCDate()-dateRange);
         month =  localtime.getUTCMonth();
         year =  localtime.getUTCFullYear();

         if(day < 0)
         {
        	 if(month==0)
        	 {
        		 month = 12;
        		 year = year-1;
        	 }
	         month = month-1;

	        //count the days of the previous month
	         startCalendar.setUTCMonth(month);
	         //startCalendar.setUTCDate(0);
	

	         
//	         totaldays = 30;
//	         for(dm=0; dm<daysInMonth(month); dm++)
//	         {
//	            startCalendar.setUTCDate(startCalendar.getUTCDate()+1);
//	            if(startCalendar.getUTCDate() < dm){
//	                totaldays = 31;
//	            }
//	         }
	         
	         day = daysInMonth(month+1)+(day)+1;
	         startCalendar.setUTCMonth(month);
	         startCalendar.setUTCDate(day);
	         startCalendar.setUTCFullYear(year);
         }

         alert('setting '+day+'.'+month+'.'+year);
         
        startDate.setUTCDate(day);
        startDate.setUTCMonth(month);
        startDate.setFullYear(year);
//        startDate.setUTCFullYear(localtime.getUTCFullYear());
        
        endDate.setUTCDate(localtime.getUTCDate());
        endDate.setUTCMonth(localtime.getUTCMonth());
        endDate.setUTCFullYear(localtime.getUTCFullYear());
        
        renderCalendar('start', startDate.getUTCMonth(), startDate.getUTCFullYear());
        renderCalendar('end', endDate.getUTCMonth(), endDate.getUTCFullYear());
        
        id = startDate.getUTCFullYear()+'-'+(startDate.getUTCMonth()+1)+'-'+startDate.getUTCDate();
        idE = endDate.getUTCFullYear()+'-'+(endDate.getUTCMonth()+1)+'-'+endDate.getUTCDate();
        
        alert('s'+id);
        alert('e'+idE);
        
        setDate('start', $(id));
        setDate('end', $(idE));
      
    
    }



    function initCalendar()
    {
        // check for pre-defined start date
        if($('_unboundStartDate').value.strip() != '')
        {
            // find current start date
            currentStartDate = regexDate.exec($('_unboundStartDate').value);
            regexDate.lastIndex = 0;
            
            // set active start date
            startDate.setUTCDate(currentStartDate[DAY]);
            startDate.setUTCMonth(currentStartDate[MONTH]-1);
            startDate.setUTCFullYear(currentStartDate[YEAR]);
            
            // set calendar start date point
            startCalendar.setUTCMonth(currentStartDate[MONTH]-1);
            startCalendar.setUTCFullYear(currentStartDate[YEAR]);
        }
        else // default to today
        {
            startDate.setUTCDate(localtime.getUTCDate());
            startDate.setUTCMonth(localtime.getUTCMonth());
            startDate.setUTCFullYear(localtime.getUTCFullYear());
            
            $('_unboundStartDate').value = startDate.getUTCFullYear()+'-'+(startDate.getUTCMonth()+1)+'-'+startDate.getUTCDate();
        }
        
        // check for pre-defined start date
        if($('_unboundEndDate').value.strip() != '')
        {
            // find current start date
            currentEndDate = regexDate.exec($('_unboundEndDate').value);
            regexDate.lastIndex = 0;
            
            // set active start date
            
           endDate.setUTCDate(currentEndDate[DAY]);
            endDate.setUTCMonth(currentEndDate[MONTH]-1);
            
            endDate.setUTCFullYear(currentEndDate[YEAR]);
            
            // set calendar start date point
            endCalendar.setUTCMonth(currentEndDate[MONTH]-1);
            endCalendar.setUTCFullYear(currentEndDate[YEAR]);
        }
        else // default to 1 year from today
        {
            endDate.setUTCDate(localtime.getUTCDate());
            endDate.setUTCMonth(localtime.getUTCMonth());
            endDate.setUTCFullYear(localtime.getUTCFullYear()+1);
            
            $('_unboundEndDate').value = endDate.getUTCFullYear()+'-'+(endDate.getUTCMonth()+1)+'-'+endDate.getUTCDate();
        }
        
        renderCalendar('start', startDate.getUTCMonth(), startDate.getUTCFullYear());
        renderCalendar('end', endDate.getUTCMonth(), endDate.getUTCFullYear());
    }
    
    function renderCalendar( mode, month, year )
    {
        var html = '<table class="calendar" style="width:200px;">';

        if(mode == 'start')
        {
            var activeCalendar = startCalendar;
            var activeDate = startDate;
        }
        else if(mode == 'end')
        {
            var activeCalendar = endCalendar;
            var activeDate = endDate;
            
        }
        else{ alert('returning'); return false; }
                
        // reset start date
        
        activeCalendar.setUTCDate(1);
        
        monthExceeded = false;
        
        // check for valid month
        if(month == 0 || month > 0)
        {
            activeCalendar.setUTCMonth(month);
            activeCalendar.setUTCFullYear(year);
        }
        else if(month < 0)
        {
            // reset month to December if less than 0
            month = 11;
            
            activeCalendar.setUTCMonth(11);
            activeCalendar.setUTCFullYear((year - 1));
            
            year = (year - 1);
        }
        else
        {
            // reset to current active month for calendar
            month = activeCalendar.getUTCMonth();
        }
        
        if(month > 11)
        {
            if((year + 1) > limitYear)
                monthExceeded = true;
                else
                monthExceeded = false;
            
            month = 0;
            
            activeCalendar.setUTCDate(1);
            activeCalendar.setUTCMonth(0);
            activeCalendar.setUTCFullYear((year + 1));
        }
        
        /*        
        if(month > 11 && (year+1) > limitYear)
        {
            monthExceeded = true;
            
            alert('Exceeded >> Month: '+month+' Year: '+year);
        } 
        else
        {
            monthExceeded = false;
        }
        */
        
//        if(limitCalendar)
//        if(activeCalendar.getUTCFullYear() < localtime.getUTCFullYear())
//        {
//            month = 0;
//            
//            activeCalendar.setUTCMonth(0);
//            activeCalendar.setUTCFullYear(localtime.getUTCFullYear());
//        }
//        
//        if(limitCalendar)
//        if(month < localtime.getUTCMonth() && activeCalendar.getUTCFullYear() <= localtime.getUTCFullYear())
//        {
//            
//            month = localtime.getUTCMonth();
//            
//            activeCalendar.setUTCDate(1);
//            activeCalendar.setUTCMonth(localtime.getUTCMonth());
//            activeCalendar.setUTCFullYear(localtime.getUTCFullYear());
//            
//        }
//        
//        if(limitCalendar)
//            if(year >= limitYear && monthExceeded)
//            {
//                month=11;
//                activeCalendar.setUTCDate(1);
//                activeCalendar.setUTCMonth(11);
//                activeCalendar.setUTCFullYear(limitYear);
//                
//            }
        
        
        html += '<tr>';
        html += '<td><a href="#" class="monthSelect" style="width:100%;height:100%;" onclick="renderCalendar(\''+mode+'\','+(activeCalendar.getUTCMonth()-1)+','+activeCalendar.getUTCFullYear()+');">&lt;</a></td>';
        html += '<td colspan="5">'+calendarMonths[activeCalendar.getUTCMonth()]+', '+activeCalendar.getUTCFullYear()+'</td>';
        html += '<td><a href="#" class="monthSelect" style="width:100%;height:100%;" onclick="renderCalendar(\''+mode+'\','+(activeCalendar.getUTCMonth()+1)+','+activeCalendar.getUTCFullYear()+');">&gt;</a></td>';
        html += '</tr>';
        html += '<tr>';
        
        // build DaysOfWeek
        for(d=0; d<daysOfWeek.length; d++)
        {
            html += '<td>'+daysOfWeek[d].substr(0,3)+'</td>';
        }
        
        html += '</tr>';
        html += '<tr>';
        
        // build Calendar empty cells as required
        for(empty=0; empty<activeCalendar.getUTCDay(); empty++)
        {
            html += '<td>&nbsp;</td>';
        }
        
        // build CalendarDaysOfMonth; if valid
        for(dm=0; dm<daysPerMonth; dm++)
        {
            // check if DayOfMonth still within current Month
            if(activeCalendar.getUTCMonth() == month)
            {
                // set starting date
                if(activeCalendar.getUTCDate() > dm)
                {
                    dayOfWeek = activeCalendar.getUTCDay();
                }
                
                // check for Sunday
                if(dayOfWeek == 0)
                {
                    html += '<tr>';
                }
                
                if(dayOfWeek != 7)
                {
                    // default DOM.id
                    id = activeCalendar.getUTCFullYear()+'-'+(activeCalendar.getUTCMonth()+1)+'-'+activeCalendar.getUTCDate();
                    
                    if(activeCalendar.getUTCDate() == activeDate.getUTCDate() && activeCalendar.getUTCMonth() == activeDate.getUTCMonth() && activeCalendar.getUTCFullYear() == activeDate.getUTCFullYear())
                    {
                        dclass = 'date_selected';
                        title = 'Your Campaign '+mode+' date';
                    }
                    else if(activeCalendar.getUTCDate() == localtime.getUTCDate() && activeCalendar.getUTCMonth() == localtime.getUTCMonth() && activeCalendar.getUTCFullYear() == localtime.getUTCFullYear())
                    {
                        dclass   = 'date_today';
                        title   = 'Today';
                    }
                    else if(limitCalendar && (activeCalendar.getUTCDate() <= lowerLimitDate && activeCalendar.getUTCMonth() <= lowerLimitMonth && activeCalendar.getUTCFullYear() <= lowerLimitYear))
                    {
                        dclass   = 'date_invalid';
                        id      = 'invalid';
                        title   = '';
                    }
                    else if(limitCalendar && (activeCalendar.getUTCDate() >= higherLimitDate && activeCalendar.getUTCMonth() >= higherLimitMonth && activeCalendar.getUTCFullYear() >= higherLimitYear))
                    {
                        dclass   = 'date_invalid';
                        id      = 'invalid';
                        title   = '';
                    }
                    else
                    {
                        dclass = 'date';
                        title = '';
                    }
                    
                    html += '<td id="'+id+'" class="'+dclass+'" onclick="setDate(\''+mode+'\', this);" title="'+title+'">'+activeCalendar.getUTCDate()+'</td>';
                
                }
                
                if(dayOfWeek == 7)
                {
                    html + '</tr>';
                }
                
                activeCalendar.setUTCDate((activeCalendar.getUTCDate() + 1));
                
            }
        }
        
        html += '</table>';
        
        if(mode == 'start')
            $('StartDateCalendar').innerHTML = html;
            else
            $('EndDateCalendar').innerHTML = html;
    }
    
    function setDate(mode, sender)
    {
        if(sender.id == 'invalid')
            return false;
        
        var chosenDate = sender.id.split('-');
        
        var chosenDateObj = new Date();
      
        chosenDateObj.setUTCMonth(chosenDate[1]-1);
        chosenDateObj.setUTCDate(chosenDate[2]);
        chosenDateObj.setUTCFullYear(chosenDate[0]);
        
        //alert(localtime);
        //alert(localtime.getFullYear()+' '+localtime.getMonth()+' '+localtime.getDate());
        //alert(endDate);
        if(mode == 'start')
        {
 
            $('_unboundStartDate').value = sender.id;  
            
            if(chosenDateObj.getUTCFullYear() > localtime.getFullYear() || (chosenDateObj.getUTCMonth() > localtime.getMonth() && chosenDateObj.getUTCFullYear() >= localtime.getFullYear()) || (chosenDateObj.getUTCDate() > localtime.getDate() && chosenDateObj.getUTCMonth() >= localtime.getMonth() && chosenDateObj.getUTCFullYear() >= localtime.getFullYear())){
            	alert('You can not specify a start date which is later than the current date');
                
                return false;
            }
            
            if(chosenDateObj.getUTCDate() > localtime.getDate() && chosenDateObj.getUTCMonth() >= localtime.getMonth() && chosenDateObj.getUTCFullYear() >= localtime.getFullYear())
            {
               
            	alert('You can not select start date that has no report data');
                    
                return false;
            }
            
            if( (endDate.getUTCFullYear() == chosenDateObj.getUTCFullYear() && endDate.getUTCMonth() < chosenDateObj.getUTCMonth())
                || (endDate.getUTCFullYear() < chosenDateObj.getUTCFullYear())
                || (endDate.getUTCFullYear() == chosenDateObj.getUTCFullYear() && endDate.getUTCMonth() == chosenDateObj.getUTCMonth() && endDate.getUTCDate() < chosenDateObj.getUTCDate()) )
            {
             
                endDate.setUTCDate(chosenDate[2]);
                endDate.setUTCMonth(chosenDate[1]);
                endDate.setUTCFullYear(chosenDate[0]);
                
                $('_unboundEndDate').value = sender.id;
            }
          
          
           
            startDate.setUTCMonth(chosenDate[1]);
            startDate.setUTCFullYear(chosenDate[0]);
            startDate.setUTCDate(chosenDate[2]);
             
        }
        else
        {

        	if(chosenDateObj.getUTCFullYear() > localtime.getFullYear() || (chosenDateObj.getUTCMonth() > localtime.getMonth() && chosenDateObj.getUTCFullYear() >= localtime.getFullYear()) || (chosenDateObj.getUTCDate() >localtime.getDate() && chosenDateObj.getUTCMonth() >= localtime.getMonth() && chosenDateObj.getUTCFullYear() >= localtime.getFullYear())){
            	alert('You can not specify an end date which is later than the current date');
                
                return false;
            }
        	
            if($('StartDateCustom'))
            {
            
                if($('StartDateCustom').checked && chosenDateObj.getUTCDate() <= startDate.getUTCDate() && chosenDateObj.getUTCMonth() <= startDate.getUTCMonth() && chosenDateObj.getUTCFullYear() <= startDate.getUTCFullYear())
                {
                    alert('You can not specify an end date which is prior to, or the same as, the current start date');
                    
                    return false;
                }
            }
            else 
            
            if((chosenDateObj.getUTCFullYear() < startDate.getUTCFullYear()) || (chosenDateObj.getUTCMonth() < startDate.getUTCMonth() && chosenDateObj.getUTCFullYear() <= startDate.getUTCFullYear()) || (chosenDateObj.getUTCDate() < startDate.getUTCDate() && chosenDateObj.getUTCMonth() <= startDate.getUTCMonth() && chosenDateObj.getUTCFullYear() <= startDate.getUTCFullYear()))
            {
				
                alert('You can not specify an end date which is prior to the current start date');
                    
                return false;
            }
            
            if((chosenDateObj.getUTCDate() >localtime.getDate() && chosenDateObj.getUTCMonth() >= localtime.getMonth() && chosenDateObj.getUTCFullYear() >= localtime.getFullYear()))
            {
               
            	alert('You can not select end date that has no report data');
                    
                return false;
            }
            
            
            $('_unboundEndDate').value = sender.id;
           
            
            endDate.setUTCMonth(chosenDate[1]);
            endDate.setUTCFullYear(chosenDate[0]);
            endDate.setUTCDate (chosenDate[2]);
        }
      
        initCalendar();
                   
    }

