/* URL class for JavaScript
 * Copyright (C) 2003 Johan Känngård, <johan AT kanngard DOT net>
 * http://dev.kanngard.net/
 *	
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * The GPL is located at: http://www.gnu.org/licenses/gpl.txt
 */

/* Creates a new URL object with the specified url String. */
if (
		(typeof Prototype=='undefined') ||
		(typeof Element == 'undefined') ||
		(typeof Element.Methods=='undefined') ||
		parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1]) < 1.5
		)
	throw("FenetreGC/URL exige le framework Prototype version >= 1.5.0");

urlCreate = Class.create();
urlCreate.prototype = {
  
  initialize: function(url){
    url = url.replace(/current\.domain/, document.location.host);
    if(url.length==0) throw ('Invalid URL ['+url+'] !');
    this.url=url;
  
  	this.port=-1;
  
  	this.query=(this.url.indexOf('?')>=0)?this.url.substring(this.url.indexOf('?')+1):'';
  
  	if(this.query.indexOf('#')>=0) this.query=this.query.substring(0,this.query.indexOf('#'));
    	this.protocol='';
  	
    this.host='';
    this.protocol = '';
    this.username= '';
    this.password = '';
   	this.file = '';
		this.reference = '';
		this.path = '';
    
    this.createUrl(url);
  },

  createUrl: function(url){
 /* 	if(url.length==0) eval('throw "Invalid URL ['+url+'];');
  	this.url=url;
  	this.port=-1;
  	this.query=(this.url.indexOf('?')>=0)?this.url.substring(this.url.indexOf('?')+1):'';
  	if(this.query.indexOf('#')>=0) this.query=this.query.substring(0,this.query.indexOf('#'));
  	this.protocol='';
  	this.host='';*/
  
  	var protocolSepIndex=this.url.indexOf('://');
  	if(protocolSepIndex>=0){
  		this.protocol=this.url.substring(0,protocolSepIndex).toLowerCase();
  		this.host=this.url.substring(protocolSepIndex+3);
  		if(this.host.indexOf('/')>=0) this.host=this.host.substring(0,this.host.indexOf('/'));
  		var atIndex=this.host.indexOf('@');
  		if(atIndex>=0){
  			var credentials=this.host.substring(0,atIndex);
  			var colonIndex=credentials.indexOf(':');
  			if(colonIndex>=0){
  				this.username=credentials.substring(0,colonIndex);
  				this.password=credentials.substring(colonIndex);
  			}else{
  				this.username=credentials;
  			}
  			this.host=this.host.substring(atIndex+1);
  		}
  		var portColonIndex=this.host.indexOf(':');
  		if(portColonIndex>=0){
  			this.port=this.host.substring(portColonIndex);
  			this.host=this.host.substring(0,portColonIndex);
  		}
  		this.file=this.url.substring(protocolSepIndex+3);
  		this.file=this.file.substring(this.file.indexOf('/'));
  	}else{
  		this.file=this.url;
  	}
  	if(this.file.indexOf('?')>=0) this.file=this.file.substring(0, this.file.indexOf('?'));
  	var refSepIndex=url.indexOf('#');
  	if(refSepIndex>=0){
  		this.file=this.file.substring(0,refSepIndex);
  		this.reference=this.url.substring(this.url.indexOf('#'));
  	}else{
  		this.reference='';
  	}
  	this.path=this.file;
  	if(this.query.length>0) this.file+='?'+this.query;
  	if(this.reference.length>0) this.file+='#'+this.reference;
  
  	/*this.getPort=getPort;
  	this.getQuery=getQuery;
  	this.getProtocol=getProtocol;
  	this.getHost=getHost;
  	this.getUserName=getUserName;
  	this.getPassword=getPassword;
  	this.getFile=getFile;
  	this.getReference=getReference;
  	this.getPath=getPath;
  	this.getArgumentValue=getArgumentValue;
  	this.getArgumentValues=getArgumentValues;
  	this.toString=toString;*/
  },
/* Returns the port part of this URL, i.e. '8080' in the url 'http://server:8080/' */
	getPort: function(){
		return this.port;
	},

	/* Returns the query part of this URL, i.e. 'Open' in the url 'http://server/?Open' */
	getQuery: function (){
		return this.query;
	},

	/* Returns the protocol of this URL, i.e. 'http' in the url 'http://server/' */
	getProtocol: function(){
		return this.protocol;
	},

	/* Returns the host name of this URL, i.e. 'server.com' in the url 'http://server.com/' */
	getHost: function(){
		return this.host;
	},

	/* Returns the user name part of this URL, i.e. 'joe' in the url 'http://joe@server.com/' */
	getUserName: function (){
		return this.username;
	},

	/* Returns the password part of this url, i.e. 'secret' in the url 'http://joe:secret@server.com/' */
	getPassword: function(){
		return this.password;
	},

	/* Returns the file part of this url, i.e. everything after the host name. */
	getFile: function(){
		return this.file;
	},

	/* Returns the reference of this url, i.e. 'bookmark' in the url 'http://server/file.html#bookmark' */
	getReference: function(){
		return this.reference;
	},

	/* Returns the file path of this url, i.e. '/dir/file.html' in the url 'http://server/dir/file.html' */
	getPath: function(){
		return this.path;
	},

	/* Returns the FIRST matching value to the specified key in the query.
	   If the url has a non-value argument, like 'Open' in '?Open&bla=12', this method
	   returns the same as the key: 'Open'...
	   The url must be correctly encoded, ampersands must encoded as &amp;
	   I.e. returns 'value' if the key is 'key' in the url 'http://server/?Open&amp;key=value' */
	getArgumentValue: function(key){
		var a=this.getArgumentValues();
		if(a.length<1) return '';
		for(i=0;i<a.length;i++){
			if(a[i][0]==key) return a[i][1];
		}
		return '';
	},

	/* Returns all key / value pairs in the query as a two dimensional array */
	getArgumentValues: function(){
		var a=new Array();
		var b=this.query.split('&');
		var c='';
		if(b.length<1) return a;
		for(i=0;i<b.length;i++){
			c=b[i].split('=');
			a[i]=new Array(c[0],((c.length==1)?c[0]:c[1]));
		}
		return a;
	},

	/* Returns a String representation of this url */
	toString: function(){
		return this.url;
	}
}

