// script.aculo.us controls.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008

// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2007 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
//           (c) 2005-2007 Jon Tirsen (http://www.tirsen.com)
// Contributors:
//  Richard Livsey
//  Rahul Bhargava
//  Rob Wills
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// Autocompleter.Base handles all the autocompletion functionality 
// that's independent of the data source for autocompletion. This
// includes drawing the autocompletion menu, observing keyboard
// and mouse events, and similar.
//
// Specific autocompleters need to provide, at the very least, 
// a getUpdatedChoices function that will be invoked every time
// the text inside the monitored textbox changes. This method 
// should get the text for which to provide autocompletion by
// invoking this.getToken(), NOT by directly accessing
// this.element.value. This is to allow incremental tokenized
// autocompletion. Specific auto-completion logic (AJAX, etc)
// belongs in getUpdatedChoices.
//
// Tokenized incremental autocompletion is enabled automatically
// when an autocompleter is instantiated with the 'tokens' option
// in the options parameter, e.g.:
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
// will incrementally autocomplete with a comma as the token.
// Additionally, ',' in the above example can be replaced with
// a token array, e.g. { tokens: [',', '\n'] } which
// enables autocompletion on multiple tokens. This is most 
// useful when one of the tokens is \n (a newline), as it 
// allows smart autocompletion after linebreaks.

if(typeof Effect == 'undefined')
  throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = { };
Autocompleter.Base = Class.create({
  baseInitialize: function(element, update, options) {
    element          = $(element);
    this.element     = element; 
    this.update      = $(update);  
    this.hasFocus    = false; 
    this.changed     = false; 
    this.active      = false; 
    this.index       = 0;     
    this.entryCount  = 0;
    this.oldElementValue = this.element.value;

    if(this.setOptions)
      this.setOptions(options);
    else
      this.options = options || { };

    this.options.paramName    = this.options.paramName || this.element.name;
    this.options.tokens       = this.options.tokens || [];
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.minChars     = this.options.minChars || 1;
    this.options.onShow       = this.options.onShow || 
      function(element, update){ 
        if(!update.style.position || update.style.position=='absolute') {
          update.style.position = 'absolute';
          Position.clone(element, update, {
            setHeight: false, 
            offsetTop: element.offsetHeight
          });
        }
        Effect.Appear(update,{duration:0.15});
      };
    this.options.onHide = this.options.onHide || 
      function(element, update){ new Effect.Fade(update,{duration:0.15}) };

    if(typeof(this.options.tokens) == 'string') 
      this.options.tokens = new Array(this.options.tokens);
    // Force carriage returns as token delimiters anyway
    if (!this.options.tokens.include('\n'))
      this.options.tokens.push('\n');

    this.observer = null;
    
    this.element.setAttribute('autocomplete','off');

    Element.hide(this.update);

    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
  },

  show: function() {
    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix && 
      (Prototype.Browser.IE) &&
      (Element.getStyle(this.update, 'position')=='absolute')) {
      new Insertion.After(this.update, 
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $(this.update.id+'_iefix');
    }
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
  },
  
  fixIEOverlapping: function() {
    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
    this.iefix.style.zIndex = 1;
    this.update.style.zIndex = 2;
    Element.show(this.iefix);
  },

  hide: function() {
    this.stopIndicator();
    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },

  startIndicator: function() {
    if(this.options.indicator) Element.show(this.options.indicator);
  },

  stopIndicator: function() {
    if(this.options.indicator) Element.hide(this.options.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         Event.stop(event);
         return;
      }
     else 
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer = 
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },

  activate: function() {
    this.changed = false;
    this.hasFocus = true;
    this.getUpdatedChoices();
  },

  onHover: function(event) {
    var element = Event.findElement(event, 'DIV');
    if(this.index != element.autocompleteIndex) 
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },
  
  onClick: function(event) {
    var element = Event.findElement(event, 'DIV');
    this.index = element.autocompleteIndex;
    this.selectEntry();
    this.hide();
  },
  
  onBlur: function(event) {
    // needed to make click events working
    setTimeout(this.hide.bind(this), 250);
    this.hasFocus = false;
    this.active = false;     
  }, 
  
  render: function() {
    if(this.entryCount > 0) {
      for (var i = 0; i < this.entryCount; i++)
        this.index==i ? 
          Element.addClassName(this.getEntry(i),"selected") : 
          Element.removeClassName(this.getEntry(i),"selected");
      if(this.hasFocus) { 
        this.show();
        this.active = true;
      }
    } else {
      this.active = false;
      this.hide();
    }
  },
  
  markPrevious: function() {
    if(this.index > 0) this.index--;
      else this.index = this.entryCount-1;
    this.getEntry(this.index).scrollIntoView(true);
  },
  
  markNext: function() {
    if(this.index < this.entryCount-1) this.index++;
      else this.index = 0;
    this.getEntry(this.index).scrollIntoView(false);
  },
  
  getEntry: function(index) {
    return this.update.firstChild.childNodes[index];
  },
  
  getCurrentEntry: function() {
    return this.getEntry(this.index);
  },
  
  selectEntry: function() {
    this.active = false;
    this.updateElement(this.getCurrentEntry());
  },

  updateElement: function(selectedElement) {
    if (this.options.updateElement) {
      this.options.updateElement(selectedElement);
      return;
    }
    var value = '';
    if (this.options.select) {
      var nodes = $(selectedElement).select('.' + this.options.select) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
    
    var bounds = this.getTokenBounds();
    if (bounds[0] != -1) {
      var newValue = this.element.value.substr(0, bounds[0]);
      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value + this.element.value.substr(bounds[1]);
    } else {
      this.element.value = value;
    }
    this.oldElementValue = this.element.value;
    this.element.focus();
    
    if (this.options.afterUpdateElement)
      this.options.afterUpdateElement(this.element, selectedElement);
  },

  updateChoices: function(choices, choicesSMD, entryCountSMD) {
    if(!this.changed && this.hasFocus) {

	  this.update.innerHTML = choices;
	  
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.down());

      if(this.update.firstChild && this.update.down().childNodes) {
        this.entryCount = this.update.down().childNodes.length;
        for (var i = 0; i < this.entryCount; i++) {
          var entry = this.getEntry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else { 
        this.entryCount = 0;
      }
	  
	  if( choicesSMD != null ) {
		this.update.innerHTML = choices + choicesSMD;
	  } else {
		this.update.innerHTML = choices;
	  }
	  
	  if( entryCountSMD ) {
		this.entryCount += entryCountSMD;
	  }

      this.stopIndicator();
      this.index = 0;
      
      if(this.entryCount==1 && this.options.autoSelect) {
        this.selectEntry();
        this.hide();
      } else {
        this.render();
      }
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;   
    this.tokenBounds = null;
    if(this.getToken().length>=this.options.minChars) {
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
    this.oldElementValue = this.element.value;
  },

  getToken: function() {
    var bounds = this.getTokenBounds();
    return this.element.value.substring(bounds[0], bounds[1]).strip();
  },

  getTokenBounds: function() {
    if (null != this.tokenBounds) return this.tokenBounds;
    var value = this.element.value;
    if (value.strip().empty()) return [-1, 0];
    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
    var offset = (diff == this.oldElementValue.length ? 1 : 0);
    var prevTokenPos = -1, nextTokenPos = value.length;
    var tp;
    for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
      if (tp > prevTokenPos) prevTokenPos = tp;
      tp = value.indexOf(this.options.tokens[index], diff + offset);
      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
    }
    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
  }
});

Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
  var boundary = Math.min(newS.length, oldS.length);
  for (var index = 0; index < boundary; ++index)
    if (newS[index] != oldS[index])
      return index;
  return boundary;
};

Ajax.Autocompleter = Class.create(Autocompleter.Base, {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },

  getUpdatedChoices: function() {
    this.startIndicator();
    
    var entry = encodeURIComponent(this.options.paramName) + '=' + 
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams) 
      this.options.parameters += '&' + this.options.defaultParams;
    
    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
  	if (!(request.responseText.indexOf("<h1 class=\"error\">")>0)){
  		this.updateChoices(request.responseText);
  	}else{
  		this.hide();
  	}
  	
  }
});

function delAccent(entry){
	//Para buscar por letra aunque ponga acentos	
	entry = entry.toLowerCase();
	entry = entry.replace(/[á|à|â|ä]/g,"a");
	entry = entry.replace(/[é|è|ê|ë]/g,"e");
	entry = entry.replace(/[í|ì|î|ï]/g,"i");
	entry = entry.replace(/[ó|ò|ô|ö]/g,"o");
	entry = entry.replace(/[ú|ù|û|ü]/g,"u");	
	return entry;		
}

Autocompleter.Local = Class.create(Autocompleter.Base, {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry_ori = instance.getToken();
        var entry     = delAccent(entry_ori);
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&  
          ret.length < instance.options.choices ; i++) { 

          var elem_ori = instance.options.array[i];
          var elem = delAccent(elem_ori);
          
          var foundPos = instance.options.ignoreCase ? 
            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) { 
            
              var texto_busqueda = elem_ori.substr(0,foundPos)+
					               "<strong>"+
								   elem_ori.substr(foundPos, entry_ori.length)+
								   "</strong>"+
								   elem_ori.substr(foundPos+entry_ori.length,elem_ori.length);
              
              ret.push("<li><a href=\"javascript:realizarBusqueda('"+elem_ori+"');\"><span>" + texto_busqueda + "</span></a></li>");
              break;
            } else if (entry.length >= instance.options.partialChars && 
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {

                var texto_busqueda = elem_ori.substr(0,foundPos)+
								     "<strong>"+
								     elem_ori.substr(foundPos, entry_ori.length)+
								     "</strong>"+
								     elem_ori.substr(foundPos+entry_ori.length,elem_ori.length);

                partial.push("<li><a href=\"javascript:realizarBusqueda('"+elem_ori+"');\"><span>" + texto_busqueda + "</span></a></li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ? 
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
        
        if( ret.length > 0 ){
			var join = '';
			for( i = 0 ; i < ret.length ; i++ ) {
				join += ret[i];
			}

        	return "<ul><hr />" + join + "</ul>";
        }else{ 
        	return "<ul></ul>";
        }
        
      }
    }, options || { });
  }
});

Autocompleter.LocalSMD = Class.create(Autocompleter.Base, {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
    
    this.options.minCharsSMD = this.options.minCharsSMD || 3;
  },

  getUpdatedChoices: function() {
    this.getLinksFromSMDAndUpdateChoices(this, this.getToken(), this.update);
  },
  
  getLinksFromSMDAndUpdateChoices: function(instance, entry, container) {
  
	if (container && entry.length>=this.options.minCharsSMD) {
       
       	//lanzamos la query y a�adimos a la respuesta los items devueltos por smd
		var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
	    Object.extend(options, {
	      onComplete: Prototype.emptyFunction,
	      onSuccess: function(transport) {
	        var response = transport.responseText.evalJSON(true);
	        var acLinkHTML = '<ul>';
	        var index = 0;
	        for( index = 0 ; index < response.length ; index++ ) {
	        	acLinkHTML += '<li class="">';
	        	if( response[index].image ) {
	        		acLinkHTML = '<img src="' + response[index].image + '"/>';
	        	}
	        	acLinkHTML += '<a href="' + response[index].url + '" style="text-decoration:underline;color:blue">';
	        	acLinkHTML += '<span>' + response[index].title + '</span><br/>';
	        	acLinkHTML += '</a>';
	        	if( response[index].subtitle ) {
	        		acLinkHTML += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i><font color="#0000AA" size="2">' + response[index].subtitle + '</font></i>';
	        	}
	        	acLinkHTML += '</li>';
	        }
	        
	        acLinkHTML += '</ul>';

            this.updateChoices(this.options.selector(this), acLinkHTML, index);
		  }.bind(this),
	      onFailure: this.onFailure
	    });

    	new Ajax.Request(SMD_SERVICES_URL + 'quicklink/autocomplete?q=' + entry + '&o=JSON', options);
	}
  },
  
  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry_ori = instance.getToken();
        var entry     = delAccent(entry_ori);
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&  
          ret.length < instance.options.choices ; i++) { 

          var elem_ori = instance.options.array[i];
          var elem = delAccent(elem_ori);
          
          var foundPos = instance.options.ignoreCase ? 
            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) { 
            
              var texto_busqueda = elem_ori.substr(0,foundPos)+
					               "<strong>"+
								   elem_ori.substr(foundPos, entry_ori.length)+
								   "</strong>"+
								   elem_ori.substr(foundPos+entry_ori.length,elem_ori.length);
              
              ret.push("<li><a href=\"javascript:realizarBusqueda('"+elem_ori+"');\"><span>" + texto_busqueda + "</span></a></li>");
              break;
            } else if (entry.length >= instance.options.partialChars && 
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {

                var texto_busqueda = elem_ori.substr(0,foundPos)+
								     "<strong>"+
								     elem_ori.substr(foundPos, entry_ori.length)+
								     "</strong>"+
								     elem_ori.substr(foundPos+entry_ori.length,elem_ori.length);

                partial.push("<li><a href=\"javascript:realizarBusqueda('"+elem_ori+"');\"><span>" + texto_busqueda + "</span></a></li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ? 
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
        
        if( ret.length > 0 ){
			var join = '';
			for( i = 0 ; i < ret.length ; i++ ) {
				join += ret[i];
			}

        	return "<ul><hr />" + join + "</ul>";
        }else{ 
        	return "<ul></ul>";
        }
        
      }
    }, options || { });
  }
});

function setHTMLDestacados( element, entry, portal, renderFuncionName, ajaxOptions ) {

	var options = Object.extend({ method: 'get' }, ajaxOptions );
	
    Object.extend(options, {
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        var response = transport.responseText.evalJSON(true);

        var destacadosHTML = eval( renderFuncionName + '( response )' );
      	element.innerHTML = destacadosHTML; 
        	
	  }.bind(this),
      onFailure: this.onFailure
    });

	new Ajax.Request(SMD_SERVICES_URL + 'quicklink/search?q=' + entry + '&p=' + portal + '&o=JSON', options);
}

function renderHTMLDestacado( response ) {
	if( response.length > 0 ) {
       var destacadosHTML = '<table style="border-width:1px;border-style:solid;border-color:#0000BB" width="100%"><tr>';
       var index = 0;
       for( index = 0 ; index < response.length ; index++ ) {
       	destacadosHTML += '<td class="">';
       	if( response[index].image ) {
       		destacadosHTML = '<img src="' + response[index].image + '"/>';
       	}
       	destacadosHTML += '<a href="' + response[index].url + '" style="text-decoration:underline;color:blue">';
       	destacadosHTML += '<span>' + response[index].title + '</span><br/>';
       	destacadosHTML += '</a>';
       	if( response[index].subtitle ) {
       		destacadosHTML += '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i><font color="#0000AA" size="2">' + response[index].subtitle + '</font></i>';
       	}
       	destacadosHTML += '</td>';
       }
         
       destacadosHTML += '</tr></table>';
       
       return destacadosHTML;
    } else {
    	return '';
    }
}

function renderHTMLDestacadoLeyes( response ) {
	if( response.length > 0 ) {
       var destacadosHTML = '<div class="entrada" id="entrada001">';
       var index = 0;
       for( index = 0 ; index < response.length ; index++ ) {
       	destacadosHTML += '<h2 class="blq a411 izq"><a href="' + response[index].url + '" title="' + response[index].title + '">';
       	destacadosHTML += response[index].title;
       	destacadosHTML += '</a></h2>';

       	if( response[index].subtitle ) {
       		destacadosHTML += '<div class="entradilla">';
			destacadosHTML += '<h3>Descripci&oacute;n:&nbsp;</h3>';
       		destacadosHTML += response[index].subtitle;
       		destacadosHTML += '</div>';
       	}
       }
       destacadosHTML += '<a id="hidlinkDTC" title="" class="mas"> <span class="no">Destacado</span></a>';
	   destacadosHTML += '</div>';
       
       return destacadosHTML;
    } else {
    	return '';
    }
}

function setHTML( element, url, successCallback ) {
	new Ajax.Request( url, { 
	  method:  'get', 
	  //parameters:  { 'param1': 'value1'}, 
	  onSuccess:  function(response){ 
	    element.innerHTML = response.responseText;  
	  //ejecutar javascript, al asignar el html no se ejecuta
		var scps = element.getElementsByTagName('script');    
		for(var i=0;i<scps.length;i++) {
			eval(scps[i].text);   
		}
		if( successCallback ) {
			successCallback();
		}
	  }, 
	  onFailure:  function(){
		element.innerHTML = '';
	  } 
	});
}
