/**************************************************************************************
*                           COMPANION COMPUTERS LIMITED | CCL 
*           www.companioncomputers.co.uk | info@companioncomputers.co.uk
***************************************************************************************
*              www.compan.net | www.ccloe.co.uk | www.codebean.co.uk
***************************************************************************************
*   Application : Compan Web Portal
*        Author : Andrew Scott (andrew@compan.net) | km0|km0ti0n (km0ti0n@gmail.com)
*          Date : 18/06/2007
*       Version : 2.0.1
*   Description : Core Script components.
*     Copyright : Companion Computers Ltd. | CCL (c) 1987 / 2007 All rights Reserved.
***************************************************************************************
*       Licence : The duplication, distribution and modification for this code is  
*               : prohibited under international, and UK, law.  This code can only be 
*               : used with prior written persission and concent of CCL.  This header
*               : header must be retained, with the sole exception of compression,
*               : where any peer javascript libs / files too must be compressed.
***************************************************************************************
*    Dependancy : n/a
***************************************************************************************/

// A collection of all the Objects that are Added to the App
function Controls()
{
	this.instanceOf = function ()
	{
		var self = new Array();
		self.Add = function ( oControl )
		{
			if( oControl )
			{
				this[this.length] = oControl;

				oControl.PreInit();
				oControl.Init();
			}
		}
		return self;
	}
}

// Event Handler Called from Base.AddEvent("onsomeevent")
// Creates Base.onsomeevent and Base.someevent.Fire(oEvent);
function Event(self, cEvent)	{ this.Self = self; this.cEvent = cEvent; }
Event.prototype					= new Object();
Event.prototype.constructor		= Event;
Event.prototype.Self			= null;
Event.prototype.cEvent			= "";

Event.prototype.Fire			= function (oEvent)
{
	if(this.Self[this.cEvent])
	{
		this.Self[this.cEvent](oEvent);
	}
	else
	{
		if(this.Self.Parent)
		{
			this.Self.Parent.AddEvent( this.cEvent );
			this.Self.Parent[this.cEvent.substring(2)].Fire(oEvent);
		}
		else
		{
			alert("nothing to do");
		}
	}
}

// Renders png correctly in IE and
//just renders normal img's for FF
function PNG( imgName, props, parent )
{
	var img = document.createElement( "img" )
	if( window.attachEvent && !window.opera)
	{
		img.src = "images/png.gif";
		img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"" + imgName + "\", sizingMethod='image');";
	}
	else
	{
		img.src = imgName;
	}
	if (props) for (var p in props) img[p]=props[p];
	img.style.border = "solid 0px";
	return parent.appendChild( img );
}


// Might Add these to the Base Class

function AddClass(obj,cName){ KillClass(obj,cName); return obj.className+=(obj.className.length>0?' ':'')+cName; }
function KillClass(obj,cName){if(obj===undefined){return false;} return obj.className=obj.className.replace(new RegExp("^"+cName+"\\b\\s*|\\s*\\b"+cName+"\\b",'g'),''); }
function HasClass(obj,cName){ return (!obj || !obj.className)?false:(new RegExp("\\b"+cName+"\\b")).test(obj.className) }
function RemoveClass(obj,cName){ KillClass(obj,cName) }


Array.prototype.removeItem=function(el){
	// *** Removes an item from the Array by value (not index)
	for (var i=0;i<this.length;i++) if (this[i]==el) this.splice(i,1);
}


var __cCurrentCursor = "";
function SetCursor( cCursor )
{
	if( !cCursor )
	{
		RemoveClass(document.documentElement, __cCurrentCursor);
	}
	else
	{
		__cCurrentCursor = cCursor;
		if( !HasClass(document.documentElement, __cCurrentCursor) )
		{
			AddClass(document.documentElement, __cCurrentCursor);
		}
	}
}

if (typeof Number.prototype.toFixed!='function' || (.9).toFixed()=='0' || (.007).toFixed(2)=='0.00') Number.prototype.toFixed=function(f){
	if (isNaN(f*=1) || f<0 || f>20) f=0;
	var s='',x=this.valueOf(),m='';
	if (this<0){ s='-'; x*=-1; }
	if (x>=Math.pow(10,21)) m=x.toString();
	else{
		m=Math.round(Math.pow(10,f)*x).toString();
		if (f!=0){
			var k=m.length;
			if (k<=f){
				var z='00000000000000000000'.substring(0,f+1-k);
				m=z+m;
				k=f+1;
			}
			var a = m.substring(0,k-f);
			var b = m.substring(k-f);
			m = a+'.'+b;
		}
	}
	if (m=='0') s='';
	return s+m;
}

function AddEvent(o,e,fn)
{
	if (o.addEventListener){ o.addEventListener(e,fn,true);return true; }
	else if (o.attachEvent){ return o.attachEvent("on" + e, fn); }
	return false;
}


if(typeof HTMLElement!="undefined" && ! HTMLElement.prototype.insertAdjacentElement)
{
	HTMLElement.prototype.insertAdjacentElement = function(where,parsedNode)
	{
		switch (where)
		{
			case 'beforeBegin':
				this.parentNode.insertBefore(parsedNode,this)
				break;
			case 'afterBegin':
				this.insertBefore(parsedNode,this.firstChild);
				break;
			case 'beforeEnd':
				this.appendChild(parsedNode);
				break;
			case 'afterEnd':
				if (this.nextSibling) this.parentNode.insertBefore(parsedNode,this.nextSibling);
				else this.parentNode.appendChild(parsedNode);
				break;
		}
	}
}

/*Date*/

Date.prototype.DOW=function(el){
	// *** Removes an item from the Array by value (not index)
	switch(this.getDay()){
		case 0 : return "Sunday"; 		break;
		case 1 : return "Monday"; 		break;
		case 2 : return "Tuesday"; 		break;
		case 3 : return "Wednesday";	break;
		case 4 : return "Thursday"; 	break;
		case 5 : return "Friday"; 		break;
		case 6 : return "Saturday"; 	break;
		default: return "Not Set"; 		break;
	}
}

Date.prototype.MOY=function(el){
	// *** Removes an item from the Array by value (not index)
	switch(this.getMonth()){
		case 0  : return "January"; 	break;
		case 1  : return "February"; 	break;
		case 2  : return "March"; 		break;
		case 3  : return "April";		break;
		case 4  : return "May"; 		break;
		case 5  : return "June"; 		break;
		case 6  : return "July"; 		break;
		case 7  : return "August"; 		break;
		case 8  : return "September"; 	break;
		case 9  : return "October"; 	break;
		case 10 : return "November"; 	break;
		case 11 : return "December"; 	break;
		default: return "Not Set"; 		break;
	}
}

function getElementsByClassName(node, classname)
{
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}
Number.prototype.strZero = function( num ){
	for ( ret = this.toString() ; ret.length < num ;) ret = '0' + ret;
	return( ret );
}
String.prototype.padLeft = function( num, padChar ){
    if( padChar === undefined ){ padChar = " "; }
    if( padChar.length > 1 ){ padChar.substring(0,1); }
  	for ( ret = this; ret.length < num ;) {
  	    ret = padChar + ret;
  	}
	return( ret );
}
function addiFrame( s, p){
	if( s === undefined || p === undefined ){ return false; }
	var i = document.createElement( "iframe" );
	i.src = s;
	i.style.width = "100%";
	i.style.height = "100%";
	i.style.border = "solid 0px";
	p.style.padding = "0px";
	p.appendChild(i);
}


function renderDate(el, e)
{
	if(XAPDatePicker)
	{
		var evt = e || event;
		evt.src = evt.target || evt.srcElement
		var oPicker = new XAPDatePicker();
		oPicker.ParentElement = el;
		oPicker.Parent = null;
		oPicker.Event = evt;
	//	oPicker.Target = el;
		oPicker.Init();
	}
}
function renderDate2(el, eScroll, e)
{
	if(XAPDatePicker)
	{
		var evt = e || event;
		evt.src = evt.target || evt.srcElement
		var oPicker = new XAPDatePicker();
		oPicker.ParentElement = el;
		oPicker.Parent = null;
		oPicker.Event = evt;
		oPicker.bAdjustByScroll = true;
		oPicker.eScroll = eScroll;
	//	oPicker.Target = el;
		oPicker.Init();
	}
}

function createCookie(name,value,days)
{
    if (days)
        {
              var date = new Date();
                  date.setTime(date.getTime()+(days*24*60*60*1000));
                      var expires = "; expires="+date.toGMTString();
                        }
      else var expires = "";
        document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
    var nameEQ = name + "=";
      var ca = document.cookie.split(';');
        for(var i=0;i < ca.length;i++)
            {
                  var c = ca[i];
                      while (c.charAt(0)==' ') c = c.substring(1,c.length);
                          if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
                        }
          return null;
}

function eraseCookie(name)
{
    createCookie(name,"",-1);
}



function FindXY (el)
{
	var obj = el, x=0,y=0;
	while (obj!=null)
	{
		x	+=	obj.offsetLeft-obj.scrollLeft;
		y	+=	obj.offsetTop-obj.scrollTop;
		obj	=	obj.offsetParent;
	}
	return {x:x,y:y};
}



