
function SliderWin (name) {

	var _objName = name;

	var _x = 0; 
	var _y = 0;
	
	var _Cycles = 100;
	var _Delay = 100;
	
	var _SpeedX = 0;
	var _SpeedY = 0;
	
	var _bInit = false;
	var _bPaused = false;	
	var _bDragable = false; // Dragable needs some work, it's a little buggy with mouseup off screen
	var _avoid = new Array();
	var _avoidHTMLHref;
        var _avoidHTMLName;
        var _avoidHTMLFeatures;
	
	var refObj = this;
	var refSlider;
	var refToolbar;
	var refTitle; 
	var refClose;
	var refContent;
	var refExWin;
	
	// methods
	
	this.setCycles = function (c) {
		_Cycles = c;
	}
	
	this.getCycles = function () {
		return _Cycles;
	}
	
	this.setDelay = function (d) {
		_Delay = d;
	}
	
	this.getDelay = function () {
		return _Delay;
	}
	
	this.setSpeed = function ( x,y ) {
		_SpeedX = x;
		_SpeedY = y;
	}
	
	this.getSpeed = function () {
		p = new _point ( _SpeedX, _SpeedY );
		return p;
	}
	
	this.run = function () {
		if (!_bInit) {
			alert ('run(): Must Init() first.');
			return 0;
		}
		_bPaused = false;
		var avoid = false;
		for (var i=0;i<_avoid.length;i++) {
			if ( eval(_avoid[i]) ) {
				avoid = true;
			}
		}
		if (avoid) {
		 	refExWin = window.open(_avoidHTMLHref, _avoidHTMLName, _avoidHTMLFeatures);	
		} else {
			setupSlideWindow( refObj );
		}
	}
	
	this.pause = function () {
		if (!_bInit) {
			alert ('run(): Must Init() first.');
			return 0;
		}		
		_bPaused = true;
	}
	
	this.paused = function () {
		return _bPaused;
	}
	
	this.hide = function () {
		if (!_bInit) {
			alert ('hide(): Must Init() first.');
			return 0;
		}
		refSlider.style.display = "none";
	}
	
	this.show = function () {
		if (!_bInit) {
			alert ('show(): Must Init() first.');
			return 0;
		}
		refSlider.style.display = "";
	}
	
	this.setAvoid = function (s) {
	
		_avoid[_avoid.length] = s;
	
	}
	
	this.getAvoid = function (i) {
          if(i<0) {
            return _avoid;
          } else {   
            return _avoid[i];
          }
	}
	
	this.setAvoidPage = function (href, name, features) {
		_avoidHTMLHref = href;
                _avoidHTMLName = name;
                _avoidHTMLFeatures = features;
	}
	
	var _actions = new Array();
	var _actionPos = 0;
	
	this.getAction = function () {
		var a = _actions[_actionPos];
		if (a) {
			_actionPos++;
			return a;
		}
	}
	
	this.addAction = function (x,y,w) {
		_actions[_actions.length] = new _action(x,y,w);	
	}
	
	this.Name = function () {
		return _objName;
	}
	
	this.SliderName = function () {
		return _objName + "Slider";
	}
	
	this.ToolbarName = function () {
		return _objName + "SliderToolbar";
	}

	this.TitleName = function () {
		return _objName + "SliderTitle";
	}
	
	this.CloseName = function () {
		return _objName + "SliderClose";
	}

	this.ContentName = function () {
		return _objName + "SliderContent";
	}

	this.setDragable = function (b) {
		if (!_bInit) {
			alert ('setDraggable(): Must Init() first.');
			return 0;
		}
		if (b) {
			var o = getObj(refObj.ToolbarName());
			o.onmousedown = function ( handlerInput ) {   
				_posX = ( document.all ) ? event.clientX : handlerInput.clientX;   
				_posY = ( document.all ) ? event.clientY : handlerInput.clientY; 
				  
				document.onmousemove = function ( handlerInput ) {  
											posX = ( document.all ) ? event.clientX : handlerInput.clientX;   
											posY = ( document.all ) ? event.clientY : handlerInput.clientY;   
											_x += posX - _posX;   
											_y += posY - _posY;   
											_posX = posX;   
											_posY = posY;    
											
											refSlider.style.left = getXoffset(_x); 
											refSlider.style.top  = getYoffset(_y);
										
										}    
			} 
			refSlider.onmouseup = function () {
				document.onmousemove = funcVoid;
			}
			o.onmouseup = function () {
				document.onmousemove = funcVoid;			
			}
			document.onmouseup = function () {
				document.onmousemove = funcVoid;
			}
			
		} else {
			o.onmousedown = funcVoid;
			o.onmouseup = funcVoid;
		}
		
		_bDragable = b;
	}
	
	this.getDraggable = function () {
		return _bDragable;
	}
	
	
	// Styles
	
	this.setStyle = function (obj, style) {
		if (!_bInit) {
			alert ('setStyle(): Must Init() first.');
			return 0;
		}
		_setStyle (obj, style);
	}

	this.getStyle = function (obj, style) {
		if (!_bInit) {
			alert ('getStyle(): Must Init() first.');
			return 0;
		}
		return (eval("obj.style."+style));
	}
	
	// current position
	this.getCurrentPos = function () {
	
		var p = new _point(_x, _y);	
		return p;
		
	}
	
	this.correctOffset = function () {
	
		var xx = getXoffset(0);
		var yy = getYoffset(0);
		
		if (xx!=lastXoffset || yy!=lastYoffset) {
			(xx>lastXoffset)?_x-=(xx-lastXoffset):_x+=(lastXoffset-xx);
			(yy>lastYoffset)?_y-=(yy-lastYoffset):_y+=(lastYoffset-yy);
		}
	}
	
	var lastXoffset;
	var lastYoffset;
	
	this.setCurrentPos = function ( x, y ) {
		_x = x;
		_y = y;
		
		_setStyle (refSlider, "left: " + getXoffset(x) +"px; top: " + getYoffset(y) + "px");
		lastXoffset = getXoffset(0);
		lastYoffset = getYoffset(0);
		
	}
	
	refSlider = _init ( refObj );	
	_bInit = true;		

}

function _action (x,y,c) {

	this.x = x;
	this.y = y;
	this.command = c;

}

function _point (x,y) {

	this.x = x;
	this.y = y;

}

function _setStyle (obj, style) {

	var styles = style.split(";")
	for ( i=0; i < styles.length; i++ ) {
		rack = styles[i].split(":");
                if (rack[0].length && rack[1] != undefined) {
                    try {
                            eval("obj.style." + trim(rack[0]) + "='" + trim(rack[1]) + "'");
                    } catch(err) {
                            alert (err + "\n" + rack[0] + "=" + rack[1] );
                    }
                }
        }

}

function _init( obj ) {
	document.write("<div style='position:absolute; display:none; z-index:999; background-color: #FFFFFF; background-image: url(white.gif); background-repeat: repeat;' id='" + obj.SliderName() + "' name='" + obj.SliderName() + "'>");
	document.write("  <div id='" + obj.ToolbarName() + "' name='" + obj.ToolbarName() + "'>"); 
	document.write("    <div style='float:left;' id='" + obj.TitleName() + "' name='" + obj.TitleName() + "'></div>"); 
	document.write("    <div style='text-align:right;' id='" + obj.CloseName() + "' name='" + obj.CloseName() + "'>Close</div>"); 
	document.write("  </div>"); 
	document.write("  <div id='" + obj.ContentName() + "' name='" + obj.ContentName() + "'></div>"); 
	document.write("</div>"); 
	
	if ( document.getElementById ) {
		sliderWinRef = document.getElementById ( obj.SliderName() );
		obj.refSlider = sliderWinRef;
		obj.refToolbar = document.getElementById ( obj.ToolbarName() );
		obj.refTitle = document.getElementById ( obj.TitleName() ); 
		obj.refClose = document.getElementById ( obj.CloseName() );
		obj.refContent = document.getElementById ( obj.ContentName() );
	} else {
		sliderWinRef = document.all [ obj.SliderName() ];
		obj.refSlider = sliderWinRef;
		obj.refToolbar = document.all [ obj.ToolbarName() ];
		obj.refTitle = document.all [ obj.TitleName() ]; 
		obj.refClose = document.all [ obj.CloseName() ];
		obj.refContent = document.all [ obj.ContentName() ];
	}

	return sliderWinRef;

}

function getXoffset ( x ) {
	return ( ( window.pageXOffset ) ? window.pageXOffset : document.body.scrollLeft ) + x; 
} 

function getYoffset ( y ) { 
	return ( ( window.pageYOffset ) ? window.pageYOffset : document.body.scrollTop ) + y; 
}  

function setupSlideWindow ( obj ) {

	if (!obj.paused()) {
	
		document.onmousemove = funcVoid;
		document.onmouseup   = funcVoid;
		
		var current = obj.getCurrentPos();   
		XCurrentPos = current.x;   
		YCurrentPos = current.y;
		
		var action = obj.getAction();
		if (action) {	
			obj.correctOffset(); 
				
			XFinalPos = action.x;   
			YFinalPos = action.y;
			
			mC = obj.getCycles();
	
			var sX = Math.abs((XCurrentPos>XFinalPos?XCurrentPos-XFinalPos:XFinalPos-XCurrentPos)/mC);
			var sY = Math.abs((YCurrentPos>YFinalPos?YCurrentPos-YFinalPos:YFinalPos-YCurrentPos)/mC);
	
			obj.setSpeed( sX, sY );
	   
			_setStyle(obj.refSlider, "display:block");   
			
			objs[obj.SliderName()] = obj;
			actions[obj.SliderName()] = action;
			
			if (isNumeric (action.command)) {
				setTimeout("slideWindow ('"+obj.SliderName()+"')", action.command);
			} else {
				try {
					eval (action.command);
					slideWindow( obj.SliderName() );
				} catch (err) {
					alert (err);
				}
			}

		} else {
			obj.hide();
		}

	}

}

function isNumeric(n){
	for(var ivA = 0; ivA < n.length;ivA ++){
		if(n.charCodeAt(ivA) < 48 || n.charCodeAt(ivA) > 57){
			if(n.charCodeAt(ivA) != 46 && n.charCodeAt(ivA) != 32 && n.charAt(ivA) != ","){
				return false;
			}
		}
	}
	return true;
}

var objs = new Array();
var actions = new Array();

function slideWindow (name) {

	var obj = objs[name];
	var current = obj.getCurrentPos();
	var XCurrentPos = current.x;
	var YCurrentPos = current.y;
	
	var action = actions[name];
	var XFinalPos = action.x;
	var YFinalPos = action.y;
	
	var speed = obj.getSpeed();
   
	if ( XCurrentPos != XFinalPos || YCurrentPos != YFinalPos ) {
		
		if ( XCurrentPos != XFinalPos )         
			if ( Math.abs ( XCurrentPos - XFinalPos ) <= speed.x )           
				XCurrentPos = XFinalPos;
				
			else           
				if ( XCurrentPos < XFinalPos )             
					XCurrentPos += speed.x;           
				else             
					XCurrentPos -= speed.x;
					       
		if ( YCurrentPos != YFinalPos )         
			if ( Math.abs ( YCurrentPos - YFinalPos ) <= speed.y )           
				YCurrentPos = YFinalPos; 
				      
			else           
				if ( YCurrentPos < YFinalPos )             
					YCurrentPos += speed.y;           
				else             
					YCurrentPos -= speed.y;	
					
		obj.setCurrentPos( XCurrentPos, YCurrentPos );		 
		
	  	setTimeout("slideWindow('"+obj.SliderName()+"')", obj.getDelay()); 
		    
	} else {
		
		setupSlideWindow ( obj );
	}
} 

function funcVoid () {

}

function getObj (name) {
	var obj;
	
	if ( document.getElementById ) {
		obj = document.getElementById ( name );
	} else {
		obj = document.all [ name ];
	}
	
	return obj;
}

function trim(str)
{
  return str.replace(/^\s*|\s*$/g,"");
}
