var d = document;
// {{{ common utilities
function attachEventListener(el, eventName, handler) {
	if (el.addEventListener) {
		el.addEventListener(eventName, handler, false);
	} else {
		el.attachEvent('on'+ eventName, handler);
	}
}

function hasClass(el, className) {
	var c = " " + el.className + " ";
	if (c.indexOf(" " + className + " ") != -1) {
		return true;
	}
	return false;
}
function addClass(el, class_name) {
	if (hasClass(el, class_name)) {
		return;
	}
	if (el.className == '') {
		el.className = class_name;
	} else {
		el.className = el.className + ' ' + class_name;
	}
}

function removeClass(el, class_name) {
	el.className = el.className.replace(new RegExp('(^|\s)?' + class_name + '(\s|$)?'), '$1$2').replace(/\s{2,}/, " ");
}

function getElementsByClassName(className, parentEl, tagName) {
	parentEl = parentEl || document.body;
	tagName = tagName || '*';
	var kids = parentEl.getElementsByTagName(tagName);
	var selectedKids = [];
	var c;
	var len = kids.length;
	for (var i = 0; i < len; i++) {
		if (hasClass(kids[i], className)) {
			selectedKids.push(kids[i]);
		}
	}
	return selectedKids;
}

// {{{ onDOMContentLoaded
function onContent(f){//(C)webreflection.blogspot.com
	var a,b=navigator.userAgent,d=document,w=window,
	c="__onContent__",e="addEventListener",o="opera",r="readyState",
	s="<scr".concat("ipt defer src='//:' on",r,"change='if(this.",r,"==\"complete\"){this.parentNode.removeChild(this);",c,"()}'></scr","ipt>");
	w[c]=(function(o){return function(){w[c]=function(){};for(a=arguments.callee;!a.done;a.done=1)f(o?o():o)}})(w[c]);
	if(d[e])d[e]("DOMContentLoaded",w[c],false);
	if(/WebKit|Khtml/i.test(b)||(w[o]&&parseInt(w[o].version())<9))
		(function(){/loaded|complete/.test(d[r])?w[c]():setTimeout(arguments.callee,1)})();
	else if(/MSIE/i.test(b))d.write(s);
};

/** 
* @projectDescription 	Poly9's polyvalent URLParser class
*
* @author	Denis Laprise - denis@poly9.com - http://poly9.com
* @version	0.1 
* @namespace	Poly9
*/
if (typeof Poly9 == 'undefined')
 var Poly9 = {};

Poly9.URLParser = function(url) {
 this._fields = {'Username' : 4, 'Password' : 5, 'Port' : 7, 'Protocol' : 2, 'Host' : 6, 'Pathname' : 8, 'URL' : 0, 'Querystring' : 9, 'Fragment' : 10};
 this._values = {};
 this._regex = null;
 this.version = 0.1;
 this._regex = /^((\w+):\/\/)?((\w+):?(\w+)?@)?([^\/\?:]+):?(\d+)?(\/?[^\?#]+)?\??([^#]+)?#?(\w*)/;
 for(var f in this._fields)
  this['get' + f] = this._makeGetter(f);
 if (typeof url != 'undefined')
  this._parse(url);
}
Poly9.URLParser.prototype.setURL = function(url) {
  this._parse(url);
}

Poly9.URLParser.prototype._initValues = function() {
   for(var f in this._fields)
   this._values[f] = '';
}

Poly9.URLParser.prototype._parse = function(url) {
  this._initValues();
  var r = this._regex.exec(url);
  if (!r) throw "DPURLParser::_parse -> Invalid URL"
  for(var f in this._fields) if (typeof r[this._fields[f]] != 'undefined')
   this._values[f] = r[this._fields[f]];
}

Poly9.URLParser.prototype._makeGetter = function(field) {
 return function() {
  return this._values[field];
 }
}
