/**
 * @author  Ivo Toby, Internet Voor Ondernemers (I-V-O), www.i-v-o.nl / blog.i-v-o.nl
 * @copyright I-V-O 2008
 * @requires Prototype.js (>1.61), Scriptaculous (> 1.81), wps2-library and parts of the upcoming wps3-library
 */
	var gwps = '';
	var gSearch = '';
	var gBasketController = '';
	var gCMSController ='';
	window.tinies = new Array();
	
	document.observe("dom:loaded",
		function startMe(){
			if (Prototype.Browser.IE){
				try{
					$('quickSearch').observe('keydown', function(e){
						 if (e.keyCode) code = e.keyCode;
						 if (code == 13){
							 qSearch();
						 }
					})
				}catch(e){
				//	console.log(e)
				}
			}
		}
	 )
	 
	function mOver(aObj){
		imgObj = aObj.getElementsByTagName('img');
		imgObj[0].src = imgObj[0].src.replace("_off.","_on.");
		aObj.onmouseout = function(){
			imgObj[0].src = imgObj[0].src.replace("_on.","_off.");
		}
	}
	
	function hideAll(){
		if ($('cmsContainer')) $('cmsContainer').update('');
		$('mainContainer').update('');
		
	}

	function qSearch(){
		var searchStr = $('quickSearch').getValue();
		if (!searchStr || searchStr.toString().length < 2){
			$('quickSearchError').show();
			return;
		}else{
			$('quickSearchError').hide();
		}
		hideAll();
		$('mainContainer').update('');
		$('mainContainer').show();
		gSearch = new persclubQuickSearch($('mainContainer'));
		gSearch.draw(searchStr);
//		gSearch.mode = 3;
//		_qSearch(gSearch);
	}
	
	function privateLists(){
		var text = "<p>U kunt ook zelf email-adressen opgeven waar u uw mailings aan kunt richten</p>";
		hideAll();
		$('mainContainer').show();
		$('mainContainer').update('<div id="basketEditor"><h1>Prive-lijsten</h1>' + text + '<div id="_basketEditor"></div></div>');
		gBasketController = new privateBasketController($('_basketEditor'));
		gBasketController.draw();
	}	
	
	function _qSearch(gSearch){
		if (!$('search3')){
			var func = function(){_qSearch(gSearch)}
			setTimeout(func, 500);
			return;
		}
		var searchStr = $('quickSearch').getValue();
		gSearch.doQuickSearch($('mainContainer'), searchStr);		
	}
	
	function shareLists(){
		hideAll();
		$('mainContainer').show();
		var listShare = new persclubListShare($('mainContainer'));
		listShare.draw();
	}

	function sharePrivateLists(){
		hideAll();
		$('mainContainer').show();
		var listShare = new persclubPrivateListShare($('mainContainer'));
		listShare.draw();
	}

	//
	function startSearch(){
		hideAll();
		$('mainContainer').show();
		gSearch = new persclubSearch($('mainContainer'));
		gSearch.draw();
	}
	
	function startBasketManager(){
		hideAll();
		$('mainContainer').show();
		$('mainContainer').update('<div id="basketEditor" style="display:none;"><h1>Lijstenbeheer</h1><div id="_basketEditor"></div></div>');
		$('basketEditor').show();
		gBasketController = new basketController($('_basketEditor'));
		gBasketController.draw();
	}
	
	function startActivityManager(){
		hideAll();
		$('mainContainer').show();
		$('mainContainer').update('<div><h1>Activiteiten beheer</h1><div id="activityEditor"></div></div>');
		gActivityController = new activityController($('activityEditor'));
		gActivityController.draw();
	}
	
	waiter = function (){
		$('persWaiter').show();
	}
	
	unWaiter = function (){
		$('persWaiter').hide();
	}
	
	
	Object.extend(textHTML,{
		interpret : function(elem,args){
			var arr = this[elem];
			var output = '';
			var i = 0;
			arr.each(
				function(token){
					if (args[i]) {
						output += token + args[i];
					}else{
						output += token;
					}
					i++;
				}
			)
			return output;
		}
	});	
	
	Object.extend(basketTextHTML,{
		interpret : function(elem,args){
			var arr = this[elem];
			var output = '';
			var i = 0;
			arr.each(
				function(token){
					if (args[i]) {
						output += token + args[i];
					}else{
						output += token;
					}
					i++;
				}
			)
			return output;
		}
	});	
	
	
	function get_html_translation_table(table, quote_style) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: Philip Peterson
	    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // %          note: It has been decided that we're not going to add global
	    // %          note: dependencies to php.js. Meaning the constants are not
	    // %          note: real constants, but strings instead. integers are also supported if someone
	    // %          note: chooses to create the constants themselves.
	    // %          note: Table from http://www.the-art-of-web.com/html/character-codes/
	    // *     example 1: get_html_translation_table('HTML_SPECIALCHARS');
	    // *     returns 1: {'"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}
	    
	    var entities = {}, histogram = {}, decimal = 0, symbol = '';
	    var constMappingTable = {}, constMappingQuoteStyle = {};
	    var useTable = {}, useQuoteStyle = {};
	    
	    useTable      = (table ? table.toUpperCase() : 'HTML_SPECIALCHARS');
	    useQuoteStyle = (quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT');
	    
	    // Translate arguments
	    constMappingTable[0]      = 'HTML_SPECIALCHARS';
	    constMappingTable[1]      = 'HTML_ENTITIES';
	    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
	    constMappingQuoteStyle[2] = 'ENT_COMPAT';
	    constMappingQuoteStyle[3] = 'ENT_QUOTES';
	    
	    // Map numbers to strings for compatibilty with PHP constants
	    if (!isNaN(useTable)) {
	        useTable = constMappingTable[useTable];
	    }
	    if (!isNaN(useQuoteStyle)) {
	        useQuoteStyle = constMappingQuoteStyle[useQuoteStyle];
	    }
	    
	    if (useTable == 'HTML_SPECIALCHARS') {
	        // ascii decimals for better compatibility
	        entities['60'] = '&lt;';
	        entities['62'] = '&gt;';
	        entities['38'] = '&amp;';
	    } else if (useTable == 'HTML_ENTITIES') {
	        // ascii decimals for better compatibility
	      entities['38'] = '&amp;';
	      entities['60'] = '&lt;';
	      entities['62'] = '&gt;';
	      entities['160'] = '&nbsp;';
	      entities['161'] = '&iexcl;';
	      entities['162'] = '&cent;';
	      entities['163'] = '&pound;';
	      entities['164'] = '&curren;';
	      entities['165'] = '&yen;';
	      entities['166'] = '&brvbar;';
	      entities['167'] = '&sect;';
	      entities['168'] = '&uml;';
	      entities['169'] = '&copy;';
	      entities['170'] = '&ordf;';
	      entities['171'] = '&laquo;';
	      entities['172'] = '&not;';
	      entities['173'] = '&shy;';
	      entities['174'] = '&reg;';
	      entities['175'] = '&macr;';
	      entities['176'] = '&deg;';
	      entities['177'] = '&plusmn;';
	      entities['178'] = '&sup2;';
	      entities['179'] = '&sup3;';
	      entities['180'] = '&acute;';
	      entities['181'] = '&micro;';
	      entities['182'] = '&para;';
	      entities['183'] = '&middot;';
	      entities['184'] = '&cedil;';
	      entities['185'] = '&sup1;';
	      entities['186'] = '&ordm;';
	      entities['187'] = '&raquo;';
	      entities['188'] = '&frac14;';
	      entities['189'] = '&frac12;';
	      entities['190'] = '&frac34;';
	      entities['191'] = '&iquest;';
	      entities['192'] = '&Agrave;';
	      entities['193'] = '&Aacute;';
	      entities['194'] = '&Acirc;';
	      entities['195'] = '&Atilde;';
	      entities['196'] = '&Auml;';
	      entities['197'] = '&Aring;';
	      entities['198'] = '&AElig;';
	      entities['199'] = '&Ccedil;';
	      entities['200'] = '&Egrave;';
	      entities['201'] = '&Eacute;';
	      entities['202'] = '&Ecirc;';
	      entities['203'] = '&Euml;';
	      entities['204'] = '&Igrave;';
	      entities['205'] = '&Iacute;';
	      entities['206'] = '&Icirc;';
	      entities['207'] = '&Iuml;';
	      entities['208'] = '&ETH;';
	      entities['209'] = '&Ntilde;';
	      entities['210'] = '&Ograve;';
	      entities['211'] = '&Oacute;';
	      entities['212'] = '&Ocirc;';
	      entities['213'] = '&Otilde;';
	      entities['214'] = '&Ouml;';
	      entities['215'] = '&times;';
	      entities['216'] = '&Oslash;';
	      entities['217'] = '&Ugrave;';
	      entities['218'] = '&Uacute;';
	      entities['219'] = '&Ucirc;';
	      entities['220'] = '&Uuml;';
	      entities['221'] = '&Yacute;';
	      entities['222'] = '&THORN;';
	      entities['223'] = '&szlig;';
	      entities['224'] = '&agrave;';
	      entities['225'] = '&aacute;';
	      entities['226'] = '&acirc;';
	      entities['227'] = '&atilde;';
	      entities['228'] = '&auml;';
	      entities['229'] = '&aring;';
	      entities['230'] = '&aelig;';
	      entities['231'] = '&ccedil;';
	      entities['232'] = '&egrave;';
	      entities['233'] = '&eacute;';
	      entities['234'] = '&ecirc;';
	      entities['235'] = '&euml;';
	      entities['236'] = '&igrave;';
	      entities['237'] = '&iacute;';
	      entities['238'] = '&icirc;';
	      entities['239'] = '&iuml;';
	      entities['240'] = '&eth;';
	      entities['241'] = '&ntilde;';
	      entities['242'] = '&ograve;';
	      entities['243'] = '&oacute;';
	      entities['244'] = '&ocirc;';
	      entities['245'] = '&otilde;';
	      entities['246'] = '&ouml;';
	      entities['247'] = '&divide;';
	      entities['248'] = '&oslash;';
	      entities['249'] = '&ugrave;';
	      entities['250'] = '&uacute;';
	      entities['251'] = '&ucirc;';
	      entities['252'] = '&uuml;';
	      entities['253'] = '&yacute;';
	      entities['254'] = '&thorn;';
	      entities['255'] = '&yuml;';
	    } else {
	        throw Error("Table: "+useTable+' not supported');
	        return false;
	    }
	    
	    if (useQuoteStyle != 'ENT_NOQUOTES') {
	        entities['34'] = '&quot;';
	    }
	    
	    if (useQuoteStyle == 'ENT_QUOTES') {
	        entities['39'] = '&#039;';
	    }
	    
	    // ascii decimals to real symbols
	    for (decimal in entities) {
	        symbol = String.fromCharCode(decimal)
	        histogram[symbol] = entities[decimal];
	    }
	    
	    return histogram;
	}

	function recursivehtml_entity_decode(string){
		if ( (string.indexOf('&amp;') > -1) || (string.indexOf('&lt;') > -1) ){
			string = html_entity_decode(string);
			return recursivehtml_entity_decode(string); 
		}
		return string;
	}

	function html_entity_decode(string, quote_style ){
		var value  = _html_entity_decode(string, quote_style);
		return _html_entity_decode(value);
		
	}
	
	function _html_entity_decode( string, quote_style ) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: john (http://www.jd-tech.net)
	    // +      input by: ger
	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   bugfixed by: Onno Marsman
	    // +   improved by: marc andreu
	    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // -    depends on: get_html_translation_table
	    // *     example 1: html_entity_decode('Kevin &amp; van Zonneveld');
	    // *     returns 1: 'Kevin & van Zonneveld'
	 
	    var histogram = {}, symbol = '', tmp_str = '', i = 0;
	    tmp_str = string.toString();
	    
	    if (false === (histogram = get_html_translation_table('HTML_ENTITIES', quote_style))) {
	        return false;
	    }
	    
	    for (symbol in histogram) {
	        entity = histogram[symbol];
	        tmp_str = tmp_str.split(entity).join(symbol);
	    }
	    
	    return tmp_str;
	}
	
	validateNoPersreisForm = function(){
			var ok = true;
			if (!checkForValue($('email_no_thanks'))){
				$("email_no_thanks_error").show();
				ok = false;
			}else{
				$("email_no_thanks_error").hide();
			}
			if (ok){
				
				var RPCObj = new rpc;
				RPCObj.debug = true;
				RPCObj.attachWaiter(waiter, this);
				RPCObj.attachUnWaiter(unWaiter, this);
				RPCObj.createCall('persclubPersreis', function(req){setNoGo(req, $('landingForm_nothanks'), '')});
				RPCObj.addArgument('wontgo', "true");
				RPCObj.addArgument('why', '<![CDATA[' + encodeURIComponent($('why_no_thanks').getValue()) + " ]]>");
				RPCObj.addArgument('invitationID', $('noGoInvitationID').getValue());
				RPCObj.addArgument('email', $("email_no_thanks").getValue());
				RPCObj.call('confirmInvitation');		
			}
	}
	
	validatePersreisForm = function(form, type){
		try{
			var pForm = form;
			// elems to check ;
			var ok = true;
			$A(pForm.elements).each(
				function(inputElem){
					var elemID = inputElem.id;
					if (elemID){
					if (inputElem.getAttribute('ispostcode') == 'true'){
						
						if (!checkPostcodeValue(inputElem)){
							$(elemID+"_error" ).style.display = "block";
							ok = false;
						}else{
							$(elemID+"_error" ).style.display = "none";
						}
					}
					if (inputElem.getAttribute('isnumeric') == 'true'){
						var elemID = inputElem.id;
						if (!checkNumericValue(inputElem)){
							$(elemID+"_error" ).style.display = "block";
							ok = false;
						}else{
							$(elemID+"_error" ).style.display = "none";
						}
					}
					if (inputElem.getAttribute('mandatory') == 'true'){
						var elemID = inputElem.id;
						if (!checkForValue(inputElem)){
							$(elemID+"_error" ).style.display = "block";
							ok = false;
						}else{
							$(elemID+"_error" ).style.display = "none";
						}
					}
					}
				}
			)
			if (ok){
				confirmInvitation(pForm, type)
			}
		}catch(e){
			if (window.console){
				console.log(e.message);
			}else{
				alert(e.message + " / file : " + e.fileName + " line : " + e.lineNumber);
				if (window.console) console.log(e.message);
			}
		}
	}
	
	confirmInvitation = function(pForm, type){
		var checkboxes = $H({});
		var RPCObj = new rpc;
		RPCObj.debug = true;
		RPCObj.attachWaiter(waiter, this);
		RPCObj.attachUnWaiter(unWaiter, this);
		RPCObj.createCall('persclubPersreis', function(req){setConfirmed(req, pForm, type)});
		pForm = $(pForm);
		$A(pForm.elements).each(
				function(inputElem){
					if (inputElem.type.toLowerCase() =='button'){
						// do nothing
					}else if (inputElem.type.toLowerCase() =='radio'){
						if (inputElem.checked){
							RPCObj.addArgument(inputElem.name, '<![CDATA[' + encodeURIComponent(inputElem.getAttribute('value')) + " ]]>");
						}
					}else if (inputElem.type.toLowerCase() =='checkbox'){
						if (inputElem.checked){
//							RPCObj.addArgument(inputElem.name, '<![CDATA[' + encodeURIComponent(inputElem.getAttribute('value')) + " ]]>");
							if (checkboxes.get(inputElem.name)){
								var previous = checkboxes.get(inputElem.name);
							}else{
								var previous = '';
							}
							checkboxes.set(inputElem.name,  previous +  inputElem.getAttribute('value') +"," )
						}
					}else{
							RPCObj.addArgument(inputElem.getAttribute('name'), '<![CDATA[' + encodeURIComponent(inputElem.value) + " ]]>");
					}
				}
		);
		checkboxes.keys().each(
			function(key){
				RPCObj.addArgument(key, '<![CDATA[' + encodeURIComponent(checkboxes.get(key)) + ']]>');
			}
		)
		RPCObj.addArgument('type', type);
		RPCObj.call('confirmInvitation');	
	}
	
	setConfirmed = function(req, form, type){
		form.style.display = "none";
		
//		$$('.confirmationText')[0].style.display = "none";
		$$('.invitationHeader').each(function(elem){elem.style.display = "none";});
		
		if (req.responseJSON.message == 'true'){
			var div = new Element('div', {className:'confirmedText'}).update('<b>Bedankt voor uw aanmelding!</b>');
			$(form.parentNode).insert(div);
		}else{
			if (req.responseJSON.message == 'confirmed'){
				var confirmedDate = req.responseJSON.date;
				var div = new Element('div', {className:'confirmedText'}).update('<b>Aanmelden mislukt!</b><br/><p>Uw aanmelding heeft reeds plaatsgevonden op : ' + confirmedDate + '</p>');
				$(form.parentNode).insert(div);
			}
		}
		
	}
	
	setNoGo= function(req, form){
		form.style.display = "none";
		$$('.invitationHeader').each(function(elem){elem.style.display = "none";});
		if (req.responseJSON.message == 'true'){
			var div = new Element('div', {className:'confirmedText'}).update('<b>Bedankt voor uw afmelding</b>');
			$(form.parentNode).insert(div);
		}else{
			if (req.responseJSON.message == 'confirmed'){
				var confirmedDate = req.responseJSON.date;
				var div = new Element('div', {className:'confirmedText'}).update('<b>Afmelden mislukt!</b><br/><p>Uw aanmelding heeft reeds plaatsgevonden op : ' + confirmedDate + '</p>');
				$(form.parentNode).insert(div);
			}
		}
		
	}
	
	validatePostCode = function(strPC){
		return typeof strPC=='string' ?strPC.match(/[1-9][0-9]{3} ?[a-zA-Z]{2}/)==strPC:false;	
	}

	checkPostcodeValue = function(inputElem){
		inputElem = $(inputElem);
		var value = inputElem.getValue().stripTags().replace(' ', '');
		if (value.length > 2){
			if (validatePostCode(value)){
				return true;
			}
			return false;
		}
		return true;
	}

	isnumber = function(a){
		return typeof a == 'number' && isFinite(a);
	}

	checkNumericValue = function(inputElem){
		inputElem = $(inputElem);
		var value = inputElem.getValue().stripTags().replace(' ', '');
		if (value != ''){
			value = parseInt(value);
			if (isnumber(value)){
				return true;
			}
			return false;
		}
		return true;
	}

	
	checkForValue = function(inputElem){
		inputElem = $(inputElem);
		var value = inputElem.getValue().stripTags().replace(' ', '');
		if (value == ''){
			return false;
		}
		// check data-related fields:
		if (inputElem.name == 'email' || inputElem.getAttribute('isemail') == 'true' ){
			var dummyObj = {controller:{lang:{get:function(){return 0;}}}};
			var cField = new crudderField('', '', dummyObj);
			if (!cField.isemail(inputElem.getValue())){
				return false;
			}
		}
		return true;
	}
	
	searchSelectAll = function(){
		$$('input').each(
			function(elem){
				if (elem.getAttribute('type') == 'checkbox'){
					elem.checked = true;
				}
			}
		)
	}
	
	searchUnSelectAll = function(){
		$$('input').each(
				function(elem){
					if (elem.getAttribute('type') == 'checkbox'){
						elem.checked = false;
					}
				}
			)
	}
	
	searchSelectInvert = function(){
		$$('input').each(
				function(elem){
					if (elem.getAttribute('type') == 'checkbox'){
						if (elem.checked){
							elem.checked = false;
						}else{
							elem.checked = true;
						}
					}
				}
			)
	}
	
	postMVGForm = function(containerID){
		var RPCObj = new rpc;
		// get form-elements:

		RPCObj.debug = true;

		RPCObj.attachWaiter(this.waiter, this);
		RPCObj.attachUnWaiter(this.unWaiter, this);
		RPCObj.createCall('persclubSearch', function(){
			new Effect.BlindUp($(containerID));
			alert("Uw email is verzonden, bedankt voor uw correctie!");
		}, this);
		RPCObj.setMethod('reportCorrection');
		$$('#'+containerID+ ' form input').each(
			function(elem){
				RPCObj.addArgument(elem.name, elem.getValue());		
			}
		)
		$$('#'+containerID+ ' form select').each(
			function(elem){
				RPCObj.addArgument(elem.name, elem.getValue());		
			}
		)
		RPCObj.call();
	}

	shader = function(event, text){
		if (text){
			$('shaderOverlay').update(text);
		}
		var button = new Element('a').update('annuleren');
		$('shaderOverlay').insert("<br/>");
		$('shaderOverlay').insert(button);
		$('shaderOverlay').show();
		button.observe('click', unShader);
		var height = $('mainContainer').getHeight();
		
		$('shader').setStyle('height:' + height + 'px;');
		$('shader').show();
	}
	
	unShader = function(){
		$('shaderOverlay').update('');
		$('shaderOverlay').hide();
		$('shader').hide();
	}

	cleanupTiny = function(){
		 //t.win.document is null
	}
	
	saveNote = function(jID){
		var text = $('notes_' + jID).getValue();
		text = encodeURIComponent(text);
				
		var RPCObj = new rpc;
		RPCObj.createCall('persclubSearch', '', this);
		RPCObj.setMethod('storeNote');
			
		RPCObj.addArgument('journalist_id', jID);
		RPCObj.addArgument('text', text);
		RPCObj.setCallback(
			function(){
				setNoteSaved(jID);
			}
		);
		RPCObj.call();				
	}
	
	setNoteSaved = function(jID){
		$('notification_'+jID).show();
		setTimeout(
			function(){
				new Effect.Fade($('notification_'+jID));
			}
		, 5000)
		new Effect.Shake($('notes_' + jID));
	}
