<?xml version="1.0" encoding="UTF-8" ?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
      http://www.apache.org/licenses/LICENSE-2.0
    	  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  
-->
<library>


	<class name="lzDayView" extends="view" width="${ parent.width }" height="${ parent.height }">
	
		<!---
			Show only a single day over the whole width
		 -->
		<attribute name="singleDayView" value="true" type="boolean" />
	
		<!---
			the row index of the day to show (makes only sense if singleDayView is true)
		 -->
		<attribute name="currentDay" value="0" type="number" />
		
		<!---
			the number of days that are shown next to each other
		 -->
		<attribute name="daysPerWeek" value="1" type="number" />
		
		<!--
			Name of the trackgroup
		 -->
		<attribute name="dayViewTrackGroup" value="dayViewTrackGroup" type="string" />
		
		<!-- 
			Current Dragging object
		 -->
		<attribute name="currentDragEvent" value="null" />
		
		<!-- 
			Current dayDate that receives the track scroll over
		 -->
		<attribute name="currentOverTrackView" value="null" />
		
		<!---
			Prevent from re-rendering when switching the viewState 
		 -->
		<attribute name="reRenderLock" value="false" type="boolean" />
		
		<handler name="oninit">
			//fix z-Layer
			this._header.sendInFrontOf(this._grid);
			this._grid.sendToBack();
		</handler>
			
		<view name="_header" x="41" width="${ parent.width-10 }" height="20" bgcolor="0xDDDDDD">
			<view name="days" datapath="days" width="${ (parent.width-41)/classroot.daysPerWeek }" clip="true"
								bgcolor="0xDDDDDD" height="19">
				
				<handler name="oninit">
					if (classroot.singleDayView) {
						this.setAttribute("datapath","days["+classroot.currentDay+"]");
					}
				</handler>
								
				<text name="_title" width="${ parent.width -1 }" fgcolor="0x666666"
								datapath="tDate" bgcolor="0xFFFFFF" height="19" >
					<attribute name="tDate" value="null" />
					<handler name="ondata" args="d">
						this.tDate = parseDateOnlyFromXmlString(d.childNodes[0].data);
						var tStringWeekDay = canvas.dayShortNames[tDate.getDay()];
						if ($debug) Debug.write("Calc Week day ",tStringWeekDay,this.tDate.getDay(),this.tDate);
						this.setAttribute("text",canvas.dayShortNames[this.tDate.getDay()]+" "+this.tDate.getDate()+"."+(this.tDate.getMonth()+1)+".");
					</handler>
					<handler name="onmouseover">
						if (!classroot.singleDayView) {
							this.setAttribute("fontstyle","bold");
						}
					</handler>
					<handler name="onmouseout">
						if (!classroot.singleDayView) {
							this.setAttribute("fontstyle","plain");
						}
					</handler>
					<handler name="onclick">
						if (!classroot.singleDayView) {
							parent.parent.parent.parent.onSelectDate.sendEvent(this.tDate);
						}
					</handler>
				</text>
				
			</view>
			<simplelayout axis="x" spacing="0" />
		</view>
		
		<view name="dragAndDropArea" y="20" width="${ parent.width }" height="${ parent.height-20 }" clip="true">
			
			<view name="_content" width="${ parent.width-10 }" height="720" y="${ parent.parent._grid._bgArea._scrollArea.y }">
				
			
			</view>
			
		</view>
		
		<view name="_grid" y="20" width="${ parent.width }" height="${ parent.height-20 }">
	
			<view name="_bgArea" width="${ parent.width }" height="${ parent.height }" clip="true" bgcolor="0xDDDDDD">
		
				<view name="_scrollArea" width="${ parent.width-10 }" height="721" >
				
					<handler name="oninit">
						this.setAttribute("y",parent.height-721);
					</handler>
					
					<handler name="ony" args="y">
						parent.parent.parent.parent.onScollContent.sendEvent(null);
					</handler>
				
					<view name="hours" width="40" height="720" >
							
						<view name="dayBg2" resource="calendar_day_hours_index_bg_rsc" />
						
						<view>
							<handler name="oninit">
								<![CDATA[
									for (var i=0;i<24;i++) {
										if (i<10) {
											new lz.textHourHelper(this,{text:"0"+i+":00"});
										} else {
											new lz.textHourHelper(this,{text:i+":00"});
										}
									}
								]]>
							</handler>
							<simplelayout axis="y" />
						</view>
							
					</view>
					
					<view width="1" />
					
					<!-- The days -->
					<view name="days" datapath="days" width="${ (parent.width-41)/classroot.daysPerWeek }" 
								height="720" bgcolor="0xDDDDDD" >
								
						<attribute name="dayDate" value="null" />
								
						<handler name="oninit">
							if (classroot.singleDayView) {
								this.setAttribute("datapath","days["+classroot.currentDay+"]");
							}
							lz.Track.register(this, classroot.dayViewTrackGroup);
						</handler>
						
						<handler name="onmousetrackover">
							if (!classroot.currentDragEvent.dragEndOnly) {
					        	classroot.currentOverTrackView = this;
					        }
					    </handler>
					
					    <handler name="onmousetrackout">
					    	//We do not track out cause otherwise the dragging view would be at undefined position
					    </handler>
					    
					    <handler name="onmousetrackup">
					        this._content.setAttribute('bgcolor', 0xFFFFFF);
					    </handler>
						
						<handler name="ondata" args="d">
							if(d is lz.DataNodeMixin){
								var lzDataPointer = new lz.datapointer();
								lzDataPointer.setPointer(d);
								var xmlDate = lzDataPointer.xpathQuery('tDate/text()');
								var splitDate = xmlDate.split("-");
								this.dayDate = new Date(splitDate[0], Number(splitDate[1])-1, splitDate[2]);
							}
						</handler>
						
						<view name="_content" width="${ parent.width -1 }" bgcolor="0xFFFFFF"
										height="720" clickable="true" showhandcursor="false">
										
							<attribute name="lzCalGridTempDrawView" value="null" />
							
							<handler name="onmousedown">
								<![CDATA[
									var heightInMinutes = this.height/1440;
									//round by 30 minutes
									var tPixels30Minutes = heightInMinutes*30;
									var tStarty = this.getMouse("y");
									tStarty = Math.round(tStarty/tPixels30Minutes)*tPixels30Minutes;
									this.lzCalGridTempDrawView = new lz.lzCalGridTempDrawView(this,{
																			y:tStarty,
																			starty:tStarty,
																			height:tPixels30Minutes,
																			heightInMinutes:heightInMinutes,
																			tPixels30Minutes:tPixels30Minutes
																		});
								]]>								
							</handler>
							
							<handler name="onmouseup">
								if (this.lzCalGridTempDrawView != null) {
									var tStartDate = new Date();
									//clone Date to have day and month
									tStartDate.setTime(parent.dayDate.getTime());
									var startMinutesTotal = this.lzCalGridTempDrawView.getStartMinutesTotal();
									tStartDate.setHours(Math.floor(startMinutesTotal/60));
									tStartDate.setMinutes(startMinutesTotal-(tStartDate.getHours()*60));
									
									var tEndDate = new Date();
									//clone Date to have day and month
									tEndDate.setTime(parent.dayDate.getTime());
									var endMinutesTotal = this.lzCalGridTempDrawView.getEndMinutesTotal();
									tEndDate.setHours(Math.floor(endMinutesTotal/60));
									tEndDate.setMinutes(endMinutesTotal-(tEndDate.getHours()*60));
								
									this.lzCalGridTempDrawView.destroy();
									this.lzCalGridTempDrawView = null;
									
									classroot.parent.selectStartEndDateTime(tStartDate,tEndDate);
								}
							</handler>
							
							<!--
								Detect events that are parallel
							 -->
							<method name="calcWidthFactors" args="tItem">
								<![CDATA[
									for (var eg in this.subviews) {
										if (this.subviews[eg] == tItem) {
											continue;
										}
										if (!this.subviews[eg].event) {
											continue;
										}
										
										//if ($debug) Debug.write("Cond1 ",(this.subviews[eg].y + this.subviews[eg].height >= tItem.y));
										//if ($debug) Debug.write("Cond2 ",(this.subviews[eg].y <= tItem.y + tItem.height));
										
										if (this.subviews[eg].y + this.subviews[eg].height >= tItem.y 
												&& this.subviews[eg].y <= tItem.y + tItem.height) {
											
											var newWidthFactor = this.subviews[eg].widthFactor+1;
											var newInsetFactor = this.subviews[eg].insetFactor+1;
											
											//if ($debug) Debug.write("Found newInsetFactor,newWidthFactor: ",newInsetFactor,newWidthFactor);
											
											//fix width	
											this.subviews[eg].setAttribute("widthFactor",newWidthFactor);
											tItem.setAttribute("widthFactor",newWidthFactor);
											
											//fix x-position
											if (tItem.y >= this.subviews[eg].y) {
												//if ($debug) Debug.write("AFTER");
												tItem.setAttribute("insetFactor",newInsetFactor);
												this.subviews[eg].sendInFrontOf(this.dayBg2);
											} else {
												//if ($debug) Debug.write("BEFORE");
												this.subviews[eg].setAttribute("insetFactor",newInsetFactor);
												tItem.sendInFrontOf(this.dayBg2);
											}
											
										}
									}
								]]>
							</method>
							
							<view name="dayBg2" resource="calendar_one_day_hours_index_bg_rsc" stretches="width" 
								width="${ parent.width }"  >
								<attribute name="event" value="false" type="boolean" /> 
							</view>
										
							<view datapath="appointments" bgcolor="0xA59CFC" 
										x="${ (parent.width/this.widthFactor) * insetFactor }"
										width="${ parent.width/this.widthFactor }" height="60">
								
								<attribute name="event" value="true" type="boolean" /> 
								
								<attribute name="rememberX" value="-1" />
								<attribute name="rememberY" value="-1" />
								<attribute name="mouseUpDetect" value="false" type="boolean"/>
								<attribute name="startedToDrag" value="false" type="boolean"/>
								
								<attribute name="widthFactor" value="1" type="number"/>
								<attribute name="insetFactor" value="0" type="number"/>
							
								<handler name="ondata" args="d">
									<![CDATA[
										if (classroot.reRenderLock) {
											if ($debug) Debug.info("Prevent un-neccessary Rendering!");
											return;
										}
										this.setAttribute("visibility","visible");
										var dataPointer = new lz.datapointer();
										dataPointer.setPointer(d);
										var startDate = parseDateTimeFromXmlString(dataPointer.xpathQuery('start/text()'));
										var endDate = parseDateTimeFromXmlString(dataPointer.xpathQuery('end/text()'));
										
										if ($debug) Debug.write("COMPARE -- ",startDate,endDate);
										
										var heightInMinutes = parent.height/1440;
										var startMin = (startDate.getHours() * 60 ) + startDate.getMinutes();
										this.setAttribute("y",Math.round(heightInMinutes*startMin));
										
										if (endDate.getFullYear() > startDate.getFullYear() 
												|| endDate.getMonth() > startDate.getMonth()
													|| endDate.getDate() > startDate.getDate()) {
											//If the end date is next year or month or day we need
											//to mark the rest of the day with the event
											this.setAttribute("height",parent.height-this.y);
										} else {
											var endMin = (endDate.getHours() * 60 ) + endDate.getMinutes();
											this.setAttribute("height",Math.round((endMin - startMin)*heightInMinutes));
										}
										if ($debug) Debug.write("y,height -- ",this.y,this.height);
										parent.calcWidthFactors(this);
									]]>
								</handler>
								
								<handler name="onmousedown">
									this.mouseUpDetect = false;
									this.startedToDrag = false;
									this.rememberX = this.getMouse("x");
									this.rememberY = this.getMouse("y");
									lz.Timer.addTimer( new LzDelegate( this, "checkIfDragging" ), 250 );
								</handler>
								
								<handler name="onmouseup" >
									<![CDATA[
										if (this.rememberX == this.getMouse("x")
												&& this.rememberY == this.getMouse("y")) {
											this.mouseUpDetect = true;
											var appointmentId = this.datapath.xpathQuery('appointmentId/text()');
											if ($debug) Debug.write("click ",appointmentId);
											classroot.parent.selectCalendarEvent(this);
										}
									]]>
								</handler>
								
								<method name="closeDragItem">
									<![CDATA[
										var appointmentId = -1;
										lz.Track.deactivate(classroot.dayViewTrackGroup);
										
										//Fixme: Prevent saving the object if it is dragged 
										//at the exact same position as it was before
										appointmentId = Number(this.datapath.xpathQuery('appointmentId/text()'));
										
										classroot.currentDragEvent = null;
										return appointmentId;
									]]>
								</method>
								
								<method name="checkIfDragging" args="tRef">
									<![CDATA[
										if (this.mouseUpDetect) {
											return;
										}
										if (this.rememberX == this.getMouse("x")
													&& this.rememberY == this.getMouse("y")) {
											lz.Timer.addTimer( new LzDelegate( this, "checkIfDragging" ), 250 );			
										} else {
											this.startDragItem(false);
										}
									]]>
								</method>
								
								<method name="startDragItem" args="dragEndOnly">
									<![CDATA[
										//we need to move the object by the y position that the mouse
										//was moved since mousedown
										var tNewY = this.y + (this.getMouse("y") -  this.rememberY);
									
										this.startedToDrag = true;
										classroot.currentOverTrackView = parent.parent;
										classroot.currentDragEvent = new lz.dragEvent(classroot.dragAndDropArea._content,{
													x:(dragEndOnly) ? this.getAttributeRelative('x',parent.parent.parent.parent) : parent.parent.parent.x,
													startx:(dragEndOnly) ? this.getAttributeRelative('x',parent.parent.parent.parent) : parent.parent.parent.x,
													y:(dragEndOnly) ? this.y : tNewY,
													starty:this.y,
													bgcolor:this.bgcolor,
													height:this.height,
													startheight:this.height,
													width:(dragEndOnly) ? this.width : parent.width,
													eventRef:this,
													showTime:false,
													titleText:this._title.text,
													calendarViewRef:classroot,
													dragEndOnly:dragEndOnly
												});
												
										lz.Track.activate(classroot.dayViewTrackGroup);
										this.setAttribute("visibility","hidden");
									]]>
								</method>
								
								<text name="_title" x="2" datapath="title" text="$path{ 'text()' }" clip="true" 
										width="${ parent.width-2 }" multiline="true" height="${ parent.height }"/>
								
								
								<view width="20" height="4" valign="bottom" align="center" bgcolor="$once{ canvas.getThemeColor('mainBorderColor') }">
									<handler name="onmouseover">
										lz.Cursor.setCursorGlobal('calendar_change_event_height_rsc');
									</handler>
									<handler name="onmouseout">
										lz.Cursor.restoreCursor(); 
									</handler>
									<handler name="onmousedown">
										parent.startDragItem(true);
									</handler>
								</view>
								
							</view>
						</view>
						
					</view>
					
					<simplelayout axis="x" spacing="0" />
					
				</view>
				
				<om_vscrollbar />
				
			</view>
			
		</view>
		
	</class>
	
</library>