// ensure that jQuery is initialized and avoid confilcts with other javascript
// libs using the $-sign as shortcut!
// calls the passed function if script is loaded or if jQuery is already 
// initialized calls the function imediately.
function ensureJQueryLoaded(func) {
	var isJQueryConflict = false;
	var isJQuery = typeof(jQuery) != "undefined";
	if (isJQuery) {
		if (typeof($) != "undefined") {
			isJQueryConflict = $ != jQuery;
		}
	} else {
		isJQueryConflict = typeof($) != "undefined";
	}
	if (!isJQuery) {
		var done = false;
		var headID = document.getElementsByTagName("head")[0];         
		var newScript = document.createElement('script');
		newScript.type = 'text/javascript';
		newScript.src = 'http://static.netzathleten.de/scripts/jquery.js';
		
		// call function if script loaded
		newScript.onload = newScript.onreadystatechange = function() {
			if ( !done && 
					(!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) {
				done = true;
				// ensure compatibility with other js libraries
        if (isJQueryConflict) {
        	jQuery.noConflict();
        }
				// call function
				func();
				// remove event
				newScript.onload = newScript.onreadystatechange = null;
			}
		};
		
    headID.appendChild(newScript);
	} else {
		// ensure compatibility with other js libraries
    if (isJQueryConflict) {
    	jQuery.noConflict();
    }
		// call function imediately
		func();
	}
}

function loadJSON(url, widgetdiv) {
	if (!widgetdiv) {
		widgetdiv = "logowidget";
	}
	if (url.indexOf("&callback") >= 0) {
		var idx = url.indexOf("&callback");
		url = url.substring(0, idx);
	}
	url += "&callback=?";
	ensureJQueryLoaded(function() {
    jQuery.getJSON(url, function(json) {
            processJSON(json, widgetdiv);
    });
  });
}

var initVersionMap = new Object();
var initLock = null;

function processJSON(feed, widgetdiv){
  getTheWidget(feed, widgetdiv, initVersionMap, initLock);
}
	
function getTheWidget(feed, widgetdiv, versionMap, lock){
	function buildCssPrefix(divname) {
		var prefix = "";
		for (var i = 0; i < feed.na_export.widgetStructure.length; i++) {
			if (divname == feed.na_export.widgetStructure[i].name) {
				// Root Position erreicht
				if ("solo" == feed.na_export.widgetStructure[i].pos) {
					prefix = "#" + widgetdiv;
				} else {
					prefix = "." + feed.na_export.widgetStructure[i].pos + " ";
					prefix = buildCssPrefix(feed.na_export.widgetStructure[i].pos) + " " + prefix;
				}
				break;
			}
		}
		return prefix;
	}
	
	if (lock == null) {
		lock = new Object();
		if (typeof(versionMap[feed.na_export.widgetConfigId]) == "undefined") {
			versionMap[feed.na_export.widgetConfigId] = {version : 0, timer : null};
		} else {
			if (versionMap[feed.na_export.widgetConfigId].timer != null) {
				clearTimeout(versionMap[feed.na_export.widgetConfigId].timer);
			}
			versionMap[feed.na_export.widgetConfigId].version++;
		}
		
		var style_id = "na_widgetstyle_" + widgetdiv; 
		var head = document.getElementsByTagName('head')[0];
		
		var style = document.createElement('style');
		style.type= 'text/css';
		style.setAttribute("id", style_id);
	
		var os='';
		for (var i = 0; i < feed.na_export.layout.length; ++i) {
			if(feed.na_export.layout[i].cssKey=='css_type'){
				var divname = feed.na_export.layout[i].divname.match(/div([0-9])+/);
				if (divname == null || divname.length == 0) {
					divname = feed.na_export.layout[i].divname.match(/playlist([a-zA-Z0-9])*([0-9])+/);
				}
				var prefix = buildCssPrefix(divname[0]);
				if (prefix) {
					os += prefix + " ";
				}
				if (feed.na_export.layout[i].cssValue=='class'){
					os+='.';
				}
				else if(feed.na_export.layout[i].cssValue=='id')
				{
					os+='#';
				}
				os += feed.na_export.layout[i].divname + '{';
				for (var j = 0; j < feed.na_export.layout.length; ++j){
					if (feed.na_export.layout[j].divname==feed.na_export.layout[i].divname && feed.na_export.layout[j].cssKey !='css_type'){
						var pix1 =/width/;
						var pix2 =/height/;
						var pix3=/size/;
						var pix4=/padding/;
						var pix5=/margin/;
						var raute =/color/;
						var tempKey = feed.na_export.layout[j].cssKey;
						var test1 = tempKey.search(pix1);
						var test2 = tempKey.search(pix2);
						var test3 = tempKey.search(pix3);
						var test4 = tempKey.search(pix4);
						var test5 = tempKey.search(pix5);
						var test6 = tempKey.search(raute);
						
						if (test1!= -1 ||test2!= -1 ||test3!= -1 ||test4!= -1 ||test5!= -1){
							os+= feed.na_export.layout[j].cssKey + ':'+ feed.na_export.layout[j].cssValue+'px;';
							
						}
						else if(test6!= -1){
							os+= feed.na_export.layout[j].cssKey + ':#'+ feed.na_export.layout[j].cssValue+';';
							
						}
						else{
							os+= feed.na_export.layout[j].cssKey + ':'+ feed.na_export.layout[j].cssValue+';';
							
						}
					}
				}
				os+='}';
			}
		}
		if (style.styleSheet) {   
			style.styleSheet.cssText = os;
		} else {                
			var tt1 = document.createTextNode(os);
			style.appendChild(tt1);
		}
		
		if (document.getElementById(style_id) == null) {
			head.appendChild(style);
		}
		else { 
			head.replaceChild(style, document.getElementById(style_id)); 
		}
		
		var contentVersionIds = new Array();
		var externalViewCounts = new Array();
	
		function getContent(pos, isVisible){
			if (typeof(isVisible) == "undefined") {
				isVisible = true;
			}
			
			var returnstring='';
				
			if(feed.na_export.content[pos].contentName=="VIDEOBOX"){
				returnstring = feed.na_export.content[pos].contentValue;
			}
			if (feed.na_export.content[pos].contentName=="PLAYLIST_THUMB"){
				for (var m = 0; m < feed.na_export.content.length; ++m){
					if (feed.na_export.content[m].pos == feed.na_export.content[pos].pos){
						if (feed.na_export.content[m].contentName=="PLAYLIST_LINK"){
							returnstring += '<a class="widgetlink" href="'+feed.na_export.content[m].contentValue+'"><img height="50px" src="';
							returnstring +=feed.na_export.content[pos].contentValue;
							returnstring +='" /></a>';
						}
					}
				}
			}
			if (feed.na_export.content[pos].contentName=="PLAYLIST_ENTRY"){
				for (var m = 0; m < feed.na_export.content.length; ++m){
					if (feed.na_export.content[m].pos == feed.na_export.content[pos].pos){
						if (feed.na_export.content[m].contentName=="PLAYLIST_LINK"){
							returnstring += '<a class="widgetlink" href="'+feed.na_export.content[m].contentValue+'">';
							returnstring +=feed.na_export.content[pos].contentValue;
							returnstring +='</a>';
						}
					}
				}
			}
					
			if (feed.na_export.content[pos].contentName=="LINK"){
				returnstring = '<a class="widgetlink" href="'+feed.na_export.content[pos].contentValue+'" target="_blank">';
				for (var m = 0; m < feed.na_export.content.length; ++m){
					if (feed.na_export.content[m].place == feed.na_export.content[pos].place &&
							feed.na_export.content[m].pos == feed.na_export.content[pos].pos){
						if (feed.na_export.content[m].contentName=="LINK_TEXT"){
							returnstring +=feed.na_export.content[m].contentValue;
						}
						if (feed.na_export.content[m].contentName=="LINK_IMAGE"){
							returnstring +='<img src="'+feed.na_export.content[m].contentValue+'"/>';
						}
					}
				}
				returnstring +='</a>';
			}
			if (feed.na_export.content[pos].contentName=="TEXT"){
				returnstring = feed.na_export.content[pos].contentValue;
			}
			if (feed.na_export.content[pos].contentName=="IMAGE"){
				returnstring = '<img src="' + feed.na_export.content[pos].contentValue +'"/>';
			}
			if (feed.na_export.content[pos].contentName == "CONTENT_VERSION_ID") {
				var position =feed.na_export.content[pos].pos-1;
				contentVersionIds[position] = 
					{contentVersionId : feed.na_export.content[pos].contentValue, visible : isVisible};
			}
			if (feed.na_export.content[pos].contentName == "EXTERNAL_VIEW_COUNT") {
				var position = feed.na_export.content[pos].pos-1;
				externalViewCounts[position] = feed.na_export.content[pos].contentValue;
			}
			
			return returnstring;
			
		}
		
		var os2='';
		var workedlist = new Array(feed.na_export.widgetStructure.length);
		i=0;
		
		function getNoOfEntries() {
			if (typeof(feed.na_export.tickerConfig) != "undefined") {
				return parseInt(feed.na_export.tickerConfig.noOfEntries);
			}
			return 1;
		}
		
		function alreadydoneForPos(currentname, pos){
			var noOfEntries = getNoOfEntries();
			for (var r =0; r<workedlist.length;++r){
				if(workedlist[r] == currentname && pos >= noOfEntries){
					return true;
				}
			}
			return false;
		}
		
		function alreadydone(currentname){
			for (var r =0; r<workedlist.length;++r){
				if(workedlist[r] == currentname){
					return true;
				}
			}
			return false;
		}
		
		function getWidgetForPos(currentdiv, pos, isVisible){
			os2+='<div class="'+currentdiv+'">';
			for (var l =0; l<feed.na_export.content.length;++l){
				if (feed.na_export.content[l].place == currentdiv && feed.na_export.content[l].pos == (pos + 1)){
					os2+=getContent(l, isVisible);
				}
			}
			for (var p =0; p<feed.na_export.widgetStructure.length;++p){
				if (feed.na_export.widgetStructure[p].pos == currentdiv){
					if (!alreadydoneForPos(feed.na_export.widgetStructure[p].name, pos)) {
						getWidgetForPos(feed.na_export.widgetStructure[p].name, pos, isVisible);
					}
				}
			}
			os2+='</div>';
			workedlist[i]=currentdiv;
			i++;
		}
	
		function getWidget(currentdiv){
			if (typeof(feed.na_export.tickerConfig) == "undefined" || feed.na_export.tickerConfig.entryDiv != currentdiv) {
				os2+='<div class="'+currentdiv+'">';
				for (var l =0; l<feed.na_export.content.length;++l){
					if (feed.na_export.content[l].place == currentdiv){
						os2+=getContent(l);
					}
				}
				for (var p =0; p<feed.na_export.widgetStructure.length;++p){
					if (feed.na_export.widgetStructure[p].pos == currentdiv){
						if (!alreadydone(feed.na_export.widgetStructure[p].name)) {
							getWidget(feed.na_export.widgetStructure[p].name);
						}
					}
				}
				os2+='</div>';
			} else {
				for (var x = 0; x < feed.na_export.tickerConfig.noOfEntries; x++) {
					var isVisible = x < feed.na_export.tickerConfig.visibleEntries;
					var entry_style = !isVisible ? 'display:none;' : '';
					os2+='<div class="'+currentdiv+'" id="entry' + x + '" style="' + entry_style + '">';
					for (var l =0; l<feed.na_export.content.length;++l){
						if (feed.na_export.content[l].place == currentdiv && feed.na_export.content[l].pos == (x + 1)){
							os2+=getContent(l, isVisible);
						}
					}
					for (var p =0; p<feed.na_export.widgetStructure.length;++p){
						if (feed.na_export.widgetStructure[p].pos == currentdiv){
							if (!alreadydoneForPos(feed.na_export.widgetStructure[p].name, x)) {
								getWidgetForPos(feed.na_export.widgetStructure[p].name, x, isVisible);
							}
						}
					}
					os2+='</div>';
				}
			}
			workedlist[i]=currentdiv;
			i++;
		}
		
		function initAnimation() {
			var tickerConfig = feed.na_export.tickerConfig;
			if (typeof(tickerConfig) == "undefined") {
				return;
			}
			
			if (parseInt(tickerConfig.noOfEntries) <= parseInt(tickerConfig.visibleEntries)) {
				jQuery("#entry" + (tickerConfig.noOfEntries - 1)).css("border", "none");
				return;
			}
			var tickerPos = 0;
			var stopAnimation = false;
			var animationInitialized = false;

			var entryBorderStyle = "border-" + (tickerConfig.orientation == "2" ? "right" : "bottom");
			var entryBorderColor = jQuery("#entry0").css((entryBorderStyle+"-color"));
			var entryBorderWidth = jQuery("#entry0").css((entryBorderStyle+"-width"));
			var entryBorderRealStyle = jQuery("#entry0").css((entryBorderStyle+"-style"));
			
			var currentVersion = versionMap[feed.na_export.widgetConfigId].version;
			
			function animateTicker() {
				var visibleEntries = parseInt(tickerConfig.visibleEntries);
				var noOfEntries = parseInt(tickerConfig.noOfEntries);
				var tickerSpeed = parseInt(tickerConfig.tickerSpeed);
				var tickerDelay = parseInt(tickerConfig.tickerDelay);
				var posToHide = tickerPos;
				var posToShow = (tickerPos + visibleEntries) >= noOfEntries ? visibleEntries - (noOfEntries - tickerPos): tickerPos + visibleEntries;
				var posBeforeToShow = posToShow > 0 ? posToShow - 1 : noOfEntries - 1;
				if (posToShow != posBeforeToShow) {
					jQuery("#entry" + posToHide).fadeOut(tickerSpeed / 2, function() {
						jQuery("#entry" + posToHide).css({"visibility":"hidden", "display":"block"});
						// entfernen und neu einfuegen
						jQuery("#entry" + posToShow).insertAfter("#entry" + posBeforeToShow);
						jQuery("#entry" + posToShow).css(entryBorderStyle+"-color", "#000000");
						jQuery("#entry" + posToShow).css(entryBorderStyle+"-width", "0px");
						jQuery("#entry" + posToShow).css(entryBorderStyle+"-style", "none");
						jQuery("#entry" + posBeforeToShow).css(entryBorderStyle+"-color", entryBorderColor);
						jQuery("#entry" + posBeforeToShow).css(entryBorderStyle+"-width", entryBorderWidth);
						jQuery("#entry" + posBeforeToShow).css(entryBorderStyle+"-style", entryBorderRealStyle);
						jQuery("#entry" + posToHide).css({"visibility":"visible", "display":"none"});
						jQuery("#entry" + posToShow).fadeIn(tickerSpeed / 2, function() {
							var trackingUrl = feed.na_export.trackingUrl;
							var widgetConfigId = feed.na_export.widgetConfigId;
							if(typeof(contentVersionIds[posToShow]) != "undefined"){
								var contentVersionId = contentVersionIds[posToShow].contentVersionId;
								regview("entry" + posToShow, trackingUrl, contentVersionId, widgetConfigId);
							}
							if (typeof(externalViewCounts[posToShow]) != "undefined") {
								countViewExternally("entry" + posToShow, externalViewCounts[posToShow]);
							}
						});
					});
				}
				tickerPos = tickerPos + 1 >= noOfEntries ? 0 : tickerPos + 1;
				continueAnimation(tickerDelay);
			}
			
			function continueAnimation(delay) {
				if (versionMap[feed.na_export.widgetConfigId].version != currentVersion) {
					// stop animation if widget version is not equal to current version.
					return;
				}
				versionMap[feed.na_export.widgetConfigId].timer = setTimeout(function() {
					if (!stopAnimation) {
						animateTicker();
					} else {
						continueAnimation(500);
					}
				}, delay);
			}
			
			if (typeof(tickerConfig) != "undefined") {
				// remove border of last visible element
				jQuery("#entry" + (parseInt(tickerConfig.visibleEntries) - 1)).css(entryBorderStyle, "none");
				// stop animation when hover
				jQuery("." + tickerConfig.enclosingDiv).hover(
						function() {
							stopAnimation = true;
						},
						function() {
							stopAnimation = false;
						});
				
				// start animation
				jQuery(document).ready(function() {
					if (!animationInitialized) {
						animationInitialized = true;
						continueAnimation(1000);
					}
				});
			}
		}
	
		try {
			for (var q =0; q<feed.na_export.widgetStructure.length;++q){
				if (!alreadydone(feed.na_export.widgetStructure[q].name)){
					getWidget(feed.na_export.widgetStructure[q].name);
				}
			}
			// track visible content
			for (var x = 0; x < contentVersionIds.length; x++) {
				if(typeof(contentVersionIds[x]) != "undefined"){
					if (contentVersionIds[x].visible) {
						regview("entry" + x, feed.na_export.trackingUrl, contentVersionIds[x].contentVersionId, feed.na_export.widgetConfigId);
					}
				}
			}
				
		} catch (e) {
			// alert(e);
		}
		
		jQuery("#" + widgetdiv).html(os2);
		
		// externally track visible content
		// must be executed after html was written
		for (var x = 0; x < externalViewCounts.length; x++) {
			if(typeof(externalViewCounts[x]) != "undefined"){
				if (contentVersionIds[x].visible) {
					countViewExternally("entry" + x, externalViewCounts[x]);
				}
			}
		}
		
		initAnimation();
		lock = null;
	} else {
		// lock couldn't aquired - try it later
		setTimeout(function() {
			getTheWidget(feed, widgetdiv, versionMap, lock);
		}, 100);
	}
}

function regview(attributeId, url, theContentid, theWidgetid){
	url = url.replace(/#oid/, theWidgetid);
	url = url.replace(/#cid/, theContentid);
	url = url.replace(/#ts/, new Date().getTime());
	jQuery("#" + attributeId + " .naCounter").remove();	
	jQuery("#" + attributeId).prepend("<img style='display:none;' class='naCounter' src='" + url + "' />");
}

function countViewExternally(attributeId, clk) {
	var ord = Math.random()*10000000000000000;
	jQuery("#" + attributeId + " .externalCounter").remove();	
	jQuery("#" + attributeId).prepend("<img style='display:none;' class='externalCounter' src='" + clk + ";ord=" + ord + "?" + "' />");
}
