| | |
| | | this.ie = (document.all) ? true : false; |
| | | this.ie4 = (this.ie && !this.dom); |
| | | this.ie5 = (this.dom && this.appver.indexOf('MSIE 5')>0); |
| | | this.ie6 = (this.dom && this.appver.indexOf('MSIE 6')>0); |
| | | this.ie8 = (this.dom && this.appver.indexOf('MSIE 8')>0); |
| | | this.ie7 = (this.dom && this.appver.indexOf('MSIE 7')>0); |
| | | this.ie6 = (this.dom && !this.ie8 && !this.ie7 && this.appver.indexOf('MSIE 6')>0); |
| | | |
| | | this.mz = (this.dom && this.ver>=5); // (this.dom && this.product=='Gecko') |
| | | this.ns = ((this.ver<5 && this.name=='Netscape') || (this.ver>=5 && this.vendor.indexOf('Netscape')>=0)); |
| | |
| | | } |
| | | |
| | | |
| | | // static functions for event handling |
| | | // static functions for DOM event handling |
| | | var rcube_event = { |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | if (e._offset) { |
| | | mX += e._offset.x; |
| | | mY += e._offset.y; |
| | | mX += e._offset.left; |
| | | mY += e._offset.top; |
| | | } |
| | | |
| | | return { x:mX, y:mY }; |
| | |
| | | }; |
| | | |
| | | |
| | | var rcube_layer_objects = new Array(); |
| | | /** |
| | | * rcmail objects event interface |
| | | */ |
| | | function rcube_event_engine() |
| | | { |
| | | this._events = {}; |
| | | } |
| | | |
| | | rcube_event_engine.prototype = { |
| | | |
| | | /** |
| | | * Setter for object event handlers |
| | | * |
| | | * @param {String} Event name |
| | | * @param {Function} Handler function |
| | | * @return Listener ID (used to remove this handler later on) |
| | | */ |
| | | addEventListener: function(evt, func, obj) |
| | | { |
| | | if (!this._events) |
| | | this._events = {}; |
| | | if (!this._events[evt]) |
| | | this._events[evt] = []; |
| | | |
| | | var e = {func:func, obj:obj ? obj : window}; |
| | | this._events[evt][this._events[evt].length] = e; |
| | | }, |
| | | |
| | | /** |
| | | * Removes a specific event listener |
| | | * |
| | | * @param {String} Event name |
| | | * @param {Int} Listener ID to remove |
| | | */ |
| | | removeEventListener: function(evt, func, obj) |
| | | { |
| | | if (typeof obj == 'undefined') |
| | | obj = window; |
| | | |
| | | for (var h,i=0; this._events && this._events[evt] && i < this._events[evt].length; i++) |
| | | if ((h = this._events[evt][i]) && h.func == func && h.obj == obj) |
| | | this._events[evt][i] = null; |
| | | }, |
| | | |
| | | /** |
| | | * This will execute all registered event handlers |
| | | * |
| | | * @param {String} Event to trigger |
| | | * @param {Object} Event object/arguments |
| | | */ |
| | | triggerEvent: function(evt, e) |
| | | { |
| | | var ret, h; |
| | | if (typeof e == 'undefined') |
| | | e = this; |
| | | else if (typeof e == 'object') |
| | | e.event = evt; |
| | | |
| | | if (this._events && this._events[evt] && !this._event_exec) { |
| | | this._event_exec = true; |
| | | for (var i=0; i < this._events[evt].length; i++) { |
| | | if ((h = this._events[evt][i])) { |
| | | if (typeof h.func == 'function') |
| | | ret = h.func.call ? h.func.call(h.obj, e) : h.func(e); |
| | | else if (typeof h.obj[h.func] == 'function') |
| | | ret = h.obj[h.func](e); |
| | | |
| | | // cancel event execution |
| | | if (typeof ret != 'undefined' && !ret) |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | this._event_exec = false; |
| | | return ret; |
| | | } |
| | | |
| | | } // end rcube_event_engine.prototype |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | * @constructor |
| | | */ |
| | | function rcube_layer(id, attributes) |
| | | { |
| | | { |
| | | this.name = id; |
| | | |
| | | // create a new layer in the current document |
| | |
| | | this.y = parseInt(this.elm.offsetTop); |
| | | this.visible = (this.css.visibility=='visible' || this.css.visibility=='show' || this.css.visibility=='inherit') ? true : false; |
| | | |
| | | this.id = rcube_layer_objects.length; |
| | | this.obj = 'rcube_layer_objects['+this.id+']'; |
| | | rcube_layer_objects[this.id] = this; |
| | | |
| | | |
| | | // ********* layer object methods ********* |
| | | |
| | |
| | | this.css.top = Math.round(this.y)+'px'; |
| | | } |
| | | |
| | | |
| | | // move the layer for a specific step |
| | | this.shift = function(x,y) |
| | | { |
| | | x = Math.round(x*100)/100; |
| | | y = Math.round(y*100)/100; |
| | | this.move(this.x+x, this.y+y); |
| | | } |
| | | |
| | | |
| | | // change the layers width and height |
| | | this.resize = function(w,h) |
| | | { |
| | |
| | | this.css.height = h+'px'; |
| | | this.width = w; |
| | | this.height = h; |
| | | } |
| | | |
| | | |
| | | // cut the layer (top,width,height,left) |
| | | this.clip = function(t,w,h,l) |
| | | { |
| | | this.css.clip='rect('+t+' '+w+' '+h+' '+l+')'; |
| | | this.clip_height = h; |
| | | this.clip_width = w; |
| | | } |
| | | |
| | | |
| | |
| | | this.elm.innerHTML = cont; |
| | | } |
| | | |
| | | |
| | | // set the given color to the layer background |
| | | this.set_bgcolor = function(c) |
| | | { |
| | | if(!c || c=='#') |
| | | c = 'transparent'; |
| | | |
| | | this.css.backgroundColor = c; |
| | | } |
| | | |
| | | |
| | | // set the opacity of a layer to the given ammount (in %) |
| | | this.set_opacity = function(v) |
| | | { |
| | | if(!bw.opacity) |
| | | return; |
| | | |
| | | var op = v<=1 ? Math.round(v*100) : parseInt(v); |
| | | |
| | | if(bw.ie) |
| | | this.css.filter = 'alpha(opacity:'+op+')'; |
| | | else if(bw.safari) |
| | | { |
| | | this.css.opacity = op/100; |
| | | this.css.KhtmlOpacity = op/100; |
| | | } |
| | | else if(bw.mz) |
| | | this.css.MozOpacity = op/100; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | // check if input is a valid email address |
| | |
| | | } |
| | | |
| | | |
| | | // find a value in a specific array and returns the index |
| | | function find_in_array() |
| | | { |
| | | var args = find_in_array.arguments; |
| | | if(!args.length) return -1; |
| | | |
| | | var haystack = typeof(args[0])=='object' ? args[0] : args.length>1 && typeof(args[1])=='object' ? args[1] : new Array(); |
| | | var needle = typeof(args[0])!='object' ? args[0] : args.length>1 && typeof(args[1])!='object' ? args[1] : ''; |
| | | var nocase = args.length==3 ? args[2] : false; |
| | | |
| | | if(!haystack.length) return -1; |
| | | |
| | | for(var i=0; i<haystack.length; i++) |
| | | if(nocase && haystack[i].toLowerCase()==needle.toLowerCase()) |
| | | return i; |
| | | else if(haystack[i]==needle) |
| | | return i; |
| | | |
| | | return -1; |
| | | // recursively copy an object |
| | | function rcube_clone_object(obj) |
| | | { |
| | | var out = {}; |
| | | |
| | | for (var key in obj) { |
| | | if (obj[key] && typeof obj[key] == 'object') |
| | | out[key] = clone_object(obj[key]); |
| | | else |
| | | out[key] = obj[key]; |
| | | } |
| | | |
| | | |
| | | return out; |
| | | } |
| | | |
| | | // make a string URL safe |
| | | function urlencode(str) |
| | |
| | | |
| | | // get any type of html objects by id/name |
| | | function rcube_find_object(id, d) |
| | | { |
| | | { |
| | | var n, f, obj, e; |
| | | if(!d) d = document; |
| | | |
| | |
| | | if(!obj && d.images.length) |
| | | obj = d.images[id]; |
| | | |
| | | if(!obj && d.forms.length) |
| | | for(f=0; f<d.forms.length; f++) |
| | | { |
| | | if (!obj && d.forms.length) { |
| | | for (f=0; f<d.forms.length; f++) { |
| | | if(d.forms[f].name == id) |
| | | obj = d.forms[f]; |
| | | else if(d.forms[f].elements[id]) |
| | | obj = d.forms[f].elements[id]; |
| | | } |
| | | |
| | | if(!obj && d.layers) |
| | | { |
| | | if(d.layers[id]) obj = d.layers[id]; |
| | | for(n=0; !obj && n<d.layers.length; n++) |
| | | obj = rcube_find_object(id, d.layers[n].document); |
| | | } |
| | | } |
| | | |
| | | if (!obj && d.layers) { |
| | | if (d.layers[id]) obj = d.layers[id]; |
| | | for (n=0; !obj && n<d.layers.length; n++) |
| | | obj = rcube_find_object(id, d.layers[n].document); |
| | | } |
| | | |
| | | return obj; |
| | | } |
| | | |
| | | |
| | | // return the absolute position of an object within the document |
| | | function rcube_get_object_pos(obj, relative) |
| | | { |
| | | if(typeof(obj)=='string') |
| | | obj = rcube_find_object(obj); |
| | | |
| | | if(!obj) return {x:0, y:0}; |
| | | |
| | | var iX = (bw.layers) ? obj.x : obj.offsetLeft; |
| | | var iY = (bw.layers) ? obj.y : obj.offsetTop; |
| | | |
| | | if(!relative && (bw.ie || bw.mz)) |
| | | { |
| | | var elm = obj.offsetParent; |
| | | while(elm && elm!=null) |
| | | { |
| | | iX += elm.offsetLeft - (elm.parentNode && elm.parentNode.scrollLeft ? elm.parentNode.scrollLeft : 0); |
| | | iY += elm.offsetTop - (elm.parentNode && elm.parentNode.scrollTop ? elm.parentNode.scrollTop : 0); |
| | | elm = elm.offsetParent; |
| | | } |
| | | } |
| | | |
| | | return {x:iX, y:iY}; |
| | | } |
| | | } |
| | | |
| | | // determine whether the mouse is over the given object or not |
| | | function rcube_mouse_is_over(ev, obj) |
| | | { |
| | | var mouse = rcube_event.get_mouse_pos(ev); |
| | | var pos = rcube_get_object_pos(obj); |
| | | |
| | | return ((mouse.x >= pos.x) && (mouse.x < (pos.x + obj.offsetWidth)) && |
| | | (mouse.y >= pos.y) && (mouse.y < (pos.y + obj.offsetHeight))); |
| | | var pos = $(obj).offset(); |
| | | |
| | | return ((mouse.x >= pos.left) && (mouse.x < (pos.left + obj.offsetWidth)) && |
| | | (mouse.y >= pos.top) && (mouse.y < (pos.top + obj.offsetHeight))); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Return the currently applied value of a css property |
| | | * |
| | | * @param {Object} html_element Node reference |
| | | * @param {String} css_property Property name to read in Javascript notation (eg. 'textAlign') |
| | | * @param {String} mozilla_equivalent Equivalent property name in CSS notation (eg. 'text-align') |
| | | * @return CSS property value |
| | | * @type String |
| | | */ |
| | | function get_elements_computed_style(html_element, css_property, mozilla_equivalent) |
| | | { |
| | | if (arguments.length==2) |
| | | mozilla_equivalent = css_property; |
| | | |
| | | var el = html_element; |
| | | if (typeof(html_element)=='string') |
| | | el = rcube_find_object(html_element); |
| | | |
| | | if (el && el.currentStyle) |
| | | return el.currentStyle[css_property]; |
| | | else if (el && document.defaultView && document.defaultView.getComputedStyle) |
| | | return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozilla_equivalent); |
| | | else |
| | | return false; |
| | | } |
| | | |
| | | |
| | | // cookie functions by GoogieSpell |
| | | function setCookie(name, value, expires, path, domain, secure) |
| | |
| | | |
| | | roundcube_browser.prototype.get_cookie = getCookie; |
| | | |
| | | |
| | | // tiny replacement for Firebox functionality |
| | | function rcube_console() |
| | | { |
| | | this.log = function(msg) |
| | | { |
| | | box = rcube_find_object('console'); |
| | | var box = rcube_find_object('dbgconsole'); |
| | | |
| | | if (box) |
| | | if (box) { |
| | | if (msg.charAt(msg.length-1)=='\n') |
| | | box.value += msg+'--------------------------------------\n'; |
| | | msg += '--------------------------------------\n'; |
| | | else |
| | | box.value += msg+'\n--------------------------------------\n'; |
| | | msg += '\n--------------------------------------\n'; |
| | | |
| | | // Konqueror doesn't allows to just change value of hidden element |
| | | if (bw.konq) { |
| | | box.innerText += msg; |
| | | box.value = box.innerText; |
| | | } else |
| | | box.value += msg; |
| | | } |
| | | }; |
| | | |
| | | this.reset = function() |
| | | { |
| | | box = rcube_find_object('console'); |
| | | var box = rcube_find_object('dbgconsole'); |
| | | if (box) |
| | | box.value = ''; |
| | | box.innerText = box.value = ''; |
| | | }; |
| | | } |
| | | |
| | | var bw = new roundcube_browser(); |
| | | |
| | | if (!window.console) |
| | | if (!window.console) |
| | | console = new rcube_console(); |
| | | |
| | | |
| | |
| | | return o; |
| | | } |
| | | } |
| | | |
| | | |
| | | // Fire event on specified element |
| | | function exec_event(element,event) |
| | | { |
| | | if (document.createEventObject) { |
| | | // dispatch for IE |
| | | var evt = document.createEventObject(); |
| | | return element.fireEvent('on'+event,evt) |
| | | } |
| | | else { |
| | | // dispatch for firefox + others |
| | | var evt = document.createEvent("HTMLEvents"); |
| | | evt.initEvent(event, true, true); // event type,bubbling,cancelable |
| | | return !element.dispatchEvent(evt); |
| | | } |
| | | } |