diff --git a/js/ajax.js b/js/ajax.js
index d924c9b8bc3a4efee54e4d483376fb9922f653aa..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.browser.show(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
index 3460955f2e425a4d06f28acb5e16c29022d66ebb..7bd656987a15e4581edaddfe10a18c563a838ca9 100644
--- a/js/filebrowser.js
+++ b/js/filebrowser.js
@@ -21,8 +21,20 @@
 
 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){
-   dir=(dir)?dir:'';
+   if(!dir){
+      dir='';
+   }
    OC_FILES.dir=dir;
    OC_FILES.getdirectorycontent(dir,OC_FILES.browser.show_callback);
 }
@@ -71,14 +83,14 @@ OC_FILES.browser.show_callback=function(content){
        a.addEvent('onclick',OC_FILES.browser.show);
        a.appendChild(document.createTextNode('Home'));
        var currentdir='';
-       for(index in dirs) {
+       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.setAttribute('onclick','OC_FILES.browser.show("'+currentdir+'")');
+             a.addEvent('onclick',OC_FILES.browser.show,currentdir);
              img=document.createElement('img');
              a.appendChild(img);
              img.src=WEBROOT+'/img/arrow.png';
@@ -151,26 +163,28 @@ OC_FILES.browser.show_callback=function(content){
              td.setAttribute('id',file['name']);
              a=document.createElement('a');
              td.appendChild(a);
-             a.appendChild(document.createTextNode(file['name']))
+             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'){
-                a.addEvent('onclick',OC_FILES.browser.show,[dir+'/'+file['name']]);
                 td.setAttribute('colspan',2);
                 a.setAttribute('href','#'+dir+'/'+file['name']);
              }else{
-                a.setAttribute('href',WEBROOT+'/?dir=/'+dir+'&file='+file['name']);
+                a.setAttribute('href','#');
                 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');
+             var 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.browser.showactions(\''+file['name']+'\')')
+             var name=file['name'];
+             img.addEvent('onclick',OC_FILES.browser.showactions,name);
              td=document.createElement('td');
              tr.appendChild(td);
              td.className='sizetext';
@@ -284,9 +298,10 @@ OC_FILES.browser.showactions=function(file,hide){
         div.appendChild(table);
         tbody=document.createElement('tbody');
         table.appendChild(tbody);
-        actions=OC_FILES.files[file].actions;
+        var file=OC_FILES.files[file]
+        var actions=file.actions;
         for(name in actions){
-            if(actions[name].call){
+            if(actions[name].call && name!='default'){
                 tr=document.createElement('tr');
                 tbody.appendChild(tr);
                 td=document.createElement('td');
@@ -294,7 +309,8 @@ OC_FILES.browser.showactions=function(file,hide){
                 a=document.createElement('a');
                 td.appendChild(a);
                 a.appendChild(document.createTextNode(name));
-                td.addEvent('onclick',new callBack(OC_FILES.files[file].actions[name],OC_FILES.files[file]));
+                var action=actions[name];
+                td.addEvent('onclick',new callBack(action,file));
             }
         }
         node.appendChild(div);
diff --git a/js/lib_ajax.js b/js/lib_ajax.js
index 591058976b867d7bf760116d2a7b0aef35c61e75..319875d40e72fb0e03690d481b199bfbcc3bae88 100644
--- a/js/lib_ajax.js
+++ b/js/lib_ajax.js
@@ -42,25 +42,74 @@ callBack.prototype=function(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
    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
-   return 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
index 9d5df93e2a1882f0d41f828be55c9440f69fed0c..f8482402d09464bb0f129b174687cea6578bca10 100755
--- a/js/lib_event.js
+++ b/js/lib_event.js
@@ -12,90 +12,38 @@ usage:    document.events.add(node,type,function,arguments);
    or:    node.addEvent(type,function,arguments);
 */
 
-eventHandler=function(){
-	this.holders=Array();
-}
+document.events=new Object;
+document.events.functions=Array();
+document.events.args=Array();
 
-eventHandler.prototype={
-	add:function(element,type,func,arguments){
-		var holder=this.getHolderByElement(element);
-		holder.addListner(type,func,arguments);
-	},
-	getHolderByElement:function(element){
-		var holder=false;
-		for (var i=0;i<this.holders.length;i++){
-			if (this.holders[i].getElement()==element){
-				var holder=this.holders[i];
-			}
+document.events.add=function(element,type,func,args){
+	if(args){
+		if(typeof args!='object' && typeof args!='Object'){
+			args=[args];
 		}
-		if (!holder){
-			var holder=new eventHolder(element);
-			this.holders[this.holders.length]=holder;
-		}
-		return holder;
-	},
-	trigger:function(element,type,event){
-		var holder=eventHandler.getHolderByElement(element);
-		return holder.trigerEvent.call(holder,type,event);
 	}
-}
-
-eventHolder=function(element){
-	this.element=element;
-	this.listners=Array();
-}
-
-eventHolder.prototype={
-	addListner:function(type,func,arguments){
-		if (type && this.element){
-			if (!this.listners[type]){
-				this.listners[type]=Array();
-				eval("callback=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}");
-				if (this.element.tagName){//do we have a element (not an named event)
-					var holder=this;
-					//IE doesn't let you set the onload event the regulair way
-					if (type=="onload" && this.element.addEventListener && window.ActiveXObject){
-						this.element.addEventListener(type, callback, false);
-					}else if (type=="onload" && this.element.attachEvent && window.ActiveXObject){
-						this.element.attachEvent(type, callback);
-					}else{
-						eval("this.element."+type+"=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}");
-					}
-				}else{
-					eval("this.element."+type+"=function(event){return holder.trigerEvent.call(holder,'"+type+"',event)}");
-				}
-			}
-			var i=this.listners[type].length
-			this.listners[type][i]=func;
-			this.listners[type][i].applyArguments=arguments;
-		}else{
-			var i=this.listners.length
-			this.listners[i]=func;
-			this.listners[type][i].applyArguments=arguments;
-		}
-	},
-	trigerEvent:function(type,event){
-		if (type && this.element && this.listners[type]){
-			for (var i=0;i<this.listners[type].length;i++){
-                   if(this.listners[type][i].applyArguments){
-                       return this.listners[type][i].apply(this,this.listners[type][i].applyArguments)
-                   }else{
-                       return this.listners[type][i].call();
-                   }
+	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{
-			for (var i=0;i<this.listners.length;i++){
-                return this.listners[i](event);
-			}
+			element.attachEvent(type,callback);
 		}
-	},
-	getElement:function(){
-		return this.element;
 	}
 }
 
-document.events=new eventHandler();
-
 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 8f3b9ab0c99dd8e77ebd51b7b400313e406ea39b..4851272593d160afe3312ffb3098a1d741b82534 100644
--- a/js/lib_files.js
+++ b/js/lib_files.js
@@ -58,7 +58,7 @@ OC_FILES.getdirectorycontent=function(dir,callback){
 OC_FILES.dir='';
 
 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){
@@ -181,6 +181,13 @@ OC_FILES.file=function(dir,file,type){
             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];
+			}
+		}
+	}
 }
 
 OC_FILES.file.prototype.showactions=function(){
@@ -204,6 +211,14 @@ OC_FILES.fileActions.all.rename=function(){
 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.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.fileActions.jpg=new Object()