var HCalendar = function(){
}

HCalendar.prototype = {
	generate: function() {
   	/* prepare values */
   	
    if (this.startHour > 23)
        this.startHour = 23;
    if (this.startHour< 0)
        this.startHour = 0;
    if (this.endHour > 23)
        this.endHour = 23;
    if (this.startHour < 0)
        this.startHour = 0;
    if (this.startMinute > 59)
        this.startMinute = 59;
    if (this.startHour < 0)
        this.startHour = 0;
    if (this.endMinute > 59 )
        this.endMinute = 59;
    if (this.startHour < 0)
        this.startHour = 0;
        
    var summary = this.summary;
    var url = this.url;

    var startdate = this.get_startdate();
    var enddate = this.get_enddate();

    var startMonthText = this.startMonth;

    var startDayText = this.startDay;

    var endDayText = this.endDay;


    var endMonthText = this.endMonth;

    var timezone = this.timezone;
    var description = this.description;
    
    if(!timezone) timezone = '';

    if(timezone > 0) timezone = timezone;

    var late = this.late_night()
    
    if (startdate['minute']) startdate['minute'] = this.pad(startdate['minute']);
    if (startdate['hour']) startdate['hour'] = this.pad(startdate['hour']);
    if (enddate['minute']) enddate['minute'] = this.pad(enddate['minute']);
    if (enddate['hour']) enddate['hour'] = this.pad(enddate['hour']);

    var dtstart = startdate['year'] + startdate['month'] + startdate['day'];

    if (startdate['hour']) {
        dtstart += 'T' + startdate['hour'] + startdate['minute'] + timezone;
    }

    if(this.startHour.length == 0){
        //bump
        enddate['day'] = this.pad(++enddate['day'])
    }
    
    var dtend = enddate['year'] + enddate['month'] + enddate['day'];

    if (enddate['hour']) {
        if(enddate['hour'].length < 2) {
            enddate['hour'] = '0' + enddate['hour'];
        }
        if (!enddate['minute'])
            enddate['minute'] = '00';
        dtend += 'T' + enddate['hour'] + enddate['minute'] + timezone;
    }
    
    var startOut = startMonthText + ' ' + startDayText;

    if (startdate['year'] != enddate['year']) {
        startOut += ', ' + startdate['year'];
    }

    var endOut = '';
    if(!late) {
        if(startdate['month'] != enddate['month'] || startdate['year'] != enddate['year']) {
            endOut += endMonthText + ' ';
        }

        if(!(startdate['month'] == enddate['month'] && startdate['year'] == enddate['year'] && startdate['day'] == enddate['day'])) {
            endOut += enddate['day'];
        } else {
            startOut += ', ' + startdate['year'];
        }
    }
    if(startdate['hour'] && startdate['minute']) {
        startOut += ' - ' + startdate['hour'] + ':' + startdate['minute'];
        if (endOut) {
            var collapse = true;
        }
    }

    if (enddate['hour'] && enddate['minute']) {
        if (collapse) {
            endOut += ' - '
        }
        endOut += enddate['hour'] + ':' + enddate['minute']
    }

    if(!(startdate['month'] == enddate['month'] && startdate['year'] == enddate['year'] && startdate['day'] == enddate['day'])) {
            endOut += ', ' + enddate['year'];
    }

   var location = this.location;

   /* set results field */
    var resultstr = '<div class="vevent">\n';
    if (url) {
        resultstr += ' <a class="url" href="' + url + '">\n';
    }
    resultstr += '  <abbr class="dtstart" title="' + dtstart +'">\n    ' + startOut + '\n  <\/abbr> - \n';
    
    if (!((startdate['year'] + startdate['month'] + startdate['day'] == enddate['year'] + enddate['month'] + enddate['day']) &&
            !enddate['hour'])) {
        resultstr += '  <abbr class="dtend" title="' + dtend + '">';
        if (endOut) resultstr += '\n    ' + endOut + '\n    ';
        resultstr += '<\/abbr>\n';
    }
    if (enddate['hour'] && enddate['minute']) resultstr += ' - ';
    resultstr += '  <span class="summary">\n     ' + this.escape_output(summary) + '\n   </span> ';
    if (location) resultstr += '- at\n  <span class="location">\n     ' + this.escape_output(location) + '\n   ' +
                '<\/span>';
    if (url) {
      resultstr += '\n </a>\n';
    }

    if(description) resultstr += '\n   <div class="description">\n      ' + this.escape_output(description) + '\n    </div>\n';

    resultstr += '\n<\/div>';

    return resultstr;
	},
	
	get_startdate: function() {
    var startdate = new Object;
    startdate['year'] =  this.startYear;
    startdate['month'] = this.startMonth;
    startdate['day'] =   this.startDay;
    startdate['hour'] =    this.startHour;
    startdate['minute'] =  this.startMinute;

    if(startdate['hour'] && !startdate['minute'])
        startdate['minute'] = '00';
    return startdate;
	},
	
	get_enddate: function(){
    var enddate = new Object;
    enddate['year'] =    this.endYear;
    enddate['month'] =   this.endMonth;
    enddate['day'] =     this.endDay;
    enddate['hour'] =    this.endHour;
    enddate['minute'] =  this.endMinute;

    return enddate;
	},
	
	update_endtime: function() {
    var enddate = this.get_enddate();
    var startdate = this.get_startdate();

    if (enddate['hour'] && startdate['hour'] &&
        startdate['year'] == enddate['year'] && 
        startdate['month'] == enddate['month'] && 
        startdate['day'] == enddate['day']) {

        var startTime = startdate['hour'] + startdate['minute'];
        var endTime = enddate['hour'] + enddate['minute'];

        if(startTime.length == 3) startTime = '0' + startTime;
        if (endTime.length == 3) endTime = '0' + endTime;
        
        if(endTime < startTime){
            this.increment_end_date();
        }
    }
	},
	
	increment_end_date: function() {
    var enddate = this.get_enddate();

    var d = new Date(enddate['year'], parseInt(enddate['month']) - 1, 
            parseInt(enddate['day']));

    d.setDate(++enddate['day']);

    this.set_enddate(d.getFullYear(), d.getMonth()+1, d.getDate());
	},
	
	late_night: function() {
    //convert to date objects
    var enddate = this.get_enddate();
    if(parseInt(enddate['hour']) < 6) {
        var endDate = new Date(enddate['year'], 
            this.endMonth,
            parseInt(enddate['day']));

        var startDate = new Date(this.startYear,
            this.startMonth,
            parseInt(this.startDay));
        //increment and test

        startDate.setDate(startDate.getDate() + 1);

        if(startDate.getYear() == endDate.getYear() && startDate.getMonth() == endDate.getMonth() && 
            startDate.getDay() == endDate.getDay()) {
            return true;
        }
   }
   
   return false;
	},
	
	escape_output: function(input){
    //this is not the most robust solution, but it should cover most cases
    var amp = /\s&\s/gi;
    var lt = /\s\<\s/gi;
    var gt = /\s>\s/gi;

    var temp = input.replace(amp,' &amp; ');
    temp = temp.replace(lt,' &lt; ');
    var output = temp.replace(gt,' &gt; ');
    return output;
	},
	
	set_startdate: function(year, month, day, hour, minute) {
    if (year)   this.startYear = year;
    if (month)  this.startMonth = month;
    if (day)    this.startDay = day;
    if(hour)    this.startHour = hour;
    if (minute) this.startMinute = minute;
	},
	
	set_enddate: function(year, month, day, hour, minute) {
    if (year)   this.endYear = year;
    if (month)  this.endMonth = month;
    if (day)    this.endDay = day;
    if (hour)   this.endHour = hour;
    if (minute) this.endMinute = minute;
	},
	
	reset: function() {
    var d = new Date();

    var month = d.getMonth() + 1;
    month = this.pad(month);
    var day = this.pad(d.getDate());
    this.set_startdate(d.getFullYear(), month, day);
    this.set_enddate(d.getFullYear(), month, day);

//            this.endYear = d.getFullYear();
//            this.endMonth = month;
//            this.endDay = day;

    var timezone = d.getTimezoneOffset();

    timezone = -timezone / 60;
    timezone = timezone + "00";
    if(timezone.length == 4)
        timezone = timezone.charAt(0) + "0" + timezone.substring(1);

    if (parseInt(timezone) > 0) {
        timezone = "+" + timezone;
    }

    this.timezone = timezone;
	},
	
	pad: function(input) {
    if (input.toString().length < 2)
        input = '0' + input.toString();

    return input;
	}
}
