<?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 fileExplorer
 -->
<class name="fileExplorer" extends="view" >
    
    <attribute name="parentFolderId" value="-2" type="number" />
    
    <attribute name="_selected" value="null" />
    
    <event name="onClose"/>
    
    <handler name="oninit">
    	canvas.currentFileExplorer = this;
        lz.Track.register(this._trashBar._trashIcon, canvas.currentImagesListdraw.currentTrackGroupName);
    </handler>
    
    <handler name="onvisible">
    	if ($debug) Debug.write("fileExplorer::onvisible this._selected ",this._selected);
        //This is thrown whenever an uploaded Document has completed
        if (this._selected == null) {
            this.loadFiles();
        } else {
        	if (this._selected.isFolder) {
            	this._selected.refresh();
        	} else {
        		this.loadFiles();
        	}
        }
    </handler>
    
    <method name="selectItem" args="itemRef">
        if (this._selected != null) {
            this._selected.deselectItem();
        }
        
        this._selected = itemRef;
        this._selected.selectItem();
        
        //Set parent folder id for next Folder or uploaded file
        if (this._selected.fileExplorerItemId == 0) {
            if (this._selected.isOwner) {
                this.parentFolderId = -2;
            } else {
                this.parentFolderId = 0;
            }
        } else {
            this.parentFolderId = this._selected.fileExplorerItemId;
        }
        
    </method>
    
    <method name="addFile">
    	<![CDATA[
	    	if ($debug) Debug.write("addFile :: ",this._selected,this.parentFolderId);
	    	
	    	if (!canvas.isAllowedToDraw && !canvas.ismoderator) {
	    		new lz.labelerrorPopup(canvas,{errorlabelid:1462});
	    		return;
	    	}
	    	
	    	var isOwner = 0;
	    	if (this.parentFolderId == -2) {
	    		isOwner = 1;
	    	} else {
	    		//Check if its a subfolder of a Owners Dir
	    		if (this._selected != null) {
	    			var checkForOwer = this._selected.checkForIsOwner();
	    			if ($debug) Debug.write("checkForOwer ::",checkForOwer);
	    			if (checkForOwer) {
	    				isOwner = 1;
	    			}
	    		}
	    	}
	    	
	    	if ($debug) Debug.write("addFile :: ",isOwner);
	    	
	        new lz.uploadWindowExplorer(canvas.main_content._content.inner,{
	                            x:60,uploadmodule:canvas.uploadmoduleimg,
	                            parentFolderId:this.parentFolderId,
	                            isOwner:isOwner,
	                            fileExplorerRef:this,
	                            isOnlyImage:true,
	                            servletName:'file.upload'
	                        });
        ]]>
    </method>
    
    <method name="addFolder">
    	<![CDATA[
    		if (!canvas.isAllowedToDraw && !canvas.ismoderator) {
	    		new lz.labelerrorPopup(canvas,{errorlabelid:1462});
	    		return;
	    	}
    
	        if (this._selected == null) {
	        	if ($debug) Debug.write("addFolder ::1 ",this._selected);
	            this._filearea._contentarea.subviews[0].addFolder();
	        } else {
	            if (this._selected.isFolder) {
	            	if ($debug) Debug.write("-1 this._selected.isFolder ",this._selected);
	                this._selected.addFolder();
	            } else {
	            	if ($debug) Debug.write("-2 !this._selected.isFolder ",this._selected);
	                this._selected.parent.parent.addFolder();
	            }
	        }
	    ]]>
    </method>
    
    <method name="loadWmlFile" args="itemObj">
		this.selectItem(itemObj);
		canvas._drawarea.prepareLoadWMLFile(itemObj); 
		//canvas._drawarea.loadObjectList(itemObj); 
	</method>

    
    <method name="loadDocument" args="itemObj">
        this.selectItem(itemObj);
        this._documentsTabs.setAttribute("height",20);
        this._documentsTabs.setAttribute("visibility","visible");
        this._documentsTabs.hideAll();
        var t = new lz.presentationPreview(this,{
                        documentObj:itemObj,
                        refObjList:this
                    });
        //t.sendToBack();
        //this._bg1.sendToBack();
        //this._bg2.sendToBack();
        this._documentsTabs.bringToFront();
        return t;
    </method>
    
    <method name="playVideo" args="itemObj">
    	this.selectItem(itemObj);
    	canvas._drawarea.playVideoSynced(itemObj.fileExplorerItemId,itemObj.fileName,itemObj.flvWidth,itemObj.flvHeight);
    </method>
    
    <method name="loadFiles">
    	<![CDATA[
    	    if (this["getFileExplorerByRoomSelf"]) {
                //this.getFileExplorerByRoom.doCall();
                var downloadurl = canvas.getUrl()+'services/FileService/getFileExplorerByRoomSelfInternal?'
                                +'SID='+canvas.sessionId
                                +'&roomId='+hib.currentroomid;
                
                this.getFileExplorerByRoomSelf.setAttribute("src",downloadurl);
                if ($debug) Debug.write("getFileExplorerByRoomSelf doRequest 1 ",downloadurl);
                this.getFileExplorerByRoomSelf.doRequest();
    	    }
        ]]>
    </method>
    
    <dataset name="getFileExplorerByRoomSelf" type="http" >
    	<handler name="ondata" args="d">
    		<![CDATA[
    			if ($debug) Debug.write("ondata 1 ",this.src);
                if ($debug) Debug.write("ondata 2 ",d);
                parent.parseRootItems(parent.parseRootToRoomObject(d));
            ]]>
    	</handler>
    </dataset>
    
    <method name="parseParentToRoomObject" args="dObj">
        <![CDATA[
            
            var filesObject = new Array();
            
            var tFiles = dObj.childNodes[0].childNodes;
            
            if ($debug) Debug.write("parseParentToRoomObject tFiles ",tFiles);
            
            for (var i=0;i<tFiles.length;i++) {
                
                filesObject.push(this.parseToFileObj(tFiles[i].childNodes));
                
            }
        
            return filesObject;
        ]]>
    </method>
    
    <method name="parseRootToRoomObject" args="dObj">
        <![CDATA[
            
            var roomObject = new Object();
            
            roomObject.userHome = new Array();
            roomObject.roomHome = new Array();
            roomObject.userHomeSize = 0;
            roomObject.roomHomeSize = 0;
            
            var tFiles = dObj.childNodes[0].childNodes[0].childNodes;
            
            //if ($debug) Debug.write("tFiles ",tFiles);
            
            for (var i=0;i<tFiles.length;i++) {
                
                //if ($debug) Debug.write("nodeName",tFiles[i].nodeName);
                
                if (tFiles[i].nodeName == "userHomeSize") {
                    if ($debug) Debug.write("roomHomeSize",tFiles[i].childNodes[0].data);
                    roomObject.userHomeSize = Number(tFiles[i].childNodes[0].data);
                } else if (tFiles[i].nodeName == "roomHomeSize") {
                    if ($debug) Debug.write("roomHomeSize",tFiles[i].childNodes[0].data);
                    roomObject.roomHomeSize = Number(tFiles[i].childNodes[0].data);
                } else if (tFiles[i].nodeName == "roomHome") {
                    roomObject.roomHome.push(this.parseToFileObj(tFiles[i].childNodes));
                } else if (tFiles[i].nodeName == "userHome") {
                    roomObject.userHome.push(this.parseToFileObj(tFiles[i].childNodes));
                }
                
            }
        
            return roomObject;
        ]]>
    </method>
    
    <method name="parseToFileObj" args="dObj">
        <![CDATA[
        
            var tFileObj = new Object();
        
            var type = "string";
            
            for (var i=0;i<dObj.length;i++) {
                
                type = "string";
            
                switch (dObj[i].nodeName){
                    case "externalFileId":
                        type = "int";
                        break;
                    case "fileExplorerItemId":
                        type = "int";
                        break;
                    case "fileSize":
                        type = "int";
                        break;
                    case "flvHeight":
                        type = "int";
                        break;
                    case "flvWidth":
                        type = "int";
                        break;
                    case "insertedBy":
                        type = "int";
                        break;
                    case "isChart":
                        type = "boolean";
                        break;
                    case "isFolder":
                        type = "boolean";
                        break;
                    case "isImage":
                        type = "boolean";
                        break;
                    case "isPresentation":
                        type = "boolean";
                        break;
                    case "isStoredWmlFile":
                        type = "boolean";
                        break;
                    case "isVideo":
                        type = "boolean";
                        break;
                    case "ownerId":
                        type = "int";
                        break;
                    case "parentFileExplorerItemId":
                        type = "int";
                        break;
                    case "room_id":
                        type = "int";
                        break;
                    default:
                        break;
                }
                
                //if ($debug) Debug.write("Obj attr ",dObj[i].nodeName,type);
                
                if (dObj[i].childNodes.length > 0) {
                    switch (type) {
                        case "int":
                            tFileObj[dObj[i].nodeName] = Number(dObj[i].childNodes[0].data);
                            break;
                        case "boolean":
                            tFileObj[dObj[i].nodeName] = (dObj[i].childNodes[0].data == "true") ? true : false;
                            break;
                        default:
                            tFileObj[dObj[i].nodeName] = dObj[i].childNodes[0].data;
                            break;
                    }
                } else {
                    tFileObj[dObj[i].nodeName] = null;
                }
                
                //if ($debug) Debug.write("Obj attr ",dObj[i].nodeName,tFileObj[dObj[i].nodeName]);
                
            }
        
            return tFileObj;
            
        ]]>
    </method>
    
    <!--
        Parse Items and generate Output
     --> 
    <method name="parseRootItems" args="roomObject">
        <![CDATA[
            this.clearContent();
            
            var homeSizeInMBytes = Math.round( (roomObject.userHomeSize / 1024 / 1024) * 100) / 100;
            
            this._userSpace._userHomeSize.setAttribute("text","" + homeSizeInMBytes + " MBytes");
            
            var roomHomeSizeInMBytes = Math.round( (roomObject.roomHomeSize / 1024 / 1024) * 100) / 100;
            
            this._userSpace._roomHomeSize.setAttribute("text","" + roomHomeSizeInMBytes + " MBytes");
            
            var homeIcon = new lz.rootFileExplorerItem(this._filearea._contentarea,{
                                        open:true,
                                        fileName:canvas.getLabelName(706),
                                        name:'_home',
                                        isRoot:true,
                                        fileIcon:'file_explorer_folder_home_rsc',
                                        isOwner:true,
                                        refObjListRoot:this
                                    });
                                    
            homeIcon.content.setAttribute("visibility","visible");
            homeIcon.icon_folder_pre.setAttribute("frame",2);
            homeIcon._folderIcon.setAttribute("frame",2);
            
            //Home area
            for (var i=0; i<roomObject.userHome.length; i++) {
                var fileExplorerItem = roomObject.userHome[i];
                //if ($debug) Debug.write("fileExplorerItem, ",fileExplorerItem);
                if (fileExplorerItem.isFolder) {
                    new lz.folderFileExplorerItem(homeIcon.content,{
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileIcon:'icon_folder_rsc',
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isImage) {
                    new lz.imageFileExplorerItem(homeIcon.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileHash:fileExplorerItem.fileHash,
                                            isFolder:false,isImage:true,
                                            fileIcon:'file_explorer_image_rsc',
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isPresentation) {
                    new lz.documentFileExplorerItem(homeIcon.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileHash:fileExplorerItem.fileHash,
                                            isFolder:false,isPresentation:true,
                                            fileIcon:'file_explorer_document_rsc',
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isVideo) {
                    new lz.videoFileExplorerItem(homeIcon.content,{
                                            isFolder:false,
                                            isVideo:true,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileHash:fileExplorerItem.fileHash,
                                            isFolder:false,isImage:true,
                                            fileIcon:'file_explorer_video_rsc',
                                            flvHeight:fileExplorerItem.flvHeight,
                                            flvWidth:fileExplorerItem.flvWidth,
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isStoredWmlFile) { 
                	new lz.wmlFileExplorerItem(homeIcon.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileIcon:'file_explorer_wml_rsc',
                                            isWmlFile: true,
                                            refObjListRoot:this                	
            							});
                } else if (fileExplorerItem.isChart) { 
                  new lz.wmlFileExplorerItem(homeIcon.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileIcon:'file_explorer_chart_rsc',
                                            isChart:true,
                                            refObjListRoot:this                 
                          });

            	}
            }
            //Public - Room Area
            var roomHome = new lz.rootFileExplorerItem(this._filearea._contentarea,{
                                        open:true,
                                        fileName:canvas.getLabelName(707),
                                        name:'_roomHome',
                                        isRoot:true,
                                        fileIcon:'file_explorer_folder_network_rsc',
                                        refObjListRoot:this
                                    });
                                    
            roomHome.content.setAttribute("visibility","visible");
            roomHome.icon_folder_pre.setAttribute("frame",2);
            roomHome._folderIcon.setAttribute("frame",2);
            
            //Public area
            for (var i=0; i<roomObject.roomHome.length; i++) {
                var fileExplorerItem = roomObject.roomHome[i];
                //if ($debug) Debug.write("fileExplorerItem.fileExplorerItemId, ",fileExplorerItem.fileExplorerItemId);
                //if ($debug) Debug.write("fileExplorerItem, ",fileExplorerItem);
                if (fileExplorerItem.isFolder) {
                    new lz.folderFileExplorerItem(roomHome.content,{
                                            fileName:fileExplorerItem.fileName,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileIcon:'icon_folder_rsc',
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isImage) {
                    new lz.imageFileExplorerItem(roomHome.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileHash:fileExplorerItem.fileHash,
                                            isFolder:false,isImage:true,
                                            fileIcon:'file_explorer_image_rsc',
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isPresentation) {
                    new lz.documentFileExplorerItem(roomHome.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileHash:fileExplorerItem.fileHash,
                                            isFolder:false,isPresentation:true,
                                            fileIcon:'file_explorer_document_rsc',
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isVideo) {
                    new lz.videoFileExplorerItem(roomHome.content,{
                                            isFolder:false,
                                            isVideo:true,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileHash:fileExplorerItem.fileHash,
                                            isFolder:false,isImage:true,
                                            fileIcon:'file_explorer_video_rsc',
                                            flvHeight:fileExplorerItem.flvHeight,
                                            flvWidth:fileExplorerItem.flvWidth,
                                            refObjListRoot:this
                                        });
                } else if (fileExplorerItem.isStoredWmlFile) { 
                	new lz.wmlFileExplorerItem(roomHome.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileIcon:'file_explorer_wml_rsc',
                                            isWmlFile: true,
                                            refObjListRoot:this                	
            							});
                } else if (fileExplorerItem.isChart) { 
                  new lz.wmlFileExplorerItem(roomHome.content,{
                                            isFolder:false,
                                            fileExplorerItemId:fileExplorerItem.fileExplorerItemId,
                                            fileName:fileExplorerItem.fileName,
                                            fileIcon:'file_explorer_chart_rsc',
                                            isChart:true,
                                            refObjListRoot:this                 
                          });
           		}
            }
        ]]>
    </method>
    
    <method name="clearContent">
        <![CDATA[
            for (var eg in this._filearea._contentarea.subviews) {
                this._filearea._contentarea.subviews[eg].destroy();
            }
        ]]>
    </method>
    
    <!--
        Borders
     -->
               
    <view name="_border2" x="0" y="${ 33 + parent._documentsTabs.height }" width="$once{ parent.width }" 
          height="1" bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }" />     
    
    <!--
        Documents - Tabbar
     --> 
    <documentsTabBar name="_documentsTabs" y="14" width="$once{ parent.width }"
                    visibility="hidden" />
    	
    
    <!--
        File Tree Content Tabbar
     --> 
     
    <view name="_fileBar" layout="axis:x" x="0" y="${ 14 + parent._documentsTabs.height }">
        <baseChooseIconView labelid="702" height="20" width="19" bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }"
                            resourceN="file_explorer_add_file_rsc">
            <handler name="onclick">
                if ($debug) Debug.write("Upload File");
                parent.parent.addFile();
            </handler>
        </baseChooseIconView>
        <baseChooseIconView labelid="703" height="20" width="19" bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }"
                            resourceN="file_explorer_add_folder_rsc" >
            <handler name="onclick">
                if ($debug) Debug.write("Add Folder");
                parent.parent.addFolder();
            </handler>
        </baseChooseIconView>
        <baseChooseIconView labelid="704" height="20" width="19" bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }"
                            resourceN="file_explorer_reload_rsc" >
            <handler name="onclick">
                if ($debug) Debug.write("Refresh Folder");
                parent.parent.loadFiles();
            </handler>
        </baseChooseIconView>
        <view bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }" height="20" width="1" />
    </view>
    
    <!--
        File Tree Content Trashbar
     --> 
     
    <view name="_trashBar" layout="axis:x" x="$once{ parent.width - 20 }" 
          y="${ 14 + parent._documentsTabs.height }">
        <baseChooseIconView name="_trashIcon" labelid="705" height="20" width="19" 
                         resourceN="file_explorer_trash_rsc" bgcolor="$once{ canvas.getThemeColor('secondBorderColor') }">
            <attribute name="isTrashCan" value="true" type="boolean" />
            <handler name="onclick">
                if ($debug) Debug.write("Delete Folder and Files");
            </handler>
            <handler name="onmousetrackover">
                //if ($debug) Debug.write("onmousetrackover");
                canvas.currentImagesListdraw.currentDragItem.sendOverItem(this);
                this.onmouseover.sendEvent();
            </handler>
            <handler name="onmousetrackout">
                //if ($debug) Debug.write("onmousetrackout");
                canvas.currentImagesListdraw.currentDragItem.sendOutItem(this);
                this.onmouseout.sendEvent();
            </handler>
            <handler name="onmousetrackup">
                if ($debug) Debug.write("onmousetrackup");
                this.onmouseout.sendEvent();
            </handler> 
        </baseChooseIconView>
        <view bgcolor="0xE0E0E0" height="20" width="1" />
    </view>
    
    <!--
        File Tree Content
     --> 
    
    <view name="_filearea" x="1" y="${ 34 + parent._documentsTabs.height }" clip="true"
          height="${ parent.height - 35 - parent._documentsTabs.height - parent._userSpace.height }" 
          width="$once{ parent.width }">
        
        <attribute name="currentTrackGroupName" value="fileExplorer" type="string" />
        
        <attribute name="currentDragItem" value="null" />
        
        <handler name="oninit">
            canvas.currentImagesListdraw = this;
        </handler>
        
        <view name="_contentarea" layout="axis:y;inset:1" />
        
        <om_vscrollbar name="_scrollbar" />
        <om_hscrollbar name="_hscrollbar" />
    </view>
    
    <view name="_userSpace" height="40" valign="bottom" width="$once{ parent.width }">
    	
    	<labelText name="_userHomeSizeLabel" labelid="923" fgcolor="$once{ canvas.getThemeColor('menuTextColor') }" />
    	
    	<labelText name="_userHomeSize" align="right" fgcolor="$once{ canvas.getThemeColor('menuTextColor') }" />
    	
    	<labelText name="_roomHomeSizeLabel" labelid="924" y="20" fgcolor="$once{ canvas.getThemeColor('menuTextColor') }" />
    	
    	<labelText name="_roomHomeSize" align="right" y="20" fgcolor="$once{ canvas.getThemeColor('menuTextColor') }" />
    	
    </view>
    
</class>

</library>
