/**
 * Plugins de jquery para Generacion de Grilla a partir de XML
 * 
 * Date:		2009/06/10
 *
 * @author		Leonardo Etchegaray <letchegaray@gmail.com>
 * @version		1.0
 */
(function($){

jQuery.domXmlGrid = function (config){
	
	config = $.extend(true,{
						fileXML : '',//$.$config_erp.siteRelPathErpLib()+'$config/xml/grilla.xml',
						idTabla : '',//idgrilla
						prefixRow : '',//row
						fieldRepeat : 'codigo',
						classRepeat : 'validar_error',
						classError : "validacion-error",
						divShowError : "msg_error",
						sElementLoadDB : 'codigo,cantidad,precio,detalle',
						sElementLoadGrid : 'codigo,cantidad,precio,detalle'
						}, config || {});
		

	var oGrid = new Object;

	$.extend(oGrid,jQuery.methodGrid, config);

	return oGrid;	
}


jQuery.methodGrid = {
	
		fileXML : '',
		idTabla : '',
		prefixRow : '',
		fieldRepeat : '',
		classRepeat : '',
		classError : '',
		divShowError : '',
		sElementLoadDB : '',
		sElementLoadGrid : '',
	
		loadConfig : function() {
			var $config = this;
			$.ajax({
				 type: "GET",
				 url: $config.fileXML,
				 dataType: "xml",
				 cache: true,
				 async: false,
				 success: function(nodo){
					var prefixrow;
					var idTabla;

					$(nodo).find('fila').each(function(index){
						prefixrow = $(this).attr('prefixrow');
						idTabla = $(this).attr('idtabla');
					});

					if(prefixrow==null){
						alert("ERROR XML: Agregar atributo prefixRow en elemento fila de archivo "+$config.fileXML);
					}else{
						$config.prefixRow = prefixrow;
					}

					if(idTabla==null){
						alert("ERROR XML: Agregar atributo idTabla en elemento fila de archivo "+$config.fileXML);
					}else{
						$config.idTabla = idTabla;
					}
				 }
			});
			return this;
		},

		init : function() {
			var $config = this;
			$config.loadConfig();
			// document.getElementById($config.idTabla).innerHTML = '';
			$("#"+$config.idTabla).html('');
			$config.addTitle();
		},

		removeElement : function(idRow) {
			var $config = this;
			var tabla = document.getElementById($config.idTabla);
			var borrarIdRow = document.getElementById(idRow);
			tabla.removeChild(borrarIdRow);
		},

		addTitle : function() {
			var $config = this;
			var oTabla = document.getElementById($config.idTabla);
			var filasLength = oTabla.getElementsByTagName('tr').length;
			var idRow = $config.prefixRow;

			$.ajax({
			 type: "GET",
			 url: $config.fileXML,
			 dataType: "xml",
			 cache: true,
			 success: function(nodo){
				   		var elmTR = oTabla.insertRow(0);
							elmTR.id = $config.prefixRow;

						// $(nodo).find('titulo').each(function(index){//carga titulos grilla//1.2.6
						 $(nodo).find("titulos\\:titulo, titulo").each(function(index){//1.3
							var elmTD = elmTR.insertCell(index);
							var elemInput = document.createElement("text");
									elemInput.innerHTML = $(this).text();

							elmTD.appendChild(elemInput);
						});

					$config.addElement();//crea primer elemento de la grilla
			 		}
			});
		},
		
		addElement : function() {
			this.loadConfig();
			var $config = this;

			// var tabla = document.getElementById($config.idTabla);
			// var filasLength = tabla.getElementsByTagName('tr').length;

			var fila = '';
			var idRow = $config.prefixRow;

			 	$.ajax({
				 type: "GET",
				 url: $config.fileXML,
				 dataType: "xml",
				 cache: true,
				 async: false,
				 success: function(nodo){

					$('#'+$config.idTabla+' tr').each(function(index) {
						fila = this.id;
					});

					if(fila==idRow){
						var nuevaFila = 0;
					}else{
						var aId = fila.split('_');
						var nuevaFila = eval(aId[1]+"+"+1);
					}

					var newTr = $('<tr id="'+idRow+'_'+nuevaFila+'"></tr>');
					$('#'+$config.idTabla).append(newTr);
						
						$(nodo).find('columna').each(function(index){
							
							if($(this).find('element').text() == 'input' || $(this).find('element').text() == 'img' || $(this).find('element').text() == 'div'){
								var valorID = $(this).find('id').text()+'_'+nuevaFila;
								
								var sElementInput = 'size,border,src,disabled,style,value,onKeyPress,ondblclick,onClick,onBlur,onFocus,class,validate,title,autocomplete';
								var aElementInput = sElementInput.split(",");										
								var obColumna = this;
								
								var parClave = '';
								$.each(aElementInput, function(i) {
									if($(obColumna).find(aElementInput[i]).text()!=''){
										parClave+= ' '+aElementInput[i]+'="'+$(obColumna).find(aElementInput[i]).text()+'" ';
									}
								});


								if($(this).find('element').text() == 'input'){
									var item = '<input type="'+$(this).find('type').text()+'" id="'+$(this).find('id').text()+'_'+nuevaFila+'" name="'+$(this).find('name').text()+'" '+parClave+' >';
								}else if($(this).find('element').text() == 'img'){
									var item = '<img id="'+$(this).find('id').text()+'_'+nuevaFila+'" name="'+$(this).find('name').text()+'"  '+parClave+' >';
								}else if($(this).find('element').text() == 'div'){
									var item = '<div id="'+$(this).find('id').text()+'_'+nuevaFila+'" name="'+$(this).find('name').text()+'"  '+parClave+' />';
								}


								if(valorID==$(this).attr('filainicial')){
									var newTd = $('<td></td>').html('<div></div>');
										newTr.append(newTd);
								}else{
									var newTd = $('<td></td>').html(item);
										newTr.append(newTd);
								}
									
							}//fin if element

							else if($(this).find('element').text() == 'select'){								
								var valorID = $(this).find('id').text()+'_'+nuevaFila;

								var sElementInput = 'size,border,src,disabled,style,value,onKeyPress,ondblclick,onClick,onBlur,onFocus,class,validate,title';
								var aElementInput = sElementInput.split(",");										
								var obColumna = this;

								var parClave = '';
								$.each(aElementInput, function(i) {
									if($(obColumna).find(aElementInput[i]).text()!=''){
										parClave+= ' '+aElementInput[i]+'="'+$(obColumna).find(aElementInput[i]).text()+'" ';
									}
								});

								var sHtmlSelect = '<select id="'+$(this).find('id').text()+'_'+nuevaFila+'" name="'+$(this).find('name').text()+'" '+parClave+' >';
								var sHtmlOption = '';
								
									$(this).find('option').each(function(index){
										sHtmlOption+= '<option value="'+$(this).attr('value')+'">'+$(this).text()+'</option>';
									});
									sHtmlSelect+= sHtmlOption+'</select>';
									
								var newTd = $('<td></td>').html(sHtmlSelect);
									newTr.append(newTd);
									
							}//fin else if element


							else if($(this).find('element').text() == 'select_array'){
								var valorID = $(this).find('id').text()+'_'+nuevaFila;

								var sElementInput = 'size,border,src,disabled,style,value,onKeyPress,ondblclick,onClick,onBlur,onFocus,class,validate,title';
								var aElementInput = sElementInput.split(",");										
								var obColumna = this;

								var parClave = '';
								$.each(aElementInput, function(i) {
									if($(obColumna).find(aElementInput[i]).text()!=''){
										parClave+= ' '+aElementInput[i]+'="'+$(obColumna).find(aElementInput[i]).text()+'" ';
									}
								});

								var sHtmlSelect = '<select id="'+$(this).find('id').text()+'_'+nuevaFila+'" name="'+$(this).find('name').text()+'" '+parClave+' >';
								var sHtmlOption = '';
								
									// $(this).find('option').each(function(index){
									// 	sHtmlOption+= '<option value="'+$(this).attr('value')+'">'+$(this).text()+'</option>';
									// });
									
								var sConfig_aDatosCombobox = "$."+$(this).find('datos').text();
								var aConfig_aDatosCombobox = eval(sConfig_aDatosCombobox);
									
								if(aConfig_aDatosCombobox!=null){
									$.each(aConfig_aDatosCombobox,function(i, o){
										sHtmlOption+= '<option value="'+i+'">'+o+'</option>';
									});									
								}
									
									sHtmlSelect+= sHtmlOption+'</select>';

								
								var newTd = $('<td></td>').html(sHtmlSelect);
									newTr.append(newTd);
									
							}//fin else if element



						});//fin columna
					}// fin success

					,error: function (data, status, e){
								alert(e);
							}

				}); //close $.ajax

		}//fin addElement		
		
		
};//fin methodGrid



// aValueElement
// totalCantidadPrecio
// sumarTotal
$.extend( jQuery.methodGrid,{

			aValueElement : function(element){
				var aElement = Array();

				// $("[@name^="+element+"]").each(function(index) {
				$("input[name^='"+element+"']").each(function(index) {
					if(this.value==''){
						this.value = 0;
					}
					this.value = parseFloat(this.value);
					aElement[index] = this.value;
				});
				return aElement;
			},

			totalCantidadPrecio : function(){
				var $config = this;
				var aCantidad = $config.aValueElement("cantidad");
				var aPrecio = $config.aValueElement("precio");
				var aTotalFila = Array();
				var subtotal = 0;

				// $("[@name^=totalfila]").each(function(index) {
				$("input[name^='totalfila']").each(function(index) {
					if(this.value==''){
						this.value = 0;
					}
					aTotalFila[index] = eval(aCantidad[index] + '*' + aPrecio[index]);
					this.value = parseFloat(aTotalFila[index]);
				});

				jQuery.each(aTotalFila,function(index,value){
					subtotal = eval(subtotal + '+' +aTotalFila[index]);
				});
				return subtotal;
			},

			sumarTotal: function(){
				var $config = this;
				var subtotal = $config.totalCantidadPrecio();//coredomxml_totalCantidadPrecio();
				var iva = eval(subtotal+"*"+0.19);
				var total_iva = eval(subtotal+"+"+iva);

				$('#total_venta').val(subtotal);

	//			$('#total').val(subtotal);
	//			$('#iva').val(iva);
	//			$('#total_venta').val(total_iva);
	//			$('#total_pagar').val(total_iva);
			}
						
});



// // loadDataGrid
// // disabledGrid
// // enabledGrid
// // showRepeat
// // addSelect
// // removeSelect
$.extend( jQuery.methodGrid,{

	loadDataGrid : function(data) {
		var $config = this;
		var sElementos = $config.sElementLoadDB;
		var aElementos = sElementos.split(",");

		var sElementosGrid = $config.sElementLoadGrid;
		var aElementosGrid = sElementosGrid.split(",");

		$.each(data, function(i) {
			if(document.getElementById(aElementosGrid[0]+"_"+i)==null){
				$config.addElement();						
				$.each(aElementosGrid, function(index) {
					if(aElementosGrid[index]=="detalle"){
						$("#"+aElementosGrid[index]+"_"+i).html(eval("data[i]."+aElementos[index]));
					}else{
						$("#"+aElementosGrid[index]+"_"+i).val(eval("data[i]."+aElementos[index]));
					}
				});
			}else{
				$.each(aElementosGrid, function(index) {
					if(aElementosGrid[index]=="detalle"){
						$("#"+aElementosGrid[index]+"_"+i).html(eval("data[i]."+aElementos[index]));
					}else{
						$("#"+aElementosGrid[index]+"_"+i).val(eval("data[i]."+aElementos[index]));
					}
				});						
			}
		});	
		$config.sumarTotal();
	},

	disabledGrid : function (){
		var $config = this;
		$('#'+$config.idTabla+' .field').each(function(index) {
			$("#"+this.id).attr("disabled", "disabled");
		});
	},

	enabledGrid : function (){
		var $config = this;
		$('#'+$config.idTabla+' .field').each(function(index) {
			$("#"+this.id).removeAttr("disabled");
		});
	},
	
	showError : function(data){//data.error.error_producto
		var $config = this;
		// "error_producto":[
		// 					{"prod_uid":null,"cantidad":null},
		// 					{"prod_uid":null,"cantidad":null}
		
		var $aErrorItem = data;
		var sErrorMensaje = "";

		var sElementosDB = $config.sElementLoadDB;
		var aElementosDB = sElementosDB.split(",");

		var sElementosGrid = $config.sElementLoadGrid;
		var aElementosGrid = sElementosGrid.split(",");

		var camposError = '';
		
		var i=0;
		$('#'+$config.idTabla+' tr').each(function() {
			var idTr = this.id;
			var aIdTr = idTr.split("_");
			
			if(aIdTr[1]>=0){				
				if($aErrorItem[i]!=null){
					var $eItem = $aErrorItem[i];
					$.each(aElementosGrid, function(index) {
							var elementMsgError = eval("$eItem"+"."+aElementosDB[index]);

							if(elementMsgError != undefined){
								// $("#msg_error ul").append("<li>Fila "+aElementosGrid[index]+"_"+aIdTr[1]+": "+elementMsgError+"</li>");
								var fila = eval(aIdTr[1]+"+1");
								$("#msg_error ul").append("<li>Fila "+fila+": "+elementMsgError+"</li>");
								$("#"+aElementosGrid[index]+"_"+aIdTr[1]).addClass("validacion-error");
								camposError+=aElementosGrid[index]+"_"+aIdTr[1]+',';
							}
					});
				}
				i++;
			}

		});
		
		camposError = camposError.substring(0,camposError.length-1);//elimina la ultima ,
		
		return camposError;
		
	},
	

	cleanError : function(){
		var $config = this;
				
		$("#"+$config.divShowError+" ul").empty();

		$('#'+$config.idTabla+' .field').each(function(index) {
			$("#"+this.id).removeClass($config.classError);
		});

		$('#'+$config.idTabla+' tr').each(function(index) {
			$("#"+this.id).removeClass($config.classRepeat);
		});
	},

	showRepeat : function() {
		var $config = this;
		var aCodigo = Array();
		var aIguales = Array();

		// $("[@name^="+jQuery.domXmlGrid.fieldRepeat+"]").each(function(index) {
		$("input[name^="+$config.fieldRepeat+"]").each(function(index) {
				var sId = this.id;
				var aId = sId.split('_');

	            aCodigo[index] = Array();
				aCodigo[index][0] = this.id;
				aCodigo[index][1] = this.value;

				$("#"+$config.prefixRow+"_"+aId[1]).removeClass($config.classRepeat);
		});

		for(i=0;i<aCodigo.length;i++){
			for(j=i+1;j<aCodigo.length;j++){
				if(aCodigo[i][1]==aCodigo[j][1]){
					var sIdi = aCodigo[i][0].split('_');
					var sIdj = aCodigo[j][0].split('_');
					$("#"+$config.prefixRow+"_"+sIdi[1]).addClass($config.classRepeat);
					$("#"+$config.prefixRow+"_"+sIdj[1]).addClass($config.classRepeat);
				}
			}
		}
	},

	addSelect : function(idfield){
		var $config = this;
		var sId = idfield;
		var aId = sId.split('_');	
		$("#"+$config.prefixRow+"_"+aId[1]).addClass("fila_select");
	},

	removeSelect : function(idfield){
		var $config = this;
		var sId = idfield;
		var aId = sId.split('_');	
		$("#"+$config.prefixRow+"_"+aId[1]).removeClass("fila_select");
	}
	
});

})(jQuery);
