/*
 Script: Occlude.js
 Prevents a class from being applied to a DOM element twice.
 License:
 http://www.clientcide.com/wiki/cnet-libraries#license
 */
var Occlude = new Class({
  // usage: if(this.occlude()) return this.occluded;
  occlude: function(property, element)
  {
    element = $(element || this.element);
    var instance = element.retrieve(property || this.property);
    if (instance && (this.occluded === null || this.occluded)) 
    {
      this.occluded = instance;
    }
    else 
    {
      this.occluded = false;
      element.store(property || this.property, this);
    }
    return this.occluded || false;
  }
});

/*
 Script: ToElement.js
 Defines the toElement method for a class.
 License:
 http://www.clientcide.com/wiki/cnet-libraries#license
 */
var ToElement = new Class({
  toElement: function()
  {
    return this.element;
  }
});

String.prototype.scaleImage = function(o)
{
  var u = this;
  u = u.replace(/media\//, 'media/_generate/');
  u = u.split(/\./);
  var l = u.pop();
  u.push(o);
  u.push(l);
  u = u.join('.');
  return u;
}

String.prototype.scaleImageWH = function(w, h)
{
  return this.scaleImage('w' + w + '.h' + h);
}

String.prototype.scaleImageWHFill = function(w, h)
{
  return this.scaleImage('w' + w + '.h' + h + '.fill');
}


Element.prototype.hasChildNodes = function()
{
  if (this.getFirst()) 
  {
    return true;
  }
  return false;
};


function addPunctuation(nStr)
{
  nStr += '';
  x = nStr.split('.');
  console.log(x);
  x1 = x[0];
  x2 = x.length > 1 ? '.' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) 
  {
    x1 = x1.replace(rgx, '$1' + '.' + '$2');
  }
  return x1 + x2;
}

function number_format(number, decimals, dec_point, thousands_sep)
{
  // Format a number with grouped thousands
  // 
  // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
  // +       version: 809.2411
  // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +     bugfix by: Michael White (http://getsprink.com)
  // +     bugfix by: Benjamin Lupton
  // +     bugfix by: Allan Jensen (http://www.winternet.no)
  // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // +     bugfix by: Howard Yeend
  // *     example 1: number_format(1234.5678, 2, '.', '');
  // *     returns 1: 1234.57     
  
  var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
  var d = dec_point == undefined ? "." : dec_point;
  var t = thousands_sep == undefined ? "," : thousands_sep, s = n < 0 ? "-" : "";
  var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
  
  return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}// }}}
function utf8_encode(string)
{
  // http://kevin.vanzonneveld.net
  // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   improved by: sowberry
  // +    tweaked by: Jack
  // +   bugfixed by: Onno Marsman
  // +   improved by: Yves Sucaet
  // +   bugfixed by: Onno Marsman
  // *     example 1: utf8_encode('Kevin van Zonneveld');
  // *     returns 1: 'Kevin van Zonneveld'
  
  string = (string + '').replace(/\r\n/g, "\n").replace(/\r/g, "\n");
  
  var utftext = "";
  var start, end;
  var stringl = 0;
  
  start = end = 0;
  stringl = string.length;
  for (var n = 0; n < stringl; n++) 
  {
    var c1 = string.charCodeAt(n);
    var enc = null;
    
    if (c1 < 128) 
    {
      end++;
    }
    else 
      if ((c1 > 127) && (c1 < 2048)) 
      {
        enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
      }
      else 
      {
        enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
      }
    if (enc != null) 
    {
      if (end > start) 
      {
        utftext += string.substring(start, end);
      }
      utftext += enc;
      start = end = n + 1;
    }
  }
  
  if (end > start) 
  {
    utftext += string.substring(start, string.length);
  }
  
  return utftext;
}

function md5(str)
{
  // http://kevin.vanzonneveld.net
  // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
  // + namespaced by: Michael White (http://getsprink.com)
  // +    tweaked by: Jack
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // -    depends on: utf8_encode
  // *     example 1: md5('Kevin van Zonneveld');
  // *     returns 1: '6e658d4bfcb59cc13f96c14450ac40b9'
  
  var RotateLeft = function(lValue, iShiftBits)
  {
    return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
  };
  
  var AddUnsigned = function(lX, lY)
  {
    var lX4, lY4, lX8, lY8, lResult;
    lX8 = (lX & 0x80000000);
    lY8 = (lY & 0x80000000);
    lX4 = (lX & 0x40000000);
    lY4 = (lY & 0x40000000);
    lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
    if (lX4 & lY4) 
    {
      return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
    }
    if (lX4 | lY4) 
    {
      if (lResult & 0x40000000) 
      {
        return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
      }
      else 
      {
        return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
      }
    }
    else 
    {
      return (lResult ^ lX8 ^ lY8);
    }
  };
  
  var F = function(x, y, z)
  {
    return (x & y) | ((~ x) & z);
  };
  var G = function(x, y, z)
  {
    return (x & z) | (y & (~ z));
  };
  var H = function(x, y, z)
  {
    return (x ^ y ^ z);
  };
  var I = function(x, y, z)
  {
    return (y ^ (x | (~ z)));
  };
  
  var FF = function(a, b, c, d, x, s, ac)
  {
    a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
    return AddUnsigned(RotateLeft(a, s), b);
  };
  
  var GG = function(a, b, c, d, x, s, ac)
  {
    a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
    return AddUnsigned(RotateLeft(a, s), b);
  };
  
  var HH = function(a, b, c, d, x, s, ac)
  {
    a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
    return AddUnsigned(RotateLeft(a, s), b);
  };
  
  var II = function(a, b, c, d, x, s, ac)
  {
    a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
    return AddUnsigned(RotateLeft(a, s), b);
  };
  
  var ConvertToWordArray = function(str)
  {
    var lWordCount;
    var lMessageLength = str.length;
    var lNumberOfWords_temp1 = lMessageLength + 8;
    var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
    var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
    var lWordArray = Array(lNumberOfWords - 1);
    var lBytePosition = 0;
    var lByteCount = 0;
    while (lByteCount < lMessageLength) 
    {
      lWordCount = (lByteCount - (lByteCount % 4)) / 4;
      lBytePosition = (lByteCount % 4) * 8;
      lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount) << lBytePosition));
      lByteCount++;
    }
    lWordCount = (lByteCount - (lByteCount % 4)) / 4;
    lBytePosition = (lByteCount % 4) * 8;
    lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
    lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
    lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
    return lWordArray;
  };
  
  var WordToHex = function(lValue)
  {
    var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount;
    for (lCount = 0; lCount <= 3; lCount++) 
    {
      lByte = (lValue >>> (lCount * 8)) & 255;
      WordToHexValue_temp = "0" + lByte.toString(16);
      WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
    }
    return WordToHexValue;
  };
  
  var x = Array();
  var k, AA, BB, CC, DD, a, b, c, d;
  var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
  var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
  var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
  var S41 = 6, S42 = 10, S43 = 15, S44 = 21;
  
  str = utf8_encode(str);
  x = ConvertToWordArray(str);
  a = 0x67452301;
  b = 0xEFCDAB89;
  c = 0x98BADCFE;
  d = 0x10325476;
  
  xl = x.length;
  for (k = 0; k < xl; k += 16) 
  {
    AA = a;
    BB = b;
    CC = c;
    DD = d;
    a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
    d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
    c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
    b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
    a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
    d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
    c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
    b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
    a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
    d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
    c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
    b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
    a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
    d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
    c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
    b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
    a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
    d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
    c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
    b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
    a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
    d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
    c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
    b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
    a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
    d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
    c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
    b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
    a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
    d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
    c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
    b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
    a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
    d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
    c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
    b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
    a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
    d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
    c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
    b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
    a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
    d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
    c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
    b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
    a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
    d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
    c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
    b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
    a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
    d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
    c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
    b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
    a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
    d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
    c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
    b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
    a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
    d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
    c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
    b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
    a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
    d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
    c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
    b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
    a = AddUnsigned(a, AA);
    b = AddUnsigned(b, BB);
    c = AddUnsigned(c, CC);
    d = AddUnsigned(d, DD);
  }
  
  var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
  
  return temp.toLowerCase();
}


String.prototype.countOcc = function(c)
{
  str = this;
  count = 0;
  pos = str.indexOf(c);
  while (pos != -1) 
  {
    count++;
    pos = str.indexOf(c, pos + 1);
  }
  
  return count;
}
Sortables.prototype.serialize = function()
{
  var params = Array.link(arguments, {
    modifier: Function.type,
    index: $defined
  });
  this.serialized = {};
  this.lists.map(function(list)
  {
    this.serialized[list.get('id')] = list.getChildren().map(params.modifier ||
    function(element)
    {
      return element.get('id');
    }, this);
  }, this);
  console.dir(this.serialized);
  return this.serialized;
  
  var index = params.index;
  if (this.lists.length == 1) 
    index = 0;
  return $chk(index) && index >= 0 && index < this.lists.length ? serial[index] : serial;
}


DFP_InlinePopup = {
   elBlend: null
  ,elScreen: null
  ,show: function(o)
  {
    this.init(o);
    
    new Request({
       url: o.u
      ,onComplete: this.showReceive.bind(this)
    }).send();
  }
  
  ,showReceive: function(r)
  {
    this.elScreenInner.set('html', r);
    try 
    {
      Slimbox.scanPage();
    } 
    catch (e) 
    {
    }
    try 
    {
      NMT_ArtDetail.init();
    } 
    catch (e) 
    {
    }
  }
  
  ,evtScroll: function()
  {
    coord = window.getSize();
    this.elScreen.setStyles({
      top: Math.floor((coord.y - 600) / 2) + window.getScroll().y
    });   
  }
  
  ,evtClose: function()
  {
    this.elBlend.destroy();
    this.elScreen.destroy();
    window.removeEvent('scroll', this.evtScroll.bind(this));
    
    this.elBlend = null;
    this.elScreen = null;
  }
  
  ,init: function()
  {
    if (!this.elBlend)
    {
      this.elBlend       = new Element('div');
      this.elScreen      = new Element('div');  
      this.elScreenInner = new Element('div');    
    
      this.elBlend.addEvent('click', this.evtClose.bind(this));
      window.addEvent('scroll', this.evtScroll.bind(this));
      
      coord = window.getScrollSize();
      this.elBlend.setStyles({
         position: 'absolute'
        ,top: 0
        ,left: 0
        ,width: coord.x
        ,height: coord.y
        ,backgroundColor: 'black'
        ,opacity: 0.7
      });  
    
      this.elScreen  = new Element('div');
  
      coord = window.getSize();
      this.elScreen.setStyles({
         position: 'absolute'
        ,top: Math.floor((coord.y - 600) / 2) + window.getScroll().y
        ,left: Math.floor((coord.x - 800) / 2)
        ,width: 800
        ,height: 600
        ,backgroundColor: 'white'
        ,overflow: 'auto'
      });
      
      this.elScreenInner.setStyles({
         margin: 10
      });
    
      document.getElement('body').adopt(this.elBlend);
      document.getElement('body').adopt(this.elScreen);
      this.elScreen.adopt(this.elScreenInner);
      
    }
  }
};


window.newPopUp = function(o)
{
  o.w = o.w ? o.w : 600;
  o.h = o.h ? o.h : 480;
  o.c = Util.centerScreen(o.w, o.h);
  
  if (o.inWindow)
  {
    o.o = 'scrollbars=yes,width=' + o.w + ',height=' + o.h + ',screenX=' + o.c.x + ',screenY=' + o.c.y;
    window.open(o.u, '', o.o);
  }
  else
  {
    DFP_InlinePopup.show(o);
  }
}

function popUp(URL, Options, Unique)
{
  var width = Options.split(/,/)[0];
  var height = Options.split(/,/)[1];
  
  width = width.split(/=/)[1];
  height = height.split(/=/)[1];
  
  var c = Util.centerScreen(width, height);
  
  Options += ',screenX=' + c.x +
  ',screenY=' +
  c.y;
  
  //    if (true == Unique)
  //    {
  window.open(URL, '', Options);
  //    }
  //    else
  //    {
  //        PopUp = window.open(URL, "Zweitfenster", Options);
  //        PopUp.focus();
  //    }
}



var Util = {
  
  ucFirst: function(Str)
  {
        var F = Str.substr(0, 1);
        var R = Str.substr(1, Str.length - 1);
      return F.toUpperCase() + R.toLowerCase();
  },
  
    snapTo: function(Snap, To, Style, OffSet, Options)
    {
        if (!arguments[2])
        {
            Style = 'lud';
        }

        if (!arguments[3])
        {
            OffSet = {x: 0, Y: 0};
        }

        if (!arguments[4])
        {
            Options = {noTransition: false};
        }
            
    if (!OffSet.x)
    {
      OffSet = {x: OffSet, y: OffSet};
    }

        to      = {x: 0, y: 0};
        SnapTo  = To.getCoordinates();
        SnapTo.x = SnapTo.left;
        SnapTo.y = SnapTo.top;
        console.log(SnapTo);
//        c = getClientDimension();
        Screen = Util.innerDimension();
        Screen.x -= 30; // Scrollbar

        var Probe = {x: 0, y: 0};
        
        console.log('SNapStyle: ' + Style);
        
        switch (Style)
        {
            case 'ruh' :
                to.x    = OffSet.x;
                to.y    = SnapTo.y;
                break;
            case 'rud' :
                to.x    = SnapTo.x + To.offsetWidth + OffSet;
                Probe.x = to.x + Snap.offsetWidth;
                if (Probe.x > Screen.x)
                    to.x    = SnapTo.x + To.offsetWidth + OffSet - (Probe.x - Screen.x);

                to.y    = SnapTo.y - Snap.offsetHeight - OffSet;
                if (to.y < 1)
                    to.y    = SnapTo.y + To.offsetHeight + OffSet;
                break;

            case 'lud' :
                to.x    = SnapTo.x - Snap.offsetWidth - OffSet;
                if (to.x < 1)
                    to.x    = SnapTo.x - Snap.offsetWidth - OffSet + (Math.abs(to.x));

                to.y    = SnapTo.y - Snap.offsetHeight - OffSet;
                if (to.y < 1)
                    to.y    = SnapTo.y + To.offsetHeight + OffSet;
                break;

            case 'luh' :
                to.x    = SnapTo.x - Snap.offsetWidth - OffSet;
                if (to.x < 1)
                    to.x    = SnapTo.x - Snap.offsetWidth - OffSet + (Math.abs(to.x));

                to.y    = SnapTo.y;
                break;

            case 'luv' :
                to.x    = SnapTo.x;
                to.y    = SnapTo.y - OffSet - Snap.offsetHeight;
                break;

            case 'rbv' :
                to.x    = SnapTo.x + To.offsetWidth - Snap.offsetWidth;
                if (to.x < 1)
                    to.x    = 0;


                to.y    = SnapTo.y + To.offsetHeight + OffSet;
//                if (to.y > Screen.y)
//                    to.y    = SnapTo.y - Snap.offsetHeight - OffSet;
                break;

            case 'lbv' :
                to.x    = SnapTo.x;
                if (to.x + Snap.offsetWidth > Screen.x)
                    to.x    = Screen.x - Snap.offsetWidth;


                to.y    = SnapTo.y + To.offsetHeight + OffSet;
                if (to.y > Screen.y)
                    to.y    = SnapTo.y - Snap.offsetHeight - OffSet;
                break;

            case 'lu' :
                leftPos     = SnapTo.x + To.offsetWidth + Snap.offsetWidth;
                bottomPos   = SnapTo.y + To.offsetHeight + Snap.offsetHeight;
                
                if (leftPos > Screen.x)
                {
                    to.x = SnapTo.x - OffSet - Snap.offsetWidth;
                }
                else
                {
                    to.x = SnapTo.x + OffSet + To.offsetWidth;
                }
                
                if (bottomPos > Screen.y)
                {
                    to.y = SnapTo.y - Snap.offsetHeight + To.offsetHeight;
                }
                else
                {
                    to.y = SnapTo.y;
                }
                break;
                
            case 'lb' :
                leftPos = SnapTo.x + Snap.offsetWidth;
                bottomPos = SnapTo.y + To.offsetHeight + Snap.offsetHeight;
                
                if (leftPos > Screen.x)
                {
                    to.x = SnapTo.x + To.offsetWidth - OffSet - Snap.offsetWidth;
                }
                else
                {
                    to.x = SnapTo.x;
                }
                
                if (bottomPos > Screen.y)
                {
                    to.y = SnapTo.y - Snap.offsetHeight + To.offsetHeight;
                }
                else
                {
                    to.y = SnapTo.y + OffSet + To.offsetHeight;
                }
                break;
        }
        console.log(to);
        
        if (to.y < Util.scrollingOffset().y)
        {
            to.y = Util.scrollingOffset().y;
        }
        
        
        console.log(to);
        
        if (Options.noTransition)
        {
          Snap.style.left     = parseInt(to.x) + 'px';
          Snap.style.top      = parseInt(to.y) + 'px';
        }
        else
        {
      var exampleFx = new Fx.Styles(Snap);
      exampleFx.start({
        'left':[parseInt(Snap.style.left),to.x],
        'top':[parseInt(Snap.style.top),to.y]
      });
        }
    },

    pageDimension: function()
    {
        var x,y;
        var test1 = document.body.scrollHeight;
        var test2 = document.body.offsetHeight
        if (test1 > test2) // all but Explorer Mac
        {
          x = document.body.scrollWidth;
          y = document.body.scrollHeight;
        }
        else // Explorer Mac;
             //would also work in Explorer 6 Strict, Mozilla and Safari
        {
          x = document.body.offsetWidth;
          y = document.body.offsetHeight;
        }
    
    return {x: x, y: y};
    },

  scrollingOffset: function()
  {
    var x,y;
    if (self.pageYOffset) // all except Explorer
    {
      x = self.pageXOffset;
      y = self.pageYOffset;
    }
    else if (document.documentElement && document.documentElement.scrollTop)
      // Explorer 6 Strict
    {
      x = document.documentElement.scrollLeft;
      y = document.documentElement.scrollTop;
    }
    else if (document.body) // all other Explorers
    {
      x = document.body.scrollLeft;
      y = document.body.scrollTop;
    }
    
    return {x: x, y: y};
  },
  
  innerDimension: function()
  {
    var x,y;
    if (self.innerHeight) // all except Explorer
    {
      x = self.innerWidth;
      y = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight)
      // Explorer 6 Strict Mode
    {
      x = document.documentElement.clientWidth;
      y = document.documentElement.clientHeight;
    }
    else if (document.body) // other Explorers
    {
      x = document.body.clientWidth;
      y = document.body.clientHeight;
    }
    
    return {x: x, y: y};
  },

  /**
   * Einem Element eine (weitere) Klasse zuweisen.
   * Bestehende Klassen werden nicht entfernt.
   */
  addClass: function(Elem, addClassName) {
    if (Elem) {
      CurrentClass = $(Elem).className.split(' ');
      // nicht mehrfach hinzufuegen:
      isSet = false;
      for (ci = 0; ci < CurrentClass.length; ci++) {
        if (CurrentClass[ci] == addClassName) {
          isSet = true;
        }
      }
      if (!isSet) {
        CurrentClass.push(addClassName);
      }
      $(Elem).className = CurrentClass.join(' ');
    }
  },

  /**
   * Einem Element gezielt eine Klasse entfernen, ohne eventuell
   * weitere Klassen zu stoeren.
   */
  stripClass: function(Elem, stripClassName) {
    if (Elem) {
      CurrentClass = $(Elem).className.split(' ');
      for (ci = 0; ci < CurrentClass.length; ci++) {
        if (CurrentClass[ci] == stripClassName) {
          CurrentClass.splice(ci, 1);
        }
      }
      $(Elem).className = CurrentClass.join(' ');
    }
  },
  
  
  
  
  centerScreen: function(width, height)
  {
    var X = (self.screen.width - width) / 2;
    var Y = (self.screen.height - height) / 2;

//    $('content').innerHTML =
//      'width: ' + width + '<br />' +
//      'height: ' + height + '<br />' +
//      'X: ' + X + '<br />' +
//      'Y: ' + Y + '<br />'
//      ;
    return {x: X, y: Y};
  },
  
  getPos: function(obj)
  {
    return {
      x: Util.findPosX(obj),
      y: Util.findPosY(obj)
    }
  },
  
  findPosX: function(obj)
  {
    var curleft = 0;
    if (obj.offsetParent)
    {
      while (obj.offsetParent)
      {
        curleft += obj.offsetLeft;
//        obj.style.border = '1px solid green';
        obj = obj.offsetParent;
      }
    }
    else if (obj.x)
    {
      curleft += obj.x;   
//            obj.style.border = '1px solid blue';
    }
    return curleft;
  },
  
  findPosY: function(obj)
  {
    var curtop = 0;
    if (obj.offsetParent)
    {
      while (obj.offsetParent)
      {
        curtop += obj.offsetTop
        obj = obj.offsetParent;
      }
    }
    else if (obj.y)
      curtop += obj.y;
    return curtop;
  },
  
  mousePos: 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;
    }
    // posx and posy contain the mouse position relative to the document
    // Do something with this information
    
    return {x: posx, y: posy};
  },
  
  keepAlive: function() {
      new ajax ('/plugin/de.masstisch.ajax/KeepAlive.php', {
      });    
  }
  
}



