/**
 *  Arreglo que almacena los objetos que representan a cada contenido streaming en 
 *  la pagina
 */
var arr_contenidos = new Array();
var index_contenidos = 0;


/**
 *  Funcion start_live, utilizada en marcacion
 *
 *  Se utiliza para declarar contenido en vivo (de tipo LIVE)
 *  Si iniciar es true, inicia el registro de la reproduccion
 */
function start_live(sitio_id, seccion_id, contenido_id, iniciar){
	seccion_id = normalizaString(seccion_id);
	contenido_id = normalizaString(contenido_id);
	var contenido = obtener_contenido(contenido_id);
	if(contenido == undefined){
		var obj_c = new obj_contenido(sitio_id, seccion_id, contenido_id, -1, true, 'live');
		arr_contenidos[index_contenidos] = obj_c;
		index_contenidos++;
		if(iniciar==true){
			play(contenido_id);
		}
	}else{
        	if(contenido.reproduccion_id == -1 && iniciar==true){
           		 play(contenido_id);
        	}
    	}
}

/**
 *  Funcion end, utilizada en marcacion
 *
 *  Esta funcion se utiliza al final de la reproduccion de un clip
 *  Esta funcion marca el momento en el que el clip termino su reproduccion sin
 *  intervencion del usuario
 */
function end(contenido_id){
	contenido_id = normalizaString(contenido_id);
	var contenido = obtener_contenido(contenido_id);
	if(contenido){
		if(contenido.reproduccion_id != -1){
			generarHit(contenido,'accion=end');
			contenido.reproduccion_id = -1;
		}
	}
}

/**
 *  Funcion avance, utilizada en marcacion
 *
 *  Esta funcion se debe utilizar cuando heart_beat es false
 *  marca el porcentaje de avance de una determinada reproduccion
 */
function avance(contenido_id, porcentaje){
	contenido_id = normalizaString(contenido_id);
	var contenido = obtener_contenido(contenido_id);
	if(contenido){
		if(contenido.heart_beat == false && contenido.reproduccion_id != -1){
			generarHit(contenido,'accion=avance&avance='+porcentaje);
		}
	}
}

/**
 * Funcion pause, utilizada en marcacion
 *
 * Por ahora es una funcion dummy. Es conveniente de todos modos marcar el boton pause
 * de el reproductor de contenido con esta funcion, ya que si se le agrega funcionalidad
 * en el futuro, no se haga necesaria una re-marcacion de contenido
 */
function pause(contenido_id){
	contenido_id = normalizaString(contenido_id);
}


/**
 *  Function stop, utilizada en marcacion
 *
 *  Se debe utilizar cuando el usuario hace click en boton stop en el reproductor
 *  debe notarse la diferencia entre un boton STOP y un boton PAUSE
 *  STOP indica que la reproduccion actual se finaliza, play nuevamente inicia otra
 *  reproduccion
 *
 */
function stop(contenido_id){
	contenido_id = normalizaString(contenido_id);
	var contenido = obtener_contenido(contenido_id);
	if(contenido){
		if(contenido.reproduccion_id != -1){
			generarHit(contenido, 'accion=stop');
			contenido.reproduccion_id = -1;
		}
	}
}


/**
 *  Funcion play, utilizada en marcacion
 *
 *  Se debe utilizar cuando el usuario hace click en un boton play en el reproductor
 */
function play(contenido_id){
	contenido_id = normalizaString(contenido_id);
	var contenido = obtener_contenido(contenido_id);
	if(contenido){
		if(contenido.reproduccion_id == -1){
			var rep_id = Math.round(Math.random()*1000000);
			contenido.reproduccion_id = rep_id;
			if(contenido.heart_beat == true){
				beat(contenido_id);
			}else{
				generarHit(contenido, 'accion=play');
			}
		}
	}
}

/**
 *  Funcion start, utilizada en marcacion
 *
 *  Utilizada para declarar un determinado contenido streaming de tipo CLIP en la pagina
 *
 *  Si heart_beat es true, se emitira una senal beat cada xxxx milisegundos
 *  Si heart_beat es false, se debera marcar con funciones "avance(cont, xx%)"
 *  Si iniciar es true, se ejecuta play para el contenido declarado
 */
function start(sitio_id, seccion_id, contenido_id, duracion, heart_beat, iniciar){
	seccion_id = normalizaString(seccion_id);
	contenido_id = normalizaString(contenido_id);
	var contenido = obtener_contenido(contenido_id);
	if(contenido == undefined){
		var obj_c = new obj_contenido(sitio_id, seccion_id, contenido_id, duracion, heart_beat, 'clip');
		arr_contenidos[index_contenidos] = obj_c;
		index_contenidos++;
		if(iniciar==true){
			play(contenido_id);
		}
	}else{
        	if(contenido.reproduccion_id == -1 && iniciar==true){
           		 play(contenido_id);
        	}
    	}
}

/**
 *  Funcion beat
 *  
 *  Cada XXX milisegundos genera un hit con accion=beat. 
 *  Solo genera el hit si el contenido contempla una reproduccion en curso
 */
function beat(contenido_id){
	contenido_id = normalizaString(contenido_id);
	var contenido = obtener_contenido(contenido_id);
	if(contenido){
		if(contenido.reproduccion_id != -1){
			generarHit(contenido, 'accion=beat');
			var f = function(){beat(contenido_id);};
			setTimeout(f, 60000);
		}
	}
}


/**
 * Busca en el arreglo, el objeto contenido de id = contenido_id
 */
function obtener_contenido(contenido_id){
	for(var i=0; i < arr_contenidos.length; i++){
		if(arr_contenidos[i].contenido_id == contenido_id){
			return arr_contenidos[i];
			break;
		}
	}
}

/**
 * Crea un objeto que representa a contenido streaming
 */
function obj_contenido(sitio_id, seccion_id, contenido_id, duracion, heart_beat, tipo){
	this.sitio_id = sitio_id;
	this.seccion_id = seccion_id;
	this.contenido_id = contenido_id;
	this.duracion = duracion;
	this.reproduccion_id = -1;
	this.heart_beat = heart_beat;
	this.tipo = tipo;
}


/**
 *Functiones de generacion de HIT
 */
function generarHit(contenido, extras){
	var url = getUrl(contenido, extras);
	var rand = Math.round(Math.random()*1000000);
	url = url+'&rand='+rand;
	
	(new Image).src = url;	
}


function getUrl(contenido, extras){
	var url = '';
	
	//definir protocolo
	var proto = getProtocol();
	if (proto != 'https:') proto = 'http:';
	
	//generar URL
    	url = proto+'//hits.e.cl/cert/hit.dll?proc_id=stream&s='+contenido.sitio_id+'&seccion='+contenido.seccion_id+'&contenido='+contenido.contenido_id+'&reproduccion='+contenido.reproduccion_id+'&tipo='+contenido.tipo;

	//solo si el contenido es de tipo click va indicada la duracion en segundos
    	if(contenido.tipo == 'clip'){
        	 url = url  +'&duracion='+contenido.duracion;
    	}

	if(extras){
		url = url + '&' + extras;
	}

	return url;
}

function getProtocol(){
	if(window && window.location && window.location.protocol){
		return window.location.protocol;
	}
	return null;
}

function normalizaString(entrada){
	var resultado = entrada;
	resultado = resultado.toLowerCase();
	resultado = resultado.replace(/[\xE1]/g,"a");
	resultado = resultado.replace(/[\xE9]/g,"e");
	resultado = resultado.replace(/[\xED]/g,"i");
	resultado = resultado.replace(/[\xF3]/g,"o");
	resultado = resultado.replace(/[\xFA]/g,"u");
	resultado = resultado.replace(/[^0-9a-z/]/g,"_");
	return resultado;
}


