Lib = {};

// error reporting


Lib.Error = {};
Lib.Error._errorEventsArray = 		[];
Lib.Error.callOnError = 		function(func){
							Lib.Error._errorEventsArray.push(func);
};
Lib.Error.throwError = 			function (e){
						for (var i=0; i<Lib.Error._errorEventsArray.length; i++){
						   Lib.Error._errorEventsArray[i](e);
						}
};
Lib.Error.getErrorDetails = 		function (e){
						var arr = [];
						for (params in e){
							arr.push(params+': '+e[params]);
						}
						return arr;
};
Lib.Error.Report = 			function (e){
						e.userAgent = navigator.userAgent;
						var errordetails = Lib.Error.getErrorDetails(e);
						
						var occdateobj= new Date()
						var theyear=occdateobj.getFullYear();
						var themonth=occdateobj.getMonth()+1;
						var thetoday=occdateobj.getDate();
						var thehours=occdateobj.getHours();
						var theminutes=occdateobj.getMinutes();
						
						var occdate = themonth+'/'+thetoday+'/'+theyear+' '+thehours+':'+theminutes;
						
						
						var poststr = 'siteUrl='+escape(window.location.href);
						poststr += '&errorUrl='+escape((e.fileName?e.fileName:window.location.href));
						poststr += '&errorName='+escape(e.name);
						poststr += '&errorMessage='+escape(errordetails.join(",\n"));
						poststr += '&occurenceTime='+escape(occdate);
						// ajax post error details
						
						//console.log(e.message);
					
}
Lib.Error.callOnError(Lib.Error.Report);

Lib.Ajax = {}; 
Lib.Ajax.HttpXML = Base.extend({
	constructor :			function (sendpage){
							this.httpxml_prefix = false;
							this.httpxml = false;
							this.create();
							this.data = null;
							this.method = "get";
							this.sendpage = sendpage;
	},
	create	:			function (){
							if (this.httpxml){
							  return this.httpxml;
							}
							try {
							  if (window.XMLHttpRequest) {
							    var req = new XMLHttpRequest();
							    // some older versions of Moz did not support the readyState property
							    // and the onreadystate event so we patch it!
							    if (req.readyState == null) {
							        req.readyState = 1;
							        req.addEventListener("load", function () {
							          req.readyState = 4;
							          if (typeof req.onreadystatechange == "function")
							             req.onreadystatechange();
							        }, false);
							    }
							    this.httpxml = req;
							  }
							  if (window.ActiveXObject) {
							    this.httpxml = new ActiveXObject(this.getControlPrefix() + ".XmlHttp");
							  }
							  
							  return this.httpxml;
							}catch (ex) {}
	},
	getControlPrefix:		function(){
	
							if (this.httpxml_prefix){
								 return this.httpxml_prefix;
							}
							
							var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
							var o, o2;
							for (var i = 0; i < prefixes.length; i++) {
							  try {
								o = new ActiveXObject(prefixes[i] + ".XmlHttp");
								o2 = new ActiveXObject(prefixes[i] + ".XmlDom");
								return  this.httpxml_prefix = prefixes[i];
							  } catch (ex) {};
							}
							
	},
	send : 				function (data, method){
						  
						  if (this.locked)return false;
							if (data) this.data = data;
							if (method) {
							 this.method = method;
							}else if (this.data){
							 this.method = "post";
							}
							
							
							if (this.sendpage){
							
							 this.httpxml.onreadystatechange = Lib.delegate(this, this.recieve);
							 
							 this.httpxml.open(this.method, this.sendpage);
							 this.httpxml.send(this.data);
							 
							 return true;
							}else {
							  throw "No sendpage specified";
							  return false;
							}
	},
	recieve : 			function (){
	
							if(this.httpxml.readyState == 4){
							   data = this.httpxml.responseXML;
						  	   this.onrecieve(data);
							   this.httpxml.onreadystatechange = null;
							}
	},
	onrecieve : 			function (data){
	}
});
Lib.Ajax.HttpText = Lib.Ajax.HttpXML.extend({
	recieve : 			function (){
	
							if(this.httpxml.readyState == 4){
							   data = this.httpxml.responseText;
						  	   this.onrecieve(data);
							   this.httpxml.onreadystatechange = null;
							}
	}
});

Lib.delegate =				function(that, thatMethod){
							var _params = [];
							for(var n = 2; n < arguments.length; n++) _params.push(arguments[n]);
							return function() {
						         var paramsToUse = [];
						         for(var n = 0; n < arguments.length; n++) {
						         	paramsToUse.push(arguments[n]);
						         }
						         for(var n = 0; n < _params.length; n++) {
						         	paramsToUse.push(_params[n]);
						         }
						         
							 try {
							  if (paramsToUse.length > 0){
							    return thatMethod.apply(that, paramsToUse)
							  }else {
							    return thatMethod.call(that)
							  }
							 }catch(e){
							  e.func = thatMethod;
							  e.params = _params.join(",");
							  Lib.Error.throwError(e);
							 };
							}
};
Lib.Dom = {};
Lib.Dom.Elm = {};	
Lib.Dom.Elm.find = 			function(elm){
							if (typeof elm == "object"){
							 if (source = Lib.Dom.getEventSrc(elm)){
							  return source;
							 }else {
							  return elm;
							 }
							}else {
							  return document.getElementById(elm);
							}
};
Lib.Dom.Elm.first = 			function (elm, type){
							return elm.getElementsByTagName(type)[0];
}
Lib.Dom.Elm.create = 			function(type, styles){
							var elm = document.createElement(type);
							if (styles){
							  Lib.Dom.Elm.Style.add(elm, styles);
							}
							return elm;
};
Lib.Dom.Elm.Style = {};
Lib.Dom.Elm.Style.add = 		function(elm, styles){
							elm = $(elm);
							for (sty in styles){
							  elm.style[sty] = styles[sty];
							}
};

Lib.Dom.Elm.Style.changeStyle =		function (element, newStyleSuffix){
							if(null != element){
							  if (element.originalClass==null || element.originalClass.length==0){
							    if (element.className.length>0){
							      element.originalClass=element.className;
							    }else {
							      element.originalClass=" ";
							    }
							  }
							  if(element.originalClass.length>0 && element.originalClass != " "){
							    element.className = element.originalClass+" "+element.originalClass+newStyleSuffix;
							  }else {
							    element.className = newStyleSuffix;
							  }
							}
};
Lib.Dom.Elm.Style.revertToOriginalStyle = function (element){
							if(element != null && null != element.originalClass && element.originalClass.length>0){
								element.className =element.originalClass;
							}
};


Lib.Dom.Elm.Style.addClass = 		function (element, newStyleSuffix){

							if(null != element)
							{
							  element.originalClass = element.className;
							  if(element.className == null){
							    element.className = newStyleSuffix;
							  }else{
							    element.className += ' ' + newStyleSuffix;
							  }
							}
};
Lib.Dom.Elm.Style.removeClass = 	function (element, newStyleSuffix){
							if(element != null && element.className!=null){
							  if(element.className.indexOf(newStyleSuffix) != -1){
							    var n = element.className.indexOf(newStyleSuffix);
							    element.className = element.className.substr(0, n) + element.className.substr(n + newStyleSuffix.length);
							  }
							}
};



Lib.Dom.getEventSrc = 			function (e){
							if (typeof e == 'undefined') {
							 if (window.event){
							  var e = window.event;
							 }else {
							  return false;
							 }
							}
							return (typeof e.target != 'undefined'?source = e.target:source = e.srcElement);
};
Lib.Dom.getElementsByClassName = 	function (elm, tag, myclass, exact){

 							tags = tag.split("|");
 							
 							var allelms = [];
 							
 							for (var i=0; i<tags.length; i++){
 							 var tmp = (tags[i] == "*" && elm.all)? elm.all : elm.getElementsByTagName(tags[i]);
							 for (var a=0; a<tmp.length; a++){
							  allelms.push(tmp[a])
							 }
							}
							
							var returnelms = new Array();
							myclass = myclass.replace(/-/g, "\-");
							var regexp = new RegExp("(^|\s)" + myclass + "(\s|$)");
							var oElement;
							var classes;
							
							for(var i=0; i<allelms.length; i++){
								oElement = allelms[i];
								if (exact){
								 
								 if(regexp.test(oElement.className)){
								 
								  returnelms.push(oElement);
								 }
								}else {
								 classes = oElement.className.split(" ");
								 
								 var flag = false;
								 
								 for (var a=0; a<classes.length; a++){
								  if(regexp.test(classes[a])){
								   flag = true;	
								  }
								 }
								 if (flag){
								  returnelms.push(oElement);
								 }
								}
								
							}
							
							return returnelms;
};
/* events */

Lib.Dom.addEvent = 			function ( obj, type, fn ) { 
							if ( obj.attachEvent ) { 
							  obj['e'+type+fn] = fn; 
							  obj[type+fn] = function(){obj['e'+type+fn]( window.event );} 
							  
							  obj.attachEvent( 'on'+type, obj[type+fn] ); 
							} else {
							  obj.addEventListener( type, fn, false ); 
							}
} 

Lib.Dom._domLoadedFunctionList	=	[];
Lib.Dom._domLoaded =			false;
Lib.Dom.callWhenDOMLoaded = 		function (func) {

							if (Lib.Dom._domLoaded) {
								try {func();}catch(e){Lib.Error.throwError(e);}
							} else {
								Lib.Dom._domLoadedFunctionList.push(func);
							}
};
Lib.Dom._domLoadedEvent	=		function() {
							Lib.Dom._domLoaded=true;
							
							if (arguments.callee.done) return;
							
							arguments.callee.done = true;
							
							for (var i=0;i<Lib.Dom._domLoadedFunctionList.length;i++) {
							  try {Lib.Dom._domLoadedFunctionList[i]();}catch(e){Lib.Error.throwError(e);}
							}
};





Lib.Dom.expandList = {

/*
expanding list

- container:	 div.drop
- header: 	 h4
- dropped 	div: div.dropped


e.g.

<div class="drop">
 <h4>header</h4>
 <div class="dropped">
   this content will open when header is clicked
 </div>
</div>

this has lots of room for expansion. too much is hardcoded into this. - mikee
*/

  'initialise'	: 	function (){
  				
  				Lib.Dom.expandList.open = false;
  				Lib.Dom.expandList.drops = Lib.Dom.getElementsByClassName(document, 'div', 'drop');
  				if (Lib.Dom.expandList.drops.length > 0){
  				 Lib.Dom.expandList.dropped = [];
				 for (var i=0; i<Lib.Dom.expandList.drops.length; i++){
				  Lib.Dom.expandList.dropped.push(Lib.Dom.Elm.first(Lib.Dom.expandList.drops[i], "div"));
				  Lib.Dom.Elm.Style.add (Lib.Dom.expandList.dropped[Lib.Dom.expandList.dropped.length-1], {'display':'none'});
				  Lib.Dom.addEvent(Lib.Dom.Elm.first(Lib.Dom.expandList.drops[i], "h4"), "click", Lib.delegate(this, Lib.Dom.expandList.openSec, Lib.Dom.expandList.dropped[Lib.Dom.expandList.dropped.length-1]));
				 }
				}
				

				
  },
  'closeSec'	: 	function (){
  				if (Lib.Dom.expandList.open){
  					Lib.Dom.expandList.open.open = false;
  					Lib.Dom.Elm.Style.revertToOriginalStyle(Lib.Dom.Elm.first(Lib.Dom.expandList.open.parentNode, "h4"));
  					Lib.Dom.Elm.Style.add(Lib.Dom.expandList.open, {'display': 'none'});
  				}
  },
  'openSec' 	: 	function (e, i){
  				if (i.open != true){
  				 Lib.Dom.expandList.closeSec();
  				 Lib.Dom.expandList.open = i;
  				 i.open = true;
				 Lib.Dom.Elm.Style.add(i, {'display':'block'});
				 Lib.Dom.Elm.Style.changeStyle(Lib.Dom.Elm.first(i.parentNode, "h4"), "Sel");
				}else {
				 Lib.Dom.expandList.open = i;
				 Lib.Dom.expandList.open.open = true;
				 Lib.Dom.expandList.closeSec();
				}
  },
  'openLast' 	: 	function (){
  				Lib.Dom.expandList.openSec(false, Lib.Dom.expandList.dropped[Lib.Dom.expandList.dropped.length-1]);
  }
};




Lib.Dom.LinkPanels = {};
/*

To initalise: 

callWhenDOMLoaded(Lib.Dom.LinkPanels.initialise);



<div class="linkpanel">
 <p>Other html tags</p>
 <a href="#">click for more info</a>
</div>


this will make the whole of 'linkpanel' a link.

Also works if you have multiple classes on the div. e.g.

<div class="sidepanel linkpanel">
 <p>Other html tags</p>
 <a href="#">click for more info</a>
</div>

*/
Lib.Dom.LinkPanels.getParentDiv = 	function (linkDivElement) {
							while ( (linkDivElement != null) && 
									(linkDivElement.clickhref==null)
								) { 
								linkDivElement=linkDivElement.parentNode;
							}
							return linkDivElement;
};
Lib.Dom.LinkPanels.click = 		function (e, eventObj) {

							var linkDivElement = $(eventObj);
							while ( (linkDivElement != null) 
								&& (linkDivElement.clickhref==null)
								&& (linkDivElement.tagName.toLowerCase() !='a')  ){
								linkDivElement=linkDivElement.parentNode;
							}
							if ( (linkDivElement != null) ) {
								window.location.href=linkDivElement.clickhref;
							}
};
Lib.Dom.LinkPanels.rollover = 		function (e, eventObj) {
							Lib.Dom.Elm.Style.addClass(Lib.Dom.LinkPanels.getParentDiv($(eventObj)),"Hover");
	
};
Lib.Dom.LinkPanels.rollout = 		function (e, eventObj) {
							Lib.Dom.Elm.Style.revertToOriginalStyle(Lib.Dom.LinkPanels.getParentDiv($(eventObj)));
};	

Lib.Dom.LinkPanels.initialise = 	function (container, tags) {
							var divList=Lib.Dom.getElementsByClassName($(container), tags, 'linkpanel');
						
							for (var i=0;i<divList.length;i++) {
								var divElement=divList[i];
									var atags=divElement.getElementsByTagName("a");
									if (atags.length>0) {
										divElement.clickhref=atags[0].getAttribute('href');
										Lib.Dom.Elm.Style.add(divElement, { 'cursor' : 'pointer'});
										Lib.Dom.addEvent(divElement, "click", Lib.delegate(this, Lib.Dom.LinkPanels.click, divElement));
										Lib.Dom.addEvent(divElement, "mouseover", Lib.delegate(this, Lib.Dom.LinkPanels.rollover, divElement));
										Lib.Dom.addEvent(divElement, "mouseout", Lib.delegate(this, Lib.Dom.LinkPanels.rollout, divElement));
									}
								
							}
};


// shortcut to Lib.Dom.Elm.find()
$ = function (e){return Lib.Dom.Elm.find(e);};
// shortcut to call when dom loaded
callWhenDOMLoaded = function(a){return Lib.Dom.callWhenDOMLoaded(a);};
if (document.addEventListener) {
  document.addEventListener("DOMContentLoaded", Lib.Dom._domLoadedEvent, null);
}
window.onload = Lib.Dom._domLoadedEvent;


Lib.Voter = {
	'init'	:	function (){
	
				Lib.Voter.votepanels = Lib.Dom.getElementsByClassName (document, 'div', 'stars enabled', true);
				Lib.Voter.setupLinks();
				
	}, 
	'setupLinks' : 	function (){
	
				for (var i=0; i<Lib.Voter.votepanels.length; i++){
				        var stars = Lib.Voter.votepanels[i].getElementsByTagName('a');
					for (var a=0; a<stars.length; a++){
					  Lib.Dom.addEvent(stars[a], 'click', Lib.delegate(this, Lib.Voter.clickedLink, stars[a], Lib.Voter.votepanels[i].parentNode));
				
					  stars[a].oldhref = stars[a].href;
					  
					  stars[a].href = 'javascript:void(0);';
					}
					
				}
	}, 
	'clickedLink' : function (e, a, parent){
	
				var ajaxhref = $(a).oldhref+'&outputformat=votecontrol';
				var ajax = new Lib.Ajax.HttpText(ajaxhref);
				
				ajax.onrecieve = Lib.delegate(Lib.Voter, Lib.Voter.recievedData, a, parent);;
				
				ajax.send();
	},
	'recievedData' : 	function (data, a, parent){
	
				parent.innerHTML = data;
	}

};
callWhenDOMLoaded(Lib.Voter.init);