var x54dom = {
    offsetX: 0,
    offsetY: 0,
    initDone: false,
    setOffsetXY: function(x,y) {
        x54dom.offsetX = x;
        x54dom.offsetY = y;
        x54dom.initDone = true;
    },
    $: function(el) {
        return typeof el === "string" ? document.getElementById(el) : el;
    },
    
    def: function(el) {
        return typeof el !== "undefined";
    },
    spos: function() {
        var x=0,y=0,d=document,w=window;
        if( typeof( w.pageYOffset ) === 'number' ) {
            y = w.pageYOffset;
            x = w.pageXOffset;
        } else if( d.body && ( d.body.scrollLeft || d.body.scrollTop ) ) {
            y = d.body.scrollTop;
            x = d.body.scrollLeft;
        } else if( d.documentElement && ( d.documentElement.scrollLeft || d.documentElement.scrollTop ) ) {
            y = d.documentElement.scrollTop;
            x = d.documentElement.scrollLeft;
        }
        return {x:x,y:y};
    },
    clientsize: function() {
      var w=0,h=0,d=document,win=window;
      if(win.innerWidth && win.innerHeight) {
        w=win.innerWidth;
        h=win.innerHeight;
      } else if((!d.compatMode || d.compatMode == 'CSS1Compat') && !w.opera && d.documentElement && d.documentElement.clientHeight) {
        w=d.documentElement.clientWidth;
        h=d.documentElement.clientHeight;
      } else if(d.body && d.body.clientHeight) {
        w=d.body.clientWidth;
        h=d.body.clientHeight;
      }
      return {w:w-20,h:h-20};
    },
    docsize: function() {
      var b=document.body, e=document.documentElement;
      var esw=0, eow=0, bsw=0, bow=0, esh=0, eoh=0, bsh=0, boh=0;
      if (e) {
        esw = e.scrollWidth;
        eow = e.offsetWidth;
        esh = e.scrollHeight;
        eoh = e.offsetHeight;
      }
      if (b) {
        bsw = b.scrollWidth;
        bow = b.offsetWidth;
        bsh = b.scrollHeight;
        boh = b.offsetHeight;
      }
      return {w:Math.max(esw,eow,bsw,bow)-20,h:Math.max(esh,eoh,bsh,boh)-20};
    },
    pos: function(e) {
        var xy = {x:0, y:0};
        while(e) {
            if (x54dom.def(e.offsetLeft)) {
                xy.x += e.offsetLeft;
                xy.y += e.offsetTop;
            }
            e = e.offsetParent;
        }
        return xy;
    },

    event: function (e) {
        e = e || window.event;
        var evt = {target:null, pageX:0, pageY:0, offsetX:0, offsetY:0};
        evt.target = e.target || e.srcElement;
        var sp, pos;
        if (x54dom.def(e.pageX)) {
            evt.pageX = e.pageX - x54dom.offsetX;
            evt.pageY = e.pageY - x54dom.offsetY;
        } else if(x54dom.def(e.clientX)) {
            sp = x54dom.spos();
            evt.pageX = e.clientX + sp.x - x54dom.offsetX;
            evt.pageY = e.clientY + sp.y - x54dom.offsetY;
        }
        
        if(x54dom.def(e.offsetX)) {
            evt.offsetX = e.offsetX;
            evt.offsetY = e.offsetY;
        } else if(x54dom.def(e.layerX)) {
            evt.offsetX = e.layerX;
            evt.offsetY = e.layerY;
        } else {
            pos = x54dom.xy(evt.target);
            evt.offsetX = evt.pageX - pos.x;
            evt.offsetY = evt.pageY - pos.y;
        }
        evt.shiftKey = e.shiftKey; evt.ctrlKey = e.ctrlKey; evt.altKey = e.altKey;
        return evt;
    },
    
    stopEvent: function(e){
        e = e || window.event;
	    e.cancelBubble = true;
	    e.returnValue = false;
	    if (e.stopPropagation) {e.stopPropagation();}
	    if (e.preventDefault) {e.preventDefault();}
    },
    
	getbox: function(elem){
		var xy = x54dom.pos(elem);
		return {x:xy.x, y:xy.y, w:elem.offsetWidth, h:elem.offsetHeight};
		},
	
	intersect: function(a, b){
		var box = {l:Math.max(a.x,b.x), t:Math.max(a.y,b.y), r:Math.min(a.x+a.w,b.x+b.w), b:Math.min(a.y+a.h,b.y+b.h)};
		return (box.r > box.l &&  box.b > box.t) ? {x:box.l, y:box.t, w:box.r-box.l, h:box.b-box.t} : null;
	},
	
	copy: function(box, text) {
	    var clip = x54dom.$(box);
	    clip.value = text;
	    var range = clip.createTextRange();
	    range.execCommand("Copy");
	},
	camelCase: function(s){
		return s.replace(/-\D/g, function(match){
			return match.charAt(1).toUpperCase();
		});
	},
	css: function(e, p, i){
        var s, v=null, dv=document.defaultView;
        e=x54dom.$(e);
        if (e) {
            if(dv && dv.getComputedStyle){  
                s = dv.getComputedStyle(e,'');
                if (s) {v = s.getPropertyValue(p);}
            } else if(e.currentStyle) {
                v = e.currentStyle[x54dom.camelCase(p)];
            }
        }
        return i ? (parseInt(v,10) || 0) : v;
    },

	obj2str: function(obj) {
	    var txt = "";
	    for (var e in obj){
		    txt += e + ":" + obj[e] + "\n";
	    }
	    return txt;
    }	
};