//****************************************************************
//----------------------------------------------------------------
// Cross Browser
// ver 1.1.0
// Author: Samuele Carassai
//----------------------------------------------------------------
//****************************************************************

// Cross Browser
if (typeof(SCFramework) == "undefined") 
	SCFramework = {
	
		// Internal
		$: function (id) {
			return (document.getElementById)? document.getElementById(id): document.all[id];	
		},
		
		getGuid: function (prefix) {
			if (SCFramework.__guid == undefined) SCFramework.__guid = 1;
			if (prefix) return prefix + "_" + (SCFramework.__guid ++);
			else return SCFramework.__guid ++;
		}, 
		
		// String
        trim: function (str) {
            var chars = " ";
            return ltrim(rtrim(str));
        },

        ltrim: function (str) {
            var chars = " " || "\\s";
            return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
        },

        rtrim: function (str) {
            var chars = " " || "\\s";
            return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
        },
        
		// Graph
		elementPosition: function (element) {
			var curleft = 0;
			var curtop = 0;
			
			if (element.offsetParent)
 				while (element.offsetParent && element.offsetParent.style.position != "absolute") {
					curleft += element.offsetLeft - element.scrollLeft;
					curtop += element.offsetTop - element.scrollTop;
					element = element.offsetParent;
				}
 			else {
 				if (element.x) curleft += element.x;
 				if (element.y) curtop += element.y;
 			};
			return {left: curleft, top: curtop };
		},
		
		write: function (text) {
			var consoleName = "SCFrameworkConsole";
			if (!SCFramework.$(consoleName)) {
				var element = document.createElement("div");
				
				SCFramework.setAttribute(element, "id", consoleName);
				SCFramework.setStyle(element, "position: absolute; left: 0px; right: 0px; background-color: white;");
				
				document.body.appendChild(element);
			};
			var console = SCFramework.$("SCFrameworkConsole");
			console.innerHTML += text + "<br>";
		},		
		
		// Standard properties
		parentElement: function (e) {
			return (e.parentElement)? e.parentElement: e.parentNode;
		},
		
		elementWidth: function (e) {
		    var sw = (e.style)? parseInt(e.style.width): 0;

		    if (typeof(e.offsetWidth) == "undefined" || e.offsetWidth == 0) {
    		    if (!isNaN(sw)) return sw;
                else return 0;
		    } else
		        return e.offsetWidth;
		},
		
		elementHeight: function (e) {
		    var sh = (e.style)? parseInt(e.style.height): 0;

		    if (typeof(e.offsetHeight) == "undefined" || e.offsetHeight == 0) {
    		    if (!isNaN(sh)) return sh;
                else return 0;
		    } else
		        return e.offsetHeight;
		},
		
		// Standard events properties
		srcElement: function (e) { return (e.target) ? e.target: e.srcElement; },
		
		stopPropagation: function (e) {
			if(e.stopPropagation) e.stopPropagation();
			else e.cancelBubble = true;
		},
		
		preventDefault: function (e) {		
			if(e.preventDefault) e.preventDefault();
			else e.returnValue = true;
		},
		
		fromElement: function (e) {
			mw3 = (e.relatedTarget && e.target)? 1 : 0;
			return (mw3)? ((e.type == "mouseover")? e.relatedTarget :e.target) : e.fromElement;
		},
		
		toElement: function (e) {
			mw3 = (e.relatedTarget && e.target)? 1 : 0;
			return (mw3)? ((e.type == "mouseout")? e.relatedTarget :e.target) : e.toElement;
		},	
			
		contains: function (master, slave) {
			if (master.contains) {
				if (slave != null) return master.contains(slave);
			} else {
				while (slave != null && slave.parentNode) 
					if ((slave = slave.parentNode) == master) return true; 
			};
			return false		
		},
		
		// Mouse
		offsetX: function (e) { return (e.offsetX)? e.offsetX : e.layerX; },
		offsetY: function (e) { return (e.offsetY)? e.offsetY : e.layerY; },
		
		pageX: function (e) { return (document.all)? window.event.clientX + document.body.scrollLeft : e.pageX; },
		pageY: function (e) { return (document.all)? window.event.clientY + document.body.scrollTop : e.pageY; },
		
		mouseX: function (e) { return (typeof(e.x) == "undefined")? e.clientX: e.x; },
		mouseY: function (e) { return (typeof(e.y) == "undefined")? e.clientY: e.y; },
		
		// Handling events
		attachEvent: function (element, type, handler) {
			if (element.addEventListener) {
				element.addEventListener(type, handler, false);
			} else {
				if (!handler.$$guid) handler.$$guid = SCFramework.getGuid();
				if (!element.events) element.events = {};
				var handlers = element.events[type];
				if (!handlers) {
					handlers = element.events[type] = {};
					if (element["on" + type]) handlers[0] = element["on" + type];
				};
				handlers[handler.$$guid] = handler;
				element["on" + type] = SCFramework.handleEvent;
			}
		},
		
		detachEvent: function (element, type, handler) {
			if (element.removeEventListener) {
				element.removeEventListener(type, handler, false);
			} else {
				if (element.events && element.events[type])
					delete element.events[type][handler.$$guid];
			}
		},
		
		handleEvent: function (event) {
			function fixEvent(event) {
				event.preventDefault = function() {	this.returnValue = false; };
				event.stopPropagation = function() { this.cancelBubble = true; };
				return event;
			};
			
			var returnValue = true;
			event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
			var handlers = this.events[event.type];
			for (var i in handlers) {
				this.$$handleEvent = handlers[i];
				if (this.$$handleEvent(event) === false) returnValue = false;
			};
			return returnValue;
		},
		
		// Attributes
		setAttribute: function (element, attribute, value) {
			if (document.all) {
				if (attribute == "class") attribute = "className";
				if (attribute == "for") attribute = "htmlFor";
				element[attribute] = value;
			} else 
				element.setAttribute(attribute, value);
		},
		
		getAttribute: function (element, attribute) {
			if (document.all) {
				if (attribute == "class") attribute = "className";
				if (attribute == "for") attribute = "htmlFor";
				if (attribute == "style") return element.style.cssText;
				return element[attribute];
			} else 
				return element.getAttribute(attribute);
		},
		
		setStyle: function (element, styles) {
			if(document.all && !window.opera) element.style.setAttribute("cssText", styles);
			else element.setAttribute("style", styles);
    	}
    }
