String.prototype.isUpperCase = function () {
    return "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(this) != -1;
};
function defined(e) {
    return typeof (e) != "undefined";
}
function hyphenate(p) {
    var a = p.charAt(0);
    for (var i = 1; i < p.length; ++i) {
        c = p.charAt(i);
        if (c.isUpperCase()) {
            c = c.toLowerCase();
            a += "-";
        }
        a += c;
    }
    return a;
}

function Browser() {
    this.element = function (id) {
        return document.getElementById(id);
    };
    
	//alert(document.compatMode);
    this.parent = function (element) {
        return element.parentNode || element.parentELement;
    };
    
    this.getLeft = function (element) {
        return this.getStyle(element, "left", true);
    };
    
    this.getTop = function (element) {
        return this.getStyle(element, "top", true);
    };
    
    this.getWidth = function (element) {
        return element.offsetWidth;
    };
    
    this.getHspace = function (element, debug) {
        var bl = this.getStyle(element, "borderLeftWidth", true);
        var br = this.getStyle(element, "borderRightWidth", true);
        var pl = this.getStyle(element, "paddingLeft", true);
        var pr = this.getStyle(element, "paddingRight", true);
        return bl + br + pl + pr;
    };
    
    if (document.recalc) {
        IE.call(this);
    } else if (window.__defineGetter__) {
        Gecko.call(this);
    } else if (window.opera) {
        Opera.call(this);
    } else if (navigator.userAgent.match("Safari")) {
        Safari.call(this);
    } else {
        Other.call(this);
    }

    this.isStrict = (document.compatMode && document.compatMode.match("CSS")) || this.name == "Safari";
}

//////////
function IE() {
    this.name = "IE";
    this.attachEvent = function (element, name, handler, capture) {
        if (element) {
            if (capture) {
                element.setCapture();
            }
            element.attachEvent(name, handler);
        }
    };
    this.detachEvent = function (element, name, handler, capture) {
        if (element) {
            element.detachEvent(name, handler);
            if (capture) {
                element.releaseCapture();
            }
        }
    };
    this.srcElement = function (event) {
        return event.srcElement;
    };
    this.toElement = function (event) {
        return event.toElement;
    };

	this.pageX = function(event) {
		var bod = document.documentElement || document.body;
		return event.clientX + bod.scrollLeft;
	};
	this.pageY = function(event) {
		var bod = document.documentElement || document.body;
		return event.clientY + bod.scrollTop;
	};
    this.preventDefault = function (event) {
        event.returnValue = false;
    };
    this.stopPropagation = function (event) {
        event.cancelBubble = true;
    };
    this.getStyle = function (element, prop, isInt) {
        var p = "undefined";
        var s = element.currentStyle || element.style;
        if (s) {
            p = s[prop];
        }
        return isInt ? (parseInt(p) || 0) : p;
    };
    this.setWidth = function (element, w) {
        if (this.isStrict) {
            w -= this.getHspace(element);
        }
        element.style.width = w + "px";
    };
}
function Gecko() {
    this.name = "Gecko";
    if (typeof HTMLElement != "undefined") {
        HTMLElement.prototype.__defineGetter__("innerText", function () {
            var tmp = this.innerHTML.replace(/<br>/gi, "\n");
            return tmp.replace(/<[^>]+>/g, "");
        });
        HTMLElement.prototype.__defineSetter__("innerText", function (txtStr) {
            var parsedText = document.createTextNode(txtStr);
            this.innerHTML = "";
            this.appendChild(parsedText);
        });
    }
    this.attachEvent = function (element, name, handler, capture) {
        if (capture) {
            handler[name] = function (event) {
                return handler.call(element, event);
            };
            window.addEventListener(name.replace(/^on/, ""), handler[name], true);
        } else {
            element.addEventListener(name.replace(/^on/, ""), handler, false);
        }
    };
    this.detachEvent = function (element, name, handler, capture) {
        if (capture) {
            window.removeEventListener(name.replace(/^on/, ""), handler[name], true);
            handler[name] = null;
        } else {
            element.removeEventListener(name.replace(/^on/, ""), handler, false);
        }
    };
    this.srcElement = function (event) {
        try {
            return (event.target && event.target.nodeType == 3) ? event.target.parentNode : event.target;
        }
        catch (e) {
            return event.target;
        }
    };
    this.toElement = function (event) {
        try {
            return (event.relatedTarget && event.relatedTarget.nodeType == 3) ? event.relatedTarget.parentNode : event.relatedTarget;
        }
        catch (e) {
            return event.relatedTarget;
        }
    };
    this.pageX = function(event) {
		return event.pageX;
	};
	this.pageY = function(event) {
		return event.pageY;
	};
    this.preventDefault = function (event) {
        event.preventDefault();
    };
    this.stopPropagation = function (event) {
        event.stopPropagation();
    };
    this.getStyle = function (element, prop, isInt) {
        var dv = document.defaultView;
        var p;
        if (dv && dv.getComputedStyle) {
            var s = dv.getComputedStyle(element, "");
            if (s) {
                p = s.getPropertyValue(hyphenate(prop));
            }
        }
        if (typeof (p) == "undefined" && element.style) {
            p = element.style[prop];
        }
        return isInt ? (parseInt(p) || 0) : p;
    };
    this.setWidth = function (element, w) {
		//element.style.width = (w - this.getHspace(element)) + "px";
        element.style.width = w + "px";
        var ow = element.offsetWidth;
        if (ow > w)
			element.style.width = (w-(ow-w)) + "px";
    };
}
function Opera() {
    Gecko.call(this);
    this.name = "Opera";
}
function Safari() {
    Gecko.call(this);
    this.name = "Safari";
}
function Other() {
    Gecko.call(this);
    this.name = "Other";
}
var XB = new Browser();
//////////////////////////////////////////////////////////////////
var Drag = {
	dragee:null,
	offsetX:0,
	offsetY:0,
	enable:function (handle, dragee, onbegin, ondrag, onend) {
		handle.hbegin = onbegin;
		handle.hdrag = ondrag;
		handle.hend = onend;
		handle.dragee = dragee ? dragee : handle;
		XB.attachEvent(handle, "onmousedown", Drag.beginDrag);
		handle.style.cursor = "move";
	},
	disable:function (handle) {
		XB.detachEvent(handle, "onmousedown", Drag.beginDrag);
		handle.hbegin = null;
		handle.hdrag = null;
		handle.hend = null;
		handle.dragee = null;
	},
	beginDrag:function (event) {
		event = event || window.event;
		var src = XB.srcElement(event);
		while (src && !src.dragee) {
			src = XB.parent(src);
		}
		Drag.dragee = src.dragee;
		if (Drag.dragee) {
			XB.attachEvent(Drag.dragee, "onmousemove", Drag.drag, true);
			XB.attachEvent(Drag.dragee, "onmouseup", Drag.endDrag, true);
			XB.attachEvent(Drag.dragee, "onlosecapture", Drag.endDrag, true);
			if (Drag.dragee.hbegin) {
				Drag.dragee.hbegin.call(Drag.dragee, event);
			}
			XB.preventDefault(event);
			XB.stopPropagation(event);
		}
		Drag.offsetX = event.screenX - XB.getLeft(Drag.dragee);
		Drag.offsetY = event.screenY - XB.getTop(Drag.dragee);
	},
	drag:function (event) {
		if (Drag.dragee) {
			event = event || window.event;
			if (Drag.dragee.hdrag) {
				Drag.dragee.hdrag.call(Drag.dragee, event);
			} else {
				Drag.dragee.style.left = (event.screenX - Drag.offsetX) + "px";
				Drag.dragee.style.top = (event.screenY - Drag.offsetY) + "px";
			}
		}
	},
	endDrag:function (event) {
		if (Drag.dragee) {
			event = event || window.event;
			if (Drag.dragee.hend) {
				Drag.dragee.hend.call(Drag.dragee, event);
			}
			XB.detachEvent(Drag.dragee, "onmousemove", Drag.drag, true);
			XB.detachEvent(Drag.dragee, "onmouseup", Drag.endDrag, true);
			XB.detachEvent(Drag.dragee, "onlosecapture", Drag.endDrag, true);
			Drag.dragee = null;
		}
	}
};

function centerit(el, dsp){
	if (typeof el === "string"){
		el = document.getElementById(el);
	}
	if (dsp) {
		el.style.display = dsp;
	}
	var vport = (document.compatMode=='CSS1Compat') ? document.documentElement : document.body;
	var left = vport.scrollLeft + ((vport.clientWidth-el.offsetWidth)>>1) - document.body.offsetLeft;
	var top = vport.scrollTop + ((vport.clientHeight-el.offsetHeight)>>1) - document.body.offsetTop;
	el.style.left = left + "px";
	el.style.top = top + "px";
}


