/*
* Title:  jEventsCalendar 1.0.1
* Dependencies:  jQuery 1.3.0+, jQuery Templates
* Author:  Denis Shchotkin
* Email:  denis.shchotkin@gmail.com
* Project Hompage:  http://nexus.in.ua
*
* 2009-feb-21
*/


Array.prototype.ASort = function(name) {
    var aInput = this;
    var aTemp = [];
    for (var sKey in aInput){if (typeof(aInput[sKey]) != 'function'){aTemp.push([sKey, aInput[sKey]]);}} 
    aTemp = aTemp.sort(function (){return arguments[0][1][name] - arguments[1][1][name]});
    var aOutput = new Object();
    for (var nIndex = 0; nIndex < aTemp.length; nIndex++) {aOutput[aTemp[nIndex][0]] = aTemp[nIndex][1];}
    delete aTemp;
    return aOutput;
}

// template for event line
var t = $.template('<div class="event ${classname}" style="margin-top:${top}px;"><div class="information"><div class="bg-right"><div class="bg-left" style="width:${width}px;"><span class="mask">&nbsp;</span>${title}</div></div></div></div>');

(function($) {

    jQuery.jEventsCalendar = jQuery.J = function() {};

    // event line sizes
    jQuery.J._eventsCalendarSettings = {
			dayWidth: 100,
			dayWidthTail: 41,
			dayHeight: 24
	};

    jQuery.J.events = [ ];

    jQuery.J.days = [ ];

    // basic calculations for drawing
    jQuery.J.Init = function() {
        this.events = this.events.ASort('day');
        for (var i in this.events){
            if (!this.days[this.events[i]['day']]) this.days[this.events[i]['day']] = new Array();
            this.days[this.events[i]['day']].push(this.events[i]);
            var row = this.days[this.events[i]['day']].length-1;
            if (this.events[i].width > 1){
                for (var j = 0; j<(this.events[i].width - 1); j++){
                    if (!this.days[this.events[i]['day']+j+1]) this.days[this.events[i]['day']+j+1] = new Array((row+1));
                    for (var k = 0; k<=row; k++){
                        if (!this.days[this.events[i]['day']+j+1][k]) this.days[this.events[i]['day']+j+1][k] = "placeholder";
                    }
                }
            }
        }
	};

    // adding new event
    jQuery.J.NewEvent = function(day, width, title) {
        if (isNaN(parseInt(day)) || isNaN(parseInt(width))) return;
        if (day < 0){
            width = width + day;
            day = 1;
        }
        var dayOfWeek = day % 7;
        if (dayOfWeek == 0) dayOfWeek = 7;
        var classname = "e" + String(new Date().getTime()) + String(Math.random()).slice(3,7);

        // multirow event
        if (dayOfWeek + width > 7) {
            var first = true; var _day; var _width;

            // creating events for each row
            for (var i=1; i<6; i++){
                if (day>7*i || (day + width - 1)<(7*i-6)) continue;

                // calculating start point and length for events in each row
                if (first){ 
                    _day = day;
                    _width = 7*i - day + 1;
                    first = false;
                } else if ((day + width - 1)<7*i) {
                    _day = 7*(i-1) + 1;
                    _width = (day + width - 1) % 7;
                    if (_width == 0) _width = 7;
                } else {
                    _day = 7*(i-1) + 1;
                    _width = 7;
                }
                this.events.push({ day: _day, title: title, width: _width, classname: classname});
            }
            
        }

        // single row event
        else {
            this.events.push({ day: day, title: title, width: width, classname: classname});
        }
    }

    // drawing event lines
    jQuery.J.Draw = function() {
        this.Init();
        var element = "";
        var top = 0;
        var el = -1;
        for (var i in this.days){
            if (this.days[i].length > 0){
                element = "";
                top = 0;
                el = -1; var elm = -1;
                for (var j in this.days[i]){
                    if (isNaN(parseInt(j))) continue;
                    if (this.days[i][j] == "placeholder") {
                        top += this._eventsCalendarSettings.dayHeight;
                    } else {
                        var params = {
                              width: this._eventsCalendarSettings.dayWidth*this.days[i][j]['width'] + (this.days[i][j]['width']-1)*this._eventsCalendarSettings.dayWidthTail,
                              top: top,
                              title: this.days[i][j]['title'],
                              classname: this.days[i][j]['classname']
                        };
                        top = 0;
                        $('#day'+this.days[i][j]['day']).append(t.apply(params));
                        $('.' + this.days[i][j]['classname']).mouseover(function(event) {
                            var a = $('.' + this.className.replace(/event /, ''));
                            for (var i in a){
                                if (!isNaN(parseInt(i))) a[i].className += " active-event";
                            }
                         });

                        $('.' + this.days[i][j]['classname']).mouseout(function(event) {
                            var a = $('.' + this.className.replace(/event /, '').replace(/ active-event/, ''));
                            for (var i in a){
                                if (!isNaN(parseInt(i))){
                                    a[i].className = a[i].className.replace(/ active-event/, '');
                                }
                            }
                         });

                    }
                }
                if (el >= 0) {
                    
                }
            }
        }
	// onclick events
	$('.event .information').click(function(){
		// show first time
		if($('#' + $(this).find('a').attr('rel')).is(':hidden')) {
			$('.event-selector').hide();
			$('#' + $(this).find('a').attr('rel') + ':hidden').show();
			if($.browser.msie){
				ieFooterFix();
			}
			return false;
		// go to link next time
		} else {
			var ___link = $('#' + $(this).find('a').attr('rel')).find('a.take-part').attr('href');
			window.location = '/' + ___link; return false;
		}
	});
    }
    
})(jQuery);