/****************************************************************/
var xmlResponse; //guarda respuesta de ajax
var functionExcequte = notFunction; //guarda funcion a ejecutar al cerrar dialogo modal
var compareParameter; // Almacena un parametro de comparacion de fechas ('not before','notAfter', null)
var currentObject;
var selectedDate = "";  //usado para el calendario


addEvent(window,"scroll",moveDivDialogOpacity);
/***************************************************************/
  
function notFunction(aux){

}
/**
 * crea un nuevo document xml y lo retorna
 * @param {String} nameRooEle
 * @return {XmlDocument} nuevo xml docuemento 
 * @author Carlos Prieto
 */  
function loadXMLDoc(nameRooEle){
	var xmlDoc;
	var root;
	// code for IE
	if (isIE()){
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		if(nameRooEle != ""){
			root = xmlDoc.createElement(nameRooEle);
			xmlDoc.documentElement = root;			
		}
	}
	// code for Mozilla, Firefox, Opera, etc.
	//else if (document.implementation && document.implementation.createDocument){
	else if (isMozilla()){
		xmlDoc=document.implementation.createDocument("",nameRooEle,null);
	}else{
		alert('Your browser cannot handle this script');
	}
	return(xmlDoc);
}

/**
 * toma un document xml y lo trasnforma en string
 * @param {XmlDocument} xmlDoc
 * @return {String} string con el contenido del xml document
 * @author Carlos Prieto
 */
function xmlDocToString(xmlDoc){
	var str;
	var s;
	if(isIE()){
		str = xmlDoc.xml;
	}else if(isMozilla()){
		s = new XMLSerializer();
		str = s.serializeToString(xmlDoc);
	}
	
	return str;
}


/**
 * toma un string y lo transforma en una xml document 
 * @param {String} str
 * @return {XmlDocument} xml document que contenia el string
 * @author Carlos Prieto
 */
function stringToXmlDoc(str){
	var parser;
	var xmlDoc;
	
	if (isIE())
  {
  	xmlDoc = loadXMLDoc("");
  	xmlDoc.async="false";
  	xmlDoc.loadXML(str);
  }else if(isMozilla()) {
  	parser	=	new DOMParser();
  	xmlDoc	=	parser.parseFromString(str,"text/xml");
  }
	
	return xmlDoc;
}


/**
 * envia peticion al servidor por AJAX
 * @param {String} operation
 * @param {XmlDocument} xmlParameters
 * @param {String} request
 * @param {String} onCompletion
 * @author Carlos Prieto
 */
function sendAjaxRequest(operation, xmlParameters, request, onCompletion){
	var ajax;
	ajax = new sack();	
	ajax.setVar("operation", operation);
	ajax.setVar("xmlParameters", xmlDocToString(xmlParameters)) ;
	ajax.request = request;
	ajax.method = "POST";
	ajax.onCompletion = onCompletion;
  ajax.documentName = "xmlResponse";
  ajax.runAJAX();
}


/**
 * envia peticion al servidor por POST
 * @param {String} operation
 * @param {XmlDocument} xmlParameters
 * @param {String} request
 * @author Carlos Prieto
 */
function sendSubmitRequest(operation, xmlParameters, request){
	document.getElementById("formUseCase").operation.value = operation;
	document.getElementById("formUseCase").xmlParameters.value = xmlDocToString(xmlParameters);
	document.getElementById("formUseCase").action = request;
	document.getElementById("formUseCase").submit();
}


/**
 * Convierte la cadena recibida a formato tipo Nombre: Primer Caracter en Mayuscula.
 * @param {Input} objInput
 * @author David Alavarez
 */
function toNameType(objInput) {
	var arr = new Array();
	var name = "";
	arr = objInput.value.split(" ");
	
	for(i=0;i<arr.length;i++){
		if(arr[i]!="")
		 	name += arr[i].substring(0,1).toUpperCase()+arr[i].substring(1,arr[i].length).toLowerCase()+" ";
	}
	objInput.value = rtrim(name);
}


/**
 * Evalua si un numero recibido es mayor que cero. Utlizado en la validacion de campos numericos
 * en los formularios.
 * @param {String} str
 * @return {boolean} verdadero si es mayor que cero falso si es menor
 * @author David Alvarez
 */
function numberIsPositive(str){
	 
	if (isNumeric(str, "int"))
		return true;
	else
		return false;
	
}


/**
 * Evalua si la cadena recibida es numerica, esta funcion es utilizada
 * en la validacion de campos
 * @param {String} str String a evaluar
 * @param {String} type tipo de numero entero o flotante
 * @return {boolean} verdadero si es numero falso si tiene caracteres alfabetico
 * @author David Alvarez
 */
function isNumeric(str, type){
	if(str.length>2){
		if(type == "int")
			return /^[0-9]+?$/.test(str);
		else if(type == "float")
			return /^([0-9]+)*.?([0-9]+)?$/.test(str);
	}else
		return /^[0-9]+?$/.test(str);
}


/**
 * Evalua si la cadena recibida es una direccion del correo valida
 * @param {String} str
 * @return {boolean} verdadero si es una dir valida falso si no es valida
 * @author Camilo Valencia
 */
function isEmailAddress(str) {
  if (str == "")
	 	return true;
  else
	  return /^([\w]+)(\.[\w]+)*@([\w\-]+)(\.[\w]{2,7})(\.[a-z]{2})?$/i.test(str);
}


/**
 * Formatea una cantidad contenido en el objeto recibido como parametro, agregando
 * puntos de separacion cada tres cifras. La funcion se activa en el evento onBlur del campo
 * @param {Input} obj
 * @author David Alvarez
 */

function formatNumber(obj){
	var string;
	var strLength;
	var subStr;
	var decimalStr="";
	var limit;
	var formatedString="";
	var strTemp;
	
	if(typeof obj == 'object' )
		strTemp = obj.value;
	else 
		strTemp = obj.toString();	

	string = strTemp.split(".");

	if(string.length <= 2){
		if(string[1]) decimalStr=string[1];
	
		string = string[0];
		strLength = string.length;

		if(string!=""){
			if(isNumeric(string,"float")){
				for(i=string.length; i>0;i-=3){
			  	limit=i-3;
			  	  subStr = string.substring(limit,i);
		
					if(i==strLength){
	 				  formatedString+=subStr;
					}	else{
						formatedString=subStr+","+formatedString;
					}
				}
				
				if(decimalStr!=""){
					formatedString+="."+decimalStr;
				}
				formatedString = "$"+formatedString;
					
				if(typeof obj == 'object' )
					obj.value = formatedString;
				else 
					return formatedString;	
				}

		}else setValueOut(obj);
	}
}



/**
 * Deshace el formateado de la funcion formatNumber para la modificacion 
 * de la cantidad ingresada en el campo valor cotizado de marketing.xslt.
 * La funci?n se activa en el evento onFocus del objeto.
 * @param {Input} obj
 * @author David Alvarez
 */
function unFormatNumber(obj){
	var string="";
	var stringAux;
	var strLength="";
	var unformatedString ="";
	var defaultContent= "";
	
	string = obj.value;
	
	if(isIE())
		defaultContent = obj.defaultContent;
	else(isMozilla())
		defaultContent = obj.getAttribute("defaultContent");
	
	if(string != defaultContent ){
		stringAux=string.split("$");
		if(stringAux.length>1)	string = stringAux[1];
		string = string.split(",");
		strLength = string.length;
		
		for(i=0; i<strLength; i++){
		  unformatedString+=string[i];
		}
		
		if(isNumeric(unformatedString,"float"))	obj.value=unformatedString;
		else setValueIn(obj);
		
	}else setValueIn(obj);
	
}

/**
 * Coloca como valor del campo recibido por par?metro, el valor del atrubuto 'defaultContent' del mismo campo,
 * si se cumple que: '.value' = '', o '.value' = espacios en blanco.
 * @param {Input} obj
 * @author David Alvarez
 */
function setValueOut(obj){

  if (trim(obj.value) == "") {
		if(isIE())
    	obj.value = obj.defaultContent;
		else if(isMozilla)
			obj.value = obj.getAttribute("defaultContent");
  }
}

/**
 * Coloca como valor del campo recibido por par?metro, el valor '' (vac?o)
 * si se cumple que: '.value' = '.defaultContent' (atrubuto personalizado, del mismo campo)
 * @param {Object} obj
 * @author David Alvarez
 */
function setValueIn(obj){
	if(isIE()){
  	if (trim(obj.value) == obj.defaultContent) {
    	obj.value = "";
  	}
	} else if(isMozilla()){
		if (trim(obj.value) == obj.getAttribute("defaultContent")) {
    	obj.value = "";
  	}
	}
}

/**
 * Retorna el valor recibido como parametro, luego de quitar los caracteres ' ' (espacio) antes y despues del texto
 * @param {String} str
 * @return {String} String sin espacios sobrantes
 * @author Camilo Valencia
 */
function trim(str) {
  return rtrim(ltrim(str));
}
  

/**
 * Retorna el valor recibido como parametro, luego de quitar los caracteres ' ' (espacio) antes del texto
 * @param {Object} str
 * @return {String} String sin espacios sobrantes a la izquierda
 */
function ltrim(str){
  return str.replace(/^\s+/, '');
}

/**
 * Retorna el valor recibido como parametro, luego de quitar los caracteres ' ' (espacio) despues del texto
 * @param {Object} str
 * @return {String} String sin espacios sobrantes a la derecha
 */
function rtrim(str) {
  return str.replace(/\s+$/, '');
}

/**
 * aņade funcion a objeto
 * @param {Object} obj
 * @param {String} evType tipo de evento 
 * @param {funcion} fn
 */
function addEvent(obj, evType, fn){
 if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
 } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
 } else {
    return false;
 }
}

/**
 * abre dialogo modal
 * @param {String} text texto a visualizar, puede ser html
 * @param {String} dialogType tipo de ventana de dialogo
 * @param {String} alertMssg titulo del dialogo
 * @param {Function} functionExc funcion que ejecuta despues de cerrar dialogo
 * @author Carlos Prieto
 */
function openDialog(text, dialogType, alertMssg, functionExc) {
	document.getElementById("divDialog_opacity").style.display = "";
	document.getElementById("divDialog_message").style.display = "";
	
	if (dialogType == "errorAlert")
		document.getElementById("divErrorButtons").style.display = "";
	else if (dialogType == "confirmAlert")
		document.getElementById("divConfirmButtons").style.display = "";
		
	document.getElementById("message").innerHTML = text;
	functionExcequte = functionExc;
}

/**
 * cierra ventana de dialogo
 * @author Carlos Prieto
 */
function closeDialog(valueToReturn){
  document.getElementById("divDialog_opacity").style.display = "none";
  document.getElementById("divDialog_message").style.display = "none";
	document.getElementById("divErrorButtons").style.display = "none"
	document.getElementById("divConfirmButtons").style.display = "none";
	//document.getElementById("divDialog_message_error").style.display = "none";
	closeMessageError();
	functionExcequte(valueToReturn);
	functionExcequte = null;
}
  
/**
 * mueve el div opaco cuando de hace scroll
 * @author Carlos Prieto
 */
function moveDivDialogOpacity(){
	document.getElementById("divDialog_opacity").style.top  = document.documentElement.scrollTop + "px";
	document.getElementById("divDialog_opacity").style.left  = document.documentElement.scrollLeft + "px";
}

/**
 *muestra mensaje de error en la vetana modal
 * @authos Carlos Prieto
 */
function showMessageError(text){
	//document.getElementById("divDialog_message_error").style.display = "";
	document.getElementById("divDialog_message_error").innerHTML = text;
	//alert(text);
}

/**
 *cierra mensaje de error sin cerrar la ventana modal
 * @author Carlos Prieto
 */

function closeMessageError(){
	//document.getElementById("divDialog_message_error").style.display = "none";
	document.getElementById("divDialog_message_error").innerHTML = "";
}

/**
 * transforms a given XMLDOM object with the XSLT and returns the output as a string
 * @param {XmlDocument} XMLObject
 * @param {String} XSLTPath
 * @author Mauricio Moya
 */
function transformDomXML(XMLObject, XSLTPath){
  var xslDocument = new ActiveXObject('MSXML2.FreeThreadedDOMDocument');
  var xslProcessor;
  var xslTemplate = new ActiveXObject('MSXML2.XSLTemplate');

  xslDocument.async = false;
  xslDocument.load(XSLTPath);
  xslTemplate.stylesheet = xslDocument;
  xslProcessor = xslTemplate.createProcessor();
  xslProcessor.input = XMLObject;
  xslProcessor.transform();
  return xslProcessor.output;
}
  
/**
 * transforms a given xml-formed-String with the XSLT and returns the output as a string
 * @param {String} xmlString
 * @param {String} XSLTPath
 * @author Mauricio Moya
 */
function transformStringXML(xmlString, XSLTPath){
  var xslDocument = new ActiveXObject('MSXML2.FreeThreadedDOMDocument');
  var xslProcessor;
  var xslTemplate = new ActiveXObject('MSXML2.XSLTemplate');
  var XMLObject = new ActiveXObject('MSXML2.FreeThreadedDOMDocument');

  XMLObject.loadXML(xmlString);
  xslDocument.async = false;
  xslDocument.load(XSLTPath);
  xslTemplate.stylesheet = xslDocument;
  xslProcessor = xslTemplate.createProcessor();
  xslProcessor.input = XMLObject;
  xslProcessor.transform();
  return xslProcessor.output;
}


/**
 * valida si el explorador es internet explorer
 * @author Carlos Prieto
 */
function isIE(){
	if(window.ActiveXObject)
		return true;
	else
	return false;
}

/**
 * Valida si el explorardor es Mozilla 
 * @author Carlos Prieto
 */
function isMozilla(){
		if(navigator.userAgent){
			if(navigator.userAgent.indexOf("Gecko")){
				return true;
			}
		}else
			return false;
}

/**
 * Valida si el explorador es Opera
 * @author Carlos Prieto
 */
function isOpera(){
	if(window.opera)
		return true;
	else
	return false;
}

function versionIE(){
	var index = navigator.userAgent.indexOf("MSIE");
	if (index == -1) return;
	return parseFloat(navigator.userAgent.substring(index + "MSIE".length + 1));
}


/**
 * Cambia el estilo del objeto dado
 * @param {String} Id del objeto al que se le desa modificar el estilo
 * @param {String} Nombre del nuevo estilo
 * @author Mauricio Moya
 */  
function changeStyle(objectId, styleName) {
  document.getElementById(objectId).className = styleName;
}


/**
 * Muestra u oculta un div
 * @param {String} Id del odiv que se desea mostrar u ocultar
 * @param {Boolean} true cuando se desea mostrar el div
 * @author Mauricio Moya
 */  
function showDiv(objectId, display) {
  if(display == true)
    style = "";
  else
    style = "none";
  document.getElementById(objectId).style.display = style;
}


/**
 * aņade un tr a un tbody
 * @param {Tbody} 
 * @param {TR} 
 * @author Carlos Prieto
 */
function addRowToTbody(tbody, trow){
	tbody.appendChild(trow);
}

/**
 * borra un tr de un tbody
 * @param {Tbody} 
 * @param {int id}
 * @author Carlos Prieto
 */
function deleteRowToTbody(tbody, trowId){
	//var tbody = document.getElementById(tbody.getAttribute('id'));
	var	row = document.getElementById(trowId);
	tbody.removeChild(row);
}


/**************************************************************************/

function abrir(){
	var h = "<table border='1'><tr><td> hola mundo </td></tr></table>";
	openDialog(h,"" ,"", hola);
}

function hola(s){
	alert('hola mundo');
}

/**
Macromedia Graphic Functions
*/

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function replace(text,s1,s2){
  return text.split(s1).join(s2);
}


/*****************funciones de calendario**********************/
/**
 * abrir calendario
 * @param 
 * @author 
 */

function openCalendar(objInput,str){

  var node;
  var xmlDoc = loadXMLDoc("xmlParameters");
  
  compareParameter = str; /* variable global que se debe actualizar con cada llamada al calendario
                ** Hasta el momento se utiliza con birthDate en Marketing.xslt
                ** si no se recibe un valor se asume que no hay restricciones para la fecha
                */
  currentObject = objInput;

  node = xmlDoc.createElement("date");
  node.setAttribute( "date", objInput.value);
  node.setAttribute( "calendarDate", "");

  xmlDoc.documentElement.appendChild(node);
  
  sendAjaxRequest("getCalendar",xmlDoc,"ApplicationToolsController",showCalendar);
}

function showCalendar(){

  var selectedDate;
  var actualDate;

  elements = xmlResponse.documentElement.getElementsByTagName("td");  /* Obtener la fecha actual que trae calendr.xslt */

  for(i=0; i<elements.length-1; i++){
    if(elements[i].getAttribute("id")=="todayDate"){
            actualDate = elements[i].getAttribute("day");
      actualDate +="."
      actualDate += elements[i].getAttribute("month");
      actualDate +="."
      actualDate += elements[i].getAttribute("year");
    }
  }
  
  openDialog(xmlDocToString(xmlResponse),"" ,"", beforeShowCalendar);
}

function beforeShowCalendar(s){
  if (selectedDate && selectedDate!="")
    currentObject.value = selectedDate;
  else
    currentObject.value = "";
}
  


function updateCalendar(){
  document.getElementById("message").innerHTML = xmlDocToString(xmlResponse);
}

function deleteDate(){
  selectedDate = "";
  closeDialog("yes");
  
}

function offsetCalendarTo(selectedDate, configuring){
  var calendarDate;

  calendarDate = "01.";
  if (parseInt(document.getElementById('ddMonth').value)<9)
    calendarDate+="0";
  calendarDate+=parseInt(document.getElementById('ddMonth').value)+1;
  calendarDate+="."+document.getElementById('txtYear').value;
  //calendarDate+=" 00:00:00"
  if (configuring)
    offsetCalendar(selectedDate,calendarDate,true);
  else
    offsetCalendar(selectedDate,calendarDate);
}

function offsetCalendar(date, calendarDate, configuring){

  var node;

  var xmlDoc = loadXMLDoc("xmlParameters");

  node = xmlDoc.createElement("date");
  node.setAttribute( "date", date);
  node.setAttribute( "calendarDate", calendarDate);

  xmlDoc.documentElement.appendChild(node);

  sendAjaxRequest("getCalendar",xmlDoc,"ApplicationToolsController",updateCalendar);
}