// ###################################################################
// ## NAMESPACE														##
// ###################################################################
NetEffect = {};
// Contains
// 1. FormValidator Class
// 2. AltToolTip Class

//###################################################################
//## FORMVALIDATOR CLASS											##
//###################################################################
NetEffect.FormValidator = Class.create();
NetEffect.FormValidator.prototype = {
	"initialize" : function(formObj,params) {
		this._observers = {};
		this.formObj = $(formObj);
		this.formFields = this.formObj.getElements().select(function(o,i){
			return o.className.include("js-validate");
		});
		this.formObj.observe("submit",(function(e){
			Event.stop(e);
			this.validate();
		}).bind(this));
	},
	"observe" : function(type,observer) {
		// Events: valid, invalid, validatefield, done
		if(!this._observers[type])
			this._observers[type] = [observer];
		else
			this._observers[type].push(observer);
	},
	"handleObservers" : function(type,fld) {
		if(!!this._observers[type]) {
			this._observers[type].each(function(o){
				o.apply(null,[{"field":fld,validator:this}]);
			}.bind(this));
		}
	},
	"validate" : function() {
	
		var setInvalid = (function(o) {
			o.isValid = false;
			this.errors++;
			this.handleObservers("invalid",o);
		}).bind(this);
		
		var setValid = (function(o) {
			o.isValid = true;
			this.handleObservers("valid",o);
		}).bind(this);
		
		this.errors = 0;
		
		this.formFields.each((function(o,i){
			this.handleObservers("validatefield",o);
			if(o.hasClassName("js-validate-string"))
				( this.isEmpty($F(o)) || (!this.isEmpty($F(o)) && this.isText($F(o)))) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-string-required"))
				( !this.isEmpty($F(o)) && this.isText($F(o))) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-number"))
				( this.isEmpty($F(o)) || (!this.isEmpty($F(o)) && this.isNumber($F(o)))) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-number-required"))
				( !this.isEmpty($F(o)) && this.isNumber($F(o))) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-email"))
				( this.isEmail($F(o))) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-select"))
				( !this.isEmpty($F(o))) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-radio"))
				( this.isRadioSelected(o)) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-notempty"))
				( !this.isEmpty($F(o)) ) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-phonenumber"))
				( this.isPhoneNumber($F(o)) ) ? setValid(o) : setInvalid(o);
			this.handleObservers("fieldvalidated",o);
		}).bind(this));
		
		this.handleObservers("done",this.formObj);
		
		if(this.errors == 0) {
			this.handleObservers("allvalid",this.formObj);
			this.formObj.submit();
		}
		
	},
	// String Test functions, return true or false;
	"isText" : function(value){
		return /\D/.test(value) ? true : false;
	},
	"isNumber" : function(value){
		return !isNaN(value);
	},
	"isEmail" : function(value){
		if(!/[@]/.test(value)) return false;
		var bits = value.split("@");
		if(bits.length > 2 || bits.length <= 1) return false;
		if(!bits[1].include(".") && !/\D/.test(bits[1].split(".").last()) ) return false;
		return true;
	},
	"isEmpty" : function(value) {
		return value.replace(/\s/gi,"").length == 0 ? true : false;
	},
	"isRadioSelected" : function(control) {
		var n = $(control).getAttribute("name");
		var els = $$("input[name="+n+"]");
		for(var i=0;i<els.length;i+=1)
			if($F(els[i])) return true;
		return false;
	},
	"isPhoneNumber" : function(value) {
		if(/[a-zA-Z]/.test(value)) return false;
		if(this.isEmpty(value)) return false;
		if(value.length < 7) return false;
		return true;
	}
}

// ###################################################################
// ## ALTTOOLTIP CLASS												##
// ###################################################################
NetEffect.AltToolTip = Class.create();
NetEffect.AltToolTip.prototype = {
	"initialize" : function(params) {
		this.box = document.createElement("div");
		this.box = $(document.body.appendChild(this.box));
		// Default style
		this.box.setStyle({
			"zIndex" : "10000",
			"background" : "#FFFFFF",
			"width" : "200px",
			"border" : "1px solid #000",
			"padding" : "2px"
		});
		Position.absolutize(this.box)
		this.box.hide();
		if(params) {
			params.style ? this.box.setStyle(params.style) : null;
			this.activeClassName = params.activeClassName ? params.activeClassName : null;
			this.inactiveClassName = params.inactiveClassName ? params.inactiveClassName : null;
		}
	},
	"showTip" : function(e){
		var obj = $(e.target);
		if(!obj.tttext) {
			obj.tttext = obj.alt;
			obj.alt = "";
		}
		if(obj.tttext.length > 0) {
			this.box.show();
			this.box.innerHTML = obj.tttext;
			obj.alt = "";
			
			var ch = self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
			var cw = self.innerWidth || document.documentElement.clientWidth || document.body.clienWidth;
			var coords = Position.cumulativeOffset(obj);
			var x = (coords[0] + obj.getWidth());
			if(x > (cw/2))
				x = (x - this.box.getWidth()) - obj.getWidth();
			var y = (coords[1] + obj.getHeight());
			if(y < (ch/2))
				y = (y - this.box.getHeight()) - obj.getHeight();
			this.box.setStyle({
				"left" : x+"px",
				"top" : y+"px",
				"height" : "auto"
			});
			if(this.activeClassName)
				this.box.addClassName(this.activeClassName);
			if(this.inactiveClassName)
				this.box.removeClassName(this.inactiveClassName);
		}
	},
	"hideTip" : function(e) {
		this.box.innerHTML = "";
		this.box.hide();
		if(this.activeClassName)
			this.box.addClassName(this.inactiveClassName);
		if(this.inactiveClassName)
			this.box.removeClassName(this.activeClassName);
	}
}


// +------------------------------------------------------------+
// | Flash Plugin Check											|
// | 	- neteffect.flashInfo.version //-> number				|
// | 	- neteffect.flashInfo.installed //-> boolean			|
// +------------------------------------------------------------+
NetEffect.FlashInfo = (function(){	
	var version =0,installed = false,i=20,f,d,flashData;
	if(!!(window.attachEvent && !window.opera)) {
		while(i--){
			try {
				f = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + i);
				version = i;
				installed = true;
				break;
			} catch(e){};
		};
	} else {
		if(navigator.plugins && navigator.plugins.length) {
			f = navigator.plugins["Shockwave Flash"];
			if(f) {
				installed = true;
				if(f.description){
					d = f.description;
					version = d.charAt(d.indexOf(".")-1);
				};
			} else if(navigator.plugins["Shockwave Flash 2.0"]) {
				installed = true;
				version = 2;
			};
		} else if (navigator.mimeTypes && navigator.mimeTypes.length) {
			f = navigator.mimeTypes["application/x-shockwave-flash"];
			if(f && f.enabledPlugin) {
				installed = true;
			};
		};
	};
	return {version:version,installed:installed};

})();

// +------------------------------------------------------------+
// | HtmlFlashEmbed												|
// +------------------------------------------------------------+
NetEffect.FlashMovies = {};
NetEffect.HtmlFlashEmbed = function(el)
{
	var el = $(el);
	
	if(!NetEffect.HtmlFlashEmbed.$guid)
		NetEffect.HtmlFlashEmbed.$guid = 1;
	
	var atts = {};
	var vars = {};
	var pars = {};
	
	el.getElementsBySelector("input.attribute").each(function(input){
		atts[input.name] = input.value;
	});
	
	if(!atts.swf)
		return;
	
	el.getElementsBySelector("input.variable").each(function(input){
		vars[input.name] = input.value;
	});
	
	el.getElementsBySelector("input.parameter").each(function(input){
		pars[input.name] = input.value;
	});
	
	if (!atts.id) 
		atts.id = "flashEmbed"+NetEffect.HtmlFlashEmbed.$guid++;
		
	var movieId = atts.id;
		
	if(atts.version)
		atts.version = new deconcept.PlayerVersion(atts.version.toString().split("."))
	else
		atts.version = new deconcept.PlayerVersion(8);
		
	var SO = new SWFObject();
	
	for(var key in atts)
		SO.setAttribute(key,atts[key]);
	
	for(var key in vars)
		SO.addVariable(key,vars[key]);
		
	for(var key in pars)
		SO.addParam(key,pars[key]);
		
	var html = SO.getSWFHTML();
	
	el.innerHTML = html;
	
	var api = {
		movieId : movieId,
		SO : SO,
		getMovie : function()
		{
			return (Prototype.Browser.IE) ? window[this.movieId] : document[this.movieId];
		},
		setVariable : function(key,value)
		{
			this.getMovie().SetVariable(key,value);
		}
	};
	
	NetEffect.FlashMovies[movieId] = api;
	
	return api;
};

// +------------------------------------------------------------+
// | RadioToggler for radio buttons									|
// +------------------------------------------------------------+
NetEffect.RadioToggler = function(element,target)
{
	var showRadio = $(element).down("input",1); // js-radio-toggle-on
	var hideRadio = $(element).down("input",0); // js-radio-toggle-off
	var target = $(target)|| null; // js-radio-toggle-target
	
	if(hideRadio.checked)
		target.hide();
	
	if(!hideRadio || !showRadio || !target) return;

	showRadio.observe("click",function(){
		target.show();
	});
	
	hideRadio.observe("click",function(){
		target.hide();
	});
};

// +------------------------------------------------------------+
// | Google Ajax Search											|
// +------------------------------------------------------------+
NetEffect.SearchApplication = function(formTarget,noResultsString)
{
	if(!GSearchControl && !formTarget)
		return;
	var dropShadow;
	var resultsTarget = $("ajax-search-results") || function(){
		var a = document.body.appendChild(document.createElement("div"));
		var b = a.appendChild(document.createElement("div"));
		var c = a.appendChild(document.createElement("div"));
		var d = b.appendChild(document.createElement("span"));
		var e = b.appendChild(document.createElement("span"));
		dropShadow = document.body.appendChild(document.createElement("div"));
		a.className = "search-results";
		b.className = "search-results-bar";
		c.className = "search-results-content";
		d.className = "search-results-title";
		d.innerHTML = "Zoekresultaten";
		e.className = "search-results-button-close";
		e.innerHTML = "close";
		dropShadow.className = "search-results-shadow";
		c.setAttribute("id","ajax-search-results");
		
		$(e).observe("click",function(){
			$(a).hide();
			$(dropShadow).hide();
		});
		
		$(a).hide();
		$(dropShadow).hide();
		return c;
	}();
	
	var noRsultsString = noResultsString || "Er zijn geen resultaten gevonden voor uw zoekopdracht.";
		
	var Options = new GsearcherOptions();
	Options.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
	Options.setRoot(resultsTarget);
	
	var WebSearch = new GwebSearch();
	WebSearch.setSiteRestriction(location.host);

	var SearchControl = new GSearchControl();
	SearchControl.addSearcher(WebSearch,Options);
	SearchControl.setNoResultsString(noResultsString);
	SearchControl.setSearchCompleteCallback(this,function(){
		var x = ($(document.body).getWidth()/2) - (resultsTarget.parentNode.getWidth()/2);
		var p = $(resultsTarget.parentNode);
		p.setStyle({
			left : Math.ceil((x-7)) + "px"
		});
		p.show();
		dropShadow.setStyle({
			top : (parseInt(p.getStyle("top")) + 3)+"px",
			left : (parseInt(p.getStyle("left")) + 3)+"px"
		});
		dropShadow.show();
		resultsTarget.appendChild(GSearch.getBranding());
		SearchControl.draw(formTarget);
		$(formTarget).down("input.gsc-search-button").value="";
	});
	
	SearchControl.draw(formTarget);
	$(formTarget).down("input.gsc-search-button").value="";
};


//+--------------------------------------------------------+
//| PopInBox Class	            							|
//+--------------------------------------------------------+
NetEffect.PopInBox = Class.create({
	initialize : function(params){
	
		this.params = {
			boxClass : null,
			boxStyle : null,
			contentClass : null,
			contentStyle : null,
			closeButton : null,
			closeable : false,
			x : "center",
			y : 68,
			draggable : false,
			depth : 10000,
			dropShadow : true,
			dropShadowDistance : 3
		};
		
		Object.extend(this.params,params);
		
		this.placeBox();
		
	},
	
	placeBox : function(){
		if(this.box)
			document.body.removeChild(this.box);
			
		var box = document.createElement("div");
		box = $(document.body.appendChild(box));
		
		box.setStyle({
			position : "absolute",
			zIndex : this.params.depth
		});
		
		if(this.params.boxClass)
			box.addClassName(this.params.boxClass);
			
		if(this.params.boxStyle)
			box.setStyle(this.params.boxStyle);
			
		this.box = box;	
		
		var bar = document.createElement("div");
		bar = $(box.appendChild(bar));
		
		if(this.params.barClass)
			bar.addClassName(this.params.barClass);
		else
			bar.addClassName("bar");
			
		if(this.params.boxStyle)
			bar.setStyle(this.params.barStyle);
		
		this.bar = bar;
		
		var content = document.createElement("div");
		content = $(box.appendChild(content));
		
		if(this.params.contentClass)
			content.addClassName(this.params.contentClass);
		else
			content.addClassName("content")
		
		if(this.params.contentStyle)
			content.setStyle(this.params.contentStyle);
		
		this.content = content;
		this.content.observe("click",function(e){/*e.stop()*/});
		
		if(this.params.closeable) {
		
			if (!this.params.closeButton) {
				var closeBtn = document.createElement("a");
				closeBtn = $(bar.appendChild(closeBtn));
				closeBtn.innerHTML = "close";
			} else {
				var closeBtn = document.createElement("img");
				closeBtn = $(bar.appendChild(closeBtn));
				closeBtn.src = this.params.closeButton;
				closeBtn.alt = "close";
			};
			
			
			if(this.params.closeClass) {
				closeBtn.addClassName(this.params.closeClass);
			} else {
				closeBtn.addClassName("close");
			};
			
			if(this.params.closeStyle) {
				closeBtn.setStyle(this.params.closeStyle);
			};
			
			this.closeBtn = closeBtn;
			
			this.closeBtn.observe("click",function(e){
				//e.stop();
				this.close();
			}.bind(this))
		};
		
		this.setPosition();
		
		if(this.params.dropShadow){
			var dropShadow = document.createElement("div");
			dropShadow = $(document.body.appendChild(dropShadow));
			dropShadow.hide();
			
			dropShadow.setStyle({
				background : "#000",
				opacity : .3,
				zIndex : (this.params.depth - 1),
				position: "absolute"
			});
			
			this.dropShadow = dropShadow;
		}
		
		if(this.params.draggable)
			this.makeDraggable();
	},
	
	setContent : function(value){
		this.contentHTML = value;
	},
	
	updateDimensions : function(){
		var a = this.box.getHeight();
		var b = this.box.getWidth();

		if(this.dropShadow) {
			this.dropShadow.setStyle({
				height : a + "px",
				width : b + "px"
			});
		};
		this.setPosition();
	},
	
	setPosition : function(x,y){
		var x = x || this.params.x || 0;
		var y = y || this.params.y || 0;
		
		switch(x){
			case "center":
				var boxWidth = this.box.getDimensions().width;
				var clientWidth = document.body.offsetWidth;
				x = (clientWidth/2) - (boxWidth/2);
				break;
			case "left":
				x = 0;
				break;
			case "right":
				var boxWidth = this.box.getDimensions().width;
				var clientWidth = document.body.offsetWidth;
				x = clientWidth - boxWidth;
				break;
		};
		
		switch(y){
			case "middle":
				var boxHeight = this.box.getDimensions().height;
				var clientHeight = document.body.offsetHeight;
				y = (clientHeight/2) - (boxHeight/2);
				break;
			case "top":
				y = 0;
				break;
			case "bottom":
				var boxHeight = this.box.getDimensions().height;
				var clientHeight = document.body.offsetHeight;
				y = clientHeight - boxHeight;
				break;
		};
		
		if(typeof x == "number" && typeof y == "number"){
			this.box.setStyle({
				top : y+"px",
				left : x+"px"
			});
			
			if(this.dropShadow) {			
				this.dropShadow.setStyle({
					top : (y + this.params.dropShadowDistance) + "px",
					left : (x + this.params.dropShadowDistance) + "px"
				});
			};
		};
	},
	
	open : function(){
		this.box.show();
		this.content.innerHTML = this.contentHTML;
		if(this.dropShadow){
			this.dropShadow.show();
		};
		this.updateDimensions();
	},
	
	close : function(){
		this.box.hide();
		if(this.dropShadow){
			this.dropShadow.hide();
		};
		this.content.innerHTML = "";
	},
	
	makeDraggable : function(){
		this.drag = this.drag.bind(this);
		this.bar.observe("mousedown",this.startDrag.bind(this));
		$(document).observe("mouseup",this.stopDrag.bind(this));
		
		this.bar.setStyle({
			cursor : "move"
		});
	},
	
	startDrag : function(event){
		var coords = this.box.cumulativeOffset();

		this.clickOffset = {
			x : (event.clientX - coords.left),
			y : (event.clientY - coords.top)
		};
		
		$(document).observe("mousemove",this.drag);
	},
	
	stopDrag : function(event){
		$(document).stopObserving("mousemove",this.drag);
	},
	
	drag : function(event){
		this.box.setStyle({
			top : (event.clientY - this.clickOffset.y)+"px",
			left : (event.clientX - this.clickOffset.x)+"px"
		});
		if(this.dropShadow) {
			this.dropShadow.setStyle({
				top : ((event.clientY - this.clickOffset.y) + this.params.dropShadowDistance ) + "px",
				left : ((event.clientX - this.clickOffset.x) + this.params.dropShadowDistance ) + "px"
			});
		}
	}
	
});
