Weazel.Tools = {};
Weazel.Tools.JavaScript = {};

Weazel.Tools.Google = {};
Weazel.Tools.Google.Maps = Class.create({
	initialize: function(id, directions, lat, lng, zoom, sites, markerText) {
		this.id = id;
		this.lat = lat;
		this.lng = lng;
		this.zoom = zoom;
		this.sites = sites;
		this.markerText = markerText;
		this.directions = directions;

	    var foundSite = false;
		for (var site in sites) {
			if(location.host == site) {
				Weazel.Tools.JavaScript.include('http://maps.google.com/maps?file=api&v=2&sensor=false&key=' + sites[site]);
				foundSite = true;
			}
		}
		if(!foundSite) {
			alert('Cannot load Goolge Map API for this Domain [' + location.host + '].');
			return;
		}
		Event.observe(window, 'load', function() {
			if (GBrowserIsCompatible()) {
				this.map = new GMap2($(this.id));
				this.map.addControl(new GLargeMapControl());
			    this.map.addControl(new GMapTypeControl());
				this.map.setCenter(new GLatLng(this.lat, this.lng), this.zoom);
				this.marker = new GMarker(this.map.getCenter());
				this.map.addOverlay(this.marker);
			    this.marker.openInfoWindowHtml(this.markerText);
			    GEvent.addListener(this.marker, "click", function() {
			    	this.marker.openInfoWindowHtml(this.markerText);
			    });
				this.gdir = new GDirections($(this.map), $(this.directions));
			}
		}.bind(this));
	},
	setDirections: function(toAddress, fromAddress) {
		this.marker.closeInfoWindow();
		this.marker.hide();
		this.gdir.load("from: " + fromAddress + " to: " + toAddress, { "locale": 'de' });
	}
});

Weazel.Tools.JSON = {
	merge: function(object1, object2) {
		var result = {};
		for (var z in object1) {
			result[z] = object1[z];
		}
		for (var z in object2) {
			result[z] = object2[z];
		}
		return result;
	},
	mergeInto: function(base, object) {
		for (var z in object) {
			base[z] = object[z];
		}
		return base;
	}
};

Weazel.Tools.Dummy = {
	func: function() {
	}
};

Weazel.Tools.Dispatcher = {
	forwardTo: function(url) {
		document.location.href = url;
	}
};

Weazel.Tools.Check = {
	isNull:function(value) {
		return value == null || (typeof value == 'string' && (value.length == 0 || value.toLowerCase() == 'null'));
	},

	isAjaxRunning: function() {
		return typeof Ajax != 'undefined' && typeof Ajax.Functions != 'undefined';
	}
};

Weazel.Tools.XML = {
	loadFromString: function(s) {
		if(Prototype.Browser.IE) {
			var xml = new ActiveXObject('Microsoft.XMLDOM');
			xml.loadXML(s);
			return xml;
		} else {
			var parser = new DOMParser();
			return parser.parseFromString(s, 'text/xml');
		}
	}
};

Weazel.Tools.DOM = {
	textContent: function(element) {
		var text;
		if(Prototype.Browser.IE) {
			text = !Weazel.Tools.Check.isNull(element.text) ? element.text : element.innerText;
		} else {
			return element.textContent;
		}
		return !Weazel.Tools.Check.isNull(text) ? text : '';
	},
	recursiveWidth: function(element, checkElement) {
		if(checkElement && element.getWidth() > 0) {
			return element.getWidth();
		} else {
			var w = 0;
			if(element.childElements) {
				element.childElements().each(function(child) {
						w += Tools.DOM.recursiveWidth(child, true);
					});
			}
			return w;
		}
	},
	findAttributeRecursive: function(element, attributeName) {
		if(!Check.isNull(element.getAttribute(attributeName))) {
			return element.getAttribute(attributeName);
		} else if(!Check.isNull(element.parentNode)) {
			return Tools.DOM.findAttributeRecursive(element.parentNode, attributeName);
		} else {
			return '';
		}
	},
	findElementByClassName: function(element, className) {
		if(element.hasClassName(className)) {
			return element;
		} else if(!Weazel.Tools.Check.isNull(element.down(className))) {
			return element.down(className);
		} else if(!Weazel.Tools.Check.isNull(element.up(className))) {
			return element.up(className);
		} else if(!Weazel.Tools.Check.isNull(element.next(className))) {
			return element.next(className);
		} else if(!Weazel.Tools.Check.isNull(element.previous(className))) {
			return element.previous(className);
		} else {
			return undefined;
		}
	}
};

Weazel.Tools.JavaScript = {
	include: function(url) {
		if(Prototype.Browser.Gecko) {
			Element.insert($$('head')[0], { bottom: new Element('script', { type: 'text/javascript', defer: true, src: url }) });
		} else {
			document.write('<script type="text/javascript" src="' + url + '"></script>');
		}
	}
};

Weazel.Tools.HTML =  {
    getUrlParam: function(paramName) {
		var reParam = new RegExp('(?:[\?&]|&amp;)' + paramName + '=([^&]+)', 'i') ;
		var match = window.location.search.match(reParam) ;
		return (match && match.length > 1) ? match[1] : '' ;
	}
};

Weazel.Tools.Cookie = {
	setCookie: function(name, value, parameters) {
		var cookie = name + "=" + escape(value);
		if(!Weazel.Tools.Check.isNull(parameters.expires)) {
			cookie += "; expires=" + parameters.expires.toGMTString();
		} else if(!Weazel.Tools.Check.isNull(parameters.expiresDays)) {
			var now = new Date();
			now.setTime(now.getTime() + (parameters.expiresDays * 24 * 60 * 60 * 1000));
			cookie += "; expires=" + now.toGMTString();
		}
		if(!Weazel.Tools.Check.isNull(parameters.path)) {
			cookie += "; path=" + parameters.path;
		}
		if(!Weazel.Tools.Check.isNull(parameters.domain)) {
			cookie += "; domain=" + parameters.domain;
		}
		if(!Weazel.Tools.Check.isNull(parameters.secure)) {
			cookie += "; secure";
		}
		document.cookie = cookie;
	},
	getCookie: function(name) {
		var dc = document.cookie;
		var prefix = name + "=";
		var begin = dc.indexOf("; " + prefix);
		if (begin == -1) {
			begin = dc.indexOf(prefix);
			if (begin != 0) {
				return null;
			}
		} else {
			begin += 2;
		}
		var end = document.cookie.indexOf(";", begin);
		if (end == -1) {
			end = dc.length;
		}
		return unescape(dc.substring(begin + prefix.length, end));
	}
};

Weazel.Tools.Screen = { };
Weazel.Tools.Screen.Lock = {
	ID: '__display_lock__',
	makeVisibleTimer: null,
	onbeforeajaxListener: null,
	onafterajaxListener: null,
	activate: function() {
		if(window.A4J) {
			Weazel.Tools.Screen.Lock.addListener();
		} else {
			Event.observe(window, 'load', function() {
				Weazel.Tools.Screen.Lock.addListener();
			});
		}
	},
	deactivate: function() {
		if(window.A4J) {
			Weazel.Tools.Screen.Lock.removeListener();
		} else {
			Event.observe(window, 'load', function() {
				Weazel.Tools.Screen.Lock.removeListener();
			});
		}
	},
	removeListener: function() {
		A4J.AJAX.RemoveListener(this.onbeforeajaxListener);
		A4J.AJAX.RemoveListener(this.onafterajaxListener);
	},
	addListener: function() {
		if(window.A4J) {
			this.onbeforeajaxListener = new A4J.AJAX.AjaxListener("onbeforeajax", Weazel.Tools.Screen.Lock.lock);
			this.onafterajaxListener = new A4J.AJAX.AjaxListener("onafterajax", Weazel.Tools.Screen.Lock.unlock);
			A4J.AJAX.AddListener(this.onbeforeajaxListener);
			A4J.AJAX.AddListener(this.onafterajaxListener);
		}
	},
	lock: function() {
	    if (!$(Weazel.Tools.Screen.Lock.ID)) {
	    	var objOverlay = new Element("div");
	    	objOverlay.setAttribute('id', Weazel.Tools.Screen.Lock.ID);
	    	objOverlay.style.position = 'absolute';
	    	objOverlay.style.top = '0';
	    	objOverlay.style.left = '0';
	    	objOverlay.style.zIndex = 9998;
	    	objOverlay.style.width = '100%';
	    	objOverlay.style.height = (document.body.getHeight() > document.viewport.getHeight() ? document.body.getHeight() : document.viewport.getHeight()) + 'px';
	    	objOverlay.style.backgroundColor = 'transparent';
	    	document.body.insert({ top: objOverlay });
	    	Weazel.Tools.Screen.Lock.makeVisibleTimer = Weazel.Tools.Screen.Lock.makeVisible.delay(2);
	    }
	},
	unlock: function() {
	    var displayLock = $(Weazel.Tools.Screen.Lock.ID);
	    if (displayLock) {
	    	displayLock.remove();
	    }

	    clearTimeout(Weazel.Tools.Screen.Lock.makeVisibleTimer);

	    var loader = $(Weazel.Tools.Screen.Lock.ID + '_loader');
	    if (loader) {

	    	loader.remove();
	    }
	},
	makeVisible: function() {
	    var displayLock = $(Weazel.Tools.Screen.Lock.ID);
	    if (displayLock) {
	    	//milky background
	    	displayLock.setStyle({'backgroundColor': '#DDD',
				'filter': 'alpha( opacity = 60 )',
				'-moz-opacity': '0.6',
				'opacity': '0.6'
			});

			var loader = new Element('div', { id: Weazel.Tools.Screen.Lock.ID + '_loader' });
			loader.setStyle({ zIndex: 9999, position: 'absolute' });

			var loaderImage = new Element('img', { id: Weazel.Tools.Screen.Lock.ID + '_loader_image', src: '/media/org/weazel/web/loader.gif' });
			loader.insert(loaderImage);

			var pageSize = document.viewport.getDimensions();
			var windowScroll = document.viewport.getScrollOffsets();

			loader.setStyle({ left: (((pageSize.width - 220) / 2) + windowScroll.left) + 'px', top: (((pageSize.height - 19) / 2) + windowScroll.top) + 'px'});

			try {
				document.body.insert({ top: loader });
			} catch (err) {}

	    }
	}
};

