Merged changes in main branch up to v.2.1.2
[fa-stable.git] / js / inserts.js
index a639b2cc3ed623b6f968b856a4a97bc87a42b16d..dd78a9f607be68de748e56c8bfde841f26093e8a 100644 (file)
-//ajax transfer progress indicator
-var starttabs = new Array();
-var autoload = new Array();
-var onload_script = ""
-var loadstatustext="<img src='js/images/progressbar1.gif' /> Requesting content..."
-var loadedobjects=""
-
-function Querystring(qs) { // optionally pass a querystring to parse
-       this.params = new Object() 
-       this.get=Querystring_get
-       this.set=Querystring_set
-       this.href=window.location.pathname 
-       this.url=Querystring_url
-       
-       if (qs == null)
-               qs=location.search.substring(1,location.search.length)
-
-       if (qs.length == 0) return
-
-// Turn <plus> back to <space>
-// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
-       qs = qs.replace(/\+/g, ' ')
-       var args = qs.split('&') // parse out name/value pairs separated via &
-       
-// split out each name=value pair
-       for (var i=0;i<args.length;i++) {
-               var value;
-               var pair = args[i].split('=')
-               var name = unescape(pair[0])
-
-               if (pair.length == 2)
-                       value = unescape(pair[1])
-               else
-                       value = name
-               
-               this.params[name] = value
-       }
-       
-       this.page = this.params.page
-       delete this.params.page
-}
-
-function Querystring_get(key, default_) {
-       // This silly looking line changes UNDEFINED to NULL
-       if (default_ == null) default_ = null;
-       
-       var value=this.params[key]
-       if (value==null) value=default_;
-       
-       return value
-}
-
-function Querystring_set(key, value) {
-       this.params[key] = value;
-}
-
-function Querystring_url() {
- var url = this.href + '?page='+ this.page
- for( key in this.params) {
-       url += '&'+ key + '='+ this.params[key]
- }
- return url
-}
+/**********************************************************************
+    Copyright (C) FrontAccounting, LLC.
+       Released under the terms of the GNU General Public License, GPL, 
+       as published by the Free Software Foundation, either version 3 
+       of the License, or (at your option) any later version.
+    This program 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 License here <http://www.gnu.org/licenses/gpl-3.0.html>.
+***********************************************************************/
+var _focus;
+var _hotkeys = {
+       'alt': false,   // whether is the Alt key pressed
+       'focus': -1             // currently selected indeks of document.links
+};
+var _validate = {}; // validation functions
 
 function debug(msg) {
-//alert(msg)
-document.getElementById('debug').innerHTML=msg
-}
-
-function       ajaxloader(url,vars,div) {
-               var container = document.getElementById(div)
-               var callback=function(response,headers,context) {
-                container.innerHTML=response;
-                Behaviour.apply();
-               }
- debug(url)
-               container.innerHTML=loadstatustext
-               ajaxCaller.postForPlainText(url,vars,callback)
+    box = document.getElementById('msgbox')
+       box.innerHTML= box.innerHTML+'<br>'+msg
 }
 
-function loadobjs(revattribute){
-if (revattribute!=null && revattribute!=""){ //if "rev" attribute is defined (load external .js or .css files)
-var objectlist=revattribute.split(/\s*,\s*/) //split the files and store as array
-for (var i=0; i<objectlist.length; i++){
-var file=objectlist[i]
-var fileref=""
-if (loadedobjects.indexOf(file)==-1){ //Check to see if this object has not already been added to page before proceeding
-if (file.indexOf(".js")!=-1){ //If object is a js file
-fileref=document.createElement('script')
-fileref.setAttribute("type","text/javascript");
-fileref.setAttribute("src", file);
-}
-else if (file.indexOf(".css")!=-1){ //If object is a css file
-fileref=document.createElement("link")
-fileref.setAttribute("rel", "stylesheet");
-fileref.setAttribute("type", "text/css");
-fileref.setAttribute("href", file);
-}
-}
-if (fileref!=""){
-document.getElementsByTagName("head").item(0).appendChild(fileref)
-loadedobjects+=file+" " //Remember this object as being already added to page
-}
-}
-}
+function save_focus(e) {
+  _focus = e.name||e.id;
+  var h = document.getElementById('hints');
+  if (h) {
+       h.style.display = e.title && e.title.length ? 'inline' : 'none';
+       h.innerHTML = e.title ? e.title : '';
+  }
 }
 
 function _expand(tabobj) {
-var alltabs=tabobj.parentNode.parentNode.getElementsByTagName("a")
 
-if (tabobj.getAttribute("rel")){
-for (var i=0; i<alltabs.length; i++){
-alltabs[i].className= "other"  //deselect all tabs
-}
-tabobj.className="current"
-ajaxloader(tabobj.getAttribute("href"), {}, tabobj.getAttribute("rel"))
-//loadobjs(tabobj.getAttribute("rev"))
-}
-}
+  var ul = tabobj.parentNode.parentNode;
+  var alltabs=ul.getElementsByTagName("input");
+  var frm = tabobj.form;
 
-function expandtab(tabcontentid, tabnumber){ //interface for selecting a tab (plus expand corresponding content)
-var alltabs=document.getElementById(tabcontentid).getElementsByTagName("a")
-var thetab=alltabs[tabnumber]
-//debug(tabcontentid+' '+tabnumber)
-if (thetab.getAttribute("rel")){
- for (var i=0; i<alltabs.length; i++){
-alltabs[i].className= i==tabnumber?"current":"other"  //deselect all tabs
+  if (ul.getAttribute("rel")){
+       for (var i=0; i<alltabs.length; i++){
+         alltabs[i].className = "ajaxbutton"  //deselect all tabs
+       }
+       tabobj.className = "current";
+       JsHttpRequest.request(tabobj)
+  }
 }
-ajaxloader(thetab.getAttribute("href"), {}, thetab.getAttribute("rel"))
-loadobjs(thetab.getAttribute("rev"))
 
-}
+//interface for selecting a tab (plus expand corresponding content)
+function expandtab(tabcontentid, tabnumber) {
+  var tabs = document.getElementById(tabcontentid);
+ _expand(tabs.getElementsByTagName("input")[tabnumber]);
 }
 
-//---------------------
-function _setlink(element){
-if (element.getAttribute("rel")){
-var modifiedurl=element.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
-modifiedurl +="&ajax="+element.getAttribute('id');
-//debug(modifiedurl)
-element.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
-element.onclick=function(){
-ajaxloader(this.getAttribute("href"), {}, this.getAttribute("rel"))
-loadobjs(this.getAttribute("rev"))
-return false
-}
-}
+function _set_combo_input(e) {
+               e.setAttribute('_last', e.value);
+               e.onblur=function() { 
+                 var but_name = this.name.substring(0, this.name.length-4)+'button';
+                 var button = document.getElementsByName(but_name)[0];
+                 var select = document.getElementsByName(this.getAttribute('rel'))[0];
+                 save_focus(select);
+// submit request if there is submit_on_change option set and 
+// search field has changed.
+                 if (button && (this.value != this.getAttribute('_last'))) {
+                       JsHttpRequest.request(button);
+                 } else if(this.className=='combo2') {
+                               this.style.display = 'none';
+                               select.style.display = 'inline';
+                               setFocus(select);
+                 }
+                 return false;
+               };
+               e.onkeyup = function(ev) {
+                       var select = document.getElementsByName(this.getAttribute('rel'))[0];
+                       if(select && select.selectedIndex>=0) {
+                         var len = select.length;
+                         var byid = this.className=='combo';
+                         var ac = this.value.toUpperCase();
+                         select.options[select.selectedIndex].selected = false;
+                         for (i = 0; i < len; i++) {
+                               var txt = byid ? select.options[i].value : select.options[i].text;
+                               if (txt.toUpperCase().indexOf(ac) >= 0) {
+                                 select.options[i].selected = true;
+                                 break;
+                               }
+                         }
+                       }
+               };
+       e.onkeydown = function(ev) { 
+                       ev = ev||window.event;
+                       key = ev.keyCode||ev.which;
+                       if(key == 13) {
+                         this.blur();
+                         return false;
+                       }
+               }
 }
 
-function _settabs(tab) {
-var ulist=tab.getElementsByTagName("li") //array containing the LI elements within UL
-for (var x=0; x<ulist.length; x++){ //loop through each LI element
-var ulistlink=ulist[x].getElementsByTagName("a")[0]
-//if (ulistlink.getAttribute("rel"))
-if(ulistlink.onclick==undefined)         {
-var modifiedurl=ulistlink.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
-modifiedurl += "&ajax="+ulistlink.getAttribute('id');
-ulistlink.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
-
-ulistlink.onclick=function(){
-_expand(this);
-return false
-}
-if (ulistlink.className=="current"){
-starttabs.push(ulistlink)
-}
-}
-}
+function _update_box(s) {
+       var byid = s.className=='combo';
+       var rel = s.getAttribute('rel');
+       var box = document.getElementsByName(rel)[0];
+               if(box && s.selectedIndex>=0) {
+                         var opt = s.options[s.selectedIndex];
+                               if(box) {
+                                 box.value = byid ? opt.value : opt.text;
+                                 box.setAttribute('_last', box.value);
+                               }
+               }
 }
 
-function _TableRowSelector(table,row) {
-                var sels = table.getAttribute('selector').split(',') // tablica selektorów
-                var cols = table.getElementsByTagName('th') //identyfikatory kolumn
-                var colvals = row.getElementsByTagName("td")
-                selector =''
-                for(s=0; s<sels.length; s++) {
-                               selector += '&' + sels[s] + '='
-                 for(c=0; c<cols.length; c++) {
-                        if(cols[c].getAttribute('id')==sels[s]) {
-                               selector += colvals[c].innerHTML
-                               break;          
-                  }
+function _set_combo_select(e) {
+               // When combo position is changed via js (eg from searchbox)
+               // no onchange event is generated. To ensure proper change 
+               // signaling we must track selectedIndex in onblur handler.
+               e.setAttribute('_last', e.selectedIndex);
+               e.onblur = function() {
+                       if(this.className=='combo')
+                           _update_box(this);
+                       if (this.selectedIndex != this.getAttribute('_last'))
+                               this.onchange();
+               }
+               e.onchange = function() {
+                       var s = this;
+                       this.setAttribute('_last', this.selectedIndex);                 
+                       if(s.className=='combo')
+                           _update_box(s);
+                       if(s.selectedIndex>=0) {
+                                var sname = '_'+s.name+'_update';
+                                var update = document.getElementsByName(sname)[0];
+                                if(update) {
+                                           JsHttpRequest.request(update);
+                               } 
                        }
-                }
-                return selector;
-}
+                       return true;
+               }
+               e.onkeydown = function(event) {
+                   event = event||window.event;
+                   key = event.keyCode||event.which;
+                   var box = document.getElementsByName(this.getAttribute('rel'))[0];
+                   if (box && key == 32 && this.className == 'combo2') {
+                           this.style.display = 'none';
+                           box.style.display = 'inline';
+                               box.value='';
+                               setFocus(box);
+                           return false;
+                        }
+                       if (this.getAttribute('aspect') == 'editable' && key==115) {
+                               // F4: call related database editor - not available in non-js fallback mode
+                               JsHttpRequest.request('_'+this.name+'_editor', this.form);
+                               return false; // prevent default binding
+                               // TODO: stopPropagation when needed
+                       }
+               }
+}              
+
 /*
Ajax elements behaviour definitions
Behaviour definitions
 */
 var inserts = {
-       'div.ajax-component': function(element) { // automatic ajax component init
-        if(element.innerHTML=='') {
-               autoload.push(element.id)
-        }
+       'input': function(e) {
+               if(e.onfocus==undefined) {
+                       e.onfocus = function() {
+                           save_focus(this);
+                               if (this.className == 'combo') 
+                                       this.select();
+                       };
+               }
+               if (e.className == 'combo' || e.className == 'combo2') {
+                               _set_combo_input(e);
+               } 
+               else
+               if(e.type == 'text' ) {
+                               e.onkeydown = function(ev) { 
+                                       ev = ev||window.event;
+                                       key = ev.keyCode||ev.which;
+                                       if(key == 13) {
+                                               if(e.className == 'searchbox') e.onblur();
+                                               return false;
+                                       } 
+                                       return true;
+                               }
+                       }
        },
-       
-  'form.ajaxform': function(element) {
-               element.onsubmit=function(){
-                var url=element.action;
-                var div=element.getAttribute("rel")
-                var submit
-                var Query = new Querystring();
-
-//               url.replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
-//              url=window.location
-                 var vars = new Array();
-                       for(i=0; i<element.length; i++) {
-                        vars[element.elements[i].name]=element.elements[i].value;
-                        if(element.elements[i].name=='submit') 
-                               submit=element.elements[i].id // obsolete
+       'input.combo2,input[aspect="fallback"]': 
+       function(e) {
+           // this hides search button for js enabled browsers
+           e.style.display = 'none';
+       },
+       'div.js_only': 
+       function(e) {
+           // this shows divs for js enabled browsers only
+           e.style.display = 'block';
+       },
+//     '.ajaxsubmit,.editbutton,.navibutton': // much slower on IE7
+       'button.ajaxsubmit,input.ajaxsubmit,input.editbutton,button.editbutton,button.navibutton': 
+       function(e) {
+                   e.onclick = function() {
+                           save_focus(e);
+                               if (e.getAttribute('aspect') == 'process')
+                                       JsHttpRequest.request(this, null, 30000);
+                               else
+                                       JsHttpRequest.request(this);
+                               return false;
+                   }
+       },
+       'button': function(e) {
+               if (e.name) {
+                       var func = _validate[e.name];
+                       var old = e.onclick;
+                       if(func) {
+                               if (typeof old != 'function') {
+                                       e.onclick = func;
+                               } else {
+                                       e.onclick = function() {
+                                               if(func()) 
+                                                       { old(); return true;}
+                                               else
+                                                       return false;
+                                       }
+                               }
                        }
-                Query.set('ajax', element.id);
-                Query.set('action', 'update');
-                ajaxloader(Query.url(),vars, div)
-               }
-
-               element.onreset=function(){
-                var url=element.action;
-                var div=element.getAttribute("rel")
-                 url.replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
-                 url = url + "&ajax=" + element.id + "&action=reset";
-//               var vars = new Array();
-//                     for(i=0; i<element.length; i++) {
-//                      vars[element.elements[i].name]=element.elements[i].value;
-//                     }
-                       var vars = {}
-                       ajaxloader(url,vars, div)
                }
-               return false;
-        },
-
-       'a.ajaxlink': function(element) {
-       // if onclick is defined this element is initialized
-                 if(element.onclick==undefined) _setlink(element);
-        },
-
-  'ul.ajaxtabs': function(element) {
-               _settabs(element)
-        },
-
-       'table.ajaxgrid': function(element) {
-               var rows = element.getElementsByTagName('tr')
-               for(i=1;i<rows.length-1; i++) {
-               rows[i].onmouseover=function() {this.className='row2' }
-               rows[i].onmouseout=function() {this.className='row1' }
-               rows[i].ondblclick=function() {
-                var table = this.parentNode.parentNode
-                var url = table.getAttribute('editor')
-                var vars = {}
-                url += '&action=select'
-                url += _TableRowSelector(table,this)
-
-                if( table.getAttribute('editor').indexOf('ajax=')>-1) {
-                       ajaxloader(url,vars, table.getAttribute('rel'))
-                } else { // this is external 'select' handler
-                       window.location = url;
-                }
-
+       },
+    '.amount': function(e) {
+               if(e.onblur==undefined) {
+                 e.onblur = function() {
+                       var dec = this.getAttribute("dec");
+                       price_format(this.name, get_amount(this.name), dec);
+                 };
                }
-        }
        },
-  'table.ajaxgrid th':  function(element) {
-               element.onclick=function(){
-                var table = this.parentNode.parentNode.parentNode
-                var url = table.getAttribute('href')
-                var vars = {}
-                url+='&ajax='+table.id+'&action=sort&id='+ this.id
-// debug(url)
-
-                ajaxloader(url, {}, table.getAttribute("rel"))
-//              loadobjs(this.getAttribute("href"))
-                return false
-        }
+       '.searchbox': // emulated onchange event handling for text inputs
+               function(e) {
+                       e.setAttribute('_last_val', e.value);
+                       e.setAttribute('autocomplete', 'off'); //must be off when calling onblur
+                       e.onblur = function() {
+                               var val = this.getAttribute('_last_val');
+                               if (val != this.value) {
+                                       this.setAttribute('_last_val', this.value);
+                                       JsHttpRequest.request('_'+this.name+'_changed', this.form);
+                               }
+                       }
+               },
+       'select': function(e) {
+               if(e.onfocus==undefined) {
+                       e.onfocus = function() {
+                           save_focus(this);
+                       };
+                 var c = e.className;
+                 if (c == 'combo' || c == 'combo2')
+                       _set_combo_select(e);
+               }
        },
-       'a.ajaxgrid-navi': function(element) {
-  if(element.onclick==undefined)
-        if (element.getAttribute("rel")){
-               var modifiedurl=element.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
-               element.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
-         if( modifiedurl.indexOf('ajax=')>-1) {
-                element.onclick=function(){ // set ajax handler 
-// debug(this.getAttribute("href"))
-                 ajaxloader(this.getAttribute("href"), {}, this.getAttribute("rel"))
-                 loadobjs(this.getAttribute("href"))
-                 return false
-                }
-         }
-        }
+       'textarea,a': function(e) {
+               if(e.onfocus==undefined) {
+                       e.onfocus = function() {
+                           save_focus(this);
+                       };
+                       e.onmouseover = function(e) {
+                       setFocus(this);
+                               return false;
+                       }
+               }
        },
-  'a.ajaxgrid-select':  function(element) {
-        if(element.onclick==undefined) {
-               var modifiedurl=element.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
-               element.setAttribute("href", modifiedurl) //replace URL's root domain with dynamic root domain, for ajax security sake
-               element.onclick=function(){
-                var row = this.parentNode.parentNode
-                var table = row.parentNode.parentNode
-
-                var url = this.getAttribute('href')
-                var vars = {}
-
-                hideddrivetip() 
-
-//              url += '&ajax='+table.id
-                url += _TableRowSelector(table,row)
-//      alert( this.getAttribute('rel'))
-                ajaxloader(url,vars, this.getAttribute('rel'))
-                return false
+       'a.printlink':  function(l) {
+               l.onclick = function() {
+                   save_focus(this);
+                       JsHttpRequest.request(this);
+                       return false;
                }
-         element.tooltip = element.getAttribute('title') // save tooltip
-               element.removeAttribute('title') // native tooltip off
-               element.onmouseover=function() {
-                ddrivetip(this.tooltip)
+       },
+       'a': function(e) { // traverse menu
+               e.onkeydown = function(ev) { 
+                       ev = ev||window.event;
+                       key = ev.keyCode||ev.which;
+                       if(key==37 || key==38 || key==39 || key==40) {
+                                       move_focus(key, e, document.links);
+                                       ev.returnValue = false;
+                                       return false;
+                       }
                }
-         element.onmouseout=function() { 
-                hideddrivetip() 
+       },
+       'ul.ajaxtabs':  function(ul) {
+           var ulist=ul.getElementsByTagName("li");
+           for (var x=0; x<ulist.length; x++){ //loop through each LI e
+               var ulistlink=ulist[x].getElementsByTagName("input")[0];
+               if(ulistlink.onclick==undefined) {
+// ?  var modifiedurl=ulistlink.getAttribute("href").replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
+                   var url = ulistlink.form.action
+                   ulistlink.onclick=function(){
+                       _expand(this);
+                       return false;
+                   }
                }
-        }
+           }
        },
-  '.amount': function(element) {
-               if(element.onblur==undefined) {
-                 var dec = element.getAttribute("dec");
-                 element.onblur = function() {
-                       price_format(this.name, get_amount(this.name), dec);
-                 };
+/*     'tr.editrow': function(e) {
+                       e.onkeydown = function(ev) { 
+                       ev = ev||window.event;
+                       key = ev.keyCode||ev.which;
+                       if(key == 13) {
+                         // Find & click additem/update button
+                         
+                       } else  if(key == 27) {
+                         return false;
+                       }
                }
+
+       },
+*/     '#msgbox': function(e) {
+       // this is to avoid changing div height after ajax update in IE7
+         e.style.display = e.innerHTML.length ? 'block' : 'none';
        }
+/* TODO
+       'a.date_picker':  function(e) {
+           // this un-hides data picker for js enabled browsers
+           e.href = date_picker(this.getAttribute('rel'));
+           e.style.display = '';
+           e.tabindex = -1; // skip in tabbing order
+       }
+*/
 };
-
-Behaviour.register(inserts);
-// open selected tabs on load
-Behaviour.addLoadEvent(function() {
-for(i=0; i<starttabs.length; i++) {
-_expand(starttabs[i]);
-}
+function stopEv(ev) {
+                       ev.returnValue = false;
+                       ev.cancelBubble = true;
+                       if(ev.preventDefault) ev.preventDefault();
+                       return false;
 }
-);
+/*
+       Modified accesskey system. While Alt key is pressed letter keys moves 
+       focus to next marked link. Alt key release activates focused link.
+*/
+function setHotKeys() {
+       document.onkeydown = function(ev) {
+               ev = ev||window.event;
+               key = ev.keyCode||ev.which;
+               if (key == 18 && !ev.ctrlKey) { // start selection, skip Win AltGr
+                       _hotkeys.alt = true;
+                       _hotkeys.focus = -1;
+                       return stopEv(ev);
+               }
+               else if (_hotkeys.alt && ((key>47 && key<58) || (key>64 && key<91))) {
+                       var n = _hotkeys.focus;
+                       var l = document.links;
+                       var cnt = l.length;
+                       key = String.fromCharCode(key);
+                       for (var i=0; i<cnt; i++) { 
+                               n = (n+1)%cnt;
+                               // check also if the link is visible
+                               if (l[n].accessKey==key && l[n].scrollWidth) {
+                                       _hotkeys.focus = n;
+           // The timeout is needed to prevent unpredictable behaviour on IE.
+                                       var tmp = function() {document.links[_hotkeys.focus].focus();};
+                                       setTimeout(tmp, 0);
+                                       break;
+                               }
+                       }
+                       return stopEv(ev);
+               }
+               if((ev.ctrlKey && key == 13) || key == 27) {
+                       _hotkeys.alt = false; // cancel link selection
+                       _hotkeys.focus = -1;
+                       ev.cancelBubble = true;
+                       if(ev.stopPropagation) ev.stopPropagation();
+                       // activate submit/escape form
+                       for(var j=0; j<this.forms.length; j++) {
+                               var form = this.forms[j];
+                               for (var i=0; i<form.elements.length; i++){
+                                       var el = form.elements[i];
+                                       var asp = el.getAttribute('aspect');
+                                       if ((asp=='default' && key==13)||(asp=='cancel' && key==27)) {
+                                               JsHttpRequest.request(el);
+                                               ev.returnValue = false;
+                                               return false;
+                                       }
+                               }
+                       }
+                       ev.returnValue = false;
+                       return false;
+               } 
+               return true;
+       };
+       document.onkeyup = function(ev) {
+               if (_hotkeys.alt==true) {
+                       ev = ev||window.event;
+                       key = ev.keyCode||ev.which;
 
-Behaviour.addLoadEvent(function() {
-for(i=0; i<autoload.length; i++) {
-       var vars = {}
-        var Query = new Querystring();
-        Query.set('ajax', autoload[i]);
-        delete Query.params.action
-//alert(Query.url())
-        ajaxloader(Query.url(), {}, autoload[i]);
-}
+                       if (key == 18) {
+                               _hotkeys.alt = false;
+                               if (_hotkeys.focus>=0) {
+                                       var link = document.links[_hotkeys.focus];
+                                       if(link.onclick) 
+                                               link.onclick();
+                                       else
+                                               if (link.target=='_blank') {
+                                                       window.open(link.href,'','toolbar=no,scrollbar=no,resizable=yes,menubar=no,width=900,height=500');
+                                                       openWindow(link.href,'_blank');
+                                               } else
+                                                       window.location = link.href;
+                               }
+                       return stopEv(ev);
+                       } 
+               }
+               return true;
+       }
 }
-);
+
+Behaviour.register(inserts);
+
+Behaviour.addLoadEvent(setFocus);
+Behaviour.addLoadEvent(setHotKeys);