thomascube
2010-04-01 1d773d71414316e0b9836a15c35576593427ee21
program/js/common.js
@@ -48,8 +48,9 @@
  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));
@@ -93,7 +94,7 @@
  }
// static functions for event handling
// static functions for DOM event handling
var rcube_event = {
/**
@@ -156,6 +157,11 @@
  {
    mX += document.body.scrollLeft;
    mY += document.body.scrollTop;
  }
  if (e._offset) {
    mX += e._offset.left;
    mY += e._offset.top;
  }
  return { x:mX, y:mY };
@@ -229,7 +235,86 @@
};
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
/**
@@ -238,7 +323,7 @@
 * @constructor
 */
function rcube_layer(id, attributes)
  {
{
  this.name = id;
  
  // create a new layer in the current document
@@ -305,10 +390,6 @@
  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 *********
@@ -322,16 +403,6 @@
    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)
    {
@@ -339,15 +410,6 @@
    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;
    }
@@ -378,36 +440,7 @@
    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
@@ -436,27 +469,20 @@
  }
  
// 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)
@@ -467,7 +493,7 @@
// get any type of html objects by id/name
function rcube_find_object(id, d)
  {
{
  var n, f, obj, e;
  if(!d) d = document;
@@ -481,88 +507,34 @@
  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)
@@ -597,32 +569,38 @@
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();
@@ -650,20 +628,3 @@
    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);
   }
}