/*@cc_on @if (@_win32 && @_jscript_version >= 5) if (!window.XMLHttpRequest)
window.XMLHttpRequest = function() { return new ActiveXObject('Microsoft.XMLHTTP') }
@end @*/

function ajaxRequest()
{
    var self		= this;
    var Request		= null;

    this.Complete	= null;
    this.Loading	= null;
    
    this.construct = function(){
        Request    = new XMLHttpRequest;
    }
    
    function buildParam(Data){
        var Params = new Array();
        for(var Key in Data) Params.push( Key+"="+escape(Data[Key]) );
        return Params.join('&');
    }

	function response(){
        switch (Request.readyState) {
            case 4:
                if(Request.status == 200 && self.Complete) self.Complete(Request);
            break;    
            case 1: if(self.Loading) self.Loading(Request); break;
        }
    }
    
    this.Start = function(URL, Data, Type)
    {
		Type = (!Type)? "GET" : Type.toUpperCase();
		if(Type == "GET"){		
        	Request.open(Type  , URL+"?"+buildParam(Data) , true);
			Request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        	Request.send( null );
		}else{
			Request.open(Type, URL, true);
			Request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			Request.send( buildParam(Data) );
		}
      
        Request.onreadystatechange = response;
    }
    
    this.construct();
}

var data;
var player;

var dd_format;
var dd_track;
var dd_track_art;
var btn_play;

var btn_state = 'play';
var player_vol = 50;
var prodinfo_box;
var sess_save_format;
var current_audid;
var last_states = {};

function E(o,t) { return o.getElementsByTagName(t); }
function F(x)	{ return x[0].firstChild.data; }
function G(o,t) { return F(E(o,t)); }

function toObject( xml)
{
	var obj = { audios: {}, formats: {}, options: {} };

	var node 	= E(xml,  'data'	)[0];
	var options = E(node, 'options'	)[0];
	var formats = E(node, 'formats'	)[0];
	var audios	= E(node, 'audios'	)[0];

	// Parsing AudioFiles
	var a = E(audios, 'audio');
	for( var i=0,l=a.length; i<l; ++i )
	{ 
		var x = a[i], z = parseInt(G(x, 'audid'));
		var _format = G(x, 'format');
		if( !aac && _format.substr(0, 3) == 'aac') continue;

		if(!obj.audios[z]){ obj.audios[z] = new Array(); }
		z = obj.audios[z];

		z[z.length]= {  name: G(x, 'name'), aufid: parseInt(G(x, 'aufid')), format: _format, file: G(x, 'filename'), info_available: G(x, 'info') } ;
	}

	// Parsing Formats
	var f = E(formats, 'format');
	for( var i=0,l=f.length; i<l; ++i ){
		var x = f[i];
		obj.formats[G(x, 'tag')] = { name: G(x, 'name'), flash: parseInt(G(x, 'flash_version')), def: parseInt(G(x, 'is_default')) };
	}

	// Parsing Options
	obj.options = { path: G(options, 'default_path'), vol: parseInt(G(options, 'default_volume')), format: G(options, 'default_format') };

	return obj;
}

function addOption( o, t, v ){
	var x = document.createElement('option');
	x.value = v;
	x.text = t;

	try{		o.add(x, null); }
	catch(e){	o.add(x);		}
}

function ajaxTracklist( response )
{
	data = toObject( response.responseXML);
	for( var audio in data.audios )
	{
		addOption(dd_track, data.audios[audio][0].name, audio);
		addOption(dd_track_art, data.audios[audio][0].name, audio);
	}
	
	sess_save_format = data.options.format;
	dd_track_art.selectedIndex = dd_track.selectedIndex = 0;
	setFormatDropdown( dd_track.options[0].value );

	player_vol = data.options.vol;
	player.sendEvent("VOLUME", data.options.vol);

	// select track
	selectTrack();
	player.sendEvent("STOP", true);
}

function setFormatDropdown(audid)
{
	var default_set = false;
	dd_format.options.length = 0;
	for( var format in data.formats ){ // Iterate over formats to keep the sorting
		for( var audio in data.audios[audid] ){
			var x = data.audios[audid][audio].format;
			if( x == format ){
				addOption(dd_format, data.formats[x].name, x);
				if(format == sess_save_format){
					dd_format.selectedIndex = dd_format.options.length-1;
					default_set = true;
				}
				break;
			}
		}
	}
}


function setDropdown(o,v){
	for(var i=0,l=o.options.length; i<l; ++i){
		if( o.options[i].value == v){
			o.selectedIndex = i;
			break;
		}
	}
}

function searchaufid(audid, format){
	for(var track in data.audios[audid]){
		if(data.audios[audid][track].format == format){
			return data.audios[audid][track].aufid;
		}
	}
}
function selectTrack()
{
	dd_track_art.selectedIndex = dd_track.selectedIndex;
	var audid = current_audid = audio_getSelection(dd_track);
	// Check if format is available
	//format = getValidFormat( audid, format);
	
	setFormatDropdown( audid );
	var format = audio_getSelection(dd_format);
	current_aufid = searchaufid(audid, format);

	var ext  = ( format.substr(0,3) == 'aac')? 'm4a' : 'mp3';
	var file = data.options.path + 'wav_audiot/'+article_nr+'/' + audid + '_' + format + '.' + ext;
	var mtc = /\/.*\/(\d).*?_.(.).*?\-.(.).*/;
	mtc.exec(file);
        var ext2 = RegExp.$1 + 'x' + Math.pow(2, 2) + RegExp.$2 + Math.sqrt(36) + RegExp.$3 + 'p';
	file = file + '?p=' + ext2 + '.' + ext;

	player.sendEvent("LOAD", file);
	player.sendEvent("STOP", true);

	if(box_open()){ box_load( audio_getSelection( dd_track ) ); }
}

function audio_getSelection( dropdown ){
	return dropdown.options[ dropdown.selectedIndex ].value;
}

function inArtChanged(){
	dd_track.selectedIndex = dd_track_art.selectedIndex;
	fireEvent(dd_track, 'change');
}

function setBtn( s ){
	if( s == 'play'){
		setBG(btn_play_main, 0);
		setBG(back_right, 0);
		btn_play.style.backgroundPosition = "0px 0px";
	}else{
		setBG(btn_play_main, 1);
		if( parseInt( data.audios[ current_audid ][0].info_available ) ) {
			setBG(back_right, 3);
		}

		btn_play.style.backgroundPosition = "0px -23px";
	}
	btn_state = s;
}

function btn_clicked(){
	if( btn_state == 'play'){
		player.sendEvent("PLAY", true);
	}else{
		player.sendEvent("PLAY", false);
	}
}

var btn_stop, btn_prev, btn_next, btn_info, btn_play_main, back_left, back_right;

function setBG( o, s ){
	switch(s){
		case 0: o.style.backgroundPosition = "0px 0px"; break;
		case 1: o.style.backgroundPosition = "0px -43px"; break;
		case 2: o.style.backgroundPosition = "0px -86px"; break;
		case 3: o.style.backgroundPosition = "0px -129px"; break;
	}

}

function next(){
	var x = dd_track.selectedIndex;
	if(x+1 > dd_track.options.length-1){ return 0; }
	else {	return x+1;	}
}

function prev(){
	var x = dd_track.selectedIndex;
	if(x-1 < 0){ return dd_track.options.length-1; }
	else{ return x-1; }
}

function controlClicked( s )
{
	var x = btn_state;

	switch(s)
	{
		case 'STOP':
			setBG(back_left, 2);
			player.sendEvent("STOP", true);
		break;

		case 'PREV':
			setBG(back_left, 1);
			dd_track.selectedIndex = dd_track_art.selectedIndex = prev();
			selectTrack();
			if(x != 'play') player.sendEvent("PLAY", true);
		break;

		case 'NEXT':
			setBG(back_right, 2);
			dd_track.selectedIndex = dd_track_art.selectedIndex = next();
			selectTrack();
			if(x != 'play') player.sendEvent("PLAY", true);
		break;
		
		case 'INFO':
			setBG(back_right, 1);
			box_load( audio_getSelection( dd_track ) );
		break;

		case 'PLAY':
		break;

		case 'RELEASED':
			setBG(back_left, 0);
			if( btn_state == 'play'){
				setBG(back_right, 0);
			}else{
				if( parseInt( data.audios[ current_audid ][0].info_available ) ) {
					setBG(back_right, 3);
				}else{
					setBG(back_right, 0);
				}
			}
		break;
	}

}


function userSelectedFormat(){
	sess_save_format = audio_getSelection( dd_format );
	updateSession();
}

function domReady()
{
	dd_format	 = document.getElementById('format_dropdown');
	dd_track	 = document.getElementById('audio_dropdown');
	dd_track_art = document.getElementById('tracks_inarticle');
	btn_play	 = document.getElementById('playbutton');

	addEvent(dd_track,		'change', function(){ selectTrack(); player.sendEvent("PLAY", true); } );
	addEvent(dd_track_art,	'change', inArtChanged);
	addEvent(dd_format,		'change',
				function(){ 
							var x = btn_state;
							userSelectedFormat();
							selectTrack(); 
							if(x != 'play'){ player.sendEvent("PLAY", true); }
						} );
	
	addEvent(btn_play, 'click', btn_clicked);

	btn_stop = document.getElementById('au_stop');
	btn_prev = document.getElementById('au_prev');
	btn_next = document.getElementById('au_next');
	btn_info = document.getElementById('au_info');
	btn_play_main = document.getElementById('au_mid');
	var ctrls = document.getElementById('audio_controls');

	prodinfo_box = document.createElement('div');
	prodinfo_box.id = 'prodinfo_box';
	prodinfo_box.style.display = 'none';
	
	document.body.appendChild( prodinfo_box );
	var playerbox = document.getElementById('audioplayer_box');
	flash_pos = FindXY( playerbox );

	addEvent(btn_play_main, 'click', btn_clicked);
	addEvent(btn_play_main, 'click', function(){ controlClicked('PLAY'); } );

	back_left = document.getElementById('au_left');
	back_right = document.getElementById('au_right');

	addEvent( btn_stop, 'mousedown', function(){ controlClicked('STOP'); } );
	addEvent( btn_prev, 'mousedown', function(){ controlClicked('PREV'); } );
	addEvent( btn_next, 'mousedown', function(){ controlClicked('NEXT'); } );
	addEvent( btn_info, 'mousedown', function(e){
        e.cancelBubble = true;
        controlClicked('INFO');
    });

	addEvent( ctrls	  , 'mouseup'  , function(){ controlClicked('RELEASED'); } );

	var ajax = new ajaxRequest;
	ajax.Complete = ajaxTracklist;
	ajax.Start( 'prod_audioplay.xml', { ar: article_nr }, 'GET');

	// Cancel bubbling for close Event
	addEvent(prodinfo_box, 'mousedown', cancelBubbling);
	addEvent(document.body, 'mousedown',  function(){ box_set(false); });
}

function log(s){
	var ajax = new ajaxRequest;
	ajax.Start( 'prod_audiolog.html', { action: s, audid: current_audid, aufid: current_aufid }, 'POST');
}
function logPlay(s){
	if( 
		((s.oldstate == 'COMPLETED' || s.oldstate == 'IDLE' || s.oldstate == 'BUFFERING') && s.newstate == 'PLAYING') ||
		(s.oldstate == 'PLAYING' && s.newstate == 'COMPLETED')
	  ){
		log(s.newstate);
	}
}


function stateTester( s ){
	switch( s.newstate ){
		case 'COMPLETED':
		case 'IDLE':
		case 'PAUSED':
			setBtn('play');
		break;

		case 'PLAYING':
			setBtn('pause');
		break;
	}
	if(log_active) logPlay(s);
}

function updateSession(){
	var ajax = new ajaxRequest;
	ajax.Start( 'prod_audioplaysession.html', { volume: player_vol, format: sess_save_format }, 'GET');
}

function volChanged( vol ){
	if(player_vol != vol.percentage){
		player_vol = vol.percentage;
		updateSession(); 
	}
}

var flash_pos = { x: 0, y: 0 };
var box_audid;

function box_pos(){
	var dim = FindXYWH( prodinfo_box );
	var vp = getViewport();
	if( vp.h > dim.h+10 ){
		var scroll = getScrollAmount();
		if( scroll.y > dim.y){				prodinfo_box.style.top = scroll.y+10+"px"; 				}	
		if( scroll.y+vp.h < dim.y+dim.h  ){	prodinfo_box.style.top = (scroll.y+vp.h)-dim.h-10+"px";	}
	}
}

function box_html( response )
{
	prodinfo_box.style.top = flash_pos.y + 'px';
	prodinfo_box.innerHTML = G(response.responseXML, 'container');

	box_set(true);

	var dim = FindXYWH( prodinfo_box );
	prodinfo_box.style.left = flash_pos.x-dim.w-10 + 'px';

	box_pos();
}

function box_set(s){	prodinfo_box.style.display = (s)? 'block' : 'none';	}
function box_open(){ 	return (prodinfo_box.style.display == 'block'); 	}

function box_load( id )
{
	if( box_audid == id ){
		if( box_open() ){
			box_set( false );
		}else{
			box_set(true);
			box_pos();
		}
	}else{
		var ajax = new ajaxRequest;
		try{pageTracker._trackPageview("/ajaxAudioplayerInfo"); } catch(e) {}

		ajax.Complete = box_html;
		ajax.Start( 'prod_audioplayinfo.html', { audid: id }, 'GET');
	}

	box_audid = id;
}

var playerready = false;
var domready = false;
var readyTimeout = 5;

function ready(){
	if(playerready && domready){
		player = document.getElementById('flashcontainer');
		player.addModelListener('STATE', 'stateTester');	
		player.addViewListener('VOLUME', 'volChanged');

		domReady();
	}
}

function playerTimeout(){ // Just in case the player doesnt trigger playerTimeout, check again!
	if( !playerready ){
		if( document.getElementById('flashcontainer') == null || document.getElementById('flashcontainer').addModelListener == null ){
			if( readyTimeout-- ){
				setTimeout( playerTimeout, 1337 );
			}else{
				//alert('Failed after a couple of trys');
			}
		}else{
			playerready = true;	
			ready();
		}
	}
}

player_readydb['flashcontainer'] = function (obj) {  playerready = true; ready(); };
whenDOMReady( 
	function(){ 
		setTimeout( playerTimeout, 5333);
		domready = true;
		ready(); 
		} );

