/*******************************************************************************
	DHTML API
	Hand-crafted by Chris Nott using time-honoured, traditional techniques
 ******************************************************************************/
 
if (document.layers){
	originalWindowWidth = innerWidth;
	originalWindowHeight = innerHeight;
	onresize=function() { if(innerWidth != originalWindowWidth || innerHeight != originalWindowHeight) location.reload() };
}

function gE(e,f){if(document.layers){f=(f)?f:self;var V=f.document.layers;if(V[e])return V[e];for(var W=0;W<V.length;)t=gE(e,V[W++]);return t;}if(document.all)return document.all[e];return document.getElementById(e);}

// Reference creation functions (existing elements)
function getElement(id, frame) {
	if (frame == null || frame == '') frame = self;
	if (document.getElementById && !is.isIE5up) return frame.document.getElementById(id);
	else if (document.all) return frame.document.all[id];
	else if (document.layers) {
		if (frame.document.layers[id]) return frame.document.layers[id];
		for (var i = 0; i < frame.document.layers.length; i++) {
			if (frame.document.layers[i].document && frame.document.layers[i].document.layers) return getElement(id,frame.document.layers[i]);
		}
	}
	return null;
}

// Creation and disposal functions
function createElement(id, parent, left, top, width, height, content, backgroundColor, visibility, zIndex) {
	var element = null;
	if (document.layers) {
		if (parent == null || parent == '') parent = self;
		parent.document.layers[id] = new Layer(width, parent);
		element = parent.document.layers[id];
		element.left = left;
		element.top = top;
		if (height != null) element.clip.height = height;
		if (backgroundColor) element.bgColor = backgroundColor;
		element.visibility = (visibility == 'hidden') ? 'hide' : 'show';
		if (zIndex != null) element.zIndex = zIndex;
		if (content) {
			element.document.open()
			element.document.write(content)
			element.document.close()
		}
		element.hidden = false;
	}
	else if (document.all) {
		if (parent == null || parent == '') parent = self;
		var str = '\n<DIV id=' + id + ' style="position:absolute; left:' + left + '; top:' + top + '; width:' + width;
		if (height != null) {
			str += '; height:' + height;
			str += '; clip:rect(0,' + width + ',' + height + ',0)';
		}
		if (backgroundColor) str += '; background-color:' + backgroundColor;
		if (zIndex != null) str += '; z-index:' + zIndex;
		if (visibility) str += '; visibility:' + visibility;
		str += ';">' + ((content) ? content : '') + '</DIV>';
		parent.document.body.insertAdjacentHTML('BeforeEnd', str);
		element = parent.document.all[id];
	}
	else if (document.createElement) {
		if (parent == null || parent == '') parent = document.childNodes[0].lastChild;
		element = document.createElement("div");
		element.id = id;
		element.appendChild(document.createTextNode(content));
		parent.appendChild(element);
	}
	return element;
}

function deleteElement(element) {
	if (typeof(element) != 'object' || element == null) return null; 
	if (document.layers) {
		element.visibility = 'hide';
		element.hidden = true;
		element = null; 
	}
	else if (document.all) {
		element.innerHTML = '';
		element.outerHTML = '';
	}
	else if (document.removeChild) element.parentNode.removeChild(element);
	return null; 
}

// Content write functions
function writeContents(element, html) {
	if (typeof(element) != 'object' || element == null) return null;
	if (document.layers) {
		element.document.open();
		element.document.write(html);
		element.document.close();
	}
	else if (is.isIE4up) element.innerHTML = html;
	else if (element.childNodes) element.childNodes[0].nodeValue = html;
	return null; 
}

function loadContents(element, url) {
	if (document.layers) element.load(url, element.clip.width);
	else if (loadcontentsbufferRef) loadcontentsbufferRef.src = url + '?' + getID(element);
	return null; 
}

var loadcontentsbufferRef = null;

function loadContentsBufferCreate() {
	if (!document.layers) {
		document.write('<iframe style="display: none;" name="loadcontentsbuffer"></iframe>');
		loadcontentsbufferRef = getElement('loadcontentsbuffer');
	}
	return null; 
}

function transferContentsBuffer(id) {
	if (!document.layers && loadcontentsbufferRef) {
		var element = getElement(id);
		if (is.IE4up) writeContents(element, loadcontentsbuffer.document.body.innerHTML);
		else if (element.childNodes) writeContents(element, loadcontentsbufferRef.document.childNodes[0].childNodes[1].firstChild);
	}
	return null; 
}

// Visibility functions
function getVisibility(element) {
	if (typeof(element) != 'object' || element == null) return null; 
	if (document.layers && element.visibility == 'show') return 'visible';
	else if (document.layers && element.visibility == 'hide') return 'hidden';
	else if (document.layers && element.visibility == 'inherit') return 'inherit';
	else return (element.style.visibility == '') ? 'inherit' : element.style.visibility;
	return null; 
}

function setVisibility(element, state) {
	if (typeof(element) != 'object' || element == null) return null; 
	if (state == 'visible') show(element);
	else if (state == 'hidden') hide(element);
	return null; 
}

function show(element) {
	if (typeof(element) != 'object' || element == null) return null;
	if (document.layers && element.parentLayer != window) element.visibility = 'inherit';
	else if (document.layers) element.visibility = 'show';
	else element.style.visibility = 'visible';
	return null; 
}

function hide(element) {
	if (typeof(element) != 'object' || element == null) return null;
	if (document.layers) element.visibility = 'hide';
	else element.style.visibility = 'hidden';
	return null; 
}

// Z-index functions
function getZIndex(element) {
	if (typeof(element) != 'object' || element == null) return null;
	return (document.layers) ? element.zIndex : element.style.zIndex;
}

function setZIndex(element, index) {
	if (typeof(element) != 'object' || element == null || isNaN(parseInt(index))) return null;
	if (document.layers) element.zIndex = parseInt(index);
	else element.style.zIndex = parseInt(index);
	return null; 
}

// Position functions
function getLeft(element) {
	if (typeof(element) != 'object' || element == null) return null;
	return (document.layers) ? element.left : parseInt(element.style.left);
}

function setLeft(element, value) {
	if (typeof(element) != 'object' || element == null || isNaN(parseInt(value))) return null;
	if (document.layers) element.left = parseInt(value);
	else element.style.left = parseInt(value) + 'px';
	return null; 
}

function getTop(element) {
	if (typeof(element) != 'object' || element == null) return null;
	return (document.layers) ? element.top : parseInt(element.style.top);
}

function setTop(element, value) {
	if (typeof(element) != 'object' || element == null || isNaN(parseInt(value))) return null;
	if (document.layers) element.top = parseInt(value);
	else element.style.top = parseInt(value) + 'px';
	return null; 
}

function moveTo(element, xpos, ypos) {
	setLeft(element, xpos);
	setTop(element, ypos);
	return null; 
}

function moveBy(element, xshift, yshift) {
	moveTo(element, getLeft(element) + xshift, getTop(element) + yshift);
	return null; 
}

// Size functions
function getWidth(element) {
	if (typeof(element) != 'object' || element == null) return null;
	return (document.layers) ? element.clip.width : parseInt(element.style.width);
}

function setWidth(element, value) {
	if (typeof(element) != 'object' || element == null || isNaN(parseInt(value))) return null;
	if (document.layers) element.clip.width = parseInt(value);
	else element.style.width = parseInt(value);
	return null; 
}

function getHeight(element) {
	if (typeof(element) != 'object' || element == null) return null;
	return (document.layers) ? element.clip.height : parseInt(element.style.height);
}

function setHeight(element, value) {
	if (typeof(element) != 'object' || element == null || isNaN(parseInt(value))) return null;
	if (document.layers) element.clip.height = parseInt(value);
	else element.style.height = parseInt(value);
	return null; 
}

// Clipping functions
function clipTo(element, top, right, bottom, left) {
	if (typeof(element) != 'object' || element == null) return null;
	if (isNaN(parseInt(top))) top = getClipValue(element, 'top');
	if (isNaN(parseInt(right))) right = getClipValue(element, 'right');
	if (isNaN(parseInt(bottom))) bottom = getClipValue(element, 'bottom');
	if (isNaN(parseInt(left))) left = getClipValue(element, 'left');
	if (document.layers) {
		element.clip.top = parseInt(top);
		element.clip.right = parseInt(right);
		element.clip.bottom = parseInt(bottom);
		element.clip.left = parseInt(left);
	}
	else element.style.clip = 'rect(' + parseInt(top) + 'px ' + parseInt(right) + 'px ' + parseInt(bottom) + 'px ' + parseInt(left) + 'px)';
	return null; 
}

function clipBy(element, top, right, bottom, left) {
	clipTo(element, parseInt(getClipValue(element, 'top') + top), parseInt(getClipValue(element, 'right') + right), parseInt(getClipValue(element, 'bottom') + bottom), parseInt(getClipValue(element, 'left') + left));
	return null; 
}

function getClipValue(element, side) {
	if (!document.layers && !(is.mac && is.isIE4up)) var clipv = element.style.clip.split('rect(')[1].split(')')[0].split('px');
	if (is.isMac && is.isIE4up) var clipv = element.style.clip.split('rect(')[1].split(')')[0].split(' ');	
	if (side == 'top') return (document.layers) ? element.clip.top : Number(clipv[0]);
	if (side == 'right') return (document.layers) ? element.clip.right : Number(clipv[1]);
	if (side == 'bottom') return (document.layers) ? element.clip.bottom : Number(clipv[2]);
	if (side == 'left') return (document.layers) ? element.clip.left : Number(clipv[3]);
	return null; 
}

// Background functions
var hexValues = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f');

function getBackgroundColor(element) {
	if (typeof(element) != 'object' || element == null) return null;
	if (is.isNS6up && element.style.backgroundColor.indexOf('rgb') != -1) {
		var newColor = '#';
		var triplets = element.style.backgroundColor.substring(4, element.style.backgroundColor.length - 1).split(',');
		for (var i = 0; i < triplets.length; i++) {
			newColor += hexValues[Math.floor(triplets[i] / 16)] + hexValues[Math.floor(triplets[i] % 16)];
		}
		return newColor;
	}
	else return (document.layers) ? element.document.bgColor : element.style.backgroundColor;
}

function setBackgroundColor(element, color) {
	if (typeof(element) != 'object' || element == null || !(isColor(color) || color == 'transparent' || color == 'inherit')) return null;
	if (document.layers) element.document.bgColor = color;
	else element.style.backgroundColor = color;
	return null; 
}

function getBackgroundImage(element) {
	if (typeof(element) != 'object' || element == null) return null;
	return (document.layers) ? element.background.src : element.style.backgroundImage;
}

function setBackgroundImage(element, url) {
	if (typeof(element) != 'object' || element == null) return null;
	if (document.layers) element.background.src = url;
	else element.style.backgroundImage = 'url(' + url + ')';
	if (is.isIE && is.isMac) setBackgroundColor(element, 'transparent')
	return null; 
}

function isColor(string) {
	// color values must have 7 characters with a '#' as the first character
	if (string.length != 7 || string.substring(0, 1) != '#') return false;
	// check that all characters after the first are a valid hex digit
	for (var i = 1; i < 7; i++) {
		for (var j = 0; j < 16; j++) {
			if (string.substring(i, i+1) == hexValues[j]) break;
		}
		if (j == 16) return false;
	}
	return true;
} 

// Misc. functions
function getID(element) {
	return (document.layers) ? element.name : element.id;
}
