Correcting references in the OPAC to files in intranet-tmpl (Bug 3574).
authorOwen Leonard <oleonard@myacpl.org>
Tue, 29 Sep 2009 14:44:17 +0000 (09:44 -0500)
committerGalen Charlton <gmcharlt@gmail.com>
Tue, 29 Sep 2009 23:20:11 +0000 (19:20 -0400)
Adds greybox library to OPAC files, corrects reference to icons in intranet-tmpl.

Signed-off-by: Galen Charlton <gmcharlt@gmail.com>
53 files changed:
koha-tmpl/opac-tmpl/prog/en/lib/greybox/AJS.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/AJS_fx.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5.zip [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/LGPL.txt [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/about.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/adobe_images/nav_buttons.psd [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/advance_usage.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/combiner.py [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compressing_greybox.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compression_lib/AJS_minify.py [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compression_lib/__init__.py [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/examples.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/auto_deco.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/AJS.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/AJS_fx.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/base.css [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/base.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/indicator.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/loader_frame.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/g_close.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/gallery.css [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/gallery.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/next.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/prev.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/set.css [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/set.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/header_bg.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/w_close.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/window.css [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/window.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/installation.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/normal_usage.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/help.css [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/help.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/logo.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley.jpg [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.jpg [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt.jpg [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt_thumb.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/g_close.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/gb_scripts.js [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/gb_styles.css [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/header_bg.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/indicator.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/loader_frame.html [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/next.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/prev.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/lib/greybox/w_close.gif [new file with mode: 0644]
koha-tmpl/opac-tmpl/prog/en/modules/opac-ISBDdetail.tmpl
koha-tmpl/opac-tmpl/prog/en/modules/opac-MARCdetail.tmpl
koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
koha-tmpl/opac-tmpl/prog/en/modules/opac-reserve.tmpl

diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/AJS.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/AJS.js
new file mode 100644 (file)
index 0000000..2e48c2d
--- /dev/null
@@ -0,0 +1,525 @@
+AJS={BASE_URL:"",drag_obj:null,drag_elm:null,_drop_zones:[],_cur_pos:null,join:function(_1,_2){
+try{
+return _2.join(_1);
+}
+catch(e){
+var r=_2[0]||"";
+AJS.map(_2,function(_4){
+r+=_1+_4;
+},1);
+return r+"";
+}
+},getScrollTop:function(){
+var t;
+if(document.documentElement&&document.documentElement.scrollTop){
+t=document.documentElement.scrollTop;
+}else{
+if(document.body){
+t=document.body.scrollTop;
+}
+}
+return t;
+},addClass:function(){
+var _6=AJS.forceArray(arguments);
+var _7=_6.pop();
+var _8=function(o){
+if(!new RegExp("(^|\\s)"+_7+"(\\s|$)").test(o.className)){
+o.className+=(o.className?" ":"")+_7;
+}
+};
+AJS.map(_6,function(_a){
+_8(_a);
+});
+},setStyle:function(){
+var _b=AJS.forceArray(arguments);
+var _c=_b.pop();
+var _d=_b.pop();
+AJS.map(_b,function(_e){
+_e.style[_d]=AJS.getCssDim(_c);
+});
+},_getRealScope:function(fn,_10,_11,_12){
+var _13=window;
+_10=AJS.$A(_10);
+if(fn._cscope){
+_13=fn._cscope;
+}
+return function(){
+var _14=[];
+var i=0;
+if(_11){
+i=1;
+}
+AJS.map(arguments,function(arg){
+_14.push(arg);
+},i);
+_14=_14.concat(_10);
+if(_12){
+_14=_14.reverse();
+}
+return fn.apply(_13,_14);
+};
+},preloadImages:function(){
+AJS.AEV(window,"load",AJS.$p(function(_17){
+AJS.map(_17,function(src){
+var pic=new Image();
+pic.src=src;
+});
+},arguments));
+},_createDomShortcuts:function(){
+var _1a=["ul","li","td","tr","th","tbody","table","input","span","b","a","div","img","button","h1","h2","h3","br","textarea","form","p","select","option","iframe","script","center","dl","dt","dd","small","pre"];
+var _1b=function(elm){
+var _1d="return AJS.createDOM.apply(null, ['"+elm+"', arguments]);";
+var _1e="function() { "+_1d+"    }";
+eval("AJS."+elm.toUpperCase()+"="+_1e);
+};
+AJS.map(_1a,_1b);
+AJS.TN=function(_1f){
+return document.createTextNode(_1f);
+};
+},documentInsert:function(elm){
+if(typeof (elm)=="string"){
+elm=AJS.HTML2DOM(elm);
+}
+document.write("<span id=\"dummy_holder\"></span>");
+AJS.swapDOM(AJS.$("dummy_holder"),elm);
+},getWindowSize:function(doc){
+doc=doc||document;
+var _22,_23;
+if(self.innerHeight){
+_22=self.innerWidth;
+_23=self.innerHeight;
+}else{
+if(doc.documentElement&&doc.documentElement.clientHeight){
+_22=doc.documentElement.clientWidth;
+_23=doc.documentElement.clientHeight;
+}else{
+if(doc.body){
+_22=doc.body.clientWidth;
+_23=doc.body.clientHeight;
+}
+}
+}
+return {"w":_22,"h":_23};
+},flattenList:function(_24){
+var r=[];
+var _26=function(r,l){
+AJS.map(l,function(o){
+if(o==null){
+}else{
+if(AJS.isArray(o)){
+_26(r,o);
+}else{
+r.push(o);
+}
+}
+});
+};
+_26(r,_24);
+return r;
+},setEventKey:function(e){
+e.key=e.keyCode?e.keyCode:e.charCode;
+if(window.event){
+e.ctrl=window.event.ctrlKey;
+e.shift=window.event.shiftKey;
+}else{
+e.ctrl=e.ctrlKey;
+e.shift=e.shiftKey;
+}
+switch(e.key){
+case 63232:
+e.key=38;
+break;
+case 63233:
+e.key=40;
+break;
+case 63235:
+e.key=39;
+break;
+case 63234:
+e.key=37;
+break;
+}
+},removeElement:function(){
+var _2b=AJS.forceArray(arguments);
+AJS.map(_2b,function(elm){
+AJS.swapDOM(elm,null);
+});
+},_unloadListeners:function(){
+if(AJS.listeners){
+AJS.map(AJS.listeners,function(elm,_2e,fn){
+AJS.REV(elm,_2e,fn);
+});
+}
+AJS.listeners=[];
+},partial:function(fn){
+var _31=AJS.forceArray(arguments);
+return AJS.$b(fn,null,_31.slice(1,_31.length).reverse(),false,true);
+},getIndex:function(elm,_33,_34){
+for(var i=0;i<_33.length;i++){
+if(_34&&_34(_33[i])||elm==_33[i]){
+return i;
+}
+}
+return -1;
+},isDefined:function(o){
+return (o!="undefined"&&o!=null);
+},isArray:function(obj){
+return obj instanceof Array;
+},setLeft:function(){
+var _38=AJS.forceArray(arguments);
+_38.splice(_38.length-1,0,"left");
+AJS.setStyle.apply(null,_38);
+},appendChildNodes:function(elm){
+if(arguments.length>=2){
+AJS.map(arguments,function(n){
+if(AJS.isString(n)){
+n=AJS.TN(n);
+}
+if(AJS.isDefined(n)){
+elm.appendChild(n);
+}
+},1);
+}
+return elm;
+},isOpera:function(){
+return (navigator.userAgent.toLowerCase().indexOf("opera")!=-1);
+},isString:function(obj){
+return (typeof obj=="string");
+},hideElement:function(elm){
+var _3d=AJS.forceArray(arguments);
+AJS.map(_3d,function(elm){
+elm.style.display="none";
+});
+},setOpacity:function(elm,p){
+elm.style.opacity=p;
+elm.style.filter="alpha(opacity="+p*100+")";
+},setHeight:function(){
+var _41=AJS.forceArray(arguments);
+_41.splice(_41.length-1,0,"height");
+AJS.setStyle.apply(null,_41);
+},setWidth:function(){
+var _42=AJS.forceArray(arguments);
+_42.splice(_42.length-1,0,"width");
+AJS.setStyle.apply(null,_42);
+},createArray:function(v){
+if(AJS.isArray(v)&&!AJS.isString(v)){
+return v;
+}else{
+if(!v){
+return [];
+}else{
+return [v];
+}
+}
+},isDict:function(o){
+var _45=String(o);
+return _45.indexOf(" Object")!=-1;
+},isMozilla:function(){
+return (navigator.userAgent.toLowerCase().indexOf("gecko")!=-1&&navigator.productSub>=20030210);
+},_listenOnce:function(elm,_47,fn){
+var _49=function(){
+AJS.removeEventListener(elm,_47,_49);
+fn(arguments);
+};
+return _49;
+},addEventListener:function(elm,_4b,fn,_4d,_4e){
+if(!_4e){
+_4e=false;
+}
+var _4f=AJS.$A(elm);
+AJS.map(_4f,function(_50){
+if(_4d){
+fn=AJS._listenOnce(_50,_4b,fn);
+}
+if(AJS.isIn(_4b,["submit","load","scroll","resize"])){
+var old=elm["on"+_4b];
+elm["on"+_4b]=function(){
+if(old){
+fn(arguments);
+return old(arguments);
+}else{
+return fn(arguments);
+}
+};
+return;
+}
+if(AJS.isIn(_4b,["keypress","keydown","keyup","click"])){
+var _52=fn;
+fn=function(e){
+AJS.setEventKey(e);
+return _52.apply(null,arguments);
+};
+}
+if(_50.attachEvent){
+_50.attachEvent("on"+_4b,fn);
+}else{
+if(_50.addEventListener){
+_50.addEventListener(_4b,fn,_4e);
+}
+}
+AJS.listeners=AJS.$A(AJS.listeners);
+AJS.listeners.push([_50,_4b,fn]);
+});
+},createDOM:function(_54,_55){
+var i=0,_57;
+elm=document.createElement(_54);
+if(AJS.isDict(_55[i])){
+for(k in _55[0]){
+_57=_55[0][k];
+if(k=="style"){
+elm.style.cssText=_57;
+}else{
+if(k=="class"||k=="className"){
+elm.className=_57;
+}else{
+elm.setAttribute(k,_57);
+}
+}
+}
+i++;
+}
+if(_55[0]==null){
+i=1;
+}
+AJS.map(_55,function(n){
+if(n){
+if(AJS.isString(n)||AJS.isNumber(n)){
+n=AJS.TN(n);
+}
+elm.appendChild(n);
+}
+},i);
+return elm;
+},setTop:function(){
+var _59=AJS.forceArray(arguments);
+_59.splice(_59.length-1,0,"top");
+AJS.setStyle.apply(null,_59);
+},getElementsByTagAndClassName:function(_5a,_5b,_5c){
+var _5d=[];
+if(!AJS.isDefined(_5c)){
+_5c=document;
+}
+if(!AJS.isDefined(_5a)){
+_5a="*";
+}
+var els=_5c.getElementsByTagName(_5a);
+var _5f=els.length;
+var _60=new RegExp("(^|\\s)"+_5b+"(\\s|$)");
+for(i=0,j=0;i<_5f;i++){
+if(_60.test(els[i].className)||_5b==null){
+_5d[j]=els[i];
+j++;
+}
+}
+return _5d;
+},removeClass:function(){
+var _61=AJS.forceArray(arguments);
+var cls=_61.pop();
+var _63=function(o){
+o.className=o.className.replace(new RegExp("\\s?"+cls,"g"),"");
+};
+AJS.map(_61,function(elm){
+_63(elm);
+});
+},bindMethods:function(_66){
+for(var k in _66){
+var _68=_66[k];
+if(typeof (_68)=="function"){
+_66[k]=AJS.$b(_68,_66);
+}
+}
+},log:function(o){
+if(AJS.isMozilla()){
+console.log(o);
+}else{
+var div=AJS.DIV({"style":"color: green"});
+AJS.ACN(AJS.getBody(),AJS.setHTML(div,""+o));
+}
+},isNumber:function(obj){
+return (typeof obj=="number");
+},map:function(_6c,fn,_6e,_6f){
+var i=0,l=_6c.length;
+if(_6e){
+i=_6e;
+}
+if(_6f){
+l=_6f;
+}
+for(i;i<l;i++){
+fn.apply(null,[_6c[i],i]);
+}
+},removeEventListener:function(elm,_73,fn,_75){
+if(!_75){
+_75=false;
+}
+if(elm.removeEventListener){
+elm.removeEventListener(_73,fn,_75);
+if(AJS.isOpera()){
+elm.removeEventListener(_73,fn,!_75);
+}
+}else{
+if(elm.detachEvent){
+elm.detachEvent("on"+_73,fn);
+}
+}
+},getCssDim:function(dim){
+if(AJS.isString(dim)){
+return dim;
+}else{
+return dim+"px";
+}
+},setHTML:function(elm,_78){
+elm.innerHTML=_78;
+return elm;
+},bind:function(fn,_7a,_7b,_7c,_7d){
+fn._cscope=_7a;
+return AJS._getRealScope(fn,_7b,_7c,_7d);
+},forceArray:function(_7e){
+var r=[];
+AJS.map(_7e,function(elm){
+r.push(elm);
+});
+return r;
+},update:function(l1,l2){
+for(var i in l2){
+l1[i]=l2[i];
+}
+return l1;
+},getBody:function(){
+return AJS.$bytc("body")[0];
+},HTML2DOM:function(_84,_85){
+var d=AJS.DIV();
+d.innerHTML=_84;
+if(_85){
+return d.childNodes[0];
+}else{
+return d;
+}
+},getElement:function(id){
+if(AJS.isString(id)||AJS.isNumber(id)){
+return document.getElementById(id);
+}else{
+return id;
+}
+},showElement:function(){
+var _88=AJS.forceArray(arguments);
+AJS.map(_88,function(elm){
+elm.style.display="";
+});
+},swapDOM:function(_8a,src){
+_8a=AJS.getElement(_8a);
+var _8c=_8a.parentNode;
+if(src){
+src=AJS.getElement(src);
+_8c.replaceChild(src,_8a);
+}else{
+_8c.removeChild(_8a);
+}
+return src;
+},isIn:function(elm,_8e){
+var i=AJS.getIndex(elm,_8e);
+if(i!=-1){
+return true;
+}else{
+return false;
+}
+}};
+AJS.$=AJS.getElement;
+AJS.$$=AJS.getElements;
+AJS.$f=AJS.getFormElement;
+AJS.$p=AJS.partial;
+AJS.$b=AJS.bind;
+AJS.$A=AJS.createArray;
+AJS.DI=AJS.documentInsert;
+AJS.ACN=AJS.appendChildNodes;
+AJS.RCN=AJS.replaceChildNodes;
+AJS.AEV=AJS.addEventListener;
+AJS.REV=AJS.removeEventListener;
+AJS.$bytc=AJS.getElementsByTagAndClassName;
+AJS.addEventListener(window,"unload",AJS._unloadListeners);
+AJS._createDomShortcuts();
+AJS.Class=function(_90){
+var fn=function(){
+if(arguments[0]!="no_init"){
+return this.init.apply(this,arguments);
+}
+};
+fn.prototype=_90;
+AJS.update(fn,AJS.Class.prototype);
+return fn;
+};
+AJS.Class.prototype={extend:function(_92){
+var _93=new this("no_init");
+for(k in _92){
+var _94=_93[k];
+var cur=_92[k];
+if(_94&&_94!=cur&&typeof cur=="function"){
+cur=this._parentize(cur,_94);
+}
+_93[k]=cur;
+}
+return new AJS.Class(_93);
+},implement:function(_96){
+AJS.update(this.prototype,_96);
+},_parentize:function(cur,_98){
+return function(){
+this.parent=_98;
+return cur.apply(this,arguments);
+};
+}};
+AJS.$=AJS.getElement;
+AJS.$$=AJS.getElements;
+AJS.$f=AJS.getFormElement;
+AJS.$b=AJS.bind;
+AJS.$p=AJS.partial;
+AJS.$FA=AJS.forceArray;
+AJS.$A=AJS.createArray;
+AJS.DI=AJS.documentInsert;
+AJS.ACN=AJS.appendChildNodes;
+AJS.RCN=AJS.replaceChildNodes;
+AJS.AEV=AJS.addEventListener;
+AJS.REV=AJS.removeEventListener;
+AJS.$bytc=AJS.getElementsByTagAndClassName;
+AJSDeferred=function(req){
+this.callbacks=[];
+this.errbacks=[];
+this.req=req;
+};
+AJSDeferred.prototype={excCallbackSeq:function(req,_9b){
+var _9c=req.responseText;
+while(_9b.length>0){
+var fn=_9b.pop();
+var _9e=fn(_9c,req);
+if(_9e){
+_9c=_9e;
+}
+}
+},callback:function(){
+this.excCallbackSeq(this.req,this.callbacks);
+},errback:function(){
+if(this.errbacks.length==0){
+alert("Error encountered:\n"+this.req.responseText);
+}
+this.excCallbackSeq(this.req,this.errbacks);
+},addErrback:function(fn){
+this.errbacks.unshift(fn);
+},addCallback:function(fn){
+this.callbacks.unshift(fn);
+},addCallbacks:function(fn1,fn2){
+this.addCallback(fn1);
+this.addErrback(fn2);
+},sendReq:function(_a3){
+if(AJS.isObject(_a3)){
+this.req.send(AJS.queryArguments(_a3));
+}else{
+if(AJS.isDefined(_a3)){
+this.req.send(_a3);
+}else{
+this.req.send("");
+}
+}
+}};
+script_loaded=true;
+
+
+script_loaded=true;
\ No newline at end of file
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/AJS_fx.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/AJS_fx.js
new file mode 100644 (file)
index 0000000..c97919e
--- /dev/null
@@ -0,0 +1,136 @@
+AJS.fx={_shades:{0:"ffffff",1:"ffffee",2:"ffffdd",3:"ffffcc",4:"ffffbb",5:"ffffaa",6:"ffff99"},highlight:function(_1,_2){
+var _3=new AJS.fx.Base();
+_3.elm=AJS.$(_1);
+_3.setOptions(_2);
+_3.options.duration=600;
+AJS.update(_3,{increase:function(){
+if(this.now==7){
+_1.style.backgroundColor="transparent";
+}else{
+_1.style.backgroundColor="#"+AJS.fx._shades[Math.floor(this.now)];
+}
+}});
+return _3.custom(6,0);
+},fadeIn:function(_4,_5){
+_5=_5||{};
+if(!_5.from){
+_5.from=0;
+AJS.setOpacity(_4,0);
+}
+if(!_5.to){
+_5.to=1;
+}
+var s=new AJS.fx.Style(_4,"opacity",_5);
+return s.custom(_5.from,_5.to);
+},fadeOut:function(_7,_8){
+_8=_8||{};
+if(!_8.from){
+_8.from=1;
+}
+if(!_8.to){
+_8.to=0;
+}
+_8.duration=300;
+var s=new AJS.fx.Style(_7,"opacity",_8);
+return s.custom(_8.from,_8.to);
+},setWidth:function(_a,_b){
+var s=new AJS.fx.Style(_a,"width",_b);
+return s.custom(_b.from,_b.to);
+},setHeight:function(_d,_e){
+var s=new AJS.fx.Style(_d,"height",_e);
+return s.custom(_e.from,_e.to);
+}};
+AJS.fx.Base=new AJS.Class({init:function(){
+AJS.bindMethods(this);
+},setOptions:function(_10){
+this.options=AJS.update({onStart:function(){
+},onComplete:function(){
+},transition:AJS.fx.Transitions.sineInOut,duration:500,wait:true,fps:50},_10||{});
+},step:function(){
+var _11=new Date().getTime();
+if(_11<this.time+this.options.duration){
+this.cTime=_11-this.time;
+this.setNow();
+}else{
+setTimeout(AJS.$b(this.options.onComplete,this,[this.elm]),10);
+this.clearTimer();
+this.now=this.to;
+}
+this.increase();
+},setNow:function(){
+this.now=this.compute(this.from,this.to);
+},compute:function(_12,to){
+var _14=to-_12;
+return this.options.transition(this.cTime,_12,_14,this.options.duration);
+},clearTimer:function(){
+clearInterval(this.timer);
+this.timer=null;
+return this;
+},_start:function(_15,to){
+if(!this.options.wait){
+this.clearTimer();
+}
+if(this.timer){
+return;
+}
+setTimeout(AJS.$p(this.options.onStart,this.elm),10);
+this.from=_15;
+this.to=to;
+this.time=new Date().getTime();
+this.timer=setInterval(this.step,Math.round(1000/this.options.fps));
+return this;
+},custom:function(_17,to){
+return this._start(_17,to);
+},set:function(to){
+this.now=to;
+this.increase();
+return this;
+},setStyle:function(elm,_1b,val){
+if(this.property=="opacity"){
+AJS.setOpacity(elm,val);
+}else{
+AJS.setStyle(elm,_1b,val);
+}
+}});
+AJS.fx.Style=AJS.fx.Base.extend({init:function(elm,_1e,_1f){
+this.parent();
+this.elm=elm;
+this.setOptions(_1f);
+this.property=_1e;
+},increase:function(){
+this.setStyle(this.elm,this.property,this.now);
+}});
+AJS.fx.Styles=AJS.fx.Base.extend({init:function(elm,_21){
+this.parent();
+this.elm=AJS.$(elm);
+this.setOptions(_21);
+this.now={};
+},setNow:function(){
+for(p in this.from){
+this.now[p]=this.compute(this.from[p],this.to[p]);
+}
+},custom:function(obj){
+if(this.timer&&this.options.wait){
+return;
+}
+var _23={};
+var to={};
+for(p in obj){
+_23[p]=obj[p][0];
+to[p]=obj[p][1];
+}
+return this._start(_23,to);
+},increase:function(){
+for(var p in this.now){
+this.setStyle(this.elm,p,this.now[p]);
+}
+}});
+AJS.fx.Transitions={linear:function(t,b,c,d){
+return c*t/d+b;
+},sineInOut:function(t,b,c,d){
+return -c/2*(Math.cos(Math.PI*t/d)-1)+b;
+}};
+script_loaded=true;
+
+
+script_loaded=true;
\ No newline at end of file
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5.zip b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5.zip
new file mode 100644 (file)
index 0000000..02f2982
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5.zip differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/LGPL.txt b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/LGPL.txt
new file mode 100644 (file)
index 0000000..8add30a
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) 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
+    Lesser 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, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/about.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/about.html
new file mode 100644 (file)
index 0000000..6922b4c
--- /dev/null
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+    <title>GreyBox - About</title>
+
+    <script type="text/javascript">
+        var GB_ROOT_DIR = "./greybox/";
+    </script>
+
+    <script type="text/javascript" src="greybox/AJS.js"></script>
+    <script type="text/javascript" src="greybox/AJS_fx.js"></script>
+    <script type="text/javascript" src="greybox/gb_scripts.js"></script>
+    <link href="greybox/gb_styles.css" rel="stylesheet" type="text/css" media="all" />
+
+    <script type="text/javascript" src="static_files/help.js"></script>
+    <link href="static_files/help.css" rel="stylesheet" type="text/css" media="all" />
+</head>
+
+<body>
+
+<script>
+    insertHeader();
+    insertMenu('about');
+</script>
+
+<p>
+GreyBox is copyrighted work by <a href="http://amix.dk/">Amir Salihefendic</a>.
+</p>
+
+<p>
+It is based on <a href="http://orangoo.com/labs/AJS/">AJS</a> JavaScript library.
+</p>
+
+<p>
+It is realesed under <a href="LGPL.txt">LGPL</a>.
+</p>
+
+<h3>Links</h3>
+<ul>
+    <li> <a href="http://orangoo.com/labs/GreyBox/">GreyBox official site</a> </li>
+</ul>
+
+<h3>Need help?</h3>
+<ul>
+    <li><a href="http://groups.google.com/group/greybox">GreyBox Google group</a> - A group where you can ask questions and get answers</li>
+    <li><a href="http://orangoo.com/labs/GreyBox/FAQ/">GreyBox FAQ</a> -Frequently Asked Questions about GreyBox</li>
+</ul>
+
+</body>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/adobe_images/nav_buttons.psd b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/adobe_images/nav_buttons.psd
new file mode 100644 (file)
index 0000000..6a87bbc
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/adobe_images/nav_buttons.psd differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/advance_usage.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/advance_usage.html
new file mode 100644 (file)
index 0000000..fc900cd
--- /dev/null
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+    <title>GreyBox - Advance usage</title>
+
+    <script type="text/javascript">
+        var GB_ROOT_DIR = "./greybox/";
+    </script>
+
+    <script type="text/javascript" src="greybox/AJS.js"></script>
+    <script type="text/javascript" src="greybox/AJS_fx.js"></script>
+    <script type="text/javascript" src="greybox/gb_scripts.js"></script>
+    <link href="greybox/gb_styles.css" rel="stylesheet" type="text/css" media="all" />
+
+    <script type="text/javascript" src="static_files/help.js"></script>
+    <link href="static_files/help.css" rel="stylesheet" type="text/css" media="all" />
+</head>
+<body>
+
+<script>
+insertHeader();
+insertMenu('adv_usage');
+</script>
+
+<h2>Methods for showing windows</h2>
+
+<h3 class="first">GB_show</h3>
+
+<h4>Signature:</h4>
+<script>
+insertCode(
+    'GB_show(caption, url, /*optional*/ height, width, callback_fn)'
+);
+</script>
+
+<h4>Example:</h4>
+<script>
+insertCode(
+    '<a href="http://google.com/" onclick="return GB_show(\'Google\', this.href)">Visit Google</a>'
+);
+</script>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com/" onclick="return GB_show('Google', this.href)">Visit Google</a>
+
+
+<h3>GB_showCenter</h3>
+
+<h4>Signature:</h4>
+<script>
+insertCode(
+    'GB_showCenter(caption, url, /* optional */ height, width, callback_fn)'
+);
+</script>
+
+<h4>Example:</h4>
+<script>
+insertCode(
+    '<a href="http://google.com/" onclick="return GB_showCenter(\'Google\', this.href)">Visit Google</a>'
+);
+</script>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com/" onclick="return GB_showCenter('Google', this.href)">Visit Google</a>
+
+
+<h3>GB_showFullScreen</h3>
+
+<h4>Signature:</h4>
+<script>
+insertCode(
+    'GB_showFullScreen(caption, url, callback_fn)'
+);
+</script>
+
+<h4>Example:</h4>
+<script>
+insertCode(
+    '<a href="http://google.com/" onclick="return GB_showFullScreen(\'Google\', this.href)">Visit Google</a>'
+);
+</script>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com/" onclick="return GB_showFullScreen('Google', this.href)">Visit Google</a>
+
+<h2>Methods for showing overlays</h2>
+
+<h3 class="first">GB_showImage</h3>
+<h4>Signature:</h4>
+<script>
+insertCode(
+    'GB_showImage(caption, url, callback_fn)'
+);
+</script>
+
+<h4>Example:</h4>
+<script>
+insertCode(
+        '<a href="http://static.flickr.com/119/294309231_a3d2a339b9.jpg"\n'+
+        'onclick="return GB_showImage(\'Flower\', this.href)">A flower in my hand</a>'
+);
+</script>
+
+<h4>Example rendered:</h4>
+<a href="http://static.flickr.com/119/294309231_a3d2a339b9.jpg" onclick="return GB_showImage('Flower', this.href)">A flower in my hand</a>
+
+<h3>GB_showPage</h3>
+<h4>Signature:</h4>
+<script>
+insertCode(
+    'GB_showPage(caption, url, callback_fn)'
+);
+</script>
+
+<h4>Example:</h4>
+<script>
+insertCode(
+    '<a href="http://google.com" onclick="return GB_showPage(\'Google\', this.href)">Show Google in another layout</a>'
+);
+</script>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com" onclick="return GB_showPage('Google', this.href)">Show Google in another layout</a>
+
+
+<h2>Methods for showing sets</h2>
+
+<h3 class="first">GB_showFullScreenSet</h3>
+<h4>Signature:</h4>
+<script>
+insertCode(
+    'GB_showFullScreenSet(set, start_index, callback_fn)'
+);
+</script>
+
+<h4>Example:</h4>
+<script>
+insertCode(
+    "<script>",
+    "var page_set = [{'caption': 'Google', 'url': 'http://google.com/'},",
+    "    {'caption': 'Yahoo', 'url': 'http://yahoo.com/'}];",
+    "<\/script>",
+    '<a href="#" onclick="return GB_showFullScreenSet(page_set, 1)">Show first page in page_set</a>'
+);
+</script>
+
+<h4>Example rendered:</h4>
+<script>
+var page_set = [{'caption': 'Google', 'url': 'http://google.com/'},
+    {'caption': 'Yahoo', 'url': 'http://yahoo.com/'}];
+</script>
+<a href="#" onclick="return GB_showFullScreenSet(page_set, 1)">Show first page in page_set</a>
+
+<h3>GB_showImageSet</h3>
+<h4>Signature:</h4>
+<script>
+insertCode(
+    'GB_showImageSet(set, start_index, callback_fn)'
+);
+</script>
+
+<h4>Example:</h4>
+<script>
+insertCode(
+    "<script>",
+    "var image_set = [{'caption': 'Flower', 'url': 'http://static.flickr.com/119/294309231_a3d2a339b9.jpg'},",
+    "    {'caption': 'Nice waterfall', 'url': 'http://www.widerange.org/images/large/plitvicka.jpg'}];",
+    "<\/script>",
+    '<a href="#" onclick="return GB_showImageSet(image_set, 1)">Show first picture in image_set</a>'
+);
+</script>
+
+<h4>Example rendered:</h4>
+<script>
+var image_set = [{'caption': 'Flower', 'url': 'http://static.flickr.com/119/294309231_a3d2a339b9.jpg'},
+    {'caption': 'Nice waterfall', 'url': 'http://www.widerange.org/images/large/plitvicka.jpg'}];
+</script>
+<a href="#" onclick="return GB_showImageSet(image_set, 1)">Show first picture in image_set</a>
+
+
+</body>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/combiner.py b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/combiner.py
new file mode 100644 (file)
index 0000000..8e289ce
--- /dev/null
@@ -0,0 +1,134 @@
+#!/usr/bin/env python
+"""
+Used to combine the different parts of GreyBox.
+- Python 2.4 required
+- Java 1.4+ required
+- Dojo's JavaScript compressor (http://dojotoolkit.org/docs/compressor_system.html). Place it under compression_lib/custom_rhino.jar
+"""
+import os, sys, shutil
+from compression_lib import AJS_minify
+
+
+if __name__ == '__main__':
+    args = sys.argv
+
+    if len(args) < 2:
+        print """
+Usage is:
+    python combiner.py [full|gallery|window]
+Example usage:
+    python combiner.py full
+The files will be store in greybox_dist/* depending on the dist. type
+"""
+        sys.exit(0)
+
+    type = args[1]
+    output_dir = 'greybox'
+
+    ##
+    # Config file list
+    #
+    js = []
+    css = []
+    static = []
+
+    append = lambda l, x: l.append('greybox_source/%s' % x)
+
+    def appendBase():
+        append(js, 'base/base.js')
+        append(js, 'auto_deco.js')
+        append(css, 'base/base.css')
+        append(static, 'base/indicator.gif')
+        append(static, 'base/loader_frame.html')
+
+    def appendSet():
+        append(js, 'set/set.js')
+        append(css, 'set/set.css')
+        append(static, 'set/next.gif')
+        append(static, 'set/prev.gif')
+
+    def appendGallery():
+        append(js, 'gallery/gallery.js')
+        append(css, 'gallery/gallery.css')
+        append(static, 'gallery/g_close.gif')
+
+    def appendWindow():
+        append(js, 'window/window.js')
+        append(css, 'window/window.css')
+        append(static, 'window/header_bg.gif')
+        append(static, 'window/w_close.gif')
+
+    appendBase()
+
+    if type == 'full':
+        appendGallery()
+        appendSet()
+        appendWindow()
+    elif type == 'gallery':
+        appendGallery()
+        appendSet()
+    elif type == 'window':
+        appendWindow()
+    else:
+        sys.exit('Uknown type')
+
+    print 'Follwoing styles are used:'
+    for style in css:
+        print '   %s' % style
+
+    print 'Follwoing JavaScript is used:'
+    for script in js:
+        print '   %s' % script
+
+    ##
+    # Copy the files
+    #
+    try:
+        shutil.rmtree(output_dir)
+    except:
+        pass
+    os.mkdir(output_dir)
+
+    def concatFiles(f_list):
+        data = []
+        for f in f_list:
+            data.append(open(f, 'r').read())
+        return '\n\n'.join(data)
+
+    def copyFiles(f_list):
+        for f in f_list:
+            shutil.copy(f, output_dir)
+
+    copyFiles(static)
+    fp = open('%s/%s' % (output_dir, 'gb_styles.css'), 'w')
+    fp.write(concatFiles(css))
+    fp.close()
+    print 'Compressed styles in %s' % ('greybox/gb_styles.css')
+
+    ##
+    # Concat js
+    #
+    fp = open('%s/%s' % (output_dir, 'gb_scripts_tmp.js'), 'w')
+    fp.write(concatFiles(js))
+    fp.close()
+
+    AJS_minify.AJS_SRC = 'greybox_source/base/AJS.js'
+    AJS_minify.AJS_MINI_SRC = 'greybox/AJS_tmp.js'
+    files = ['greybox/gb_scripts_tmp.js', 'greybox_source/base/AJS_fx.js', 'static_files/help.js']
+    code_analyzer = AJS_minify.ExternalCodeAnalyzer(files)
+    composer = AJS_minify.AjsComposer(code_analyzer.findFunctions())
+    composer.writeToOutput()
+
+    os.popen('java -jar compression_lib/custom_rhino.jar -c greybox/AJS_tmp.js > greybox/AJS.js')
+    os.remove('greybox/AJS_tmp.js')
+    os.popen('java -jar compression_lib/custom_rhino.jar -c greybox_source/base/AJS_fx.js > greybox/AJS_fx.js')
+    print 'Compressed AJS.js and AJS.js into greybox/'
+
+    os.popen('java -jar compression_lib/custom_rhino.jar -c greybox/gb_scripts_tmp.js > greybox/gb_scripts.js')
+    os.remove('greybox/gb_scripts_tmp.js')
+    print 'Compressed JavaScript in %s' % ('greybox/gb_scripts.css')
+
+    #Append script_loaded
+    open('greybox/AJS.js', 'a').write('\nscript_loaded=true;')
+    open('greybox/AJS_fx.js', 'a').write('\nscript_loaded=true;')
+    open('greybox/gb_scripts.js', 'a').write('\nscript_loaded=true;')
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compressing_greybox.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compressing_greybox.html
new file mode 100644 (file)
index 0000000..de0ff4e
--- /dev/null
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+    <title>GreyBox - Compressing GreyBox</title>
+
+    <script type="text/javascript">
+        var GB_ROOT_DIR = "./greybox/";
+    </script>
+
+    <script type="text/javascript" src="greybox/AJS.js"></script>
+    <script type="text/javascript" src="greybox/AJS_fx.js"></script>
+    <script type="text/javascript" src="greybox/gb_scripts.js"></script>
+    <link href="greybox/gb_styles.css" rel="stylesheet" type="text/css" media="all" />
+
+    <script type="text/javascript" src="static_files/help.js"></script>
+    <link href="static_files/help.css" rel="stylesheet" type="text/css" media="all" />
+</head>
+<body>
+
+<script>
+insertHeader();
+insertMenu('cmpr');
+</script>
+
+<h2>Code structure</h2>
+<ul>
+    <li><b>greybox:</b> Generated and compressed JavaScript and CSS is located here</li>
+    <li><b>greybox_source:</b> CSS and JavaScript structured in directories.</li>
+</ul>
+It's not recommend that you alter code in the <b>greybox</b> directory, since it's computer generated and very unreadable!
+
+
+<h2>Download Dojo ShrinkSafe</h2>
+To make the filesize as small as possible GreyBox JavaScript is compressed down using <a href="http://alex.dojotoolkit.org/shrinksafe/">Dojo ShrinkSafe</a>. This library requires <a href="http://www.java.com/getjava/">Java</a>, so make sure you got Java installed. Download following JAR file:
+<ul>
+    <li><a href="http://svn.dojotoolkit.org/dojo/trunk/buildscripts/lib/custom_rhino.jar">custom_rhino.jar</a></li>
+</ul>
+Place <b>custom_rhino.jar</b> in GreyBox's <b>compression_lib</b> directory.
+
+
+<h2>Compressing GreyBox</h2>
+Now, you are ready to compress GreyBox. This is done by running a Python script called <b>combiner.py</b>. I.e. you need to download and install <a href="http://www.python.org/download/">Pyhton</a>. 
+
+<p>
+You can run <b>combiner.py</b> in following ways:
+</p>
+
+<ul>
+    <li><b>python combiner.py full:</b> Compress everything</li>
+    <li><b>python combiner.py gallery:</b> Compress only gallery related CSS and JavaScript</li>
+    <li><b>python combiner.py window:</b> Compress only window related CSS and JavaScript</li>
+</ul>
+
+</body>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compression_lib/AJS_minify.py b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compression_lib/AJS_minify.py
new file mode 100644 (file)
index 0000000..cd35244
--- /dev/null
@@ -0,0 +1,255 @@
+#!/usr/bin/env python
+#Last-update: 08/05/07 12:39:17
+import re
+import sys
+from sets import Set
+
+##
+# External files
+#
+AJS_SRC = 'AJS.js'
+AJS_MINI_SRC = 'AJS_compressed.js'
+
+
+##
+# Standard stuff that may change in the future
+#
+DOM_SHORTCUTS = [
+    "ul", "li", "td", "tr", "th",
+    "tbody", "table", "input", "span", "b",
+    "a", "div", "img", "button", "h1",
+    "h2", "h3", "br", "textarea", "form",
+    "p", "select", "option", "iframe", "script",
+    "center", "dl", "dt", "dd", "small",
+    "pre", "tn"
+]
+
+FN_SHORTCUTS = {
+    '$': 'getElement',
+    '$$': 'getElements',
+    '$f': 'getFormElement',
+    '$b': 'bind',
+    '$p': 'partial',
+    '$A': 'createArray',
+    'DI': 'documentInsert',
+    'ACN': 'appendChildNodes',
+    'RCN': 'replaceChildNodes',
+    'AEV': 'addEventListener',
+    'REV': 'removeEventListener',
+    '$bytc': 'getElementsByTagAndClassName'
+}
+
+AJS_TEMPLATE = """//AJS JavaScript library (minify'ed version)
+//Copyright (c) 2006 Amir Salihefendic. All rights reserved.
+//Copyright (c) 2005 Bob Ippolito. All rights reserved.
+//License: http://www.opensource.org/licenses/mit-license.php
+//Visit http://orangoo.com/AmiNation/AJS for full version.
+AJS = {
+BASE_URL: "",
+drag_obj: null,
+drag_elm: null,
+_drop_zones: [],
+_cur_pos: null,
+
+%(functions)s
+}
+
+AJS.$ = AJS.getElement;
+AJS.$$ = AJS.getElements;
+AJS.$f = AJS.getFormElement;
+AJS.$p = AJS.partial;
+AJS.$b = AJS.bind;
+AJS.$A = AJS.createArray;
+AJS.DI = AJS.documentInsert;
+AJS.ACN = AJS.appendChildNodes;
+AJS.RCN = AJS.replaceChildNodes;
+AJS.AEV = AJS.addEventListener;
+AJS.REV = AJS.removeEventListener;
+AJS.$bytc = AJS.getElementsByTagAndClassName;
+
+AJS.addEventListener(window, 'unload', AJS._unloadListeners);
+AJS._createDomShortcuts();
+
+%(AJSClass)s
+
+%(AJSDeferred)s
+script_loaded = true;
+"""
+
+
+def getAjsCode():
+    return open(AJS_SRC).read()
+
+def writeAjsMini(code):
+    open(AJS_MINI_SRC, "w").write(code)
+
+
+class AjsAnalyzer:
+
+    def __init__(self):
+        self.code = getAjsCode()
+        self.ajs_fns = {}
+        self.ajs_deps = {}
+        self._parseAJS()
+        self._findDeps()
+
+    def _parseAJS(self):
+        ajs_code = re.search("AJS =(.|\n)*\n}\n", self.code).group(0)
+        fns = re.findall("\s+((\w*?):.*?{(.|\n)*?\n\s*})(,|\n+})\n", ajs_code)
+        for f in fns:
+            self.ajs_fns[f[1]] = f[0]
+
+    def getFnCode(self, fn_name, caller=None):
+        """
+        Returns the code of function and it's dependencies as a list
+        """
+        fn_name = self._unfoldFn(fn_name)
+        r = []
+        if self.ajs_fns.get(fn_name):
+            r.append(self.ajs_fns[fn_name])
+            for dep_fn in self.ajs_deps[fn_name]:
+                if fn_name != dep_fn and dep_fn != caller:
+                    r.extend(self.getFnCode(dep_fn, fn_name))
+        elif fn_name not in ['listeners', 'Class']:
+            print 'Could not find "%s"' % fn_name
+        return r
+
+    def getAjsClassCode(self):
+        return re.search("AJS.Class =(.|\n)*\n};\n", self.code).group(0)
+
+    def getAjsDeferredCode(self):
+        return re.search("AJSDeferred =(.|\n)*\n};\n", self.code).group(0)
+
+    def _findDeps(self):
+        """
+        Parses AJS and for every function it finds dependencies for the other functions.
+        """
+        for fn_name, fn_code in self.ajs_fns.items():
+            self.ajs_deps[fn_name] = self._findFns(fn_code)
+
+    def _findFns(self, inner):
+        """
+        Searches after AJS.fnX( in inner and returns all the fnX in a Set.
+        """
+        s = re.findall("AJS\.([\w_$]*?)(?:\(|,|\.)", inner)
+        s = list(Set(s))
+        return self._unfoldFns(s)
+
+    def _unfoldFns(self, list):
+        """
+        Unfolds:
+            AJS.B, AJS.H1 etc. to _createDomShortcuts
+            AJS.$ to AJS.getElement etc.
+        """
+        return [self._unfoldFn(n) for n in list]
+
+    def _unfoldFn(self, fn_name):
+        if fn_name.lower() in DOM_SHORTCUTS:
+            return "_createDomShortcuts"
+        elif FN_SHORTCUTS.get(fn_name):
+            return FN_SHORTCUTS[fn_name]
+        else:
+            return fn_name
+
+
+class ExternalCodeAnalyzer:
+
+    def __init__(self, files):
+        self.found_ajs_fns = []
+        self.files = files
+
+    def findFunctions(self):
+        for f in self.files:
+            self.found_ajs_fns.extend( self._parseFile(f) )
+        return list(Set(self.found_ajs_fns))
+
+    def _parseFile(self, f):
+        """
+        Parses the file, looks for AJS functions and returns all the found functions.
+        """
+        code = open(f).read()
+        return re.findall("AJS\.([\w_$]*?)\(", code)
+
+
+
+class AjsComposer:
+
+    def __init__(self, fn_list):
+        self.code = getAjsCode()
+        self.analyzer = AjsAnalyzer()
+        self.fn_list = fn_list
+
+        #Append standard functions
+        req = ['_unloadListeners', 'createDOM', '_createDomShortcuts', 'log', 'addEventListener']
+        self.fn_list.extend(req)
+
+        #Append AJSDeferred only if needed
+        in_list = lambda x: x in self.fn_list
+        if in_list('getRequest') or in_list('loadJSONDoc'):
+            self.deferred = self._minify(self.analyzer.getAjsDeferredCode())
+            self.fn_list.append('isObject')
+        else:
+            self.deferred = ''
+
+    def writeToOutput(self):
+        fns = self._getFns()
+        d = {}
+        d['functions'] = ",\n".join(fns)
+        d['AJSDeferred'] = self.deferred
+        d['AJSClass'] = self.analyzer.getAjsClassCode()
+
+        mini_code = AJS_TEMPLATE % d
+        writeAjsMini(mini_code)
+
+    def _minify(self, code):
+        new_lines = []
+        for l in code.split("\n"):
+            if l not in ['\n', '']:
+                new_lines.append(l.lstrip())
+        return "\n".join(new_lines)
+
+    def _getFns(self):
+        """
+        Returns a list with real code of functions
+        """
+        r = []
+        for fn in self.fn_list:
+            r.extend(self.analyzer.getFnCode(fn))
+
+        r = list(Set(r))
+        return [self._minify(fn) for fn in r]
+
+
+if __name__ == '__main__':
+    args = sys.argv
+
+    if len(args) < 3:
+        print """Usage is:
+    python AJS_minify.py [-o output_file] ajs_file js_file.js html_using_ajs.html ...
+Example usage:
+    Using relative paths:
+        python AJS_minify.py -o AJS_mini.js AJS.js test.js index.html
+        This will create AJS_mini.js from test.js and index.html.
+    Using absolute paths:
+        python AJS_minify.py ~/Desktop/AJS/AJS.js ~/Desktop/GreyBox_v3_42/greybox/greybox.js
+        This will create a new file called '%s' that has the needed AJS functions.""" % AJS_MINI_SRC
+
+        sys.exit(0)
+
+    if sys.argv[1] == '-o':
+        AJS_MINI_SRC = sys.argv[2]
+        AJS_SRC = sys.argv[3]
+        FILES = sys.argv[4:]
+    else:
+        AJS_SRC = sys.argv[1]
+        FILES = sys.argv[2:]
+
+    print 'Parsing through:\n    %s' % "\n    ".join(FILES)
+
+    code_analyzer = ExternalCodeAnalyzer(FILES)
+    found_fns = code_analyzer.findFunctions()
+    print 'Found following AJS functions:\n    %s' % ("\n    ".join(found_fns))
+
+    composer = AjsComposer(found_fns)
+    composer.writeToOutput()
+    print "Written the minified code to '%s'" % AJS_MINI_SRC
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compression_lib/__init__.py b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/compression_lib/__init__.py
new file mode 100644 (file)
index 0000000..792d600
--- /dev/null
@@ -0,0 +1 @@
+#
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/examples.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/examples.html
new file mode 100644 (file)
index 0000000..fb965fb
--- /dev/null
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+    <title>GreyBox - Examples</title>
+
+    <script type="text/javascript">
+        var GB_ROOT_DIR = "./greybox/";
+    </script>
+
+    <script type="text/javascript" src="greybox/AJS.js"></script>
+    <script type="text/javascript" src="greybox/AJS_fx.js"></script>
+    <script type="text/javascript" src="greybox/gb_scripts.js"></script>
+    <link href="greybox/gb_styles.css" rel="stylesheet" type="text/css" media="all" />
+
+    <script type="text/javascript" src="static_files/help.js"></script>
+    <link href="static_files/help.css" rel="stylesheet" type="text/css" media="all" />
+</head>
+<body>
+
+<script>
+    insertHeader();
+    insertMenu('examples');
+</script>
+
+
+<h3>One website</h3>
+<ul>
+    <li>
+        <a href="http://google.com/" title="Google" rel="gb_page_center[640, 480]">Launch google.com in a 640x480 window</a>
+    </li>
+    <li>
+        <a href="http://google.com/" title="Google" rel="gb_page_fs[]">Launch google.com in fullscreen window</a>
+    </li>
+</ul>
+
+<h3>Website gallery</h3>
+<ul>
+    <li>
+        <a href="http://google.com/" title="Google" rel="gb_pageset[search_sites]">Launch Google search</a>
+    </li>
+    <li>
+        <a href="http://search.yahoo.com/" rel="gb_pageset[search_sites]">Launch Yahoo search</a>
+    </li>
+    <li>
+        <a href="http://www.koders.com/" rel="gb_pageset[search_sites]">Launch Koders search</a>
+    </li>
+</ul>
+
+<h3>Image gallery</h3>
+<script type="text/javascript">
+var image_set = [{'caption': 'Flower', 'url': 'http://static.flickr.com/119/294309231_a3d2a339b9.jpg'},
+                 {'caption': 'Nice waterfall', 'url': 'http://www.widerange.org/images/large/plitvicka.jpg'}];
+</script>
+
+<ul>
+    <li>
+        <a href="#" onclick="return GB_showImageSet(image_set, 1)">Launch gallery</a>
+    </li>
+
+    <li>
+        <a href="static_files/night_valley.jpg" rel="gb_imageset[nice_pics]" title="Night valley">
+            <img src="static_files/night_valley_thumb.jpg" />
+        </a>
+    </li>
+
+    <li>
+        <a href="static_files/salt.jpg" rel="gb_imageset[nice_pics]" title="Salt flats in Chile">
+            <img src="static_files/salt_thumb.gif" />
+        </a>
+    </li>
+</ul>
+
+<h3>Without loading</h3>
+<script type="text/javascript">
+GB_myShow = function(caption, url, /* optional */ height, width, callback_fn) {
+    var options = {
+        caption: caption,
+        height: height || 500,
+        width: width || 500,
+        fullscreen: false,
+        show_loading: false,
+        callback_fn: callback_fn
+    }
+    var win = new GB_Window(options);
+    return win.show(url);
+}
+</script>
+<ul>
+    <li>
+        <a href="http://google.com/" onclick="return GB_myShow('Google', this.href)">Visit Google without loading</a>
+    </li>
+</ul>
+
+</body>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/auto_deco.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/auto_deco.js
new file mode 100644 (file)
index 0000000..7b7f52a
--- /dev/null
@@ -0,0 +1,67 @@
+var GB_SETS = {};
+function decoGreyboxLinks() {
+    var as = AJS.$bytc('a');
+    AJS.map(as, function(a) {
+        if(a.getAttribute('href') && a.getAttribute('rel')) {
+            var rel = a.getAttribute('rel');
+            if(rel.indexOf('gb_') == 0) {
+                var name = rel.match(/\w+/)[0];
+                var attrs = rel.match(/\[(.*)\]/)[1];
+                var index = 0;
+
+                var item = {
+                    'caption': a.title || '',
+                    'url': a.href
+                }
+
+                //Set up GB_SETS
+                if(name == 'gb_pageset' || name == 'gb_imageset') {
+                    if(!GB_SETS[attrs]) { GB_SETS[attrs] = []; }
+                    GB_SETS[attrs].push(item);
+                    index = GB_SETS[attrs].length;
+                }
+
+                //Append onclick
+                if(name == 'gb_pageset') {
+                    a.onclick = function() {
+                        GB_showFullScreenSet(GB_SETS[attrs], index);
+                        return false;
+                    };
+                }
+                if(name == 'gb_imageset') {
+                    a.onclick = function() {
+                        GB_showImageSet(GB_SETS[attrs], index);
+                        return false;
+                    };
+                }
+                if(name == 'gb_image') {
+                    a.onclick = function() {
+                        GB_showImage(item.caption, item.url);
+                        return false;
+                    };
+                }
+                if(name == 'gb_page') {
+                    a.onclick = function() {
+                        var sp = attrs.split(/, ?/);
+                        GB_show(item.caption, item.url, parseInt(sp[1]), parseInt(sp[0]));
+                        return false;
+                    };
+                }
+                if(name == 'gb_page_fs') {
+                    a.onclick = function() {
+                        GB_showFullScreen(item.caption, item.url);
+                        return false;
+                    };
+                }
+                if(name == 'gb_page_center') {
+                    a.onclick = function() {
+                        var sp = attrs.split(/, ?/);
+                        GB_showCenter(item.caption, item.url, parseInt(sp[1]), parseInt(sp[0]));
+                        return false;
+                    };
+                }
+            }
+        }});
+}
+
+AJS.AEV(window, 'load', decoGreyboxLinks);
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/AJS.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/AJS.js
new file mode 100644 (file)
index 0000000..89c199c
--- /dev/null
@@ -0,0 +1,1371 @@
+/*
+Last Modified: 29/01/07 14:16:09
+
+AJS JavaScript library
+    A very small library with a lot of functionality
+AUTHOR
+    4mir Salihefendic (http://amix.dk) - amix@amix.dk
+LICENSE
+    Copyright (c) 2006 Amir Salihefendic. All rights reserved.
+    Copyright (c) 2005 Bob Ippolito. All rights reserved.
+    http://www.opensource.org/licenses/mit-license.php
+VERSION
+    3.7
+SITE
+    http://orangoo.com/AmiNation/AJS
+**/
+if(!AJS) {
+var AJS = {
+    BASE_URL: "",
+
+    drag_obj: null,
+    drag_elm: null,
+    _drop_zones: [],
+    _drag_zones: [],
+    _cur_pos: null,
+
+    ajaxErrorHandler: null,
+
+////
+// General accessor functions
+////
+    getQueryArgument: function(var_name) {
+        var query = window.location.search.substring(1);
+        var vars = query.split("&");
+        for (var i=0;i<vars.length;i++) {
+            var pair = vars[i].split("=");
+            if (pair[0] == var_name) {
+                return pair[1];
+            }
+        }
+        return null;
+    },
+
+    isIe: function() {
+        return (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1);
+    },
+    isNetscape7: function() {
+        return (navigator.userAgent.toLowerCase().indexOf("netscape") != -1 && navigator.userAgent.toLowerCase().indexOf("7.") != -1);
+    },
+    isSafari: function() {
+        return (navigator.userAgent.toLowerCase().indexOf("khtml") != -1);
+    },
+    isOpera: function() {
+        return (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
+    },
+    isMozilla: function() {
+        return (navigator.userAgent.toLowerCase().indexOf("gecko") != -1 && navigator.productSub >= 20030210);
+    },
+
+
+////
+// Array functions
+////
+    //Shortcut: AJS.$A
+    createArray: function(v) {
+        if(AJS.isArray(v) && !AJS.isString(v))
+            return v;
+        else if(!v)
+            return [];
+        else
+            return [v];
+    },
+
+    forceArray: function(args) {
+        var r = [];
+        AJS.map(args, function(elm) {
+            r.push(elm);
+        });
+        return r;
+    },
+
+    join: function(delim, list) {
+        try {
+            return list.join(delim);
+        }
+        catch(e) {
+            var r = list[0] || '';
+            AJS.map(list, function(elm) {
+                r += delim + elm;
+            }, 1);
+            return r + '';
+        }
+    },
+
+    isIn: function(elm, list) {
+        var i = AJS.getIndex(elm, list);
+        if(i != -1)
+            return true;
+        else
+            return false;
+    },
+
+    getIndex: function(elm, list/*optional*/, eval_fn) {
+        for(var i=0; i < list.length; i++)
+            if(eval_fn && eval_fn(list[i]) || elm == list[i])
+                return i;
+        return -1;
+    },
+
+    getFirst: function(list) {
+        if(list.length > 0)
+            return list[0];
+        else
+            return null;
+    },
+
+    getLast: function(list) {
+        if(list.length > 0)
+            return list[list.length-1];
+        else
+            return null;
+    },
+
+    update: function(l1, l2) {
+        for(var i in l2)
+            l1[i] = l2[i];
+        return l1;
+    },
+
+    flattenList: function(list) {
+        var r = [];
+        var _flatten = function(r, l) {
+            AJS.map(l, function(o) {
+                if(o == null) {}
+                else if (AJS.isArray(o))
+                    _flatten(r, o);
+                else
+                    r.push(o);
+            });
+        }
+        _flatten(r, list);
+        return r;
+    },
+
+
+////
+// Functional programming
+////
+    map: function(list, fn,/*optional*/ start_index, end_index) {
+        var i = 0, l = list.length;
+        if(start_index)
+             i = start_index;
+        if(end_index)
+             l = end_index;
+        for(i; i < l; i++)
+            fn.apply(null, [list[i], i]);
+    },
+
+    rmap: function(list, fn) {
+        var i = list.length-1, l = 0;
+        for(i; i >= l; i--)
+            fn.apply(null, [list[i], i]);
+    },
+
+    filter: function(list, fn, /*optional*/ start_index, end_index) {
+        var r = [];
+        AJS.map(list, function(elm) {
+            if(fn(elm))
+                r.push(elm);
+        }, start_index, end_index);
+        return r;
+    },
+
+    partial: function(fn) {
+        var args = AJS.forceArray(arguments);
+        return AJS.$b(fn, null, args.slice(1, args.length).reverse(), false, true);
+    },
+
+
+////
+// DOM functions
+////
+    //Shortcut: AJS.$
+    getElement: function(id) {
+        if(AJS.isString(id) || AJS.isNumber(id))
+            return document.getElementById(id);
+        else
+            return id;
+    },
+
+    //Shortcut: AJS.$$
+    getElements: function(/*id1, id2, id3*/) {
+        var args = AJS.forceArray(arguments);
+        var elements = new Array();
+            for (var i = 0; i < args.length; i++) {
+                var element = AJS.getElement(args[i]);
+                elements.push(element);
+            }
+            return elements;
+    },
+
+    //Shortcut: AJS.$bytc
+    getElementsByTagAndClassName: function(tag_name, class_name, /*optional*/ parent) {
+        var class_elements = [];
+        if(!AJS.isDefined(parent))
+            parent = document;
+        if(!AJS.isDefined(tag_name))
+            tag_name = '*';
+
+        var els = parent.getElementsByTagName(tag_name);
+        var els_len = els.length;
+        var pattern = new RegExp("(^|\\s)" + class_name + "(\\s|$)");
+
+        for (i = 0, j = 0; i < els_len; i++) {
+            if ( pattern.test(els[i].className) || class_name == null ) {
+                class_elements[j] = els[i];
+                j++;
+            }
+        }
+        return class_elements;
+    },
+
+    _nodeWalk: function(elm, tag_name, class_name, fn_next_elm) {
+        var p = fn_next_elm(elm);
+
+        var checkFn;
+        if(tag_name && class_name) {
+            checkFn = function(p) {
+                return AJS.nodeName(p) == tag_name && AJS.hasClass(p, class_name);
+            }
+        }
+        else if(tag_name) {
+            checkFn = function(p) { return AJS.nodeName(p) == tag_name; }
+        }
+        else {
+            checkFn = function(p) { return AJS.hasClass(p, class_name); }
+        }
+
+        while(p) {
+            if(checkFn(p))
+                return p;
+            p = fn_next_elm(p);
+        }
+        return null;
+    },
+
+    getParentBytc: function(elm, tag_name, class_name) {
+        return AJS._nodeWalk(elm, tag_name, class_name, function(m) { return m.parentNode; });
+    },
+
+    getPreviousSiblingBytc: function(elm, tag_name, class_name) {
+        return AJS._nodeWalk(elm, tag_name, class_name, function(m) { return m.previousSibling; });
+    },
+
+    getNextSiblingBytc: function(elm, tag_name, class_name) {
+        return AJS._nodeWalk(elm, tag_name, class_name, function(m) { return m.nextSibling; });
+    },
+
+    //Shortcut: AJS.$f
+    getFormElement: function(form, name) {
+        form = AJS.$(form);
+        var r = null;
+        AJS.map(form.elements, function(elm) {
+            if(elm.name && elm.name == name)
+                r = elm;
+        });
+        return r;
+    },
+
+    formContents: function(form) {
+        var form = AJS.$(form);
+        var r = {};
+        var fn = function(elms) {
+            AJS.map(elms, function(e) {
+                if(e.name)
+                    r[e.name] = e.value || '';
+            });
+        }
+        fn(AJS.$bytc('input', null, form));
+        fn(AJS.$bytc('textarea', null, form));
+        return r;
+    },
+
+    getBody: function() {
+        return AJS.$bytc('body')[0]
+    },
+
+    nodeName: function(elm) {
+        return elm.nodeName.toLowerCase();
+    },
+
+    hasParent: function(elm, parent_to_consider, max_look_up) {
+        if(elm == parent_to_consider)
+            return true;
+        if(max_look_up == 0)
+            return false;
+        return AJS.hasParent(elm.parentNode, parent_to_consider, max_look_up-1);
+    },
+
+    isElementHidden: function(elm) {
+        return elm.style.visibility == "hidden";
+    },
+
+    //Shortcut: AJS.DI
+    documentInsert: function(elm) {
+        if(typeof(elm) == 'string')
+            elm = AJS.HTML2DOM(elm);
+        document.write('<span id="dummy_holder"></span>');
+        AJS.swapDOM(AJS.$('dummy_holder'), elm);
+    },
+
+    cloner: function(element) {
+        return function() {
+            return element.cloneNode(true);
+        }
+    },
+
+    appendToTop: function(elm/*, elms...*/) {
+        var args = AJS.forceArray(arguments).slice(1);
+        if(args.length >= 1) {
+            var first_child = elm.firstChild;
+            if(first_child) {
+                while(true) {
+                    var t_elm = args.shift();
+                    if(t_elm)
+                        AJS.insertBefore(t_elm, first_child);
+                    else
+                        break;
+                }
+            }
+            else {
+                AJS.ACN.apply(null, arguments);
+            }
+        }
+        return elm;
+    },
+
+    //Shortcut: AJS.ACN
+    appendChildNodes: function(elm/*, elms...*/) {
+        if(arguments.length >= 2) {
+            AJS.map(arguments, function(n) {
+                if(AJS.isString(n))
+                    n = AJS.TN(n);
+                if(AJS.isDefined(n))
+                    elm.appendChild(n);
+            }, 1);
+        }
+        return elm;
+    },
+
+    //Shortcut: AJS.RCN
+    replaceChildNodes: function(elm/*, elms...*/) {
+        var child;
+        while ((child = elm.firstChild))
+            elm.removeChild(child);
+        if (arguments.length < 2)
+            return elm;
+        else
+            return AJS.appendChildNodes.apply(null, arguments);
+        return elm;
+    },
+
+    insertAfter: function(elm, reference_elm) {
+        reference_elm.parentNode.insertBefore(elm, reference_elm.nextSibling);
+        return elm;
+    },
+
+    insertBefore: function(elm, reference_elm) {
+        reference_elm.parentNode.insertBefore(elm, reference_elm);
+        return elm;
+    },
+
+    showElement: function(/*elms...*/) {
+        var args = AJS.forceArray(arguments);
+        AJS.map(args, function(elm) { elm.style.display = ''});
+    },
+
+    hideElement: function(elm) {
+        var args = AJS.forceArray(arguments);
+        AJS.map(args, function(elm) { elm.style.display = 'none'});
+    },
+
+    swapDOM: function(dest, src) {
+        dest = AJS.getElement(dest);
+        var parent = dest.parentNode;
+        if (src) {
+            src = AJS.getElement(src);
+            parent.replaceChild(src, dest);
+        } else {
+            parent.removeChild(dest);
+        }
+        return src;
+    },
+
+    removeElement: function(/*elm1, elm2...*/) {
+        var args = AJS.forceArray(arguments);
+        AJS.map(args, function(elm) { AJS.swapDOM(elm, null); });
+    },
+
+    createDOM: function(name, attrs) {
+        var i=0, attr;
+        elm = document.createElement(name);
+
+        if(AJS.isDict(attrs[i])) {
+            for(k in attrs[0]) {
+                attr = attrs[0][k];
+                if(k == "style")
+                    elm.style.cssText = attr;
+                else if(k == "class" || k == 'className')
+                    elm.className = attr;
+                else {
+                    elm.setAttribute(k, attr);
+                }
+            }
+            i++;
+        }
+
+        if(attrs[0] == null)
+            i = 1;
+
+        AJS.map(attrs, function(n) {
+            if(n) {
+                if(AJS.isString(n) || AJS.isNumber(n))
+                    n = AJS.TN(n);
+                elm.appendChild(n);
+            }
+        }, i);
+        return elm;
+    },
+
+    _createDomShortcuts: function() {
+        var elms = [
+                "ul", "li", "td", "tr", "th",
+                "tbody", "table", "input", "span", "b",
+                "a", "div", "img", "button", "h1",
+                "h2", "h3", "br", "textarea", "form",
+                "p", "select", "option", "iframe", "script",
+                "center", "dl", "dt", "dd", "small",
+                "pre"
+        ];
+        var extends_ajs = function(elm) {
+            var c_dom = "return AJS.createDOM.apply(null, ['" + elm + "', arguments]);";
+            var c_fun_dom = 'function() { ' + c_dom + '    }';
+            eval("AJS." + elm.toUpperCase() + "=" + c_fun_dom);
+        }
+        AJS.map(elms, extends_ajs);
+        AJS.TN = function(text) { return document.createTextNode(text) };
+    },
+
+    getCssDim: function(dim) {
+        if(AJS.isString(dim))
+            return dim;
+        else
+            return dim + "px";
+    },
+    getCssProperty: function(elm, prop) {
+        elm = AJS.$(elm);
+        var y;
+        if(elm.currentStyle)
+            y = elm.currentStyle[prop];
+       else if (window.getComputedStyle)
+            y = document.defaultView.getComputedStyle(elm,null).getPropertyValue(prop);
+       return y;
+    },
+
+    setStyle: function(/*elm1, elm2..., property, new_value*/) {
+        var args = AJS.forceArray(arguments);
+        var new_val = args.pop();
+        var property = args.pop();
+        AJS.map(args, function(elm) { 
+            elm.style[property] = AJS.getCssDim(new_val);
+        });
+    },
+
+    setWidth: function(/*elm1, elm2..., width*/) {
+        var args = AJS.forceArray(arguments);
+        args.splice(args.length-1, 0, 'width');
+        AJS.setStyle.apply(null, args);
+    },
+    setHeight: function(/*elm1, elm2..., height*/) {
+        var args = AJS.forceArray(arguments);
+        args.splice(args.length-1, 0, 'height');
+        AJS.setStyle.apply(null, args);
+    },
+    setLeft: function(/*elm1, elm2..., left*/) {
+        var args = AJS.forceArray(arguments);
+        args.splice(args.length-1, 0, 'left');
+        AJS.setStyle.apply(null, args);
+    },
+    setTop: function(/*elm1, elm2..., top*/) {
+        var args = AJS.forceArray(arguments);
+        args.splice(args.length-1, 0, 'top');
+        AJS.setStyle.apply(null, args);
+    },
+    setClass: function(/*elm1, elm2..., className*/) {
+        var args = AJS.forceArray(arguments);
+        var c = args.pop();
+        AJS.map(args, function(elm) { elm.className = c});
+    },
+    addClass: function(/*elm1, elm2..., className*/) {
+        var args = AJS.forceArray(arguments);
+        var cls = args.pop();
+        var add_class = function(o) {
+            if(!new RegExp("(^|\\s)" + cls + "(\\s|$)").test(o.className))
+                o.className += (o.className ? " " : "") + cls;
+        };
+        AJS.map(args, function(elm) { add_class(elm); });
+    },
+    hasClass: function(elm, cls) {
+        if(!elm.className)
+            return false;
+        return elm.className == cls || 
+               elm.className.search(new RegExp(" " + cls)) != -1
+    },
+    removeClass: function(/*elm1, elm2..., className*/) {
+        var args = AJS.forceArray(arguments);
+        var cls = args.pop();
+        var rm_class = function(o) {
+            o.className = o.className.replace(new RegExp("\\s?" + cls, 'g'), "");
+        };
+        AJS.map(args, function(elm) { rm_class(elm); });
+    },
+
+    setHTML: function(elm, html) {
+        elm.innerHTML = html;
+        return elm;
+    },
+
+    RND: function(tmpl, ns, scope) {
+        scope = scope || window;
+        var fn = function(w, g) {
+            g = g.split("|");
+            var cnt = ns[g[0]];
+            for(var i=1; i < g.length; i++)
+                cnt = scope[g[i]](cnt);
+            if(cnt == '')
+                return '';
+            if(cnt == 0 || cnt == -1)
+                cnt += '';
+            return cnt || w;
+        };
+        return tmpl.replace(/%\(([A-Za-z0-9_|.]*)\)/g, fn);
+    },
+
+    HTML2DOM: function(html,/*optional*/ first_child) {
+        var d = AJS.DIV();
+        d.innerHTML = html;
+        if(first_child)
+            return d.childNodes[0];
+        else
+            return d;
+    },
+
+    preloadImages: function(/*img_src1, ..., img_srcN*/) {
+        AJS.AEV(window, 'load', AJS.$p(function(args) {
+            AJS.map(args, function(src) {
+                var pic = new Image();
+                pic.src = src;
+            });
+        }, arguments));
+    },
+
+
+////
+// Effects
+////
+    setOpacity: function(elm, p) {
+        elm.style.opacity = p;
+        elm.style.filter = "alpha(opacity="+ p*100 +")";
+    },
+
+
+////
+// Ajax functions
+////
+    getXMLHttpRequest: function() {
+        var try_these = [
+            function () { return new XMLHttpRequest(); },
+            function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
+            function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
+            function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
+            function () { throw "Browser does not support XMLHttpRequest"; }
+        ];
+        for (var i = 0; i < try_these.length; i++) {
+            var func = try_these[i];
+            try {
+                return func();
+            } catch (e) {
+            }
+        }
+    },
+
+    getRequest: function(url, data, type) {
+        if(!type)
+            type = "POST";
+        var req = AJS.getXMLHttpRequest();
+
+        if(url.indexOf("http://") == -1) {
+            if(AJS.BASE_URL != '') {
+                if(AJS.BASE_URL.lastIndexOf('/') != AJS.BASE_URL.length-1)
+                    AJS.BASE_URL += '/';
+                url = AJS.BASE_URL + url;
+            }
+            else
+                url = window.location + url;
+        }
+
+        req.open(type, url, true);
+        if(type == "POST")
+            req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+        return AJS._sendXMLHttpRequest(req);
+    },
+
+    _sendXMLHttpRequest: function(req, data) {
+        var d = new AJSDeferred(req);
+
+        var onreadystatechange = function () {
+            if (req.readyState == 4) {
+                var status = '';
+                try {
+                    status = req.status;
+                }
+                catch(e) {};
+                if(status == 200 || status == 304 || req.responseText == null) {
+                    d.callback();
+                }
+                else {
+                    if(AJS.ajaxErrorHandler)
+                        AJS.ajaxErrorHandler(req.responseText, req);
+                    else 
+                        d.errback();
+                }
+            }
+        }
+        req.onreadystatechange = onreadystatechange;
+        return d;
+    },
+
+    _reprString: function(o) {
+        return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
+        ).replace(/[\f]/g, "\\f"
+        ).replace(/[\b]/g, "\\b"
+        ).replace(/[\n]/g, "\\n"
+        ).replace(/[\t]/g, "\\t"
+        ).replace(/[\r]/g, "\\r");
+    },
+
+    serializeJSON: function(o) {
+        var objtype = typeof(o);
+        if (objtype == "undefined") {
+            return "undefined";
+        } else if (objtype == "number" || objtype == "boolean") {
+            return o + "";
+        } else if (o === null) {
+            return "null";
+        }
+        if (objtype == "string") {
+            return AJS._reprString(o);
+        }
+        var me = arguments.callee;
+        if (objtype != "function" && typeof(o.length) == "number") {
+            var res = [];
+            for (var i = 0; i < o.length; i++) {
+                var val = me(o[i]);
+                if (typeof(val) != "string") {
+                    val = "undefined";
+                }
+                res.push(val);
+            }
+            return "[" + res.join(",") + "]";
+        }
+        // it's a function with no adapter, bad
+        if (objtype == "function")
+            return null;
+        res = [];
+        for (var k in o) {
+            var useKey;
+            if (typeof(k) == "number") {
+                useKey = '"' + k + '"';
+            } else if (typeof(k) == "string") {
+                useKey = AJS._reprString(k);
+            } else {
+                // skip non-string or number keys
+                continue;
+            }
+            val = me(o[k]);
+            if (typeof(val) != "string") {
+                // skip non-serializable values
+                continue;
+            }
+            res.push(useKey + ":" + val);
+        }
+        return "{" + res.join(",") + "}";
+    },
+
+    loadJSONDoc: function(url) {
+        var d = AJS.getRequest(url);
+        var eval_req = function(data, req) {
+            var text = req.responseText;
+            if(text == "Error")
+                d.errback(req);
+            else
+                return AJS.evalTxt(text);
+        };
+        d.addCallback(eval_req);
+        return d;
+    },
+
+    evalTxt: function(txt) {
+        try {
+            return eval('('+ txt + ')');
+        }
+        catch(e) {
+            return eval(txt);
+        }
+    },
+
+    evalScriptTags: function(html) {
+        var script_data = html.match(/<script.*?>((\n|\r|.)*?)<\/script>/g);
+        if(script_data != null) {
+            for(var i=0; i < script_data.length; i++) {
+                var script_only = script_data[i].replace(/<script.*?>/g, "");
+                script_only = script_only.replace(/<\/script>/g, "");
+                eval(script_only);
+            }
+        }
+    },
+
+    queryArguments: function(data) {
+        var post_data = [];
+        for(k in data)
+            post_data.push(k + "=" + AJS.urlencode(data[k]));
+        return post_data.join("&");
+    },
+
+
+////
+// Position and size
+////
+    getMousePos: function(e) {
+        var posx = 0;
+        var posy = 0;
+        if (!e) var e = window.event;
+        if (e.pageX || e.pageY)
+        {
+            posx = e.pageX;
+            posy = e.pageY;
+        }
+        else if (e.clientX || e.clientY)
+        {
+            posx = e.clientX + document.body.scrollLeft;
+            posy = e.clientY + document.body.scrollTop;
+        }
+        return {x: posx, y: posy};
+    },
+
+    getScrollTop: function() {
+        //From: http://www.quirksmode.org/js/doctypes.html
+        var t;
+        if (document.documentElement && document.documentElement.scrollTop)
+                t = document.documentElement.scrollTop;
+        else if (document.body)
+                t = document.body.scrollTop;
+        return t;
+    },
+
+    absolutePosition: function(elm) {
+        var posObj = {'x': elm.offsetLeft, 'y': elm.offsetTop};
+        if(elm.offsetParent) {
+            var temp_pos = AJS.absolutePosition(elm.offsetParent);
+            posObj.x += temp_pos.x;
+            posObj.y += temp_pos.y;
+        }
+        // safari bug
+        if (AJS.isSafari() && elm.style.position == 'absolute' ) {
+            posObj.x -= document.body.offsetLeft;
+            posObj.y -= document.body.offsetTop;
+        }
+        return posObj;
+    },
+
+    getWindowSize: function(doc) {
+        doc = doc || document;
+        var win_w, win_h;
+        if (self.innerHeight) {
+            win_w = self.innerWidth;
+            win_h = self.innerHeight;
+        } else if (doc.documentElement && doc.documentElement.clientHeight) {
+            win_w = doc.documentElement.clientWidth;
+            win_h = doc.documentElement.clientHeight;
+        } else if (doc.body) {
+            win_w = doc.body.clientWidth;
+            win_h = doc.body.clientHeight;
+        }
+        return {'w': win_w, 'h': win_h};
+    },
+
+    isOverlapping: function(elm1, elm2) {
+        var pos_elm1 = AJS.absolutePosition(elm1);
+        var pos_elm2 = AJS.absolutePosition(elm2);
+
+        var top1 = pos_elm1.y;
+        var left1 = pos_elm1.x;
+        var right1 = left1 + elm1.offsetWidth;
+        var bottom1 = top1 + elm1.offsetHeight;
+        var top2 = pos_elm2.y;
+        var left2 = pos_elm2.x;
+        var right2 = left2 + elm2.offsetWidth;
+        var bottom2 = top2 + elm2.offsetHeight;
+        var getSign = function(v) {
+            if(v > 0) return "+";
+            else if(v < 0) return "-";
+            else return 0;
+        }
+
+        if ((getSign(top1 - bottom2) != getSign(bottom1 - top2)) &&
+                (getSign(left1 - right2) != getSign(right1 - left2)))
+            return true;
+        return false;
+    },
+
+
+////
+// Events
+////
+    getEventElm: function(e) {
+        if(e && !e.type && !e.keyCode)
+            return e
+        var targ;
+        if (!e) var e = window.event;
+        if (e.target) targ = e.target;
+        else if (e.srcElement) targ = e.srcElement;
+        if (targ.nodeType == 3) // defeat Safari bug
+            targ = targ.parentNode;
+        return targ;
+    },
+
+    _getRealScope: function(fn, /*optional*/ extra_args, dont_send_event, rev_extra_args) {
+        var scope = window;
+        extra_args = AJS.$A(extra_args);
+        if(fn._cscope)
+            scope = fn._cscope;
+
+        return function() {
+            //Append all the orginal arguments + extra_args
+            var args = [];
+            var i = 0;
+            if(dont_send_event)
+                i = 1;
+
+            AJS.map(arguments, function(arg) { args.push(arg) }, i);
+            args = args.concat(extra_args);
+            if(rev_extra_args)
+                args = args.reverse();
+            return fn.apply(scope, args);
+        };
+    },
+
+    _unloadListeners: function() {
+        if(AJS.listeners)
+            AJS.map(AJS.listeners, function(elm, type, fn) { AJS.REV(elm, type, fn) });
+        AJS.listeners = [];
+    },
+
+    setEventKey: function(e) {
+        e.key = e.keyCode ? e.keyCode : e.charCode;
+
+        if(window.event) {
+            e.ctrl = window.event.ctrlKey;
+            e.shift = window.event.shiftKey;
+        }
+        else {
+            e.ctrl = e.ctrlKey;
+            e.shift = e.shiftKey;
+        }
+        switch(e.key) {
+            case 63232:
+                e.key = 38;
+                break;
+            case 63233:
+                e.key = 40;
+                break;
+            case 63235:
+                e.key = 39;
+                break;
+            case 63234:
+                e.key = 37;
+                break;
+        }
+    },
+
+    //Shortcut: AJS.AEV
+    addEventListener: function(elm, type, fn, /*optional*/listen_once, cancle_bubble) {
+        if(!cancle_bubble)
+            cancle_bubble = false;
+
+        var elms = AJS.$A(elm);
+        AJS.map(elms, function(elmz) {
+            if(listen_once)
+                fn = AJS._listenOnce(elmz, type, fn);
+            
+            //Hack since it does not work in all browsers
+            if(AJS.isIn(type, ['submit', 'load', 'scroll', 'resize'])) {
+                var old = elm['on' + type];
+                elm['on' + type] = function() {
+                    if(old) {
+                        fn(arguments);
+                        return old(arguments);
+                    }
+                    else
+                        return fn(arguments);
+                };
+                return;
+            }
+
+            //Fix keyCode
+            if(AJS.isIn(type, ['keypress', 'keydown', 'keyup', 'click'])) {
+                var old_fn = fn;
+                fn = function(e) {
+                    AJS.setEventKey(e);
+                    return old_fn.apply(null, arguments);
+                }
+            }
+
+            if (elmz.attachEvent) {
+                //FIXME: We ignore cancle_bubble for IE... could be a problem?
+                elmz.attachEvent("on" + type, fn);
+            }
+            else if(elmz.addEventListener)
+                elmz.addEventListener(type, fn, cancle_bubble);
+
+            AJS.listeners = AJS.$A(AJS.listeners);
+            AJS.listeners.push([elmz, type, fn]);
+        });
+    },
+
+    //Shortcut: AJS.REV
+    removeEventListener: function(elm, type, fn, /*optional*/cancle_bubble) {
+        if(!cancle_bubble)
+            cancle_bubble = false;
+        if(elm.removeEventListener) {
+            elm.removeEventListener(type, fn, cancle_bubble);
+            if(AJS.isOpera())
+                elm.removeEventListener(type, fn, !cancle_bubble);
+        }
+        else if(elm.detachEvent)
+            elm.detachEvent("on" + type, fn);
+    },
+
+    //Shortcut: AJS.$b
+    bind: function(fn, scope, /*optional*/ extra_args, dont_send_event, rev_extra_args) {
+        fn._cscope = scope;
+        return AJS._getRealScope(fn, extra_args, dont_send_event, rev_extra_args);
+    },
+
+    bindMethods: function(self) {
+        for (var k in self) {
+            var func = self[k];
+            if (typeof(func) == 'function') {
+                self[k] = AJS.$b(func, self);
+            }
+        }
+    },
+
+    _listenOnce: function(elm, type, fn) {
+        var r_fn = function() {
+            AJS.removeEventListener(elm, type, r_fn);
+            fn(arguments);
+        }
+        return r_fn;
+    },
+
+    callLater: function(fn, interval) {
+        var fn_no_send = function() {
+            fn();
+        };
+        window.setTimeout(fn_no_send, interval);
+    },
+
+    preventDefault: function(e) {
+        if(AJS.isIe()) 
+            window.event.returnValue = false;
+        else 
+            e.preventDefault();
+    },
+
+
+////
+// Drag and drop
+////
+    dragAble: function(elm, /*optional*/ handler, args) {
+        if(!args)
+            args = {};
+        if(!AJS.isDefined(args['move_x']))
+            args['move_x'] = true;
+        if(!AJS.isDefined(args['move_y']))
+            args['move_y'] = true;
+        if(!AJS.isDefined(args['moveable']))
+            args['moveable'] = false;
+        if(!AJS.isDefined(args['hide_on_move']))
+            args['hide_on_move'] = true;
+        if(!AJS.isDefined(args['on_mouse_up']))
+            args['on_mouse_up'] = null;
+        if(!AJS.isDefined(args['cursor']))
+            args['cursor'] = 'move';
+        if(!AJS.isDefined(args['max_move']))
+            args['max_move'] = {'top': null, 'left': null};
+
+        elm = AJS.$(elm);
+
+        if(!handler)
+            handler = elm;
+
+        handler = AJS.$(handler);
+        var old_cursor = handler.style.cursor;
+        handler.style.cursor = args['cursor'];
+        elm.style.position = 'relative';
+
+        AJS.addClass(handler, '_ajs_handler');
+        handler._args = args;
+        handler._elm = elm;
+        AJS.AEV(handler, 'mousedown', AJS._dragStart);
+    },
+
+    _dragStart: function(e) {
+        var handler = AJS.getEventElm(e);
+        if(!AJS.hasClass(handler, '_ajs_handler')) {
+            handler = AJS.getParentBytc(handler, null, '_ajs_handler');
+        }
+        if(handler)
+            AJS._dragInit(e, handler._elm, handler._args);
+    },
+
+    dropZone: function(elm, args) {
+        elm = AJS.$(elm);
+        var item = {elm: elm};
+        AJS.update(item, args);
+        AJS._drop_zones.push(item);
+    },
+
+    removeDragAble: function(elm) {
+        AJS.REV(elm, 'mousedown', AJS._dragStart);
+        elm.style.cursor = '';
+    },
+
+    removeDropZone: function(elm) {
+        var i = AJS.getIndex(elm, AJS._drop_zones, function(item) {
+            if(item.elm == elm) return true;
+        });
+        if(i != -1) {
+            AJS._drop_zones.splice(i, 1);
+        }
+    },
+
+    _dragInit: function(e, click_elm, args) {
+        AJS.drag_obj = new Object();
+        AJS.drag_obj.args = args;
+
+        AJS.drag_obj.click_elm = click_elm;
+        AJS.drag_obj.mouse_pos = AJS.getMousePos(e);
+        AJS.drag_obj.click_elm_pos = AJS.absolutePosition(click_elm);
+
+        AJS.AEV(document, 'mousemove', AJS._dragMove, false, true);
+        AJS.AEV(document, 'mouseup', AJS._dragStop, false, true);
+
+        if (AJS.isIe())
+            window.event.cancelBubble = true;
+        AJS.preventDefault(e);
+    },
+
+    _initDragElm: function(elm) {
+        if(AJS.drag_elm && AJS.drag_elm.style.display == 'none')
+            AJS.removeElement(AJS.drag_elm);
+
+        if(!AJS.drag_elm) {
+            AJS.drag_elm = AJS.DIV();
+            var d = AJS.drag_elm;
+            AJS.insertBefore(d, AJS.getBody().firstChild);
+            AJS.setHTML(d, elm.innerHTML);
+
+            d.className = elm.className;
+            d.style.cssText = elm.style.cssText;
+
+            d.style.position = 'absolute';
+            d.style.zIndex = 10000;
+
+            var t = AJS.absolutePosition(elm);
+            AJS.setTop(d, t.y);
+            AJS.setLeft(d, t.x);
+
+            if(AJS.drag_obj.args.on_init) {
+                AJS.drag_obj.args.on_init(elm);
+            }
+        }
+    },
+
+    _dragMove: function(e) {
+        var drag_obj = AJS.drag_obj;
+        var click_elm = drag_obj.click_elm;
+
+        AJS._initDragElm(click_elm);
+        var drag_elm = AJS.drag_elm;
+
+        if(drag_obj.args['hide_on_move'])
+            click_elm.style.visibility = 'hidden';
+
+        var cur_pos = AJS.getMousePos(e);
+
+        var mouse_pos = drag_obj.mouse_pos;
+
+        var click_elm_pos = drag_obj.click_elm_pos;
+
+        AJS.map(AJS._drop_zones, function(d_z) {
+            if(AJS.isOverlapping(d_z['elm'], drag_elm)) {
+                if(d_z['elm'] != drag_elm) {
+                    var on_hover = d_z['on_hover'];
+                    if(on_hover)
+                        on_hover(d_z['elm'], click_elm, drag_elm);
+                }
+            }
+        });
+
+        if(drag_obj.args['on_drag'])
+            drag_obj.args['on_drag'](click_elm, e);
+
+        var max_move_top = drag_obj.args['max_move']['top'];
+        var max_move_left = drag_obj.args['max_move']['left'];
+        var p;
+        if(drag_obj.args['move_x']) {
+            p = cur_pos.x - (mouse_pos.x - click_elm_pos.x);
+            if(max_move_left == null || max_move_left <= p)
+                AJS.setLeft(elm, p);
+        }
+
+        if(drag_obj.args['move_y']) {
+            p = cur_pos.y - (mouse_pos.y - click_elm_pos.y);
+            if(max_move_top == null || max_move_top <= p)
+                AJS.setTop(elm, p);
+        }
+        if(AJS.isIe()) {
+            window.event.cancelBubble = true;
+            window.event.returnValue = false;
+        }
+        else
+            e.preventDefault();
+    },
+
+    _dragStop: function(e) {
+        var drag_obj = AJS.drag_obj;
+        var drag_elm = AJS.drag_elm;
+        var click_elm = drag_obj.click_elm;
+
+        AJS.REV(document, "mousemove", AJS._dragMove, true);
+        AJS.REV(document, "mouseup", AJS._dragStop, true);
+
+        var dropped = false;
+        AJS.map(AJS._drop_zones, function(d_z) {
+            if(AJS.isOverlapping(d_z['elm'], click_elm)) {
+                if(d_z['elm'] != click_elm) {
+                    var on_drop = d_z['on_drop'];
+                    if(on_drop) {
+                        dropped = true;
+                        on_drop(d_z['elm'], click_elm);
+                    }
+                }
+            }
+        });
+
+        if(drag_obj.args['moveable']) {
+            var t = parseInt(click_elm.style.top) || 0;
+            var l = parseInt(click_elm.style.left) || 0;
+            var drag_elm_xy = AJS.absolutePosition(drag_elm);
+            var click_elm_xy = AJS.absolutePosition(click_elm);
+            AJS.setTop(click_elm, t + drag_elm_xy.y - click_elm_xy.y);
+            AJS.setLeft(click_elm, l + drag_elm_xy.x - click_elm_xy.x);
+        }
+
+        if(!dropped && drag_obj.args['on_mouse_up'])
+            drag_obj.args['on_mouse_up'](click_elm, e);
+
+        if(drag_obj.args['hide_on_move'])
+            drag_obj.click_elm.style.visibility = 'visible';
+
+        if(drag_obj.args.on_end) {
+            drag_obj.args.on_end(click_elm);
+        }
+
+        AJS._dragObj = null;
+        if(drag_elm)
+            AJS.hideElement(drag_elm);
+        AJS.drag_elm = null;
+    },
+
+
+////
+// Misc.
+////
+    keys: function(obj) {
+        var rval = [];
+        for (var prop in obj) {
+            rval.push(prop);
+        }
+        return rval;
+    },
+
+    values: function(obj) {
+        var rval = [];
+        for (var prop in obj) {
+            rval.push(obj[prop]);
+        }
+        return rval;
+    },
+
+    urlencode: function(str) {
+        return encodeURIComponent(str.toString());
+    },
+
+    isDefined: function(o) {
+        return (o != "undefined" && o != null)
+    },
+
+    isArray: function(obj) {
+        return obj instanceof Array;
+    },
+
+    isString: function(obj) {
+        return (typeof obj == 'string');
+    },
+
+    isNumber: function(obj) {
+        return (typeof obj == 'number');
+    },
+
+    isObject: function(obj) {
+        return (typeof obj == 'object');
+    },
+
+    isFunction: function(obj) {
+        return (typeof obj == 'function');
+    },
+
+    isDict: function(o) {
+        var str_repr = String(o);
+        return str_repr.indexOf(" Object") != -1;
+    },
+
+    exportToGlobalScope: function() {
+        for(e in AJS)
+            eval(e + " = AJS." + e);
+    },
+
+    log: function(o) {
+        if(AJS.isMozilla())
+            console.log(o);
+        else {
+            var div = AJS.DIV({'style': 'color: green'});
+            AJS.ACN(AJS.getBody(), AJS.setHTML(div, ''+o));
+        }
+    }
+
+}
+
+AJS.Class = function(members) {
+    var fn = function() {
+        if(arguments[0] != 'no_init') {
+            return this.init.apply(this, arguments);
+        }
+    }
+    fn.prototype = members;
+    AJS.update(fn, AJS.Class.prototype);
+    return fn;
+}
+AJS.Class.prototype = {
+    extend: function(members) {
+        var parent = new this('no_init');
+        for(k in members) {
+            var prev = parent[k];
+            var cur = members[k];
+            if (prev && prev != cur && typeof cur == 'function') {
+                cur = this._parentize(cur, prev);
+            }
+            parent[k] = cur;
+        }
+        return new AJS.Class(parent);
+    },
+
+    implement: function(members) {
+        AJS.update(this.prototype, members);
+    },
+
+    _parentize: function(cur, prev) {
+        return function(){
+            this.parent = prev;
+            return cur.apply(this, arguments);
+        }
+    }
+};
+
+//Shortcuts
+AJS.$ = AJS.getElement;
+AJS.$$ = AJS.getElements;
+AJS.$f = AJS.getFormElement;
+AJS.$b = AJS.bind;
+AJS.$p = AJS.partial;
+AJS.$FA = AJS.forceArray;
+AJS.$A = AJS.createArray;
+AJS.DI = AJS.documentInsert;
+AJS.ACN = AJS.appendChildNodes;
+AJS.RCN = AJS.replaceChildNodes;
+AJS.AEV = AJS.addEventListener;
+AJS.REV = AJS.removeEventListener;
+AJS.$bytc = AJS.getElementsByTagAndClassName;
+
+AJSDeferred = function(req) {
+    this.callbacks = [];
+    this.errbacks = [];
+    this.req = req;
+}
+AJSDeferred.prototype = {
+    excCallbackSeq: function(req, list) {
+        var data = req.responseText;
+        while (list.length > 0) {
+            var fn = list.pop();
+            var new_data = fn(data, req);
+            if(new_data)
+                data = new_data;
+        }
+    },
+
+    callback: function () {
+        this.excCallbackSeq(this.req, this.callbacks);
+    },
+
+    errback: function() {
+        if(this.errbacks.length == 0)
+            alert("Error encountered:\n" + this.req.responseText);
+
+        this.excCallbackSeq(this.req, this.errbacks);
+    },
+
+    addErrback: function(fn) {
+        this.errbacks.unshift(fn);
+    },
+
+    addCallback: function(fn) {
+        this.callbacks.unshift(fn);
+    },
+
+    addCallbacks: function(fn1, fn2) {
+        this.addCallback(fn1);
+        this.addErrback(fn2);
+    },
+
+    sendReq: function(data) {
+        if(AJS.isObject(data)) {
+            this.req.send(AJS.queryArguments(data));
+        }
+        else if(AJS.isDefined(data))
+            this.req.send(data);
+        else {
+            this.req.send("");
+        }
+    }
+};
+
+//Prevent memory-leaks
+AJS.addEventListener(window, 'unload', AJS._unloadListeners);
+AJS._createDomShortcuts()
+}
+
+script_loaded = true;
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/AJS_fx.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/AJS_fx.js
new file mode 100644 (file)
index 0000000..661300c
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+Last Modified: 25/12/06 18:26:30
+
+AJS effects
+    A very small library with a lot of functionality
+AUTHOR
+    4mir Salihefendic (http://amix.dk) - amix@amix.dk
+LICENSE
+    Copyright (c) 2006 Amir Salihefendic. All rights reserved.
+    Copyright (c) 2005 Bob Ippolito. All rights reserved.
+    Copyright (c) 2006 Valerio Proietti, http://www.mad4milk.net
+    http://www.opensource.org/licenses/mit-license.php
+VERSION
+    3.6
+SITE
+    http://orangoo.com/AmiNation/AJS
+**/
+AJS.fx = {
+    _shades: {0: 'ffffff', 1: 'ffffee', 2: 'ffffdd',
+              3: 'ffffcc', 4: 'ffffbb', 5: 'ffffaa',
+              6: 'ffff99'},
+
+    highlight: function(elm, options) {
+        var base = new AJS.fx.Base();
+        base.elm = AJS.$(elm);
+        base.setOptions(options);
+        base.options.duration = 600;
+
+        AJS.update(base, {
+            increase: function(){
+                if(this.now == 7)
+                    elm.style.backgroundColor = 'transparent';
+                else
+                    elm.style.backgroundColor = '#' + AJS.fx._shades[Math.floor(this.now)];
+            }
+        });
+        return base.custom(6, 0);
+    },
+
+    fadeIn: function(elm, options) {
+        options = options || {};
+        if(!options.from) {
+            options.from = 0;
+            AJS.setOpacity(elm, 0);
+        }
+        if(!options.to) options.to = 1;
+        var s = new AJS.fx.Style(elm, 'opacity', options);
+        return s.custom(options.from, options.to);
+    },
+
+    fadeOut: function(elm, options) {
+        options = options || {};
+        if(!options.from) options.from = 1;
+        if(!options.to) options.to = 0;
+        options.duration = 300;
+        var s = new AJS.fx.Style(elm, 'opacity', options);
+        return s.custom(options.from, options.to);
+    },
+    
+    setWidth: function(elm, options) {
+        var s = new AJS.fx.Style(elm, 'width', options);
+        return s.custom(options.from, options.to);
+    },
+
+    setHeight: function(elm, options) {
+        var s = new AJS.fx.Style(elm, 'height', options);
+        return s.custom(options.from, options.to);
+    }
+}
+
+
+//From moo.fx
+AJS.fx.Base = new AJS.Class({
+    init: function() {
+        AJS.bindMethods(this);
+    },
+
+    setOptions: function(options){
+        this.options = AJS.update({
+                onStart: function(){},
+                onComplete: function(){},
+                transition: AJS.fx.Transitions.sineInOut,
+                duration: 500,
+                wait: true,
+                fps: 50
+        }, options || {});
+    },
+
+    step: function(){
+        var time = new Date().getTime();
+        if (time < this.time + this.options.duration){
+            this.cTime = time - this.time;
+            this.setNow();
+        } else {
+            setTimeout(AJS.$b(this.options.onComplete, this, [this.elm]), 10);
+            this.clearTimer();
+            this.now = this.to;
+        }
+        this.increase();
+    },
+
+    setNow: function(){
+        this.now = this.compute(this.from, this.to);
+    },
+
+    compute: function(from, to){
+        var change = to - from;
+        return this.options.transition(this.cTime, from, change, this.options.duration);
+    },
+
+    clearTimer: function(){
+        clearInterval(this.timer);
+        this.timer = null;
+        return this;
+    },
+
+    _start: function(from, to){
+        if (!this.options.wait) this.clearTimer();
+        if (this.timer) return;
+        setTimeout(AJS.$p(this.options.onStart, this.elm), 10);
+        this.from = from;
+        this.to = to;
+        this.time = new Date().getTime();
+        this.timer = setInterval(this.step, Math.round(1000/this.options.fps));
+        return this;
+    },
+
+    custom: function(from, to){
+        return this._start(from, to);
+    },
+
+    set: function(to){
+        this.now = to;
+        this.increase();
+        return this;
+    },
+
+    setStyle: function(elm, property, val) {
+        if(this.property == 'opacity')
+            AJS.setOpacity(elm, val);
+        else
+            AJS.setStyle(elm, property, val);
+    }
+});
+
+AJS.fx.Style = AJS.fx.Base.extend({
+    init: function(elm, property, options) {
+        this.parent();
+        this.elm = elm;
+        this.setOptions(options);
+        this.property = property;
+    },
+
+    increase: function(){
+        this.setStyle(this.elm, this.property, this.now);
+    }
+});
+
+AJS.fx.Styles = AJS.fx.Base.extend({
+    init: function(elm, options){
+        this.parent();
+        this.elm = AJS.$(elm);
+        this.setOptions(options);
+        this.now = {};
+    },
+
+    setNow: function(){
+        for (p in this.from) 
+            this.now[p] = this.compute(this.from[p], this.to[p]);
+    },
+
+    custom: function(obj){
+        if (this.timer && this.options.wait) return;
+        var from = {};
+        var to = {};
+        for (p in obj){
+                from[p] = obj[p][0];
+                to[p] = obj[p][1];
+        }
+        return this._start(from, to);
+    },
+
+    increase: function(){
+        for (var p in this.now) this.setStyle(this.elm, p, this.now[p]);
+    }
+});
+
+//Transitions (c) 2003 Robert Penner (http://www.robertpenner.com/easing/), BSD License.
+AJS.fx.Transitions = {
+    linear: function(t, b, c, d) { return c*t/d + b; },
+    sineInOut: function(t, b, c, d) { return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; }
+};
+
+script_loaded = true;
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/base.css b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/base.css
new file mode 100644 (file)
index 0000000..1c0cf6d
--- /dev/null
@@ -0,0 +1,32 @@
+/* Last-Modified: 28/06/06 00:08:22 */
+#GB_overlay {
+    background-color: #000;
+    position: absolute;
+    margin: auto;
+    top: 0;
+    left: 0;
+    z-index: 100;
+}
+
+#GB_window {
+    left: 0;
+    top: 0;
+    font-size: 1px;
+    position: absolute;
+    overflow: visible;
+    z-index: 150;
+}
+
+#GB_window .content {
+    width: auto;
+    margin: 0;
+    padding: 0;
+}
+
+#GB_frame {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    overflow: auto;
+    white-space: nowrap;
+}
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/base.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/base.js
new file mode 100644 (file)
index 0000000..fac3056
--- /dev/null
@@ -0,0 +1,192 @@
+var GB_CURRENT = null;
+
+GB_hide = function() {
+    GB_CURRENT.hide();
+}
+
+GreyBox = new AJS.Class({
+    init: function(options) {
+        this.use_fx = AJS.fx;
+        this.type = "page";
+        this.overlay_click_close = false;
+        this.salt = 0;
+        this.root_dir = GB_ROOT_DIR;
+        this.callback_fns = [];
+        this.reload_on_close = false;
+        this.src_loader = this.root_dir + 'loader_frame.html';
+
+        //Solve the www issue
+        var h_www = window.location.hostname.indexOf('www');
+        var src_www = this.src_loader.indexOf('www');
+        if(h_www != -1 && src_www == -1)
+            this.src_loader = this.src_loader.replace('://', '://www.');
+
+        if(h_www == -1 && src_www != -1)
+            this.src_loader = this.src_loader.replace('://www.', '://');
+
+        this.show_loading = true;
+        AJS.update(this, options);
+    },
+
+    addCallback: function(fn) {
+        if(fn) this.callback_fns.push(fn);
+    },
+
+    show: function(url) {
+        GB_CURRENT = this;
+        this.url = url;
+
+        var elms = [AJS.$bytc("object"), AJS.$bytc("select")];
+        AJS.map(AJS.flattenList(elms), function(elm) {
+            elm.style.visibility = "hidden";
+        });
+
+        this.createElements();
+        return false;
+    },
+
+    hide: function() {
+        var c_bs = this.callback_fns;
+        if(c_bs != []) {
+            AJS.map(c_bs, function(fn) { 
+                fn();
+            });
+        }
+
+        this.onHide();
+        if(this.use_fx) {
+            var elm = this.overlay;
+            AJS.fx.fadeOut(this.overlay, {
+                onComplete: function() {
+                    AJS.removeElement(elm);
+                    elm = null;
+                },
+                duration: 300
+            });
+            AJS.removeElement(this.g_window);
+        }
+        else {
+            AJS.removeElement(this.g_window, this.overlay);
+        }
+
+        this.removeFrame();
+
+        AJS.REV(window, "scroll", _GB_setOverlayDimension);
+        AJS.REV(window, "resize", _GB_update);
+
+        var elms = [AJS.$bytc("object"), AJS.$bytc("select")];
+        AJS.map(AJS.flattenList(elms), function(elm) {
+            elm.style.visibility = "visible";
+        });
+
+        GB_CURRENT = null;
+
+        if(this.reload_on_close)
+            window.location.reload();
+    },
+
+    update: function() {
+        this.setOverlayDimension();
+        this.setFrameSize();
+        this.setWindowPosition();
+    },
+
+    createElements: function() {
+        this.initOverlay();
+
+        this.g_window = AJS.DIV({'id': 'GB_window'});
+        AJS.hideElement(this.g_window);
+        AJS.getBody().insertBefore(this.g_window, this.overlay.nextSibling);
+
+        this.initFrame();
+        this.initHook();
+        this.update();
+        
+        var me = this;
+        if(this.use_fx) {
+            AJS.fx.fadeIn(this.overlay, {
+                duration: 300,
+                to: 0.7,
+                onComplete: function() {
+                    me.onShow();
+                    AJS.showElement(me.g_window);
+                    me.startLoading();
+                }
+            });
+        }
+        else {
+            AJS.setOpacity(this.overlay, 0.7);
+            AJS.showElement(this.g_window);
+            this.onShow();
+            this.startLoading();
+        }
+
+        AJS.AEV(window, "scroll", _GB_setOverlayDimension);
+        AJS.AEV(window, "resize", _GB_update);
+    },
+
+    removeFrame: function() {
+        try{ AJS.removeElement(this.iframe); }
+        catch(e) {}
+
+        this.iframe = null;
+    },
+
+    startLoading: function() {
+        this.iframe.src = this.src_loader + '?s='+this.salt++;
+        AJS.showElement(this.iframe);
+    },
+
+    setOverlayDimension: function() {
+        var page_size = AJS.getWindowSize();
+        if(AJS.isMozilla() || AJS.isOpera())
+            AJS.setWidth(this.overlay, "100%");
+        else
+            AJS.setWidth(this.overlay, page_size.w);
+
+        var max_height = Math.max(AJS.getScrollTop()+page_size.h, AJS.getScrollTop()+this.height);
+
+        if(max_height < AJS.getScrollTop())
+            AJS.setHeight(this.overlay, max_height);
+        else
+            AJS.setHeight(this.overlay, AJS.getScrollTop()+page_size.h);
+    },
+
+    initOverlay: function() {
+        this.overlay = AJS.DIV({'id': 'GB_overlay'});
+
+        if(this.overlay_click_close)
+            AJS.AEV(this.overlay, "click", GB_hide);
+
+        AJS.setOpacity(this.overlay, 0);
+        AJS.getBody().insertBefore(this.overlay, AJS.getBody().firstChild);
+    },
+
+    initFrame: function() {
+        if(!this.iframe) {
+            var d = {'name': 'GB_frame', 'class': 'GB_frame', 'frameBorder': 0};
+            this.iframe = AJS.IFRAME(d);
+            this.middle_cnt = AJS.DIV({'class': 'content'}, this.iframe);
+
+            this.top_cnt = AJS.DIV();
+            this.bottom_cnt = AJS.DIV();
+
+            AJS.ACN(this.g_window, this.top_cnt, this.middle_cnt, this.bottom_cnt);
+        }
+    },
+
+    /* Can be implemented */
+    onHide: function() {},
+    onShow: function() {},
+    setFrameSize: function() {},
+    setWindowPosition: function() {},
+    initHook: function() {}
+
+});
+
+_GB_update = function() { if(GB_CURRENT) GB_CURRENT.update(); }
+_GB_setOverlayDimension = function() { if(GB_CURRENT) GB_CURRENT.setOverlayDimension(); }
+
+AJS.preloadImages(GB_ROOT_DIR+'indicator.gif');
+
+script_loaded = true;
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/indicator.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/indicator.gif
new file mode 100644 (file)
index 0000000..02bdbdd
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/indicator.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/loader_frame.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/base/loader_frame.html
new file mode 100644 (file)
index 0000000..30dcb26
--- /dev/null
@@ -0,0 +1,104 @@
+<!--
+Notice: I feel so dirty doing this, but its the only way to make it cross browser.
+-->
+<html>
+<head>
+  <script>
+    var GB = parent.GB_CURRENT;
+    document.write('<script type="text/javascript" src="AJS.js"><\/script>');
+    if(GB.use_fx) {
+        document.write('<script type="text/javascript" src="AJS_fx.js"><\/script>');
+    }
+  </script>
+  <style>
+    body {
+      padding: 0;
+      margin: 0;
+      overflow: hidden;
+    }
+
+    #GB_frame {
+      visibility: hidden;
+      width: 100%;
+      height: 100%;
+    }
+
+    #loading {
+      padding-top: 50px;
+      position: absolute;
+      width: 100%;
+      top: 0;
+      text-align: center;
+      vertical-align: middle;
+    }
+  </style>
+</head>
+<body>
+
+<div id="loading">
+  <img src="indicator.gif">
+</div>
+
+<script>
+var loading = AJS.$('loading');
+var gb_type = GB.type;
+var gb_url = GB.url;
+
+//Start loading in the iframe
+if(gb_type == "page") {
+  document.write('<iframe id="GB_frame" src="' + gb_url + '" frameborder="0"></iframe>');
+}
+else {
+  var img_holder = new Image();
+  img_holder.src = gb_url;
+  document.write('<img id="GB_frame" src="' + gb_url + '">');
+}
+var frame = AJS.$('GB_frame');
+</script>
+
+</body>
+<script>
+function setupOuterGB() {
+    frame.style.visibility = 'visible';
+    GB.setFrameSize();
+    GB.setWindowPosition();
+}
+
+function loaded() {
+    AJS.removeElement(loading);
+
+    GB.overlay.innerHTML += "&nbsp;"; //Safari bugfix
+    
+    if(gb_type == "image") {
+        if(img_holder.width != 0 && img_holder.height != 0) {
+            var width = img_holder.width;
+            var height = img_holder.height;
+
+            GB.width = width;
+            GB.height = height;
+
+            setupOuterGB();
+
+            if(GB.use_fx) {
+                AJS.setOpacity(frame, 0);
+                AJS.fx.fadeIn(frame);
+            }
+        }
+    }
+    else {
+        GB.width = frame.offsetWidth;
+        GB.height = frame.offsetHeight;
+        setupOuterGB();
+    }
+}
+
+if(GB.show_loading) {
+    AJS.AEV(window, 'load', function(e) {
+        loaded();
+    });
+}
+else {
+    loaded();
+}
+</script>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/g_close.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/g_close.gif
new file mode 100644 (file)
index 0000000..8707668
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/g_close.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/gallery.css b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/gallery.css
new file mode 100644 (file)
index 0000000..523ff17
--- /dev/null
@@ -0,0 +1,51 @@
+.GB_Gallery {
+    margin: 0 22px 0 22px;
+}
+
+.GB_Gallery .content {
+    background-color: #fff;
+    border: 3px solid #ddd;
+}
+
+.GB_header {
+    top: 10px;
+    left: 0;
+    margin: 0;
+    z-index: 500;
+    position: absolute;
+    border-bottom: 2px solid #555;
+    border-top: 2px solid #555;
+}
+
+.GB_header .inner {
+    background-color: #333;
+    font-family: Arial, Verdana, sans-serif;
+    padding: 2px 20px 2px 20px;
+}
+
+.GB_header table {
+    margin: 0;
+    width: 100%;
+    border-collapse: collapse;
+}
+
+.GB_header .caption {
+    text-align: left;
+    color: #eee;
+    white-space: nowrap;
+    font-size: 20px;
+}
+
+.GB_header .close {
+    text-align: right;
+}
+
+.GB_header .close img {
+    z-index: 500;
+    cursor: pointer;
+}
+
+.GB_header .middle {
+    white-space: nowrap;
+    text-align: center;
+}
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/gallery.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/gallery/gallery.js
new file mode 100644 (file)
index 0000000..6405c8c
--- /dev/null
@@ -0,0 +1,114 @@
+GB_showImage = function(caption, url, callback_fn) {
+    var options = {
+        width: 300,
+        height: 300,
+        type: 'image',
+
+        fullscreen: false,
+        center_win: true,
+        caption: caption,
+        callback_fn: callback_fn
+    }
+    var win = new GB_Gallery(options);
+    return win.show(url);
+}
+
+GB_showPage = function(caption, url, callback_fn) {
+    var options = {
+        type: 'page',
+
+        caption: caption,
+        callback_fn: callback_fn,
+        fullscreen: true,
+        center_win: false
+    }
+    var win = new GB_Gallery(options);
+    return win.show(url);
+}
+
+GB_Gallery = GreyBox.extend({
+    init: function(options) {
+        this.parent({});
+        this.img_close = this.root_dir + 'g_close.gif';
+        AJS.update(this, options);
+        this.addCallback(this.callback_fn);
+    },
+
+    initHook: function() {
+        AJS.addClass(this.g_window, 'GB_Gallery');
+
+        var inner = AJS.DIV({'class': 'inner'});
+        this.header = AJS.DIV({'class': 'GB_header'}, inner);
+        AJS.setOpacity(this.header, 0);
+        AJS.getBody().insertBefore(this.header, this.overlay.nextSibling);
+
+        var td_caption = AJS.TD({'id': 'GB_caption', 'class': 'caption', 'width': '40%'}, this.caption);
+        var td_middle = AJS.TD({'id': 'GB_middle', 'class': 'middle', 'width': '20%'});
+
+        var img_close = AJS.IMG({'src': this.img_close});
+        AJS.AEV(img_close, 'click', GB_hide);
+        var td_close = AJS.TD({'class': 'close', 'width': '40%'}, img_close);
+
+        var tbody = AJS.TBODY(AJS.TR(td_caption, td_middle, td_close));
+
+        var table = AJS.TABLE({'cellspacing': '0', 'cellpadding': 0, 'border': 0}, tbody);
+        AJS.ACN(inner, table);
+
+        if(this.fullscreen)
+            AJS.AEV(window, 'scroll', AJS.$b(this.setWindowPosition, this));
+        else
+            AJS.AEV(window, 'scroll', AJS.$b(this._setHeaderPos, this));
+    },
+
+    setFrameSize: function() {
+        var overlay_w = this.overlay.offsetWidth;
+        var page_size = AJS.getWindowSize();
+
+        if(this.fullscreen) {
+            this.width = overlay_w-40;
+            this.height = page_size.h-80;
+        }
+        AJS.setWidth(this.iframe, this.width);
+        AJS.setHeight(this.iframe, this.height);
+
+        AJS.setWidth(this.header, overlay_w);
+    },
+
+    _setHeaderPos: function() {
+        AJS.setTop(this.header, AJS.getScrollTop()+10);
+    },
+
+    setWindowPosition: function() {
+        var overlay_w = this.overlay.offsetWidth;
+        var page_size = AJS.getWindowSize();
+        AJS.setLeft(this.g_window, ((overlay_w - 50 - this.width)/2));
+
+        var header_top = AJS.getScrollTop()+55;
+        if(!this.center_win) {
+            AJS.setTop(this.g_window, header_top);
+        }
+        else {
+            var fl = ((page_size.h - this.height) /2) + 20 + AJS.getScrollTop();
+            if(fl < 0) fl = 0;
+            if(header_top > fl) {
+                fl = header_top;
+            }
+            AJS.setTop(this.g_window, fl);
+        }
+        this._setHeaderPos();
+    },
+
+    onHide: function() {
+        AJS.removeElement(this.header);
+        AJS.removeClass(this.g_window, 'GB_Gallery');
+    },
+
+    onShow: function() {
+        if(this.use_fx)
+            AJS.fx.fadeIn(this.header, {to: 1});
+        else
+            AJS.setOpacity(this.header, 1);
+    }
+});
+
+AJS.preloadImages(GB_ROOT_DIR+'g_close.gif');
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/next.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/next.gif
new file mode 100644 (file)
index 0000000..c0f8908
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/next.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/prev.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/prev.gif
new file mode 100644 (file)
index 0000000..d20e095
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/prev.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/set.css b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/set.css
new file mode 100644 (file)
index 0000000..5c22928
--- /dev/null
@@ -0,0 +1,20 @@
+#GB_middle {
+    color: #eee;
+}
+
+#GB_middle img {
+    cursor: pointer;
+    vertical-align: middle;
+}
+
+#GB_middle .disabled {
+    cursor: default;
+}
+
+#GB_middle .left {
+    padding-right: 10px;
+}
+
+#GB_middle .right {
+    padding-left: 10px;
+}
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/set.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/set/set.js
new file mode 100644 (file)
index 0000000..473bf91
--- /dev/null
@@ -0,0 +1,101 @@
+GB_showFullScreenSet = function(set, start_index, callback_fn) {
+    var options = {
+        type: 'page',
+        fullscreen: true,
+        center_win: false
+    }
+    var gb_sets = new GB_Sets(options, set);
+    gb_sets.addCallback(callback_fn);
+    gb_sets.showSet(start_index-1);
+    return false;
+}
+
+GB_showImageSet = function(set, start_index, callback_fn) {
+    var options = {
+        type: 'image',
+        fullscreen: false,
+        center_win: true,
+        width: 300,
+        height: 300
+    }
+    var gb_sets = new GB_Sets(options, set);
+    gb_sets.addCallback(callback_fn);
+    gb_sets.showSet(start_index-1);
+    return false;
+}
+
+GB_Sets = GB_Gallery.extend({
+    init: function(options, set) {
+        this.parent(options);
+        if(!this.img_next) this.img_next = this.root_dir + 'next.gif';
+        if(!this.img_prev) this.img_prev = this.root_dir + 'prev.gif';
+        this.current_set = set; 
+    },
+
+    showSet: function(start_index) {
+        this.current_index = start_index;
+
+        var item = this.current_set[this.current_index];
+        this.show(item.url);
+        this._setCaption(item.caption);
+
+        this.btn_prev = AJS.IMG({'class': 'left', src: this.img_prev});
+        this.btn_next = AJS.IMG({'class': 'right', src: this.img_next});
+
+        AJS.AEV(this.btn_prev, 'click', AJS.$b(this.switchPrev, this));
+        AJS.AEV(this.btn_next, 'click', AJS.$b(this.switchNext, this));
+
+        GB_STATUS = AJS.SPAN({'class': 'GB_navStatus'});
+        AJS.ACN(AJS.$('GB_middle'), this.btn_prev, GB_STATUS, this.btn_next);
+        
+        this.updateStatus();
+    },
+
+    updateStatus: function() {
+        AJS.setHTML(GB_STATUS, (this.current_index + 1) + ' / ' + this.current_set.length);
+        if(this.current_index == 0) {
+            AJS.addClass(this.btn_prev, 'disabled');
+        }
+        else {
+            AJS.removeClass(this.btn_prev, 'disabled');
+        }
+
+        if(this.current_index == this.current_set.length-1) {
+            AJS.addClass(this.btn_next, 'disabled');
+        }
+        else {
+            AJS.removeClass(this.btn_next, 'disabled');
+        }
+    },
+
+    _setCaption: function(caption) {
+        AJS.setHTML(AJS.$('GB_caption'), caption);
+    },
+
+    updateFrame: function() {
+        var item = this.current_set[this.current_index];
+        this._setCaption(item.caption);
+        this.url = item.url;
+        this.startLoading();
+    },
+
+    switchPrev: function() {
+        if(this.current_index != 0) {
+            this.current_index--;
+            this.updateFrame();
+            this.updateStatus();
+        }
+    },
+
+    switchNext: function() {
+        if(this.current_index != this.current_set.length-1) {
+            this.current_index++
+            this.updateFrame();
+            this.updateStatus();
+        }
+    }
+});
+
+AJS.AEV(window, 'load', function() {
+    AJS.preloadImages(GB_ROOT_DIR+'next.gif', GB_ROOT_DIR+'prev.gif');
+});
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/header_bg.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/header_bg.gif
new file mode 100644 (file)
index 0000000..3913cfd
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/header_bg.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/w_close.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/w_close.gif
new file mode 100644 (file)
index 0000000..3c05b15
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/w_close.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/window.css b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/window.css
new file mode 100644 (file)
index 0000000..84970b6
--- /dev/null
@@ -0,0 +1,39 @@
+.GB_Window .content {
+    background-color: #fff;
+    border: 3px solid #ccc;
+    border-top: none;
+}
+
+.GB_Window .header {
+    border-bottom: 1px solid #aaa;
+    border-top: 1px solid #999;
+    border-left: 3px solid #ccc;
+    border-right: 3px solid #ccc;
+    margin: 0;
+
+    height: 22px;
+    font-size: 12px;
+    padding: 3px 0;
+    color: #333;
+}
+
+.GB_Window .caption {
+    font-size: 12px;
+    text-align: left;
+    font-weight: bold;
+    white-space: nowrap;
+    padding-right: 20px;
+}
+
+.GB_Window .close { text-align: right; }
+.GB_Window .close span { 
+    font-size: 12px;
+    cursor: pointer; 
+}
+.GB_Window .close img {
+    cursor: pointer;
+    padding: 0 3px 0 0;
+}
+
+.GB_Window .on { border-bottom: 1px solid #333; }
+.GB_Window .click { border-bottom: 1px solid red; }
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/window.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/greybox_source/window/window.js
new file mode 100644 (file)
index 0000000..539c780
--- /dev/null
@@ -0,0 +1,109 @@
+GB_show = function(caption, url, /* optional */ height, width, callback_fn) {
+    var options = {
+        caption: caption,
+        height: height || 500,
+        width: width || 500,
+        fullscreen: false,
+        callback_fn: callback_fn
+    }
+    var win = new GB_Window(options);
+    return win.show(url);
+}
+
+GB_showCenter = function(caption, url, /* optional */ height, width, callback_fn) {
+    var options = {
+        caption: caption,
+        center_win: true,
+        height: height || 500,
+        width: width || 500,
+        fullscreen: false,
+        callback_fn: callback_fn
+    }
+    var win = new GB_Window(options);
+    return win.show(url);
+}
+
+GB_showFullScreen = function(caption, url, callback_fn) {
+    var options = {
+        caption: caption,
+        fullscreen: true,
+        callback_fn: callback_fn
+    }
+    var win = new GB_Window(options);
+    return win.show(url);
+}
+
+GB_Window = GreyBox.extend({
+    init: function(options) {
+        this.parent({});
+        this.img_header = this.root_dir+"header_bg.gif";
+        this.img_close = this.root_dir+"w_close.gif";
+        this.show_close_img = true;
+        AJS.update(this, options);
+        this.addCallback(this.callback_fn);
+    },
+
+    initHook: function() {
+        AJS.addClass(this.g_window, 'GB_Window');
+
+        this.header = AJS.TABLE({'class': 'header'});
+        this.header.style.backgroundImage = "url("+ this.img_header +")";
+
+        var td_caption = AJS.TD({'class': 'caption'}, this.caption);
+        var td_close = AJS.TD({'class': 'close'});
+
+        if(this.show_close_img) {
+            var img_close = AJS.IMG({'src': this.img_close});
+            var span = AJS.SPAN('Close');
+
+            var btn = AJS.DIV(img_close, span);
+
+            AJS.AEV([img_close, span], 'mouseover', function() { AJS.addClass(span, 'on'); });
+            AJS.AEV([img_close, span], 'mouseout', function() { AJS.removeClass(span, 'on'); });
+            AJS.AEV([img_close, span], 'mousedown', function() { AJS.addClass(span, 'click'); });
+            AJS.AEV([img_close, span], 'mouseup', function() { AJS.removeClass(span, 'click'); });
+            AJS.AEV([img_close, span], 'click', GB_hide);
+
+            AJS.ACN(td_close, btn);
+        }
+
+        tbody_header = AJS.TBODY();
+        AJS.ACN(tbody_header, AJS.TR(td_caption, td_close));
+
+        AJS.ACN(this.header, tbody_header);
+        AJS.ACN(this.top_cnt, this.header);
+
+        if(this.fullscreen)
+            AJS.AEV(window, 'scroll', AJS.$b(this.setWindowPosition, this));
+    },
+
+    setFrameSize: function() {
+        if(this.fullscreen) {
+            var page_size = AJS.getWindowSize();
+            overlay_h = page_size.h;
+            this.width = Math.round(this.overlay.offsetWidth - (this.overlay.offsetWidth/100)*10);
+            this.height = Math.round(overlay_h - (overlay_h/100)*10);
+        }
+
+        AJS.setWidth(this.header, this.width+6); //6 is for the left+right border
+        AJS.setWidth(this.iframe, this.width);
+        AJS.setHeight(this.iframe, this.height);
+    },
+
+    setWindowPosition: function() {
+        var page_size = AJS.getWindowSize();
+        AJS.setLeft(this.g_window, ((page_size.w - this.width)/2)-13);
+
+        if(!this.center_win) {
+            AJS.setTop(this.g_window, AJS.getScrollTop());
+        }
+        else {
+            var fl = ((page_size.h - this.height) /2) - 20 + AJS.getScrollTop();
+            if(fl < 0)
+                fl = 0;
+            AJS.setTop(this.g_window, fl);
+        }
+    }
+});
+
+AJS.preloadImages(GB_ROOT_DIR+'w_close.gif', GB_ROOT_DIR+'header_bg.gif');
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/installation.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/installation.html
new file mode 100644 (file)
index 0000000..b76785b
--- /dev/null
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+    <title>GreyBox - Installation</title>
+
+    <script type="text/javascript" src="greybox/AJS.js"></script>
+
+    <script type="text/javascript" src="static_files/help.js"></script>
+    <link href="static_files/help.css" rel="stylesheet" type="text/css" media="all" />
+</head>
+<body>
+
+<script>
+    insertHeader();
+    insertMenu('installation');
+</script>
+
+<ol>
+<li>
+Append following to your header section (in between <code>&lt;header&gt;...&lt;/header&gt;</code>).
+<br />
+<span class="hl">GB_ROOT_DIR</span> is the URL where static files are located:
+<pre>
+<code>&lt;script type="text/javascript"&gt;
+    var GB_ROOT_DIR = "http://mydomain.com/greybox/";
+&lt;/script&gt;</code>
+</pre>
+</li>
+GB_ROOT_DIR should be absolute.
+
+<li>
+Append also following scripts and one stylesheet:
+<pre>
+<code>&lt;script type="text/javascript" src="greybox/AJS.js"&gt;&lt;/script&gt;
+&lt;script type="text/javascript" src="greybox/AJS_fx.js"&gt;&lt;/script&gt;
+&lt;script type="text/javascript" src="greybox/gb_scripts.js"&gt;&lt;/script&gt;
+&lt;link href="greybox/gb_styles.css" rel="stylesheet" type="text/css" /&gt;</code>
+</pre>
+
+AJS_fx.js is optional, it's used for effects. If you don't wish effects, then don't include AJS_fx.js in your header section.
+</li>
+
+<li>
+That's it, you are now ready to use GreyBox!
+</li>
+</ol>
+
+</body>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/normal_usage.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/normal_usage.html
new file mode 100644 (file)
index 0000000..3b78181
--- /dev/null
@@ -0,0 +1,126 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+    <title>GreyBox - Normal usage</title>
+
+    <script type="text/javascript">
+        var GB_ROOT_DIR = "./greybox/";
+    </script>
+
+    <script type="text/javascript" src="greybox/AJS.js"></script>
+    <script type="text/javascript" src="greybox/AJS_fx.js"></script>
+    <script type="text/javascript" src="greybox/gb_scripts.js"></script>
+    <link href="greybox/gb_styles.css" rel="stylesheet" type="text/css" media="all" />
+
+    <script type="text/javascript" src="static_files/help.js"></script>
+    <link href="static_files/help.css" rel="stylesheet" type="text/css" media="all" />
+</head>
+
+<body>
+
+<script>
+    insertHeader();
+    insertMenu('nrm_usage');
+</script>
+
+<h2>Showing images</h2>
+
+<h3 class="first">Showing one image:</h3>
+<h4>Syntax:</h4>
+<pre>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_image[]"&gt;HTML&lt;/a&gt;</code>
+</pre>
+
+<h4>Example:</h4>
+<pre>
+<code>&lt;a href="http://static.flickr.com/119/294309231_a3d2a339b9.jpg" title="Flower" rel="gb_image[]"&gt;Show flower&lt;/a&gt;</code>
+</pre>
+
+<h4>Example rendered:</h4>
+<a href="http://static.flickr.com/119/294309231_a3d2a339b9.jpg" title="Flower" rel="gb_image[]">Show flower</a>
+
+
+<h3>Showing a group of images:</h3>
+<h4>Syntax:</h4>
+<pre>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_imageset[NAME]"&gt;HTML&lt;/a&gt;</code>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_imageset[NAME]"&gt;HTML&lt;/a&gt;</code>
+</pre>
+
+<h4>Example:</h4>
+<pre>
+<code>&lt;a href="static_files/salt.jpg" rel="gb_imageset[nice_pics]" title="Salt flats in Chile"&gt;Salt flats&lt;/a&gt;</code>
+<code>&lt;a href="static_files/night_valley.jpg" rel="gb_imageset[nice_pics]" title="Night valley"&gt;Night valley&lt;/a&gt;</code>
+</pre>
+
+<h4>Example rendered:</h4>
+<a href="static_files/salt.jpg" rel="gb_imageset[nice_pics]" title="Salt flats in Chile">Salt flats</a>
+<a href="static_files/night_valley.jpg" rel="gb_imageset[nice_pics]" title="Night valley">Night valley</a>
+
+
+<h2>Showing pages</h2>
+
+<h3>Showing one page:</h3>
+<h4>Syntax:</h4>
+<pre>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_page[WIDTH, HEIGHT]"&gt;HTML&lt;/a&gt;</code>
+</pre>
+
+<h4>Example:</h4>
+<pre>
+<code>&lt;a href="http://google.com/" title="Google" rel="gb_page[500, 500]"&gt;Launch Google.com&lt;/a&gt;</code>
+</pre>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com/" title="Google" rel="gb_page[500, 500]">Launch Google.com</a>
+
+
+<h3>Showing one page as center window:</h3>
+<h4>Syntax:</h4>
+<pre>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_page_center[WIDTH, HEIGHT]"&gt;HTML&lt;/a&gt;</code>
+</pre>
+
+<h4>Example:</h4>
+<pre>
+<code>&lt;a href="http://google.com/" title="Google" rel="gb_page_center[500, 500]"&gt;Launch Google.com&lt;/a&gt;</code>
+</pre>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com/" title="Google" rel="gb_page_center[500, 500]">Launch Google.com</a>
+
+
+<h3>Showing one page in fullscreen:</h3>
+<h4>Syntax:</h4>
+<pre>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_page_fs[]"&gt;HTML&lt;/a&gt;</code>
+</pre>
+
+<h4>Example:</h4>
+<pre>
+<code>&lt;a href="http://google.com/" title="Google" rel="gb_page_fs[]"&gt;Launch Google.com&lt;/a&gt;</code>
+</pre>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com/" title="Google" rel="gb_page_fs[]">Launch Google.com</a>
+
+<h3>Showing a group of pages:</h3>
+<h4>Syntax:</h4>
+<pre>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_pageset[NAME]"&gt;HTML&lt;/a&gt;</code>
+<code>&lt;a href="URL" title="CAPTION" rel="gb_pageset[NAME]"&gt;HTML&lt;/a&gt;</code>
+</pre>
+
+<h4>Example:</h4>
+<pre>
+<code>&lt;a href="http://google.com/" title="Google" rel="gb_pageset[search_sites]"&gt;Launch Google search&lt;/a&gt;</code>
+<code>&lt;a href="http://search.yahoo.com/" rel="gb_pageset[search_sites]"&gt;Launch Yahoo search&lt;/a&gt;</code>
+</pre>
+
+<h4>Example rendered:</h4>
+<a href="http://google.com/" title="Google" rel="gb_pageset[search_sites]">Launch Google search</a>
+<a href="http://search.yahoo.com/" rel="gb_pageset[search_sites]">Launch Yahoo search</a>
+
+
+</body>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/help.css b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/help.css
new file mode 100644 (file)
index 0000000..725dac1
--- /dev/null
@@ -0,0 +1,93 @@
+body {
+    font-family: helvetica, verdana, sans-serif;
+    font-size: 12px;
+    background-color: #fff;
+    padding: 10px 35px 35px 35px;
+    width: 800px;
+    margin: auto;
+}
+
+#top {
+    text-align: center;
+}
+
+h2 {
+    font-size: 18px;
+    color: #333;
+    margin: 35px 0 10px 0;
+}
+
+h3 {
+    color: #333;
+    border-bottom: 1px solid #999;
+    font-size: 15px;
+    margin: 30px 0 3px 0;
+}
+
+.first {
+    margin-top: 20px;
+}
+
+h4 {
+    color: black;
+    font-size: 13px;
+    margin: 10px 0 5px 0;
+}
+
+pre {
+    font-size: 11px;
+    margin-top: 5px;
+    padding: 4px;
+    background-color: #e3e2c6;
+    border: 1px solid #999;
+}
+
+.hl {
+    background-color: #ffffcc;
+}
+
+ol {
+    margin: 0;
+    padding: 0 0px 0 20px;
+}
+
+li {
+    padding: 5px 0 5px 0;
+}
+
+img {
+    border: 0;
+}
+
+/* 
+ * Menu
+ */
+#menu {
+    border-bottom: 1px solid #999;
+    margin: 20px 0px;
+    padding: 10px 0pt 5px;
+    text-align: center;
+}
+
+#menu li {
+    display: inline;
+    margin: 0px;
+    padding: 0px;
+}
+
+#menu a {
+    background: #ddd none repeat;
+    border: 1px solid #999;
+    margin: 0 5px 0 5px;
+    padding: 5px;
+}
+
+#menu a.current {
+    background: #fff none repeat;
+    border-bottom: 1px solid #fff;
+}
+
+#menu a {
+    color: black;
+    text-decoration: none;
+}
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/help.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/help.js
new file mode 100644 (file)
index 0000000..d1e9a05
--- /dev/null
@@ -0,0 +1,52 @@
+var tmpl_header = AJS.join('', [
+    '<div id="top"> <img src="static_files/logo.gif" alt="" /> <br />',
+    '<span style="font-weight: bold; color: #333">A pop-up window that doesn\'t suck.</span>',
+    '</div>'
+]);
+
+function insertHeader() {
+    AJS.DI(tmpl_header);
+}
+
+var LINKS = {
+    'installation': 'installation.html',
+    'examples': 'examples.html',
+    'nrm_usage': 'normal_usage.html',
+    'adv_usage': 'advance_usage.html',
+    'cmpr': 'compressing_greybox.html',
+    'about': 'about.html'
+}
+
+function insertMenu(current_page) {
+    var menu = AJS.UL({id: 'menu'});
+    var create_item = function(cls, name) {
+        var item = AJS.LI({'class': cls});
+        AJS.ACN(item, AJS.A({href: LINKS[cls]}, name));
+        return item;
+    }
+    var items = [
+        create_item('installation', 'Installation'),
+        create_item('examples', 'Examples'),
+        create_item('nrm_usage', 'Normal usage'),
+        create_item('adv_usage', 'Advance usage'),
+        create_item('cmpr', 'Compressing GreyBox'),
+        create_item('about', 'About')
+    ];
+
+    AJS.map(items, function(item) {
+        if(item.className == current_page) {
+            AJS.addClass(AJS.$bytc('a', null, item)[0], 'current');
+        }
+        AJS.ACN(menu, item);
+    });
+    AJS.DI(menu);
+}
+
+function insertCode() {
+    var code = AJS.join('\n', arguments);
+    var result = '<pre><code>';
+    code = code.replace(/</g, '&lt;').replace(/>/g, '&gt;');
+    result += code;
+    result += '</code></pre>';
+    document.write(result);
+}
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/logo.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/logo.gif
new file mode 100644 (file)
index 0000000..ebbbe9a
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/logo.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley.jpg b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley.jpg
new file mode 100644 (file)
index 0000000..3980daf
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley.jpg differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.gif
new file mode 100644 (file)
index 0000000..e8fb249
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.jpg b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.jpg
new file mode 100644 (file)
index 0000000..eb8697d
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/night_valley_thumb.jpg differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt.jpg b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt.jpg
new file mode 100644 (file)
index 0000000..a5abed5
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt.jpg differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt_thumb.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt_thumb.gif
new file mode 100644 (file)
index 0000000..4032bfc
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/GreyBox_v5_5/static_files/salt_thumb.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/g_close.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/g_close.gif
new file mode 100644 (file)
index 0000000..8707668
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/g_close.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/gb_scripts.js b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/gb_scripts.js
new file mode 100644 (file)
index 0000000..354e2c0
--- /dev/null
@@ -0,0 +1,436 @@
+var GB_CURRENT=null;
+GB_hide=function(){
+GB_CURRENT.hide();
+};
+GreyBox=new AJS.Class({init:function(_1){
+this.use_fx=AJS.fx;
+this.type="page";
+this.overlay_click_close=false;
+this.salt=0;
+this.root_dir=GB_ROOT_DIR;
+this.callback_fns=[];
+this.reload_on_close=false;
+this.src_loader=this.root_dir+"loader_frame.html";
+var _2=window.location.hostname.indexOf("www");
+var _3=this.src_loader.indexOf("www");
+if(_2!=-1&&_3==-1){
+this.src_loader=this.src_loader.replace("://","://www.");
+}
+if(_2==-1&&_3!=-1){
+this.src_loader=this.src_loader.replace("://www.","://");
+}
+this.show_loading=true;
+AJS.update(this,_1);
+},addCallback:function(fn){
+if(fn){
+this.callback_fns.push(fn);
+}
+},show:function(_5){
+GB_CURRENT=this;
+this.url=_5;
+var _6=[AJS.$bytc("object"),AJS.$bytc("select")];
+AJS.map(AJS.flattenList(_6),function(_7){
+_7.style.visibility="hidden";
+});
+this.createElements();
+return false;
+},hide:function(){
+var _8=this.callback_fns;
+if(_8!=[]){
+AJS.map(_8,function(fn){
+fn();
+});
+}
+this.onHide();
+if(this.use_fx){
+var _a=this.overlay;
+AJS.fx.fadeOut(this.overlay,{onComplete:function(){
+AJS.removeElement(_a);
+_a=null;
+},duration:300});
+AJS.removeElement(this.g_window);
+}else{
+AJS.removeElement(this.g_window,this.overlay);
+}
+this.removeFrame();
+AJS.REV(window,"scroll",_GB_setOverlayDimension);
+AJS.REV(window,"resize",_GB_update);
+var _b=[AJS.$bytc("object"),AJS.$bytc("select")];
+AJS.map(AJS.flattenList(_b),function(_c){
+_c.style.visibility="visible";
+});
+GB_CURRENT=null;
+if(this.reload_on_close){
+window.location.reload();
+}
+},update:function(){
+this.setOverlayDimension();
+this.setFrameSize();
+this.setWindowPosition();
+},createElements:function(){
+this.initOverlay();
+this.g_window=AJS.DIV({"id":"GB_window"});
+AJS.hideElement(this.g_window);
+AJS.getBody().insertBefore(this.g_window,this.overlay.nextSibling);
+this.initFrame();
+this.initHook();
+this.update();
+var me=this;
+if(this.use_fx){
+AJS.fx.fadeIn(this.overlay,{duration:300,to:0.7,onComplete:function(){
+me.onShow();
+AJS.showElement(me.g_window);
+me.startLoading();
+}});
+}else{
+AJS.setOpacity(this.overlay,0.7);
+AJS.showElement(this.g_window);
+this.onShow();
+this.startLoading();
+}
+AJS.AEV(window,"scroll",_GB_setOverlayDimension);
+AJS.AEV(window,"resize",_GB_update);
+},removeFrame:function(){
+try{
+AJS.removeElement(this.iframe);
+}
+catch(e){
+}
+this.iframe=null;
+},startLoading:function(){
+this.iframe.src=this.src_loader+"?s="+this.salt++;
+AJS.showElement(this.iframe);
+},setOverlayDimension:function(){
+var _e=AJS.getWindowSize();
+if(AJS.isMozilla()||AJS.isOpera()){
+AJS.setWidth(this.overlay,"100%");
+}else{
+AJS.setWidth(this.overlay,_e.w);
+}
+var _f=Math.max(AJS.getScrollTop()+_e.h,AJS.getScrollTop()+this.height);
+if(_f<AJS.getScrollTop()){
+AJS.setHeight(this.overlay,_f);
+}else{
+AJS.setHeight(this.overlay,AJS.getScrollTop()+_e.h);
+}
+},initOverlay:function(){
+this.overlay=AJS.DIV({"id":"GB_overlay"});
+if(this.overlay_click_close){
+AJS.AEV(this.overlay,"click",GB_hide);
+}
+AJS.setOpacity(this.overlay,0);
+AJS.getBody().insertBefore(this.overlay,AJS.getBody().firstChild);
+},initFrame:function(){
+if(!this.iframe){
+var d={"name":"GB_frame","class":"GB_frame","frameBorder":0};
+this.iframe=AJS.IFRAME(d);
+this.middle_cnt=AJS.DIV({"class":"content"},this.iframe);
+this.top_cnt=AJS.DIV();
+this.bottom_cnt=AJS.DIV();
+AJS.ACN(this.g_window,this.top_cnt,this.middle_cnt,this.bottom_cnt);
+}
+},onHide:function(){
+},onShow:function(){
+},setFrameSize:function(){
+},setWindowPosition:function(){
+},initHook:function(){
+}});
+_GB_update=function(){
+if(GB_CURRENT){
+GB_CURRENT.update();
+}
+};
+_GB_setOverlayDimension=function(){
+if(GB_CURRENT){
+GB_CURRENT.setOverlayDimension();
+}
+};
+AJS.preloadImages(GB_ROOT_DIR+"indicator.gif");
+script_loaded=true;
+var GB_SETS={};
+function decoGreyboxLinks(){
+var as=AJS.$bytc("a");
+AJS.map(as,function(a){
+if(a.getAttribute("href")&&a.getAttribute("rel")){
+var rel=a.getAttribute("rel");
+if(rel.indexOf("gb_")==0){
+var _14=rel.match(/\w+/)[0];
+var _15=rel.match(/\[(.*)\]/)[1];
+var _16=0;
+var _17={"caption":a.title||"","url":a.href};
+if(_14=="gb_pageset"||_14=="gb_imageset"){
+if(!GB_SETS[_15]){
+GB_SETS[_15]=[];
+}
+GB_SETS[_15].push(_17);
+_16=GB_SETS[_15].length;
+}
+if(_14=="gb_pageset"){
+a.onclick=function(){
+GB_showFullScreenSet(GB_SETS[_15],_16);
+return false;
+};
+}
+if(_14=="gb_imageset"){
+a.onclick=function(){
+GB_showImageSet(GB_SETS[_15],_16);
+return false;
+};
+}
+if(_14=="gb_image"){
+a.onclick=function(){
+GB_showImage(_17.caption,_17.url);
+return false;
+};
+}
+if(_14=="gb_page"){
+a.onclick=function(){
+var sp=_15.split(/, ?/);
+GB_show(_17.caption,_17.url,parseInt(sp[1]),parseInt(sp[0]));
+return false;
+};
+}
+if(_14=="gb_page_fs"){
+a.onclick=function(){
+GB_showFullScreen(_17.caption,_17.url);
+return false;
+};
+}
+if(_14=="gb_page_center"){
+a.onclick=function(){
+var sp=_15.split(/, ?/);
+GB_showCenter(_17.caption,_17.url,parseInt(sp[1]),parseInt(sp[0]));
+return false;
+};
+}
+}
+}
+});
+}
+AJS.AEV(window,"load",decoGreyboxLinks);
+GB_showImage=function(_1a,url,_1c){
+var _1d={width:300,height:300,type:"image",fullscreen:false,center_win:true,caption:_1a,callback_fn:_1c};
+var win=new GB_Gallery(_1d);
+return win.show(url);
+};
+GB_showPage=function(_1f,url,_21){
+var _22={type:"page",caption:_1f,callback_fn:_21,fullscreen:true,center_win:false};
+var win=new GB_Gallery(_22);
+return win.show(url);
+};
+GB_Gallery=GreyBox.extend({init:function(_24){
+this.parent({});
+this.img_close=this.root_dir+"g_close.gif";
+AJS.update(this,_24);
+this.addCallback(this.callback_fn);
+},initHook:function(){
+AJS.addClass(this.g_window,"GB_Gallery");
+var _25=AJS.DIV({"class":"inner"});
+this.header=AJS.DIV({"class":"GB_header"},_25);
+AJS.setOpacity(this.header,0);
+AJS.getBody().insertBefore(this.header,this.overlay.nextSibling);
+var _26=AJS.TD({"id":"GB_caption","class":"caption","width":"40%"},this.caption);
+var _27=AJS.TD({"id":"GB_middle","class":"middle","width":"20%"});
+var _28=AJS.IMG({"src":this.img_close});
+AJS.AEV(_28,"click",GB_hide);
+var _29=AJS.TD({"class":"close","width":"40%"},_28);
+var _2a=AJS.TBODY(AJS.TR(_26,_27,_29));
+var _2b=AJS.TABLE({"cellspacing":"0","cellpadding":0,"border":0},_2a);
+AJS.ACN(_25,_2b);
+if(this.fullscreen){
+AJS.AEV(window,"scroll",AJS.$b(this.setWindowPosition,this));
+}else{
+AJS.AEV(window,"scroll",AJS.$b(this._setHeaderPos,this));
+}
+},setFrameSize:function(){
+var _2c=this.overlay.offsetWidth;
+var _2d=AJS.getWindowSize();
+if(this.fullscreen){
+this.width=_2c-40;
+this.height=_2d.h-80;
+}
+AJS.setWidth(this.iframe,this.width);
+AJS.setHeight(this.iframe,this.height);
+AJS.setWidth(this.header,_2c);
+},_setHeaderPos:function(){
+AJS.setTop(this.header,AJS.getScrollTop()+10);
+},setWindowPosition:function(){
+var _2e=this.overlay.offsetWidth;
+var _2f=AJS.getWindowSize();
+AJS.setLeft(this.g_window,((_2e-50-this.width)/2));
+var _30=AJS.getScrollTop()+55;
+if(!this.center_win){
+AJS.setTop(this.g_window,_30);
+}else{
+var fl=((_2f.h-this.height)/2)+20+AJS.getScrollTop();
+if(fl<0){
+fl=0;
+}
+if(_30>fl){
+fl=_30;
+}
+AJS.setTop(this.g_window,fl);
+}
+this._setHeaderPos();
+},onHide:function(){
+AJS.removeElement(this.header);
+AJS.removeClass(this.g_window,"GB_Gallery");
+},onShow:function(){
+if(this.use_fx){
+AJS.fx.fadeIn(this.header,{to:1});
+}else{
+AJS.setOpacity(this.header,1);
+}
+}});
+AJS.preloadImages(GB_ROOT_DIR+"g_close.gif");
+GB_showFullScreenSet=function(set,_33,_34){
+var _35={type:"page",fullscreen:true,center_win:false};
+var _36=new GB_Sets(_35,set);
+_36.addCallback(_34);
+_36.showSet(_33-1);
+return false;
+};
+GB_showImageSet=function(set,_38,_39){
+var _3a={type:"image",fullscreen:false,center_win:true,width:300,height:300};
+var _3b=new GB_Sets(_3a,set);
+_3b.addCallback(_39);
+_3b.showSet(_38-1);
+return false;
+};
+GB_Sets=GB_Gallery.extend({init:function(_3c,set){
+this.parent(_3c);
+if(!this.img_next){
+this.img_next=this.root_dir+"next.gif";
+}
+if(!this.img_prev){
+this.img_prev=this.root_dir+"prev.gif";
+}
+this.current_set=set;
+},showSet:function(_3e){
+this.current_index=_3e;
+var _3f=this.current_set[this.current_index];
+this.show(_3f.url);
+this._setCaption(_3f.caption);
+this.btn_prev=AJS.IMG({"class":"left",src:this.img_prev});
+this.btn_next=AJS.IMG({"class":"right",src:this.img_next});
+AJS.AEV(this.btn_prev,"click",AJS.$b(this.switchPrev,this));
+AJS.AEV(this.btn_next,"click",AJS.$b(this.switchNext,this));
+GB_STATUS=AJS.SPAN({"class":"GB_navStatus"});
+AJS.ACN(AJS.$("GB_middle"),this.btn_prev,GB_STATUS,this.btn_next);
+this.updateStatus();
+},updateStatus:function(){
+AJS.setHTML(GB_STATUS,(this.current_index+1)+" / "+this.current_set.length);
+if(this.current_index==0){
+AJS.addClass(this.btn_prev,"disabled");
+}else{
+AJS.removeClass(this.btn_prev,"disabled");
+}
+if(this.current_index==this.current_set.length-1){
+AJS.addClass(this.btn_next,"disabled");
+}else{
+AJS.removeClass(this.btn_next,"disabled");
+}
+},_setCaption:function(_40){
+AJS.setHTML(AJS.$("GB_caption"),_40);
+},updateFrame:function(){
+var _41=this.current_set[this.current_index];
+this._setCaption(_41.caption);
+this.url=_41.url;
+this.startLoading();
+},switchPrev:function(){
+if(this.current_index!=0){
+this.current_index--;
+this.updateFrame();
+this.updateStatus();
+}
+},switchNext:function(){
+if(this.current_index!=this.current_set.length-1){
+this.current_index++;
+this.updateFrame();
+this.updateStatus();
+}
+}});
+AJS.AEV(window,"load",function(){
+AJS.preloadImages(GB_ROOT_DIR+"next.gif",GB_ROOT_DIR+"prev.gif");
+});
+GB_show=function(_42,url,_44,_45,_46){
+var _47={caption:_42,height:_44||500,width:_45||500,fullscreen:false,callback_fn:_46};
+var win=new GB_Window(_47);
+return win.show(url);
+};
+GB_showCenter=function(_49,url,_4b,_4c,_4d){
+var _4e={caption:_49,center_win:true,height:_4b||500,width:_4c||500,fullscreen:false,callback_fn:_4d};
+var win=new GB_Window(_4e);
+return win.show(url);
+};
+GB_showFullScreen=function(_50,url,_52){
+var _53={caption:_50,fullscreen:true,callback_fn:_52};
+var win=new GB_Window(_53);
+return win.show(url);
+};
+GB_Window=GreyBox.extend({init:function(_55){
+this.parent({});
+this.img_header=this.root_dir+"header_bg.gif";
+this.img_close=this.root_dir+"w_close.gif";
+this.show_close_img=true;
+AJS.update(this,_55);
+this.addCallback(this.callback_fn);
+},initHook:function(){
+AJS.addClass(this.g_window,"GB_Window");
+this.header=AJS.TABLE({"class":"header"});
+this.header.style.backgroundImage="url("+this.img_header+")";
+var _56=AJS.TD({"class":"caption"},this.caption);
+var _57=AJS.TD({"class":"close"});
+if(this.show_close_img){
+var _58=AJS.IMG({"src":this.img_close});
+var _59=AJS.SPAN("Close");
+var btn=AJS.DIV(_58,_59);
+AJS.AEV([_58,_59],"mouseover",function(){
+AJS.addClass(_59,"on");
+});
+AJS.AEV([_58,_59],"mouseout",function(){
+AJS.removeClass(_59,"on");
+});
+AJS.AEV([_58,_59],"mousedown",function(){
+AJS.addClass(_59,"click");
+});
+AJS.AEV([_58,_59],"mouseup",function(){
+AJS.removeClass(_59,"click");
+});
+AJS.AEV([_58,_59],"click",GB_hide);
+AJS.ACN(_57,btn);
+}
+tbody_header=AJS.TBODY();
+AJS.ACN(tbody_header,AJS.TR(_56,_57));
+AJS.ACN(this.header,tbody_header);
+AJS.ACN(this.top_cnt,this.header);
+if(this.fullscreen){
+AJS.AEV(window,"scroll",AJS.$b(this.setWindowPosition,this));
+}
+},setFrameSize:function(){
+if(this.fullscreen){
+var _5b=AJS.getWindowSize();
+overlay_h=_5b.h;
+this.width=Math.round(this.overlay.offsetWidth-(this.overlay.offsetWidth/100)*10);
+this.height=Math.round(overlay_h-(overlay_h/100)*10);
+}
+AJS.setWidth(this.header,this.width+6);
+AJS.setWidth(this.iframe,this.width);
+AJS.setHeight(this.iframe,this.height);
+},setWindowPosition:function(){
+var _5c=AJS.getWindowSize();
+AJS.setLeft(this.g_window,((_5c.w-this.width)/2)-13);
+if(!this.center_win){
+AJS.setTop(this.g_window,AJS.getScrollTop());
+}else{
+var fl=((_5c.h-this.height)/2)-20+AJS.getScrollTop();
+if(fl<0){
+fl=0;
+}
+AJS.setTop(this.g_window,fl);
+}
+}});
+AJS.preloadImages(GB_ROOT_DIR+"w_close.gif",GB_ROOT_DIR+"header_bg.gif");
+
+
+script_loaded=true;
\ No newline at end of file
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/gb_styles.css b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/gb_styles.css
new file mode 100644 (file)
index 0000000..3fad900
--- /dev/null
@@ -0,0 +1,158 @@
+/* Last-Modified: 28/06/06 00:08:22 */
+#GB_overlay {
+    background-color: #000;
+    position: absolute;
+    margin: auto;
+    top: 0;
+    left: 0;
+    z-index: 100;
+}
+
+#GB_window {
+    left: 0;
+    top: 0;
+    font-size: 1px;
+    position: absolute;
+    overflow: visible;
+    z-index: 150;
+}
+
+#GB_window .content {
+    width: auto;
+    margin: 0;
+    padding: 0;
+}
+
+#GB_frame {
+    border: 0;
+    margin: 0;
+    padding: 0;
+    overflow: auto;
+    white-space: nowrap;
+}
+
+
+.GB_Gallery {
+    margin: 0 22px 0 22px;
+}
+
+.GB_Gallery .content {
+    background-color: #fff;
+    border: 3px solid #ddd;
+}
+
+.GB_header {
+    top: 10px;
+    left: 0;
+    margin: 0;
+    z-index: 500;
+    position: absolute;
+    border-bottom: 2px solid #555;
+    border-top: 2px solid #555;
+}
+
+.GB_header .inner {
+    background-color: #333;
+    font-family: Arial, Verdana, sans-serif;
+    padding: 2px 20px 2px 20px;
+}
+
+.GB_header table {
+    margin: 0;
+    width: 100%;
+    border-collapse: separate;
+    border-right: 0px;
+    border-top: 0px;
+}
+
+.GB_header td {
+    background-color: #333333;
+    border-bottom: 0px;
+    border-left: 0px;
+    padding: 0em 0em;
+}
+
+.GB_header .caption {
+    text-align: left;
+    color: #eee;
+    white-space: nowrap;
+    font-size: 20px;
+    border-collapse: separate;
+}
+
+.GB_header .close {
+    text-align: right;
+}
+
+.GB_header .close img {
+    z-index: 500;
+    cursor: pointer;
+}
+
+.GB_header .middle {
+    white-space: nowrap;
+    text-align: center;
+}
+
+
+#GB_middle {
+    color: #eee;
+}
+
+#GB_middle img {
+    cursor: pointer;
+    vertical-align: middle;
+}
+
+#GB_middle .disabled {
+    cursor: default;
+}
+
+#GB_middle .left {
+    padding-right: 10px;
+}
+
+#GB_middle .right {
+    padding-left: 10px;
+}
+
+
+.GB_Window .content {
+    background-color: #fff;
+    border: 3px solid #ccc;
+    border-top: none;
+}
+
+.GB_Window .header {
+    border-bottom: 1px solid #aaa;
+    border-top: 1px solid #999;
+    border-left: 3px solid #ccc;
+    border-right: 3px solid #ccc;
+    margin: 0;
+
+    height: 22px;
+    font-size: 12px;
+    padding: 3px 0;
+    color: #333;
+}
+
+.GB_Window .caption {
+    font-size: 12px;
+    text-align: left;
+    font-weight: bold;
+    white-space: nowrap;
+    padding-right: 20px;
+}
+
+.GB_Window .close { text-align: right; }
+.GB_Window .close span { 
+    font-size: 12px;
+    cursor: pointer; 
+}
+.GB_Window .close img {
+    cursor: pointer;
+    padding: 0 3px 0 0;
+}
+
+.GB_Window .on { border-bottom: 1px solid #333; }
+.GB_Window .click { border-bottom: 1px solid red; }
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/header_bg.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/header_bg.gif
new file mode 100644 (file)
index 0000000..3913cfd
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/header_bg.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/indicator.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/indicator.gif
new file mode 100644 (file)
index 0000000..02bdbdd
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/indicator.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/loader_frame.html b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/loader_frame.html
new file mode 100644 (file)
index 0000000..30dcb26
--- /dev/null
@@ -0,0 +1,104 @@
+<!--
+Notice: I feel so dirty doing this, but its the only way to make it cross browser.
+-->
+<html>
+<head>
+  <script>
+    var GB = parent.GB_CURRENT;
+    document.write('<script type="text/javascript" src="AJS.js"><\/script>');
+    if(GB.use_fx) {
+        document.write('<script type="text/javascript" src="AJS_fx.js"><\/script>');
+    }
+  </script>
+  <style>
+    body {
+      padding: 0;
+      margin: 0;
+      overflow: hidden;
+    }
+
+    #GB_frame {
+      visibility: hidden;
+      width: 100%;
+      height: 100%;
+    }
+
+    #loading {
+      padding-top: 50px;
+      position: absolute;
+      width: 100%;
+      top: 0;
+      text-align: center;
+      vertical-align: middle;
+    }
+  </style>
+</head>
+<body>
+
+<div id="loading">
+  <img src="indicator.gif">
+</div>
+
+<script>
+var loading = AJS.$('loading');
+var gb_type = GB.type;
+var gb_url = GB.url;
+
+//Start loading in the iframe
+if(gb_type == "page") {
+  document.write('<iframe id="GB_frame" src="' + gb_url + '" frameborder="0"></iframe>');
+}
+else {
+  var img_holder = new Image();
+  img_holder.src = gb_url;
+  document.write('<img id="GB_frame" src="' + gb_url + '">');
+}
+var frame = AJS.$('GB_frame');
+</script>
+
+</body>
+<script>
+function setupOuterGB() {
+    frame.style.visibility = 'visible';
+    GB.setFrameSize();
+    GB.setWindowPosition();
+}
+
+function loaded() {
+    AJS.removeElement(loading);
+
+    GB.overlay.innerHTML += "&nbsp;"; //Safari bugfix
+    
+    if(gb_type == "image") {
+        if(img_holder.width != 0 && img_holder.height != 0) {
+            var width = img_holder.width;
+            var height = img_holder.height;
+
+            GB.width = width;
+            GB.height = height;
+
+            setupOuterGB();
+
+            if(GB.use_fx) {
+                AJS.setOpacity(frame, 0);
+                AJS.fx.fadeIn(frame);
+            }
+        }
+    }
+    else {
+        GB.width = frame.offsetWidth;
+        GB.height = frame.offsetHeight;
+        setupOuterGB();
+    }
+}
+
+if(GB.show_loading) {
+    AJS.AEV(window, 'load', function(e) {
+        loaded();
+    });
+}
+else {
+    loaded();
+}
+</script>
+</html>
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/next.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/next.gif
new file mode 100644 (file)
index 0000000..c0f8908
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/next.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/prev.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/prev.gif
new file mode 100644 (file)
index 0000000..d20e095
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/prev.gif differ
diff --git a/koha-tmpl/opac-tmpl/prog/en/lib/greybox/w_close.gif b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/w_close.gif
new file mode 100644 (file)
index 0000000..3c05b15
Binary files /dev/null and b/koha-tmpl/opac-tmpl/prog/en/lib/greybox/w_close.gif differ
index 21ed412..85ac350 100644 (file)
@@ -8,12 +8,12 @@
 //]]>
 </script>
 <!-- TMPL_IF NAME="XSLTDetailsDisplay" --><script type="text/javascript">
-    var GB_ROOT_DIR = "/intranet-tmpl/prog/en/lib/greybox/";
+    var GB_ROOT_DIR = "/opac-tmpl/prog/en/lib/greybox/";
 </script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/AJS.js"></script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/AJS_fx.js"></script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/gb_scripts.js"></script>
-<link href="/intranet-tmpl/prog/en/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/AJS.js"></script>
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/AJS_fx.js"></script>
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/gb_scripts.js"></script>
+<link href="/opac-tmpl/prog/en/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
 <!-- /TMPL_IF -->
 </head>
 <body>
index 735cdc9..939fcfd 100644 (file)
@@ -1,12 +1,12 @@
 <!-- TMPL_INCLUDE NAME="doc-head-open.inc" --><!-- TMPL_IF NAME="LibraryNameTitle" --><!-- TMPL_VAR NAME="LibraryNameTitle" --><!-- TMPL_ELSE -->Koha Online<!-- /TMPL_IF --> Catalog &rsaquo;  MARC Details for Record No. <!-- TMPL_VAR name="biblionumber" -->
 <!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
 <!-- TMPL_IF NAME="XSLTDetailsDisplay" --><script type="text/javascript">
-    var GB_ROOT_DIR = "/intranet-tmpl/prog/en/lib/greybox/";
+    var GB_ROOT_DIR = "/opac-tmpl/prog/en/lib/greybox/";
 </script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/AJS.js"></script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/AJS_fx.js"></script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/gb_scripts.js"></script>
-<link href="/intranet-tmpl/prog/en/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/AJS.js"></script>
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/AJS_fx.js"></script>
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/gb_scripts.js"></script>
+<link href="/opac-tmpl/prog/en/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
 <!-- /TMPL_IF -->
 </head>
 <body>
index ae40837..ea5f188 100644 (file)
@@ -48,12 +48,12 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
     #addtagl { display: none; }
 </style>
 <!-- TMPL_IF NAME="XSLTDetailsDisplay" --><script type="text/javascript">
-    var GB_ROOT_DIR = "/intranet-tmpl/prog/en/lib/greybox/";                               
+    var GB_ROOT_DIR = "/opac-tmpl/prog/en/lib/greybox/";                               
 </script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/AJS.js"></script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/AJS_fx.js"></script>
-<script type="text/javascript" src="/intranet-tmpl/prog/en/lib/greybox/gb_scripts.js"></script>
-<link href="/intranet-tmpl/prog/en/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/AJS.js"></script>
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/AJS_fx.js"></script>
+<script type="text/javascript" src="/opac-tmpl/prog/en/lib/greybox/gb_scripts.js"></script>
+<link href="/opac-tmpl/prog/en/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
 <!-- /TMPL_IF -->
 
 </head>
index d853924..3d8a2e3 100644 (file)
                                          value="<!-- TMPL_VAR NAME="itemnumber" -->" />
                                 <!-- TMPL_ELSE -->
                                   <input disabled="disabled" type="radio" class="checkitem" name="checkitem" value="<!-- TMPL_VAR NAME="itemnumber" -->" />
-                                  <img src="/intranet-tmpl/<!-- TMPL_VAR NAME="theme" -->/img/famfamfam/silk/cross.png" alt="Cannot be put on hold" title="Cannot be put on hold" />
+                                  <img src="/opac-tmpl/<!-- TMPL_VAR NAME="theme" -->/famfamfam/silk/cross.png" alt="Cannot be put on hold" title="Cannot be put on hold" />
                                 <!-- /TMPL_IF --> <!-- TMPL_IF NAME="copynumber" --><!-- TMPL_VAR NAME="copynumber" --><!-- /TMPL_IF -->
                               </td>
                               <!-- TMPL_IF NAME="item-level_itypes" -->