

// GLOBAL VARS
var pClass = '';

//Toma las respuestas de ajaxSubmit
var ajaxSubmitResponse = new Array();
var ajaxRequestResponse = new Array();

/*****************************************************************/
/**
 * @param object obj
 * @author Ivano
 * @desc Devuelve la cantidad de items dentro de un objeto
 * @use Object.size(response.followers)
 */
Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};
/*****************************************************************/

function makeAjaxSubmit(data){
	var btn = data.btn;
	var form = (data.form != null) ? data.form : btn.parents("form");
	var _target = (data.target != null) ? data.target : '';
	var _callback = (data.callback != null) ? data.callback : '';
	var _URL = (data.URL != null) ? data.URL : '';
	var _dataType = (data.dataType != null) ? data.dataType : 'json';
	var _type = (data.type != null) ? data.type : 'POST';
	var _data = (data.data != null) ? data.data : '';
	var _beforeSubmit = (data.validator != null) ? data.validator : '';
	var _resetForm = (data.resetForm != null) ? data.resetForm : false;
	var _clearForm = (data.clearForm != null) ? data.clearForm : false;
	var _timeout = (data.timeout != null) ? data.timeout : '';
	var debug = (data.debug != null) ? data.debug : false;
	
	$(form).submit(function(){
		
		enableDisable({'el':btn,'disable':true});
		
		// inside event callbacks 'this' is the DOM element so we first 
		// wrap it in a jQuery object and then invoke ajaxSubmit 
		$(form).ajaxSubmit({
			target: _target,   						// target element(s) to be updated with server response
			//beforeSubmit: showRequest(formData, jqForm, options) Tiene estos parametros por default
			beforeSubmit: _beforeSubmit,  			// pre-submit callback
			success: function(response, status, xhr, form){	// post-submit callback		
			
				ajaxSubmitResponse['response'] = response;
				ajaxSubmitResponse['status'] = status;
				ajaxSubmitResponse['xhr'] = xhr;
				ajaxSubmitResponse['form'] = form;
				
				// Si debug es true
				if(debug){
					console.log(response);
					console.log(status);
					console.log(xhr);
					console.log(form);
				}
			
				// Si se hizo bien el ajaxsubmit pero hubo un error,
				// muestro el error en un dialog
				if(response.error != ''){
					dialog({'title':'Error','message':response.error, 'modal':true});
				}else{
					// Si hay una funcion callback
					if(_callback){
						_callback();
					}
				}
				
				enableDisable({'el':btn,'disable':false});
			},
			
			// other available options:
			url:       _URL,     					// override for form's 'action' attribute
			type:      _type,        				// 'get' or 'post', override for form's 'method' attribute
			dataType:  _dataType,        			// 'xml', 'script', or 'json' (expected server response type)
			data: _data,							// json con parametros adicionales a los campos del form (ej: {action:'listar'}
			clearForm: _clearForm,        			// clear all form fields after successful submit
			resetForm: _resetForm,        			// reset the form after successful submit
			
			// $.ajax options can be used here too, for example:
			timeout:   _timeout,
			error: function(){
				enableDisable({'el':btn,'disable':false});
				if(debug){
					console.log("Failed to submit\n");
				}
			}		
		}); 
		// !!! Important !!! 
		// always return false to prevent standard browser submit and page navigation 
		btn.unbind('click');
		return false; 
	}); 
}

function replaceServerPaths(data){
	var r ;
	var array = false;
	var json = false;
	
	var replacer = function(s){
		if(typeof s == 'string'){
			return s
			.replace(new RegExp( "\{siteBaseAssets\}", "g" ), siteBaseAssets)
			.replace(new RegExp( "\{siteBase\}", "g" ), siteBase)
			.replace(new RegExp( "\{siteName\}", "g" ), siteName);
		}else{
			return s;
		}
	};

	switch (typeof data){
		case 'object':
			r = {};
			json = true;
			for(var i in data){
				r[i] = replaceServerPaths(data[i]);
			}
		break;
		
		default:
			if(json){
				r.push(replacer(data));
			}else{
				return replacer(data);
			}
		break;
	
	}
	return r;
	/*
	if(typeof data != 'boolean' && typeof data != 'integer'){
		if(typeof data == 'object' || isArray(data)){
			if(!isArray(data)){	// is json		
				r = {};
				json = true;
				for(var i in data){
					r[i] = replaceServerPaths(data[i]);
				}
			}//else if(isArray(data)){ //is array
				//r = new Array();
				//array = true;
				//for(var i in data){
					//r.push(replaceServerPaths(data[i]));
				//}
			//}
		}else{
			//if(array){
				//r.push(replacer(data));
			//}else
			if(json){
				r.push(replacer(data));
			}else{
				return replacer(data);
			}
		}
	}
	
	return r;	
	*/	
}

function makeAjaxRequest(data){
	var btn = data.btn;
	var _callback = (data.callback != null) ? data.callback : '';
	var _URL = (data.URL != null) ? data.URL : '';
	var _dataType = (data.dataType != null) ? data.dataType : 'json';
	var _type = (data.type != null) ? data.type : 'POST';
	var _data = (data.data != null) ? data.data : '';
	var _beforeSend = (data.validator != null) ? data.validator : '';
	var _timeout = (data.timeout != null) ? data.timeout : '';
	var _contentType = (data.contentType != null) ? data.contentType : '';
	var _cache = (data.cache) ? data.cache : '';
	var debug = (data.debug != null) ? data.debug : false;	
	
	if(btn != null){
		enableDisable({'el':btn,'disable':true});
	}
	
	$.ajax({
		url: _URL,
		type: _type, 
		data: _data,
		dataType: _dataType,
		//beforeSend: showRequest(formData, jqForm, options) Tiene estos parametros por default
		beforeSend: _beforeSend,
		
		success: function(response, status, xhr){
			// Reemplazo las variables del servidor en las respuestas ajax
			ajaxRequestResponse['response'] = replaceServerPaths(response);
			ajaxRequestResponse['status'] = status;
			ajaxRequestResponse['xhr'] = xhr;
			
			// Si debug es true
			if(debug){
				console.log('_common.js | makeAjaxRequest debug');
				console.log(response);
				console.log(status);
				console.log(xhr);
			}
			
			if(_dataType == 'json' && response.error != ''){
				dialog({'title':'Error','message':response.error, 'modal':true});
			}else{
				// Si hay una funcion callback
				if(_callback){
					_callback();
				}
			}
			if(btn != null){
				enableDisable({'el':btn,'disable':false});
			}
		},
		timeout:   _timeout,
		error: function(){
			if(btn != null){
				enableDisable({'el':btn,'disable':false});
			}
			if(debug){
				console.log("Failed to submit\n");
			}
		}
	});
	
	//btn.unbind('click');
}


/**
 * 
 * @param data json el:element,beforeProcess:fn,callBack:fn,speed:int|string|empty
 * @return
 */
function showHide(data){
	var div = data.el;
	var speed = (data.speed != null) ? data.speed : '';
	var _beforeProcess = (data.beforeProcess != null) ? data.beforeProcess : false;
	var _callBack = (data.callBack != null) ? data.callBack : false;
	
	if(div == '' || div == null){
		console.log('showHideDiv: no hay elemento para procesar');
		return;
	}
	
	if(_beforeProcess){
		_beforeProcess();
	}
	div.slideToggle(speed, function(){
		if(_callBack){
			_callBack();
		}
	});
}

function queryStringToJson(data){
	var d = data
		.replace(new RegExp( "\&", "g" ),"\',\'")
		.replace(new RegExp( "\=", "g" ),"\':\'");
	d = decodeURI(d);
	d = decodeURIComponent(d);
	d = '{\'' + d + '\'}';
	return eval('(' + d + ')');	
}

function enableDisable(data){
	var el = data.el;
	var disable = (data.disable == undefined) ? true : data.disable;
	
	if(disable){
		el.attr('disabled','disabled');
	}else{
		el.removeAttr('disabled');
	}
}

function makeCollapsible(data){	
	
	var rules = data.rules;
	
	for(i=0; i < rules.length; i++){
		
		var container = $('.' + rules[i].contClass);
		var titles = container.children(rules[i].titles);
		var openElements = '';
		var texts = $('.' + rules[i].contClass + ' ' + rules[i].hide);
		var pressedTitle = '';
		var tmp,pressed, pressedId, pressedText;
		var defaultOpenIndex = rules[i].defaultOpenIndex;
		
		if(titles.length > 0 && container.length > 0){
		
			titles.addClass('collapsibleClosed collapsibleTitle');
			texts.addClass('collapsibleText');	
			texts.hide();
			
			if((defaultOpenIndex || defaultOpenIndex == 0) && defaultOpenIndex !== ''){
				$(titles.get(defaultOpenIndex)).removeClass('collapsibleClosed');
				$(titles.get(defaultOpenIndex)).addClass('collapsibleOpen');
				$(texts.get(defaultOpenIndex)).show();
			}
		
			titles.each(function(index){
				$(this).click(
					function(){ 
						pressed = $(this);
						tmp = pressed.attr('id').split("_");
						pressedId = tmp[1];
						pressedTitle = $('#tit_' + pressedId);
						pressedText = $('#txt_' + pressedId);
						if(pressedText.is (':hidden')){
							texts.slideUp();
							openElements = $('.collapsibleOpen').removeClass('collapsibleOpen');
							openElements.addClass('collapsibleClosed');
							
							pressedTitle.removeClass('collapsibleClosed');
							pressedTitle.addClass('collapsibleOpen');
							pressedText.slideDown();
						}else{
							texts.slideUp();
							pressedTitle.removeClass('collapsibleOpen collapsibleClosed');
							pressedTitle.addClass('collapsibleClosed');
						}
					}
				);
			});
		}
	}
}

function dialog(data){	
	$('#dialog').dialog("destroy");	
	
	var d = $('#dialog');
	var message_holder = $('#message_holder');
	
	var _mode = (data.mode == null) ? 'alert' : data.mode;
	var _title = data.title;
	var _message = data.message;
	
	var _modal = (data.modal == null) ? false : data.modal;
	var _resizable = (data.resizable == null) ? false : data.resizable;
	var _height = (data.height == null) ? 'auto' : data.height;
	var _width = (data.width == null) ? 300 : data.width;
	
	var _btn1Text = (data.btn1Text == null) ? 'Aceptar' : data.btn1Text;
	var _btn1Function = (data.btn1Function == null) ? false : data.btn1Function;
	var _btn2Text = (data.btn2Text == null) ? 'Cancelar' : data.btn2Text;
	var _btn2Function = (data.btn2Function == null) ? false : data.btn2Function;
	
	// Seteo los botones
	if(_mode != 'message'){
		var buttons = {}; 
		buttons[_btn1Text] = function(){
			if(_btn1Function){
				data.btn1Function();
			}
			$(this).dialog('close');		
		};
		if(_mode == 'confirm'){
			buttons[_btn2Text] = function(){
				if(_btn2Function){
					data.btn2Function();
				}
				$(this).dialog('close');
			};
		}
	}
	
	message_holder.html(_message);
	
	d.dialog({
		title: _title,
		resizable: _resizable,
		height:_height,
		width:_width,
		modal: _modal,
		position: 'center',
		buttons: buttons
	});
}

function urls_amigables(url){
	// Clean up the title		
	var urlRetorno = url
		.toLowerCase() // change everything to lowercase
		.replace(/^\s+|\s+$/g, "") // trim leading and trailing spaces		
		.replace(/[_|\s]+/g, "-") // change all spaces and underscores to a hyphen
		.replace(/[^a-z0-9-]+/g, "") // remove all non-alphanumeric characters except the hyphen
		.replace(/[-]+/g, "-") // replace multiple instances of the hyphen with a single instance
		.replace(/^-+|-+$/g, "") // trim leading and trailing hyphens				
		; 
	
	return urlRetorno;
}

function createIframe(data){
	var iframe = $('<iframe></iframe>');
	var id = (data.id == null) ? new Date().getTime() : data.id;
	var url = data.url;
	var src;
	
	if(typeof url == 'boolean'){
		src = 'javascript:false';
	}
	else if(typeof url == 'string'){
		src = url;
	}
	
	iframe.attr({ 
        id: 'iframe_' + id,
        src: src
	});
	
	iframe.css({position:'absolute',top:'-1000',left:'-1000',height:1,width:1});
	
	return iframe;
}

function delivery(d){
	var tmp = d.el.attr('id').split('_');
	var idB = tmp[0];
	var idE = tmp[1];
	var idL = tmp[2];
	var type = tmp[3];
	var URL = siteBase + '_ajx/entry_jx_delivery.php?f=' + F;	
	
	//console.log('blog_id:' + idB + ' entry_id:' + idE + ' language_id:' + idL);
	
	$.ajaxFileUploadIv(
		{
			url:URL,
			secureuri:true,
			//type: 'POST',
			formId: false, // Sin formId, se crea un formulario en el momento. con formId, envia los campos de ese formulario
			dataType: 'json',
			additionalData:{'idB':idB,'idE':idE,'idL':idL,'t':type},
			success: function(response, status){
				if(typeof(response.error) != 'undefined'){
					if(response.error != ''){
						alert('error: ' + response.error);
					}else{
						if(response.status == true){
							pClass = "msgOk";
						}else{
							pClass = "msgError";
						}
					}
				}
				statusOff();
			},
			error: function(response, status, e){
				//console.log(data);
				alert(e + '\ndata: ' + response + '\ne: ' + e);
				statusOff();
			}
		}
	);
	statusOff();
}

function descargar(obj){
	var iFrame, par, objeto, idObjeto, seccion;
	objeto = obj.attr("id").split("_");
	seccion = objeto[0];
	idObjeto = objeto[1];

	par = "t="+seccion+"&id=" + idObjeto+'&l=' + l;
	iFrame = $("#iframe");
	iFrame.attr("src",siteBase + "_jx/_delivery.php?" + par);
}

function statusOn(){
	$("#pnlStatus").show();
}

function statusOff(){
	$("#pnlStatus").hide();
}

function limpiarSelect(sel){
    $("#"+sel)[0].options.length=0;
}

function llenarSelect(p){
	var origen = $('#'+p.origen);
	var destino = $('#'+p.destino);
	var valor = origen.val();
	var accion = p.accion;
	if(valor!=0){
		prendeStatus();
		$.ajax({
			type:'POST', 
			data: {"accion":accion,"id":valor},
			url: siteBase+"_jx/_utiles.php?f="+F,
			dataType: 'json',
			success: function(respuesta){
				 limpiarSelect(destino.attr('id'));
				 for(i=0; i < respuesta.items.length; i++){
					opcion = new Option(respuesta.items[i].texto,respuesta.items[i].valor);
					destino[0].options[i]=opcion;
				 }
				 apagaStatus();
			}
		});
	}
}

function isArray(a) {
	if (a.constructor.toString().indexOf("Array") == -1){
		return false;
	}else{
		return true;
	}
}

//USO JSON {'funcion':'xx','tiempo' (en segundos):xx, 'parametros':'xx'}
function activarFuncion(opciones){
	var f = opciones.funcion;
	var d = eval(opciones.delay * 1000);
	var p = opciones.parametros;
	
	setTimeout(f+"("+p+")",d);
}

function utf8_encode ( argString ) {

    // Encodes an ISO-8859-1 string to UTF-8  
    // 
    // version: 1008.1718
    // discuss at: http://phpjs.org/functions/utf8_encode
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // +   bugfixed by: Ulrich
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
    var string = (argString+''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
 
    var utftext = "";
    var start, end;
    var stringl = 0;
 
    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
 
        if (c1 < 128) {
            end++;
        } else if (c1 > 127 && c1 < 2048) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc !== null) {
            if (end > start) {
                utftext += string.substring(start, end);
            }
            utftext += enc;
            start = end = n+1;
        }
    }
 
    if (end > start) {
        utftext += string.substring(start, string.length);
    }
 
    return utftext;
}

function utf8_decode ( str_data ) {
    // Converts a UTF-8 encoded string to ISO-8859-1  
    // 
    // version: 1008.1718
    // discuss at: http://phpjs.org/functions/utf8_decode
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork
    // +   bugfixed by: Onno Marsman
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
    
    str_data += '';
    
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }
 
    return tmp_arr.join('');
}

