//Enviroment
if (typeof console == 'undefined' || !console.info)
	var console = {
		log: function() {},
		warn: function() {
			var message = '';
			for (var i = 0; i < arguments.length; i++)
				if (typeof arguments[i] == 'string' || typeof arguments[i] == 'number')
					message += arguments[i] + ' ';
			window.status += message;
			},
		info: function() {},
		dir: function() {},
		dirxml: function() {},
		group: function() {},
		groupEnd: function() {}
	}
	
var ondomready = [];
var isDomReady = false;

function domReady() {
	isDomReady = true;
	for (var i in ondomready)
		if (typeof ondomready[i] == 'function')
			ondomready[i]();
}

//Shortcuts
function $(ele) {
	return document.getElementById(ele);
}

function $$(node, classname) {
	var a = [];
	var re = new RegExp('(^| )'+classname+'( |$)');
	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;
}

function $t(tag, node) {
	node = node ? node : document;
	return node.getElementsByTagName(tag);
}

//Browser Compatibility
if (typeof Element != 'undefined' && Element.__defineGetter__) {
    Element.prototype.__defineGetter__('innerText', function() { return this.textContent; });
    Element.prototype.__defineSetter__('innerText', function(value) { this.textContent = value; });
    Element.prototype.__defineGetter__('text', function() { return this.textContent; });
    Element.prototype.__defineSetter__('text', function(value) { this.textContent = value; });
}

if (typeof Event != 'undefined' && Event.__defineGetter__) {
    Event.prototype.__defineGetter__('srcElement', function() { return this.target; });
    Event.prototype.__defineSetter__('srcElement', function(value) { this.target = value; });
}

if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function(elt /*, from*/) {
		var len = this.length;

		var from = Number(arguments[1]) || 0;
		from = (from < 0) ? Math.ceil(from) : Math.floor(from);
		if (from < 0)
			from += len;
		
		for (; from < len; from++) {
			if (from in this && this[from] === elt)
				return from;
		}
		return -1;
	};
}


//Colour
var Colour = function(colour) {
    var _hex = new RegExp(/^#[0-9a-fA-F]{6}$/);
    var _rgb = new RegExp(/^rgb\([0-9]*,[0-9]*,[0-9]*\)$/);
    
    this.setHex = function(hex) {
        colour = hex.match(new RegExp(/[0-9a-fA-F]{6}/));

        this.r = parseInt(colour[0].substr(0, 2),16);
        this.g = parseInt(colour[0].substr(2, 2),16);
        this.b = parseInt(colour[0].substr(4, 2),16);
    }
    
    this.getHex = function() {
        var ret = '#';
        var r = (this.r-0).toString(16);
        var g = (this.g-0).toString(16);
        var b = (this.b-0).toString(16);
        
        ret += (r.length == 1) ? '0' + r : r;
        ret += (g.length == 1) ? '0' + g : g;
        ret += (b.length == 1) ? '0' + b : b;
        
        return ret;
    }
    
    this.setRGB = function(rgb) {
        colour = rgb.match(new RegExp(/[0-9]*,[0-9]*,[0-9]*/));
        colour = colour[0].split(/,/);
        
        this.r = colour[0];
        this.g = colour[1];
        this.b = colour[2];
    }
    
    this.getRGB = function() {
        return 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';
    }
    
    this.r = 0;
    this.g = 0;
    this.b = 0;
    
    if (arguments.length == 3)
    {
        this.r = arguments[0];
        this.g = arguments[1];
        this.b = arguments[2];
    }
    else if (_hex.test(colour))
        this.setHex(colour);
    else if (_rgb.test(colour))
        this.setRGB(colour);
}

//k3r
var k3r = function() {
	return {
		attach : function(element, ev, func) {
			if (element.addEventListener)
			{
				element.addEventListener(ev, func, false);
			}
			else if (element.attachEvent)
			{
				element.attachEvent('on' + ev, func);
			}
		},
		detach : function(element, ev, func) {
			if (element.removeEventListener)
			{
				element.removeEventListener(ev, func, false);
			}
			else if (element.detachEvent)
			{
				element.detachEvent('on' + ev, func);
			}
		},
		rightTrim: function(string, trim) {
			while (string.substring(string.length-trim.length, string.length) == trim)
				string = string.substring(0,string.length-trim.length);

			return string;
		},
		depixelate: function(value) {
			value = (typeof value == 'undefined') ? '0' : value;
			value = value == '' ? '0' : value;
			value = k3r.rightTrim(value, 'px');
			value = parseInt(value);
			if (isNaN(value))
				value = 0;
			return value;
		},
		now: function() {
			var now = new Date();
			var day = now.getDate() + '/';
			var month = (now.getMonth() + 1) + '/';
			
			if (day.length < 3)
				day = '0' + day;
			
			if (month.length < 3)
				 month = '0' + month;
			
			return day + month + now.getFullYear();
		},
		internalEvent: function(func, obj) {
			return function(e) {
				e = e||window.event;
				return (obj[func](e, this));
			}
		},
		fireEvent: function(ev, obj, e) {
			if (obj[ev]) {
				ev = obj[ev];

				if (typeof ev == 'function') {
					ev.call(obj, e);
				}
				else if (typeof ev == 'object') {
					for (var i in ev) {
						if (typeof ev[i] == 'function' && i != 'indexOf') {
							ev[i].call(obj, e);
						}
					}
				}
			}
		},
		addClass: function(value, obj) {
			var list = obj.getAttribute('class') || obj.getAttribute('className') || '';

			if (list != '')
			{
				var arr = list.split(' ');
				var found = false;
				
				for (var i=0; i<arr.length; i++)
					if (arr[i] == value)
					{
						found = true;
						break;
					}
				
				if (!found)
					list += ' ' + value;
			}
			else list = value;
			
			obj.setAttribute('class', list);
			obj.setAttribute('className', list);
		},
		removeClass: function(value, obj) {
			var list = obj.getAttribute('class') || obj.getAttribute('className') || '';
			
			if (list != '' || list != value) {
				var arr = list.split(' ');
				list = '';
				
				for (var i=0; i<arr.length; i++)
					if (arr[i] != value)
					{
						list += arr[i];
						
						if (i != (arr.length-1))
							list += ' ';
					}
			}
			else list = '';
			
			obj.setAttribute('class', list);
			obj.setAttribute('className', list);
		},
		replaceClass: function(before, after, obj) {
			var list = obj.getAttribute('class') || obj.getAttribute('className') || '';
			var found = false;
			
			if (list != '' || list != before || list != after) {
				var arr = list.split(' ');
				list = '';
				
				for (var i=0; i<arr.length; i++) {
					if (!found && (arr[i] == before || arr[i] == after)) {
						list += after;
						found = true;
					}
					else list += arr[i];
						
					if (i != (arr.length-1))
						list += ' ';
				}
				
				if (!found)
					list += ' ' + after;
			}
			else list = after;
			
			obj.setAttribute('class', list);
			obj.setAttribute('className', list);
		},
		number: function(value) {
			if (typeof value == 'string') {
				return Number(value.replace(/[^0-9\.\-]/g, ''));
			}
			else if (typeof value == 'number') {
				return value;
			}
			else {
				return null;
			}
		},
		isDate: function(value) {
			var regex = new RegExp(/^\d{1,2}\/\d{1,2}\/[1-9](\d{3,3}|\d)$/);
			if (typeof value == 'string' && value.match(regex)) {
				var date = value.split('/');
				
				if (date.length == 3) {
					if (Number(date[0]) == 0 || Number(date[0]) > 31) {
						return false;
					}
					if (Number(date[1]) == 0 || Number(date[1]) > 12) {
						return false;
					}
				}
				else
					return false;
			}
			else
				return false;
			
			return true;		 
		},
		isYear: function(value) {
			var regex = new RegExp(/\d{4}/);
			if (typeof value == 'string' && value.match(regex)) {
				return true;
			}
			else {
				return false;
			}
		},
		enableButton: function(button, bool) {
			if (typeof button.state == 'undefined') {
				button.state = new Array();
			}
			
			if (bool) {
				button.setAttribute('href', button.state['href']);
				button.onclick = button.state['onclick'];
				k3r.removeClass('disabled', button);
			}
			else {
				button.state['href'] = button.getAttribute('href');
				button.state['onclick'] = button.onclick;
				button.onclick = function() {return false;};
				k3r.addClass('disabled', button);
			}
		},
		setInner: function(node, text) {
			if (typeof node == 'undefined') {
				return false;
			}

			var chdn = new Array();

			for (var i = 0; i < node.childNodes.length; i++) {
				var c = node.childNodes[i];

				if (c.nodeType == 1 || c.nodeType == 3) {
					chdn.push(c);
				}
			}

			for (var i = 0; i < chdn.length; i++) {
				var c = chdn[i];
				node.removeChild(c);
			}
			
			for (var i = 1; i < arguments.length; i++) {
				var arg = arguments[i];
				
				switch (typeof arg) {
					case 'string':
						node.appendChild(document.createTextNode(arg));
						break;
					case 'object':
						if (arg.nodeType && (arg.nodeType == 1 || arg.nodeType == 3)) {
							node.appendChild(arg);
						}
						break;
				}
			}
		}
	}
}();

//Display
k3r.dsply = function() {
	return {
		clientHeight: function() {
			if (window.innerHeight)
				return window.innerHeight;
			if (document.documentElement.clientHeight)
				return document.documentElement.clientHeight;
			if (document.body.clientHeight)
				return document.body.clientHeight;
		},
		clientWidth: function() {
			if (window.innerWidth)
				return window.innerWidth;

			if (document.documentElement.clientWidth)
				return document.documentElement.clientWidth;
				
			if (document.body.clientWidth)
				return document.body.clientWidth;
		},
		xCenter: function(offset) {
			var result = k3r.dsply.clientHeight() / 2;
			result -= offset / 2;
			result += document.documentElement.scrollTop || document.body.scrollTop;
			return (result < 0) ? 0 : result;
		},
		yCenter: function(offset) {
			var result = k3r.dsply.clientWidth() / 2;
			result -= offset / 2;
			result += document.documentElement.scrollLeft || document.body.scrollLeft;
			return (result < 0) ? 0 : result;
		},
		objTop: function(obj) {
			var result = obj.offsetTop;			
			var parent = obj.offsetParent;
			
			while (parent && typeof parent.offsetTop == 'number') {
				if (parent.nodeName != 'HTML') {
					result += parent.offsetTop;
					result += parent.clientTop ? parent.clientTop : 0;
					
					if (parent.currentStyle && parent.currentStyle.borderStyle != 'none'
						&& parent.offsetWidth == k3r.depixelate(parent.currentStyle.width)) {
						result -= k3r.depixelate(parent.currentStyle.borderWidth) || 0;
					}
				}
				parent = parent.offsetParent;
			}
			return result;
		},
		objLeft: function(obj) {
			var result = obj.offsetLeft;
			var parent = obj.offsetParent;
			
			while (parent && typeof parent.offsetLeft == 'number') {
				if (parent.nodeName != 'HTML') {
					result += parent.offsetLeft;
					result += parent.clientLeft ? parent.clientLeft : 0;

					if (parent.currentStyle && parent.currentStyle.borderStyle != 'none'
						&& parent.offsetWidth == k3r.depixelate(parent.currentStyle.width)) {
						result -= k3r.depixelate(parent.currentStyle.borderWidth) || 0;
					}
				}
				parent = parent.offsetParent;
			}
			return result;
		}
	}
}();

k3r.dsply.prototype = {

}

//Animation
k3r.animt = {}

k3r.animt.fade = function(ele, start, end, speed, func)
{
	//Width property must be set on target element to work in IE.
    if(ele && start != end)
    {
        var doFade = function(ele, step, speed, end)
        {
            if (start < end) {
				if (ele.style.opacity < ((end/100)-(speed/100))) {
	                step += speed;

		            ele.style.opacity = (step/100);
			        ele.style.filter = 'alpha(opacity=' + step + ')';
			        
					setTimeout(function() { doFade(ele, step, speed, end);}, 10);
				}
				else {
					if (ele.style.opacity != (end/100)) {
						ele.style.opacity = (end/100);
						ele.style.filter = 'alpha(opacity=' + end + ')';
					}
				}
            }
            else {
				if (ele.style.opacity > ((end/100)+(speed/100))) {
					step -= speed;
					
					ele.style.opacity = (step/100);
					ele.style.filter = 'alpha(opacity=' + step + ')';
	                
					setTimeout(function() { doFade(ele, step, speed, end);}, 10);
				}
				else {
					if (ele.style.opacity != (end/100)) {
						ele.style.opacity = (end/100);
						ele.style.filter = 'alpha(opacity=' + end + ')';
					}
					
					ele.style.visibility = 'hidden';
				}
            }
            
            if (typeof func == 'function' && ele.style.opacity == (end/100)) {
				func();
			}			
        }
            
        ele.style.opacity = (start/100);
        ele.style.filter = 'alpha(opacity=' + start + ')';
        ele.style.visibility = 'visible';
        doFade(ele, start, speed, end);
    }
}

k3r.animt.morph = function(ele, attrib, start, end, step, delay) {
    if (!start.setRGB)
        start = new Colour(start);
    
    if (!end.setRGB)
        end = new Colour(end);
        
    if (start.getHex() != end.getHex())
    {
        if (!step)
            step = 1;
        
        if (!delay)
            delay = 10;
        
        var doMorph = function() {
            if (start.r < end.r)
                start.r = ((start.r + step) < end.r) ? (start.r + step) : end.r;
            else start.r = ((start.r - step) > end.r) ? (start.r - step) : end.r;
            
            if (start.g < end.g)
                start.g = ((start.g + step) < end.g) ? (start.g + step) : end.g;
            else start.g = ((start.g - step) > end.g) ? (start.g - step) : end.g;
            
            if (start.b < end.r)
                start.b = ((start.b + step) < end.b) ? (start.b + step) : end.b;
            else start.b = ((start.b - step) > end.b) ? (start.b - step) : end.b;
            
            ele.style[attrib] = start.getHex();
            //ele.innerText = ele.style[attrib];
            
            if (start.getHex() != end.getHex())
                setTimeout(doMorph, delay);
        }
        
        ele.style[attrib] = start.getHex();
        doMorph();
    }
}

k3r.animt.move = function(ele, attrib, start, end, step, delay) {
    if (start != end)
    {
        if (!step)
            step = 2;
        
        if (!delay)
            delay = 10;
        
        var doMove = function() {
            if (start < end)
                start = ((start + step) < end) ? (start + step) : end;
            else start = ((start - step) > end) ? (start - step) : end;
            
            ele.style[attrib] = start + 'px';
            
            if (start != end)
                setTimeout(doMove, delay);
        }
        
        ele.style[attrib] = start + 'px';
        doMove();
    }
}

//XMLHTTP
k3r.ajax = {}

k3r.ajax.createXHR = function()
{
	//alert('createXHR');
	try { return new XMLHttpRequest(); } catch(e) {}
	try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
	try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
	return null;
}

k3r.ajax.getPage = function(location, parser)
{
	//alert('getResponse');
	var xhr = k3r.ajax.createXHR();
	
	if (xhr != null)
	{
		//alert('xhr != null');
		xhr.open('GET', location, true);
		xhr.onreadystatechange = function()
		{
			//alert(xhr.readyState);
			if (xhr.readyState == 4)
			{
			    parser.call(this, xhr.responseText, xhr.status);
			}
		}
		xhr.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT");
		xhr.send(null);
	}
}

k3r.ajax.invokeWebService = function(location, message, parser, obj)
{
	var xhr = k3r.ajax.createXHR();
	var src = arguments[3];
	
	if (xhr != null)
	{
		xhr.open('POST', location, true);
		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4) {
				console.info(xhr.status);
				parser.call(obj||this, xhr, xhr.status, src);
			}
		}
		
		xhr.send(message);
	}
}
