//////////////////////////////
//
//   Filename: parse_url.js
//   Author: Bastiaan van Dreunen @ Noterik Multimedia B.V <bas@noterik.nl>
//   Date: 2/7/2003
//
//   Description: Contains functions to parse a URL
//
//   To do:       Commenting
//
//////////////////////////////

  // ---------------------------
  // parseUrl(string url)
  // returns an object containing the following properties of the url:
  //
  // url.type         - relative or absolute;
  // url.scheme       - http, ftp, etc., is null when type == relative
  // url.username     - i.e. username:password@www.myhost.com/
  // url.password
  // url.host         - hostname, i.e. www.subdomain.myhost.com
  // url.tld          - top level domain, i.e. com, org etc. (no dot)
  // url.port         - portnumber, i.e. myhost.com:8080
  // url.subdomains   - array containing subdomains, i.e. www.subd1.subd2.myhost.com
  // url.directories  - array containing directories, i.e. www.myhost.com/directory1/directory
  // url.queryString  - associative array containing query string variables, i.e.:
  //                    -> myhost.com/index.php?mode=show
  //                    -> url.queryString["mode"] will return "show".
  // url.fileName     - the filename of the document in the URL, i.e. index.html
  // url.fileExtension -the extension of the filename in the URL, i.e. html (no dot)
  // ---------------------------
function parseUrl(url)
{  
  var myUrl = new Url();
  if(url.indexOf("#"))
  {
    var anchorSplit = url.split("#");
    myUrl.anchor = anchorSplit[1];
    url = anchorSplit[0];
  }

  if(url.indexOf("?")!=-1)
  {
    var queryStringSplit = url.split("?");
    queryString = queryStringSplit[1];
    myUrl.queryString = parseQueryString(queryString);   
    url = queryStringSplit[0];      
  }

		
  // split 1
  var urlParts1 = url.split("\/\/");
  if(urlParts1.length > 1)
  {
    myUrl.type = "absolute";
    myUrl.scheme = urlParts1[0].replace(":", "");        
    var urlParts2 = urlParts1[1].split("/");
    if(urlParts2[0].indexOf("@") != -1)
    {
      var urlParts3 = urlParts2[0].split("@");
      var urlParts4 = urlParts3[0].split(":");
      myUrl.username = urlParts4[0];
      myUrl.password = urlParts4[1];
      myUrl.host = urlParts3[1];
    }
    else
    {
      myUrl.host = urlParts2[0];
    }          
    if(myUrl.host.indexOf(":") != -1)
    {
      var urlParts5 = myUrl.host.split(":");
      myUrl.host = urlParts5[0];
      myUrl.port = urlParts5[1];
    }
    if(myUrl.host.indexOf(".") != -1)
    {
      var urlParts6 = myUrl.host.split(".");
      myUrl.tld = urlParts6[urlParts6.length-1];
      if(urlParts6.length > 2)
      {
        for(i=0;i<(urlParts6.length-2);i++)
        {
          if(urlParts6[i] != "")
          {
            myUrl.subdomains[myUrl.subdomains.length] = urlParts6[i];
          }
        }
      }
    }
    if(urlParts2[urlParts2.length-1].indexOf(".") != -1)
    {
      myUrl.fileName = urlParts2.pop();
      myUrl.fileExtension = myUrl.fileName.split(".")[1];
    }
    for(i=1;i<urlParts2.length;i++)
    {
      myUrl.directories[myUrl.directories.length] = urlParts2[i];
    }      
  }
  else
  {
    myUrl.type = "relative";
    var urlParts2 = urlParts1[0].split("/");
    if(urlParts2[urlParts2.length-1].indexOf(".") != -1)
    {
      myUrl.fileName = urlParts2.pop();
      myUrl.fileExtension = myUrl.fileName.split(".")[1];
    }
    for(i=0;i<urlParts2.length;i++)
    {
      if(urlParts2[i] != "")
      {
        myUrl.directories[myUrl.directories.length] = urlParts2[i];
      }
    }
  }
  return myUrl;
}

function Url()
{
  this.type = null // relative or absolute;
  this.scheme = null; // http:// ftp:// etc. - only has value when type == absolute;
  this.username = null;
  this.password = null;
	this.host = null;
  this.tld = null;
  this.port = null;
	this.subdomains = new Array();
	this.directories = new Array();
  this.queryString = new Array();
	this.fileName = null;
  this.fileExtension = null;
  this.anchor = null;
}

function parseQueryString(qStr)
{
  if(qStr.indexOf("?") != -1) {
    qStr = qStr.substring(1, qStr.length);
  }
  var qStrArray = new Array();    
  var variables = qStr.split("&");
  for(i=0;i<variables.length;i++)
  {
    var parts = variables[i].split("=");
    qStrArray[parts[0]] = parts[1];
  }
  return qStrArray;
}


  // example prototype function
Url.prototype.showUrl = function()
{
  //alert(this.filename);
  if(this.subdomains.length > 1)
  {
	  var subdomainStr = "";
	  for(i=0;i<this.subdomains.length;i++)
    {
      subdomainStr += this.subdomains[i] + ", "; 
    }
    this.subdomains = subdomainStr.substring(0, subdomainStr.length-2);
	}
	else
  {
    this.subdomains = this.subdomains[0];
	}
	if(this.directories.length > 1)
  {
	  var directoriesStr = "";
	  for(i=0;i<this.directories.length;i++)
    {
      directoriesStr += this.directories[i] + ", ";
    }      
    this.directories = directoriesStr.substring(0, directoriesStr.length-2);
  }
	else
  {
    this.directories = this.directories[0];
	}
  alert("Type: " + this.type + "\nScheme: " + this.scheme + "\nUsername: " + this.username + "\nPassword: " + this.password + "\nHost: " + this.host + "\nTop-level-domain: " + this.tld + "\nSubdomain(s): " + this.subdomains + "\nPort: " + this.port + "\nDirectories: " + this.directories + "\nFilename: " + this.fileName + "\nFile extension: " + this.fileExtension + "\nQuery string: " + this.queryString + "\nAnchor: " + this.anchor);
}
