﻿function insertHeaderByClass(classes, movie, width)
{
	var classes = classes.split(",");
	for (var i in classes)
	{
		var elementen = _getElementsByClass( classes[i] ); 		
		for (var j in elementen)
		{
			var node = elementen[j];
			if (node != null)
			{
				var de_tekst	= node.innerHTML.replace(new RegExp( "[\\r\\n]", "g" ), "");
				node.innerHTML	= _insertFlashKop(de_tekst, movie, height);
			}
		}
	}
}


function insertHeaderById(ids, movie, width)
{
	var ids = ids.split(",");
	for (var i in ids)
	{
		var node = document.getElementById( ids[i] );
		if (node != null)
		{
			var de_tekst	= node.innerHTML.replace(new RegExp( "[\\r\\n]", "g" ), "");
			node.innerHTML	= _insertFlashKop(de_tekst, movie, width);
		}
	}
}


function insertHeaderByTag(tags, movie, width)
{
	var tags = tags.split(",");
	for (var i in tags)
	{
		elements = document.getElementsByTagName( tags[i] );
		for (var j=0; j<elements.length; j++)
		{
			var node = elements[j];
			if (node != null)
			{
				var de_tekst	= node.innerHTML.replace(new RegExp( "[\\r\\n]", "g" ), "");
				node.innerHTML	= _insertFlashKop(de_tekst, movie, width);
			}
		}
	}
}

function clearInput( id )
{
	var el = document.getElementById(id);
	if(el)
	{
		el.onblur = function()
		{
			if (this.value=='') this.value = this.defaultValue;
		}
		el.onfocus = function()
		{
			if (this.defaultValue==this.value) this.value = '';
		}
	}
}


// interne functies
function _getElementsByClass(className, tag, element)
{
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];

	var length = elements.length;
	for(var i=0; i<length; i++)
	{
		var current = elements[i];
		if( testClass.test(current.className) )	returnElements.push(current);
	}
	
	return returnElements;
}

function _escape(r)
{
	if (encodeURIComponent)	return encodeURIComponent(r);
	else					return escape(r);
}

__encoder = false;
function _encodeHTML(html)
{
	if(!__encoder) __encoder = _generateEncoder();
	var html = __encoder.htmlDecode(html);
	
	return _escape(html);
} 


flash_id = 0;
function _insertFlashKop(tekst, movie, width)
{
	flash_id++; // unieke id genereren
	
	if( !width)	width = '100%';
	height = '1';
	
	var	flashkop = ['<object id="flashkop_object',	flash_id, '" ',
					'classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" ',
					'width="', 							width, '" ',
					'height="', 						height, '">',
					'<param name="movie" value="/swf/', movie,
					'?titel=', 							_encodeHTML(tekst),
					'&id=', 							flash_id,
					'&breedte=', 						_escape(width), '" />',
					'<param name="wmode" value="transparent" />',
					'<param name="quality" value="high" />',
					
					'<embed id="flashkop_embed', 		flash_id, '" ',
					'wmode="transparent" ',
					'src="/swf/', 						movie,
					'?titel=', 							_encodeHTML(tekst),
					'&id=', 							flash_id,
					'&breedte=', 						_escape(width), '" ',
					'quality="high" ',
					'pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" ',
					'width="', 							width , '" ',
					'height="', 						height, '">',
					'</embed>',
					'</object>\r\n'].join('');
	
	return flashkop;
}

function _adjustHeight(height, id)
{
	var obj = document.getElementById('flashkop_object' + id);
	var emb = document.getElementById('flashkop_embed' + id);
	obj.height = height;
	emb.height = height;
}


function _generateEncoder()
{
	return {

		// When encoding do we convert characters into html or numerical entities
		EncodeType : "entity",  // entity OR numerical

		isEmpty : function(val){
			if(val){
				return ((val===null) || val.length==0 || /^\s+$/.test(val));
			}else{
				return true;
			}
		},
		// Convert HTML entities into numerical entities
		HTML2Numerical : function(s){
			var arr1 = new Array('&nbsp;','&iexcl;','&cent;','&pound;','&curren;','&yen;','&brvbar;','&sect;','&uml;','&copy;','&ordf;','&laquo;','&not;','&shy;','&reg;','&macr;','&deg;','&plusmn;','&sup2;','&sup3;','&acute;','&micro;','&para;','&middot;','&cedil;','&sup1;','&ordm;','&raquo;','&frac14;','&frac12;','&frac34;','&iquest;','&agrave;','&aacute;','&acirc;','&atilde;','&Auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;','&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;','&Ouml;','&times;','&oslash;','&ugrave;','&uacute;','&ucirc;','&Uuml;','&yacute;','&thorn;','&szlig;','&agrave;','&aacute;','&acirc;','&atilde;','&auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;','&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;','&ouml;','&divide;','&oslash;','&ugrave;','&uacute;','&ucirc;','&uuml;','&yacute;','&thorn;','&yuml;','&quot;','&amp;','&lt;','&gt;','&oelig;','&oelig;','&scaron;','&scaron;','&yuml;','&circ;','&tilde;','&ensp;','&emsp;','&thinsp;','&zwnj;','&zwj;','&lrm;','&rlm;','&ndash;','&mdash;','&lsquo;','&rsquo;','&sbquo;','&ldquo;','&rdquo;','&bdquo;','&dagger;','&dagger;','&permil;','&lsaquo;','&rsaquo;','&euro;','&fnof;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigmaf;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&thetasym;','&upsih;','&piv;','&bull;','&hellip;','&prime;','&prime;','&oline;','&frasl;','&weierp;','&image;','&real;','&trade;','&alefsym;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&crarr;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&forall;','&part;','&exist;','&empty;','&nabla;','&isin;','&notin;','&ni;','&prod;','&sum;','&minus;','&lowast;','&radic;','&prop;','&infin;','&ang;','&and;','&or;','&cap;','&cup;','&int;','&there4;','&sim;','&cong;','&asymp;','&ne;','&equiv;','&le;','&ge;','&sub;','&sup;','&nsub;','&sube;','&supe;','&oplus;','&otimes;','&perp;','&sdot;','&lceil;','&rceil;','&lfloor;','&rfloor;','&lang;','&rang;','&loz;','&spades;','&clubs;','&hearts;','&diams;');
			var arr2 = new Array('&#160;','&#161;','&#162;','&#163;','&#164;','&#165;','&#166;','&#167;','&#168;','&#169;','&#170;','&#171;','&#172;','&#173;','&#174;','&#175;','&#176;','&#177;','&#178;','&#179;','&#180;','&#181;','&#182;','&#183;','&#184;','&#185;','&#186;','&#187;','&#188;','&#189;','&#190;','&#191;','&#192;','&#193;','&#194;','&#195;','&#196;','&#197;','&#198;','&#199;','&#200;','&#201;','&#202;','&#203;','&#204;','&#205;','&#206;','&#207;','&#208;','&#209;','&#210;','&#211;','&#212;','&#213;','&#214;','&#215;','&#216;','&#217;','&#218;','&#219;','&#220;','&#221;','&#222;','&#223;','&#224;','&#225;','&#226;','&#227;','&#228;','&#229;','&#230;','&#231;','&#232;','&#233;','&#234;','&#235;','&#236;','&#237;','&#238;','&#239;','&#240;','&#241;','&#242;','&#243;','&#244;','&#245;','&#246;','&#247;','&#248;','&#249;','&#250;','&#251;','&#252;','&#253;','&#254;','&#255;','&#34;','&#38;','&#60;','&#62;','&#338;','&#339;','&#352;','&#353;','&#376;','&#710;','&#732;','&#8194;','&#8195;','&#8201;','&#8204;','&#8205;','&#8206;','&#8207;','&#8211;','&#8212;','&#8216;','&#8217;','&#8218;','&#8220;','&#8221;','&#8222;','&#8224;','&#8225;','&#8240;','&#8249;','&#8250;','&#8364;','&#402;','&#913;','&#914;','&#915;','&#916;','&#917;','&#918;','&#919;','&#920;','&#921;','&#922;','&#923;','&#924;','&#925;','&#926;','&#927;','&#928;','&#929;','&#931;','&#932;','&#933;','&#934;','&#935;','&#936;','&#937;','&#945;','&#946;','&#947;','&#948;','&#949;','&#950;','&#951;','&#952;','&#953;','&#954;','&#955;','&#956;','&#957;','&#958;','&#959;','&#960;','&#961;','&#962;','&#963;','&#964;','&#965;','&#966;','&#967;','&#968;','&#969;','&#977;','&#978;','&#982;','&#8226;','&#8230;','&#8242;','&#8243;','&#8254;','&#8260;','&#8472;','&#8465;','&#8476;','&#8482;','&#8501;','&#8592;','&#8593;','&#8594;','&#8595;','&#8596;','&#8629;','&#8656;','&#8657;','&#8658;','&#8659;','&#8660;','&#8704;','&#8706;','&#8707;','&#8709;','&#8711;','&#8712;','&#8713;','&#8715;','&#8719;','&#8721;','&#8722;','&#8727;','&#8730;','&#8733;','&#8734;','&#8736;','&#8743;','&#8744;','&#8745;','&#8746;','&#8747;','&#8756;','&#8764;','&#8773;','&#8776;','&#8800;','&#8801;','&#8804;','&#8805;','&#8834;','&#8835;','&#8836;','&#8838;','&#8839;','&#8853;','&#8855;','&#8869;','&#8901;','&#8968;','&#8969;','&#8970;','&#8971;','&#9001;','&#9002;','&#9674;','&#9824;','&#9827;','&#9829;','&#9830;');
			return this.swapArrayVals(s,arr1,arr2);
		},	

		// Convert Numerical entities into HTML entities
		NumericalToHTML : function(s){
			var arr1 = new Array('&#160;','&#161;','&#162;','&#163;','&#164;','&#165;','&#166;','&#167;','&#168;','&#169;','&#170;','&#171;','&#172;','&#173;','&#174;','&#175;','&#176;','&#177;','&#178;','&#179;','&#180;','&#181;','&#182;','&#183;','&#184;','&#185;','&#186;','&#187;','&#188;','&#189;','&#190;','&#191;','&#192;','&#193;','&#194;','&#195;','&#196;','&#197;','&#198;','&#199;','&#200;','&#201;','&#202;','&#203;','&#204;','&#205;','&#206;','&#207;','&#208;','&#209;','&#210;','&#211;','&#212;','&#213;','&#214;','&#215;','&#216;','&#217;','&#218;','&#219;','&#220;','&#221;','&#222;','&#223;','&#224;','&#225;','&#226;','&#227;','&#228;','&#229;','&#230;','&#231;','&#232;','&#233;','&#234;','&#235;','&#236;','&#237;','&#238;','&#239;','&#240;','&#241;','&#242;','&#243;','&#244;','&#245;','&#246;','&#247;','&#248;','&#249;','&#250;','&#251;','&#252;','&#253;','&#254;','&#255;','&#34;','&#38;','&#60;','&#62;','&#338;','&#339;','&#352;','&#353;','&#376;','&#710;','&#732;','&#8194;','&#8195;','&#8201;','&#8204;','&#8205;','&#8206;','&#8207;','&#8211;','&#8212;','&#8216;','&#8217;','&#8218;','&#8220;','&#8221;','&#8222;','&#8224;','&#8225;','&#8240;','&#8249;','&#8250;','&#8364;','&#402;','&#913;','&#914;','&#915;','&#916;','&#917;','&#918;','&#919;','&#920;','&#921;','&#922;','&#923;','&#924;','&#925;','&#926;','&#927;','&#928;','&#929;','&#931;','&#932;','&#933;','&#934;','&#935;','&#936;','&#937;','&#945;','&#946;','&#947;','&#948;','&#949;','&#950;','&#951;','&#952;','&#953;','&#954;','&#955;','&#956;','&#957;','&#958;','&#959;','&#960;','&#961;','&#962;','&#963;','&#964;','&#965;','&#966;','&#967;','&#968;','&#969;','&#977;','&#978;','&#982;','&#8226;','&#8230;','&#8242;','&#8243;','&#8254;','&#8260;','&#8472;','&#8465;','&#8476;','&#8482;','&#8501;','&#8592;','&#8593;','&#8594;','&#8595;','&#8596;','&#8629;','&#8656;','&#8657;','&#8658;','&#8659;','&#8660;','&#8704;','&#8706;','&#8707;','&#8709;','&#8711;','&#8712;','&#8713;','&#8715;','&#8719;','&#8721;','&#8722;','&#8727;','&#8730;','&#8733;','&#8734;','&#8736;','&#8743;','&#8744;','&#8745;','&#8746;','&#8747;','&#8756;','&#8764;','&#8773;','&#8776;','&#8800;','&#8801;','&#8804;','&#8805;','&#8834;','&#8835;','&#8836;','&#8838;','&#8839;','&#8853;','&#8855;','&#8869;','&#8901;','&#8968;','&#8969;','&#8970;','&#8971;','&#9001;','&#9002;','&#9674;','&#9824;','&#9827;','&#9829;','&#9830;');
			var arr2 = new Array('&nbsp;','&iexcl;','&cent;','&pound;','&curren;','&yen;','&brvbar;','&sect;','&uml;','&copy;','&ordf;','&laquo;','&not;','&shy;','&reg;','&macr;','&deg;','&plusmn;','&sup2;','&sup3;','&acute;','&micro;','&para;','&middot;','&cedil;','&sup1;','&ordm;','&raquo;','&frac14;','&frac12;','&frac34;','&iquest;','&agrave;','&aacute;','&acirc;','&atilde;','&Auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;','&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;','&Ouml;','&times;','&oslash;','&ugrave;','&uacute;','&ucirc;','&Uuml;','&yacute;','&thorn;','&szlig;','&agrave;','&aacute;','&acirc;','&atilde;','&auml;','&aring;','&aelig;','&ccedil;','&egrave;','&eacute;','&ecirc;','&euml;','&igrave;','&iacute;','&icirc;','&iuml;','&eth;','&ntilde;','&ograve;','&oacute;','&ocirc;','&otilde;','&ouml;','&divide;','&oslash;','&ugrave;','&uacute;','&ucirc;','&uuml;','&yacute;','&thorn;','&yuml;','&quot;','&amp;','&lt;','&gt;','&oelig;','&oelig;','&scaron;','&scaron;','&yuml;','&circ;','&tilde;','&ensp;','&emsp;','&thinsp;','&zwnj;','&zwj;','&lrm;','&rlm;','&ndash;','&mdash;','&lsquo;','&rsquo;','&sbquo;','&ldquo;','&rdquo;','&bdquo;','&dagger;','&dagger;','&permil;','&lsaquo;','&rsaquo;','&euro;','&fnof;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&alpha;','&beta;','&gamma;','&delta;','&epsilon;','&zeta;','&eta;','&theta;','&iota;','&kappa;','&lambda;','&mu;','&nu;','&xi;','&omicron;','&pi;','&rho;','&sigmaf;','&sigma;','&tau;','&upsilon;','&phi;','&chi;','&psi;','&omega;','&thetasym;','&upsih;','&piv;','&bull;','&hellip;','&prime;','&prime;','&oline;','&frasl;','&weierp;','&image;','&real;','&trade;','&alefsym;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&crarr;','&larr;','&uarr;','&rarr;','&darr;','&harr;','&forall;','&part;','&exist;','&empty;','&nabla;','&isin;','&notin;','&ni;','&prod;','&sum;','&minus;','&lowast;','&radic;','&prop;','&infin;','&ang;','&and;','&or;','&cap;','&cup;','&int;','&there4;','&sim;','&cong;','&asymp;','&ne;','&equiv;','&le;','&ge;','&sub;','&sup;','&nsub;','&sube;','&supe;','&oplus;','&otimes;','&perp;','&sdot;','&lceil;','&rceil;','&lfloor;','&rfloor;','&lang;','&rang;','&loz;','&spades;','&clubs;','&hearts;','&diams;');
			return this.swapArrayVals(s,arr1,arr2);
		},


		// Numerically encodes all unicode characters
		numEncode : function(s){
			
			if(this.isEmpty(s)) return "";

			var e = "";
			for (var i = 0; i < s.length; i++)
			{
				var c = s.charAt(i);
				if (c < " " || c > "~")
				{
					c = "&#" + c.charCodeAt() + ";";
				}
				e += c;
			}
			return e;
		},
		
		// HTML Decode numerical and HTML entities back to original values
		htmlDecode : function(s){

			var c,m,d = s;
			
			if(this.isEmpty(d)) return "";

			// convert HTML entites back to numerical entites first
			d = this.HTML2Numerical(d);
			
			// look for numerical entities &#34;
			arr=d.match(/&#[0-9]{1,5};/g);
			
			// if no matches found in string then skip
			if(arr!=null){
				for(var x=0;x<arr.length;x++){
					m = arr[x];
					c = m.substring(2,m.length-1); //get numeric part which is refernce to unicode character
					// if its a valid number we can decode
					if(c >= -32768 && c <= 65535){
						// decode every single match within string
						d = d.replace(m, String.fromCharCode(c));
					}else{
						d = d.replace(m, ""); //invalid so replace with nada
					}
				}			
			}

			return d;
		},		

		// encode an input string into either numerical or HTML entities
		htmlEncode : function(s,dbl){
				
			if(this.isEmpty(s)) return "";

			// do we allow double encoding? E.g will &amp; be turned into &amp;amp;
			dbl = dbl | false; //default to prevent double encoding
			
			// if allowing double encoding we do ampersands first
			if(dbl){
				if(this.EncodeType=="numerical"){
					s = s.replace(/&/g, "&#38;");
				}else{
					s = s.replace(/&/g, "&amp;");
				}
			}

			// convert the xss chars to numerical entities ' " < >
			s = this.XSSEncode(s,false);
			
			if(this.EncodeType=="numerical" || !dbl){
				// Now call function that will convert any HTML entities to numerical codes
				s = this.HTML2Numerical(s);
			}

			// Now encode all chars above 127 e.g unicode
			s = this.numEncode(s);

			// now we know anything that needs to be encoded has been converted to numerical entities we
			// can encode any ampersands & that are not part of encoded entities
			// to handle the fact that I need to do a negative check and handle multiple ampersands &&&
			// I am going to use a placeholder

			// if we don't want double encoded entities we ignore the & in existing entities
			if(!dbl){
				s = s.replace(/&#/g,"##AMPHASH##");
			
				if(this.EncodeType=="numerical"){
					s = s.replace(/&/g, "&#38;");
				}else{
					s = s.replace(/&/g, "&amp;");
				}

				s = s.replace(/##AMPHASH##/g,"&#");
			}
			
			// replace any malformed entities
			s = s.replace(/&#\d*([^\d;]|$)/g, "$1");

			if(!dbl){
				// safety check to correct any double encoded &amp;
				s = this.correctEncoding(s);
			}

			// now do we need to convert our numerical encoded string into entities
			if(this.EncodeType=="entity"){
				s = this.NumericalToHTML(s);
			}

			return s;					
		},

		// Encodes the basic 4 characters used to malform HTML in XSS hacks
		XSSEncode : function(s,en){
			if(!this.isEmpty(s)){
				en = en || true;
				// do we convert to numerical or html entity?
				if(en){
					s = s.replace(/\'/g,"&#39;"); //no HTML equivalent as &apos is not cross browser supported
					s = s.replace(/\"/g,"&quot;");
					s = s.replace(/</g,"&lt;");
					s = s.replace(/>/g,"&gt;");
				}else{
					s = s.replace(/\'/g,"&#39;"); //no HTML equivalent as &apos is not cross browser supported
					s = s.replace(/\"/g,"&#34;");
					s = s.replace(/</g,"&#60;");
					s = s.replace(/>/g,"&#62;");
				}
				return s;
			}else{
				return "";
			}
		},

		// returns true if a string contains html or numerical encoded entities
		hasEncoded : function(s){
			if(/&#[0-9]{1,5};/g.test(s)){
				return true;
			}else if(/&[A-Z]{2,6};/gi.test(s)){
				return true;
			}else{
				return false;
			}
		},

		// will remove any unicode characters
		stripUnicode : function(s){
			return s.replace(/[^\x20-\x7E]/g,"");
			
		},

		// corrects any double encoded &amp; entities e.g &amp;amp;
		correctEncoding : function(s){
			return s.replace(/(&amp;)(amp;)+/,"$1");
		},


		// Function to loop through an array swaping each item with the value from another array e.g swap HTML entities with Numericals
		swapArrayVals : function(s,arr1,arr2){
			if(this.isEmpty(s)) return "";
			var re;
			if(arr1 && arr2){
				//ShowDebug("in swapArrayVals arr1.length = " + arr1.length + " arr2.length = " + arr2.length)
				// array lengths must match
				if(arr1.length == arr2.length){
					for(var x=0,i=arr1.length;x<i;x++){
						re = new RegExp(arr1[x], 'g');
						s = s.replace(re,arr2[x]); //swap arr1 item with matching item from arr2	
					}
				}
			}
			return s;
		},

		inArray : function( item, arr ) {
			for ( var i = 0, x = arr.length; i < x; i++ ){
				if ( arr[i] === item ){
					return i;
				}
			}
			return -1;
		}
	}
}
