﻿/*
	Clase Browser. Una vez reconocido el navegador se instancia una
	browser del navegador correspondiente. Ahora desde los controles
	debe llamarse a browser.Funcion() y cada browser sabra resolver
	su problema.
*/
var Browser = {

	browser : null,
	GetCurrent : function()
	{
		if( this.browser == null )
		{
			if( window.navigator.appName.toLowerCase().indexOf("microsoft") > -1 )
				this.browser = new BrowserIE();
			else if( window.navigator.appName.toLowerCase().indexOf("netscape") > -1 )
				this.browser = new BrowserNetScape();
			else
			{
				this.browser = new BrowserNetScape();
				alert( "Es posible que esta aplicación no funcione correctamente en su navegador." );
			}
		}
		
		return this.browser;
	}
}

var BrowserIE = function()
{
	this.Name           = "IE";
}

BrowserIE.prototype = new function()
{
	this.Name           = null;
	this.attachedEvents = null;
	this.traceContainer = null;
	
	// Esta es una clase interna que maneja el evento de HTML
	function ElementEventHandler( element, eventName, delegate )
	{
		this.element   = element;
		this.eventName = eventName;
		this.delegate  = delegate;
		
		this.Invoke = Invoke; function Invoke()
		{
			var args = {Type:event.type,Target:event.srcElement,CancelEvent:false,KeyCode:event.keyCode,
			MousePoint:{X:event.clientX,Y:event.clientY}};
			
			this.delegate.Invoke( args );
			
			return !args.CancelEvent;
		}
	}
	
	this.AttachEvent = function( element, eventName, delegate )
	{
		var handler = this.attachEvent( element, eventName, delegate );
	
		if( this.attachedEvents == null )
			this.attachedEvents = new Dictionary( function(a,b){return a.delegate == b.delegate && a.eventName == b.eventName && a.element == b.element;} );
			
		this.attachedEvents.Add( this.createEventKey( element, eventName, delegate ), handler );
	}
	
	this.attachEvent = function( element, eventName, delegate, eventFunction )
	{
		var e       = new ElementEventHandler( element, eventName, delegate );
		var handler = new pox.Delegate( e, e.Invoke ).CreateFunction();
		element.attachEvent( "on"+ eventName, handler );
		
		return handler;
	}
	
	this.createEventKey = function( element, eventName, delegate )
	{
		return {element:element,eventName:eventName,delegate:delegate};
	}
	
	this.DetachEvent = function( element, eventName, delegate )
	{
		var key = this.createEventKey( element, eventName, delegate );
		this.detachEvent( element, eventName, this.attachedEvents.GetByKey( key ) );
		this.attachedEvents.Remove( key );
	}
	
	this.detachEvent = function( element, eventName, handler )
	{
		element.detachEvent( "on"+ eventName, handler );
	}
	
	this.GetElementById = function( elementId, throwException )
	{
		var element = document.getElementById( elementId );
		
		if( !element )
			alert( "No se encontro el elemento \""+ elementId +"\"." );
		
		return element;
	}
	
	this.InsertElement = function( parent, child ){ parent.appendChild( child ); }
	this.Show          = function( element ){ element.style.visibility = "visible"; }
	this.Hide          = function( element ){ element.style.visibility = "hidden"; }
	
	this.ShowFloating = function( element, top, left )
	{
		if( element.parentNode != document.body )
			this.InsertElement( document.body, element );
		
		element.style.position = "absolute";
		this.SetPosition( element, top, left );
		this.Show( element );
	}
	
	this.SetPadding = function( element, top, left, right, bottom )
	{
		element.style.paddingTop   = top;
		element.style.paddingLeft   = left;
		element.style.paddingRight  = right;
		element.style.paddingBottom = bottom;
	}
	
	this.SetSize      = function( element, width, height ){ this.SetWidth( element, width ); this.SetHeight( element, height ); }
	this.SetWidth     = function( element, width ){ element.style.width = width; }
	this.SetInnerSize = function( element, width, height ){ this.SetInnerWidth( element, width ); this.SetInnerHeight( element, height ); }
	
	this.SetInnerWidth = SetInnerWidth; function SetInnerWidth( element, width )
	{
		var borderLeft   = this.convertBorder( element.currentStyle.borderLeftWidth );
		var borderRight  = this.convertBorder( element.currentStyle.borderRightWidth );
		var paddingLeft  = (element.currentStyle.paddingLeft != "")?parseInt(element.currentStyle.paddingLeft):0;
		var paddingRight = (element.currentStyle.paddingRight != "")?parseInt(element.currentStyle.paddingRight):0;
		
		element.style.width = width + paddingLeft + paddingRight + borderLeft + borderRight;
	}
	
	this.convertBorder = function( value )
	{
		var unit;
		
		if( value == "medium" )
			unit = 1;
		else if( value == "" )
			unit = 0;
		else
			unit = parseInt( value );
			
		return unit;
	}
	
	this.SetInnerHeight = function( element, height )
	{
		var borderTop     = this.convertBorder( element.currentStyle.borderTopWidth );
		var borderBottom  = this.convertBorder( element.currentStyle.borderBottomWidth );
		var paddingTop    = (element.currentStyle.paddingTop != "")?parseInt(element.currentStyle.paddingTop):0;
		var paddingBottom = (element.currentStyle.paddingBottom != "")?parseInt(element.currentStyle.paddingBottom):0;
		
		element.style.height = height + paddingTop + paddingBottom + borderTop + borderBottom;
	}
	
	this.SetHeight = function( element, height )
	{
		var paddingTop    = (element.style.paddingTop != "")?parseInt(element.style.paddingTop):0;;
		var paddingBottom = (element.style.paddingBottom != "")?parseInt(element.style.paddingBottom):0;
		
		element.style.height = height - paddingTop - paddingBottom;
	}
	
	this.SetChildPosition = function( element, top, left )
	{
		var parent      = element.parentNode;
		var paddingTop  = (parent.currentStyle.paddingTop != "")?parseInt(parent.currentStyle.paddingTop):0;
		var paddingLeft = (parent.currentStyle.paddingLeft != "")?parseInt(parent.currentStyle.paddingLeft):0;
		
		element.style.top  = top + paddingTop;
		element.style.left = left + paddingLeft;
	}
	
	this.SetPaddingRight = function( element, value ){ element.style.paddingRight = value; }
	this.GetPaddingRight = function( element ){ return parseInt( element.currentStyle.paddingRight ); }
	
	this.SetPosition = function( element, top, left ){ this.SetTop( element, top ); this.SetLeft( element, left ); }
	this.SetTop      = function( element, top ){ element.style.top = top; }
	this.SetLeft     = function( element, left ){ element.style.left = left; }
	
	this.GetClientWidth  = function( element ){ return element.offsetWidth; }
	this.GetClientHeight = function( element ){ return element.offsetHeight; }
	this.GetClientSize   = function( element ){ return {"Width":element.offsetWidth,"Height":element.offsetHeight}; }
	
	this.GetClientPosition = GetClientPosition; function GetClientPosition( element )
	{
		var point = {"Top":0,"Left":0};
		
		while( element != null )
		{
			point.Top  += element.offsetTop;
			point.Left += element.offsetLeft;
			
			element = element.offsetParent;
		}
		
		return point;
	}
	
	this.GetClientRectangle = function( element )
	{
		var point = GetClientPosition( element );
		return new pox.Drawing.Rectangle( point.Top, point.Left, element.offsetWidth, element.offsetHeight );
	}
	
	this.GetCurrentStyle = function( element ){ return element.currentStyle; }
	this.SetStyle = function( element, value ){ element.className = value; }
	
	this.SetZIndex = function( element, value ){ element.style.zIndex = value; }
	
	this.GetInnerText = function( element ){ return element.innerText; }
	this.SetInnerText = function( element, value ){ return element.innerText = value; }
	
	this.SetOpacity = function( element, value ){ return element.style.filter = "alpha(opacity="+ value +")";}
	
	this.findStyle = function( element )
	{
		var rules = document.styleSheets[ 0 ].rules;
		var style = null;
		
		for( var i = 0; i < rules.length; i++ )
		{
			if( rules[i].selectorText == "."+ element.className )
			{
				style = rules[i].style;
				break;
			}
		}
		
		return style;
	}
	
	this.OpenPopup = function( url, nombre, width, height, params )
	{
		var top, left;
		
		left = (screen.availWidth-width) / 2;
		top  = (screen.availHeight-height) / 2;
		
		window.open( url, nombre,"width="+ width +",height="+ height +",scrollbars=no,top="+ top +",left="+ left );
	}
	
	this.RemoveChilds = RemoveChilds; function RemoveChilds( element )
	{
		var i;
		var childs;

		childs = element.childNodes.length;

		for( i = 0; i < childs; i++ )
			element.removeChild( element.childNodes[ 0 ] );
	}
	
	this.Navegate      = function( url ){ var a = document.createElement("a"); a.href = url; document.body.appendChild( a ); a.click(); }
	this.SwapImage     = function( element, imageUrl, fadeDuration ){ if( arguments.length == 3 ) throw new Exception(); else element.src = imageUrl; }
	this.SwapImageById = function( elementId, imageUrl ){ this.SwapImage( document.getElementById(elementId), imageUrl ); }
	
	this.Trace = Trace; function Trace( value )
	{
		if( this.traceContainer == null )
		{
			this.traceContainer  = document.createElement( "pre" );
			this.traceContainer.style.overFlow = "scroll-y";
			this.btnBorrar       = document.createElement( "button" );
			this.btnBorrar.value = "Borrar";
			this.btnBorrar.onclick = function()
			{
				browser.traceContainer.innerHTML = "";
			}
			
			this.InsertElement( document.body, this.btnBorrar );
			this.InsertElement( document.body, this.traceContainer );
		}
		
		if( typeof(value) == "object" )
		{
			for( p in value )
				this.Trace( p +"="+ value[p] );
		}
		else
			this.traceContainer.innerHTML += "<br>"+ value;
	}
}

var BrowserNetScape = function()
{
	Class.Extends( BrowserIE, this );
	
	this.Name = "NS";
}

BrowserNetScape.prototype = new function()
{
	// Esta es una clase interna que maneja el evento de HTML
	function ElementEventHandler( element, eventName, delegate )
	{
		this.element   = element;
		this.eventName = eventName;
		this.delegate  = delegate;
		
		this.Invoke = Invoke; function Invoke( e )
		{
			var args = {Type:this.eventName,Target:e.target,CancelEvent:false,KeyCode:e.keyCode,
			MousePoint:{X:e.clientX,Y:e.clientY}};
			
			this.delegate.Invoke( args );
		
			e.returnValue = !args.CancelEvent;
		}
	}
	
	this.attachEvent = function( element, eventName, delegate )
	{
		var e       = new ElementEventHandler( element, eventName, delegate );
		var handler = function(event){ e.Invoke(event); }
		element.addEventListener( eventName, handler, false );
	
		return handler;
	}
	
	this.detachEvent = function( element, eventName, handler )
	{
		element.removeEventListener( eventName, handler, false );
	}
	
	this.GetEventTarget = function( sender ){ return sender.target; }
	
	this.GetCurrentStyle = function( element ){ return this.findStyle( element ); }
	
	this.SetTop   = function( element, top ){ element.style.top = top +"px"; }
	this.SetLeft  = function( element, left ){ element.style.left = left +"px"; }
	this.SetWidth = function( element, width )
	{
		var style = this.findStyle( element );
		
		if( style != null )
		{
			var paddingLeft  = (style.paddingLeft != "")?parseInt(style.paddingLeft):0;
			var paddingRight = (style.paddingRight != "")?parseInt(style.paddingRight):0;
			
			element.style.width = width - paddingLeft - paddingRight;
		}
	}
	this.SetHeight = function( element, height )
	{
		var style = this.findStyle( element );
		
		if( style != null )
		{
			var paddingTop    = (style.paddingTop != "")?parseInt(style.paddingTop):0;
			var paddingBottom = (style.paddingBottom != "")?parseInt(style.paddingBottom):0;
		
			element.style.height = height - paddingTop - paddingBottom;
		}
	}
	
	this.SetInnerSize  = function( element, width, height ){ element.style.width  = width; element.style.height = height; }
	this.SetInnerWidth = function( element, width ){ element.style.width = width; }
	
	this.SetChildPosition = function( element, top, left )
	{
		var style       = this.findStyle( element.parentNode );
		var paddingTop  = (style != null)?getPaddingUnit( style.paddingTop ):0;
		var paddingLeft = (style != null)?getPaddingUnit( style.paddingLeft ):0;
		
		element.style.top  = top + paddingTop;
		element.style.left = left + paddingLeft;
	}
	
	this.GetInnerText = function( element ){ return element.textContent; }
	this.SetInnerText = function( element, value ){ return element.textContent = value; }
	
	this.SetOpacity = function( element, value ){ return element.style.opacity = "."+ value;}
	
	this.SetPaddingRight = function( element, value ){ element.style.paddingRight = value +"px"; }
	this.GetPaddingRight = function( element )
	{
	    var style = this.findStyle( element );
	    
	    if( style.paddingRight != "" )
			return parseInt( style.paddingRight );
	    else
	        return 0;
	}
	
	this.Navegate = function( url ){ document.location = url; }
	
	this.findStyle = function( element )
	{
		var styleItem = document.styleSheets.item( element.className );
		
		if( styleItem != null )
		{
			var rules = styleItem.cssRules;
			var style = null;
			
			for( var i = 0; i < rules.length; i++ )
			{
				if( rules.item(i).selectorText == "."+ element.className )
				{
					style = rules.item(i).style;
					break;
				}
			}
		}
		
		if( style == null )
		    style = element.style;
		
		return style;
	}
	
	function getPaddingUnit( value )
	{
		return (value != "")?parseInt(value):0;
	}
}

var browser = Browser.GetCurrent();
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();