(function($) {
    function ToolKit()
    {    	
    	var layout = new Array();
		var layoutIndex= 0;
		
    	function isJson(html) 
    	{    		
    		try
    		{
	    		if (jQuery.trim(html) == '') 
	    			return false;    		
	    		html = html.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    		}
    		catch (e) {
				return false; 
			}
    		return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(html);
    		
		}
    	
    	function jsonObject(html)
    	{
    		return eval("(" + html + ")");
    	}
    	
    	this.launch = function(data)
		{
    		var $self = this;    		
    		var launcher = { 
				functions : new Array(), 
				registerMethod : function(name, fn) {
					this.functions[name] = fn;
		  		}, 
		  		ini : function() { 
		  			this.registerMethod("showContent", $self.showContent); 
		  			this.registerMethod("hideContent", $self.hideContent);
		  			this.registerMethod("showAlert", $self.showAlert);
		  			this.registerMethod("formManager", $self.formManager);
		  			this.registerMethod("showContentIn", $self.showContentIn);
		  			this.registerMethod("redirect", $self.redirect);
		  			this.registerMethod("appendRowManager", $self.appendRowManager);
		  			this.registerMethod("updateRowManager", $self.updateRowManager);
		  			this.registerMethod("executeFunction", $self.executeFunction);
		  			this.registerMethod("alertBox", $self.alert);		  			
		  			this.registerMethod("noAction", function(){});
		  			this.registerMethod("showNotification", $self.showNotification);
		  			this.registerMethod("hideNotification", $self.hideNotification);
		  		}
			};
    		launcher.ini();	    		    	
	    	try
	    	{
	    		//alert(data.action)
	    		launcher.functions[data.action](data.html, this);   
	    	}
	    	catch(x)
	    	{	    		
	    		alert(x);	    		
	    	}
		};
    	
		this.executeFunction = function(options)
		{
			if (is_function(options.functionName))
				options.functionName(options.params);
			else
			{
				eval(options.functionName + '(options.params)');
			}
		};
    	/**
    	 * Se ejecuta cuando termina la ejecucion asincrónica
    	 *
    	 * @param  data 
    	 * 		   - action: Nombre de la accion
    	 * 		   - html: Html del servidor
    	 * 		   - multiple: Si true vienen muchas acciones
    	 * 		   - actions: Listado de acciones
    	 * @param  success: Funcion a ejecutar al terminar
    	 * @param  callOwner : De donde proviene la llamada (Formulario o Ajax)   
    	 */
    	this.finishAjax = function(data, success, source)
    	{
    		hideLoading();
    		var response = null; 
			if (isJson(data))
			{				
				data = jsonObject(data)
				var multiple = data.multiple ? true : false;
				if(multiple)
				{
					for(var index in data.actions)
					{
						this.launch(data.actions[index])
						if (data.actions[index].action == 'noAction')
							response = data.actions[index].html;
					}					
				}
				else
				{					
					this.launch(data)
					response = data.html;
				}
			}
			/*else
			if (source == 'formManager')
			{					
				cargarFotografiasAdiciona('', 'application');
				//$(document).find('body').append(data);
			}*/
			else
			{
				response = data;
			}
			if (success)
			{
				if (is_function(success))
					success(response, source)
				else
				{
					eval(success+'('+response+',"'+ source +'")');
				}
			}
    	};
    	    	
    	/**
    	 * Envia peticion asincronica y carga contenido
    	 *
    	 * @param  url: Url a enviar la petición 
    	 * @param  success: Funcion a ejecutar al terminar la ejecucion
    	 * @param  ajaxForm : Id del formulario con comportamiento ajaxForm   
    	 */
    	this.loadContent = function(url, success, params, type, loading)
    	{    		    		
    		type = type ? type : 'get';
    		loading = loading != null ? loading : true;
    		params = params ? params : {};
    		$self = this;
    		$.ajax({ 
    			url: url, 
    			async: true, 
    			type: type, 
    			data: params,
    			beforeSend: function(){
    			    if (loading)
    			    	showLoading();
	    		},
	    		success: function(data, textStatus){	    			
	    			$self.finishAjax(data, success, 'loadContent');	    			
	            },
	            error:function (XMLHttpRequest, textStatus, errorThrown) {
	            	hideLoading();
	            	/*$self.showAlert({ 
		    			html: 'Ocurrio un error de tipo: '+ errorThrown, 
		    			type: 'error',
		    			title: 'Error ajax'
		    		});*/	            	
	    		}
    		});    		    		
    	};
    	
    	
    	/**
    	 * Envia peticion asincronica y carga contenido
    	 *
    	 * @param  url: Url a enviar la petición 
    	 * @param  success: Funcion a ejecutar al terminar la ejecucion
    	 * @param  ajaxForm : Id del formulario con comportamiento ajaxForm   
    	 */
    	this.formManager = function(data, self)
    	{    	
    		//$self = this;    		
    		$self = self;    		
    		if (data.formId)
			{
				var options = {   
	    			success:function(response){
						if (!isJson(response))
						{
							$self.executeFunction(data.imageFunction);
						}
						else
						{
							$self.finishAjax(response, data.success, 'formManager');
						}
	    	        },
	    	        beforeSubmit: function(){        		
	    	        	showLoading();
	    	    	}
	    	   	}; 
	        	$('#'+data.formId).ajaxForm(options);
			}   		    		
    	};
    	
    	//Muestra ventana de carga asincronica
    	function showLoading() 
    	{	
    		$('#loading').show(); 
    	}
    	
    	//Oculta ventana de carga asincronica
    	function hideLoading() 
    	{	
    		$('#loading').hide(); 
    	}
    	
    	/**
    	 * Muestra ventana de confirmación
    	 *
    	 * @param  title: Título de la ventana 
    	 * @param  message: Mensaje a mostrar
    	 * @param  successHandle: Funcion a ajecutar en caso de confirmación     
    	 */
		this.confirm = function(title, message, successHandle) 
		{	
			var title = "<h3 class='messages-head-confirm page-head'>"+title+"</h3>"
			Boxy.confirm(message, function() { successHandle() }, {title: title});
    	};
		
    	this.alert = function(options) 
		{	
			var title = "<h3 class='messages-head-confirm page-head'>"+options.title+"</h3>"
			Boxy.alert(options.message, function() {   }, {title: options.title});
    	};
    	
    	this.redirect = function(url) 
		{	
			window.location = url;
    	};
		/**
    	 * Muestra ventana de alerta
    	 *
    	 * @param  params
 		 *		   - type: Tipo de alerta (error, alert) 	
    	 * 		   - title: Título de la ventana 
    	 * 		   - message: Mensaje a mostrar     
    	 */
    	this.showAlert = function(params) 
    	{	
    		var className = $("#flash").attr('class');
    		var title = '<div class="title">'+params.title+'</div>';
    		$("#flash").removeClass(className).addClass(params.type).html(title + params.message).fadeIn(800, function () {
            	setTimeout(function(){ 
                	$("#flash").fadeOut(800); 
                }, 3000);
              }); 
    	};
    	
    	/**
    	 * Muestra contenido pasado por parámetro en una ventana
    	 *
    	 * @param  params
    	 * 		   - title: Titulo de la ventana
    	 * 		   - modal: Si true ventana modal 
    	 */
    	this.showContent = function(params) 
    	{	
    		layout[params.winId] = new Boxy(params.html, {title: params.title, fixed: false, modal: params.modal, draggable: true, closeable: false});    		    		
    	};
    	    	
    	//Oculta ventana 
    	this.hideContent = function(winId) 
    	{
    		if (layout[winId])
    		{
    			layout[winId].hide();    			
    			layout[winId].remove();
    			$('.boxy-modal-blackout').remove();
    		}    	
    	};
    	
    	/**
    	 * Muestra contenido en elemento pasado por parametro
    	 *
    	 * @param  params
 		 *		   - target: Id del elemento donde se pondra el contenido 	
    	 * 		   - htmlTarget: Si existe el html se pondra aqui 
    	 * 		   - html: Contenido a incrustar
    	 * 		   - effect: Efecto al mostrar el contenido (show, fade)     
    	 * 		   - closeHandler: Si existe controla ocultar contenido
    	 */
    	this.showContentIn = function(params) 
    	{	
    		$self = this;
    		$target = params.target ? $('#'+params.target) : null;
    		$htmlTarget = params.htmlTarget ? $('#'+params.htmlTarget): null;
    		$closeHandler = params.closeHandler ? $('#'+params.closeHandler) : null;
    		if ($target)
    		{
    			$htmlTarget ? $htmlTarget.html(params.html) : $target.html(params.html);    
    			if (params.effect == 'show')
    				$target.show();
    			else
				if (params.effect == 'fade')
					$target.fadeIn(300);
    			params.effect = (params.effect) && (params.effect == 'show') ? 'hide' : params.effect;
    			$closeHandler ? $closeHandler.click(function(){$self.hideContentIn(params);}) : false;
    		}
    	};
    	
    	/**
    	 * Oculta contenido de un elemento pasado por parametro
    	 *
    	 * @param  params
 		 *		   - target: Id del elemento que tiene el contenido 	
    	 * 		   - htmlTarget: Si existe el html lo tiene el  		   
    	 * 		   - effect: Efecto al ocultar el contenido (hide, fade)     
    	 */
    	this.hideContentIn = function(params) 
    	{	
    		$target = params.target ? $('#'+params.target) : null;
    		$htmlTarget = params.htmlTarget ? $('#'+params.htmlTarget): null;
    		if ($target)
    		{
    			if (params.effect == 'hide')
    				$target.hide();
    			else
    				if (params.effect == 'fade')
    				{
    					$target.fadeOut(300, function(){
    						$htmlTarget ? $htmlTarget.html('') : $target.html('');
    					});
    				}    			
    		}
    	};
    	
    	this.makeTab = function(options)
    	{
    		var defaults = {
				tabId: 'tab',
				navClass: 'active',
				defaultActive: 0
			};
			options = jQuery.extend(defaults , options);
    		
			tabManager = $('#'+options.tabId);
    		//tabManager.find(".tabContent:not(:first)").hide();
    		tabManager.find(".tabContent:not(:eq("+options.defaultActive+"))").hide();
    		tabManager.find(".tabContent:eq("+options.defaultActive+")").show();
    		//tabManager.find(".tabContent:first").show();
    		tabManager.find("ul li:eq("+options.defaultActive+")").addClass(options.navClass);
    		
    		tabManager.find(".tabs ul li a").click(function(){
    			index = tabManager.find("ul li a").index($(this));    			
    			tabManager.find(".tabContent:not(:eq("+index+"))").hide();
    			tabManager.find(".tabContent:eq("+index+")").show();
    			tabManager.find("ul li").removeClass(options.navClass);
    			tabManager.find("ul li:eq("+index+")").addClass(options.navClass);
    			return false;
    		});
    	}
    }
    
    function Application()
    {      	    	
    	this.showNotification = function(value) 
    	{	
    		$('#notificacion_icon').find('span').html(value);
    		$('#notificacion_icon').removeClass('hidden');
    	};

    	this.hideNotification = function() 
    	{	
    		$('#notificacion_icon').addClass('hidden');
    	};
    	
    	this.selectionManager = function(params) 
    	{	    		 
    		interval = params.interval;
    		beg = interval[0];
    		end = interval[1];
    		
    		if (params.list.length > 0)
    			params.target.find('tbody #blank').remove();
    		
    		for(index in params.list)
			{
				objeto = params.list[index];
				id = objeto['id'];				
				if (params.target.find('tbody #row_'+id).html() == null)
				{
					row = objeto['values'];
					tr = '<tr id="row_'+id+'" rel="'+id+'">';
					for(k in row)
					{
						if (k >= beg && k <= end)
							tr += '<td>'+row[k]+'</td>';
					}
					tr += '<td><a>borrar</a></td>';
					tr += '</tr>';	
					
					opt = params.multipleselect.find('option').filter('[value='+id+']');
					opt.attr('selected', 'selected');
					params.target.find('tbody').append(tr);
				}
				this.deleteLinkManager(params);
			}
			
    	};
    	    	
    	this.deleteLinkManager = function(params)
    	{
    		interval = params.interval;
    		beg = interval[0];
    		end = interval[1];
    		links = params.target.find('tbody a');
    		//self = this;
			links.click(function(){		
				/*link = $(this);
				self.confirm('Borrar', 'Seguro que desea eliminarlo?', function(){			
					
				});*/
				index = params.target.find('tbody a').index($(this));
				tr = params.target.find('tbody tr:eq('+index+')');
				
				opt = params.multipleselect.find('option').filter('[value='+tr.attr('rel')+']');
				opt.removeAttr('selected');	
				
				tr.remove();
				if (params.target.find('tbody a').length == 0)
					params.target.find('tbody').append('<tr id="blank"><td colspan="'+(end-beg+2)+'"></td></tr>');
			});
    	};
    	
    	this.submitDeleteLink = function(url, success)
    	{
    		//alert('popo')
    		var f = document.createElement('form'); f.style.display = 'none';f.id= 'especialDelete'; this.parentNode.appendChild(f); f.method = 'post'; f.action = url;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', 'sf_method'); m.setAttribute('value', 'delete'); f.appendChild(m);
    		this.formManager({ formId: 'especialDelete', success: success})
    		
    	};
    	
    	this.updateRowManager = function(params) 
    	{	    	
    		target = $('#'+params.targetId);
    		target.find('tbody #blank').remove();    		
    		tr = $(params.row);
    		if (params.prepare)
    		{
    			tds = tr.find('td');     			
    			tds.each(function(i){
    				if (params.withSpan)
    					span = $(this).find('span');
    				else
    					span = $(this);
    				//span = $(this).find('span');
    				if (i < params.colCount-1)
    				{
	    				if (is_function(params.prepare))
	        				data = params.prepare(i, span.html());
	    				else
	    					data = eval(params.prepare+'('+i+',"'+span.html()+'")');    				
	    				 span.html(data);
    				}
    			});
    		}
    		index = params.rowIndex -1;
    		if (index > 0)
    		{
	    		beforeTr = target.find('tbody tr:eq('+(index - 1)+')');
	    		updateTr = target.find('tbody tr:eq('+(index)+')');
	    		updateTr.remove();
	    		beforeTr.after(tr);
    		}
    		else
    		{
    			beforeTr = target.find('tbody');
        		updateTr = target.find('tbody tr:eq('+(index)+')');
        		updateTr.remove();
        		beforeTr.prepend(tr);
    		}
    		links = target.find('tbody .tools-list a');
			links.click(function(){
				index = target.find('tbody .tools-list a').index($(this));
				tr = target.find('tbody tr:eq('+index+')');
				tr.remove();
				if (target.find('tbody .tools-list a').length == 0)
					target.find('tbody').append('<tr id="blank"><td colspan="'+params.colCount+'"></td></tr>');		
			});
			
			if (params.success)
			{
				if (is_function(params.success))
					params.success();
				else
				{
					eval(params.success+'()');
				}
			}
    	};
    	
    	this.appendRowManager = function(params) 
    	{	    	
    		target = $('#'+params.targetId);
    		target.find('tbody #blank').remove();    		
    		tr = $(params.row);
    		if (params.prepare)
    		{
    			tds = tr.find('td');     			
    			tds.each(function(i){
    				if (params.withSpan)
    					span = $(this).find('span');
    				else
    					span = $(this);    				
    				if (i < params.colCount-1)
    				{
	    				if (is_function(params.prepare))
	        				data = params.prepare(i, span.html());
	    				else
	    					data = eval(params.prepare+'('+i+',"'+span.html()+'")');
	    				 span.html(data);
    				}
    			});
    		}
    		
    		target.find('tbody').append(tr);
			if (params.linksManager)
			{
	    		links = target.find('tbody .tools-list a');
				links.click(function(){				
					index = target.find('tbody .tools-list a').index($(this));
					tr = target.find('tbody tr:eq('+index+')');
					tr.remove();					
					if (target.find('tbody .tools-list a').length == 0)
						target.find('tbody').append('<tr id="blank"><td colspan="'+params.colCount+'"></td></tr>');					
					if (params.onDelete)
					{
						if (is_function(params.onDelete))
							params.onDelete();
						else
						{
							eval(params.onDelete+'()');
						}
					}
				});
			}
			if (params.success)
			{
				if (is_function(params.success))
					params.success();
				else
				{
					eval(params.success+'()');
				}
			}
    	};
    	
    	this.appendDeleteLinkManager = function(params)
    	{
    		target = $('#'+params.targetId);    		
    		links = target.find('tbody .tools-list a');
			links.click(function(){
				index = target.find('tbody .tools-list a').index($(this));
				tr = target.find('tbody tr:eq('+index+')');
				tr.remove();
				if (target.find('tbody .tools-list a').length == 0)
					target.find('tbody').append('<tr id="blank"><td colspan="'+params.colCount+'"></td></tr>');
				if (params.onClick)
					params.onClick();
			});
    	};
    	
    	this.appendEditLinkManager = function(params)
    	{
    		interval = params.interval;
    		beg = interval[0];
    		end = interval[1];
    		target = $('#'+params.targetId);
    		links = target.find('tbody a.tool-link');
			links.click(function(){
				index = target.find('tbody a.tool-link').index($(this));
				tr = target.find('tbody tr:eq('+index+')');
				isNew = tr.attr('lang') == 'noNew' ? 'false' : 'true';
				object =  {isNew: isNew};
				for(i=0;i<(end-beg);i++)
				{
					span = tr.find('td:eq('+i+')').find('span');
					object[params.name+'['+span.attr('lang')+']'] = span.html(); 
				}
				if (params.onClick)
					params.onClick(index, object, $(this));
				return false;
			});
    	};
    	
    	this.appendEditLinkManagerAux = function(params)
    	{
    		interval = params.interval;
    		beg = interval[0];
    		end = interval[1];
    		target = $('#'+params.targetId);
    		links = target.find('tbody a.tool-link');
			links.click(function(){
				index = target.find('tbody a.tool-link').index($(this));
				tr = target.find('tbody tr:eq('+index+')');
				isNew = tr.attr('lang') == 'noNew' ? 'false' : 'true';
				object =  {isNew: isNew};
				for(i=0;i<(end-beg);i++)
				{
					span = tr.find('td:eq('+i+')').find('span');
					object[params.name+'['+span.attr('lang')+']'] = span.html(); 
				}
				if (params.onClick)
					params.onClick(index, object, $(this));
			});
    	};
    	this.menuManager = function(module)
    	{
    		if (module == 'inicio')
    		{
    			ul = $('#submenu').find('#elements_home');
	    		ul.removeClass('hidden');
	    		$('#menu_ul').find('#tabs_home').addClass('cm-active');
    		}
    		else
    		{
	    		submenu_link = $('#submenu').find('#submenu_'+module);
	    		submenu_link.parent().addClass('cm-active');
	    		ul = submenu_link.parent().parent(); 
	    		id = 'tabs_' + ul.attr('id').substr(9);	    		
	    		$('#menu_ul').find('#'+id).addClass('cm-active');
	    		$('#menu_ul').find('#'+id).click();
	    		ul.removeClass('hidden');
    		}    		
    	};
    	
    	//Resalta la fila de listas UL al dar clic
    	function highlightList() {
    		$('.boxy-wrapper').find('li').each(function(){
    			$(this).click(function(){
    				cleanHighlightList();
    				$(this).addClass('selected');
    			});
    		});
    	}

    	function cleanHighlightList()
    	{
    		$(document).find('.selected').each(function(){
    			$(this).removeClass('selected');
    		});
    	}

    	//Resalta la fila de tablas al dar clic
    	this.highlightTable = function(destino)
    	{
    		$('#'+destino).find('tr').each(function(){
    			$(this).click(function(){
    				cleanHighlightTable();
    				$(this).addClass('current');
    			});
    		});
    	};

    	function cleanHighlightTable()
    	{
    		$(document).find('.current').removeClass('current')
    	}
    }
    Application.prototype = new ToolKit();
    $.application = new Application();   
})(jQuery);

$.fn.extend({
  sfTableManager:function(options) 
  {
	var defaults = {
		tableClass: 'table',
		checkAllName: 'check_all',
		uncheckAllName: 'check_none',
		checkGroupName: 'check_list',
		tableToolsClass: 'table-tools',
		onRowDbClick: null,
		onHeaderClick: null,
		onPaginationClick: null,
		onChecked: null,
		orderBy: '',
		orderType: ''
	};
	options = jQuery.extend(defaults , options);
	
	var $tools = $(this).find('.' + options.tableToolsClass);
	var $checkBoxes = $(this).find("input[@name=" + options.checkGroupName + "][type='checkbox'][disabled=false]")
	var $table = $(this);
	if (options.onChecked)
	{
		var $validCheckBoxes = $(this).find("input[@name=" + options.checkGroupName + "][type='checkbox'][disabled=false][value!=0]")
		$validCheckBoxes.each(function(){
			$(this).click(function(){
				options.onChecked($(this).val(), $(this).is(':checked'), $(this).parent().parent());
			});
		});
	}
	
	$checkAll = $(this).find("thead input[@name=" + options.checkAllName + "][type='checkbox']");
	$checkAll.click(function(){
		var state = $(this).is(':checked');
		$checkBoxes.attr('checked', state);
		
		if (options.onChecked)
		{			
			var $validCheckBoxes = $table.find("input[@name=" + options.checkGroupName + "][type='checkbox'][disabled=false][value!=0]")
			$validCheckBoxes.each(function(){
				options.onChecked($(this).val(), $(this).is(':checked'), $(this).parent().parent());				
			});
		}
	});
	
	$tools.each(function(){
		
		$selectAll = $(this).find('a[id="'+options.checkAllName+'"]');    				
		$selectAll.click(function(){
			$checkBoxes.attr('checked', true);
			if (options.onChecked)
			{			
				var $validCheckBoxes = $table.find("input[@name=" + options.checkGroupName + "][type='checkbox'][disabled=false][value!=0]")
				$validCheckBoxes.each(function(){
					options.onChecked($(this).val(), $(this).is(':checked'), $(this).parent().parent());				
				});
			}
		});
		$deselectAll = $(this).find('a[id="'+options.uncheckAllName+'"]');
		$deselectAll.click(function(){
			$checkBoxes.attr('checked', false);
			if (options.onChecked)
			{							
				var $validCheckBoxes = $table.find("input[@name=" + options.checkGroupName + "][type='checkbox'][disabled=false][value!=0]")
				$validCheckBoxes.each(function(){					
					options.onChecked($(this).val(), $(this).is(':checked'), $(this).parent().parent());
				});
			}
		});
	});
	
	if (options.onRowDbClick && ($checkBoxes.html() != null))
	{
		var $rows = $(this).find("tbody tr");
		$rows.css({'cursor': 'pointer' });
		$rows.each(function(){
			$(this).dblclick(function(){
				var $check = $(this).find('td:first').find("input[@name=" + options.checkAllName + "][type='checkbox']");
				options.onRowDbClick($check.val());
			});
		});
	}
	
	if (options.onHeaderClick)
	{		
		var $head = $(this).find("thead tr");	
		$head.find('a').each(function(){
			if ($(this).attr('sortable'))
			{
				$(this).click(function(){
					$head.find('a').removeClass('sort-link-desc sort-link-asc');
					var field = $(this).attr('field');
					var order = $(this).attr('order');
					order = order == null ? 'asc' : order == 'asc' ? 'desc' : 'asc' ;					
					$(this).attr('order', order);
					order == 'asc' ? $(this).addClass('sort-link-desc'): $(this).addClass('sort-link-asc');
					options.onHeaderClick(field, order);
				});
			}
		});
	}
	
	if (options.onPaginationClick)
	{		
		var $pagination = $(this).find(".tr-pagination .float-right");	
		var $go = $(this).find(".tr-pagination .float-left #go");
		var $text_go = $(this).find(".tr-pagination .float-left #text_go");
		$go.click(function(){
			options.onPaginationClick(intval($text_go.val()));
		})
		$text_go.keydown(function(event){
			if (event.keyCode == 13) {
				options.onPaginationClick(intval($text_go.val()));
			}  
		})
		$pagination.find('a').each(function(){
			$(this).click(function(){	
				page = $(this).attr('rel');
				options.onPaginationClick(page);
			})
		});
	}
	
	if (options.onPerPageClick)
	{
		var $text_perpage = $('#'+options.perPageId);
		$text_perpage.keydown(function(event){
			if (event.keyCode == 13) {
				options.onPerPageClick(intval($text_perpage.val()));
			}  
		})
	}
	
	if (options.orderBy != '' && options.orderType != '')
	{
		var $head = $(this).find("thead tr");	
		//$link = $head.find("a:contains('"+ options.orderBy +"')");
		$link = $head.find("a[field='"+options.orderBy+"']");
		order = options.orderType;
		$link.attr('order', order);
		order == 'asc' ? $link.addClass('sort-link-desc'): $link.addClass('sort-link-asc');		
	}
	this.options = options;
    return this;
  },
  sfSelectedItems: function()
  {		 
	var options = this.options;  
	var $rows = $(this).find("tbody tr");
	var result = new Array();
	index = 0;
	$rows.each(function(){
		var $check = $(this).find('td:first').find("input[@name=" + options.checkAllName + "][type='checkbox']");
		id = $check.val();
		
		if ($check.is(':checked'))
		{
			var $tds = $(this).find('td');
			//n = $tds.length;
			
			var rowArray = new Array();
			j = 0;
			$tds.each(function(i){
				//if (i != 0 && i != n-1)
				if (i != 0)
				{
					rowArray[j++] = $(this).html();
				}				
			});
			result[index++] = { id: id, values: rowArray };
		}
	});
	return result;
  }
});
// Y lo anterior se puede usar como


function is_function(obj)
{
	return (typeof obj == 'function' || typeof obj == 'object');
};
//A PARTIR DE AQUI FUNCIONES ESPECIFICAS DEL SITIO
