if (!CKW) {
var CKW = function(){};
}

CKW.Util =
{
flash_timer: null,

trim: function(str)
{
if (str) {
return str.replace(/^\s+|\s+$/g, '');
}
return false;
},

mask: function(elm, mask, percentage)
{
var hidden_elm = CKW.DOM.id(elm);
var mask_elm = CKW.DOM.id(mask);
hidden_elm.style.zIndex = 0;
mask_elm.style.zIndex = 1;
CKW.setTransparency(mask, percentage);
},

unmask: function(elm, mask)
{
var hidden_elm = CKW.DOM.id(elm);
var mask_elm = CKW.DOM.id(mask);
hidden_elm.style.zIndex = 1;
mask_elm.style.zIndex = -1;
CKW.setTransparency(mask, 100);
},

hideSelects: function(id)
{
var elm = CKW.DOM.id(id);
elm.onmouseover = function()
{
var selects = CKW.tags("select");
for (var i = 0; i < selects.length; i++) {
selects[i].style.visibility = "hidden";
}
};
elm.onmouseout = function()
{
var selects = CKW.tags('select');
for (var i = 0; i < selects.length; i++) {
selects[i].style.visibility = "visible";
}
}
},

hideFlash: function(id)
{
var elm = CKW.DOM.id(id);
elm.onmouseover = function()
{
clearTimeout(CKW.flash_timer);
var flashes = CKW.tags('div');
for (var i = 0; i < flashes.length; i++) {
if (flashes[i].className == 'ckw-flash') {
flashes[i].style.visibility = "hidden";
}
}
};
elm.onmouseout = function()
{
CKW.flash_timer = window.setTimeout('CKW.showFlash()', 600);
};
},

showFlash: function()
{
var flashes = CKW.tags('div');
for (var j = 0; j < flashes.length; j++) {
if (flashes[j].className == 'ckw-flash') {
flashes[j].style.visibility = "visible";
}
}
clearTimeout(CKW.flash_timer);
},

includeFlash: function(id, swf_file, width, height, version, bg_color)
{
var elm = CKW.DOM.id(id);
if (elm) {
var swf = new SWFObject(swf_file, id + "_swf", width, height, version, bg_color);
swf.write(id);
}
},

toggleContent: function(show, hide, display_type)
{
if (!display_type) {
display_type = 'block';
}
var hide_elm = CKW.DOM.id(hide);
if (hide_elm) {
hide_elm.style.display = 'none';
}
if (show) {
var show_elm = CKW.DOM.id(show).style.display = display_type;
}
},

toggleTextfieldMessage: function(id, message)
{
var field = CKW.DOM.id(id);
field.onfocus = function()
{
if (this.value == message) {
this.value = '';
return;
}
};
field.onblur = function()
{
if (this.value == '') {
this.value = message;
return;
}
}
},

/**
* Sets the transparency of an element
*
* @var string id      - id of the element to make semi-transparent
* @var int percentage - the percentage transparency
*/
setTransparency: function(id, percentage)
{
var mask = CKW.DOM.id(id);
mask.style.KHTMLOpacity = percentage / 100;
mask.style.MozOpacity = percentage / 100;
mask.style.opacity = percentage / 100;
mask.style.filter = "alpha(opacity:" + percentage + ")";
},

/**
* Redirects directly from a select control without clicking a submit button.
* @var string id  - id of the select element
*
* NOTE: It's assumed that the values of the selects option fields are url's
*/
selectRedirect: function(id, new_window)
{
var select = CKW.DOM.id(id);
select.onchange = function()
{
var url = this.options[this.selectedIndex].value;
if (url) {
if (new_window) {
window.open(url, '_blank');
} else {
window.location = url;
}
}
}
},

blurAnchors: function(id)
{
if (!id) {
id = document;
} else {
id = CKW.DOM.id(id);
}
var tags = CKW.tags("a");
if (tags.length > 0) {
for (var i = 0; i < tags.length; i++) {
tags[i].onfocus = function(){this.blur()};
}
}
},

blurInputs: function(id)
{
if (!id) {
id = document;
} else {
id = CKW.DOM.id(id);
}
var tags = CKW.tags("input");
if (tags.length > 0) {
for (var i = 0; i < tags.length; i++) {
tags[i].onclick = function(){this.style.outline = 0;};
}
}
},

setNewWindowLinks: function(class_name)
{
if (!class_name) {
class_name = 'ckw_new_win';
}
var tags = CKW.DOM.tags('a');
var re = new RegExp(class_name);
if (tags.length > 0) {
for (var i = 0; i < tags.length; i++) {
if (tags[i].className.search(re) != -1) {
tags[i].onclick = function()
{
window.open(this.href, '_blank');
return false;
}
}
}
}
},

setBackLinks: function(class_name)
{
if (!class_name) {
class_name = 'ckw_back';
}
var tags = CKW.DOM.tags('a');
var re = new RegExp(class_name);
if (tags.length > 0) {
for (var i = 0; i < tags.length; i++) {
if (tags[i].className.search(re) != -1) {
tags[i].onclick = function()
{
window.history.go(-1);
return false;
}
}
}
}
},

loadAudioPlayer: function(url, width, height, autostart, showcontrols, showstatusbar, elm)
{
if (navigator.userAgent.toLowerCase().indexOf("windows") != -1) {
	var type = "application/x-mplayer2";
} else {
var type = "audio/mpeg"
}

var player = "";
player += "<object width='" + width + "' height='" + height + "' id='os_player'>";
player += "<param name='type' value='" + type + "'>";
player += "<param name='src' value='" + url + "'>";
player += "<param name='showstatusbar' value='" + showstatusbar + "'>";
player += "<param name='autostart' value='" + autostart + "'>";
player += "<param name='showcontrols' value='" + showcontrols + "'>";
player += "<embed id='audio-player' src ='" + url + "' type='" + type + "' showcontrols='" + showcontrols + "' autoplay='true' autostart='" + autostart + "' width='" + width + "' height='" + height + "' controller='1' showstatusbar='" + showstatusbar + "'></embed>";
player += "</object>";

CKW.DOM.setContent(elm, player);

},

stylesheets: function()
{
return document.styleSheets[0]
}

}

var $U = CKW.Util;

CKW.DOM =
{
id: function(id)
{
return document.getElementById(id);
},

appendClass: function(elm, className)
{
elm = CKW.DOM.getElement(elm);
if (elm.className != undefined) {
elm.className = elm.className + " " + className;
}
},

removeClass: function(elm, className)
{
elm = CKW.DOM.getElement(elm);
if (elm.className != undefined) {
elm.className = elm.className.replace(new RegExp("(^|\\s)" + className + "(\\s|$)"), "");
}
},

hasClass: function(elm, className)
{
elm = CKW.DOM.getElement(elm);
if (elm.className == className) {
return true;
} else {
var classes = elm.className.split(" ");
for (var i = 0, len = classes.length; i < len; i++) {
if (className == classes[i]) {
return true;
}
}
}
return false;
},

tags: function(tagName, elm)
{
if (!elm) {
elm = document;
} else {
elm = CKW.DOM.getElement(elm);
}
return elm.getElementsByTagName(tagName);
},

className: function(className, root)
{
if (!root) {
root = document;
}
var tags = [];
for(var elm = root.firstChild; elm != null; elm = elm.nextSibling) {
if (elm.nodeType == 1) {
if (CKW.DOM.hasClass(elm, className)) {
tags.push(elm);
}
if (elm.hasChildNodes()) {
var childTags = CKW.DOM.className(className, elm);
if (childTags) {
for (var i = 0; i < childTags.length; i++) {
tags.push(childTags[i]);
}
}
}
}
}
return tags;
},

classTags: function(tagName, className, root)
{
if (!root) {
root = document;
}
var tagSet = CKW.DOM.tags(tagName, root);
var tags = [];
for (var i = 0; i < tagSet.length; i++) {
if (CKW.DOM.hasClass(tagSet[i], className)) {
tags.push(tagSet[i]);
}
}
return tags;
},

setContent: function(elm, content)
{
elm = CKW.DOM.getElement(elm);
if (elm) {
elm.innerHTML = content;
return true;
}
return false;
},

getContent: function(elm)
{
elm = CKW.DOM.getElement(elm);
var content = elm.innerHTML;
if (content != undefined) {
return content;
} else {
return "";
}
},

deleteContent: function(elm)
{
elm = CKW.DOM.getElement(elm);
if (elm) {
elm.innerHTML = "";
return true;
}
return false;
},

reOrderElements: function(id, new_order)
{
var parent = document.getElementById(id);
var children = [];
for(var child = parent.firstChild; child != null; child = child.nextSibling) {
if (child.nodeType == 1) {
children.push(child);
}
}
for (var i = 0; i < new_order.length; i++) {
parent.appendChild(children[new_order[i]]);
}
},

getElement: function(elm)
{
if (typeof(elm) == 'string') {
return CKW.DOM.id(elm);
} else if (elm) {
return elm;
}
return false;
},

remove: function(elm)
{
elm = CKW.DOM.getElement(elm);
if (elm) {
return elm.parentNode.removeChild(elm);
}
return false;
},

makeLastChild: function(elm)
{
elm = CKW.DOM.getElement(elm);
if (elm) {
return elm.parentNode.appendChild(elm);
}
return false;
},

insertBefore: function(before, elm)
{
before = CKW.DOM.getElement(before);
elm = CKW.DOM.getElement(elm);
if (before && elm) {
return before.parentNode.insertBefore(elm, before);
}
return false;
},

replace: function(oldNode, newNode)
{
newNode = CKW.DOM.getElement(newNode);
oldNode = CKW.DOM.getElement(oldNode);
if (newNode && oldNode) {
return oldNode.parentNode.replaceChild(newNode, oldNode);
}
return false;
},

create: function(tag, attributes)
{
var elm = document.createElement(tag);
if (attributes) {
for (att in attributes) {
if (att == 'content') {
CKW.DOM.setContent(elm, attributes[att]);
} else if (att == 'id') {
elm.id = attributes[att];
} else if (att == 'className') {
elm.className = attributes[att];
} else {
elm.style[att] = attributes[att];
}
}
}
return elm;
},

getChildren: function(parent) {
var children = [];
if (parent) {
for(var child = parent.firstChild; child != null; child = child.nextSibling) {
if (child.nodeType == 1) {
children.push(child);
}
}
}
return children;
}

}

CKW.DOM.htmlTag = CKW.DOM.tags('html')[0];
var $D = CKW.DOM;


CKW.Event = function(){};

CKW.Event.listen = function() {
if (window.addEventListener) {
return function(elm, type, func) {
elm = CKW.DOM.getElement(elm);
if (elm) {
elm.addEventListener(type, func, false);
}
};
} else if (window.attachEvent) {
return function(elm, type, func) {
elm = CKW.DOM.getElement(elm);
if (elm) {
elm.func = function() {
func.call(elm, window.event);
};
elm.attachEvent('on' + type, elm.func);
}
};
}
return false;
}();

CKW.Event.ignore = function() {
if (window.removeEventListener) {
return function(elm, type, func) {
elm = CKW.DOM.getElement(elm);
if (elm) {
elm.removeEventListener(type, func, false);
}
};
} else if (window.detachEvent) {
return function(elm, type, func) {
elm = CKW.DOM.getElement(elm);
if (elm) {
elm.detachEvent('on' + type, elm.func);
elm.f = null;
}
};
}
return false;
}();


CKW.Event.cancel = function()
{
if (window.detachEvent) {
return function(e)
{
e = window.event;
e.cancelBubble = true;
};
} else {
return function(e)
{
e.stopPropagation();
};
}
}();

CKW.Event.kill = function()
{
if (window.detachEvent) {
return function(e)
{
e = window.event;
e.cancelBubble = true;
e.returnValue = false;
};
} else {
return function(e)
{
e.preventDefault();
e.stopPropagation();
};
}
}();

CKW.Event.onDomload = function()
{
/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
return function(func)
{
document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
if (this.readyState == "complete") {
func(); // call the onload handler
}
};
return;
};
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff

return function(func)
{
var _timer = setInterval(function() {
if (/loaded|complete/.test(document.readyState)) {
clearInterval(_timer);
func(); // call the onload handler
}
}, 10);
return;
};
}

/* for Mozilla/Opera9 */
if (document.addEventListener) {
return function(func)
{
document.addEventListener("DOMContentLoaded", func, false);
return;
};
}

/* for other browsers */
return function(func)
{
CKW.Event.onload(func);
};

}();

CKW.Event.onload = function(func)
{
CKW.Event.listen(window, 'load', func);
};

CKW.Event.get = function(e)
{
var evt = (e) ? e : ((window.event) ? event : null);
var type = (evt.button) ? evt.button : null;
var target = e.target || e.srcElement;
return {e: evt, type: type, target: target};
};

CKW.Event.getTarget = function(e)
{
var target = e.target || e.srcElement;
if (target.nodeType == 3) {
target = target.parentNode;
}
return target;
};

CKW.Event.getCoordinates = function(e)
{
coords = {left:0, top:0};
if (e.pageX) {
coords.left = e.pageX;
coords.top = e.pageY;
} else if (e.clientX) {
coords.left = e.clientX + document.body.scrollLeft - document.body.clientLeft;
coords.top = e.clientY + document.body.scrollTop - document.body.clientTop;

// include html element space, if applicable
if (document.body.parentElement && document.body.parentElement.clientLeft) {
var bodParent = document.body.parentElement;
coords.left += bodParent.scrollLeft - bodParent.clientLeft;
coords.top += bodParent.scrollTop - bodParent.clientTop;
}
}
return coords;
};

var $E = CKW.Event;

CKW.FX =
{
fadeIn: function(elm, params)
{
CKW.FX.setTransparency(elm, 0);
elm = CKW.DOM.getElement(elm);
if (!params) {
params = {time: 1, opacity: 10};
} else {
if (!params.time) {
params.time = 1;
}
if (!params.opacity) {
params.opacity = 10;
}
}
var opacity = 0;
elm.style.display = 'block';
var ticker = setInterval(
function()
{
if(opacity < 100) {
opacity += params.opacity;
CKW.FX.setTransparency(elm, opacity);
} else {
CKW.FX.cancelTicker(ticker);
}
},
params.time
);
},

fadeOut: function(elm, params)
{
elm = CKW.DOM.getElement(elm);
if (!params) {
params = {time: 1, opacity: 20};
} else {
if (!params.time) {
params.time = 1;
}
if (!params.opacity) {
params.opacity = 10;
}
}
var opacity = 100;
var ticker = setInterval(
function()
{
if(opacity > 0) {
opacity -= params.opacity;
CKW.FX.setTransparency(elm, opacity);
} else {
CKW.FX.cancelTicker(ticker, elm);
}
},
params.time
);
},

cancelTicker: function(ticker, elm)
{
clearInterval(ticker);
if (elm) {
elm.style.display = 'none';
}
},

/**
* Sets the transparency of an element
*
* @var string id      - id of the element to make semi-transparent
* @var int percentage - the percentage transparency
*/
setTransparency: function(id, percentage)
{
id = CKW.DOM.getElement(id);
id.style.KHTMLOpacity = percentage / 100;
id.style.MozOpacity = percentage / 100;
id.style.opacity = percentage / 100;
id.style.filter = "alpha(opacity:" + percentage + ")";
},

toggleWidth: function(elm, params)
{
elm = $D.getElement(elm);
if (!elm.ckwFxOpen) {
CKW.FX.widen(elm, {add: params.show});
} else {
CKW.FX.narrow(elm, {subtract: params.show});
}
},

widen: function(elm, params)
{
elm = CKW.DOM.getElement(elm);
if (!params.step) {
params.step = 10;
}
var start = elm.offsetWidth;
var finish = elm.offsetWidth + params.add;
var tmp = start;
var ticker = setInterval(
function()
{
if(tmp < finish) {
tmp += params.step;
elm.style.width = parseInt(tmp) + "px";
} else {
if (params.ease) {
CKW.FX.widen(elm, {add: 10, step: 2});
CKW.FX.narrow(elm, {subtract: 10, step: 2});
}
CKW.FX.cancelTick(ticker);
elm.ckwFxOpen = true;
}
},
1
);
},

cancelTick: function(ticker)
{
clearInterval(ticker);
},

narrow: function(elm, params)
{
elm = CKW.DOM.getElement(elm);
if (!params.step) {
params.step = 10;
}
var start = elm.offsetWidth;
var finish = elm.offsetWidth - params.subtract;
var tmp = start;
var ticker = setInterval(
function()
{
if(tmp > finish) {
tmp -= params.step;
elm.style.width = parseInt(tmp) + "px";
} else {
if (params.ease) {
CKW.FX.narrow(elm, {subtract: 10, step: 2});
CKW.FX.widen(elm, {add: 10, step: 2});
}
CKW.FX.cancelTick(ticker);
elm.ckwFxOpen = false;
}
},
1
);
},

toggleHeight: function(elm, params)
{
elm = $D.getElement(elm);
if (!elm.ckwFxOpen) {
CKW.FX.lengthen(elm, {add: params.show});
} else {
CKW.FX.shorten(elm, {subtract: params.show});
}
},

lengthen: function(elm, params)
{
elm = CKW.DOM.getElement(elm);
if (!params.step) {
params.step = 10;
}
var start = elm.offsetHeight;
var finish = elm.offsetHeight + params.add;
var tmp = start;
var ticker = setInterval(
function()
{
if(tmp < finish) {
tmp += params.step;
elm.style.height = parseInt(tmp) + "px";
} else {
if (params.ease) {
CKW.FX.lengthen(elm, {add: 10, step: 2});
CKW.FX.shorten(elm, {subtract: 10, step: 2});
}
CKW.FX.cancelTick(ticker);
elm.ckwFxOpen = true;
}
},
1
);
},

shorten: function(elm, params)
{
elm = CKW.DOM.getElement(elm);
if (!params.step) {
params.step = 10;
}
var start = elm.offsetHeight;
var finish = elm.offsetHeight - params.subtract;
var tmp = start;
var ticker = setInterval(
function()
{
if(tmp > finish) {
tmp -= params.step;
elm.style.height = parseInt(tmp) + "px";
} else {
if (params.ease) {
CKW.FX.shorten(elm, {subtract: 10, step: 2});
CKW.FX.lengthen(elm, {add: 10, step: 2});
}
CKW.FX.cancelTick(ticker);
elm.ckwFxOpen = false;
}
},
1
);
},

grow: function(elm, params)
{
// get width and height

},

shrink: function(elm, params)
{
// get width and height

}
}

var $F = CKW.FX;

CKW.Element = function(){};

CKW.Element.getPosition = function(elm)
{
elm = CKW.DOM.getElement(elm);
if (elm) {
var left = 0;
var top = 0;
if (elm.offsetParent) {
var el = elm;
left = el.offsetLeft
top = el.offsetTop
while (el) {
el = el.offsetParent;
if (el) {
left += el.offsetLeft
top += el.offsetTop
}
}
}
return {left: left, top: top};
}
return false;
};

/*
CKW.Element.dragDrop = function(elm)
{
this.elm = CKW.DOM.getElement(elm);
this.startX = 0;
this.startY = 0;
this.endX = 0;
this.endY = 0;
var self  = this;
CKW.Event.listen(this.elm, 'mousedown', function(e){self.startDrag(e)});
};

CKW.Element.dragDrop.prototype =
{
startDrag: function(e)
{
var coords = CKW.Event.getCoordinates(e);
this.startX = coords.x;
this.startY = coords.y;
var func = function(e){self.drag(e)};
$R.set('el-sd', func);
CKW.Event.listen(this.elm, 'mousemove', func);
},

drag: function()
{

CKW.Event.stopListening(this.elm, 'mousedown', $R.set('el-sd');
CKW.Event.listen(this.elm, 'mouseup', function(e){self.endDrag(e)});
},

endDrag: function()
{
CKW.Event.stopListening(this.elm, 'mousedown', $R.set('el-sd'),
var func = function(e){self.drag(e)};
$R.set('el-sd', func);
CKW.Event.listen(this.elm, 'mousemove', func);
}
};

*/

var $EL = CKW.Element;

CKW.Form = function(){};
$Form = CKW.Form;

CKW.Form.Select = function(id, val, key){
this.field = $D.id(id);
if (!this.field) {
this.field = $D.create('select', {'id': id});
}
this.value = "";
this.index = 0;
if (val != undefined) {
if (key) {
this.setBlank(val, key);
} else {
this.setBlank(val);
}
}
}

CKW.Form.Select.prototype = {

setBlank: function(val, key){
this.blankVal = val;
if (key) {
this.blankKey = key;
}
},

disable: function(){
	    this.field.disabled = 'disabled';
},

clear: function(){
for (var i = this.field.options.length; i > -1; i--) {
this.field.remove(i);
}
},

loading: function(){
this.clear();
this.populate({'false':'Loading...'}, true);
this.disable();
},

populate: function(data, ignoreBlank){
if (!ignoreBlank && this.blankVal != undefined && this.blankKey != undefined) {
this.field.options[0] = new Option(this.blankVal, this.blankKey);
var i = 1;
} else if (!ignoreBlank && this.blankVal != undefined) {
this.field.options[0] = new Option(this.blankVal);
var i = 1;
} else {
var i = 0;
}
for (key in data) {
this.field.options[i] = new Option(data[key], key);
i++;
}
},

enable: function(){
this.field.disabled = '';
},

getValue: function(){
this.value = this.field.options[this.field.selectedIndex].value;
return this.value;
},

setValue: function(key){
for (var i = 0, len = this.field.options.length; i < len; i++) {
	        if (this.field.options[i].value == key) {
this.field.selectedIndex = i;
return true;
}
};
return false;
},

getIndex: function(){
this.index = this.field.selectedIndex;
return this.index;
},

listen: function(func, action){
if (!action) {
action = 'change';
}
$E.listen(this.field, action, function(){func()});
},

appendTo: function(id){
$D.id(id).appendChild(this.field);
},

setStyle: function(style, value){
eval("this.field.style." + style + " = '" + value + "'");
},

reset: function(){
this.field.selectedIndex = 0;
},

formatAndPopulate: function(data, separator1, separator2){
if (!separator1) {
separator1 = "||";
}
if (!separator2) {
separator2 = "|";
}
var options = data.split(separator1);
var tmp = {};
		for (var i = 1, len = options.length + 1; i < len; i++) {
var parts = options[i - 1].split(separator2);
tmp[parts[0]] = parts[1];
		};
this.populate(tmp);
},

show: function(){
this.setStyle('display', 'default');
},

hide: function(){
this.setStyle('display', 'none');
}
}

CKW.Widgets = function(){};

CKW.Widgets.Tooltip = function(elm, text, params)
{
this.elm = CKW.DOM.getElement(elm);
this.fadeInTime = 100;
this.fadeOutTime = 100;
this.offsetTop = 20;
this.offsetLeft = 0;
this.params = params;
var self = this;
this.html = CKW.DOM.create('div');
this.html.className = "ckw-tooltip";
this.html.style.position = 'absolute';
CKW.DOM.setContent(this.html, text);
this.timer = null;
this.visible = false;
CKW.Event.listen(this.elm, 'mouseover', function(e){self.show(e)});
CKW.Event.listen(this.elm, 'mouseout', function(){self.remove()});
};

CKW.Widgets.Tooltip.prototype =
{
show: function(e)
{
clearTimeout(this.timer);
if (!this.visible) {
//var coords = CKW.Event.getCoordinates(e);
this.elm.position = CKW.Element.getPosition(this.elm);
this.html.style.display = 'none';
//alert(this.params.top);
this.html.style.left = this.elm.position.left + this.offsetLeft + parseInt(this.params.left) + "px";
this.html.style.top = this.elm.position.top + this.offsetTop + parseInt(this.params.top) + "px";
this.elm.parentNode.appendChild(this.html);
this.timer = setTimeout(function(){CKW.FX.fadeIn(self.html)}, this.fadeInTime);
var self = this;
CKW.Event.listen(self.html, 'mouseover', function(){
clearTimeout(self.timer);
self.visible = true;
});
CKW.Event.listen(self.html, 'mouseout', function(){self.remove()});
}

},

remove: function()
{
var self = this;
clearTimeout(self.timer)
this.timer = setTimeout(function(){CKW.FX.fadeOut(self.html); self.visible = false;}, this.fadeOutTime);
}
};

CKW.Widgets.Tooltips =
{
params: null,

setParams: function(params)
{
this.params = params;
},

set: function(elm, text)
{
if (typeof(elm) == 'object') {
for (tooltip in elm) {
new CKW.Tooltip(tooltip, elm[tooltip], this.params);
}
} else {
new CKW.Tooltip(elm, text, this.params);
}
}
};

CKW.Widgets.TabbedContentPanel = function(id, tabTag, selected)
{
this.elm = CKW.DOM.getElement(id);
this.tabTag = tabTag;
this.selected = selected;
if (!this.elm) {
throw new Error("Trying to create a tabset on a non-existent id");
return null;
}
this.load();
}

CKW.Widgets.TabbedContentPanel.prototype =
{
load: function()
{
this.elm.id = this.elm.id + '-tabs';
this.elm.style.position = 'relative';
CKW.DOM.appendClass(this.elm, 'tabSet');

this.tabs = [];
this.panes = [];
var div, tmpElm, i = -1, content = [];

for(var child = this.elm.firstChild; child != null; child = child.nextSibling) {
if (child.nodeType == 1) {
if (child.tagName.toLowerCase() == this.tabTag) {
CKW.DOM.appendClass(child, 'tab');
if (child.className) {
var title = child.className.replace(/-/, " ");
title = "<span><span>" + title.replace(/tab/, "") + "</span></span>";
var heading = document.createElement(this.tabTag);
heading.innerHTML = child.innerHTML;
child.innerHTML = title;
}
this.tabs.push(child);
if (i != -1) {
this.panes[i] = div;
}
div = document.createElement('div');
div.className = 'pane';
div.innerHTML = "<div class='container'></div>";
if (heading) {
div.appendChild(heading);
}
i++;
} else {
if (child.className.toString() != 'panel') {
tmpElm = child.cloneNode(true);
div.appendChild(tmpElm);
content.push(child);
}
}
}
}
this.panes[i] = div;
for (var i = 0; i < content.length; i++) {
this.elm.removeChild(content[i]);
}

CKW.DOM.appendClass(this.tabs[0], 'first-tab');
CKW.DOM.appendClass(this.tabs[this.tabs.length - 1], 'last-tab');

this.panel = document.createElement('div');
CKW.DOM.appendClass(this.panel, 'panel');
this.elm.appendChild(this.panel);
this.panel.style.clear = 'both';

this.curTab = null;
this.curPane = null;

var self = this;
CKW.Event.listen(this.elm, 'click', function(e){self.togglePanes(e);});
this.setPanel(this.selected - 1);
},

togglePanes: function(e)
{
var tab = e.target || e.srcElement;
if (tab.parentNode.parentNode.className.match(/tab/) && !tab.parentNode.parentNode.className.match(/tabSet/)) {
var index = -1;
for (var i = 0; i < this.tabs.length; i++) {
if (this.tabs[i] == tab.parentNode.parentNode) {
index = i;
break;
}
}
this.setPanel(index);
}
CKW.Event.kill(e);
},

setPanel: function(index)
{
if (index >= 0 && index <= this.tabs.length - 1) {
if (this.curTab) {
CKW.DOM.removeClass(this.curTab, 'selected');
}
this.curTab = this.tabs[index];
CKW.DOM.appendClass(this.curTab, 'selected');
this.curPane = this.panes[index];
var div = this.curPane.cloneNode(true);

}  else {
var div = document.createElement('div');
div.className = 'pane';
}
this.panel.innerHTML = "";
this.panel.appendChild(div);
}
}

CKW.Widgets.FloatingPanel = function(attributes)
{
for (att in attributes) {
this[att] = attributes[att];
}
this.build();
};

CKW.Widgets.FloatingPanel.prototype =
{
showLoading: function(imgSrc)
{
CKW.DOM.setContent(this.elm, "");
var img = CKW.DOM.create('img');
img.src = imgSrc;
img.style.position = 'absolute';
img.style.left = '48%';
img.style.top = '48%';
this.elm.appendChild(img);
},

show: function()
{
if (this.fadeIn) {
CKW.FX.fadeIn(this.elm);
} else {
this.elm.style.display = 'block';
}
},

hide: function(func)
{
if (this.fadeOut) {
CKW.FX.fadeOut(this.elm);
} else {
this.elm.style.display = 'none';
}
func();
},

build: function()
{
this.elm = CKW.DOM.create('div');
this.elm.id = this.id;
this.elm.style.position = 'absolute';
this.elm.style.display = 'none';
this.elm.style.width = this.width;
this.elm.style.height = this.height;
this.elm.style.top = this.top;
this.elm.style.zIndex = 100;
if (this.left) {
this.elm.style.left = this.left;
}
if (this.right) {
this.elm.style.right = this.right;
}
CKW.DOM.id(this.parentId).appendChild(this.elm);
}

};

CKW.Widgets.Menu = function(nav)
{
nav = CKW.DOM.getElement(nav);
var navItems = CKW.DOM.tags('li', nav);
for (var i = 0; i < navItems.length; i++) {
if (navItems[i].parentNode != nav) {
navItems[i].className += " hideNav";
}
navItems[i].onmouseover = function()
{
CKW.DOM.removeClass(this, 'hideNav');
CKW.DOM.appendClass(this, 'showNav');
CKW.DOM.appendClass(CKW.DOM.tags('a', this)[0], 'selected');
};
navItems[i].onmouseout = function()
{
CKW.DOM.removeClass(this, 'showNav');
CKW.DOM.appendClass(this, 'hideNav');
CKW.DOM.removeClass(CKW.DOM.tags('a', this)[0], 'selected');
//var self = this;
//this.timer = window.setTimeout(function(){CKW.Util.hideNav(self)}, 600);
}
}


};

var $W = CKW.Widgets;

CKW.FX =
{
    fadeIn: function(elm, params)
    {
        CKW.FX.setTransparency(elm, 0);
        elm = CKW.DOM.getElement(elm);
        if (!params) {
            params = {time: 1, opacity: 10};
        } else {
             if (!params.time) {
                params.time = 1;
            }
            if (!params.opacity) {
                params.opacity = 10;
            }
        }
        var opacity = 0;
        elm.style.display = 'block';
        var ticker = setInterval(
            function()
            {
                if(opacity < 100) {
                    opacity += params.opacity;
                    CKW.FX.setTransparency(elm, opacity);
                } else {
                    CKW.FX.cancelTicker(ticker);
                }
            },
            params.time
        );
    },
    
    fadeOut: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params) {
            params = {time: 1, opacity: 20};
        } else {
             if (!params.time) {
                params.time = 1;
            }
            if (!params.opacity) {
                params.opacity = 10;
            }
        }
        var opacity = 100;
        var ticker = setInterval(
            function()
            {
                if(opacity > 0) {
                    opacity -= params.opacity;
                    CKW.FX.setTransparency(elm, opacity);
                } else {
                    CKW.FX.cancelTicker(ticker, elm);
                }
            },
            params.time
        );
    },
    
    cancelTicker: function(ticker, elm)
    {
        clearInterval(ticker);
        if (elm) {
            elm.style.display = 'none';
        }
    },
    
    /**
     * Sets the transparency of an element
     *
     * @var string id      - id of the element to make semi-transparent
     * @var int percentage - the percentage transparency
     */
    setTransparency: function(id, percentage)
    {
        id = CKW.DOM.getElement(id);
        id.style.KHTMLOpacity = percentage / 100;
        id.style.MozOpacity = percentage / 100;
        id.style.opacity = percentage / 100;
        id.style.filter = "alpha(opacity:" + percentage + ")";
    },
    
    toggleWidth: function(elm, params)
    {
        elm = $D.getElement(elm);
        if (!elm.ckwFxOpen) {
            CKW.FX.widen(elm, {add: params.show});
        } else {
            CKW.FX.narrow(elm, {subtract: params.show});
        }
    },
    
    widen: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetWidth;
        var finish = elm.offsetWidth + params.add;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp < finish) {
                    tmp += params.step;
                    elm.style.width = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.widen(elm, {add: 10, step: 2});
                        CKW.FX.narrow(elm, {subtract: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = true;
                }
            },
            1
        );
    },
    
    cancelTick: function(ticker)
    {
        clearInterval(ticker);
    },

    narrow: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetWidth;
        var finish = elm.offsetWidth - params.subtract;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp > finish) {
                    tmp -= params.step;
                    elm.style.width = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.narrow(elm, {subtract: 10, step: 2});
                        CKW.FX.widen(elm, {add: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = false;
                }
            },
            1
        );
    },
    
    toggleHeight: function(elm, params)
    {
        elm = $D.getElement(elm);
        if (!elm.ckwFxOpen) {
            CKW.FX.lengthen(elm, {add: params.show});
        } else {
            CKW.FX.shorten(elm, {subtract: params.show});
        }
    },
    
    lengthen: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetHeight;
        var finish = elm.offsetHeight + params.add;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp < finish) {
                    tmp += params.step;
                    elm.style.height = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.lengthen(elm, {add: 10, step: 2});
                        CKW.FX.shorten(elm, {subtract: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = true;
                }
            },
            1
        );
    },
    
    shorten: function(elm, params)
    {
        elm = CKW.DOM.getElement(elm);
        if (!params.step) {
            params.step = 10;
        }
        var start = elm.offsetHeight;
        var finish = elm.offsetHeight - params.subtract;
        var tmp = start;
        var ticker = setInterval(
            function()
            {
                if(tmp > finish) {
                    tmp -= params.step;
                    elm.style.height = parseInt(tmp) + "px";
                } else {
                    if (params.ease) {
                        CKW.FX.shorten(elm, {subtract: 10, step: 2});
                        CKW.FX.lengthen(elm, {add: 10, step: 2});
                    }
                    CKW.FX.cancelTick(ticker);
                    elm.ckwFxOpen = false;
                }
            },
            1
        );
    },
    
    grow: function(elm, params)
    {
        // get width and height
        
    },
    
    shrink: function(elm, params)
    {
        // get width and height
    
    }
}

var $F = CKW.FX;