// snacktag

var snackTV_snackTag = {
	dodebug: false,

	init: function () {
		if (snackTV_config.debug) this.dodebug=true;
		if (!this.dodebug && location.href.match(/snackTagDebug=true/))
		{
			this.dodebug=true;
			this.debug("Debug-override by parameter");
		}
		this.debug("Init");
		this.cleanConfig();
		if (snackTV_config.noinit) { this.debug("No init param set => quitting");return; }
		if (snackTV_config.tagtype=='static') 
			snackTV_staticTeaser.init();
		else
			snackTV_dynTeaser.init();
		this.debug("Main finished");
	},

	cleanConfig: function () {
		this.debug("Cleaning config:");
		this.debug(snackTV_config);

		snackTV_config.base_url=snackTV_default_config.base_url;
		snackTV_config.height=snackTV_default_config.height;
		snackTV_config.width=snackTV_default_config.width;
		snackTV_config.vCount=snackTV_default_config.vCount;

		if (!snackTV_config.tagtype) snackTV_config.tagtype=snackTV_default_config.tagtype;
		snackTV_config.tagtype=snackTV_config.tagtype.toLowerCase();
		if (snackTV_config.tagtype!='static' && snackTV_config.tagtype!='dynamic') snackTV_config.tagtype=snackTV_default_config.tagtype;

		if (!snackTV_config.type) snackTV_config.type=snackTV_default_config.type;
		if ((typeof snackTV_config.type)!='number') snackTV_config.type=parseInt(snackTV_config.type);
		if (isNaN(snackTV_config.type)) snackTV_config.type=snackTV_default_config.type;
		if (snackTV_config.type<0 || snackTV_config.type>2) snackTV_config.type=snackTV_default_config.type;

		if (!snackTV_config.color) snackTV_config.color=snackTV_default_config.color;
		snackTV_config.color=snackTV_config.color.toLowerCase();
		if (!snackTV_config.color || !snackTV_config.color.match(/^[a-f0-9]{6}$/)) snackTV_config.color=snackTV_default_config.color;

		if (!snackTV_config.bgcolor) snackTV_config.bgcolor=snackTV_default_config.bgcolor;
		snackTV_config.bgcolor=snackTV_config.bgcolor.toLowerCase();
		if (!snackTV_config.bgcolor || !snackTV_config.bgcolor.match(/^[a-f0-9]{6}$/)) snackTV_config.bgcolor=snackTV_default_config.bgcolor;

		if (!snackTV_config.font) snackTV_config.font=snackTV_default_config.font;
		snackTV_config.font=snackTV_config.font.toLowerCase();
		if (snackTV_config.font!='arial' && snackTV_config.font!='verdana' && 
			snackTV_config.font!='times' && snackTV_config.font!='helvetica' && 
			snackTV_config.font!='georgia')
				snackTV_config.font=snackTV_default_config.font;

		if (!snackTV_config.cat) snackTV_config.cat=snackTV_default_config.cat;
		if (!snackTV_config.publisher) snackTV_config.publisher=snackTV_default_config.publisher;
		if (!snackTV_config.containerid) snackTV_config.containerid=snackTV_default_config.containerid;
		if (!snackTV_config.domLoaded) snackTV_config.domLoaded=snackTV_default_config.domLoaded;
		if (!snackTV_config.noinit) snackTV_config.noinit=snackTV_default_config.noinit;

		if (snackTV_config.tagtype=='static')
		{
			if (!snackTV_config.mainteaser) snackTV_config.mainteaser=snackTV_default_config.mainteaser;
			if (!snackTV_config.search) snackTV_config.search=snackTV_default_config.search;
			if (!snackTV_config.videos) snackTV_config.videos=snackTV_default_config.videos;
		} else {
			if (!snackTV_config.dynmode) snackTV_config.dynmode=snackTV_default_config.dynmode;
			snackTV_config.dynmode=snackTV_config.dynmode.toLowerCase();
			if (snackTV_config.dynmode!='auto' && snackTV_config.dynmode!='manual') snackTV_config.dynmode=snackTV_default_config.dynmode;

			if (!snackTV_config.contentid) snackTV_config.contentid=snackTV_default_config.contentid;
			if (!snackTV_config.dynusetypes) snackTV_config.dynusetypes=snackTV_default_config.dynusetypes;
			if (!snackTV_config.combine) snackTV_config.combine=snackTV_default_config.combine;
			if (!snackTV_config.ignore) snackTV_config.ignore=snackTV_default_config.ignore;
			if (!snackTV_config.usekeywords) snackTV_config.usekeywords=snackTV_default_config.usekeywords;
			if (!snackTV_config.usetitle) snackTV_config.usetitle=snackTV_default_config.usetitle;
			if (!snackTV_config.h_weight) snackTV_config.h_weight=snackTV_default_config.h_weight;
			if (typeof snackTV_config.h_weight != 'object') snackTV_config.h_weight=new Array(0,snackTV_config.h_weight,snackTV_config.h_weight,snackTV_config.h_weight,snackTV_config.h_weight,snackTV_config.h_weight,snackTV_config.h_weight);
			for (var i=0;i<7;++i)
				if (typeof snackTV_config.h_weight[i]=='undefined') snackTV_config.h_weight[i]=1;
				else if (typeof snackTV_config.h_weight[i]!='number') snackTV_config.h_weight[i]=parseInt(snackTV_config.h_weight[i]);
		}

		this.debug("Actual cleaned config: ");
		this.debug(snackTV_config);
	},

	debug: function (message) {
		if (typeof console!='object' || !this.dodebug) return;
		console.debug("SnackTag: ",message);
	}
}

var snackTV_staticTeaser = {

	init: function () {
		snackTV_snackTag.debug("Using static teaser");

		var frameCode=this.getIFrameCode();

		snackTV_snackTag.debug("Writing frame code:");
		snackTV_snackTag.debug(frameCode);
		if (snackTV_config.containerid=='') document.write(frameCode);
		else {
			var elem=document.getElementById(snackTV_config.containerid)
			if (!elem)
			{
				snackTV_snackTag.debug("Urks id "+snackTV_config.containerid+" not found => Giving up!");
				return;
			}
			elem.innerHTML=frameCode;
		}
		snackTV_dynTeaser.domIsReady=true;
	},

	getIFrameCode: function () {
		var url=this.getURL();
		var iframecode='<iframe src="'+url+'" width="'+snackTV_config.width[snackTV_config.type]+'" height="'+snackTV_config.height[snackTV_config.type]+'" frameborder="0" allowtransparency="true" scrolling="no"></iframe>';
		return (iframecode);
	},

	getURL: function () {
		var url=snackTV_config.base_url+"?itwtype="+snackTV_config.type+"&itwcolor="+snackTV_config.color+
			"&itwbgcolor="+snackTV_config.bgcolor+"&itwfont="+snackTV_config.font+"&itwsearch="+
			snackTV_config.search+"&itwvids="+snackTV_config.videos+"&itwaufm="+snackTV_config.mainteaser+
			"&itwcat="+snackTV_config.cat+"&itwpub="+snackTV_config.publisher;
		return (url);
	}
}

var snackTV_dynTeaser = {
	keywordResult: 0,
	maxNumKeywords: 3,
	domIsReady: false,
	kwArr: [],

	init: function () {
		snackTV_snackTag.debug("Using dynamic teaser");
		this.keywordResult=0;
		if (snackTV_config.containerid=='') document.write('<div id="snackTVWidgetFrame" style="display:none;"></div>');
		this.domIsReady=(this.domIsReady || snackTV_config.domLoaded);
		this.kwArr=new Array();
		this.callOnDomReady(snackTV_dynTeaser.createWidget);
	},

	createWidget: function () {
		snackTV_snackTag.debug("Creating dynamic widget...");
		var articlenodes='';
		if (snackTV_config.contentid && snackTV_config.contentid!='')
			articlenodes=snackTV_config.contentid;
		var ignore=new Array();
		ignore.push(location.href.replace(/^[^\/]*\/\//,'').replace(/\/.*$/,'').replace(/^.*\.([^\.]*)\.[^\.]*$/,'$1'));
		ignore.push('Eine');
		ignore.push('Einer');
		ignore.push('Eines');
		if (typeof snackTV_config.ignore=='object') ignore=ignore.concat(snackTV_config.ignore);
		var keywords = snackTV_dynTeaser.getKeywords(articlenodes,ignore,snackTV_dynTeaser.maxNumKeywords,true);
		snackTV_snackTag.debug("Got top "+snackTV_dynTeaser.maxNumKeywords+" keywords:");
		snackTV_snackTag.debug(keywords);
		snackTV_dynTeaser.kwArr=keywords;

		var url="http://www.snacktv.de/snacktag/getKW.php";
		for (var i=0;i<keywords.length;++i)
			url=url+(i==0?'?':'&')+"keywords[]="+encodeURI(keywords[i][0]);
		url=url+'&pub='+snackTV_config.publisher;
		url=url+'&cat='+encodeURI(snackTV_config.cat);
		var stag=document.createElement('script');
		stag.src=url;
		
		var headTag=document.getElementsByTagName('head')[0];
		headTag.appendChild(stag);

		snackTV_snackTag.debug("Added script element (src='"+url+"') to <head> for keyword check. Waiting for object load...");
		var _kwcounter=0;
		var _kwtimer=setInterval( function() {
			if (typeof snackTV_dynTeaser.keywordResult != 'object')
			{
				_kwcounter++;
				if (_kwcounter>100) { snackTV_snackTag.debug("No answer... giving up.");clearInterval(_kwtimer); }
				return;
			}
			clearInterval(_kwtimer);
			snackTV_snackTag.debug("Got keyword-check results:");
			snackTV_snackTag.debug(snackTV_dynTeaser.keywordResult);

			var frameElem=document.getElementById(snackTV_config.containerid==''?"snackTVWidgetFrame":snackTV_config.containerid);
			if (!frameElem) { snackTV_snackTag.debug("Urks... Too bad inserted id "+snackTV_config.containerid==''?"snackTVWidgetFrame":snackTV_config.containerid+" not found ?!?"); return; }
			var resultCount=snackTV_dynTeaser.keywordResult.count;
			var resultTags=snackTV_dynTeaser.keywordResult.keywords;
			snackTV_snackTag.debug("Number of videos found: "+resultCount);
			snackTV_snackTag.debug("Tags for videos found: "+resultTags);

			if (resultCount==0) { snackTV_snackTag.debug("No videos found => finished"); return; }
			var wtype=0;
			if (snackTV_config.dynmode=='auto')
			{
				snackTV_snackTag.debug("Automatic widget chooser started");
				for (var j=0;j<snackTV_config.vCount.length;++j)
				{
					if (typeof snackTV_config.dynusetypes=='object')
					{
						var foundintypes=false;
						for (var k=0;k<snackTV_config.dynusetypes.length;k++)
							if (snackTV_config.dynusetypes[k]==j) foundintypes=true;
						if (!foundintypes) continue;
					}
					var cnt=snackTV_config.vCount[j];
					if (cnt==resultCount) { wtype=j; break; }

					var current=snackTV_config.vCount[wtype];
					if (Math.abs(resultCount-current) > Math.abs(resultCount-cnt)) wtype=j;
				}
			} else wtype=snackTV_config.type;

			snackTV_snackTag.debug("Showing widget using type "+wtype);
			var frameUrl=snackTV_config.base_url+"?itwtype="+wtype+"&itwcolor="+snackTV_config.color+
				"&itwbgcolor="+snackTV_config.bgcolor+"&itwfont="+snackTV_config.font+"&itwsearch="+
				encodeURI(resultTags)+"&itwvids=&itwaufm=0"+
				"&itwcat="+snackTV_config.cat+"&itwpub="+snackTV_config.publisher;
			snackTV_snackTag.debug("Using URL "+frameUrl);

			frameElem.innerHTML='<iframe id="snackTVWidgetIFrame" src="'+frameUrl+'" width="'+snackTV_config.width[wtype]+'" height="'+snackTV_config.height[wtype]+'" frameborder="0" allowtransparency="true" scrolling="no"></iframe>';
			frameElem.style.display="block";

			snackTV_snackTag.debug("Finished");
		}, 10);
	},

	callOnDomReady: function (func) {
		if (snackTV_dynTeaser.domIsReady)
		{
			func();
			return;
		}

		snackTV_snackTag.debug("Setting onDOMReady");
		if (document.addEventListener)
			document.addEventListener("DOMContentLoaded", function() { snackTV_dynTeaser.domIsReady=true; alreadyrunflag=1; func(); }, false)
		else if (document.all && !window.opera) {
			document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="javascript:void(0)"><\/script>')
			var contentloadtag=document.getElementById("contentloadtag");
			contentloadtag.onreadystatechange = function() {
				if (this.readyState=="complete") { snackTV_dynTeaser.domIsReady=true; func(); }
			}
		}
		else if(/Safari/i.test(navigator.userAgent)) { //Test for Safari
			var _timer=setInterval(function() {
				if(/loaded|complete/.test(document.readyState)) {
					clearInterval(_timer);
					snackTV_dynTeaser.domIsReady=true;
					func();
				}
			}, 10);
		}
	},

	getTextNodesValue: function (node,useallowed) {
		var allowed=new Array('div','li','p','b','i','u','strong');
		var douseallowed=useallowed;
		if (typeof useallowed!='boolean') 
		{
			if (typeof useallowed!='object') useallowed=new Array(useallowed);
			allowed=useallowed;
			douseallowed=true;
		}
		if (node.nodeType==3) 
		{
			for (var j=0;j<allowed.length;++j)
				if (!douseallowed || node.parentNode.nodeName.toLowerCase()==allowed[j]) return(" "+node.nodeValue+" ");
			return("");
		}
		var cn=node.childNodes;

		if (cn.length<1) return("");
		var val='';
		for (var i=0;i<cn.length;++i)
			val=val+this.getTextNodesValue(cn.item(i),useallowed);
		return(" "+val+" ");
	},

	sorter: function (a,b) {
		return (b[1]-a[1]);
	},

	getKeywords: function (nodes,stopwords,num,useallowed)
	{
		if (typeof nodes != 'object' && nodes!='')
			nodes=new Array(nodes);
		snackTV_snackTag.debug("Getting "+num+" keywords from DOM-Node(s):");
		snackTV_snackTag.debug(nodes);
		snackTV_snackTag.debug("ignoring words:");
		snackTV_snackTag.debug(stopwords);

		var str='';
		var str_h1='';
		var str_h2='';
		var str_h3='';
		var str_h4='';
		var str_h5='';
		var str_h6='';
		var contentElem=false;
		if (typeof nodes == 'object')
			for (var l=0;l<nodes.length;l++)
			{
				snackTV_snackTag.debug("Processing ID "+nodes[l]);
				contentElem=document.getElementById(nodes[l]);
				if (contentElem)
				{
					str=str+this.getTextNodesValue(contentElem,useallowed);
					str_h1=str_h1+this.getTextNodesValue(contentElem,'h1');
					str_h2=str_h2+this.getTextNodesValue(contentElem,'h2');
					str_h3=str_h3+this.getTextNodesValue(contentElem,'h3');
					str_h4=str_h4+this.getTextNodesValue(contentElem,'h4');
					str_h5=str_h5+this.getTextNodesValue(contentElem,'h5');
					str_h6=str_h6+this.getTextNodesValue(contentElem,'h6');
				}
			}
		if (str=='') 
		{
			snackTV_snackTag.debug("No keywords found yet... trying complete document");
			str=this.getTextNodesValue(document,useallowed);
			str_h1=str_h1+this.getTextNodesValue(document,'h1');
			str_h2=str_h2+this.getTextNodesValue(document,'h2');
			str_h3=str_h3+this.getTextNodesValue(document,'h3');
			str_h4=str_h4+this.getTextNodesValue(document,'h4');
			str_h5=str_h5+this.getTextNodesValue(document,'h5');
			str_h6=str_h6+this.getTextNodesValue(document,'h6');
		}

		if (snackTV_config.usetitle)
		{
			var titletag=document.getElementsByTagName('title');
			if (titletag) str=str+" "+this.getTextNodesValue(titletag[0],false);
		}
		if (snackTV_config.usekeywords)
		{
			var metatags=document.getElementsByTagName('meta');
			if (metatags)
			{
				for (var j=0;j<metatags.length;++j)
				{
					if (!metatags[j].hasAttributes()) continue;
					var usevalue=false;
					var usevaluecontent='';
					for (var k=0;k<metatags[j].attributes.length;++k)
					{
						if (metatags[j].attributes[k].nodeName=='name' && metatags[j].attributes[k].nodeValue.toLowerCase()=='keywords')
							usevalue=true;
						if (metatags[j].attributes[k].nodeName=='content') usevaluecontent=metatags[j].attributes[k].nodeValue;
					}
					if (usevalue) str=str+" "+usevaluecontent;
				}
			}
		}

		str=str.replace(/[^a-zA-ZÖÄÜöäüß]/g," ").replace(/ +/g," ");
		var arr=str.split(' ').sort();

		var arr_h1=this.getSpecialWeighted(arr,str_h1,snackTV_config.h_weight[1]);
		var arr_h2=this.getSpecialWeighted(arr,str_h2,snackTV_config.h_weight[2]);
		var arr_h3=this.getSpecialWeighted(arr,str_h3,snackTV_config.h_weight[3]);
		var arr_h4=this.getSpecialWeighted(arr,str_h4,snackTV_config.h_weight[4]);
		var arr_h5=this.getSpecialWeighted(arr,str_h5,snackTV_config.h_weight[5]);
		var arr_h6=this.getSpecialWeighted(arr,str_h6,snackTV_config.h_weight[6]);

		arr=arr.concat(arr_h1).concat(arr_h2).concat(arr_h3).concat(arr_h4).concat(arr_h5).concat(arr_h6).sort();

		var fin=new Array();
		var lastword='';
		var wcount=0;
		var wc=0;
		var isstop=false;
		for (var i=0;i<arr.length;++i)
		{
			if (arr[i]==lastword) { wcount++; continue; }
			if (snackTV_config.combine && arr[i].length>lastword.length && Math.abs(arr[i].length-lastword.length)<3 && arr[i].indexOf(lastword)==0)
			{ wcount++; continue; }
			isstop=false;
			if (typeof stopwords=='object') 
				for (var k=0;k<stopwords.length;++k)
					if (stopwords[k].toLowerCase()==lastword.toLowerCase()) isstop=true;
			if (lastword!='' && lastword.length>3 && lastword.match(/^[A-ZÖÄÜ]/) && !isstop) fin[wc++]=new Array(lastword,wcount);
			wcount=1;
			lastword=arr[i];
		}
		if (lastword!='' && lastword.length>3) fin[wc++]=new Array(lastword,wcount);

		retval=fin.sort(this.sorter);
		if (num<1)
			return(retval);
		var rv=new Array();
		for (var i=0;i<num;++i)
			if (typeof retval[i]!='undefined') rv[i]=retval[i];
		return(rv);
	},

	getSpecialWeighted: function (arr,str,weight)
	{
		var ret=new Array();
		if (str=='' || arr.length<1) return(ret);

		var sweight=str.replace(/[^a-zA-ZÖÄÜöäüß]/g," ").replace(/ +/g," ").split(' ').sort();
		var found=false;
		for (var i=0;i<sweight.length;++i)
		{
			found=false;
			for (var j=0;j<arr.length;++j)
				if (sweight[i].toLowerCase()==arr[j].toLowerCase() || 
					(snackTV_config.combine && Math.abs(arr[j].length-sweight[i].length)<3 && (arr[j].indexOf(sweight[i])==0 || sweight[i].indexOf(arr[j])==0))) found=true;
			if (found && weight>1)
				for (var k=0;k<weight;++k) ret.push(sweight[i]);
			else ret.push(sweight[i]);
		}
		return (ret);
	}
}

var snackTV_default_config = {
	/* Basic configuration */
	base_url: "http://player.snacktv.de/vid/widget.html",	/* Base widget URL */
	height: [250,350,570],					/* Widget heights */
	width:  [300,300,300],					/* Widget widths */
	vCount: [  1,  3,  4],					/* Widget video counts */

	/* General Configuration */
	noinit: false,						/* Do initialization? */
	domLoaded: false,					/* Assume DOM is already loaded */
	containerid: "",					/* Id of container for widget; if empty it will be placed where the script tag is. */
	debug: false,						/* Debug mode */
	tagtype: "static",					/* static or dynamic tag */
	type: 2,						/* Type of tag */
	publisher: "snacktv",					/* Publisher id */
	color: "000000",					/* Text color */
	bgcolor: "ffffff",					/* Background color */
	font: "arial",						/* Font 2 B used */
	cat: "",						/* Use only these categories */

	/* Static configuration */
	search: "",						/* Use this to search */
	videos: "",						/* Show exactly these videos */
	mainteaser: 0,						/* Only show main teaser videos */

	/* Dynamic configuration */
	contentid: "",						/* Use this id for keyword search */
	dynmode: "manual",					/* Use type parameter or automatic type */
	dynusetypes: "",					/* Autotyping: use only these types (Array) */
	combine: true,						/* Combine similiar keywords */
	ignore: "",						/* Ignore these keywords (Array) */
	usetitle: false,					/* Always include <title> */
	usekeywords: false,					/* Always include meta keywords */
	h_weight: 3						/* Weight of h1...h6 elements (skalar for all, array(0,1,2,3,4,5,6), 0 is ignored 1 is h1 and so on */
}

if (typeof snackTV_config!='object')
{
	var snackTV_config=snackTV_default_config;
}

snackTV_snackTag.init();

