//Utilidades para la pantalla
Effect.News = Class.create();
Effect.News.prototype = {
	initialize: function(element) {
		if ( element.tagName.toLowerCase() != 'div'){
			return;
		}
		this.animateTitle(element);
		this.animateParagraf(element);
		
		element.lastHeight=element.offsetHeight;
		element.lastWidth=element.offsetWidth;
		element.lastTop=element.offsetTop;
		element.lastLeft=element.offsetLeft;
		element.slideOffTop=this.slideOffTop.bind(element);
		element.hide=this.hide.bind(element);
	},
	
	animateTitle: function(element){
		var titles = element.getElementsByTagName('h2');
		for(z=0;z<titles.length;z++){
			titles[z].parent=element;
			titles[z].ondblclick=function(){
				this.parent.slideOffTop();
				return false;
			};				
		}
	},
	
	animateParagraf: function(element){
		var paragrafs=element.getElementsByTagName('p');
		for(y=0;y<paragrafs.length;y++){
			paragrafs[y].minValue=0.7;
			paragrafs[y].onmouseover=this.lightOnText.bindAsEventListener(paragrafs[y]);
			paragrafs[y].onmouseout=this.lightOffText.bindAsEventListener(paragrafs[y]);
			paragrafs[y].onmouseout();
			paragrafs[y].parent=element;
		}
	},
	
	lightOnText: function (){
		//new Effect.FadeTo(this, 1, 10, 5);
	},
	
	lightOffText: function(){
		//new Effect.FadeTo(this, this.minValue, 10, 10);
	},
	
	slideOffTop: function(){
		var ctrl = this;
		debug('ocultando '+this.id);
		this.style.overflow='hidden';
		new Effect.SizeAndPosition(this,null, 1, null, 1, 100, 10, {complete:function(){} } );
		new Effect.FadeTo(this, 0.1, 10, 10, 
			{complete: function(){ 
				ctrl.hide();
				debug('finalizado');
				}
			});			
	},	

	hide: function(){
		var ctrl = this;
		new Effect.FadeTo(ctrl, 0.1, 10, 5, 
			{complete: function(){ 
				ctrl.style.visibility='hidden';
				ctrl.style.display='none'
			}}
		);
	}		
};

var Content={
	description: "Contiene funciones del control del contenido"
}

/**
 * Hace que todos los links contenidos en el objeto
 * se muestren como popups
 */
Content.Popup=Class.create();

Content.Popup.prototype={
	initialize: function(element) {
		this.popupLinks(element);
	},
	
	popupLinks: function(element){
		var links = element.getElementsByTagName('a');
		for(var x=0;x<links.length;x++){
			links[x].target='_blank';
			links[x].onmouseover=this.onmouseover.bindAsEventListener(links[x]);
			links[x].onmouseout=this.onmouseout.bindAsEventListener(links[x]);
		}
	},
		
	onmouseover: function(event)
	{
		debug(this.href,0);
		window.status=this.href;
		this.style.cursor='hand';
	},
	
	onmouseout: function(event)
	{
		debug('');
		window.status='';
	}
};

Content.Page = Class.create();

Content.Page.prototype = {
	initialize: function(element,destinity) {
		//Transforma todos los links dentro del elemento
		//en contenido asincrónico en el destino
		var links = element.getElementsByTagName('a');
		for(i=0;i<links.length;i++){
			links[i].requestId='link'+i;
            ajaxEngine.registerRequest( links[i].requestId, links[i].href );
			links[i].href='#';
			links[i].onclick=function(){
				 debug('consultando...'+this.requestId);
				 ajaxEngine.sendRequest( this.requestId );
			};
		}
		ajaxEngine.registerAjaxElement( destinity.id );
	}
};

Content.AnimatedContent = Class.create();
Content.AnimatedContent.prototype = {
	initialize: function(element,options) {
		//var contents = element.getElementsByTagName('div');
		element.terminated = new Array();
		new Logger.Loading(element);
		element.loading.start();
		element.contents = document.getElementsByTagAndClassName('div','animated');
		element.complete=this.complete.bind(element);
		for(var i=0;i<element.contents.length;i++){
			new WindowAnimated(element.contents[i],element);
		}
	},
	
	complete: function(child){
		this.terminated.push(child);
		//var contents = document.getElementsByTagAndClassName('div','animated');
		if(this.contents.length==this.terminated.length)
		{
			this.loading.stop();
		}
	}	
}

/**
 * Anima el objeto en modo slide de una ventana
 */	
WindowAnimated = Class.create();
WindowAnimated.prototype ={
	initialize: function(element,parent){
		element.id='animated'+parent.childNodes.length;
		element.lastHeight=element.offsetHeight;
		element.style.width='0px';
		element.style.height='0px';
		element.hide=this.hide.bind(element);
		element.open=this.open.bind(element);
		element.close=this.close.bind(element);
		element.changeState=this.changeState.bind(element);
		element.onclick=this.changeState.bindAsEventListener(element);
		element.isOpened=this.isOpened.bind(element);
		element.parent=parent;
		element.open();
	},
	
	onclick: function(event){
		if(!isOpened){
			this.open();
			this.changeState();
			return;
		}
		this.close();
		this.changeState();
	},
	
	isOpened: function(){
		if( this.state=='opened'){
			return true;
		}
		return false;
	},
	
	changeState: function(){
		if( this.state == 'closed'){
			this.state=='opened';
		}else{
			this.state=='closed';
		}
		this.parent.complete(this);	
	},
	
	hide: function(){
		new Effect.FadeTo(this, .1, 1, 1, {complete: function(){}});
		this.style.visibility="hidden";
		this.state='closed';
	},
	
	open: function(){
		this.style.visibility='visible';
		var object = this;
		new Effect.Size(object,500, 10, 50, 10, 
			{complete:function(){
				new Effect.Size(object,null, object.lastHeight+20, 50, 10, 
				{complete:function(){
					new Effect.FadeTo(object, 1, 10, 10, 
						{complete: function(){object.changeState();}});} 
				});
			}}
		);
	},
	
	close: function(){
		var object = this;
		new Effect.FadeTo(element, .1, 1, 1, 
						{complete: function(){object.changeState();}});	
	}
};

/* DRAG&DROP*/
var CustomDropzone = Class.create();

CustomDropzone.prototype = (new Rico.Dropzone()).extend( {

   initialize: function( htmlElement, header ) {
      this.htmlElement  = $(htmlElement);
      this.header       = $(header);
      this.absoluteRect = null;
      this.acceptedObjects = [];

      this.offset = navigator.userAgent.toLowerCase().indexOf("msie") >= 0 ? 0 : 1;
   },

   activate: function() {
	 //this.htmlElement.style.backgroundColor='gray';
   },

   deactivate: function() {
   	 //this.htmlElement.style.backgroundColor='transparent';
   },

   showHover: function() {
      if ( this.showingHover )
         return;
      this.htmlElement.style.border='1px gray solid';
      //new Effect.FadeTo( this.htmlElement, .1, 250, 4 );
      this.showingHover = true;
   },

   hideHover: function() {
      if ( !this.showingHover )
         return;
      this.htmlElement.style.border='1px gray none';   
      //new Effect.FadeTo( this.htmlElement, .5, 250, 4 );
      this.showingHover = false;
   },

   canAccept: function(draggableObjects) {
      for ( var i = 0 ; i < draggableObjects.length ; i++ ) {
         if ( draggableObjects[i].type != "Custom" )
            return false;
      }
      return true;
   }
} );

var Webpad = Class.create();

Webpad.prototype = (new Rico.Draggable()).extend( {

	initialize: function(htmlElement) {
		this.type        = 'Custom';
	    this.htmlElement =$(htmlElement);
	            
		this.htmlElement.originalHeight = this.htmlElement.offsetHeight;
		this.htmlElement.originalWidth = this.htmlElement.offsetWidth;
   		//this.htmlElement.maximized = true;
   		
   		//this.htmlElement.content=this.htmlElement.childNodes[1];
   		
   		//this.registerContent();
   		//this.registerBar();
	},
	
	registerContent: function(){
		this.htmlElement.minimize=function(){
			if( this.maximized ){
				this.originalHeight = parseInt(this.content.offsetHeight);
				//this.content.style.height=1;
				this.content.style.overflow='hidden';
				new Effect.Size( this.content, null, 1, 300, 10, {complete:function() {}} );
				this.maximized=false;
			}
		}
		
		this.htmlElement.maximize=function(){
			if( !this.maximized ){
				this.content.overflow='auto';
				//this.content.style.height=this.originalHeight;
				new Effect.Size( this.content, null, this.originalHeight, 300, 10, {complete:function() {}} );
				this.maximized=true;
			}
		}
		
		this.htmlElement.close=function(){
			this.minimize();
			//this.style.visibility='hidden';
			//this.style.overflow='auto';
			//new Effect.Size( this, null, this.originalHeight, 500, 10, {complete:function() {}} );
			//this.maximized=true;
		}
		
		this.htmlElement.resize=function(){
			if( this.maximized ){
				this.minimize();
			}else{
				this.maximize();
			}
		}
	},
	
	registerBar: function(){     
		this.htmlElement.bar=this.htmlElement.childNodes[0];
		this.htmlElement.bar.ondblclick=function(){
			this.parentNode.resize();
		}
	},
	
	startDrag: function() {
    },

    cancelDrag: function() {
    },

    endDrag: function() {
	},
	
	select: function() {
      this.selected = true;
      var el = this.htmlElement;
   },

   deselect: function() {
      this.selected = false;
      var el = this.htmlElement;
      el.style.backgroundColor = "transparent";
   },
   
   getSingleObjectDragGUI: function() {
      var el = this.htmlElement;

      var div = el.cloneNode(5);
      div.style.width=el.offsetWidth;
      new Effect.FadeTo( div, .5, 0, 4 );
      return div;
   }   
});

/**
 *
 */
var Logger = { description: 'Herramientas para mostrar informacion'};

Logger.Status=Class.create();
Logger.Status.prototype={
	initialize: function(object){
		object.loading=this.loading.bind(object);
		object.error=this.error.bind(object);
		object.finished=this.finished.bind(object);
	},
	
	loading: function(){
		this.innerHTML='Cargando...';
	},
	
	error: function(){
		this.innerHTML='Error!';
	},
	
	finished: function(){
		this.innerHTML='Finalizado';
	}
};

/* funciones de log de los mensajes en el div de mensajes*/
function debug(message,delay){
	if( typeof delay == 'undefined'){
		log(message,8000,false);
		return;
	}
	log(message,delay,false);
}

function error(message,delay){
	if(typeof delay == 'undefined'){
		log(message,8000,true);
		return;
	}
	log(message,delay,true);
}

function log(message,delay,err){
	if(err){
		$('status').className='err';
	}else{
		$('status').className='log';
	}
	$('status').innerHTML=message;
	new Effect.FadeTo($('status'), 1, 5, 5,{complete: function(){
		if (delay>0){
			setTimeout('new Effect.FadeTo($(\'status\'), 0.1, 10, 100)',delay);
		}
		}}
	);		
}

Logger.Loading=Class.create();

Logger.Loading.prototype={
	initialize: function(parent){
		var object=document.createElement('div');
		parent.insertBefore(object,parent.firstChild);
		object.id='throbber';
		object.start=this.start.bind(object);
		object.stop=this.stop.bind(object);
		object.onclick=this.onclick.bind(object);
		object.style.top=parent.firstChild.offsetTop-10;
		object.style.left=parent.firstChild.offsetLeft-10;
		parent.loading=object;
	},
	
	start: function(){
		this.className='loading';
		this.innerHTML='Cargando...';
		this.style.visibility='visible';
	},
	
	stop: function(){
		this.className='';
		this.innerHTML='';
		this.style.visibility='hidden';
	},
	
	onclick: function(){
		if( this.loading )
		{
			this.stop();
			this.loading=false;	
		}
		else
		{
			this.start();
			this.loading=true;
		}
	}
};