PATH='../'

//Detect browser!
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

if (BrowserDetect.browser=='Firefox') {
    if (BrowserDetect.version<3) {
        document.write('<meta HTTP-EQUIV="REFRESH" content="0; url=http://www.ocf.berkeley.edu/~gcf/FFfail.html">');
    }
}


//Layout (in pixels)
var calendarHeaderHeight=30
var border=2;
var overflow=35;
var barwidth=25;
var h=110;    
var w=120;
var headerh=20;
var header=20+border;
var datepad=8;
var defaultZoom=190.;
var scrollHeight=30;
var zoomDelay=300;
var pad=40;

//Globals
var days=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
var classes=['C','C','C','C','C','CW','CW']
var monthLookup=['January','February','March','April','May','June','July','August','September','October','November','December']
var dayLookup=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']    
var DATA=null;
var MASKEFFECT=null;
var MOVING=false;


//Curs
var CurView='T1'
var OtherView='T2'
var now = new Date();
var CurMonth=now.getMonth()+1;
var CurYear=now.getFullYear()
var CurDay=null;
var CurEvent=null;

//Construct the table
for (t=1;t<3;t++) {
    table='T'+t
    $(table).insert('<div class="calendarHeader" id="'+table+'_H"></div>')
    $(table+'_H').setStyle({left:0+'px', height:calendarHeaderHeight+'px'})
    
    for (i=0;i<7;i++) {
        $(table).insert('<div class="R'+classes[i]+'" id="'+table+'_H'+i+'">'+days[i]+'</div>')
        $(table+'_H'+i).setStyle({left:overflow+i*border+i*w+'px',width:w+'px',height:headerh+'px',top:calendarHeaderHeight+'px'})
    }
    k=1;
    for (j=0;j<5;j++) {
        for (i=0;i<7;i++) {
            c=classes[i]
            if (j%2) {
                c='O'+c;
            }
            $(table).insert('<div class="'+c+'" id='+getId(table,j,i)+'></div>')
            $(getId(table,j,i)).leftcoord=border*i+overflow+i*w;
            $(getId(table,j,i)).topcoord=j*border+calendarHeaderHeight+header+j*h;
            $(getId(table,j,i)).setStyle({left:$(getId(table,j,i)).leftcoord+'px',top:$(getId(table,j,i)).topcoord+'px', width:w+'px',height:h+'px'})
            
            assignScalePoint(table,j,i);
            prepCell(table,j,i);
//            $(getId(table,j,i)+'M').setStyle({left:0+'px',top:0+'px', width:w+'px',height:h+'px'});                
            $(getId(table,j,i)+'M').observe('mouseover',zoom)
            $(getId(table,j,i)+'M').observe('mouseout',unZoom)
            k++;
        }
    }
}

//Update Geometry
height=6*border+calendarHeaderHeight+header+5*h+10
width=2*overflow+border*8+w*7

//Calendar is in place, set up calendar sliding controls and dynamic layout
$('Next').observe('click',slide)
$('Prev').observe('click',slide)
$('T1').setStyle({left:0+'px'})
$('T2').setStyle({left:width+'px'})
$('parent').setStyle({width:width+'px',height:height+'px',left:940/2.-width/2.+'px'})    
$('Prev').setStyle({position:'absolute',height:height+'px',width:barwidth+'px',top:0+'px',left:0+'px'})
imW=$('PreviousMonth').getWidth()
imH=$('PreviousMonth').getHeight()
$('PreviousMonth').setStyle({position:'absolute',left:(barwidth-imW)/2.+'px',top:(height-imH)/2.-20+'px'})

$('calendarDiv').setStyle({position:'absolute',height:height+'px',width:width+'px',left:0+'px',top:0+'px'})
$('Next').setStyle({position:'absolute',height:height+'px',width:barwidth+'px',left:width-barwidth+'px',top:0+'px'})    
imW=$('NextMonth').getWidth()
imH=$('NextMonth').getHeight()
$('NextMonth').setStyle({position:'absolute',right:(barwidth-imW)/2.+'px',top:(height-imH)/2.-20+'px'})

$('loadingMask').setStyle({height:height+'px',width:width+'px',left:0+'px',top:0+'px'})    
$('loadingMask').select('p')[0].setStyle({position:'relative',top:height/2.+'px'})    
$('loadingMask').hide();

//Table populators
function getId(table,week,day) {
    return table+'_'+week+'_'+day;
}
function prepCell(table,j,i) {
    $(getId(table,j,i)).update("")
    $(getId(table,j,i)).insert('<div class="date" id="'+getId(table,j,i)+'D">'+k+'</div>')
    $(getId(table,j,i)+'D').setStyle({right:datepad+'px',bottom:'0px'})
    s='<div class="scrollUp" style="height:'+scrollHeight+'px;display:none;"><img src="../images/scrollUp.png"></div>'
    s+='<ul class="parentUL">'
    s+='</ul>' 
    s+='<div class="scrollDown" style="height:'+scrollHeight+'px;display:none;"><img src="../images/scrollDown.png"></div>'               
            
    $(getId(table,j,i)).insert('<div class="cellContent" id="'+getId(table,j,i)+'C">'+s+'</div>')
    
    //Create a mask to handle mouse events.
    $(getId(table,j,i)).insert('<div id="'+getId(table,j,i)+'M" class="mask"></div>')        
}
function updateDate(table,month,year) {
    s='<div class="Date" id="'+table+'_Date">'+monthLookup[month-1]+' '+year+'</div>';
    s_key='<div class="LGkey">Large Group</div> <div class="SGkey">Small Group</div> <div class="SPECIALkey">Special Event</div>'
    s+='<div class="PullDown" id="'+table+'_PullDown">'+s_key+'Jump to: <select id='+table+'_month_select>';
    for (var i=0 ; i < monthLookup.length ; i++) {
        if (i==month-1) {
            s+='<option value="'+(i+1)+'" selected>'+monthLookup[i]+'</option>';
        } else {
            s+='<option value="'+(i+1)+'">'+monthLookup[i]+'</option>';
        }
    }        
    s+='</select>';
    s+='<select id='+table+'_year_select>';
    central_year=now.getFullYear()
    for (var i=-2 ; i < 3 ; i++) {
        if (central_year+i==year) {
            s+='<option value="'+(central_year+i)+'" selected>'+(central_year+i)+'</option>';
        } else {
            s+='<option value="'+(central_year+i)+'">'+(central_year+i)+'</option>';
        }
    }        
    s+='</select></div>';
    
    $(table+'_H').update(s)
    $(table+'_Date').setStyle({left:overflow+'px'})
    $(table+'_PullDown').setStyle({right:overflow+'px'})
    $(table+'_month_select').observe('change',SwitchDate)
    $(table+'_year_select').observe('change',SwitchDate)
}

function assignScalePoint(table,j,i) {
    if (j==0) {
        if (i==0) {
            $(getId(table,j,i)).scaleProps={scaleFromCorner:'TopLeft'};
        } else if (i==6) {
            $(getId(table,j,i)).scaleProps={scaleFromCorner:'TopRight'};                        
        } else {
            $(getId(table,j,i)).scaleProps={scaleFromEdge:'Top'};                                                
        }
    } else if (j==4) {
        if (i==0) {
            $(getId(table,j,i)).scaleProps={scaleFromCorner:'BottomLeft'};
        } else if (i==6) {
            $(getId(table,j,i)).scaleProps={scaleFromCorner:'BottomRight'};                        
        } else {
            $(getId(table,j,i)).scaleProps={scaleFromEdge:'Bottom'};                                                
        }                    
    } else {
        if (i==0) {
            $(getId(table,j,i)).scaleProps={scaleFromEdge:'Left'};
        } else if (i==6) {
            $(getId(table,j,i)).scaleProps={scaleFromEdge:'Right'};                        
        } else {
            $(getId(table,j,i)).scaleProps={scaleFromCenter:'True'};                                                
        }
    }
    $(getId(table,j,i)).ZoomScale=defaultZoom;        
    $(getId(table,j,i)).Scrolling=false;  
    $(getId(table,j,i)).ZOOMED=false;                
}

function populateCells(table,data) {
    if (!DATA) {
        return;
    }    
    for (i=0;i<5;i++) {
        for (j=0;j<7;j++) {
            n=i*7+j;            
            $(getId(table,i,j)+'D').update(DATA[n]['date'])
            s=''
            if (DATA[n]['order'].length>0) {
                $(getId(table,i,j)+'M').observe('mouseover',zoom)
                $(getId(table,i,j)+'M').observe('mouseout',unZoom)
            } else {
                $(getId(table,i,j)+'M').stopObserving('mouseover',zoom)
                $(getId(table,i,j)+'M').stopObserving('mouseout',unZoom)                    
            }
            
            for (k=0;k<DATA[n]['order'].length;k++) {
                ev=DATA[n]['events'][DATA[n]['order'][k]]
                if (ev['link'] && (ev['link']!='')) {
                    s+='<li class="'+ev['event_type']+'"><a href="'+ev['link']+'">'+ev['event']+'</a>'
                } else {
                    s+='<li class="'+ev['event_type']+'">'+ev['event']
                }
                s+='<ul style="display:none">'
                s+='<li class="location">'+ev['location']+' '+ev['time_string']+'</li>';     
                s+='<li class="comments">'+ev['comments'] +'</li>'                   
                s+='</ul>'
                s+='</li>'
                
            }
            
            if (DATA[n]['date']) {
                $(getId(table,i,j)+'M').i=i
                $(getId(table,i,j)+'M').j=j                    
                $(getId(table,i,j)+'M').ij=i*7+j;
                $(getId(table,i,j)+'M').day=DATA[n]['date']
            }
            
            $(getId(table,i,j)).select("ul.parentUL")[0].update(s)                
            
            if ((now.getDate()==DATA[n]['date']) && (CurMonth==now.getMonth()+1) && (CurYear==now.getFullYear())) {
                $(getId(table,i,j)).addClassName('today')
            } else {
                $(getId(table,i,j)).removeClassName('today')                
            }            
        }
    }
}

//Masks for AJAX
function putUpMask(msg){
    $('loadingMask').select('p')[0].update(msg);
    
    MASKEFFECT=[]
    MASKEFFECT[0]=new Effect.Appear($('loadingMask'),{duration: 1.0})
    
    $('Next').setStyle({cursor:'default'});
    $('Prev').setStyle({cursor:'default'});        
}

function hideMask(){
    if (MASKEFFECT) {
        MASKEFFECT[0].cancel();
    }
    new Effect.Fade($('loadingMask'),{duration: 0.3})
    $('Next').setStyle({cursor:'pointer'});
    $('Prev').setStyle({cursor:'pointer'});                
}

//Start up routines
function updateInitialize(response) {
    DATA=CleanData(response.responseJSON);
    populateCells(CurView);
    updateDate(CurView,CurMonth,CurYear);
    hideMask();
}

//Switching Calendars

function CleanData(data) {
    for (var i=0;i<data.length;i++) {
        order=[]
        var j=0;            
        for (k in data[i]['events']) {
            order[j]=k
            e=data[i]['events'][k]
            if (k<20000) {
                pm=false;
                if (e['time_start'][0]>=12) {        
                    pm=true;
                }        
                t=''
                if (e['time_start'][0]>12) {
                    t+=e['time_start'][0]-12;
                } else {
                    t+=e['time_start'][0];
                }
                t+=':'
                if (e['time_start'][1]<10) {
                    t+='0'+e['time_start'][1]
                } else {
                    t+=+e['time_start'][1]            
                }
                if (pm) {
                    t+=' pm'
                } else {
                    t+=' am'
                }
                t+=' - ';
                pm=false;
                if (e['time_end'][0]>=12) {        
                    pm=true;
                }        
                if (e['time_end'][0]>12) {
                    t+=e['time_end'][0]-12;
                } else {
                    t+=e['time_end'][0];
                }
                t+=':';
                if (e['time_end'][1]<10) {
                    t+='0'+e['time_end'][1]
                } else {
                    t+=+e['time_end'][1]            
                }
                if (pm) {
                    t+=' pm'
                } else {
                    t+=' am'
                }
                e['time_string']=t;
                j++;
            } else {
                e['time_string']=e['start_date'][1]+'/'+e['start_date'][0]+'/'+e['start_date'][2]+'-'+e['end_date'][1]+'/'+e['end_date'][0]+'/'+e['end_date'][2]
            }
        }
        if (order.length==0) {
            data[i]['order']=order                
            continue;
        }
        function sorter(x,y) {
            if (x>=20000) {
                return -50;
            }
            if (y>=20000) {
                return 50;
            }
            return data[i]['events'][x]['time_start'][0]+data[i]['events'][x]['time_start'][1]/60.-data[i]['events'][y]['time_start'][0]-data[i]['events'][y]['time_start'][1]/60.
        }
        order.sort(sorter)
        data[i]['order']=order
    }
    return data;
}

function successNext(response) {
    DATA=CleanData(response.responseJSON);        
    populateCells(OtherView);
    updateDate(OtherView,CurMonth,CurYear)
    repos=pad+width
    move=-width-pad
    doSlide(repos,move)  
}

function successPrev(response) {
    DATA=CleanData(response.responseJSON);        
    populateCells(OtherView);
    updateDate(OtherView,CurMonth,CurYear)        
    repos=-width-pad
    move=width+pad
    doSlide(repos,move)  
}

function doSlide(repos,move) {
    hideMask();
    $(OtherView).setStyle({left:repos+'px'});
    new Effect.Parallel([
        new Effect.Move($(CurView),{x:move,mode:'relative',sync:true}),
        new Effect.Move($(OtherView),{x:move,mode:'relative',sync:true,afterFinish:finishedMoving}),
    ], {
        duration:1,
        transition: Effect.Transitions.sinoidal
    }
    )
    temp=CurView;
    CurView=OtherView;
    OtherView=temp;        
}

function SwitchDate(event) {
    if (MOVING) {
        return;
    }
    MOVING=true;        
    month_target=parseInt($(CurView+'_month_select').value)
    year_target=parseInt($(CurView+'_year_select').value)
    if (year_target+month_target/12.>CurYear+CurMonth/12.) {
        CurYear=year_target;
        CurMonth=month_target;
        putUpMask('Loading...');            
        new Ajax.Request(PATH+'cgi-bin/calendarPublic.cgi/getCalendar',{onSuccess:successNext,parameters:{'JSON':Object.toJSON({'month':parseInt(CurMonth),'year':parseInt(CurYear)})}})                        
    } else if (year_target+month_target/12.<CurYear+CurMonth/12.) {
        CurYear=year_target;
        CurMonth=month_target;    
        putUpMask('Loading...');                                
        new Ajax.Request(PATH+'cgi-bin/calendarPublic.cgi/getCalendar',{onSuccess:successPrev,parameters:{'JSON':Object.toJSON({'month':parseInt(CurMonth),'year':parseInt(CurYear)})}})                                    
    }
}

function slide(event) {
    if (MOVING) {
        return;
    }
    MOVING=true;
    if (event.element().id[0]=='N') {
        CurMonth++;
        if (CurMonth>12) {
            CurMonth=1;
            CurYear++;
        }
        putUpMask('Loading...');
        new Ajax.Request(PATH+'cgi-bin/calendarPublic.cgi/getCalendar',{onSuccess:successNext,parameters:{'JSON':Object.toJSON({'month':CurMonth,'year':CurYear})}})            
    } else {
        CurMonth--;
        if (CurMonth<1) {
            CurMonth=12;
            CurYear--;
        }
        putUpMask('Loading...');            
        new Ajax.Request(PATH+'cgi-bin/calendarPublic.cgi/getCalendar',{onSuccess:successPrev,parameters:{'JSON':Object.toJSON({'month':CurMonth,'year':CurYear})}})            
    }
}

function finishedMoving(effect) {
    MOVING=false;
}

//Zoom and scrolling controllers
function zoom(event) {
    e=event.element().getOffsetParent(); //Get the container of the mask
    mask=$(e.id+'M');    
    if (e.ZoomScale==0) {
        return;
    }
    if (e.ZOOMED=='maybe') {
        e.ZOOMED=true;
    } else if (e.ZOOMED=='no') {
        e.ZOOMED=false;
        return;
    } else if (e.ZOOMED==true) {
        return;
    } else {
        e.ZOOMED='maybe';
        setTimeout(function() { zoom(event) },zoomDelay)
        return;
    }
    e.setStyle({zIndex:3,'-webkit-box-shadow':"0px 0px 4px rgba(0,0,0,0.2)",border: "1px solid rgba(0,0,0,0.2)"});
    opts={scaleContent:false,duration:0.2,queue:{position:'end', scope:e.id}}
    for (k in e.scaleProps) {
        opts[k]=e.scaleProps[k];
    }
    new Effect.Scale(e,e.ZoomScale,opts)
    
    fieldOpts={duration:0.2,sync:true}
    parOpts={duration:0.2,queue:{position:'end',scope:e.id}}
    fields=e.select('ul ul')
    effArr=[]     
    for (i=0;i<fields.length;i++) {
        if (i==fields.length-1) {
            fieldOpts['afterFinish']=setUpScrolling;
        }            
        effArr[i]=new Effect.BlindDown(fields[i],fieldOpts)
    }
    new Effect.Parallel(effArr,parOpts);
    mask.observe('click',doClick);
    
}

function unZoom(event) {
    e=event.element().getOffsetParent(); //Get the container of the mask\
    if (e.ZoomScale==0 || e.ZOOMED==false) {
        return;
    }
    if (e.ZOOMED=='maybe') {
        e.ZOOMED='no';
        return;
    }
    e.ZOOMED=false;
    opts={scaleFromCenter:true,scaleContent:false,duration:0.2,queue:{position:'end', scope:e.id},afterFinish:cleanUpAfterZoomOut};
    for (k in e.scaleProps) {
        opts[k]=e.scaleProps[k];
    }        
    
    fieldOpts={duration:0.2,sync:true}
    parOpts={duration:0.2,queue:{position:'end',scope:e.id}}
    fields=e.select('ul ul')
    effArr=[]     
    for (i=0;i<fields.length;i++) {
        effArr[i]=new Effect.BlindUp(fields[i],fieldOpts)            
    }
    new Effect.Parallel(effArr,parOpts);
    
    new Effect.Scale(e,100/e.ZoomScale*100.,opts)  

}

function cleanUpAfterZoomOut(effect) {
    if (effect.element.Scrolling) {
        $(effect.element.id+'M').stopObserving('click',doScroll);
        $(effect.element.id+'M').stopObserving('mouseover',doScrollCursor);
        $(effect.element.id+'M').setStyle({cursor:'default'});
        effect.element.select('ul.parentUL')[0].setStyle({top:'0px'});
        effect.element.Scrolling=false;
        effect.element.select('.scrollUp')[0].hide()
        effect.element.select('.scrollDown')[0].hide()                                
    }
    effect.element.setStyle({zIndex:0,'-webkit-box-shadow':"0px 0px 0px rgba(0,0,0,0)",border: "0px solid #000"})
    effect.element.setStyle({width:w+'px',height:h+'px',top:effect.element.topcoord+'px',left:effect.element.leftcoord+'px'});
    $(effect.element.id+'M').stopObserving('click',doClick);    
}

function doClick(event) {
    e=event.element().getOffsetParent()
    if (event.pageY) {
        y=event.pageY-e.cumulativeOffset()[1]
    } else {
        y=event.y+document.viewport.getScrollOffsets()[1]-e.cumulativeOffset()[1]
    }
    
}

function setUpScrolling(effect) {
    par=effect.element.getOffsetParent().getOffsetParent();
    targetHeight=par.select('ul.parentUL')[0].getHeight()
    if (targetHeight>par.getHeight()) {
        e=par.getOffsetParent()
        e.Scrolling=true;
        mask=$(e.id+'M');
        mask.observe('click',doScroll);
        mask.observe('mousemove',doScrollCursor);
        par.select('.scrollUp')[0].show()
        par.select('.scrollDown')[0].show()
    }
}

function doScrollCursor(event) {
    e=event.element().getOffsetParent();
    if (event.pageY) {
        y=event.pageY-e.cumulativeOffset()[1];
    } else {
        y=event.y+document.viewport.getScrollOffsets()[1]-e.cumulativeOffset()[1];
    }
    s=e.select('ul.parentUL')[0]        
    targetHeight=s.getHeight(); //Give it some extra space
    cur_y=s.positionedOffset()[1];
    viewHeight=e.getHeight();        
    if (y>viewHeight-scrollHeight & y<=viewHeight) {
        event.element().setStyle({cursor:'pointer'});
        e.select('.scrollDown')[0].setStyle({backgroundColor:'rgba(255,255,200,0.4)'})            
    } else if (0<=y & y<scrollHeight) {
        event.element().setStyle({cursor:'pointer'});
        e.select('.scrollUp')[0].setStyle({backgroundColor:'rgba(255,255,200,0.4)'})                        
    } else {
        event.element().setStyle({cursor:'default'});            
        e.select('.scrollUp')[0].setStyle({backgroundColor:'rgba(200,200,200,0)'})            
        e.select('.scrollDown')[0].setStyle({backgroundColor:'rgba(200,200,200,0)'})            
    }
}

function doScroll(event) {
    e=event.element().getOffsetParent()
    if (event.pageY) {
        y=event.pageY-e.cumulativeOffset()[1]
    } else {
        y=event.y+document.viewport.getScrollOffsets()[1]-e.cumulativeOffset()[1]
    }
    s=e.select('ul.parentUL')[0]
    targetHeight=s.getHeight()+10; //Give it some extra space
    cur_y=s.positionedOffset()[1];
    viewHeight=e.getHeight();
    ymove=0;
    if (y>viewHeight-scrollHeight & y<=viewHeight) {
        if (-cur_y+viewHeight>=targetHeight) {
            return;
        }
        if (-cur_y+viewHeight*2>=targetHeight){
            ymove=-(targetHeight+cur_y-viewHeight);
        } else {
            ymove=-viewHeight;
        }
    } else if (0<=y & y<scrollHeight) {
        if (cur_y>=0) {
            return;
        }
        if (-cur_y>=viewHeight){
            ymove=viewHeight
        } else {
            ymove=-cur_y;
        }
    }
    new Effect.Move(s,{x:0,y:ymove,mode:'relative',duration:0.2,queue:{position:'end', scope:e.id}});        
}
//Load data
putUpMask('Loading...');
test=new Ajax.Request(PATH+'cgi-bin/calendarPublic.cgi/getCalendar',{onSuccess:updateInitialize,parameters:{'JSON':Object.toJSON({'month':CurMonth,'year':CurYear})}})
