var Crealern = {}; 

// Browser checks 
Crealern.ie = (document.all && document.getElementById) ? true:false;
Crealern.ie5 = navigator.appVersion.indexOf("MSIE 5")!=-1 ? true:false;
Crealern.firefox = navigator.userAgent.toLowerCase().match(/firefox/) != null ? true:false;
Crealern.opera = window.opera ? true : false;

//array used to store elements that neeed form validation
Crealern.validationElements = new Array();
//first element of array; used as counter
Crealern.validationElementsCounter=0;

//adds events to elements of the DOM
Crealern.addEvent = function (obj,evt,fn) {
	if (obj.addEventListener)
		obj.addEventListener(evt,fn,false);
	else if (obj.attachEvent)
		obj.attachEvent('on'+evt,fn);
}

//removes events to elements of the DOM
Crealern.removeEvent = function (obj,evt,fn) {
	if (obj.removeEventListener)
		obj.removeEventListener(evt,fn,false);
	else if (obj.detachEvent)
		obj.detachEvent('on'+evt,fn);
}

/* keeping track on all the attached events (add) and detaching them (flush)
for more documenatation see: http://novemberborn.net/javascript/event-cache */
Crealern.eventCache = function(){
	
		var listEvents = [];
		
		/*  Implement array.push for browsers which don't support it natively. (used in EventCache)
		Please remove this if it's already in other code */
		if(Array.prototype.push == null){
			Array.prototype.push = function(){
				for(var i = 0; i < arguments.length; i++){
					this[this.length] = arguments[i];
		       	};
		        return this.length;
			};
		};
	     
	    return {
			listEvents : listEvents,
	     
			add : 	function(node, sEventName, fHandler, bCapture){
						listEvents.push(arguments); 
					},
	     
			flush : 	function(){
					var i, item;
					for(i = listEvents.length - 1; i >= 0; i = i - 1){
						item = listEvents[i];
	                 	removeEvent(item[0], item[1], item[2])
	                    
						item[0][item[1]] = null;
					};
			}
	      };
	
}();

//get all elements of a certain name on the page
Crealern.getElementsByTagNames = function (list,obj) {
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0;i<tagNames.length;i++) 	{
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0;j<tags.length;j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) 	{
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
				});
	}
	else if (testNode.compareDocumentPosition) 	{
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
				});
	}
	return resultArray;
}

/* 
Used to find element with certain classname
searchClass: string containing the class(es) that you are looking for 
tagName (optional, defaults to ‘*’) : An optional tag name to narrow the search to specific tags e.g. ‘a’ for links. 
containerElement (optional, defaults to document) An optional object container to search inside. Again this narrows the scope of the search */
Crealern.getElementsByClassName = function (searchClass, tagName, containerElement) {
	tagName = tagName || "*";
	containerElement = containerElement || document;
	
	var allElements = containerElement.getElementsByTagName(tagName);
	if (!allElements.length &&  tagName == "*" &&  containerElement.all) allElements = containerElement.all;
	
	var elementsFound = new Array();
	var delim = searchClass.indexOf("|") != -1  ? "|" : " ";
	
	var arrClass = searchClass.split(delim);
	for (var i = 0, j = allElements.length; i < j; i++) {
		var arrObjClass = allElements[i].className.split(" ");
		if (delim == " " && arrClass.length > arrObjClass.length) { continue; }
		var c = 0;
		comparisonLoop:
			for (var k = 0, l = arrObjClass.length; k < l; k++) {
				for (var m = 0, n = arrClass.length; m < n; m++) {
					if (arrClass[m] == arrObjClass[k]) c++;
					if (( delim == "|" && c == 1) || (delim == " " && c == arrClass.length)) {
						elementsFound.push(allElements[i]);
					break comparisonLoop;
				}
			}
		}
	}
	return elementsFound;
}

//opens links with attribute type="new-window" in new window
Crealern.addOpenInNewWindow = function (parentElementId) {
	//get links in layer #content
	var hyperlinks;
	if (!parentElementId || !document.getElementById(parentElementId)) { hyperlinks = document.getElementsByTagName("a"); }
	else { hyperlinks = document.getElementById(parentElementId).getElementsByTagName("a");}
	
	for (var i=0; i < hyperlinks.length; i++) {
		if (hyperlinks[i].getAttribute("type") == "new-window") {
			
			hyperlinks[i].onclick = function () { window.open(this.href); return false;  };		
			hyperlinks[i].onkeypress = function () { window.open(this.href); return false;  };	
			Crealern.eventCache.add(hyperlinks[i], "onclick", function () { window.open(this.href); return false;  }, false); 		
			Crealern.eventCache.add(hyperlinks[i], "onkeypress", function () { window.open(this.href); return false;  }, false); 			
		}
	}
}

//opens links with attribute type="pop-up" in pop-up
Crealern.addPopUp = function (parentElementId) {
	var hyperlinks;
	
	if (!parentElementId || !document.getElementById(parentElementId)) { hyperlinks = document.getElementsByTagName("a"); }
	else { hyperlinks = document.getElementById(parentElementId).getElementsByTagName("a");}
	
	for (var i=0; i < hyperlinks.length; i++) {
		if (hyperlinks[i].getAttribute("type") == "pop-up") {
			
			hyperlinks[i].onclick = function () { Crealern.popUp(this); return false; };		
			hyperlinks[i].onkeypress = function () { Crealern.popUp(this); return false; };	
			Crealern.eventCache.add(hyperlinks[i], "onclick", function () { Crealern.popUp(this); return false; }, false); 		
			Crealern.eventCache.add(hyperlinks[i], "onkeypress", function () { Crealern.popUp(this); return false; }, false); 			
		}
	}
}

Crealern.popUp = function (hyperlink) {
	var popup = window.open(hyperlink.href, 'popUp', 'menubar=yes, status=yes,scrollbars=yes,toolbar=no, width=550,height=470,left=50,top=20,resizable=no'); 
	popup.focus();
}


//used to trim spaces around string
Crealern.trim = function (str) {
	return str.replace( /^\s+/g,'').replace(/\s+$/g,'') 
}

//adds stylesheet
Crealern.addStyleSheet = function (relPath) {
	if(document.getElementsByTagName("head"))
	{
		var head = document.getElementsByTagName("head")[0]; 
		var newStyle = document.createElement("link");
   		newStyle.setAttribute("type", "text/css");
		newStyle.setAttribute("rel", "stylesheet"); 
		newStyle.setAttribute("href", relPath); 
		head.appendChild(newStyle);
	}
} 



//======== VALIDATION ===================================================================================================================
//general message used to notify user of the fact the form is incorrect
Crealern.globalFormValidationMessage = "Das Formular ist nicht vollständig ausgefüllt. Bitte versuchen Sie es nochmal.";

//fills array validationElements with objects of type validationElement
Crealern.addFieldValidation = function(elementId, validationElementId, elementType, sortOfValidation, validationDependsElementId, validationDependsElementType, validationDependsElementValue)
{
	Crealern.validationElements[Crealern.validationElementsCounter] = new Crealern.validationElement(elementId, validationElementId, elementType, sortOfValidation, validationDependsElementId,  validationDependsElementType, validationDependsElementValue); 
	Crealern.validationElementsCounter++;
}

//adds validation to form
Crealern.addFormValidation = function(submitButton) {
	document.getElementById(submitButton).onclick = function() { return Crealern.validateForm(); };
	document.getElementById(submitButton).onkeypress = function() { return Crealern.validateForm(); };
}

//generic field validation checker
Crealern.fieldIsValid = function (e){
	var element = document.getElementById(e.ElementId); 
	//alert(e.SortOfValidation);
	if(e.SortOfValidation.indexOf("required") != -1 && e.ValidationDependsElementId.length==0)	{
		if (Crealern.trim(element.value).length==0) { return false; }
		else {
			//email check
			if(e.SortOfValidation=="requiredEmail")	{
				if(Crealern.isValidEmail(element.value)) { return true; }
				else { return false; }
			}			
			else { return true;}
		}
	}	
	//required fields with dependancy
	if(e.SortOfValidation.indexOf("required") != -1 && e.ValidationDependsElementId.length!=0)	{
		//dependent field is a radiobutton
		if(e.ValidationDependsElementType=="radiobutton")		{
			if(document.getElementById(e.ValidationDependsElementId).checked) //if checked
			{
				if(e.SortOfValidation=="required")	{
					if (Crealern.trim(element.value).length==0) { return false; }	
					else { return true; }	
				}
				else if(e.SortOfValidation=="requiredCreditcard"){
					if (Crealern.isValidCreditcard(element.value)) { return true; }
					else { return false; }
				}
				else if(e.SortOfValidation=="requiredCreditcardDate"){
					if(element.value.length==6) { return true; }
					else { return false; }
				}			
			}	
			else { return true; }				
		}
		//dependent field is a select or a text field
		else{ 
			if(document.getElementById(e.ValidationDependsElementId).value==e.ValidationDependsElementValue){
				if (Crealern.trim(element.value).length==0) { return false; }
				else { return true;}
			}	
			else { return true; }			
		}		
	}
	//identical fields
	if(e.SortOfValidation.indexOf("identical") != -1 && e.ValidationDependsElementId.length!=0){
		if(element.value==document.getElementById(e.ValidationDependsElementId).value) { return true; }
		else { 	return false; }
	}
	
	//min length = 6
	if(e.SortOfValidation.indexOf("minLength6") != -1  && e.ValidationDependsElementId.length==0) {
		if (Crealern.trim(element.value).length == 0 || Crealern.trim(element.value).length >= 6) { return true; }
		else { 	return false; }
	}
}

//checks if email is correct
Crealern.isValidEmail = function (email)
{
	var at="@";
	var dot=".";
	var lat=email.indexOf(at);
	var lstr=email.length;
	var ldot=email.indexOf(dot);
	if (email.indexOf(at)==-1) { return false;}
	if (email.indexOf(at)==-1 || email.indexOf(at)==0 || email.indexOf(at)==lstr){ return false; }
	if (email.indexOf(dot)==-1 || email.indexOf(dot)==0 || email.indexOf(dot)==lstr){  return false; }
	if (email.indexOf(at,(lat+1))!=-1){ return false;}
	if (email.substring(lat-1,lat)==dot || email.substring(lat+1,lat+2)==dot){ return false;}
	if (email.indexOf(dot,(lat+2))==-1){ return false;}
	if (email.indexOf(" ")!=-1){ return false;}
	
	return true;
}

// Credit Card Validation Javascript
// copyright 12th May 2003, by Stephen Chapman, Felgall Pty Ltd
// http://javascript.about.com/library/blccard.htm
Crealern.isValidCreditcard = function (creditcard){
	// remove non-numerics
	var v = "0123456789";
	var w = "";
	for (i=0; i < creditcard.length; i++) 	{
		x = creditcard.charAt(i);
		if (v.indexOf(x,0) != -1) { w += x; }
	}
	// validate number
	j = w.length / 2;
	if (j < 6.5 || j > 8 || j == 7) { return false; }
	k = Math.floor(j);
	m = Math.ceil(j) - k;
	c = 0;
	
	for (i=0; i<k; i++) 	{
		a = w.charAt(i*2+m) * 2;
		c += a > 9 ? Math.floor(a/10 + a%10) : a;
	}
	for (i=0; i<k+m; i++) 	{
		c += w.charAt(i*2+1-m) * 1;
	}
	return (c%10 == 0);
}

//validationElement object, used to store an element that needs validation
Crealern.validationElement = function (elementId, validationElementId, elementType, sortOfValidation, validationDependsElementId,  validationDependsElementType, validationDependsElementValue){
	this.ElementId = elementId;
	this.ValidationElementId = validationElementId; 
	this.ElementType = elementType;
	this.SortOfValidation = sortOfValidation;
	this.ValidationDependsElementId = validationDependsElementId; 
	this.ValidationDependsElementType = validationDependsElementType; 
	this.ValidationDependsElementValue= validationDependsElementValue; 	
}

//validates form according to objects of validationElement type in array validationElements
Crealern.validateForm = function (){
	var result=true;
	
	for(var i=0; i<Crealern.validationElements.length; i++)	{
		//alert(Crealern.validationElements[i].ValidationElementId);
		document.getElementById(Crealern.validationElements[i].ValidationElementId).style.display="none"; 
		
		//alert(validationElements[i].ElementId);
		if(!Crealern.fieldIsValid(Crealern.validationElements[i])) 		{
			document.getElementById(Crealern.validationElements[i].ValidationElementId).style.display="block";
			result= false;
		}	
	}	
	
	if(!result) { alert(Crealern.globalFormValidationMessage); }
	return result;	
}

//======== END VALIDATION ===================================================================================================================

//============ AJAX ========================================================================================================================
Crealern.Ajax =  {};
	Crealern.Ajax.createRequestObject  = function () {
    	try {
			var requestObject = new XMLHttpRequest(); 
		} catch (ex) { 
			try {
				requestObject = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (ex) {
				try {
					requestObject = new ActiveXObject("Msxml2.XMLHTTP");
				} catch(ex) {}
			}					
		}	
			
    	if (requestObject.overrideMimeType) { requestObject.overrideMimeType("text/xml"); }
    	
    	return requestObject;
	}
	
	Crealern.Ajax.sendRequest = function (page) {
	    try {
			document.getElementById(Crealern.ajaxBlockId).innerHTML = "";
			
			Crealern.Ajax.httpRequest.open('get', page);
			Crealern.Ajax.httpRequest.onreadystatechange = Crealern.Ajax.handleResponse;
			Crealern.Ajax.httpRequest.send(null);			
		} catch (ex) { return false;  }	
	}
	
	Crealern.Ajax.handleResponse = function () {
    	if(Crealern.Ajax.httpRequest.readyState == 4){
			var response = Crealern.Ajax.httpRequest.responseText;
			document.getElementById(Crealern.ajaxBlockId).innerHTML = response;
			Crealern.addOpenInNewWindow(Crealern.ajaxBlockId);
    	}
	}  
//============ AJAX ========================================================================================================================

Crealern.addEvent(window, 'load', Crealern.addOpenInNewWindow);
Crealern.addEvent(window, 'load', Crealern.addPopUp);

