

if (!window.console) {
    if (!window.console || !console.firebug) {
        var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
        "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
    
        window.console = {};
        for (var i = 0; i < names.length; ++i) {
            window.console[names[i]] = function() {};
        }
    }
}

var App = {};
App.redirect = function(location) {
    window.location = location;
};

App.getId = function (element, prefix) {
    return $(element).id.substring(prefix.length);
};

App.onCheckAllClick = function(event) {
    var element = Event.element(event);
    var checked = true;
    if (element.tagName == 'A') {
        Event.stop(event);
         checked = true;
    } else {
        checked = element.checked;
    }
    $$('INPUT.checkall-target').each(function(e) { e.checked = checked; });
};

App.replaceUmlauts = function(string, direction){
    var replace = [
        ["Ö", "ö", "Ä", "ä", "Ü", "ü", "ß"],
        ["Oe", "oe", "Ae", "ae", "Ue", "ue", "ss"]
    ];
    for (var i=0; i < replace[direction].length; i++){
        myRegExp = new RegExp(replace[direction][i],"g");
        string = string.replace(myRegExp, replace[(direction === 0 ? 1 : 0)][i]);
    }
    return string;
};

App.preloadImage = function(src) {
    try {(new Image()).src = src;} catch (e) {}
};

App.getWindowHeight = function() {
    if (self.innerHeight) {
        x = self.innerWidth;
        y = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) {
        x = document.documentElement.clientWidth;
        y = document.documentElement.clientHeight;
    } else if (document.body) {
        x = document.body.clientWidth;
        y = document.body.clientHeight;
    }
    return y;
};

App.getWindowWidth = function(){
    if (navigator.appVersion.indexOf('MSIE')>0) {
        return document.body.clientWidth;
    } else {
        return window.innerWidth;
    }  
};

var Cookie = {
  set: function(name, value, daysToExpire) {
    var expire = '';
    if (daysToExpire !== undefined) {
      var d = new Date();
      d.setTime(d.getTime() + (86400000 * parseFloat(daysToExpire)));
      expire = '; expires=' + d.toGMTString();
    }
    return (document.cookie = escape(name) + '=' + escape(value || '') + expire + ';path=/;');
  },
  get: function(name) {
    var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
    return (cookie ? unescape(cookie[2]) : null);
  },
  erase: function(name) {
    var cookie = Cookie.get(name) || true;
    Cookie.set(name, '', -1);
    return cookie;
  },
  accept: function() {
    if (typeof navigator.cookieEnabled  == 'boolean') {
      return navigator.cookieEnabled;
    }
    Cookie.set('_test', '1');
    return (Cookie.erase('_test') === "1");
  }
};

App.FontSize = Class.create();
App.FontSize.prototype = {
    initialize: function(options) {
        var cookieSize = Cookie.get("plusser-font-size");
        if (cookieSize) {
            this.setFontSize(cookieSize);	
        }
        this.registerEvents();
    },
    registerEvents: function() {
        Event.observe('font-size-increase', 'click', this.onIncrease.bindAsEventListener(this));
        Event.observe('font-size-decrease', 'click', this.onDecrease.bindAsEventListener(this));
    },
    getCurrentFontSize: function() {
    	var e = document.body;
    	if (e.hasClassName("font-0")) { return 0; }
    	if (e.hasClassName("font-1")) { return 1; }
    	if (e.hasClassName("font-2")) { return 2; }
    	if (e.hasClassName("font-3")) { return 3; }
    	return 0;
    },
    setFontSize: function(size) {
        var e = document.body;
        var classname = "font-" + size;
        Cookie.set("plusser-font-size", size);
        if (e.hasClassName(size)) {return; }
        
        e.removeClassName("font-0");
        e.removeClassName("font-1");
        e.removeClassName("font-2");
        e.removeClassName("font-3");
        e.addClassName(classname);
    },
    onIncrease: function(event) {
    	Event.stop(event);
    	var element = Event.element(event);
    	var currentSize = this.getCurrentFontSize();
    	var newSize = (currentSize < 3) ? (currentSize +1 ) : 3;
    	this.setFontSize(newSize); 
    },
    onDecrease: function(event) {
    	Event.stop(event);
        var element = Event.element(event);
        var currentSize = this.getCurrentFontSize();
        var newSize = (currentSize === 0) ? 0 : (currentSize -1);
        this.setFontSize(newSize); 
    } 	
};

App.DateField = Class.create(); 
App.DateField.prototype = {
    initialize: function(element, options) {
        this.element = $(element);
        this.options = {
            option: true,
            empty: "Datum eingeben...",
            classname_error: 'date-validation-error',
            field_iso: element.id + '_iso'
        };
        Object.extend(this.options, options || {});
        this.registerEvents();
    },
    registerEvents: function() {
    	Event.observe(this.element, 'keyup', this.onKeyUp.bindAsEventListener(this));
    	Event.observe(this.element, 'blur',  this.onBlur.bindAsEventListener(this));
    	Event.observe(this.element, 'focus', this.onFocus.bindAsEventListener(this));
    },
    onKeyUp: function() {
        if (this.element.value.length > 0) {
            var date = Date.parseExact(this.element.value, ['d.MM.yyyy', 'dd.MM.yyyy', 'd.M.yyyy', 'dd.M.yyyy']);  
            if (date !== null) {
                this.element.removeClassName(this.options.classname_error);
                if ($(this.options.field_iso)) {
                    $(this.options.field_iso).value = date.toString('yyyy-MM-dd');
                }
            } else {
                this.element.addClassName(this.options.classname_error);
            }
        } else { /* - */
        }
    },
    onBlur: function(event) {
        if (this.element.value === "") {
            this.element.value = this.options.empty;
            this.element.removeClassName(this.options.classname_error); 
        }    	
    },
    onFocus: function(event) {
        if (this.element.value === this.options.empty) {
            this.element.value = "";
        }
    }
};


App.PresetText = Class.create();
App.PresetText.prototype = {
	initialize: function(element, options) {
        this.options = {
            text: 'Hier Text eingeben...'
        };
        
        Object.extend(this.options, options || {});
		this.element = $(element);
		this.element.value =  this.options.text;
		this.registerEvents();
	},
    registerEvents: function() {
        Event.observe(this.element, 'blur',  this.onBlur.bindAsEventListener(this));
        Event.observe(this.element, 'focus', this.onFocus.bindAsEventListener(this));
    },
    onBlur: function(event) {
        if (this.element.value === "") {
            this.element.value = this.options.text;
        }
    },
    onFocus: function(event) {
        if (this.element.value === this.options.text) {
            this.element.value = "";
        }
    }
};


App.Form = Class.create(); 
App.Form.prototype = {
    initialize: function(form_id, options) {
        this.form_id = form_id;
        this.form    = $(form_id);
        this.options = {
        	useServerValidation: true,
        	validation: {} /* options for the validation class*/
        };
        Object.extend(this.options, options || {});


        /* defaults for the validation class*/
        var defaults = {
        	focusOnError: true,
            immediate : false,
            onSubmit : false,
            onFormValidate : this.onFormValidate.bind(this)
        };
        Object.extend(defaults, this.options.validation);
        this.validator = new Validation(this.form_id, defaults);

        Event.observe(this.form, "submit", this.onSubmit.bindAsEventListener(this));
    },
    onSubmit: function(event) {
    	try {
	        Event.stop(event);
	        this.validator.validate();
	        return false;
    	} catch (e) { throw e; }
    },
    onFormValidate: function(result, form) {
        if (result) {
            if(this.options.normalSubmit) {
                this.form.submit();
            } else {
                this.submitForm();
            }
        } else {
            this.indicateStatus(false);
        }
    },
    submitForm: function() {
        this.form.request({
            method: 'post',
            onComplete: Prototype.emptyFunction,
            onSuccess:  this.onSubmitFormSuccess.bind(this)    
        });
    },
    onSubmitFormSuccess: function(transport) {
    	if (!this.options.useServerValidation) {
            if (this.options.onSubmitSuccess) {
                this.options.onSubmitSuccess(transport);
            }
            return;    		
    	}
    	
        try {
            var response = transport.responseText.evalJSON();
            if (response.error) {
                //TODO: display some error message
                this.indicateStatus(false);
                if (this.options.onSubmitError) {
                    this.options.onSubmitError(response);
                }
                return;
            }
            if (response.messages && response.messages.length > 0) {
                // TODO: display some error message
                this.indicateStatus(false);
                if (this.options.onSubmitError) {
                    this.options.onSubmitError(response);
                }
                return;
            }
            
            if (response.data) {
                this.setValues(response.data);
            }
            this.indicateStatus(true);          
            if (this.options.onSubmitSuccess) {
                this.options.onSubmitSuccess(response);
            }
        } catch (e) {
            console.error(e);
        }
    },
    setValues: function(values) {
        $H(values).each(
            function(pair) {
                if ($(pair.key)) {
                    $(pair.key).value = pair.value;
                }
            }
        );
    },
    indicateStatus: function(valid) {
        var status_ok    = $(this.form_id + '-status-okay');
        var status_error = $(this.form_id + '-status-error');
        if (!status_ok || status_error) {
        	return;
        }
        if (valid) {
            Element.show(status_ok);
            Element.hide(status_error);
        } else {
            Element.hide(status_ok);
            Element.show(status_error);
        }
    }
};

App.FoldingNavi = Class.create();
App.FoldingNavi.prototype = {
	initialize: function(options) {
//		this.options = { breadcrumb: [] }; /* navigation breadcrumb */
//        Object.extend(this.options, options || {});
		this.registerEvents();
		
	},
	registerEvents: function() {
        $$(".nav-level-1").each(this.registerNavigate.bind(this));
//		$$(".nav-level-2").each(this.registerNavigateSecond.bind(this));
//		$$(".nav-level-supp").each(this.registerNavigate.bind(this));
		$$(".main-navigation").each(this.registerNavigateTop.bind(this));
    },
    
    registerNavigateTop: function(element) {
    	Event.observe(element, "mouseover", function(event) {
    		var element = Event.element(event);
   			var atag = element.down("a");
   			showTeaser(atag);
    	});
    	Event.observe(element, "mouseout", function(event) {
    		var atag = Event.element(event).down("a");
    		hideTeaser(atag);
    	});
    },
	registerNavigate: function(element) {
		//Event.observe(document, 'dom:loaded', this.onNavigate.bindAsEventListener(this));
//		Event.observe(element, 'click', this.onNavigate.bindAsEventListener(this));
		Event.observe(element, "mouseover", this.onNavTeaserShow.bindAsEventListener(this));
		Event.observe(element, "mouseout", this.onNavTeaserHide.bindAsEventListener(this));
    },
	registerNavigateSecond: function(element) {
		//Event.observe(document, 'dom:loaded', this.onNavigate.bindAsEventListener(this));
//		Event.observe(element, 'click', this.onNavigate.bindAsEventListener(this));
    },
	
	onNavigate: function(event) {
		Event.stop(event);
		
		var nElement = Event.element(event);
			nElement.addClassName('active');
		var navToOpen = nElement.readAttribute('rel');
		
		//if ($(this.options.breadcrumb)) {
			//var navItems = $(this.options.breadcrumb).select('li');
			var navItems = $(navToOpen + "-nav").select('li');
		var teaser = $(navToOpen + "-teaser");
		if(teaser) {
			teaser.hide();
		}
			navItems.each(function(element) {
				element.show();
			});
			// Effect.multiple(navItems, Effect.SlideRightIn,{ speed: 0.1 });
		//}		
	},
	
	onNavTeaserShow: function(event) {
		Event.stop(event);
		showTeaser(Event.element(event));
		
	},
	onNavTeaserHide: function(event) {
		Event.stop(event);
		hideTeaser(Event.element(event));
		
	},
	subnavigation: function() {
		// fade in subnavigation onclick
	},
	navrestore: function() {
		// restore navigation if user jumps more then one navigationlevel at once
	}

}

function showTeaser(nElement) {
	if(!nElement.up().hasClassName("navi-open") && nElement.up().id != "navi-active") {
		switch(nElement.rel) {
			case "information-architektur":
				$('information-architektur-nav').childElements().each(function(element) {element.hide();});
				$('consulting-nav').childElements().each(function(element) {element.hide();});
				$('usability-nav').childElements().each(function(element) {element.hide();});
			break;
			case "data-management":
				$('data-management-nav').childElements().each(function(element) {element.hide();});
				$('technology-nav').childElements().each(function(element) {element.hide();});
			break;
			case "marketing":
				$('marketing-nav').childElements().each(function(element) {element.hide();});
			break;
			
		}
		if (nElement.hasClassName('active') == false) {
			var navToOpen = nElement.readAttribute('rel');
			
			var teaser = $(navToOpen + "-teaser");
			teaser.show()
			/*
			Effect.Appear(teaser, {
				duration: 0.1
			}); */
		}
	}
}
function hideTeaser(nElement) {
	var navToOpen = nElement.readAttribute('rel');
	var teaser = $(navToOpen + "-teaser");
	teaser.hide();
	/*
	Effect.Fade(teaser, {
		duration: 0.1
	});
	*/
	switch(nElement.rel) {
		case "information-architektur":
			$('information-architektur-nav').childElements().each(function(element) {if(element.hasClassName("show")) {element.show();} else {element.hide();}});
			$('consulting-nav').childElements().each(function(element) {if(element.hasClassName("show")) {element.show();} else {element.hide();}});
			$('usability-nav').childElements().each(function(element) {if(element.hasClassName("show")) {element.show();} else {element.hide();}});
		break;
		case "data-management":
			$('data-management-nav').childElements().each(function(element) {if(element.hasClassName("show")) {element.show();} else {element.hide();}});
			$('technology-nav').childElements().each(function(element) {if(element.hasClassName("show")) {element.show();} else {element.hide();}});
		break;
		case "marketing":
			$('marketing-nav').childElements().each(function(element) {if(element.hasClassName("show")) {element.show();} else {element.hide();}});
		break;
		
	}
}

/*
App.FoldingNavi = Class.create();
App.FoldingNavi.prototype = {
	initialize: function(options) {
		this.options = { breadcrumb: [] }; /* navigation breadcrumb */ /*
        Object.extend(this.options, options || {});
		this.registerEvents();
		
	},
	registerEvents: function() {
        $$(".nav-level-1").each(this.registerNavigate.bind(this));
		$$(".nav-level-2").each(this.registerNavigateSecond.bind(this));
    },
	registerNavigate: function(element) {
		//Event.observe(document, 'dom:loaded', this.onNavigate.bindAsEventListener(this));
		Event.observe(element, 'click', this.onNavigate.bindAsEventListener(this));
		Event.observe(element, "mouseover", this.onNavTeaserShow.bindAsEventListener(this));
		Event.observe(element, "mouseout", this.onNavTeaserHide.bindAsEventListener(this));
    },
	registerNavigateSecond: function(element) {
		//Event.observe(document, 'dom:loaded', this.onNavigate.bindAsEventListener(this));
		Event.observe(element, 'click', this.onNavigate.bindAsEventListener(this));
    },
	
	onNavigate: function(event) {
		Event.stop(event);
		
		var nElement = Event.element(event);
			nElement.addClassName('active');
		var navToOpen = nElement.readAttribute('rel');
		
		//if ($(this.options.breadcrumb)) {
			//var navItems = $(this.options.breadcrumb).select('li');
			var navItems = $(navToOpen + "-nav").select('li');
		var teaser = $(navToOpen + "-teaser");
		if(teaser) {
			teaser.hide();
		}
		
			Effect.multiple(navItems, Effect.SlideRightIn,{ speed: 0.1 });
		//}		
	},
	
	onNavTeaserShow: function(event) {
		Event.stop(event);
		
		var nElement = Event.element(event);
		
		if (nElement.hasClassName('active') == false) {
			var navToOpen = nElement.readAttribute('rel');
			
			var teaser = $(navToOpen + "-teaser");
			Effect.Appear(teaser, {
				duration: 0.1
			});
		}
	},
	onNavTeaserHide: function(event) {
		Event.stop(event);
		
		var nElement = Event.element(event);
		var navToOpen = nElement.readAttribute('rel');
		console.log(navToOpen);
		var teaser = $(navToOpen + "-teaser");
		
			Effect.Fade(teaser, {
				duration: 0.1
			});

	},
	
	subnavigation: function() {
		// fade in subnavigation onclick
	},
	navrestore: function() {
		// restore navigation if user jumps more then one navigationlevel at once
	}

}
*/
App.Tooltip = Class.create();
App.Tooltip.prototype = {
    initialize: function(element, tool_tip) {
        var options = Object.extend({
            default_css: false,
            margin: "0px",
            padding: "5px",
            backgroundColor: "#d6d6fc",
            min_distance_x: 5,
            min_distance_y: 5,
            delta_x: 0,
            delta_y: 0,
            zindex: 1000
        }, arguments[2] || {});

        this.element      = $(element);
        this.options      = options;
    
        // use the supplied tooltip element or create our own div
        if($(tool_tip)) {
            this.tool_tip = $(tool_tip);
        } else {
            this.tool_tip = $(document.createElement("div")); 
            document.body.appendChild(this.tool_tip);
            this.tool_tip.addClassName("tooltip");
            this.tool_tip.appendChild(document.createTextNode(tool_tip));
        }

        // hide the tool-tip by default
        this.tool_tip.hide();

        this.eventMouseOver = this.showTooltip.bindAsEventListener(this);
        this.eventMouseOut   = this.hideTooltip.bindAsEventListener(this);
        this.eventMouseMove  = this.moveTooltip.bindAsEventListener(this);

        this.registerEvents();
    },
    destroy: function() {
        Event.stopObserving(this.element, "mouseover", this.eventMouseOver);
        Event.stopObserving(this.element, "mouseout", this.eventMouseOut);
        Event.stopObserving(this.element, "mousemove", this.eventMouseMove);
    },
    registerEvents: function() {
        Event.observe(this.element, "mouseover", this.eventMouseOver);
        Event.observe(this.element, "mouseout", this.eventMouseOut);
        Event.observe(this.element, "mousemove", this.eventMouseMove);
    },
    moveTooltip: function(event){
        Event.stop(event);
        // get Mouse position
        var mouse_x = Event.pointerX(event);
        var mouse_y = Event.pointerY(event);
    
        // decide if wee need to switch sides for the tooltip
	    var dimensions = Element.getDimensions( this.tool_tip );
	    var element_width = dimensions.width;
	    var element_height = dimensions.height;
    
        if ( (element_width + mouse_x) >= ( this.getWindowWidth() - this.options.min_distance_x) ){ // too big for X
	       mouse_x = mouse_x - element_width;
	       // apply min_distance to make sure that the mouse is not on the tool-tip
	       mouse_x = mouse_x - this.options.min_distance_x;
        } else {
	       mouse_x = mouse_x + this.options.min_distance_x;
        }
        
        if ( (element_height + mouse_y) >= ( this.getWindowHeight() - this.options.min_distance_y) ){ // too big for Y
            mouse_y = mouse_y - element_height;
            // apply min_distance to make sure that the mouse is not on the tool-tip
            mouse_y = mouse_y - this.options.min_distance_y;
        } else {
        	mouse_y = mouse_y + this.options.min_distance_y;
        } 
    
        // now set the right styles
        this.setStyles(mouse_x, mouse_y);
    },
    showTooltip: function(event) {
        Event.stop(event);
        this.moveTooltip(event);
        Element.show(this.tool_tip);
    },
    setStyles: function(x, y){
        // set the right styles to position the tool tip
        Element.setStyle(this.tool_tip, {
            position:'absolute',
            top:y + this.options.delta_y + "px",
            left:x + this.options.delta_x + "px",
            zindex:this.options.zindex
        });
    
        // apply default theme if wanted
        if (this.options.default_css){
            Element.setStyle(this.tool_tip, {
            	margin:this.options.margin,
                padding:this.options.padding,
                backgroundColor:this.options.backgroundColor,
                zindex:this.options.zindex
            }); 
      } 
    },
    hideTooltip: function(event){
        Element.hide(this.tool_tip);
    },
    getWindowHeight: function(){
        var innerHeight;
        if (navigator.appVersion.indexOf('MSIE')>0) {
            innerHeight = document.body.clientHeight;
        } else {
            innerHeight = window.innerHeight;
        }
        return innerHeight; 
    },
    getWindowWidth: function(){
        var innerWidth;
        if (navigator.appVersion.indexOf('MSIE')>0) {
            innerWidth = document.body.clientWidth;
        } else {
            innerWidth = window.innerWidth;
        }
        return innerWidth;  
    }
};
