// ###################################################################
// ## 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.isText($F(o)) && !this.isEmpty($F(o)) ) ? setValid(o) : setInvalid(o);
			if(o.hasClassName("js-validate-number"))
				( this.isNumber($F(o)) && !this.isEmpty($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="";
};