/* 
 These functions open a seprate window 
 This version Designed by Bill Frederickson - Ace Productions Inc.
 It takes a file & options.
 if unspecified the window will default to a 640x480 screen
 the function can go over your screen size (resolution), but shouldn't
 (c) (MCMXC-MV) 1990-2005 Bill Frederickson - Ace Productions Inc.
 Usage of this script permitted as long the comments are included.
 the only thing actually required is the file to open (FileToOpen)
 so function can be written as myWindow(FileToOpen[,options])
 FileToOpen can be a file. a path, a url ..... almost anything		
 Anybody can write a window opener, but not all window openers are the same eveybody sets different options in "Their" function, just like this one.

Both functions released under the GPL & cannot be copyrighted or claimed by any other author or company.
		
		Version History :
		  Version 1.0
		    Original Version, had filetoopen,width,height,top,left & options as input.
			
		  Version 1.1
			Added Fav[orites], book[marks] as an alias to dir[ectories],
			Added Addr[ess], & url as aliases location.
			
		  Version 1.2
		    Added Random as a param for Randomizing the window name.
			
		  Version 1.3
		    Added True,false,t,f to params	
				    
		  Version 1.4
		    Removed OPT=1 as an option, now OPT is on (where OPT is status,tool,scroll....) 	
				  
		  Version 1.5 8.27.02
		    == Options Format Changed - watch your call of myWindow(), or myWindow2() ==
		    Removed Val=1 as an "On" state in need of numbers for new add ons :
		    height=NUM
		    width=NUM
		    top=NUM
		    left=NUM
			
		  Version 1.6   8.28.02
		    Readded Val=1 to be an "On" option & Backward compatibility (Almost..) with older versions of myWindow().
		    Added hot[list] as an alias for dir[ectories].
			Added if width or height are greater than window, scroll is turned on
			
		  Version 1.7  9.11.02
		    Added Windowname to options (For constant window name to refer to)
			
          Version 1.7.1 9/20/02
            Update: Rand[om]=y|n|t|f|y|n|1|0|on|off|yes|no|true|false...  Actually works correctly :)  on Both myWindow() & myWindow2()

		  Version 2.0 [myWindow2()] 10.01.02 -- 10.04.02
		    Complete reWrite of myWindow2()
			  Now much easier to control, options actually work as per original specs.
			  Added new option for Bookmakrks/Favorites/hotlist - link(s)
			  Added new option for top & left - center
			  Uses Regular Epressions to match values true,false,yes,no .... 

		usage of options is as follows:
		  stat[us]=y|n|1|0|on|off|yes|no|true|false|t|f,  (Bottom)
		  tool[bars]=y|n|1|0|on|off|yes|no|true|false|t|f,  (Back,Next,stop...)
		  menu[bar]=y|n|1|0|on|off|yes|no|true|false|t|f, (File, edit, view....)
		  dir[ectories] | fav[orites] | book[marks] | hot[list] | link[s]=y|n|1|0|on|off|yes|no|true|false|t|f,  (favorites/bookmakrs...)
		  resize[able]=y|n|1|0|on|off|yes|no|true|false|t|f,
		  scroll[bars]=y|n|1|0|on|off|yes|no|true|false|t|f,
		  loc[ation] | addr[ess] | url=y|n|1|0|on|off|yes|no|true|false|t|f,	  (Location/url)  
		  rand[om]=y|n|1|0|on|off|yes|no|true|false|t|f,          Allows Multiple "Random" window names. -Default on
		  width=ANY WHOLE NUMBER Greater than Zero.
		  height=ANY WHOLE NUMBER Greater than Zero.
		  top=ANY WHOLE NUMBER Greater than or equal to Zero or "CENTER" as values. (myWindow2 added center option)
		  left=ANY WHOLE NUMBER Greater than or equal to Zero or "CENTER" as values. (myWindow2 added center option)
		  (myWindow2):
		  window[name]=WINDOWNAME; - 9.11.02 - Random Must be OFF - naming a window overrides random (MyWindow2).
		  separator=Options Separator; - 9.20.02 - Using separator overrides default separator (MyWindow2).
		  
		all options default to OFF except Random is on by default, naming a window overrides random.			
			
		The text in the square brackets ( [ ] ) is optional. The | means OR.  y,1,on,true = on	n,0,off,false = off
		The options can go in ANY order, may include y,n,on,off,t,f,1,0 true or false.
		Is case Insensitive so status=Status=STATUS=STaTus .....
		Options MUST be in OPTION=VALUE and be Comma Separated - status=on,menubar=off ....- there is an exception to the rule..
		Use Separator= in myWindow2().
				
		EXAMPLES :	
		  <A HREF="JavaScript:myWindow('someurl.com/somefile.html')">Link</A>   // simple
		  <A HREF="JavaScript:myWindow2('someurl.com/somefile.html','width=500,height=200')">Link</A>   // With width & height
		  <A HREF="JavaScript:myWindow2('someurl.com/somefile.html','width=500,height=200,top=5,left=5')">Link</A>   // With width, height, top & left
		  <A HREF="JavaScript:myWindow2('someurl.com/somefile.html','width=500,height=200,status=on,tool=on')">Link</A>   // With width, height, top,  left & options.
		  <A HREF="JavaScript:myWindow2('someurl.com/somefile.html','width=500,tool,height=200,status,scroll,top=6,url,random=off')">Link</A>   // With width, height, top, left & some complex options.
			
		  The GOOD News:
		   This function is 100% completly browser compatible.
		    It's written in Javascript 1.0. Although I Recomend JS 1.2
			It works in:
			 MicroSoft Internet Explorer (& Compatible) 3.0 +
			 Netscape Navigator (& Compatible) 3.0 +
			 Netscape Communiator (& Compatible) 4.0 +
			 Netscape 6.0 +
			 Mozilla 0.8 (& Compatible) +
			 Opera 3.0 (& Compatible) +
			 
			The top & left features work in ALL browsers.
			The Options have been enhaced so you don't have to remember the correct names. 
*/
//==========================================================================================================================
//==                                              myWindow2()                                                             ==
//== This Version of the function DOES NOT REQUIRE width,height,top & left before using the other options.
//== This Version uses Regular expressions to pattern match.
//==========================================================================================================================
function myWindow(FileToOpen,options){
 myWindow2(FileToOpen,options);
}
function mywindow(FileToOpen,options){
 myWindow2(FileToOpen,options);
}
function mywindow2(FileToOpen,options){
  myWindow2(FileToOpen,options);
}//

function myWindow2(FileToOpen,options){
 var stat=0,tb=0,menu=0,directory=0,reSizeable=0,sBars=0,loc=0,optsVal=0,AllOpts=0,rndWin=1,h=480,w=640,t,tWin=0,lft=0,optsNum=0,myNum,hv,wv,tNum=0,MAX=0,WinName="",Seperator=",",i=0,tw,th,t,x,l,n,tchr,p,sTxt='';Target=false;
 var Opts=new Array();
 var optValue=new Array();
 var onRegExpr="(y|yes|on|t|true|1)";
 var offRegExpr="(n|no|off|f|false|0|none|n\/a)";
 var mainOpts=".*";
 var winName=".*(window|(.+name$)(=|\:)).*"
 var numOpts="[0-9]"; // digits...
 var alphOpts="[a-z0-9]";
 var hwOpts=".*(height.*|width.*)(=|:).*"; //|(h|(.+eight$))|(w|(.+idth$))=
 var hOpts=".*(height.*)(=|:).*"; //|(h|(.+eight$))|(w|(.+idth$))=
 var wOpts=".*(width.*)(=|:).*"; //|(h|(.+eight$))|(w|(.+idth$))=
 var tlOpts=".*(top.*|left.*)(=|:).*"; //|(t|(.+op$))|(l|(.+eft$))=
 var tOpts=".*(top.*)(=|:).*"; //|(t|(.+op$))|(l|(.+eft$))=
 var lOpts=".*(left.*)(=|:).*"; //|(t|(.+op$))|(l|(.+eft$))= 
 var sepOpts=".*(separ(ator)=).*";  //(=|:)  escape : ?? as \:
 var allOpts=".*(all).*"; 
 var onRegExpr1=new RegExp(onRegExpr); // onRegExpr1=/(y|yes|on|t|true|1)/i;
 var offRegExpr1=new RegExp(offRegExpr); //offRegExpr1=/(n|no|off|f|false|0|none|n\/a)/i
 var hwRegExpr=new RegExp(hwOpts); //  /.*(height.*|width.*)(=|:).*/i
 var tlRegExpr=new RegExp(tlOpts); //    /.*(top.*|left.*)(=|:).*/i
 var Sepr=/[\,\;\|]/ig;
 var mainRegExpr=new RegExp(mainOpts);  //   /.*/
 var numRegExpr=new RegExp(numOpts);  // /[0-9]/i
 var alphRegExpr=new RegExp(alphOpts);// /[a-z0-9]/i
 var winRegExpr=/.*(window|(.+name$)(=|\:)).*/ig; //new RegExp(winName);
 var digits=new RegExp(numOpts); //  /[0-9]/i
 var hwExpr=new RegExp(hwOpts); //  /.*(height.*|width.*)(=|:).*/i
 var hExpr=new RegExp(hOpts);  //    /.*(height.*)(=|:).*/i
 var wExpr=new RegExp(wOpts); //     /.*(width.*)(=|:).*/i
 var tlExpr=new RegExp(tlOpts); //   /.*(top.*|left.*)(=|:).*/i
 var tExpr=new RegExp(tOpts); //    /.*(top.*)(=|:).*/i
 var lExpr=new RegExp(lOpts);  //   /.*(left.*)(=|:).*/i
 var sepExpr=new RegExp(sepOpts); //  /.*(separ(ator)=).*/i
 var allExpr=new RegExp(allOpts); //  /.*(all).*/i
 
 if (FileToOpen) {     
         var optionvalue=0;
		 var ttopts="";
		 var Sepopts="[\,\;\&\~\|]{1}"; // space is \s but removes ,s on ,scroll
		 var SeperatorXpr=new RegExp(Sepopts);// why doen't this work with /[\,\;\&\~\|]{1}/   ??
		 myOpts=(options) ? options : 'none';
		 if ( !mainRegExpr.test(mainOpts) || myOpts.length < 0 ) myOpts="";  //		 
	     // look for ALL options
		 if ( allExpr.test(myOpts) ) { // all can still have other options, including height,width,top,left & windowname  myOpts.indexOf("all") >= 0 set all options on if "all" found in options.
		  AllOpts=1;
		  stat=1;
		  tb=1;
		  menu=1;
		  directory=1;
		  reSizeable=1;
		  sBars=1;
		  loc=1;
		  rndWin=1;
		 } // end if  //Not ALL or Height/width    // if ( Sepr.test(myOpts) ) {  }
		 Opts=myOpts.split(SeperatorXpr); // SeperatorXpr can be comma(,), semi-colon(;), Tilde(~), Vertical bar(|),  or amperstand(&)
		 var OptName="";
		 var optsVal=1;
		 var cntNums=0;
		 var cntMax=0;	//alert("Opts: "+Opts);
		 var lastI=0; 
		 for (var i in Opts) {		   
		   var EqXpr=/[=|\:]{1}/ig; //(=|\:)  either the equals(=) or the colon(:)
		   if (EqXpr.test(Opts[i]) || Opts[i].indexOf("=") >=0 || Opts[i].indexOf(":") >=0) {// Split on = or :	 Opts[i].indexOf("=") >=0		    
		    optValue=Opts[i].split(EqXpr);		// if option=value  - new 8/16/02 ;  option=value optional			
			OptName=optValue[0]; // name
			optionvalue=optValue[optValue.length-1]; // value; could/should be optValue[1]
			optsNum = ( optionvalue>0 ) ? optionvalue : 0;						
		    optsVal=( (onRegExpr1.test(optionvalue) ) && !optsNum[i]) ? 1 : 0;			
		   } 
		   else {
			OptName=Opts[i];
			optsVal=1;
		   }
		   if (AllOpts==0) {   //onRegExpr1.test(optsVal[1])
		    OptName=OptName.toLowerCase(); // set to lowercase for searching/matching
			var ScrollXpr=/scroll/ig;  // .*(window|(.+name$)(=|\:)).* new RegExp(".*(scroll)=).*");
			var StatusXpr=/stat/ig;
			var ToolXpr=/tool/ig;
			var MenuXpr=/menu/ig;
			var DirXpr=/(dir)|(book)|(hot)|(link)/ig;
			var ResizeXpr=/resize/ig;
			var LocaXpr=/(loc)|(addr)|(url)/ig;
			var RandXpr=/rand/ig;
			var Alpha=/[a-zA-Z]/ig;
			var isInt=/^-?[0-9]+$"/;
			if (ScrollXpr.test(OptName) && optsVal) sBars=1;    // scrollExpr.test(OptName) //OptName.indexOf("scroll")>=0
			if (StatusXpr.test(OptName) && optsVal) stat=1;  // statExpr.test(OptName)  OptName.indexOf("stat")>=0
			if (ToolXpr.test(OptName) && optsVal) tb=1;  //  toolExpr.test(OptName) OptName.indexOf("tool")>=0
			if (MenuXpr.test(OptName) && optsVal) menu=1;  //mnuExpr.test(OptName) OptName.indexOf("menu")>=0
			if (DirXpr.test(OptName) && optsVal)  directory=1; // dirExpr.test(OptName) (OptName.indexOf("dir")>=0 || OptName.indexOf("book")>=0 || OptName.indexOf("hot")>=0  || OptName.indexOf("link")>=0)
			if (ResizeXpr.test(OptName) && optsVal) reSizeable=1; //resizeExpr.test(OptName) OptName.indexOf("resize")>=0
			if (LocaXpr.test(OptName) && optsVal) loc=1; // locExpr.test(OptName) (OptName.indexOf("loc")>=0 || OptName.indexOf("addr")>=0 || OptName.indexOf("url")>=0)
			if (RandXpr.test(OptName) && optsVal) rndWin=optsVal; //randExpr.test(OptName)  OptName.indexOf("rand")>=0
		   } // end if AllOpts==0		   
		   if ( winRegExpr.test(OptName)) WinName=optValue[1]; //Get Windowname - if applicable.		   
		   var hXpr=/height/i;
		   var wXpr=/width/i;
		   var tXpr=/top/i;
		   var lXpr=/left/i;
		   var tgtXpr=/target/i;
		   
		   if (parseFloat(OptName) || parseInt(OptName)) optionvalue=OptName; 
	/*it's now possible to specify width & height without width= or height=	
	the only problem is they MUST be the first two options AND are w,h w;h etc.*/
		   //if (OptName.indexOf("height") >=0 || (optionvalue>0 && i==1)) h=(optionvalue.toLowerCase()=="max") ? window.screen.availHeight : eval(optionvalue); // supports either height=#, height:# or just #		   
		    if (OptName.indexOf("height") >=0 || (optionvalue>0 && i==1)) {
			   if (optionvalue >=0) h=eval(optionvalue);
			   switch(optionvalue.toLowerCase()) {
			      case "max":
				   h=window.screen.availHeight;
				  break;
				  case "half":
				  case "middle":
				  case "center":
				    h=window.screen.availHeight/2;
				  break;
			   }  //end case/switch			   
			}			
			if (OptName.indexOf("width") >=0 || (optionvalue>0 && i==0)){
			  if (optionvalue >=0) w=eval(optionvalue);
			   switch(optionvalue.toLowerCase()) {
			      case "max":
				   w=window.screen.availWidth;
				  break;
				  case "half":
				  case "middle":
				  case "center":
				    w=window.screen.availWidth/2;
				  break;
			   }  //end case/switch		   
			}		   
		   //if (OptName.indexOf("width") >=0 || (optionvalue>0 && i==0)) w=(optionvalue.toLowerCase()=="max") ? window.screen.availWidth : eval(optionvalue); // supports either width=#, width:# or just #
		   if (tXpr.test(OptName)) {  //top - new 7.27.05 - added top,bottom & middle to top values
		      if (optionvalue >=0) tWin=eval(optionvalue);
		      switch( optionvalue.toLowerCase() ) {
			    case "center":
				case "middle":
				  tWin=parseInt((window.screen.availHeight-h)/2);
				break;								
				case "top":
				  tWin=0;
				break;								
				case "bottom":
				  tWin=parseInt(window.screen.availHeight-h);
				break;								
			  }// end switch/case
			} // end if 
			
			if (lXpr.test(OptName)){ //Left - new 7.27.05 - added right, left & middle to left values
			  if ( optionvalue >=0 ) lft=eval(optionvalue);
		      switch( optionvalue.toLowerCase() ) {
			    case "center":
				case "middle":
				  lft=parseInt((window.screen.availWidth-w)/2);
				break;				
				case "right":
				  lft=parseInt( window.screen.availWidth-w);
				break;				
				case "left":
				  lft=0;
				break;
			  } // end switch/case
			} // end if
		  
		   if (tgtXpr.test(OptName)) {
			  Target=true;
			  tgt=optionvalue;
		   }
		   lastI=i;
		 } // end for in..				 
		 var winName="";
		 var n="DEFAULT";
		 if (WinName) rndWin=0;	 // naming a window overrides random 
		 if (rndWin) n="RandomWindow_"+Math.round(Math.random()*500);
	     winName=(WinName) ? WinName : n; //"DisplayWindow_"+
		 // Default windowsize is 640x480
         if (w=='' || w < 0 || w==null) w=640; 
         if (h=='' || h < 0 || h==null) h=480;
		 //can't be larger than the screen
	     if (h > window.screen.availHeight) h = window.screen.availHeight;
	     if (w > window.screen.availWidth)  w = window.screen.availWidth;
		
	     if (tWin || lft){
	      if (tWin<0 || tWin=="" || tWin==null) tWin=0;
	      if (lft<0 || lft=="" || lft==null) l=0;	  
	      if (tWin >= window.screen.availHeight) tWin=0;
	      if (lft >= window.screen.availWidth) lft=0;
		 } // end if t or l
		 //alert("[MyWindow2] status="+stat+",toolbar="+tb+",menubar="+menu+",directories="+directory+",resizable="+reSizeable+",scrollbars="+sBars+",location="+loc+",width="+w+",height="+h+",top="+tWin+",left="+lft);
   	    myWin=open(FileToOpen,winName, "status="+stat+",toolbar="+tb+",menubar="+menu+",directories="+directory+",resizable="+reSizeable+",scrollbars="+sBars+",location="+loc+",width="+w+",height="+h+",top="+tWin+",left="+lft);
		if (Target && tgt=='self'){
		}
		// status window ??
		//window.status=(sTxt) ? sTxt : '';
		//if (sTxt) alert("sTxt= "+sTxt);
		//return true;
       } // end if FileToOpen
	   else {
	    alert("No File Specified");
	   }
} // end myWindow2