diff --git a/css/default.php b/css/default.php
index 6ab515cca7ad739a1da45cc4193f453459cc470a..dd1ad09b015fb1177d998b02a3573633fcc4e176 100755
--- a/css/default.php
+++ b/css/default.php
@@ -2,10 +2,49 @@
 header('Content-Type: text/css');
 require_once('../inc/lib_base.php');
 ?>
-body {
+html,body {
     background-color: #F9F9F9;
     margin:0px;
+    height:100%;
+    width:100%;
+    position:absolute;
+}
+#mainlayout{
+	width:100%;
+	height:100%;
+}
+
+#mainlayout>div{
+	position:absolute;
+	width:100%;
+	left:0px;
 }
+
+#mainlayout>.head{
+	height:175px;
+	top:0px;
+}
+
+#mainlayout>.body{
+	vertical-align:top;
+	top:175px;
+	bottom:75px;
+	overflow:auto;
+}
+
+#mainlayout>.foot{
+	height:75px;
+	bottom:0px;
+}
+
+#mainlayout>.foot>.bar{
+	background-color:#EEE;
+	position:absolute;
+	top:0px;
+	height:24px;
+	width:100%;
+}
+
 body.error {background-color: #F0F0F0;}
 body,th,td,ul,li,a,div,p,pre {color:#333333; font-family:Verdana,"Bitstream Vera Sans",Arial,Helvetica,Sans,"Bitstream Vera Serif"; font-size:9.0pt;}
 
@@ -35,6 +74,8 @@ div#nav {
   background-color: #EEEEEE;
   padding:0px;
   margin:0px;
+  position:absolute;
+  bottom:0px;
 }
 
 a#owncloud-logo {
@@ -54,10 +95,13 @@ a#owncloud-logo span {
 .errortext {color:#CC3333; font-size:9pt; font-weight:bold; text-decoration:none;}
 .highlighttext {color:#333333; font-size:9pt; font-weight:bold; text-decoration:none;}
 .datetext {color:#333333; font-size:7pt;}
-.sizetext {color:#333333; font-size:7pt;}
+.sizetext{
+	color:#333333;
+	font-size:7pt;
+}
 .footer {color:#999999; text-align:center; font-size:9pt; margin-top:4em;}
 .footer a {color:#999999; text-decoration:none;}
-.hint {color:#AAAAAA; text-align:center; font-size:8pt; margin-top:4em; margin-bottom:2em;}
+.hint {color:#AAAAAA; text-align:center; font-size:8pt; margin-top:10px;}
 .hint a{color:#AAAAAA; text-align:center; font-size:8pt;}
 
 .formstyle {
@@ -139,7 +183,11 @@ a#owncloud-logo span {
     margin:0px;
     padding:0px;
     border:0px;
-    //do not use display:none here, it breaks iframes in some browsers
+    position:absolute;
+    top:0px;
+    left:0px;
+    overflow:hidden;
+    /*do not use display:none here, it breaks iframes in some browsers*/
 }
 
 div.OCNotification{
@@ -153,7 +201,7 @@ div.OCNotification{
 div.OCNotificationHolder{
     right:20px;
     bottom:0px;
-    position:absolute;
+    position:fixed;
     color:white;
 }
 
@@ -163,20 +211,10 @@ td img.file_actions{
     width:9px;
 }
 
-td:hover img.file_actions{
+td.nametext:hover img.file_actions{
     height:auto;
 }
 
-td img.rename, td img.delete{
-    height:0px;
-    width:16px;
-    cursor:pointer;
-}
-
-td:hover img.rename, tr:hover img.delete{
-    height:16px;
-}
-
 div.breadcrumb{
    background-color: #F0F0F0; 
 }
@@ -194,4 +232,93 @@ div.fileactionlist td{
 
 div.fileactionlist td:hover{
     background-color: #CCCCCC;
+}
+
+tr.breadcrumb{
+	background-color: #CCCCCC;
+}
+
+#content, div.browser{
+	vertical-align:top;
+	/*min-height:200px;*/
+	height:100%;
+}
+
+table.browser{
+	border: solid 3px #CCC;
+	height:100%;
+	border-spacing:0px;
+}
+
+table.browser thead, table.browser tfoot{
+	background-color:#CCC;
+	width:100%;
+}
+
+td.sizetext{
+	width:110px;
+	text-align:right;
+}
+
+td.fileSelector, td.fileicon{
+	width:16px;
+}
+
+span.upload{
+	float:right;
+	text-align:right;
+	margin:0px;
+	padding:0px;
+}
+
+table.browser>tbody{
+	vertical-align:top;
+}
+
+table.browser>tbody>tr>td, table.browser>tbody>tr{
+	padding:0px;
+	/*height:100%;*/
+}
+
+div.fileList{
+	width:800px;
+	overflow:auto;
+	vertical-align:top;
+	height:100%;
+	min-height:200px;
+	top:0px;
+}
+
+div.fileList table{
+	width:100%;
+	vertical-align:top;
+}
+
+table.browser thead td,table.browser tfoot td{
+	padding-left:6px;
+	padding-top:0px;
+	padding-bottom:0px;
+}
+
+#imageframe{
+	position:absolute;
+	top:0px;
+	left:0px;
+	height:100%;
+	width:100%;
+	background:rgb(20,20,20);
+	background:rgba(20,20,20,0.9);
+	text-align:center;
+}
+
+#imageframe img{
+	vertical-align:middle;
+	max-height:90%;
+	max-width:90%;
+	margin:10px;
+	border: black solid 3px;
+}
+
+tr.hint, tr.hint td{
+	background:transparent;
 }
\ No newline at end of file
diff --git a/files/get_file.php b/files/get_file.php
index 72fc893806332c75b32128c431c4f4d86b42ee57..9ec539ee7e014da022aebdeece621721c310a79c 100644
--- a/files/get_file.php
+++ b/files/get_file.php
@@ -20,7 +20,7 @@
 * 
 */
 
-//not this file is for getting files themselves, get_files.php is for getting a list of files.
+//note this file is for getting files themselves, get_files.php is for getting a list of files.
 
 require_once('../inc/lib_base.php');
 
diff --git a/files/open_file.php b/files/open_file.php
new file mode 100644
index 0000000000000000000000000000000000000000..933efa51e1e01e8a7e919ff0d6ca7b276fdf0098
--- /dev/null
+++ b/files/open_file.php
@@ -0,0 +1,63 @@
+<?php
+/**
+* ownCloud - ajax frontend
+*
+* @author Robin Appelman
+* @copyright 2010 Robin Appelman icewind1991@gmail.com
+* 
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either 
+* version 3 of the License, or any later version.
+* 
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*  
+* You should have received a copy of the GNU Lesser General Public 
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+* 
+*/
+
+//not this file is for getting files themselves, get_files.php is for getting a list of files.
+
+require_once('../inc/lib_base.php');
+
+function get_mime_type($filename, $mimePath = '../etc') { 
+   $fileext = substr(strrchr($filename, '.'), 1); 
+   if (empty($fileext)) return (false); 
+   $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext\s)/i"; 
+   $lines = file("$mimePath/mime.types"); 
+   foreach($lines as $line) { 
+      if (substr($line, 0, 1) == '#') continue; // skip comments 
+      $line = rtrim($line) . " "; 
+      if (!preg_match($regex, $line, $matches)) continue; // no match to the extension 
+      return ($matches[1]); 
+   } 
+   return (false); // no match at all 
+} 
+
+$file=$_GET['file'];
+$dir=(isset($_GET['dir']))?$_GET['dir']:'';
+if(strstr($file,'..') or strstr($dir,'..')){
+    die();
+}
+$filename=$CONFIG_DATADIRECTORY.'/'.$dir.'/'.$file;
+// $ftype='application/octet-stream'; 
+// $finfo=new finfo(FILEINFO_MIME); 
+// $fres=@$finfo->file($filename); 
+// if (is_string($fres) && !empty($fres)) { 
+//    $ftype = $fres; 
+// }
+$ftype=get_mime_type($filename);
+ob_end_clean();
+// echo $ftype;
+// die();
+header('Content-Type: '.$ftype);
+header('Expires: 0');
+header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+header('Pragma: public');
+header('Content-Length: ' . filesize($filename));
+readfile($filename);
+?>
\ No newline at end of file
diff --git a/inc/lib_files.php b/inc/lib_files.php
index dbafa52a180e3c74c07ad0884e9904859017d437..5ddf5a4e1f3d031903f399067181df799b759262 100755
--- a/inc/lib_files.php
+++ b/inc/lib_files.php
@@ -77,7 +77,7 @@ class OC_FILES {
     echo('</table>');
     if(!$content) echo('<p>no files here</p>');
     echo('</div>');*/
-    echo '<div id="content"/>';
+    echo '<div id="content"></div>';
   }
   
   /**
diff --git a/inc/lib_log.php b/inc/lib_log.php
index 980011e05e2502583ba1a88c9a7ab4e9846a97fd..2a8a91be40a3e8698332c7577b1be2de1642a9e6 100755
--- a/inc/lib_log.php
+++ b/inc/lib_log.php
@@ -59,7 +59,7 @@ class OC_LOG {
    */
   public static function show(){
     global $CONFIG_DATEFORMAT;
-    echo('<div class="center"><table cellpadding="6" cellspacing="0" border="0" class="browser">');
+    echo('<div class="center"><table cellpadding="6" cellspacing="0" border="0" class="log">');
 
     $result = OC_DB::query('select timestamp,user,type,message from log order by timestamp desc limit 20');
     $count=OC_DB::numrows($result);
diff --git a/inc/templates/footer.php b/inc/templates/footer.php
index 5ce34a957910ea50510bd48c0b9754b468a5d78a..16b41d3e2e33c65e90a5be54a1e2489eefc6099d 100755
--- a/inc/templates/footer.php
+++ b/inc/templates/footer.php
@@ -1,6 +1,16 @@
+<?php
+global $WEBROOT;
+?>
+</div>
+<div class='foot'>
+<div class='bar'><p class="hint">
+Hint: Mount it via webdav like this: <a href="webdav://'.<?php echo($_SERVER["HTTP_HOST"].$WEBROOT.'/webdav/owncloud.php');?>">webdav://<?php echo($_SERVER["HTTP_HOST"].$WEBROOT);?>/webdav/owncloud.php</a>
+</p></div>
 <p class="footer">
 <?php
   echo('<a href="http://ownCloud.org">ownCloud</a> - 1.0 beta 2');
 ?>
 </p>
+</div>
+</div>
 </body></html>
diff --git a/inc/templates/header.php b/inc/templates/header.php
index ec71468458961ebfd9edccf78823051e383815f2..09529f67268d984651ba5278834c574e21b19f8e 100755
--- a/inc/templates/header.php
+++ b/inc/templates/header.php
@@ -10,6 +10,8 @@
 	<script type='text/ecmascript' src='<?php echo($WEBROOT)?>/js/lib_notification.js'></script>
 	<script type='text/ecmascript' src='<?php echo($WEBROOT)?>/js/lib_xmlloader.js'></script>
 	<script type='text/ecmascript' src='<?php echo($WEBROOT)?>/js/lib_files.js'></script>
+	<script type='text/ecmascript' src='<?php echo($WEBROOT)?>/js/lib_event.js'></script>
+	<script type='text/ecmascript' src='<?php echo($WEBROOT)?>/js/filebrowser.js'></script>
 <?php
 foreach(OC_UTIL::$scripts as $script){
     echo("<script type='text/ecmascript' src='$WEBROOT/$script'></script>");
@@ -20,6 +22,8 @@ foreach(OC_UTIL::$scripts as $script){
 	</script>
     </head>
     <body onload='OC_onload.run()'>
+<div id='mainlayout'>
+<div class='head'>
 <?php
 echo('<h1><a id="owncloud-logo" href="'.$WEBROOT.'"><span>ownCloud</span></a></h1>');
 
@@ -51,6 +55,7 @@ echo('<h1><a id="owncloud-logo" href="'.$WEBROOT.'"><span>ownCloud</span></a></h
     echo('<div id="nav" class="center">');
     OC_UTIL::shownavigation();
     echo('</div>');
+    echo('</div><div class="body">');
   }
 
 ?>
diff --git a/index.php b/index.php
index dd613f2854f9bf09cb1773c77910e4f49efab00e..e755ab86237c95b5ac2de46c5420f041f288d628 100755
--- a/index.php
+++ b/index.php
@@ -37,8 +37,6 @@ echo('heya');
   OC_UTIL::showheader();
 
   OC_FILES::showbrowser($CONFIG_DATADIRECTORY,$dir);
-echo('hi');
-  echo('<br /><br /><p class="hint">Hint: Mount it via webdav like this: <a href="webdav://'.$_SERVER["HTTP_HOST"].$WEBROOT.'/webdav/owncloud.php">webdav://'.$_SERVER["HTTP_HOST"].$WEBROOT.'/webdav/owncloud.php</a></p>');
 
   OC_UTIL::showfooter();
 
diff --git a/js/ajax.js b/js/ajax.js
index 6c0185c65922e22ad61383a7efdb0e13d9b19402..534dd46a29022bd0c69cd86606486b128ba046ad 100644
--- a/js/ajax.js
+++ b/js/ajax.js
@@ -19,10 +19,5 @@
 * 
 */
 
-var dir=''
-var loc=document.location.toString();
-if(loc.indexOf('#')!=-1){
-   dir=loc.substring(loc.indexOf('#')+1);
-}
 
-OC_onload.add(new function(){OC_FILES.showbrowser(dir)});
\ No newline at end of file
+OC_onload.add(OC_FILES.browser.showInitial);
\ No newline at end of file
diff --git a/js/filebrowser.js b/js/filebrowser.js
new file mode 100644
index 0000000000000000000000000000000000000000..dac81327b69122dbe9916b531ffba8017fb41357
--- /dev/null
+++ b/js/filebrowser.js
@@ -0,0 +1,376 @@
+/**
+* ownCloud - ajax frontend
+*
+* @author Robin Appelman
+* @copyright 2010 Robin Appelman icewind1991@gmail.com
+* 
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either 
+* version 3 of the License, or any later version.
+* 
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*  
+* You should have received a copy of the GNU Lesser General Public 
+* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+* 
+*/
+
+OC_FILES.browser=new  Object();
+
+OC_FILES.browser.showInitial=function(){
+	var dir=''
+	var loc=document.location.toString();
+	if(loc.indexOf('#')!=-1){
+		dir=loc.substring(loc.indexOf('#')+1);
+	}
+	OC_FILES.dir=dir;
+   OC_FILES.getdirectorycontent(dir,OC_FILES.browser.show_callback);
+}
+
+OC_FILES.browser.show=function(dir){
+   if(!dir){
+      dir='';
+   }
+   OC_FILES.dir=dir;
+   OC_FILES.getdirectorycontent(dir,OC_FILES.browser.show_callback);
+}
+
+OC_FILES.browser.show_callback=function(content){
+    var dir=OC_FILES.dir
+    var dirs=dir.split('/');
+    var tr=null;
+    var td=null;
+    var img=null;
+    
+    body=document.getElementsByTagName('body').item(0);
+    body.addEvent('onclick',OC_FILES.browser.hideallactions);
+    
+    //remove current content;
+    var contentNode=document.getElementById('content');
+    contentNode.className='center';
+    if(contentNode.hasChildNodes()){
+       while(contentNode.childNodes.length >=1){
+          contentNode.removeChild(contentNode.firstChild);
+       }
+    }
+    var table=document.createElement('table');
+    table.className='browser';
+    var tbody=document.createElement('tbody');
+    var thead=document.createElement('thead');
+	var tfoot=document.createElement('tfoot');
+	table.appendChild(thead);
+    table.appendChild(tbody);
+    table.appendChild(tfoot);
+//     table.setAttribute('cellpadding',6);
+    
+    // breadcrumb
+    if(dirs.length>0) {
+       tr=document.createElement('tr');
+       thead.appendChild(tr);
+       tr.className='breadcrumb';
+       td=document.createElement('td');
+         tr.appendChild(td);
+         td.className='fileSelector'
+         input=document.createElement('input');
+         input.setAttribute('type','checkbox');
+         input.setAttribute('name','fileSelector');
+         input.setAttribute('value','select_all');
+         input.setAttribute('id','select_all');
+         input.addEvent('onclick',OC_FILES.selectAll);
+         td.appendChild(input);
+       td=document.createElement('td');
+       tr.appendChild(td);
+       td.className='breadcrumb';
+       var a=document.createElement('a');
+       td.appendChild(a);
+       a.setAttribute('href','#');
+       a.addEvent('onclick',OC_FILES.browser.show);
+       a.appendChild(document.createTextNode('Home'));
+       var currentdir='';
+       for(var index=0;index<dirs.length;index++){
+          d=dirs[index];
+          currentdir=currentdir+'/'+d;
+          if(d!=''){
+             a=document.createElement('a');
+             td.appendChild(a);
+             a.setAttribute('href','#'+currentdir);
+             a.addEvent('onclick',OC_FILES.browser.show,currentdir);
+             img=document.createElement('img');
+             a.appendChild(img);
+             img.src=WEBROOT+'/img/arrow.png';
+             a.appendChild(document.createTextNode(' ' +d));
+          }
+      }
+    }
+
+    // files and directories
+    
+    var filesfound=false;
+    var sizeTd=null;
+    if(content){
+		tr=document.createElement('tr');
+		tbody.appendChild(tr);
+		td=document.createElement('td');
+		td.setAttribute('colspan','6');
+		tr.appendChild(td);
+		div=document.createElement('div');
+		td.appendChild(div);
+		div.className='fileList';
+		div.setAttribute('style','max-height:'+(parseInt(document.body.clientHeight)-300)+'px;');
+		table2=document.createElement('table');
+		div.appendChild(table2);
+		tbody2=document.createElement('tbody');
+		table2.appendChild(tbody2);
+		table2.setAttribute('cellpadding',6);
+		table2.setAttribute('cellspacing',0);
+         for(index in content){
+          var file=content[index];
+          if(file.name){
+             file.name=file.name.replace('\'','');
+             OC_FILES.files[file['name']]=new OC_FILES.file(dir,file['name'],file['type']);
+             tr=document.createElement('tr');
+             tbody2.appendChild(tr);
+             tr.className='browserline';
+             td=document.createElement('td');
+             tr.appendChild(td);
+             td.className='fileSelector';
+             input=document.createElement('input');
+             input.setAttribute('type','checkbox');
+             input.setAttribute('name','fileSelector');
+             input.setAttribute('value',file['name']);
+             td.appendChild(input);
+             tr.appendChild(OC_FILES.browser.showicon(file['type']));
+             td=document.createElement('td');
+             tr.appendChild(td);
+             td.className='nametext';
+             td.setAttribute('name',file['name']);
+             td.setAttribute('id',file['name']);
+             a=document.createElement('a');
+             td.appendChild(a);
+             a.appendChild(document.createTextNode(file['name']));
+             var fileObject=OC_FILES.files[file['name']];
+             a.addEvent('onclick',new callBack(fileObject.actions['default'],fileObject));
+             if(file['type']=='dir'){
+                td.setAttribute('colspan',2);
+                a.setAttribute('href','#'+dir+'/'+file['name']);
+             }else{
+                a.setAttribute('href','#'+dir);
+                sizeTd=document.createElement('td');
+                tr.appendChild(sizeTd);
+                sizeTd.className='sizetext';
+                sizeTd.appendChild(document.createTextNode(sizeFormat(file['size'])));
+             }
+             a=document.createElement('a');
+             var img=document.createElement('img');
+             td.appendChild(img);
+             img.className='file_actions';
+             img.alt=''
+             img.title='actions';
+             img.src=WEBROOT+'/img/arrow_down.png';
+             var name=file['name'];
+             img.addEvent('onclick',OC_FILES.browser.showactions,name);
+             td=document.createElement('td');
+             tr.appendChild(td);
+             td.className='sizetext';
+             td.appendChild(document.createTextNode(file['date']));
+          }
+       }
+    }
+    tr=document.createElement('tr');
+	tfoot.appendChild(tr);
+	tr.className='utilityline';
+	td=document.createElement('td');
+	tr.appendChild(td);
+	td.setAttribute('colspan','4');
+	span=document.createElement('span');
+	td.appendChild(span);
+	dropdown=document.createElement('select');
+	span.appendChild(dropdown);
+	dropdown.setAttribute('id','selected_action');
+	for(index in this.actions_selected){
+	if(this.actions_selected[index].call){
+		option=document.createElement('option');
+		dropdown.appendChild(option);
+		option.setAttribute('value',index);
+		option.appendChild(document.createTextNode(capitaliseFirstLetter(index)));
+	}
+	}
+	span.appendChild(document.createTextNode(' Selected '));
+	button=document.createElement('button');
+	span.appendChild(button);
+	button.appendChild(document.createTextNode('Go'));
+	button.addEvent('onclick',OC_FILES.action_selected);
+	span=document.createElement('span');
+	span.className='upload';
+	td.appendChild(span);
+    OC_FILES.browser.showuploader(dir,span,content['max_upload']);
+    contentNode.appendChild(table);
+}
+
+OC_FILES.browser.showicon=function(filetype){
+   var td=document.createElement('td');
+   td.className='fileicon';
+   var img=document.createElement('img');
+   td.appendChild(img);
+   img.setAttribute('width',16);
+   img.setAttribute('height',16);
+   if(filetype=='dir'){
+      img.src=WEBROOT+'/img/icons/folder.png';
+   }else{
+      img.src=WEBROOT+'/img/icons/other.png';
+   }
+   return td;
+}
+
+OC_FILES.browser.showuploader=function(dir,parent,max_upload){
+   OC_FILES.uploadForm=document.createElement('form');
+   OC_FILES.uploadForm.setAttribute('target','uploadIFrame');
+   OC_FILES.uploadForm.setAttribute('action','files/upload.php?dir='+dir);
+   OC_FILES.uploadForm.method='post';
+   OC_FILES.uploadForm.setAttribute('enctype','multipart/form-data');
+   OC_FILES.uploadIFrame=document.createElement('iframe');
+   OC_FILES.uploadIFrame.className='hidden';
+   OC_FILES.uploadIFrame.name='uploadIFrame';
+   var input=document.createElement('input');
+   input.setAttribute('type','hidden');
+   input.setAttribute('name','MAX_FILE_SIZE');
+   input.setAttribute('value',max_upload);
+   input.setAttribute('id','max_upload');
+   OC_FILES.uploadForm.appendChild(input);
+   var file=document.createElement('input');
+   file.name='file';
+   file.setAttribute('id','fileSelector');
+   file.setAttribute('type','file');
+   file.addEvent('onchange',OC_FILES.upload,[dir]);
+   OC_FILES.uploadForm.appendChild(document.createTextNode('Upload file: '));
+   OC_FILES.uploadForm.appendChild(file);
+   parent.appendChild(OC_FILES.uploadForm);
+   parent.appendChild(OC_FILES.uploadIFrame);
+}
+
+OC_FILES.browser.show_rename=function(dir,file){
+   var item=document.getElementById(file);
+   item.oldContent=Array();
+   if(item.hasChildNodes()){
+      while(item.childNodes.length >=1){
+         item.oldContent[item.oldContent.length]=item.firstChild;
+         item.removeChild(item.firstChild);
+      }
+   }
+   var form=document.createElement('form');
+   form.addEvent('onsubmit',OC_FILES.rename,[dir,file]);
+   var input=document.createElement('input');
+   input.setAttribute('type','text');
+   input.setAttribute('name','newname');
+   input.setAttribute('value',file);
+   input.setAttribute('id',file+'_newname')
+   input.addEvent('onblur',OC_FILES.browser.rename_cancel,[file]);
+   form.appendChild(input);
+   item.appendChild(form);
+   input.focus();
+}
+
+OC_FILES.browser.rename_cancel=function(file){
+   var item=document.getElementsByName(file).item(0);
+   if(item.hasChildNodes()){
+      while(item.childNodes.length >=1){
+         item.removeChild(item.firstChild);
+      }
+   }
+   for(index in item.oldContent){
+      if(item.oldContent[index].nodeType){
+         item.appendChild(item.oldContent[index]);
+      }
+   }
+}
+
+OC_FILES.browser.showactions=function(file,hide){
+    node=document.getElementById(file);
+    if(node &&(node.actionsshown || hide)){
+        if(node.actionsdiv){
+            node.removeChild(node.actionsdiv);
+        }
+        node.actionsdiv=null;
+        node.actionsshown=false
+    }else if(node){
+        node.actionsshown=true
+        div=document.createElement('div');
+        node.actionsdiv=div;
+        div.className='fileactionlist';
+        table=document.createElement('table');
+        div.appendChild(table);
+        tbody=document.createElement('tbody');
+        table.appendChild(tbody);
+        var file=OC_FILES.files[file]
+        var actions=file.actions;
+        for(name in actions){
+            if(actions[name].call && name!='default'){
+                tr=document.createElement('tr');
+                tbody.appendChild(tr);
+                td=document.createElement('td');
+                tr.appendChild(td);
+                a=document.createElement('a');
+                td.appendChild(a);
+                a.appendChild(document.createTextNode(capitaliseFirstLetter(name)));
+                var action=actions[name];
+                td.addEvent('onclick',new callBack(action,file));
+            }
+        }
+        node.appendChild(div);
+        OC_FILES.hideallenabled=false;
+        setTimeout('OC_FILES.hideallenabled=true',50);
+    }
+}
+
+OC_FILES.browser.hideallactions=function(){
+    if(OC_FILES.hideallenabled){
+        for(name in OC_FILES.files){
+			if(OC_FILES.files[name]){
+				if(OC_FILES.files[name].hideactions){
+					OC_FILES.files[name].hideactions.call(OC_FILES.files[name]);
+				}
+			}
+        }
+    }
+}
+
+OC_FILES.hideallenabled=true; //used to prevent browsers from hiding actionslists right after they are displayed;
+
+sizeFormat=function(size){
+    var orig=size;
+    var steps=Array('B','KiB','MiB','GiB','TiB');
+    var step=0;
+    while(size>(1024*2)){
+        step++;
+        size=size/1024;
+    }
+    if(size.toFixed){
+        size=size.toFixed(2);
+    }
+    return ''+size+' '+steps[step];
+}
+
+OC_FILES.browser.showImage=function(dir,file){
+	var path=WEBROOT+'/files/open_file.php?dir='+dir+'&file='+file
+	var div=document.createElement('div');
+	div.setAttribute('id','imageframe');
+	div.addEvent('onclick',OC_FILES.browser.hideImage)
+	var img=document.createElement('img');
+	img.setAttribute('src',path);
+	div.appendChild(img);
+	body=document.getElementsByTagName('body').item(0);
+	body.appendChild(div);
+}
+
+OC_FILES.browser.hideImage=function(){
+	var div=document.getElementById('imageframe');
+	div.parentNode.removeChild(div);
+}
+
+function capitaliseFirstLetter(string){
+	return string.charAt(0).toUpperCase() + string.slice(1);
+}
\ No newline at end of file
diff --git a/js/lib_ajax.js b/js/lib_ajax.js
index 28062e665322324b1b0ebbda589f0d7748531b46..319875d40e72fb0e03690d481b199bfbcc3bae88 100644
--- a/js/lib_ajax.js
+++ b/js/lib_ajax.js
@@ -32,35 +32,84 @@ callBack.callBacks=Array();
 callBack.call=function(id,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10){
    callback=callBack.callBacks[id];
    if(callback){
-       callback.func.call(callback.obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+       return callback.func.call(callback.obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
    }
 }
 
 callBack.prototype=function(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10){
-   this.call(false,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+   return this.call(false,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
 }
 callBack.prototype.func=false;
 callBack.prototype.obj=false;
 callBack.prototype.call=function(dummy,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10){
-   //the dummy is just to provide compatibility with the normal call function and isn't used
-   this.func.call(this.obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
+   return this.func.call(this.obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10);
 }
 callBack.prototype.apply=function(dummy,arguments){
-   //the dummy is just to provide compatibility with the normal call function and isn't used
-   this.apply(this.obj,arguments);
+   return this.func.apply(this.obj,arguments);
 }
 
 //provide a simple way to add things to the onload
 OC_onload=new Object();
 
 OC_onload.items=new Array();
-OC_onload.add=function(callback){
-   OC_onload.items[OC_onload.items.length]=callback;
+OC_onload.itemsPriority=new Array();
+OC_onload.add=function(callback,priority){
+    if(priority){
+        OC_onload.itemsPriority[OC_onload.items.length]=callback;
+    }else{
+        OC_onload.items[OC_onload.items.length]=callback;
+    }
 }
 OC_onload.run=function(){
-   for(index in OC_onload.items){
-      if(OC_onload.items[index].call){
-         OC_onload.items[index].call();
-      }
-   }
+    for(index in OC_onload.itemsPriority){
+        if(OC_onload.itemsPriority[index].call){
+           OC_onload.itemsPriority[index].call();
+        }
+    }
+    for(index in OC_onload.items){
+       if(OC_onload.items[index].call){
+           OC_onload.items[index].call();
+       }
+    }
+}
+
+//implement Node.prototype under IE
+if(typeof Node=='undefined'){
+    Node=new Object();
+    Node.prototype=new Object();
+    
+    tmpObj=new Object();
+    tmpObj.prototype=document.createElement;
+    document.createElementNative=document.createElement;
+    tmpObj=null;
+    
+    document.createElement=function(tagName){
+//         alert(tagName);
+        node=document.createElementNative(tagName);
+        for(name in Node.prototype){
+            node[name]=Node.prototype[name];
+        }
+        return node;
+    }
+    
+    addNodePrototype=function(node){
+        if(!node){
+            node=document.getElementsByTagName('body');
+            node=node.item(0)
+        }
+        if(node.nodeType==1){
+            for(name in Node.prototype){
+//                 node[name]=Node.prototype[name];
+                eval('node.'+name+'=Node.prototype.'+name+';');
+            }
+            if(node.hasChildNodes){
+                var childs=node.childNodes;
+                for(var i=0;i<childs.length;i++){
+                    addNodePrototype(childs[i]);
+                }
+            }
+        }
+    }
+    OC_onload.add(new function(){addNodePrototype(document.documentElement);});
+    OC_onload.add(addNodePrototype,true);
 }
\ No newline at end of file
diff --git a/js/lib_event.js b/js/lib_event.js
new file mode 100755
index 0000000000000000000000000000000000000000..f8482402d09464bb0f129b174687cea6578bca10
--- /dev/null
+++ b/js/lib_event.js
@@ -0,0 +1,49 @@
+/**
+ * eventHandler
+ *
+ * @author Icewind <icewind (at) derideal (dot) com>
+ * @copyright 2009
+ * @license http://www.gnu.org/licenses/gpl.html GNU Public License
+ * @version 0.1
+ */
+
+/*event handling
+usage:    document.events.add(node,type,function,arguments);
+   or:    node.addEvent(type,function,arguments);
+*/
+
+document.events=new Object;
+document.events.functions=Array();
+document.events.args=Array();
+
+document.events.add=function(element,type,func,args){
+	if(args){
+		if(typeof args!='object' && typeof args!='Object'){
+			args=[args];
+		}
+	}
+	if(!args){
+		args=Array();
+	}
+	if (type && element){
+		
+		//wrap the function in a function, otherwise it won't work if func is actually a callBack
+		var funcId=document.events.functions.length;
+		document.events.functions[funcId]=func;
+		document.events.args[funcId]=args;
+		eval('callback=function(event){result=document.events.functions['+funcId+'].apply(this,document.events.args['+funcId+']);if(result===false){if(event.preventDefault){event.preventDefault();}}};');
+		if(element.addEventListener){
+			var eventType=type;
+			if(eventType.substr(0,2)=='on'){
+				eventType=eventType.substr(2);
+			}
+			element.addEventListener(eventType,callback,false);
+		}else{
+			element.attachEvent(type,callback);
+		}
+	}
+}
+
+Node.prototype.addEvent=function(type,func,arguments){
+    document.events.add(this,type,func,arguments);
+}
\ No newline at end of file
diff --git a/js/lib_files.js b/js/lib_files.js
index 535eacd9790f4218c16d71d70d3708645e345d97..443d440380e825af01c6c2d11da2624535b3d117 100644
--- a/js/lib_files.js
+++ b/js/lib_files.js
@@ -55,225 +55,16 @@ OC_FILES.getdirectorycontent=function(dir,callback){
    OC_FILES.xmlloader.load('files/get_files.php?dir='+dir);
 }
 
-OC_FILES.showicon=function(filetype){
-   var td=document.createElement('td');
-   var img=document.createElement('img');
-   td.appendChild(img);
-   img.setAttribute('width',16);
-   img.setAttribute('height',16);
-   if(filetype=='dir'){
-      img.src=WEBROOT+'/img/icons/folder.png';
-   }else{
-      img.src=WEBROOT+'/img/icons/other.png';
-   }
-   return td;
-}
-
 OC_FILES.dir='';
-OC_FILES.browser=null;
-OC_FILES.showbrowser=function(dir){
-   dir=(dir)?dir:'';
-   OC_FILES.dir=dir;
-   OC_FILES.getdirectorycontent(dir,OC_FILES.showbrowser_callback);
-}
-
-OC_FILES.showbrowser_callback=function(content){
-    var dir=OC_FILES.dir
-    var dirs=dir.split('/');
-    var tr=null;
-    var td=null;
-    var img=null;
-    
-    body=document.getElementsByTagName('body').item(0);
-    body.setAttribute('onclick',body.getAttribute('onclick')+' ; OC_FILES.hideallactions()');
-    
-    //remove current content;
-    var contentNode=document.getElementById('content');
-    if(contentNode.hasChildNodes()){
-       while(contentNode.childNodes.length >=1){
-          contentNode.removeChild(contentNode.firstChild);
-       }
-    }
-    
-    var browser=document.createElement('div');
-    browser.className='center';
-    var table=document.createElement('table');
-    browser.appendChild(table);
-    
-    // breadcrumb
-    if(dirs.length>0) {
-       table.setAttribute('cellpadding',2);
-       table.setAttribute('cellspacing',0);
-       var tbody=document.createElement('tbody');//some IE versions need this
-       table.appendChild(tbody);
-       tr=document.createElement('tr');
-       tbody.appendChild(tr);
-       td=document.createElement('td');
-       tr.appendChild(td);
-       td.setAttribute('colspan','6');
-       td.className='breadcrumb';
-       var a=document.createElement('a');
-       td.appendChild(a);
-       a.setAttribute('href','#');
-       a.setAttribute('onclick','OC_FILES.showbrowser()');
-       a.appendChild(document.createTextNode('Home'));
-       var currentdir='';
-       for(index in dirs) {
-          d=dirs[index];
-          currentdir+='/'+d;
-          if(d!=''){
-//              td=document.createElement('td');
-//              tr.appendChild(td);
-//              td.className='breadcrumb';
-             a=document.createElement('a');
-             td.appendChild(a);
-             a.setAttribute('href','#'+currentdir);
-             a.setAttribute('onclick','OC_FILES.showbrowser("'+currentdir+'")');
-             img=document.createElement('img');
-             a.appendChild(img);
-             img.src=WEBROOT+'/img/arrow.png';
-             a.appendChild(document.createTextNode(' ' +d));
-          }
-      }
-    }
-
-    // files and directories
-    table.setAttribute('cellpadding',6);
-    table.setAttribute('cellspacing',0);
-    table.className='browser';
-    var tbody=document.createElement('tbody');//some IE versions need this
-    table.appendChild(tbody);
-    var filesfound=false;
-    var sizeTd=null;
-    if(content){
-         tr=document.createElement('tr');
-         tbody.appendChild(tr);
-         tr.className='browserline';
-         td=document.createElement('td');
-         tr.appendChild(td);
-         td.setAttribute('colspan','2');
-         input=document.createElement('input');
-         input.setAttribute('type','checkbox');
-         input.setAttribute('name','fileSelector');
-         input.setAttribute('value','select_all');
-         input.setAttribute('id','select_all');
-         input.setAttribute('onclick','OC_FILES.selectAll()');
-         td.appendChild(input);
-         td=document.createElement('td');
-         tr.appendChild(td);
-         td.setAttribute('colspan','4');
-         dropdown=document.createElement('select');
-         td.appendChild(dropdown);
-         dropdown.setAttribute('id','selected_action');
-         for(index in this.actions_selected){
-            if(this.actions_selected[index].call){
-                option=document.createElement('option');
-                dropdown.appendChild(option);
-                option.setAttribute('value',index);
-                option.appendChild(document.createTextNode(index));
-            }
-         }
-         td.appendChild(document.createTextNode(' selected. '));
-         button=document.createElement('button');
-         td.appendChild(button);
-         button.appendChild(document.createTextNode('Go'));
-         button.setAttribute('onclick','OC_FILES.action_selected()');
-         for(index in content){
-          file=content[index];
-          if(file.name){
-             file.name=file.name.replace('\'','');
-             OC_FILES.files[file['name']]=new OC_FILES.file(dir,file['name'],file['type']);
-             tr=document.createElement('tr');
-             tbody.appendChild(tr);
-             tr.className='browserline';
-             td=document.createElement('td');
-             tr.appendChild(td);
-             input=document.createElement('input');
-             input.setAttribute('type','checkbox');
-             input.setAttribute('name','fileSelector');
-             input.setAttribute('value',file['name']);
-             td.appendChild(input);
-             tr.appendChild(OC_FILES.showicon(file['type']));
-             td=document.createElement('td');
-             tr.appendChild(td);
-             td.className='nametext';
-             td.setAttribute('name',file['name']);
-             td.setAttribute('id',file['name']);
-             a=document.createElement('a');
-             td.appendChild(a);
-             a.appendChild(document.createTextNode(file['name']))
-             if(file['type']=='dir'){
-                a.setAttribute('onclick','OC_FILES.showbrowser("'+dir+file['name']+'")');
-                td.setAttribute('colspan',2);
-                a.setAttribute('href','#'+dir+file['name']);
-             }else{
-                a.setAttribute('href',WEBROOT+'/?dir=/'+dir+'&file='+file['name']);
-                sizeTd=document.createElement('td');
-                tr.appendChild(sizeTd);
-                sizeTd.className='sizetext';
-                sizeTd.appendChild(document.createTextNode(sizeFormat(file['size'])));
-             }
-             a=document.createElement('a');
-             img=document.createElement('img');
-             td.appendChild(img);
-             img.className='file_actions';
-             img.alt=''
-             img.title='actions';
-             img.src=WEBROOT+'/img/arrow_down.png';
-             img.setAttribute('onclick','OC_FILES.showactions(\''+file['name']+'\')')
-             td=document.createElement('td');
-             tr.appendChild(td);
-             td.className='sizetext';
-             td.appendChild(document.createTextNode(file['date']));
-          }
-       }
-    }
-    td=document.createElement('td');
-    tr.appendChild(td);
-    tr=document.createElement('tr');
-    tbody.appendChild(tr);
-    tr.className='utilrow';
-    td=document.createElement('td');
-    tr.appendChild(td);
-    td.className='upload';
-    td.setAttribute('colspan','6');
-    this.showuploader(dir,td,content['max_upload']);
-    contentNode.appendChild(browser);
-}
-
-OC_FILES.showuploader=function(dir,parent,max_upload){
-   this.uploadForm=document.createElement('form');
-   this.uploadForm.setAttribute('target','uploadIFrame');
-   this.uploadForm.setAttribute('action','files/upload.php?dir='+dir);
-   this.uploadForm.method='post';
-   this.uploadForm.setAttribute('enctype','multipart/form-data');
-   this.uploadIFrame=document.createElement('iframe');
-   this.uploadIFrame.className='hidden';
-   this.uploadIFrame.name='uploadIFrame';
-   parent.appendChild(this.uploadIFrame);
-   var input=document.createElement('input');
-   input.setAttribute('type','hidden');
-   input.setAttribute('name','MAX_FILE_SIZE');
-   input.setAttribute('value',max_upload);
-   input.setAttribute('id','max_upload');
-   this.uploadForm.appendChild(input);
-   var file=document.createElement('input');
-   file.name='file';
-   file.setAttribute('id','fileSelector');
-   file.setAttribute('type','file');
-   file.setAttribute('onchange','OC_FILES.upload("'+dir+'")');
-   this.uploadForm.appendChild(document.createTextNode('Upload file: '));
-   this.uploadForm.appendChild(file);
-   parent.appendChild(this.uploadForm);
-}
 
 OC_FILES.upload=function(dir){
-   OC_FILES.uploadIFrame.setAttribute('onload',"OC_FILES.upload_callback.call(OC_FILES,'"+dir+"')");
+   OC_FILES.uploadIFrame.addEvent('onload',new callBack(OC_FILES.upload_callback,OC_FILES),dir);
    var fileSelector=document.getElementById('fileSelector');
    var max_upload=document.getElementById('max_upload').value;
    if(fileSelector.files && fileSelector.files[0].fileSize){
-       var size=fileSelector.files[0].fileSize
+       var size=fileSelector.files[0].fileSize;
        if(size>max_upload){
+           new OCNotification('File to large',10000)
            return false;
        }
    }
@@ -281,38 +72,16 @@ OC_FILES.upload=function(dir){
 }
 
 OC_FILES.upload_callback=function(dir){
-   this.showbrowser(dir);
+   this.browser.show(dir);
 }
 
 OC_FILES.rename=function(dir,file){
-   var item=document.getElementById(file);
-   item.oldContent=Array();
-   if(item.hasChildNodes()){
-      while(item.childNodes.length >=1){
-         item.oldContent[item.oldContent.length]=item.firstChild;
-         item.removeChild(item.firstChild);
-      }
-   }
-   var form=document.createElement('form');
-   form.setAttribute('onsubmit','return OC_FILES.do_rename(\''+dir+'\',\''+file+'\')')
-   var input=document.createElement('input');
-   input.setAttribute('type','text');
-   input.setAttribute('name','newname');
-   input.setAttribute('value',file);
-   input.setAttribute('id',file+'_newname')
-   input.setAttribute('onblur','OC_FILES.rename_cancel(\''+file+'\')');
-   form.appendChild(input);
-   item.appendChild(form);
-   input.focus();
-}
-
-OC_FILES.do_rename=function(dir,file){
    var item=document.getElementById(file+'_newname');
    var newname=item.value;
    if(newname==''){
       return false;
    }else if(file==newname){
-      OC_FILES.showbrowser(OC_FILES.dir);
+      OC_FILES.browser.show(OC_FILES.dir);
       return false;
    }
    xmlloader=new OCXMLLoader();
@@ -321,22 +90,9 @@ OC_FILES.do_rename=function(dir,file){
    return false;
 }
 
-OC_FILES.rename_callback=function(req){
-   OC_FILES.showbrowser(OC_FILES.dir);
-}
 
-OC_FILES.rename_cancel=function(file){
-   var item=document.getElementsByName(file).item(0);
-   if(item.hasChildNodes()){
-      while(item.childNodes.length >=1){
-         item.removeChild(item.firstChild);
-      }
-   }
-   for(index in item.oldContent){
-      if(item.oldContent[index].nodeType){
-         item.appendChild(item.oldContent[index]);
-      }
-   }
+OC_FILES.rename_callback=function(req){
+   OC_FILES.browser.show(OC_FILES.dir);
 }
 
 OC_FILES.remove=function(dir,file){
@@ -349,7 +105,7 @@ OC_FILES.remove=function(dir,file){
 }
 
 OC_FILES.remove_callback=function(req){
-   OC_FILES.showbrowser(OC_FILES.dir);
+   OC_FILES.browser.show(OC_FILES.dir);
 }
 
 OC_FILES.getSelected=function(){
@@ -409,26 +165,38 @@ OC_FILES.file=function(dir,file,type){
     this.file=file;
     this.dir=dir;
     this.actions=new Object();
-    this.extention=file.substr(file.indexOf('.'));
+    if(file.lastIndexOf('.')){
+        this.extention=file.substr(file.lastIndexOf('.')+1);
+    }else{
+        this.extention;
+    }
     for(index in OC_FILES.fileActions.all){
         if(OC_FILES.fileActions.all[index].call){
             this.actions[index]=OC_FILES.fileActions.all[index];
         }
     }
-    if(OC_FILES.fileActions[this.extention])
-    for(index in OC_FILES.fileActions[this.extention]){
-        if(OC_FILES.fileActions[this.extention][index].call){
-            this.actions[index]=OC_FILES.fileActions[this.extention][index];
-        }
-    }
+    if(OC_FILES.fileActions[this.type]){
+		for(index in OC_FILES.fileActions[this.type]){
+			if(OC_FILES.fileActions[this.type][index].call){
+				this.actions[index]=OC_FILES.fileActions[this.type][index];
+			}
+		}
+	}
+	if(OC_FILES.fileActions[this.extention]){
+		for(index in OC_FILES.fileActions[this.extention]){
+			if(OC_FILES.fileActions[this.extention][index].call){
+				this.actions[index]=OC_FILES.fileActions[this.extention][index];
+			}
+		}
+	}
 }
 
 OC_FILES.file.prototype.showactions=function(){
-    OC_FILES.showactions(this.file);
+    OC_FILES.browser.showactions(this.file);
 }
 
 OC_FILES.file.prototype.hideactions=function(){
-    OC_FILES.showactions(this.file,true);
+    OC_FILES.browser.showactions(this.file,true);
 }
 
 OC_FILES.fileActions=new Object();
@@ -439,71 +207,47 @@ OC_FILES.fileActions.all.remove=function(){
     OC_FILES.remove(this.dir,this.file);
 }
 OC_FILES.fileActions.all.rename=function(){
-    OC_FILES.rename(this.dir,this.file);
+    OC_FILES.browser.show_rename(this.dir,this.file);
 }
 OC_FILES.fileActions.all.download=function(){
     window.location=WEBROOT+'/files/get_file.php?dir='+this.dir+'&files='+this.file;
 }
+OC_FILES.fileActions.all['default']=OC_FILES.fileActions.all.download;
 
-OC_FILES.showactions=function(file,hide){
-    node=document.getElementById(file);
-    if(node.actionsshown || hide){
-        if(node.actionsdiv){
-            node.removeChild(node.actionsdiv);
-        }
-        node.actionsdiv=null;
-        node.actionsshown=false
-    }else{
-//         OC_FILES.hideallactions();
-        node.actionsshown=true
-        div=document.createElement('div');
-        node.actionsdiv=div;
-        div.className='fileactionlist';
-        table=document.createElement('table');
-        div.appendChild(table);
-        tbody=document.createElement('tbody');
-        table.appendChild(tbody);
-        actions=OC_FILES.files[file].actions;
-        for(name in actions){
-            if(actions[name].call){
-                tr=document.createElement('tr');
-                tbody.appendChild(tr);
-                td=document.createElement('td');
-                tr.appendChild(td);
-                a=document.createElement('a');
-                td.appendChild(a);
-                a.appendChild(document.createTextNode(name));
-                td.setAttribute('onclick','OC_FILES.files[\''+file+'\'].actions[\''+name+'\'].call(OC_FILES.files[\''+file+'\'])');
-            }
-        }
-        node.appendChild(div);
-        OC_FILES.hideallenabled=false;
-        setTimeout('OC_FILES.hideallenabled=true',50);
-    }
+OC_FILES.fileActions.dir=new Object()
+
+OC_FILES.fileActions.dir.open=function(){
+    OC_FILES.browser.show(this.dir+'/'+this.file);
 }
+OC_FILES.fileActions.dir['default']=OC_FILES.fileActions.dir.open;
 
-OC_FILES.hideallactions=function(){
-    if(OC_FILES.hideallenabled){
-        for(name in OC_FILES.files){
-            if(OC_FILES.files[name].hideactions){
-                OC_FILES.files[name].hideactions.call(OC_FILES.files[name]);
-            }
-        }
-    }
+OC_FILES.fileActions.jpg=new Object()
+
+OC_FILES.fileActions.jpg.show=function(){
+//     window.open(WEBROOT+'/files/open_file.php?dir='+this.dir+'&file='+this.file);
+	OC_FILES.browser.showImage(this.dir,this.file);
 }
 
-OC_FILES.hideallenabled=true; //used to prevent browsers from hiding actionslists right after they are displayed;
+OC_FILES.fileActions.jpg['default']=OC_FILES.fileActions.jpg.show;
 
-sizeFormat=function(size){
-    var orig=size;
-    var steps=Array('B','KiB','MiB','GiB','TiB');
-    var step=0;
-    while(size>(1024*2)){
-        step++;
-        size=size/1024;
-    }
-    if(size.toFixed){
-        size=size.toFixed(2);
-    }
-    return ''+size+' '+steps[step];
+OC_FILES.fileActions.jpeg=OC_FILES.fileActions.jpg
+OC_FILES.fileActions.png=OC_FILES.fileActions.jpg
+OC_FILES.fileActions.gif=OC_FILES.fileActions.jpg
+OC_FILES.fileActions.bmp=OC_FILES.fileActions.jpg
+
+function getStyle(el,styleProp)
+{
+// 	var x = document.getElementById(el);
+	var x=el;
+	if (x.currentStyle){
+		alert(x.currentStyle);
+		var y = x.currentStyle[styleProp];
+	}else if (window.getComputedStyle){
+		var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
+	}
+	return y;
+}
+
+Node.prototype.getStyle=function(styleProp){
+	return getStyle(this,styleProp)
 }
\ No newline at end of file
diff --git a/js/lib_notification.js b/js/lib_notification.js
new file mode 100755
index 0000000000000000000000000000000000000000..7c19a04b58ecf487eee1dcf05d4815c9a0315f20
--- /dev/null
+++ b/js/lib_notification.js
@@ -0,0 +1,48 @@
+/**
+ * StarLight - A client side webpage framework
+ *
+ * @package StarLight
+ * @author Icewind <icewind (at) derideal (dot) com>
+ * @copyright 2009
+ * @license http://www.gnu.org/licenses/gpl.html GNU Public License
+ * @url http://blacklight.metalwarp.com/starlight
+ * @version 0.1
+ */
+
+OCNotification=function(text,time){
+	this.text=text;
+	this.time=(time)?time:0;
+	this.notify();
+}
+
+OCNotification.prototype={
+	notify:function(){
+		this.holder=document.getElementById('OCNotificationHolder');
+		if (!this.holder){
+			this.holder=document.createElement('div');
+			this.holder.className='OCNotificationHolder';
+			this.holder.setAttribute('class','OCNotificationHolder');
+			this.holder.setAttribute('id','OCNotificationHolder');
+			document.getElementsByTagName('body').item(0).appendChild(this.holder);
+		}
+		this.notification=document.createElement('div');
+		this.notification.className='OCNotification';
+		this.notification.setAttribute('class','OCNotification');
+		if (document.documentElement.innerHTML){
+			this.notification.innerHTML=this.text;
+		}else{
+			var text=document.createTextNode(this.text);
+			this.notification.appendChild(text);
+		}
+		this.holder.insertBefore(this.notification,this.holder.firstChild);
+		this.notification.addEvent('onclick',new callBack(this.removeNotification,this));
+		if (this.time>0){
+			this.timer = new OCTimer(this.removeNotification, this.time,false,this);
+		}
+	},
+	removeNotification:function(){
+        if(this.notification){
+            this.holder.removeChild(this.notification);
+        }
+	}
+}
\ No newline at end of file
diff --git a/js/lib_timer.js b/js/lib_timer.js
new file mode 100755
index 0000000000000000000000000000000000000000..aadea90ba27ebb37ac1314968fa436032a1fcbb7
--- /dev/null
+++ b/js/lib_timer.js
@@ -0,0 +1,52 @@
+/**
+ * StarLight - A client side webpage framework
+ *
+ * @package StarLight
+ * @author Icewind <icewind (at) derideal (dot) com>
+ * @copyright 2009
+ * @license http://www.gnu.org/licenses/gpl.html GNU Public License
+ * @url http://blacklight.metalwarp.com/starlight
+ * @version 0.1
+ */
+OCTimer=function(callback,time,repeat,object){
+	this.object=(object)?object:false;
+	this.repeat=(!(repeat===undefined))?repeat:true;
+	this.callback=callback;
+	this.time=time;
+	this.timer=0;
+	this.number=OCTimer.count;
+	OCTimer.count++;
+	OCTimer.timers[this.number]=this;
+	if(this.time){
+		this.start();
+	}
+}
+
+OCTimer.count=0;
+OCTimer.timers=Array();
+
+OCTimer.prototype={
+	start:function(){
+		this.running=true;
+		eval('var func=function(){OCTimer.timers['+this.number+'].run();};');
+		if(this.repeat){
+			this.timer = setInterval(func, this.time);
+		}else{
+			this.timer = setTimeout(func, this.time);
+		}
+	},
+	run:function(){
+		if (!this.repeat){
+			this.stop();
+		}
+		if (this.object){
+			this.callback.call(this.object);
+		}else{
+			this.callback.call();
+		}
+	},
+	stop:function(){
+		clearInterval(this.timer);
+		this.running=false;
+	}
+}
\ No newline at end of file