/*
 * Audio-Player für Expert Online-Shop
 *
 * Copyright (c) 2010 eWorks GmbH.
 * Alle Rechte vorbehalten
 *  - http://www.eworks.de
 *
 * Autor: Fabian Bitter
 * Version: 1.0.0
 * Datum: 06.05.2010
 */
 
sprintfWrapper = {
	init : function () {
 
		if (typeof arguments == "undefined") { return null; }
		if (arguments.length < 1) { return null; }
		if (typeof arguments[0] != "string") { return null; }
		if (typeof RegExp == "undefined") { return null; }
 
		var string = arguments[0];
		var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g);
		var matches = new Array();
		var strings = new Array();
		var convCount = 0;
		var stringPosStart = 0;
		var stringPosEnd = 0;
		var matchPosEnd = 0;
		var newString = '';
		var match = null;
 
		while (match = exp.exec(string)) {
			if (match[9]) { convCount += 1; }
 
			stringPosStart = matchPosEnd;
			stringPosEnd = exp.lastIndex - match[0].length;
			strings[strings.length] = string.substring(stringPosStart, stringPosEnd);
 
			matchPosEnd = exp.lastIndex;
			matches[matches.length] = {
				match: match[0],
				left: match[3] ? true : false,
				sign: match[4] || '',
				pad: match[5] || ' ',
				min: match[6] || 0,
				precision: match[8],
				code: match[9] || '%',
				negative: parseInt(arguments[convCount]) < 0 ? true : false,
				argument: String(arguments[convCount])
			};
		}
		strings[strings.length] = string.substring(matchPosEnd);
 
		if (matches.length == 0) { return string; }
		if ((arguments.length - 1) < convCount) { return null; }
 
		var code = null;
		var match = null;
		var i = null;
 
		for (i=0; i<matches.length; i++) {
 
			if (matches[i].code == '%') { substitution = '%' }
			else if (matches[i].code == 'b') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2));
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'c') {
				matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument)))));
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'd') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'f') {
				matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'o') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 's') {
				matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length)
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'x') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'X') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
				substitution = sprintfWrapper.convert(matches[i]).toUpperCase();
			}
			else {
				substitution = matches[i].match;
			}
 
			newString += strings[i];
			newString += substitution;
 
		}
		newString += strings[i];
 
		return newString;
 
	},
 
	convert : function(match, nosign){
		if (nosign) {
			match.sign = '';
		} else {
			match.sign = match.negative ? '-' : match.sign;
		}
		var l = match.min - match.argument.length + 1 - match.sign.length;
		var pad = new Array(l < 0 ? 0 : l).join(match.pad);
		if (!match.left) {
			if (match.pad == "0" || nosign) {
				return match.sign + pad + match.argument;
			} else {
				return pad + match.sign + match.argument;
			}
		} else {
			if (match.pad == "0" || nosign) {
				return match.sign + match.argument + pad.replace(/0/g, ' ');
			} else {
				return match.sign + match.argument + pad;
			}
		}
	}
}
 
sprintf = sprintfWrapper.init;

var player = function() {
	var p = this;
	
	p.tracks = new Array();
	p.isPlaying = false;
	p.curIndex = 0;
	
	p.add = function(ref, url) {
		// Track hinzufügen
		p.tracks.push({
			"url" : url,
			"ref" : ref
		});
		
		return p.tracks.length;
	}
	
	p.count = function() {
		return tracks.length;
	}
	
	p.skipToTrack = function(newIndex) {
		if (newIndex <= p.tracks.length && newIndex >= 0) {
		
			if (newIndex > p.curIndex) {
				// Vorwärts
				p.curIndex = newIndex - 1;
				jQuery("#nextbutton").click();
			} else {
				// Zurück
				p.curIndex = newIndex + 1;
				jQuery("#prevbutton").click();
			}
		}
	}
	
	p.prev = function() {
		if (p.curIndex > 0) {
			// Ein Track zurück
			p.curIndex--;
			
			// Player und Anzeige aktualisieren
			p.refresh();
			
			// Ist der Wiedergabemodus aktiv, dann Track automatisch abspielen
			if (p.isPlaying) p.play();
			
			return (p.curIndex > 0);
		} else {
			return false;
		}
	}
	
	p.next = function() {
		if (p.curIndex + 1 < p.tracks.length) {
			// Einen Track vorwärts
			p.curIndex++;
			
			// Player und Anzeige aktualisieren
			p.refresh();
			
			// Ist der Wiedergabemodus aktiv, dann Track automatisch abspielen
			if (p.isPlaying) p.play();
			
			return (p.curIndex + 1 < p.tracks.length);
		} else {
			return false;
		}
	}
	
	p.refresh = function() {
		var trackData = p.tracks[p.curIndex];
		
		// Songnamen für die Anzeige generieren
		var songTitle = sprintf(
			playerConfig.trackPrefix,
			
			//(p.curIndex + 1),
			jQuery(trackData.ref).attr("title")
		);
		
		// Aktuellen Titel auf aktiv setzen
		
		for(var i = 0; i < p.tracks.length; i++) {
			if (i == p.curIndex) {
				if (!jQuery(p.tracks[i].ref).hasClass("active")) {
					jQuery(p.tracks[i].ref).addClass("active")
				} 
			} else {
				if (jQuery(p.tracks[i].ref).hasClass("active")) {
					jQuery(p.tracks[i].ref).removeClass("active")
				} 
			}
		}
		// Trackurl für die Wiedergabe generieren
		var trackURL = sprintf(
			playerConfig.trackURL,
			trackData.url
		);
		
		// Datei für die Wiedergabe setzen
		jQuery("#jPlayer").jPlayer("setFile", trackURL);
		
		// Songnamen als Tooltip setzen...
		jQuery("#songtitle").html(songTitle).fadeOut(0).fadeIn(400);
		
		// Wenn Titel zu lang ist, in der Anzeige abkürzen...
		if (songTitle.length > 60) songTitle = songTitle.substr(0, 60) + "...";
		
		// Songnamen anzeigen
		jQuery("#songtitle").html(songTitle);
	}
	
	p.pause = function() {
		if (p.isPlaying) {
			// Player anhalten
			jQuery("#jPlayer").jPlayer("pause");

			p.isPlaying = false;
			
			return true;
		} else {
			return false;
		}
	}
	
	p.play = function() {		
		// Player starten
		jQuery("#jPlayer").jPlayer("play");
			
		if (!p.isPlaying) {			
			
			p.isPlaying = true;
			
			return true;
		} else {
			return false;
		}
	}
}

var objPlayer = new player();

var initPlayer = function() {
	try {
		if (playerConfig == "undefined") return;
	} catch(e) {
		return;
	}
	
	// Tracks hinzufügen
	jQuery("#tracklist a.songitem").each(function() {
		jQuery(this).attr("rel", objPlayer.add(this, jQuery(this).attr("rel"))).click(function() {
			objPlayer.skipToTrack(jQuery(this).attr("rel") - 1);
		});
		
		
	});
	
	// Buttons mit dem Player verbinden
	jQuery("#playbutton").html("").click(function() {
		if (objPlayer.isPlaying) {
			// Player anhalten
			if (objPlayer.pause()) {
				// Pause-Button in Play-Button umwandeln
				if (jQuery(this).hasClass("pause")) {
					jQuery(this).removeClass("pause");
				}
				
				// Tooltip setzen
				jQuery(this).attr("title", playerConfig.playCaption);
			}
			
		} else {
			// Player starten
			if (objPlayer.play()) {
				// Play-Button in Pause-Button umwandeln
				jQuery(this).addClass("pause");
				
				// Tooltip setzen
				jQuery(this).attr("title", playerConfig.pauseCaption);
			}
		}
	});
	
	jQuery("#prevbutton").html("").click(function() {
		var hasChanged = objPlayer.prev();
		
		if (jQuery("#nextbutton").hasClass("disabled") && hasChanged) {
			jQuery("#nextbutton").removeClass("disabled");
		} else if(!hasChanged) {
			jQuery("#prevbutton").addClass("disabled");
		}
	});
	
	jQuery("#nextbutton").html("").click(function() {
		var hasChanged = objPlayer.next();
		
		if (jQuery("#prevbutton").hasClass("disabled") && hasChanged) {
			jQuery("#prevbutton").removeClass("disabled");
		} else if(!hasChanged) {
			jQuery("#nextbutton").addClass("disabled");
		}
	});
	
	// Trackliste verstecken
	//jQuery("#tracklist").css("display", "none");
	
	
	// Initalisiere MP3-Player
	jQuery("#jPlayer").jPlayer({
		swfPath : playerConfig.sourcePath,
		ready : function() {
		
			// Player und Anzeige aktualisieren
			objPlayer.refresh();
			
			// Autoplay? - Lets play..
			if (playerConfig.autoplay) {
				jQuery("#playbutton").click();
			}
		}
	})
	
	jQuery("#jPlayer").jPlayer("onSoundComplete", function() {
		// Wenn true, dann automatisch zum nächsten Song wechseln...
		if (playerConfig.autoSkipNext) {
			jQuery("#nextbutton").click();
		}
	});

	// Startanimation anzeigen wenn gewünscht
	if (playerConfig.fadeInAnimation) {
		jQuery("#audioplayer").css({
			"margin-left" : "200px"
		}).animate({
			"margin-left" : "0px"
		}, 600, function() {
			jQuery(this).animate({
				"margin-left" : "30px"
			}, 400, function() {
				jQuery(this).animate({
					"margin-left" : "0px"
				}, 300);
			});
		});
	}
};
