var get = {
    id: function(){
        var elements = [];
        for (var i = 0; i < arguments.length; i++) {
            var element = arguments[i];
            if (typeof element == 'string') {
                element = document.getElementById(element);
            }
            if (arguments.length == 1) {
                return element;
            }
            elements.push(element);
        }
        return elements;
    },
    className: function(classname){
        var a = [];
        var re = new RegExp('(^| )' + classname + '( |$)');
        var els = get.all();
        for (var i = 0, j = els.length; i < j; i++) {
			if(els[i] === undefined){ continue; }
            if (re.test(els[i].className + "")) {
                a.push(els[i]);
            }
        }
        return a;
    },
    tagName: function(tagName, element){
        element = (element) ? element : document;
        if (Check.isWebKit) {
            return element.getElementsByTagName(tagName);
        }
        return Arrays.toArray(element.getElementsByTagName(tagName));
    },
    all: function(element){
        element = (element) ? element : document;
        if (Check.isWebKit) {
            return (get.tagName("*", element)) ? get.tagName("*", element) : element.all;
        }
        return Arrays.toArray((get.tagName("*", element)) ? get.tagName("*", element) : element.all);
    },
    dimensions: function(e){
        element = get.id(e);
        var display = element.style.display;
        if (display != 'none' && display !== null) {
            return {
                width: element.offsetWidth,
                height: element.offsetHeight
            };
        }
        var els = element.style;
        var originalVisibility = els.visibility;
        var originalPosition = els.position;
        var originalDisplay = els.display;
        els.visibility = 'hidden';
        els.position = 'absolute';
        els.display = 'block';
        var originalWidth = element.clientWidth;
        var originalHeight = element.clientHeight;
        els.display = originalDisplay;
        els.position = originalPosition;
        els.visibility = originalVisibility;
        return {
            width: originalWidth,
            height: originalHeight
        };
    },
    style: function(element, style){
        element = get.id(element);
		
        if (Arrays.include(['float', 'cssFloat'], style)) {
            style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
        }
        style = Strings.camelize(style);
        var value = element.style[style];
        if (!value) {
            if (document.defaultView && document.defaultView.getComputedStyle) {
                var css = document.defaultView.getComputedStyle(element, null);
                value = css ? css[style] : null;
            }
            else 
                if (element.currentStyle) {
                    value = element.currentStyle[style];
                }
        }
				
		if ((value == 'auto') && Arrays.include(["width", "height"], style) && (get.style(element, 'display') != 'none')) {      
			
			value = element['offset' + Strings.capitalize(style)] + 'px';
        }
		
        if (window.opera && Arrays.include(['left', 'top', 'right', 'bottom'], style)) {
            if (get.style(element, 'position') == 'static') {
                value = 'auto';
            }
        }
        if (style == 'opacity') {
            if (value) {
                return parseFloat(value);
            }
            if ((get.style(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) {
                value = (get.style(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/);
                if (value[1]) {
                    return parseFloat(value[1]) / 100;
                }
            }
            return 1.0;
        }
        return value == 'auto' ? null : value;
    }
};
var set = {
    addClassname: function(element, className){
        var c = get.id(element).className;
		get.id(element).className = (get.id(element).className)? c + " " + className : className;
    },
	removeClassname: function(element, className){
		var re = new RegExp('(^| )' + classname + '( |$)');
		get.id(element).className.replace(re, "");
	},
    style: function(element, style){
        element = get.id(element);
        for (var name in style) {
            var value = style[name];
            if (name == 'opacity') {
                if (value == 1) {
                    value = (Check.isGecko) ? 0.999999 : 1.0;
                    if (Check.isIE) {
                        element.style.filter = get.style(element, 'filter').replace(/alpha\([^\)]*\)/gi, '');
                    }
                }
                else 
                    if (value === '') {
                        if (Check.isIE) {
                            element.style.filter = get.style(element, 'filter').replace(/alpha\([^\)]*\)/gi, '');
                        }
                    }
                    else {
                        if (value < 0.00001) {
                            value = 0;
                        }
                        if (Check.isIE) {
                            element.style.filter = get.style(element, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + value * 100 + ')';
                        }
                    }
            }
            else 
                if (Arrays.include(['float', 'cssFloat'], name)) {
                    name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
                }
            try{
	            element.style[Strings.camelize(name)] = value;
			}catch(e){
				alert(e+" : "+Strings.camelize(name))
			}
        }
        return element;
    }
};
var Cookie = {
    create: function(name, value, days){
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            var expires = ";expires=" + date.toGMTString();
        }
        else {
            expires = "";
        }
        document.cookie = name + "=" + value + expires + ";path=/";
    },
    read: function(name){
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1, c.length);
            }
            if (c.indexOf(nameEQ) === 0) {
                return decodeURIComponent(c.substring(nameEQ.length, c.length));
            }
        }
        return null;
    },
    erase: function(name){
        Cookie.create(name, "", -1);
    }
};
var Json = {
    parse: function(json){
        return eval("(" + json + ")");
    },
    toString: function(obj){
        var temp = [];
        var a = [];
        if (Check.isarray(obj)) {
            for (var x = 0; x < obj.length; x++) {
                if (Check.isstring(obj[x])) {
                    a.push("'" + obj[x] + "'");
                }
                else 
                    if (Check.isboolean(obj[x]) || Check.isnumber(obj[x])) {
                        a.push("" + obj[x] + "");
                    }
            }
            temp.push("[" + (a.join(", ")) + "]");
            return temp;
        }
        for (var key in obj) {
            switch (typeof obj[key]) {
                case "string":
                    temp.push("'" + key + "':'" + obj[key] + "'");
                    break;
                case "boolean":
                case "number":
                    temp.push("'" + key + "':" + obj[key] + "");
                    break;
                case "object":
                    if (Check.isarray(obj[key])) {
                        for (var x = 0; x < obj[key].length; x++) {
                            if (Check.isstring(obj[key][x])) {
                                a.push("'" + obj[key][x] + "'");
                            }
                            else 
                                if (Check.isboolean(obj[key][x]) || Check.isnumber(obj[key][x])) {
                                    a.push("" + obj[key][x] + "");
                                }
                        }
                        temp.push("'" + key + "':[" + (a.join(", ")) + "]");
                    }
                    else {
                        var t = Json.toString(obj[key]);
                        temp.push("'" + key + "':" + t + "");
                    }
                    break;
            }
        }
        return "{" + (temp.join(", ")) + "}";
    }
};
var Events = {
	backspace: 8,
	tab:       9,
	enter:    13,
	esc:      27,
	left:     37,
	up:       38,
	right:    39,
	down:     40,
	del:      46,
	home:     36,
	end:      35,
	pageup:   33,
	pagedown: 34,
	insert:   45,
    add: function(obj, evt, fn){
        if (obj.addEventListener) {
            obj.addEventListener(evt, fn, false);
        }
        else 
            if (obj.attachEvent) {
                obj.attachEvent('on' + evt, fn);
            }
    },
    remove: function(obj, evt, fn){
        if (obj.removeEventListener) {
            obj.removeEventListener(evt, fn, false);
        }
        else 
            if (obj.detachEvent) {
                obj.detachEvent('on' + evt, fn);
            }
    },
	handle: function(e){
		e = e || window.event;
		var target = e.target || e.srcElement;
		target = (target.nodeType == NodeTypes.text)? target.parentNode : target;
		var fromTarg = e.relatedTarget || e.fromElement;
		var toTarg = e.relatedTarget || e.toElement;
		var keyCode = e.keyCode || e.which;
		return {self:e, target:target, from:fromTarg, to:toTarg, keyCode:keyCode, X: e.clientX, Y:e.clientY};
	}
};
var Ajax = {
    method: undefined,
    query: undefined,
    contenttype: undefined,
    url: undefined,
    onfinish: undefined,
    onsuccess: undefined,
    onfail: undefined,
    init: function(options){
        if (!options.url) {
            Debug.echo("No server url");
        }
        Ajax.onfinish = (options.onfinish) ? options.onfinish : false;
        Ajax.onsuccess = (options.onsuccess) ? options.onsuccess : false;
        Ajax.onfail = (options.onfail) ? options.onfail : false;
        Ajax.url = options.url;
        Ajax.method = (options.method) ? options.method : "post";
        Ajax.query = (options.query) ? options.query : "";
        Ajax.contenttype = (options.encoding) ? 'Content-Type; charset=' + options.encoding : 'Content-Type';
    },
    start: function(options){
        try {
            var httpRequest = (!window.XMLHttpRequest) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
            httpRequest.open(Ajax.method, Ajax.url, false);
            httpRequest.setRequestHeader(Ajax.contenttype, 'application/x-www-form-urlencoded');
            httpRequest.send(Ajax.query);
            if (httpRequest.status == 200) {
                if (Ajax.onsuccess) {
                    Ajax.onsuccess(httpRequest.responseText);
                }
                if (Ajax.onfinish) {
                    Ajax.onfinish();
                }
                return httpRequest.responseText;
            }
            else {
                if (Ajax.onfail) {
                    Ajax.onfail(httpRequest.status, httpRequest.statusText);
                }
                if (Ajax.onfinish) {
                    Ajax.onfinish();
                }
                return httpRequest.status + " " + httpRequest.statusText;
            }
        } 
        catch (e) {
            alert("Error: " + e);
        }
    },
    request: function(options){
        if (options.onstart) {
            options.onstart();
        }
        setTimeout(function(){
            Ajax.init(options);
            Ajax.start();
        }, 50);
    }
};

var Effects = {
    dragDrop: {
        keyHTML: '<a href="#" class="keyLink" id="keylink">#</a>',
        keySpeed: 10,
        draggables: [],
        initialMouseX: undefined,
        initialMouseY: undefined,
        startX: undefined,
        startY: undefined,
        dXKeys: undefined,
        dYKeys: undefined,
        draggedObject: undefined,
        initElement: function(body, handler, keyLink){
            Effects.dragDrop.draggables.push({
                handler: (handler) ? handler : body,
                body: body
            });
            Effects.dragDrop.body = (typeof body == 'string') ? get.id(body) : body;
            handler = (!handler) ? Effects.dragDrop.body : (typeof handler == 'string') ? get.id(handler) : handler;
            Effects.dragDrop.body.style.position = "absolute";
            handler.onmousedown = Effects.dragDrop.startDragMouse;
            if (keyLink) {
                handler.innerHTML += Effects.dragDrop.keyHTML;
                var links = get.tagName('a');
                var lastLink = links[links.length - 1];
                lastLink.relatedElement = handler;
                lastLink.onclick = Effects.dragDrop.startDragKeys;
                set.style("keylink", {
                    position: "absolute",
                    top: "-2px",
                    right: "-2px",
                    width: "15px",
                    height: "15px",
                    border: "1px solid #000000",
                    backgroundImage: "none",
                    fontSize: "120%",
                    textAlign: "center",
                    padding: "0",
                    backgroundColor: "#ffffff",
                    opacity: "0.5"
                });
            }
        },
        startDragMouse: function(e){
            e = Events.handle(e);
            var elem = e.target;
            Arrays.each(Effects.dragDrop.draggables, function(el){
                if (el.handler == elem.id) {
                    Effects.dragDrop.body = get.id(el.body)
                }
            });
            Effects.dragDrop.startDrag(Effects.dragDrop.body);
            Effects.dragDrop.initialMouseX = e.X;
            Effects.dragDrop.initialMouseY = e.Y;
            Events.add(document, 'mousemove', Effects.dragDrop.dragMouse);
            Events.add(document, 'mouseup', Effects.dragDrop.releaseElement);
            return false;
        },
        startDragKeys: function(){
            Effects.dragDrop.startDrag(Effects.dragDrop.body);
            Effects.dragDrop.dXKeys = Effects.dragDrop.dYKeys = 0;
            Events.add(document, 'keydown', Effects.dragDrop.dragKeys);
            Events.add(document, 'keypress', Effects.dragDrop.switchKeyEvents);
            this.blur();
            return false;
        },
        startDrag: function(obj){
            if (Effects.dragDrop.draggedObject) {
                Effects.dragDrop.releaseElement();
            }
            Effects.dragDrop.startX = obj.offsetLeft;
            Effects.dragDrop.startY = obj.offsetTop;
            Effects.dragDrop.draggedObject = obj;
            obj.className += ' dragged';
        },
        dragMouse: function(e){
            var evt = Events.handle(e);
            var dX = evt.X - Effects.dragDrop.initialMouseX;
            var dY = evt.Y - Effects.dragDrop.initialMouseY;
            Effects.dragDrop.setPosition(dX, dY);
            return false;
        },
        dragKeys: function(e){
            var evt = Events.handle(e);
            var key = evt.keyCode;
            switch (key) {
                case 37:
                case 63234:
                    Effects.dragDrop.dXKeys -= Effects.dragDrop.keySpeed;
                    break;
                case 38:
                case 63232:
                    Effects.dragDrop.dYKeys -= Effects.dragDrop.keySpeed;
                    break;
                case 39:
                case 63235:
                    Effects.dragDrop.dXKeys += Effects.dragDrop.keySpeed;
                    break;
                case 40:
                case 63233:
                    Effects.dragDrop.dYKeys += Effects.dragDrop.keySpeed;
                    break;
                case 13:
                case 27:
                    Effects.dragDrop.releaseElement();
                    return false;
                default:
                    return true;
            }
            Effects.dragDrop.setPosition(Effects.dragDrop.dXKeys, Effects.dragDrop.dYKeys);
            if (evt.preventDefault) {
                evt.preventDefault();
            }
            return false;
        },
        setPosition: function(dx, dy){
            Effects.dragDrop.draggedObject = (Effects.dragDrop.draggedObject) ? Effects.dragDrop.draggedObject : Effects.dragDrop.body;
            Effects.dragDrop.startX = (Effects.dragDrop.startX) ? Effects.dragDrop.startX : "";
            Effects.dragDrop.startY = (Effects.dragDrop.startY) ? Effects.dragDrop.startY : "";
            Effects.dragDrop.draggedObject.style.left = Effects.dragDrop.startX + dx + 'px';
            Effects.dragDrop.draggedObject.style.top = Effects.dragDrop.startY + dy + 'px';
        },
        switchKeyEvents: function(){
            Events.remove(document, 'keydown', Effects.dragDrop.dragKeys);
            Events.remove(document, 'keypress', Effects.dragDrop.switchKeyEvents);
            Events.add(document, 'keypress', Effects.dragDrop.dragKeys);
        },
        releaseElement: function(){
            Events.remove(document, 'mousemove', Effects.dragDrop.dragMouse);
            Events.remove(document, 'mouseup', Effects.dragDrop.releaseElement);
            Events.remove(document, 'keypress', Effects.dragDrop.dragKeys);
            Events.remove(document, 'keypress', Effects.dragDrop.switchKeyEvents);
            Events.remove(document, 'keydown', Effects.dragDrop.dragKeys);
            Effects.dragDrop.draggedObject.className = Effects.dragDrop.draggedObject.className.replace(/dragged/, '');
            Effects.dragDrop.draggedObject = null;
        }
    },
    resize: {
        initialMouseX: undefined,
        initialMouseY: undefined,
        opts: {},
        initElement: function(elem, opts){
            opts = (opts) ? opts : {};
            Effects.resize.elem = (typeof elem == 'string') ? get.id(elem) : elem;
            Effects.resize.opts[Effects.resize.elem.id] = opts;
            set.style(elem, {
                position: "relative"
            });
            Effects.resize.elem.innerHTML += "<div id='resHandler_" + Effects.resize.elem.id + "'></div>";
            get.id("resHandler_" + Effects.resize.elem.id).onmousedown = Effects.resize.startResizeMouse;
            set.style(get.id("resHandler_" + Effects.resize.elem.id), {
                position: "absolute",
                overflow: "hidden",
                bottom: "-1px",
                right: "-1px",
                width: "15px",
                height: "15px",
                border: "3px solid #999",
                borderTop: "none",
                borderLeft: "none",
                backgroundImage: "none",
                fontSize: "120%",
                padding: "0",
                zIndex: "1000000",
                cursor: "se-resize",
                clear: "left"
            });
            if (Effects.resize.opts[Effects.resize.elem.id].hiddenHandler) {
                Effects.resize.elem.onmouseover = Effects.resize.hideHandler;
                get.id("resHandler_" + Effects.resize.elem.id).style.display = "none";
            }
        },
        startResizeMouse: function(e){
            e = Events.handle(e);
            var elem = e.target;
            Effects.resize.elem = elem.parentNode;
            Effects.resize.startResize(Effects.resize.elem);
            Effects.resize.initialMouseX = e.X;
            Effects.resize.initialMouseY = e.Y;
            Events.add(document, 'mousemove', Effects.resize.resizeMouse);
            Events.add(document, 'mouseup', Effects.resize.releaseElement);
            return false;
        },
        hideHandler: function(e){
            e = Events.handle(e);
            var elem = e.target;
            id = (elem.id.match(/^resHandler_/)) ? elem.id : "resHandler_" + elem.id;
            if (!document.getElementById(id)) {
                return true;
            }
            if (get.style(id, "display") == "none") {
                get.id(id).style.display = "block";
            }
            else {
                get.id(id).style.display = "none";
            }
            this.onmouseout = Effects.resize.hideHandler;
        },
        startResize: function(obj){
            if (Effects.resize.resizedObject) {
                Effects.resize.releaseElement();
            }
            Effects.resize.startY = get.dimensions(obj).height;
            Effects.resize.startX = get.dimensions(obj).width;
            Effects.resize.resizedObject = obj;
            obj.className += ' dragged';
        },
        resizeMouse: function(e){
            var evt = Events.handle(e);
            var dX = evt.X - Effects.resize.initialMouseX;
            var dY = evt.Y - Effects.resize.initialMouseY;
            Effects.resize.setSize(dX, dY);
            return false;
        },
        setSize: function(dx, dy){
            var opts = Effects.resize.opts[Effects.resize.resizedObject.id];
            Effects.resize.resizedObject = (Effects.resize.resizedObject) ? Effects.resize.resizedObject : Effects.resize.elem;
            Effects.resize.startX = (Effects.resize.startX) ? Effects.resize.startX : "";
            Effects.resize.startY = (Effects.resize.startY) ? Effects.resize.startY : "";
            Effects.resize.resizedObject.style.width = ((Effects.resize.startX + dx) <= opts.minWidth) ? opts.minWidth + "px" : Effects.resize.startX + dx + 'px';
            Effects.resize.resizedObject.style.height = ((Effects.resize.startY + dy) <= opts.minHeight) ? opts.minHeight + "px" : Effects.resize.startY + dy + 'px';
        },
        releaseElement: function(){
            Events.remove(document, 'mousemove', Effects.resize.resizeMouse);
            Events.remove(document, 'mouseup', Effects.resize.releaseElement);
            Effects.resize.resizedObject.className = Effects.resize.resizedObject.className.replace(/dragged/, '');
            Effects.resize.resizedObject = null;
        }
    },
	fade: function(elem){
		elem = get.id(elem);
		op = Number(get.style(elem, "opacity"));
		if(op <= 0){ return true; }
		var intid = "";
		function fade(){
			if (op >= 0) {
				set.style(elem, {
					opacity: op
				});
			}
			if(op <= 0){
				clearInterval(intid);
			}
			op -= 0.05;
			op = (op < 0)? 0 : op;
		}
		
		intid = setInterval(fade, 20);
	},
	appear: function(elem){
		elem = get.id(elem);
		op = Number(get.style(elem, "opacity"));
		if(op >= 1){ return true; }
		var intid = "";
		function appear(){
			if (op <= 1) {
				set.style(elem, {
					opacity: op
				});
			}
			if (op >= 1) {
				clearInterval(intid);
			}
			op += 0.05;
			op = (op > 1) ? 1 : op;
		}
		
		intid = setInterval(appear, 20);
	},
	morph: function(elem, opts){
		var elem = get.id(elem);
		set.style(elem, {overflow:"hidden"});
		var w = Number(get.style(elem, "width").replace("px", ""));
		var h = Number(get.style(elem, "height").replace("px", ""));
		function increase(style){
			if (style == "height") {
				h = Number(get.style(elem, "height").replace("px", ""));
				if (h < opts.height) {
					h += 5;
					h = (h >= opts.height)? opts.height : h;
					set.style(elem, {height: h+"px"});
				}else{
					clearInterval(hin);
				}
			}else{
				w = Number(get.style(elem, "width").replace("px", ""));
				if (w < opts.width) {
					w += 5;
					w = (w >= opts.width)? opts.width : w;
					set.style(elem, {width: w+"px"});
				}else{
					clearInterval(win);
				}
			}
			
		}
		function decrease(style){
			if (style == "height") {
				h = Number(get.style(elem, "height").replace("px", ""));
				if (h > opts.height) {
					h -= 5;
					h = (h <= opts.height)? opts.height : h;
					set.style(elem, {height: h+"px"});
				}else{
					clearInterval(hdec);
				}
			}else{
				w = Number(get.style(elem, "width").replace("px", ""));
				if (w > opts.width) {
					w -= 5;
					w = (w <= opts.width)? opts.width : w;
					set.style(elem, {width: w + "px"});
				}else{
					clearInterval(wdec);
				}
			}
		}
		
		if(opts.height !== undefined){
			if(opts.height > h){
				var hin = setInterval(function(){increase("height")}, 10);
			}else{
				var hdec = setInterval(function(){decrease("height")}, 10);
			}
		}
		if(opts.width !== undefined){
			if (opts.width > w) {
				var win = setInterval(function(){increase("width")}, 10);
			}else{
				var wdec = setInterval(function(){decrease("width")}, 10);
			}
		}
	},
	textshadow: function(classname, opts){
		opts = (opts)? opts : {};
		light = (opts.light)? opts.light : undefined;
		color = (opts.shadowColor)? opts.shadowColor : "#666";
		dist = (opts.distance)? opts.distance : 1;
		opacity = (opts.shadowOpacity)? opts.shadowOpacity : 1;
		elements = get.className(classname);
		var setShadowColor = function(elem, color){
			Arrays.each(get.all(elem), function(node){
				if (node.nodeType == NodeTypes.element) {
					set.style(node, {color: color});
				}
			})
		}
		Arrays.each(elements, function(elem){
			var text = elem.innerHTML;
			var container = document.createElement("div");
			var textdiv = document.createElement("div");
			elem.innerHTML = "";
			set.style(container, {position:"relative"});
			textdiv.innerHTML = text;
			container.appendChild(textdiv);
			for (var i=0; i < dist; i++) {
				var shadowdiv = document.createElement("div");
				shadowdiv.innerHTML = text;
				Selection.disable(shadowdiv);
				switch(light){
					case "down":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i, top: "-"+(dist-i)+"px", opacity:opacity});
						break;
					case "up":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", opacity:opacity});
						break;
					case "downleft":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: "-"+(dist-i)+"px", left:(dist-i)+"px", opacity:opacity});
						break;
					case "left":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: "0px", left:(dist-i)+"px", opacity:opacity});
						break;
					case "upright":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", left:"-"+(dist-i)+"px", opacity:opacity});
						break;
					case "downright":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: "-"+(dist-i)+"px", left:"-"+(dist-i)+"px", opacity:opacity});
						break;
					case "right":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: "0px", left:"-"+(dist-i)+"px", opacity:opacity});
						break;
					case "wide":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", left:(dist-i)+"px", opacity:opacity});
						var shadowdiv2 = document.createElement("div");
						shadowdiv2.innerHTML = text;
						Selection.disable(shadowdiv2);
						set.style(shadowdiv2, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", left:"-"+(dist-i)+"px", opacity:opacity});
						setShadowColor(shadowdiv2, color);
						container.appendChild(shadowdiv2);
						
						var shadowdiv3 = document.createElement("div");
						shadowdiv3.innerHTML = text;
						Selection.disable(shadowdiv3);
						set.style(shadowdiv3, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", opacity:opacity});
						setShadowColor(shadowdiv3, color);
						container.appendChild(shadowdiv3);
						break;
					case "glow":
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", left:(dist-i)+"px", opacity:opacity});
						var shadowdiv2 = document.createElement("div");
						shadowdiv2.innerHTML = text;
						Selection.disable(shadowdiv2);
						set.style(shadowdiv2, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", left:"-"+(dist-i)+"px", opacity:opacity});
						setShadowColor(shadowdiv2, color);
						container.appendChild(shadowdiv2);
						
						var shadowdiv3 = document.createElement("div");
						shadowdiv3.innerHTML = text;
						Selection.disable(shadowdiv3);
						set.style(shadowdiv3, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", opacity:opacity});
						setShadowColor(shadowdiv3, color);
						container.appendChild(shadowdiv3);
						
						var shadowdiv4 = document.createElement("div");
						shadowdiv4.innerHTML = text;
						Selection.disable(shadowdiv4);
						set.style(shadowdiv4, {color: color, position: "absolute",zIndex: 100-i,top: "-"+(dist-i)+"px", left:(dist-i)+"px", opacity:opacity});
						setShadowColor(shadowdiv4, color);
						container.appendChild(shadowdiv4);
						
						var shadowdiv5 = document.createElement("div");
						shadowdiv5.innerHTML = text;
						Selection.disable(shadowdiv5);
						set.style(shadowdiv5, {color: color, position: "absolute",zIndex: 100-i,top: "-"+(dist-i)+"px", left:"-"+(dist-i)+"px", opacity:opacity});
						setShadowColor(shadowdiv5, color);
						container.appendChild(shadowdiv5);
						
						var shadowdiv6 = document.createElement("div");
						shadowdiv6.innerHTML = text;
						Selection.disable(shadowdiv6);
						set.style(shadowdiv6, {color: color, position: "absolute",zIndex: 100-i, top: "-"+(dist-i)+"px", opacity:opacity});
						setShadowColor(shadowdiv6, color);
						container.appendChild(shadowdiv6);
						break;
					default:
						set.style(shadowdiv, {color: color, position: "absolute",zIndex: 100-i,top: (dist-i)+"px", left:(dist-i)+"px", opacity:opacity});
				}
				setShadowColor(shadowdiv, color);
				container.appendChild(shadowdiv);
			}	
			set.style(textdiv, {position:"relative", zIndex:"120"});
			elem.appendChild(container);
			if(opts.imageLike){
				set.style(elem, {
					cursor: "default"
				});
				Selection.disable(elem);
			}
		})
	}
};
Elements = {
	NodeTypes: {
		element: 1,
		attribute: 2,
		text: 3,
		cdata: 4,
		comment: 8,
		document: 9,
		document_type: 10,
		document_fragment: 11,
		notation: 12
	},
	cleanWhiteSpace: function(elem){
		Arrays.each(elem.childNodes, function(node){
			if (node.nodeType == NodeTypes.text && !/\S/.test(node.nodeValue))
		        elem.removeChild(node);
		});
	}
}
var Document = {
    preload: function(){
        var args = arguments;
        document.imageArray = [];
        for (var i = 0; i < args.length; i++) {
            document.imageArray[i] = new Image();
            document.imageArray[i].src = args[i];
        }
    },
    Browser: {
        name: navigator.appName,
        codename: navigator.appCodeName,
        version: navigator.appVersion.substring(0, 4),
        platform: navigator.platform,
        javaEnabled: navigator.javaEnabled(),
        cookieEnabled: navigator.cookieEnabled,
        userAgent: navigator.userAgent,
        screenWidth: screen.width,
        screenHeight: screen.height,
        loc: window.location.href,
        referrer: (document.referrer) ? document.referrer : "Direct",
        charSet: (document.characterSet) ? document.characterSet : document.charset,
        language: (navigator.language) ? navigator.language : navigator.browserLanguage,
        information: function(){
            info = "\n== Client Descriptions ==\n";
            info += "Application Name is: " + Document.Browser.name + "\n";
            info += "Application Code name is: " + Document.Browser.codename + "\n";
            info += "Application Version is: " + Document.Browser.version + "\n";
            info += "Location: " + Document.Browser.loc + "\n";
            info += "Referrer: " + Document.Browser.referrer + "\n";
            info += "User agent: " + Document.Browser.userAgent + "\n";
            info += "Platform is: " + Document.Browser.platform + "\n";
            info += "Is java Enabled?: " + Document.Browser.javaEnabled + "\n";
            info += "Is Cookie Enabled?:" + Document.Browser.cookieEnabled + "\n";
            info += "Language: " + Document.Browser.language + "\n";
            info += "Document Character Set: " + Document.Browser.charSet + "\n";
            info += "Client screenWidth: " + Document.Browser.screenWidth + "\n";
            info += "Client screenHeight: " + Document.Browser.screenHeight + "\n";
            return info;
        },
        alert: function(){
            Debug.echo(this.information());
        }
    },
    fixPng: function(){
        var img;
        var blank = "images/blank.gif";
        if (/MSIE/.test(navigator.userAgent)) {
            for (var x = 0; x < arguments.length; x++) {
                elm = document.getElementById(arguments[x]);
                img = (elm.src) ? elm.src : (elm.background) ? elm.background : (elm.backgroundImage) ? elm.backgroundImage : "";
                elm.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale src='" + img + "')";
                if (elm.src) {
                    elm.src = blank;
                }
                else 
                    if (elm.background) {
                        elm.background = blank;
                    }
                    else {
                        elm.backgroundImage = blank;
                    }
            }
        }
    },
    extract: function(){
        var allelems = get.all();
        var v = (Check.isIE) ? "var" : "";
        Arrays.each(allelems, function(elem){
            if (elem.value.id) {
                eval(v + " $" + elem.value.id + " = get.id('" + elem.value.id + "')");
            }
        });
    }
};
var Debug = {
    echo: function(elem, remove){
        var str = elem;
        var add = function(str){
            get.id("echocont").appendChild(document.createTextNode(str));
            get.id("echocont").innerHTML += "<br />";
        };
        if (remove == "removeEchoDiv") {
            if (get.id('echodiv')) {
                document.body.removeChild(get.id('echodiv'));
            }
        }
        else 
            if (get.id('echodiv')) {
                add(str);
            }
            else {
                var ediv = document.createElement("div");
                ediv.id = "echodiv";
                ediv.innerHTML = '<div id="echohandler">&nbsp;</div>';
                ediv.innerHTML += '<div id="echoclose" onclick="Debug.echo(\'\',\'removeEchoDiv\');"><b>X</b></div>';
                ediv.innerHTML += "<div id='echocont' style='padding:5px;'></div>";
                set.style(ediv, {
                    border: "1px #ddd solid",
                    fontFamily: "Trebuchet MS",
                    fontSize: "11px",
                    color: "#0066CC",
                    position: "absolute",
                    bottom: "0px",
                    right: "0px",
                    width: "250px",
                    height: "200px",
                    background: "#fafafa",
					zIndex: "100000"
                });
                document.body.appendChild(ediv);
                set.style(get.id("echoclose"), {
                    position: "absolute",
                    top: "5px",
                    right: "5px",
                    border: "1px solid red",
                    width: "12px",
                    textAlign: "center",
                    height: "12px",
                    cursor: "pointer",
                    color: "red"
                });
                add(str);
                Effects.resize.initElement("echodiv", {
                    hiddenHandler: true
                });
                Effects.dragDrop.initElement("echodiv", "echohandler");
            }
    }
};
var Arrays = {
    include: function(arr, elem){
		if (Check.isFunction(arr.indexOf))
	      return arr.indexOf(elem) != -1;
	
	    var found = false;
	    Arrays.each(arr, function(value) {
	      if (value === elem) {
	        found = true;
	      }
	    });
	    return found;
	/*	for (var x = 0; x < arr.length; x++) {
            if (arr[x] == elem) {
                return true;
            }
        }
        return false;*/
    },
    each: function(obj, fnc){
        if (Check.isarray(obj)) {
            for (var i = 0; i < obj.length; i++) {
                fnc(obj[i], i);
            }
        }
        else 
            if (Check.isobject(obj)) {
                for (var i in obj) {
                    if (obj[i] && obj[i] == Object.prototype[i]) {
                        continue;
                    }
                    fnc({
                        key: i,
                        value: obj[i]
                    }, i);
                }
            }
    },
    without: function(arr, values){
        var newarr = [];
        Arrays.each(arr, function(elem){
            if (!Arrays.include(values, elem)) {
                newarr.push(elem);
            }
        });
        return newarr;
    },
    compact: function(arr){
        newarr = [];
        Arrays.each(arr, function(elem){
            if (elem !== null && elem !== "") {
                newarr.push(elem);
            }
        });
        return newarr;
    },
    toString: function(arr){
        return arr.join(', ');
    },
    uniq: function(arr){
        var n = [];
        Arrays.each(arr, function(elem){
            if (!Arrays.include(n, elem)) {
                n.push(elem);
            }
        });
        return n;
    },
    toArray: function(obj){
        if (Check.isarray(obj)) {
            return obj;
        }
        var n = [];
        for (var x in obj) {
            if (obj[x] && obj[x] == Object.prototype[x]) {
                continue;
            }
            n.push(obj[x]);
        }
        return n;
    }
};
var Strings = {
    camelize: function(str){
        var parts = str.split('-'), len = parts.length;
        if (len == 1) {
            return parts[0];
        }
        var camelized = str.charAt(0) == '-' ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) : parts[0];
        for (var i = 1; i < len; i++) {
            camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
        }
        return camelized;
    },
    capitalize: function(str){
        return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
    },
	trim: function(str) {
		return str.replace(/^\s+/, '').replace(/\s+$/, '');
	}
};
instantEdit = {
    elems: undefined,
    editting: false,
    count: 0,
    oncomplete: undefined,
    init: function(classname, opts){
        opts = (opts) ? opts : {};
        instantEdit.elems = get.className(classname);
        instantEdit.setEvents();
        instantEdit.oncomplete = (opts.oncomplete) ? opts.oncomplete : undefined;
    },
    setEvents: function(){
        Arrays.each(instantEdit.elems, function(elem){
            if (elem.innerHTML === "") {
                elem.innerHTML = "...";
            }
			Elements.cleanWhiteSpace(elem);
            Events.add(elem, "click", instantEdit.makeEditable);
        });
    },
    makeEditable: function(e){
        e = Events.handle(e);
        var elem = e.target;
        if (!instantEdit.editting) {
            instantEdit.editting = true;
            elem.innerHTML = "<input id='t_" + (++instantEdit.count) + "' type='text' value='" + Strings.trim(elem.innerHTML) + "' style='background:none;border:none;color:#333'>";
            Events.add(elem, "keypress", instantEdit.finish);
            setTimeout(function(){
                get.id("t_" + instantEdit.count).focus();
                get.id("t_" + instantEdit.count).select();
            }, 100);
        }
    },
    finish: function(e){
        e = Events.handle(e);
        code = e.keyCode;
        if (code == 13 || code == 3) {
            var elem = e.target;
            if (!elem.parentNode) {
                return true;
            }
            var div = elem.parentNode;
            div.innerHTML = elem.value;
            instantEdit.editting = false;
            Events.add(div, "click", instantEdit.makeEditable);
            instantEdit.oncomplete(div);
        }
    }
};
Selection = {
    disable: function(target){
        if (typeof target.onselectstart != "undefined") {
            target.onselectstart = function(){
                return false;
            };
        }
        else 
            if (typeof target.style.MozUserSelect != "undefined") {
                target.style.MozUserSelect = "none";
            }
            else {
                target.onmousedown = function(){
                    return false;
                };
            }
    },
    enable: function(target){
        if (typeof target.onselectstart != "undefined") {
            target.onselectstart = document.createElement("div").onselectstart;
        }
        else 
            if (typeof target.style.MozUserSelect != "undefined") {
                target.style.MozUserSelect = document.createElement("div").style.MozUserSelect;
            }
            else {
                target.onmousedown = "";
            }
    }
};
resizable = {
    textareas: undefined,
    minHeight: undefined,
    maxHeight: undefined,
    startY: undefined,
    initY: undefined,
    grip: undefined,
    resized: undefined,
    init: function(classname, opts){
        opts = (opts) ? opts : {};
        resizable.textareas = get.className(classname);
        resizable.setResizable();
        resizable.maxHeight = (opts.maxHeight) ? opts.maxHeight : resizable.maxHeight;
        resizable.minHeight = (opts.minHeight) ? opts.minHeight : resizable.minHeight;
    },
    setResizable: function(){
        Arrays.each(resizable.textareas, function(elem){
            var div = document.createElement("div");
            elem.parentNode.replaceChild(div, elem);
            set.style(elem, {
                margin: "0px"
            });
            div.appendChild(elem);
            set.style(div, {
                width: get.dimensions(elem).width + "px"
            });
            var grip = document.createElement("div");
            set.style(grip, {
                border: "1px solid #ff0000",
                position: "relative",
                borderTop: "none",
                background: "#f5f5f5",
                textAlign: "center",
                height: "10px",
				width: "200px",
                fontSize: "9px",
                color: "#000000",
                cursor: "s-resize"
            });
            grip.innerHTML = "------";
            div.appendChild(grip);
            Events.add(grip, "mousedown", resizable.startResize);
        });
    },
    startResize: function(e){
        e = Events.handle(e);
        resizable.grip = e.target;
        resizable.resized = resizable.grip.previousSibling;
        resizable.initY = e.Y;
        resizable.startY = get.dimensions(resizable.resized).height;
        set.style(resizable.resized, {
            opacity: "0.5"
        });
        Events.add(document, "mousemove", resizable.resize);
        Events.add(document, "mouseup", resizable.finish);
        Selection.disable(document.body);
    },
    resize: function(e){
        e = Events.handle(e);
        var textarea = resizable.resized;
        var height = resizable.startY + (e.Y - resizable.initY);
        height = (height <= resizable.minHeight) ? resizable.minHeight : (height >= resizable.maxHeight) ? resizable.maxHeight : height;
        set.style(textarea, {
            height: height + "px"
        });
    },
    finish: function(){
        Events.remove(document, "mousemove", resizable.resize);
        Events.remove(document, "mouseup", resizable.finish);
        set.style(resizable.resized, {
            opacity: "1"
        });
        Selection.enable(document.body);
    }
};
var Check = {
    isarray: function(array){
        if (!array) {
            return false;
        }
        return !(!array || (!array.length || array.length === 0) || typeof array !== 'object' || !array.constructor || array.nodeType || array.item);
    },
    isobject: function(obj){
        return (typeof obj == "object") ? true : false;
    },
    isstring: function(obj){
        return (typeof obj == "string") ? true : false;
    },
    isnumber: function(obj){
        return (typeof obj == "number") ? true : false;
    },
    isfunction: function(obj){
        return (typeof obj == "function") ? true : false;
    },
    isboolean: function(obj){
        return (typeof obj == "b") ? true : false;
    },
	isFunction: function(obj) {
        return typeof obj == "function";
    },
    isIE: !!(window.attachEvent && !window.opera),
    isOpera: !!window.opera,
    isWebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    isGecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1
};
// Aliases
NodeTypes = Elements.NodeTypes;
textshadow = Effects.textshadow;
