if(de == null) var de = {};
if(de.digitalspirit == null) de.digitalspirit = {};
if(de.digitalspirit.dsframework == null) de.digitalspirit.dsframework = {};
if(de.digitalspirit.dsframework.web == null) de.digitalspirit.dsframework.web = {};

de.digitalspirit.dsframework.web.HTMLUtils = {
    formToQueryString: function(form) {
    	var elements = form.elements;
		var qs = "";
		for(var i = 0; i < elements.length; i++) {
			var element = elements[i];
		    if(element.name.length > 0) {
		    	var name 	= element.name.replace(/ /g,'+');
		    	var value 	= element.value;
		    	var elementType = element.type.toLowerCase();
		    	if(elementType == 'checkbox') {
		    		value = (element.checked) ? "true" : "";
		    	}
		    	if(value && (value != "")) {
		    		qs += ((qs.length > 0) ? "&" : "") + name + "=" + value.replace(/ /g,'+'); 
		    	}
		    }
		}
		return qs;
    },
    
    executeUrl: function(url, callbackHandler) {
    
    	callbackHandler = (callbackHandler) || function() { };
    
    	var successHandler = function() {
	        if (_request.readyState == 4)
			{
				if (_request.status == 200) {
					callbackHandler();
		        } else {
	        		alert("There was a problem invoking " + url + ":\n" + _request.statusText);
	    		}
			}
		}
    
    	try {
			if (window.XMLHttpRequest) {
				_request = new XMLHttpRequest();
				_request.onreadystatechange = successHandler;
				_request.open("GET", url, true);
				_request.send(null);
			// branch for IE/Windows ActiveX version
			} else if (window.ActiveXObject) {
				_request = new ActiveXObject("Microsoft.XMLHTTP");
				if (_request) {
	        		_request.onreadystatechange = successHandler;
					_request.open("GET", url, true);
	        		_request.send();
	    		}
			}
		} catch (e) {
			alert(e);
		}
	}, 	
	
	findPosition: function(element) {
		var currentLeft = currentTop = 0;
		if (element.offsetParent) {
			currentLeft = element.offsetLeft
			currentTop = element.offsetTop
			while (element = element.offsetParent) {
				currentLeft += element.offsetLeft
				currentTop += element.offsetTop
			}
		}
		return [currentLeft,currentTop];
	},

    findXPosition: function(element) {
        return this.findPosition(element)[0];
    },
	
	findYPosition: function(element) {
        return this.findPosition(element)[1];
    },
    
    addEvent: function(element, event, fn, useCapture) {
        useCapture = (typeof(useCapture) != 'undefined') ? useCapture : false;
        if (element.addEventListener) {
            element.addEventListener(event, fn, useCapture);
            return true;
        } else if (element.attachEvent) {
            return element.attachEvent("on" + event, fn);
        } else {
            return false;
        }
    } 
	
}

de.digitalspirit.dsframework.web.LayerController = function() {
	this.leftOffset = 0;
	this.topOffset 	= 0;
	this.showLayer = function(element, layerId) {
		var layer = document.getElementById(layerId);
		if(layer.style.visibility == 'hidden') {
			var position = de.digitalspirit.dsframework.web.HTMLUtils.findPosition(element);
			layer.style.left = position[0] + this.leftOffset + "px";
			layer.style.top  = position[1] + this.topOffset + "px";
			layer.style.visibility = 'visible';
		}
	}
	
	this.hideLayer = function(element, layerId) {
		document.getElementById(layerId).style.visibility='hidden';
	}
}

de.digitalspirit.dsframework.web.ExpansionController = function() {

	this._setExpansion = function (id, expand) {
		var display = (expand) ? '' : 'none';
		var element = document.getElementById(this.toElementId(id));
		if(element) {
			element.style.display = display;
			(expand) ? this.onExpanded(element, id) : this.onCollapsed(element, id);
		}
	}
	
	this.toElementId 	= function(id) { return id; };
	this.onCollapsed 	= function(element, id) {};
	this.onExpanded 	= function(element, id) {};

	this.collapse = function() {
		for (var i = 0; i < this.collapse.arguments.length; ++i) {
			this._setExpansion(this.collapse.arguments[i], false);
		}
	}
	
	this.expand = function() {
		for (var i = 0; i < this.expand.arguments.length ; ++i) {
			this._setExpansion(this.expand.arguments[i], true);
		}
	}
	
	this.isExpanded = function(id) {
		var display = document.getElementById(this.toElementId(id)).style.display;
		return !(display=='none');
	}
	
	this.toggle = function(id) {
		this._setExpansion(id, !this.isExpanded(id));
	}
}


