function showElement(element) 
{ 
	var obj = document.getElementById(element); 
	var oldclass = obj.className.replace("hidden", "");
	var oldclass = oldclass.replace("visible", "");
	obj.className = oldclass + " visible"; 
}

function hideElement(element) 
{
	var obj = document.getElementById(element);
	var oldclass = obj.className.replace("visible", "");
	var oldclass = oldclass.replace("hidden", "");
	obj.className = oldclass + " hidden";
}

function changeTab(newTab, tabList)
{
	var tabUL = document.getElementById(tabList).getElementsByTagName("LI");

	for (var i=0; i<tabUL.length; i++) 
	{
		var link = document.getElementById(tabUL[i].id.replace("_li", "") + 'link'); 
		link.className = '';
		var divName = tabUL[i].id.replace("_li", "");
		hideElement(divName);
	}

	showElement(newTab);
	var link = document.getElementById(newTab + 'link');
	link.className = 'over';
}

function checkAll(fobj, exby) 
{
	for(var i = 0;i < fobj.elements.length;i++) 
	{ 
		switch(fobj.elements[i].type) 
		{ 
			case "checkbox": 
			fobj.elements[i].checked = exby.checked? true:false
			break;
		}

       } 
}

function swapImage(image, newpath, href)
{
	var tim = document.getElementById(image);
	tim.src = newpath;
	var tim = document.getElementById(image+'h');
	tim.href = href;
}

function DMAjax(url)
{
	if(window.XMLHttpRequest) 
	{
		this.XMLHttpRequestObject = new XMLHttpRequest();
	} 
	else if (window.ActiveXObject) 
	{
		this.XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
	}
	this.url = url;
	this.mouse = setInterval('document.body.style.cursor=\'wait\'', 5);
	if(this.XMLHttpRequestObject) 
	{
		this.XMLHttpRequestObject.open("GET", url + "&ajaxreq=true");
		this.XMLHttpRequestObject.send(null);
	}
	else
	{
		return FALSE;
	}
}

DMAjax.prototype.XMLHttpRequestObject;
DMAjax.prototype.url;
DMAjax.prototype.mouse;

DMAjax.prototype.complete = function()
{
	clearInterval(this.mouse);
	document.body.style.cursor='auto';
	if (this.XMLHttpRequestObject.readyState == 4 && 
	this.XMLHttpRequestObject.status == 200) 
	{
		if(this.XMLHttpRequestObject.responseText!="")
		{
			if(this.XMLHttpRequestObject.responseText=="login")
			{
				//session has timmed out and login is required again.
				document.location.href = "index.php";
				return false;
			}
			else
			{
				return true;
			}
		}
		else
		{
			return false;
		}
	}
	else
	{
		if (this.XMLHttpRequestObject.readyState == 4 && 
		this.XMLHttpRequestObject.status != 200) 
		{
			DMOpBox.messageBox("Sorry, the request to the server produced an unexpected response. Please check your Internet connection and your Dymasive installation. If the problem persists please contact Dymsaive support. <br />[DEBUG INFO]<br />ReadyState: " + this.XMLHttpRequestObject.readyState + "<br />HTTP Status: " + this.XMLHttpRequestObject.status + "<br />Request URL: " + this.url, 'warning', 5);
		}
	}
}

function DMSlide(target, height, width)
{
	this.id = DMSlide.Instances.length;
	DMSlide.Instances[this.id] = this;

	this.obj = document.getElementById(target);
	this.oHeight = this.obj.style.height.replace("px", "");
	this.oHeight = (this.oHeight * 1);
	this.oWidth = this.obj.style.width.replace("px", "");
	this.oWidth = (this.oWidth * 1);
	this.width = width;
	this.height = height;
	this.speed = 10;
	this.time = 20;
	this.startSlide();
}
DMSlide.prototype.width;
DMSlide.prototype.height;
DMSlide.prototype.oWidth;
DMSlide.prototype.oHeight;
DMSlide.prototype.timmer;
DMSlide.prototype.obj;
DMSlide.prototype.moving;
DMSlide.prototype.id;
DMSlide.prototype.speed;
DMSlide.prototype.time;
DMSlide.prototype.counter;

DMSlide.Instances = new Array();

DMSlide.prototype.startSlide = function ()
{
	if(this.moving)
	{
		return;
	}

	this.moving = true;
	this.counter = 0;
	this.timer = setInterval('DMSlide.Instances['+this.id+'].performSlide();', this.speed);
}

DMSlide.prototype.performSlide = function ()
{
	this.counter++;
	var elapsed = (this.counter / this.time) * 100;
    this.obj.style.display = "block";
	var currentHeight = this.obj.style.height.replace("px", "");
	var currentHeight = (currentHeight * 1);
	var currentWidth = this.obj.style.width.replace("px", "");
	var currentWidth = (currentWidth * 1);
	
	if(this.counter==this.time)
	{
		this.obj.style.height = this.height + 'px';
		this.obj.style.width = this.width + 'px';
		
		if(this.height==0 || this.width==0)
		{
			this.obj.style.display = 'none';
		}
		
		clearInterval(this.timer);
	}
	
	if(this.width!='auto')
	{
		if(this.width!=currentWidth)
		{
			if(this.width>currentWidth)
			{
				var change = ((this.width - this.oWidth) / 100) * elapsed;
				var newWidth = this.oWidth + change;
				this.obj.style.width = newWidth + 'px';
			}
			if(this.width<currentWidth)
			{
				var change = ((this.oWidth - this.width) / 100) * elapsed;
				var newWidth = this.oWidth - change;
				this.obj.style.width = newWidth + 'px';
			}
		}
	}
	if(this.height!='auto')
	{
		if(this.height!=currentHeight)
		{
			if(this.height>currentHeight)
			{
				var change = ((this.height - this.oHeight) / 100) * elapsed;
				var newHeight = this.oHeight + change;
				this.obj.style.height = newHeight + 'px';
			}
			if(this.height<currentHeight)
			{
				var change = ((this.oHeight - this.height) / 100) * elapsed;
				var newHeight = this.oHeight - change;
				this.obj.style.height = newHeight + 'px';
			}
		}
	}
	
    return;
}

var DMOpBox = {
	
	show: function(contentDiv, height, width)
	{
		this.refresh();
		var configBox = document.getElementById('configBox');
		var contentDiv = document.getElementById(contentDiv);
		
		configBox.innerHTML = contentDiv.innerHTML;
		
		configBox.style.height = height + 'px';
		configBox.style.width = width + 'px';

		var cwidth = 0, cheight = 0;
		
		if(typeof(window.innerWidth)=='number') 
		{
			cwidth = window.innerWidth;
			cheight = window.innerHeight;
		}
		else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
		{
			cwidth = document.documentElement.clientWidth;
			cheight = document.documentElement.clientHeight;
		}
		else if(document.body && (document.body.clientWidth || document.body.clientHeight)) 
		{
			cwidth = document.body.clientWidth;
			cheight = document.body.clientHeight;
		}
		
		var top = (cheight / 2) - (height / 2);
		var left = (cwidth / 2) - (width / 2);
		
		configBox.style.top = top + 'px';
		configBox.style.left = left + 'px';
		
		showElement('configBox');
		showElement('shaderbox');
	},
	
	hide: function()
	{
		hideElement('configBox');
		hideElement('shaderbox');
	},
	
	refresh: function()
	{
		var configBox = document.getElementById('configBox');
		configBox.innerHTML = '';
	},
	
	status: function(percent, message)
	{
		this.show('upload_status', 60, 300);
		var configBox = document.getElementById('configBox');
		var bar = document.getElementById('upload_status');
		bar.style.width = percent + '%';
		
		var reader = document.getElementById('upload_reader');
		reader.innerHTML = percent + '%';
		
		var status = document.getElementById('upload_message');
		status.innerHTML = message;
	},
	
	messageBox: function(message, type, lines)
	{ 
		var box = document.getElementById('messageBox');
		var container = document.getElementById('messageContainer');
		var img = document.getElementById('msg_img');
		
		if(message!="")
		{
			box.innerHTML = message;
		}
		
		if(type!="")
		{
			container.className = 'message ' + type;
			img.src = 'templates/default/images/' + type + '.jpg';
		}
		var height = lines * 15;
		if(height>0)
		{
			height = height + 12;
		}
		var slider = new DMSlide('messageContainer', height, 'auto');
		scroll(0,0);
		
		if(type=='ok' || type=='warning' || type=="notice")
		{
			setTimeout('DMOpBox.messageBox(\'\', \'\', 0);', 5000);
		}
	}
};

var DMSelect = {

	init: function()
	{
		if(window.addEventListener)
		{
			window.addEventListener('load', DMSelect.loader, false);
		}
		else
		{
			window.attachEvent('onload', DMSelect.loader);
		}
	},
	
	loader: function()
	{
		var selects = document.getElementsByTagName('SELECT');

		for(var i = 0; i < selects.length; i++)
		{
			var select = selects[i];
			if(select.multiple)
			{
				DMSelect.replace(selects[i]);
			}
		}
	},
	
	replace: function(target)
	{
		target.className += ' hidden';
		
		var replacement = document.createElement('DIV');
		var innerhtml = '<ul class="selectbox" id="' + target.name + '_boxes">';

		for(var i = 0; i < target.options.length; i++)
		{
				innerhtml += DMSelect.addOption(target, target.options[i], i);
		}

		innerhtml += '</ul>';
		replacement.innerHTML = innerhtml;
		target.parentNode.insertBefore(replacement, target);
	},
	
	addOption: function(element, option, index)
	{
		var label = option.innerHTML;
		var whitespace = label.match(/^\s*(&nbsp;)*/);
		if(whitespace[0])
		{
			label = label.replace(/^\s*(&nbsp;)*/, '');
		}
		out = '<li id="' + element.name + '_' + option.value + '" onclick="DMSelect.onClick(this, \'' + element.id + '\')">' + whitespace[0] + '<input type="checkbox" value="' + option.value + '" onclick="DMSelect.onClick(this)">' + label + '</li>';
		return out;
	},
	
	onClick: function(element, target)
	{
		var select = document.getElementById(target);
		var checkbox = element.getElementsByTagName('input')[0];
		
		for(i = 0; i < select.options.length; i++)
		{
			if(select.options[i].value==checkbox.value)
			{
				var selectOption = select.options[i];
			}
		}
		if(element.className=="selected")
		{
			element.className = '';
			checkbox.checked = false;
			selectOption.selected = false;
		}
		else
		{
			element.className = 'selected';
			checkbox.checked = true;
			selectOption.selected = true;
		}
		select.onchange();
	}
};

function addCat(value, newName, newValue)
{
	var selects = document.getElementsByTagName('SELECT');
	for(var i = 0; i < selects.length; i++)
	{
		var select = selects[i];
		
		if(select.className.indexOf('FormCatElement') == 0)
		{
			var options = select.options;
			
			for(var j = 0; j < options.length; j++)
			{
				if(value==select.options[j].value)
				{
					var newIndex = j + 1;
				}
			}
			if(value==0)
			{
				var newIndex = 1;
			}
			newOption = new Option(newName, newValue, false, false);
			var bOp = select.options[newIndex];
			
			try
			{
				select.add(newOption, bOp);
			}
			catch(ex)
			{
				select.add(newOption, select.newIndex);
			}
			
			
			//now lets see if there is an associated checkbox div
			var cBox = document.getElementById(select.name + '_boxes');
			
			if(cBox)
			{
				var newLI = document.createElement('li');
				newLI.innerHTML = '<input type="checkbox" value="' + newValue + '" onclick="DMSelect.onClick(this)">' + newName;
				newLI.id = select.name + '_' + newValue;
				newLI.setAttribute('onclick', 'DMSelect.onClick(this, \'' + select.id + '\')');

				if(value==0)
				{
					var tOption = cBox.getElementsByTagName('LI')[0];
					
					if(tOption)
					{
						tOption.parentNode.insertBefore(newLI, tOption);
					}
					else
					{
						cBox.appendChild(newLI);
					}
				}
				else
				{
					var tOption = document.getElementById(select.name + '_' + value);
					//Insert before requires us to use the next node
					tOption = tOption.nextSibling;
					
					if(tOption)
					{
						tOption.parentNode.insertBefore(newLI, tOption);
					}
					else
					{
						cBox.appendChild(newLI);
					}
				}
			}
		}
	}
	DMOpBox.messageBox('Your new category has been created.', 'ok', 1);
}

function addImage()
{
	var oTable = document.getElementById('imagetable');
	var nbRows = oTable.rows.length;
	var curNode = oTable.rows.item(0);
	var newRow = oTable.insertRow(nbRows);
	var newCell = newRow.insertCell(0);
	newCell.className = 'listing';
	newCell.innerHTML = curNode.cells[0].innerHTML;
	var newCell = newRow.insertCell(1);
	newCell.innerHTML = curNode.cells[1].innerHTML;
	
	var slider = new DMSlide('imgTableDiv', (nbRows + 1) * 25, 'auto');
	dissallowRemove('imagetable', 1);
}

function removeImage(link)
{
	var oTable = document.getElementById('imagetable');
	var nbRows = oTable.rows.length;
	var rowIndex = link.parentNode.parentNode.rowIndex;
	oTable.deleteRow(rowIndex);
	dissallowRemove('imagetable', 1);
	var slider = new DMSlide('imgTableDiv', (nbRows - 1) * 25, 'auto');
}

function loadSpecs(cat)
{
	var specdiv = document.getElementById('specdiv');

	var oTable = document.getElementById('spectable');
	var nbRows = oTable.rows.length;
	for(i=0;i<nbRows;i++)
	{
		if(oTable.rows[nbRows - i - 1].cells[0].id!="addanother")
		{
			oTable.deleteRow(nbRows - i - 1);
		}
	}

	var selectedCats = '';
	for(i = 0; i < cat.options.length; i++)
	{	
		if(cat.options[i].selected==true)
		{
			selectedCats += cat.options[i].value + '-';
		}
	}
	
	var req = new DMAjax('index.php?action=ajax&do=speclist&cat='+selectedCats);

	req.XMLHttpRequestObject.onreadystatechange = function()
	{
		if(req.complete())
		{
			specdiv.innerHTML = req.XMLHttpRequestObject.responseText;
			var spdef = document.getElementById('specdefault');
			var counter = document.getElementById('counter');
			var count = counter.value;
			var buttons = document.getElementById('specbuttons').innerHTML;
			
			for(i=1;i<spdef.options.length-1;i++)
			{
				count++;
				counter.value = count;
				var newRow = oTable.insertRow(i-1);
				newRow.id = 'specrow' + count;
				var newCell = newRow.insertCell(0);
				newCell.className = "listing";
				var oldSelect = document.getElementById('specdefault');
				var newSelect = document.createElement("select");
				newSelect.id ='spec' + count;
				newSelect.name = 'spec[' + count + ']';
				newSelect.onchange = function() { loadOps(this.options[this.selectedIndex].value, this); }

				for(j=0;j<oldSelect.options.length;j++)
				{
					var newoption = new Option(oldSelect.options[j].text, oldSelect.options[j].value, true, true);
					newSelect.options[newSelect.options.length] = newoption;
				}
				newCell.appendChild(newSelect);
				var newCell = newRow.insertCell(1);
				newCell.className = "listing";
				var newCell = newRow.insertCell(2);
				newCell.innerHTML = buttons;
				var newbox = document.getElementById('spec' + count);
				newbox.selectedIndex = i;
				loadOps(newbox.options[i].value, newbox);
			}
			if(spdef.options.length==2)
			{
				addSpec();
			}
			else
			{
				var slider = new DMSlide('specTableDiv', (spdef.options.length - 2) * 24, 'auto');
			}
		}
	}
	dissallowRemove('spectable', 2);
}

function loadOps(specid, select)
{
	var rowid = select.name.replace('spec[', '');
	var rowid = rowid.replace(']', '');
		
	if(specid=="new")
	{
		DMOpBox.refresh();
		var newid = document.getElementById('newopid');
		newid.value = rowid;
		DMOpBox.show('newspecform', 500, 500);
		select.selectedIndex = 0;
	}
	else if(specid=="")
	{
		select.parentNode.nextSibling.innerHTML = '';
	}
	else
	{
		select.parentNode.nextSibling.innerHTML = 'Please Wait';
		var req = new DMAjax('index.php?action=ajax&do=oplist&specid='+specid+'&rowid='+rowid);
		
		req.XMLHttpRequestObject.onreadystatechange = function()
		{
			if(req.complete())
			{
				select.parentNode.nextSibling.innerHTML = req.XMLHttpRequestObject.responseText;
			}
		}
	}
}

function addSpec()
{
	var specdiv = document.getElementById('specdiv');
	var buttons = document.getElementById('specbuttons').innerHTML;

	var counter = document.getElementById('counter');
	var count = counter.value;
	count++;
	counter.value = count;

	var spdef = document.getElementById('specdefault');
	var spdefdiv = document.getElementById('specdiv');
	var oTable = document.getElementById('spectable');
	var nbRows = oTable.rows.length;
	var newRow = oTable.insertRow(nbRows);
	newRow.id = 'specrow' + count;
	var newCell = newRow.insertCell(0);
	newCell.className = "listing"; 
	var oldSelect = document.getElementById('specdefault');
	var newSelect = document.createElement("select");
	newSelect.id ='spec' + count;
	newSelect.name = 'spec[' + count + ']';
	newSelect.onchange = function() { loadOps(this.options[this.selectedIndex].value, this); }
	for(j=0;j<oldSelect.options.length;j++)
	{
		var newoption = new Option(oldSelect.options[j].text, oldSelect.options[j].value, false, false);
		newSelect.options[newSelect.options.length] = newoption;
	}
	newSelect.selectedIndex = 0;
	newCell.appendChild(newSelect);
	var newCell = newRow.insertCell(1);
	newCell.className = "listing";
	var newCell = newRow.insertCell(2);
	newCell.innerHTML = buttons;
	var height = document.getElementById('specTableDiv').style.height.replace('px', '');
	var slider = new DMSlide('specTableDiv', (nbRows + 1) * 24, 'auto');
	dissallowRemove('spectable', 2);
}

function dissallowRemove(table, cell)
{
	var oTable = document.getElementById(table);
	if(oTable.rows.length==1)
	{
		var remove = oTable.getElementsByTagName('TR')[0].getElementsByTagName('TD')[cell].getElementsByTagName('IMG')[1];
		remove.className = 'hidden';
	}
	else
	{
		var rows = oTable.getElementsByTagName('TR');
		
		for(var i = 0; i < rows.length; i++)
		{
			var img = rows[i].getElementsByTagName('TD')[cell].getElementsByTagName('IMG')[1];
			img.className = '';
		}
	}
}

function removeSpec(button)
{
	var oTable = document.getElementById('spectable');
	var rowid = button.parentNode.parentNode.rowIndex;
	oTable.deleteRow(rowid);
	var slider = new DMSlide('specTableDiv', oTable.rows.length * 24, 'auto');
	dissallowRemove('spectable', 2);
}

function createNewSpec(rowid, name, value)
{
	var count = document.getElementById('counter').value;
	
	for(i=0;i<count+1;i++)
	{
		if(document.getElementById('spec' + i))
		{
			var newOption = new Option(name, value, false, false);
			var selectbox = document.getElementById('spec' + i);
			var newIndex = selectbox.options.length;
			newIndex = newIndex - 1;
			var bOp = selectbox.options[newIndex];
			
			try
			{
				selectbox.add(newOption, bOp);
			}
			catch(ex)
			{
				selectbox.add(newOption, selectbox.newIndex);
			}
		}
	}
	var newOption = new Option(name, value, false, false);
	var selectbox = document.getElementById('specdefault');
	var newIndex = selectbox.options.length;
	newIndex = newIndex - 1;
	var bOp = selectbox.options[newIndex];
			
	try
	{
		selectbox.add(newOption, bOp);
	}
	catch(ex)
	{
		selectbox.add(newOption, selectbox.newIndex);
	}	

	var s = document.getElementById('spec' + rowid);
	s.selectedIndex = s.options.length - 2;
	loadOps(s.options[s.selectedIndex].value, s);
	DMOpBox.messageBox('Your new specification has been created.', 'ok', 1);
}

function addOp(specid)
{
	DMOpBox.refresh();
	var newid = document.getElementById('newopspecid');
	newid.value = specid;
	DMOpBox.show('newopform', 500, 500);
	
	if(document.getElementById('option' + specid))
	{
		document.getElementById('option' + specid).selectedIndex = 0;
	}
}

function createOp(specid, name, newid)
{
	var opbox = document.getElementById('option' + specid);

	if(opbox.options.length)
	{
		var newOption = new Option(name, newid, true, true)
		var newIndex = opbox.length - 1;
		var bOp = opbox.options[newIndex];
				
		try
		{
			opbox.add(newOption, bOp);
		}
		catch(ex)
		{
			opbox.add(newOption, opbox.newIndex);
		}	
	}
	else
	{
		var list = opbox.getElementsByTagName('LI')[0].getElementsByTagName('UL')[0];
		var newLI = document.createElement('li');
		newLI.innerHTML = '<label><input type="checkbox" name="option' + specid + '[]" value="' + newid + '" checked>' + name + '</label>&nbsp;&nbsp;';
		var tOption = list.getElementsByTagName('LI')[list.getElementsByTagName('LI').length - 1];
					
		if(tOption)
		{
			tOption.parentNode.insertBefore(newLI, tOption);
		}
		else
		{
			list.appendChild(newLI);
		}
	}
	DMOpBox.messageBox('Your new option(s) have been created.', 'ok', 1);
}

function checkExt(value, exts)
{
    if(value=="")return true;
    var re = new RegExp("^.+\.("+exts+")$","i");
    if(!re.test(value))
    {
        return false;
    }
    return true;
}


function formSubmit(fobj, frame, target)
{	
	if(validate(fobj))
	{
		DMOpBox.show('loading', 60, 300);
		
		if(frame!="")
		{
			var scriptframe = document.getElementById(frame);
			scriptframe.src = target;
		}
		
		return true;
	}
	else
	{
		return false;
	}
}


var dragObject  = null;
var mouseOffset = null;
var DMDrag =
{
	out: function()
	{
		document.body.style.cursor='auto';
	},
	
	over: function()
	{
		document.body.style.cursor='move';
	},
	
	startDrag: function(element)
	{
		if(!element) return; alert(element);
		dragObject  = element;
	}
}

document.onmousemove = mouseMove;
document.onmouseup   = mouseUp;

function getMouseOffset(target, ev){
	ev = ev || window.event;

	var docPos    = getPosition(target);
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function getPosition(e){
	var left = 0;
	var top  = 0;

	while (e.offsetParent){
		left += e.offsetLeft;
		top  += e.offsetTop;
		e     = e.offsetParent;
	}

	left += e.offsetLeft;
	top  += e.offsetTop;

	return {x:left, y:top};
}

function mouseMove(ev){
	ev           = ev || window.event;
	var mousePos = mouseCoords(ev);
	
	if(dragObject)
	{
		if(!mouseOffset)
		{
			mouseOffset = getMouseOffset(dragObject, ev);
		}
		dragObject.style.position = 'absolute';
		dragObject.style.top      = mousePos.y - mouseOffset.y + 'px';
		dragObject.style.left     = mousePos.x - mouseOffset.x + 'px';

		return false;
	}
}
function mouseUp(){
	dragObject = null;
}

function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
}
