/**
 * @author Rigoberto D. Benitez
 * @email rigoberto_benitez@hotmail.com
 */

WindowPaneAddEvent=function(obj, evType, fn, useCapture){
	if (obj.addEventListener)
	{
	  obj.addEventListener(evType, fn, useCapture);
	  return true;
    }
    else if (obj.attachEvent)
    {
	  var r = obj.attachEvent("on"+evType, fn);
	  return r;
    }
}

WindowPaneState   ={Normal:0,Minimized:1,Maximized:2};
WindowPaneClose   ={None:0,Close:1};
WindowPaneControls={Minim:4,Maxim:2,Close:1};

function WPData(){
	this.left  =0;
	this.top   =0;
	this.width =0;
	this.height=0;
	//
	this.leftx  =0;
	this.topx   =0;
	this.widthx =0;
	this.heightx=0;
	//
	this.title="";
	//
	this.setX=0;	
}

__marginTop   =40;

__windowIndex =-1;
__zIndex      =100;
__titleBarH   =30;
__minimizedW  =160;
__oWinPane    =new Array();
__oWinArea    =new Array();
__oWinTitle   =new Array();  
__aData       =new Array();
__aWindowPane =new Array();

WindowPaneAddEvent(window, "resize", WindowPaneResize, true);

function WindowPane(wParent,title,left,top,width,height,dirControls,controls){
	this.show=WindowPane.show;
	this.close=WindowPane.close;
	this.setURL=WindowPane.setURL;
	this.setResize=WindowPane.setResize;

    winParent=wParent;
	//
	this.title=title;
	this.left=left;
	this.top =top;
	if (width<(WindowPaneGetViewportWidth()-10))
	  this.width=width;
	else
	  this.width=WindowPaneGetViewportWidth()-10;	  
	if (height<(WindowPaneGetViewportHeight()-10))
	  this.height=height;
	else
	  this.height=WindowPaneGetViewportHeight()-10;	  
	this.url=null;
	this.tag=0;
	this.id="";
	
	if (typeof controls=="undefined")
	  this.controls=WindowPaneControls.Minim|WindowPaneControls.Maxim|WindowPaneControls.Close;
	else
      this.controls=controls;
	
	//Signal
	this.onShow =null;
	this.onClose=null;

	//
	__windowIndex++;
	this.index=__windowIndex;
	
	//999 windows
	var cWinIndex="";
	for (var nI=0;nI<(3-__windowIndex.toString().length);nI++)
	  cWinIndex+="0";
	cWinIndex+=__windowIndex.toString();
	
	__aData[__windowIndex]=new WPData();
	__aWindowPane[__windowIndex]=this;
	
	this.oBODY=winParent.document.getElementsByTagName("body")[0];
	__oWinPane[__windowIndex]=winParent.document.createElement("div");
	this.oWinTitleBar=winParent.document.createElement("div");
	this.oWinTitleBar.style.cursor="move";
	WindowPaneAddEvent(this.oWinTitleBar, "mousedown", WindowPane.beginDrag,true);
	__oWinTitle[__windowIndex]=winParent.document.createElement("div");
	__oWinTitle[__windowIndex].innerHTML=this.title;    //E se o title for maior que o espaço disponível ?
	this.oWinControls=winParent.document.createElement("div");
	__oWinArea[__windowIndex]=winParent.document.createElement("iframe");

	this.oBODY.appendChild(__oWinPane[__windowIndex]);
	__oWinPane[__windowIndex].appendChild(this.oWinTitleBar);
	this.oWinTitleBar.appendChild(__oWinTitle[__windowIndex]);
	this.oWinTitleBar.appendChild(this.oWinControls);
	
	if (typeof dirControls!="undefined")
	{
	  if (this.controls&WindowPaneControls.Minim)
	  {
	    var oMinim=winParent.document.createElement("img");
	    oMinim.id=cWinIndex+"_minim";
	    oMinim.onclick=WindowPane.minimize;
	    oMinim.src=dirControls+"/minim.png";
	    this.oWinControls.appendChild(oMinim);
	  }
	  
	  if (this.controls&WindowPaneControls.Maxim)
	  {	  
	    var oMaxim=winParent.document.createElement("img");
	    oMaxim.id=cWinIndex+"_maxim";
	    oMaxim.onclick=WindowPane.maximize;
	    oMaxim.src=dirControls+"/maxim.png";
	    this.oWinControls.appendChild(oMaxim);
	  }

	  if (this.controls&WindowPaneControls.Close)
	  {	  
	    var oClose=winParent.document.createElement("img");
	    oClose.id=cWinIndex+"_close";
	    oClose.onclick=WindowPane.hide;      
	    oClose.src=dirControls+"/close.png";
	    this.oWinControls.appendChild(oClose);
	  }
	}
	this.oBODY.appendChild(__oWinArea[__windowIndex]);
	//
	__oWinPane[__windowIndex].className="winPane";
	this.oWinTitleBar.className="winTitleBar";
	__oWinTitle[__windowIndex].className="winTitle";
	this.oWinControls.className="winControls";
	__oWinArea[__windowIndex].className="winArea";
	
	__oWinPane[__windowIndex].id=cWinIndex+"_pane";
	this.oWinTitleBar.id=cWinIndex+"_titleBar";
	__oWinTitle[__windowIndex].id=cWinIndex+"_title";
	this.oWinControls.id=cWinIndex+"_controls";
	__oWinArea[__windowIndex].id=cWinIndex+"_area";
	//
	__oWinPane[__windowIndex].style.position="absolute";
	__oWinArea[__windowIndex].style.position="absolute";

	WindowPane.setWidth(__windowIndex ,this.width);
	WindowPane.setHeight(__windowIndex,this.height);

    WindowPane.setLeft(__windowIndex,this.left);
	WindowPane.setTop(__windowIndex ,this.top);
	this.close();	
    WindowPane.setZIndex(__windowIndex);
	//	
}

WindowPane.setResize=function(){
	WindowPaneAddEvent(__oWinPane[this.index], "mousemove", WindowPane.onMove,true);
	WindowPaneAddEvent(__oWinPane[this.index], "mousedown", WindowPane.beginDrag,true);		
}

WindowPane.setWidth=function(idx,width){
	var nW=width-14;
	
	__aData[idx].width=width;
	
	__oWinPane[idx].style.width=width+"px";
	if (nW<0)
	  nW=0;
	__oWinArea[idx].style.width=nW+"px";
}

WindowPane.setHeight=function(idx,height){
	var nH=height-38;
	
	__aData[idx].height=height;
	
	__oWinPane[idx].style.height=height+"px";
	if (nH<0)
	  nH=0;
	__oWinArea[idx].style.height=nH+"px";
}

WindowPane.setZIndex=function(idx){
	__zIndex++;
	__oWinPane[idx].style.zIndex=__zIndex;
	__zIndex++;
	__oWinArea[idx].style.zIndex=__zIndex;
}

WindowPane.removeEvent=function(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}

WindowPane.beginDrag=function(e){
	if (!e) e = winParent.event;
	var oWin=(e.target)?e.target:e.srcElement;
	__winIndex=parseInt(oWin.id.substr(0,3),10);
	
	__nX=e.clientX;
	__nY=e.clientY;
    
	if (oWin.id.indexOf("_pane")>0)
	{
	  if (__leftResize)
	  {
        WindowPaneAddEvent(winParent.document, "mousemove", WindowPane.leftMoveHandler,true);    
	    WindowPaneAddEvent(winParent.document, "mouseup"  , WindowPane.leftUpHandler  ,true);	  	
	  }
	  else
	  if (__rightResize)
	  {
        WindowPaneAddEvent(winParent.document, "mousemove", WindowPane.rightMoveHandler,true);    
	    WindowPaneAddEvent(winParent.document, "mouseup"  , WindowPane.rightUpHandler  ,true);	  	
	  }
	  else
	  if (__bottomResize)
	  {
        WindowPaneAddEvent(winParent.document, "mousemove", WindowPane.bottomMoveHandler,true);    
	    WindowPaneAddEvent(winParent.document, "mouseup"  , WindowPane.bottomUpHandler  ,true);	  	
	  }	  	  
	}
	else
	{
      WindowPaneAddEvent(winParent.document, "mousemove", WindowPane.moveHandler,true);    
	  WindowPaneAddEvent(winParent.document, "mouseup"  , WindowPane.upHandler  ,true);
	}
	
	WindowPane.setZIndex(__winIndex);
	
	__leftx=__aData[__winIndex].left;
	__topx =__aData[__winIndex].top;
	
	e.cancelBubble = true; 
	e.returnValue = false; 	
}

WindowPane.moveHandler=function(e){
	if (!e) e = winParent.event;
	var n1=parseInt(__oWinPane[__winIndex].style.left.substr(0,__oWinPane[__winIndex].style.left.length-2),10)+(e.clientX-__nX);
	var n2=parseInt(__oWinPane[__winIndex].style.top.substr(0 ,__oWinPane[__winIndex].style.top.length-2),10)+(e.clientY-__nY);
	var n3=parseInt(__oWinArea[__winIndex].style.left.substr(0,__oWinArea[__winIndex].style.left.length-2),10)+(e.clientX-__nX);
	var n4=parseInt(__oWinArea[__winIndex].style.top.substr(0 ,__oWinArea[__winIndex].style.top.length-2),10)+(e.clientY-__nY);
	
	if (n1>=0&&n2>=0&&n3>=0&&n4>=0)
	{
	  __aData[__winIndex].left=n1;
	  __aData[__winIndex].top =n2;
	  
	  __oWinPane[__winIndex].style.left=n1+"px";
	  __oWinPane[__winIndex].style.top =n2+"px";

	  __oWinArea[__winIndex].style.left=n3+"px";
	  __oWinArea[__winIndex].style.top =n4+"px";	  
	}

	__nX=e.clientX;
	__nY=e.clientY;

	e.cancelBubble = true;
}

WindowPane.upHandler=function(e){
	if (!e) e = winParent.event;
	WindowPane.removeEvent(winParent.document, "mouseup"  , WindowPane.upHandler  , true);
	WindowPane.removeEvent(winParent.document, "mousemove", WindowPane.moveHandler, true);
	
	if (__aData[__winIndex].setX==1)
	{
//	  WindowPane.setLeft(__winIndex,__leftx);
//	  WindowPane.setTop(__winIndex ,__topx);
	  WindowPane.maxState(__winIndex);
	}
	
	e.cancelBubble = true; 
}

WindowPane.leftMoveHandler=function(e){
	if (!e) e = winParent.event;
	var n1=parseInt(__oWinPane[__winIndex].style.left.substr(0,__oWinPane[__winIndex].style.left.length-2),10);
	var n3=parseInt(__oWinArea[__winIndex].style.left.substr(0,__oWinArea[__winIndex].style.left.length-2),10);
	
	if (n1>=0&&n3>=0&&(n1+(e.clientX-__nX))>0)
	{
	  __aData[__winIndex].left=n1+(e.clientX-__nX);
	  
	  __oWinPane[__winIndex].style.left=(n1+(e.clientX-__nX))+"px";

	  __oWinArea[__winIndex].style.left=(n3+(e.clientX-__nX))+"px";
	  
	  //
	  var nW=parseInt(__oWinPane[__winIndex].style.width.substr(0 ,__oWinPane[__winIndex].style.width.length -2),10)+(e.clientX-__nX)*-1;
	  if (nW>__minimizedW)
	  {
	    __aData[__winIndex].width=nW;
	  	
	    __oWinPane[__winIndex].style.width=nW+"px";	  
	    __oWinArea[__winIndex].style.width=(parseInt(__oWinArea[__winIndex].style.width.substr(0 ,__oWinArea[__winIndex].style.width.length -2),10)+(e.clientX-__nX)*-1)+"px";
	  }	  
	}

	__nX=e.clientX;

	e.cancelBubble = true;
}

WindowPane.leftUpHandler=function(e){
	if (!e) e = winParent.event;
	WindowPane.removeEvent(winParent.document, "mouseup"  , WindowPane.leftUpHandler  , true);
	WindowPane.removeEvent(winParent.document, "mousemove", WindowPane.leftMoveHandler, true);
	
	e.cancelBubble = true; 
}

WindowPane.rightMoveHandler=function(e){
	if (!e) e = winParent.event;

    var nL=parseInt(__oWinPane[__winIndex].style.left.substr(0 ,__oWinPane[__winIndex].style.left.length -2),10);
	var nW=parseInt(__oWinPane[__winIndex].style.width.substr(0,__oWinPane[__winIndex].style.width.length-2),10)+(e.clientX-__nX);
	if (nW>__minimizedW&&(nL+nW)<(WindowPaneGetViewportWidth()-10))
	{
	  __aData[__winIndex].width=nW;
	  
	  __oWinPane[__winIndex].style.width=nW+"px";	  
	  __oWinArea[__winIndex].style.width=(parseInt(__oWinArea[__winIndex].style.width.substr(0 ,__oWinArea[__winIndex].style.width.length -2),10)+(e.clientX-__nX))+"px";
	}	  

	__nX=e.clientX;

	e.cancelBubble = true;
}

WindowPane.rightUpHandler=function(e){
	if (!e) e = winParent.event;
	WindowPane.removeEvent(winParent.document, "mouseup"  , WindowPane.rightUpHandler  , true);
	WindowPane.removeEvent(winParent.document, "mousemove", WindowPane.rightMoveHandler, true);
	
	e.cancelBubble = true; 
}

WindowPane.bottomMoveHandler=function(e){
	if (!e) e = winParent.event;

    var nT=parseInt(__oWinPane[__winIndex].style.top.substr(0    ,__oWinPane[__winIndex].style.top.length   -2),10);
	var nH=parseInt(__oWinPane[__winIndex].style.height.substr(0 ,__oWinPane[__winIndex].style.height.length-2),10)+(e.clientY-__nY);
	if (nH>(__titleBarH+10)&&(nT+nH)<(WindowPaneGetViewportHeight()-10))
	{
	  __aData[__winIndex].height=nH;
	  
	  __oWinPane[__winIndex].style.height=nH+"px";	  
	  __oWinArea[__winIndex].style.height=(parseInt(__oWinArea[__winIndex].style.height.substr(0 ,__oWinArea[__winIndex].style.height.length -2),10)+(e.clientY-__nY))+"px";
	}	  

	__nY=e.clientY;

	e.cancelBubble = true;
}

WindowPane.bottomUpHandler=function(e){
	if (!e) e = winParent.event;
	WindowPane.removeEvent(winParent.document, "mouseup"  , WindowPane.bottomUpHandler  , true);
	WindowPane.removeEvent(winParent.document, "mousemove", WindowPane.bottomMoveHandler, true);
	
	e.cancelBubble = true; 
}

WindowPane.onMove=function(e){
	if (!e) e = winParent.event;
	var oWin=(e.target)?e.target:e.srcElement;
	__winIndex =parseInt(oWin.id.substr(0,3),10);
	var nLeft  =parseInt(__oWinPane[__winIndex].style.left.substr(0  ,__oWinPane[__winIndex].style.left.length  -2),10);
	var nTop   =parseInt(__oWinPane[__winIndex].style.top.substr(0   ,__oWinPane[__winIndex].style.top.length   -2),10);
	var nWidth =parseInt(__oWinPane[__winIndex].style.width.substr(0 ,__oWinPane[__winIndex].style.width.length -2),10);
	var nHeight=parseInt(__oWinPane[__winIndex].style.height.substr(0,__oWinPane[__winIndex].style.height.length-2),10);

    __leftResize  =false;
	__rightResize =false;
	__bottomResize=false;
			
	if (e.clientX<(nLeft+5)&&e.clientY<(nTop+nHeight-10))
	{
	  __oWinPane[__winIndex].style.cursor="e-resize";
	  __leftResize=true;
	}
	else
	if (e.clientY>(nTop+nHeight-5)&&e.clientX>(nLeft+10)&&e.clientX<(nLeft+nWidth-10))
	{
	  __oWinPane[__winIndex].style.cursor="n-resize";
	  __bottomResize=true;
	}
	else
	if (e.clientX>(nLeft+nWidth-5)&&e.clientY<(nTop+nHeight-10))
	{
	  __oWinPane[__winIndex].style.cursor="e-resize";
	  __rightResize=true;
	}
	else	
	  __oWinPane[__winIndex].style.cursor="default"; 
}

WindowPane.setURL=function(url){
	if (typeof url!="undefined")
	{
	  this.url=url;
	  __oWinArea[this.index].src=this.url;
	}	
}

WindowPane.setLeft=function(idx,left){
	if (typeof left!="undefined"&&left!=null)
	{
	  __aData[idx].left=left;
	  
	  __oWinPane[idx].style.left=left+"px";
	  __oWinArea[idx].style.left=(left+7)+"px";
	}
}

WindowPane.setTop=function(idx,top){
	if (typeof top!="undefined"&&top!=null)
	{
	  __aData[idx].top=top;
	  
	  __oWinPane[idx].style.top=top+"px";
	  __oWinArea[idx].style.top=(top+__titleBarH)+"px";
	}
}

WindowPane.show=function(winState){
	if (this.url!=null)
	{
      __oWinPane[this.index].style.display="block";		
      __oWinArea[this.index].style.display="block";
		
	  if (winState==WindowPaneState.Maximized||
	      ((typeof winState=="undefined"||winState==WindowPaneState.Normal)&&__aData[this.index].setX==1))
	    WindowPane.maxState(this.index);
	  else
	  if (winState==WindowPaneState.Minimized)
	    WindowPane.minState(this.index);

      if (typeof winState=="undefined"||winState!=WindowPaneState.Minimized)
	    WindowPane.setZIndex(this.index);
		
	  if (this.onShow!=null)
	    this.onShow();
	}
	else
	  winParent.alert("URL undefined !!!");	
}

WindowPane.close=function(){	  
	__oWinPane[this.index].style.display="none";
	__oWinArea[this.index].style.display="none";		
}

WindowPane.hide=function(e){
	if (!e) e = winParent.event;
    var oWin=(e.target)?e.target:e.srcElement;
	var nIdx=parseInt(oWin.id.substr(0,3),10);
	var o=new Function();
	
	o.action=WindowPaneClose.Close;
	o.tag   =__aWindowPane[nIdx].tag;
	o.id    =__aWindowPane[nIdx].id;
	
    if (__aWindowPane[nIdx].onClose!=null)
	  __aWindowPane[nIdx].onClose(o);
	  
	if (o.action==WindowPaneClose.Close)
	{
      __oWinPane[nIdx].style.display="none";
	  __oWinArea[nIdx].style.display="none";
	}	
}

WindowPane.maximize=function(e){
	if (!e) e = winParent.event;
	var oWin=(e.target)?e.target:e.srcElement;
	__sID=oWin.id.substr(0,3);
	var nIdx=parseInt(__sID,10);
	
    WindowPane.maxState(nIdx);
}

WindowPane.maxState=function(nIdx){
	if (__aData[nIdx].setX==0)
	{	  
	  __aData[nIdx].setX   =2;
	  
  	  __aData[nIdx].leftx  =__aData[nIdx].left;
	  __aData[nIdx].topx   =__aData[nIdx].top;
	  __aData[nIdx].widthx =__aData[nIdx].width;
	  __aData[nIdx].heightx=__aData[nIdx].height;
	  //
	  __aData[nIdx].title=__oWinTitle[nIdx].innerHTML;	  
	
	  WindowPane.setWidth(nIdx,WindowPaneGetViewportWidth()-10);
	  WindowPane.setHeight(nIdx,WindowPaneGetViewportHeight()-10-__marginTop);
	  
	  WindowPane.setLeft(nIdx,0);
	  WindowPane.setTop(nIdx ,__marginTop);
	}
	else
	{	
	  __aData[nIdx].setX  =0;
	  
	  __oWinTitle[nIdx].innerHTML=__aData[nIdx].title;
	  
	  WindowPane.setWidth(nIdx,__aData[nIdx].widthx);
	  WindowPane.setHeight(nIdx,__aData[nIdx].heightx);
	  WindowPane.setLeft(nIdx,__aData[nIdx].leftx);
	  WindowPane.setTop(nIdx,__aData[nIdx].topx);
	  		
	  __oWinArea[nIdx].style.display="block";
	  	  		
	  var nLeft=0;
	  for (var nI=0;nI<=__windowIndex;nI++)
	  if (__aData[nI].setX==1)
	  {
	    WindowPane.setLeft(nI,nLeft);
	    nLeft+=__minimizedW+2;
  	  }
	  //important, new loop for IE
	  for (var nI=0;nI<=__windowIndex;nI++)
	  if (__aData[nI].setX==1)
		WindowPane.setTop(nI,WindowPaneGetViewportHeight()-10-__titleBarH);
    }	  	
}

WindowPane.minimize=function(e){
	if (!e) e = winParent.event;
	var oWin=(e.target)?e.target:e.srcElement;
	var nIdx=parseInt(oWin.id.substr(0,3),10);
	
    WindowPane.minState(nIdx);
}

WindowPane.minState=function(nIdx){
	var nLeft=0;
	
    if (__aData[nIdx].setX==1)
	  return;

    for (var nI=0;nI<=__windowIndex;nI++)
	if (__aData[nI].setX==1)
	  nLeft+=__minimizedW+2;
	  	
	if (__aData[nIdx].setX==0)
	{
  	  __aData[nIdx].leftx  =__aData[nIdx].left;
	  __aData[nIdx].topx   =__aData[nIdx].top;
	  __aData[nIdx].widthx =__aData[nIdx].width;
	  __aData[nIdx].heightx=__aData[nIdx].height;
	  //
	  __aData[nIdx].title=__oWinTitle[nIdx].innerHTML;
	}
	__aData[nIdx].setX=1;
	
	__oWinArea[nIdx].style.display="none";
	__oWinTitle[nIdx].innerHTML=__aData[nIdx].title.substr(0,6)+"...";
	  
	WindowPane.setWidth(nIdx,__minimizedW);
	WindowPane.setHeight(nIdx,__titleBarH);
	WindowPane.setLeft(nIdx,nLeft);
	WindowPane.setTop(nIdx,WindowPaneGetViewportHeight()-10-__titleBarH);

	//Reorganize for IE (scroll)	
	for (var nI=0;nI<=__windowIndex;nI++)
	if (__aData[nI].setX==1)
	  WindowPane.setTop(nI,WindowPaneGetViewportHeight()-10-__titleBarH);	
}

function WindowPaneResize(){
	for (var nI=0;nI<=__windowIndex;nI++)
	if (__aData[nI].setX==2)    //maximized
	{
	  //setWidth
	  __oWinPane[nI].style.width=(WindowPaneGetViewportWidth()-10)+"px";
	  __oWinArea[nI].style.width=(WindowPaneGetViewportWidth()-10-15)+"px";
	
	  //setHeight
	  __oWinPane[nI].style.height=(WindowPaneGetViewportHeight()-10-__marginTop)+"px";
	  __oWinArea[nI].style.height=(WindowPaneGetViewportHeight()-10-40-__marginTop)+"px";
	}
	else	
	if (__aData[nI].setX==1)    //minimized
	  WindowPane.setTop(nI,WindowPaneGetViewportHeight()-10-__titleBarH);
}

function WindowPaneGetViewportHeight() {
	if (winParent.innerHeight!=winParent.undefined) return winParent.innerHeight;
	if (winParent.document.compatMode=='CSS1Compat') return winParent.document.documentElement.clientHeight;
	if (winParent.document.body) return winParent.document.body.clientHeight; 
	return winParent.undefined; 
}

function WindowPaneGetViewportWidth() {
	if (winParent.innerWidth!=winParent.undefined) return winParent.innerWidth; 
	if (winParent.document.compatMode=='CSS1Compat') return winParent.document.documentElement.clientWidth; 
	if (winParent.document.body) return winParent.document.body.clientWidth; 
	return winParent.undefined; 
}
