
document.onmouseup = function(event) {
	if (event == null) event = window.event;
	var target = event.target != null ? event.target : event.srcElement;
	if (sly.getParentNodeWithClassName(target, 'slyContextMenu')) return;
	while (sly.contextMenus.length > 0) {
		sly.contextMenus[sly.contextMenus.length - 1].hide();
		sly.contextMenus.splice(sly.contextMenus.length - 1, 1);
	}
};


document.onkeyup = function(event) {
	if (event == null) event = window.event;
	if (event.keyCode == 27) { if (sly.dialog) sly.dialog.close(); }
	if (sly.user) return;
	if (event.shiftKey && event.ctrlKey) { //we use the SHIFT key, because ALT and CTRL are used by the browser itself
		if (event.keyCode == 76) {
			if (!sly.user) new slyLoginDialog();
			else new slyDialog({title:'Login Informationen', msg:'Sie sind eingeloggt als ' + sly.user.login + '.', buttons:[
			                       {label:'Logout', event:function() {
			                    	   sly.dialog.close();
			                    	   sly.logout();
			                       }}]});
		}
		//else alert('No handler specified for key code: ' + event.keyCode);
	}
};

document.onmousemove = function(event) {
};

document.oncontextmenu = function() { return false; };

window.onresize = function(event) {
	sly.screen = {width: document.all ? document.documentElement.clientWidth : window.innerWidth, height: document.all ? document.documentElement.clientHeight : window.innerHeight };
	if (sly.dialog) sly.dialog.arrangeElements();
};

window.onscroll = function(event) {
	if (sly.dialog && sly.dialog.table.offsetHeight < sly.screen.height) sly.dialog.arrangeElements();
};




//Not all browsers support the indexOf method on arrays!
//We implement it by ourselves.
if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function(elt /* , from */) {
		var len = this.length;
		var from = Number(arguments[1]) || 0;
		from = (from < 0) ? Math.ceil(from) : Math.floor(from);
		if (from < 0)
			from += len;
		for (; from < len; from++) {
			if (from in this && this[from] === elt)
				return from;
		}
		return -1;
	};
}



/***************************************************************************************************/

var sly = {
	
	screen: false,
	page: false,
	dialog: false,
	widgets: Array(),
	contextMenus: Array(),
	draggingStartMousePosition: false,
	draggingStartNodePosition: false,
	isDragging: false,
	draggingNode: false,
	
	clearTooltip: function() {
		if (document.getElementById('tooltip')) {
			document.body.removeChild(document.getElementById('tooltip'));
			clearTimeout(tooltipTimeout);
		}
	},
	
	call: function(service, arguments, callback) {
		var xmlHttp = new XMLHttpRequest();
		var __service = service;
		var __arguments = arguments;
		var __callback = callback;
		
		xmlHttp.open('POST', 'slycms.php', true);
		xmlHttp.setRequestHeader('Content-Type', 'application/json');
		xmlHttp.onreadystatechange = function () {
			if (xmlHttp.readyState != 4) return;
		    if (xmlHttp.status == 200) {
				var res = {};
				try {
	        		res = eval('(' + xmlHttp.responseText + ')');
        		} catch (err) {
        			alert('slyCall "' + __service + '" received an invalid JSON response from the server!');
        			return;
        		}
        		
        		//TODO: Allgemeine Fehlermeldungen abfangen und verarbeiten...
        		if (res.statusCode == 401) {
        			alert('slyCMS - DATABASE DOWN');
        			return;
        		}
        		
		    	if (!__callback) {}
		    	else if (typeof(__callback) != "function") {
		    		alert('Callback parameter of slyCall "' + __service + '" must be a function!');
		    	}
		    	else {
		        	try {
		        		__callback(res);
		        	}
		        	catch (err) {
		        		alert('Error in user defined callback function of slyCall "' + __service + '"! ' + err);
		        	}
		        }
		 	} else {
		    	alert('slyCall "' + __service + '" failed!');
		    }
		};
		var requestObject = new Object();
		requestObject.requestTimestamp = new Date().getTime();
		requestObject.service = service;
		requestObject.arguments = new Object();
		for(var p in arguments) requestObject.arguments[p] = arguments[p];
		xmlHttp.send(JSON.stringify(requestObject));
		return true;
	},
	
	getParentNodeWithClassName: function(element, className) {
	    var _elem = element;
	    do {
	    	if (_elem.className == className) return _elem;
	    } while((_elem = _elem.parentNode) != null);
	    return false;
	},
	
	contact: function(nameField, emailField, messageField, notificationField, button) {
		if (nameField.value == '') {
			new slyTooltip('Bitte geben Sie Ihren Namen ein!', nameField);
			nameField.focus();
			return;
		}
		if (emailField.value == '') {
			new slyTooltip('Bitte geben Sie Ihre E-Mail Adresse ein, damit wir Sie kontaktieren können!', emailField);
			emailField.focus();
			return;
		}
		if (!emailField.value.match(/^[a-z0-9._-]+@[a-z0-9._-]+\.[a-z]+$/i)) {
			new slyTooltip('Bitte geben Sie eine gültige E-Mail Adresse ein!', emailField);
			emailField.focus();
			return;
		}
		if (messageField.value == '') {
			new slyTooltip('Bitte geben Sie eine Nachricht ein!', messageField);
			messageField.focus();
			return;
		}
		
		if (button) button.disabled = true;
		sly.call('contact', {name:nameField.value, email:emailField.value, message:messageField.value}, function(data) {
			if (data.statusCode == 200) {
				nameField.value = '';
				emailField.value = '';
				messageField.value = '';
				notificationField.style.color = 'green';
			} else notificationField.style.color = 'red';
			notificationField.innerHTML = data.statusMessage;
			if (button) button.disabled = false;
		});
	},
	
	getMousePosition: function(event) {
	    if (event == null) event = window.event;
	    if (document.all) return {x:event.clientX + document.documentElement.scrollLeft, y:event.clientY + document.documentElement.scrollTop };
	    else return {x:event.pageX, y:event.pageY };
	},
	
	getNodePosition: function(domNode) {
		var _elem = domNode;
		var x = 0, y = 0;
	    do {
	    	if (isNaN(_elem.offsetLeft)) break;
	    	x += _elem.offsetLeft;
	    } while((_elem = _elem.parentNode) != null);
	    return {x:x, y:y};
	},
	
	makeDraggable: function(nodeToDrag, hookNode) {
		hookNode.onmousedown = function(event) {
			if (event == null) event = window.event;
			var target = event.target != null ? event.target : event.srcElement;
			if (event.button == 0) {
				sly.draggingStartMousePosition = sly.getMousePosition(event);
				sly.draggingStartNodePosition = sly.getNodePosition(nodeToDrag);
				sly.isDragging = true;
				sly.draggingNode = nodeToDrag;
			}
		};
	},
	
	disableSelection: function(node) {
		if (typeof node.onselectstart != "undefined") node.onselectstart = function() { return false; };
	    else if (typeof node.style.MozUserSelect != "undefined") node.style.MozUserSelect = "none";
	    else node.onmousedown = function() { return false; };
	    node.style.cursor = "default";
	},
	
	fadeInNode: function(node, duration, callback, time) {
		if (!duration) duration = 300;
		if (time == null) time = 0;
		node.style.opacity = (time / duration);
		node.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + ((time / duration) * 100) + ')';
		if (time < duration) {
			setTimeout(function() { sly.fadeInNode(node, duration, callback, time + 40); }, 40);
		}
		else if (callback && typeof(callback) == 'function') callback();
	},
	
	fadeOutNode: function(node, duration, callback, time) {
		if (!duration) duration = 300;
		if (time == null) time = 100;
		node.style.opacity = 1 - (time / duration);
		node.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + ((1 - (time / duration)) * 100) + ')';
		if (time < duration) {
			setTimeout(function() { sly.fadeOutNode(node, duration, callback, time + 40); }, 40);
		}
		else if (callback && typeof(callback) == 'function') callback();
	},
	
	ajaxUpload: function(form, isImage) {
		  //window.parent.document.getElementById('slyNewsForm_data').innerHTML = '<img src="res/scripts/slycms/images/clockloader.gif" />';
		  var iframe = document.createElement("iframe");
		  iframe.setAttribute("id","ajax-temp");
		  iframe.setAttribute("name","ajax-temp");
		  iframe.setAttribute("width","0");
		  iframe.setAttribute("height","0");
		  iframe.setAttribute("border","0");
		  iframe.setAttribute("style","width:0; height:0; border:none;");
		  form.parentNode.appendChild(iframe);
		  window.frames['ajax-temp'].name = 'ajax-temp';
		  
		  var doUpload = function() {
			  if(document.getElementById('ajax-temp').detachEvent) {
				  document.getElementById('ajax-temp').detachEvent('onload', doUpload);
			  } else {
				  document.getElementById('ajax-temp').removeEventListener("load", doUpload, false);
			  }
			  var cross = "javascript: ";
			  if (isImage) cross += "top.sly.processImageUploadResponse(eval('(' + document.body.innerHTML + ')')); void(0);";
			  else cross += "top.sly.processUploadResponse(eval('(' + document.body.innerHTML + ')')); void(0);";
			  document.getElementById('ajax-temp').src = cross;
			  if(RegExp(" AppleWebKit/").test(navigator.userAgent)) {
				  document.getElementById('ajax-temp').parentNode.removeChild(document.getElementById('ajax-temp'));
			  } else {
				  setTimeout(function(){ try { document.getElementById('ajax-temp').parentNode.removeChild(document.getElementById('ajax-temp'));} catch(err) {}}, 250);
			  }
		  }
		  
		  if(document.getElementById('ajax-temp').addEventListener) document.getElementById('ajax-temp').addEventListener("load", doUpload, true);
		  if(document.getElementById('ajax-temp').attachEvent) document.getElementById('ajax-temp').attachEvent("onload", doUpload);
		  form.setAttribute("target", "ajax-temp");
		  if (isImage) form.setAttribute("action", "slycms.php?service=uploadImage");
		  else form.setAttribute("action", "slycms.php?service=uploadFile");
		  form.setAttribute("method", "post");
		  form.setAttribute("enctype", "multipart/form-data");
		  form.setAttribute("encoding", "multipart/form-data");
		  form.submit();
	},
	
	logout: function() {
		sly.call('logout', false);
		sly.user = false;
	},
	
	userlogin: function(url) {
		if (document.getElementById('login_username').value == '') {
			new slyTooltip('Geben Sie Ihren Benutzernamen ein!', document.getElementById('login_username'));
			document.getElementById('login_username').focus();
			return;
		}
		if (document.getElementById('login_password').value == '') {
			new slyTooltip('Geben Sie Ihr Passwort ein!', document.getElementById('login_password'));
			document.getElementById('login_password').focus();
			return;
		}
		sly.call('userlogin', {token:document.getElementById('login_username').value, password:document.getElementById('login_password').value}, function(data) {
			if (data.statusCode == 200) {
				if (url) location.href = url;
				else location.href = 'mitgliederbereich/aktuell';
			} else {
				new slyTooltip(data.statusMessage, document.getElementById('login_username'));
				document.getElementById('login_password').value = '';
				if (document.getElementById('login_username').value == '') document.getElementById('login_username').focus();
				else document.getElementById('login_password').focus();
			}
		});
	},
	
	processImageUploadResponse: function(res) {
		if (res.statusCode) {
			alert(res.statusMessage);
			return false;
		}
		window.parent.document.getElementById('slyNewsForm_picture').src = res.image.replace(/&amp;/g,'&');
		window.parent.document.getElementById('slyNewsForm_picture').height = 80;
	},
	
	processUploadResponse: function(res) {
		if (res.statusCode) {
			alert(res.statusMessage);
			return false;
		}
		window.parent.document.getElementById('slyNewsForm_data').innerHTML = res.file;
		window.parent.document.getElementById('slyNewsForm_fileSize').innerHTML = res.size + ' KB';
		window.parent.document.getElementById('slyNewsForm_fileType').innerHTML = res.type;
		window.parent.document.getElementById('slyNewsForm_fileDate').innerHTML = res.date;
	}
};



