/*
** form funcitons
*/


function submitSohoCDOrderForm()
{
	document.getElementById("cd_order_form").submit();
}

//gets all the element with a prefixed id
function getElementsByIdPrefix(element_type, prefix)
{
	var elements = document.getElementsByTagName('p');
	
	var data = new Array();

	for(var i=0; i<elements.length; i++)
	{
		if(elements[i].id.indexOf(prefix) == 0)
		{
			data[elements[i].id] = elements[i].innerHTML;
		}
	}
	
	return data;
}

//gets all the elements into an array with a prefix
function getFormElementsByNamePrefix(form_id, prefix)
{
	var form_elements = document.getElementById(form_id).elements;
	
	var name = '';
	var value = '';
	
	var data = new Array();
	
	for(var i=0; i<form_elements.length; i++)
	{
		if(form_elements[i].name.indexOf(prefix) == 0)
		{
			value = '';
			name = form_elements[i].name;
			switch (form_elements[i].type)
			{
				case 'checkbox':
					//get the selected radio element
					value = getCheckboxValue(form_id, name);
				break;
				
				case 'radio':
					//get the selected radio element
					value = getRadioValue(form_id, name);
				break;
				
				default:
					//just take the value
					value = form_elements[i].value;
			}

			data[name] = value;
		}
	}
	
	return data;
}


function appendUrlParameters(url, paramters, append)
{
	var i = 0;
	var delimeter = '';
	var result = '';
	
	for (keyVar in paramters)
	{
		delimeter = '&';
		if(i==0 && !append)
		{
			delimeter = '?';
		}
		result += delimeter + keyVar + '=' + paramters[keyVar] + '\n';
		i++;
	}

	return url + result;
}

//submits the form
function submitForm(form_id, form_action)
{
	var theForm = document.getElementById(form_id);
	
	if(form_action)
	{
			
		if(el = getFormElement(form_id, 'form_action'))
		{
			el.value = form_action;
		}
		else
		{
			//todo create new element
		}
	}
	
	theForm.submit();
}

//returns a form element
function getFormElement(form_id, element_name)
{
	var theForm = document.getElementById(form_id).elements;
	
	var result = false;
	var el = null;
	
	if(el = theForm[element_name])
	{
		result = el;	
	}
	
	return result;
}

//returns an element null 
function getElement(element_id)
{
	var result = false;
	var el = null;
	
	if(el = document.getElementById(element_id))
	{
		result = el;
	}
	
	return result;
}


/*
** textbox funcitons
*/

//clear a textbox
function clearTextboxValue(form_id, element_name)
{
	var el = getFormElement(form_id, element_name);
	
	var result = false;
	
	if(el.value = null)
	{
		result = true;	
	}
	
	return result;
}

function setTextboxValue(form_id, element_name, element_value)
{
	var el = getFormElement(form_id, element_name);
	
	result = false;
	
	if(el.value = element_value)
	{
		result = true;	
	}
	
	return result;
}

function getTextboxValue(form_id, element_name)
{
	var el = getFormElement(form_id, element_name);
	
	result = false;
	
	if(el.value)
	{
		result = el.value;	
	}
	
	return result;
}


/*
** Checkbox functions
*/

//set a checkbox to true
function setCheckboxTrue(form_id, element_name)
{
	var el = getFormElement(form_id, element_name);
	
	var result = false;
	
	if(el.checked = true)
	{
		result = true;
	}
	
	return result;
}

//set a checkbox to false
function setCheckboxFalse(form_id, element_name)
{
	var el = getFormElement(form_id, element_name);
	
	var result = false;
	
	if(el.checked = false)
	{
		result = true;
	}
	
	return result;
}

//get the value of a checkbox
function getCheckboxValue(form_id, element_name)
{
	var el = getFormElement(form_id, element_name);
	
	var result = false;
	
	if(el.checked)
	{
		result = true;
	}
	
	return result;
}


/*
** select funcitons
*/

//get the value of a select
function getSelectValue(form_id, element_name)
{
	var el = getFormElement(form_id, element_name);
	
	return el.value;
}

//set the value of a select
function setSelectValue(form_id, element_name, option_value)
{
	var el = getFormElement(form_id, element_name);
	
	for(var i=0; i < el.length; i++)
	{
		if(el[i].value == option_value)
		{
			el.selectedIndex = i;
		}
	}
	
	return false;
}

//set select to next option
function shiftSelectedOption(form_id, element_name, shift_options)
{
	var result = false;
	
	if(!shift_options)
	{
		shift_options = 1;
	}
	else
	{
		shift_options = parseInt(shift_options);
	}

	var el = getFormElement(form_id, element_name);
	
	for(var i=0; i<el.options.length; i++)
	{
		if(i == el.selectedIndex)
		{
			if((i + shift_options) > el.options.length)
			{
				break;
			}
			else
			{
				el.options[i + shift_options].selected = "selected";
				result = el.options[i + shift_options].value;
				break;
			}
		}
	}

	return result;
}

//add an option to a select
function addSelectOption(form_id, select_name, option_value, option_text, default_selected, selected)
{
	var theForm = document.getElementById(form_id).elements;
	
	var el = theForm[select_name];

	var options_length = el.options.length;
	
	var result = false;
	
	if(el.options[options_length] = new Option(option_value, option_text, default_selected, selected))
	{
		result = true;
	}
	
	return result;
}

//orders a select alphabetically
function orderSelect()
{
	//todo
}

//remove an option from a select
function removeSelectOption(form_id, select_name, option_value)
{
	var theForm = document.getElementById(form_id).elements;
	
	var el = theForm[select_name];
	
	var result = false;
	
	for(var i = 0 ; i < el.options.length ; ++i)
	{
		if(el.options[i].value == option_value)
		{
			if(el.options[i] = null)
			{
				result = true;
			}
			break;
		}
	}
	
	return result;
}

//remove all options from a select
function clearSelectOptions(form_id, select_name)
{
	var theForm = document.getElementById(form_id).elements;
	
	var el = theForm[select_name];
	
	el.options.length=0;
}

//resets a select to the first option in the list
function resetSelect(form_id, select_name)
{
	var theForm = document.getElementById(form_id).elements;
	
	var el = theForm[select_name];
	
	if(el.options.length > 0)
	{
		el.options[0].selected = "selected";
	}
}


/*
** radio button functions
*/
	
//returns all the elements within a radio group
function getRadioGroup(form_id, group_name) 
{
	var element_value = null;

	var el = document.getElementById(form_id).elements;
	
	for(var i = 0 ; i < el.length ; ++i)
	{
		if(el[i].type == "radio")
		{
			if(el[i].name == group_name)
			{
				var radiogroup = el[el[i].name]; // get the whole set of radio buttons.
				break;
			}
		}
	}
	
	return radiogroup;
}


//returns the value of a radio element
function getRadioValue(form_id, group_name)
{
	var radiogroup = getRadioGroup(form_id, group_name);
	
	for(var j = 0 ; j < radiogroup.length ; ++j)
	{
		if(radiogroup[j].checked)
		{
			element_value = radiogroup[j].value;
			break;
		}
	}

	return element_value;
}


/*
** Show and hide elements
*/

//shows an element
function showElement(element)
{
	var result = true;
	
	//check the attribute exists
	if(!checkAttributeExists(element, 'style'))
	{
		//add the attribute
		if(!addAttribute(element, 'style', null))
		{
			result = false;	
		}
	}
	
	element.style.visibility="visible";
	element.style.display="block";
	
	return result;
}

//hides an element
function hideElement(element)
{
	var result = true;
	
	//check the attribute exists
	if(!checkAttributeExists(element, 'style'))
	{
		//add the attribute
		if(!addAttribute(element, 'style', null))
		{
			result = false;	
		}
	}
	
	element.style.visibility="hidden";
	element.style.display="none";
	
	return result;
}

/*
** List Item funcitons
*/

//displays all the li elements in a list
function expand_list(id)
{
	
	node = document.getElementById(id);
	
	filter = id;
	
	child_nodes = getChildren(node, filter);

	for(var i=0; i<child_nodes.length; i++)
	{
		alert(child_nodes.innerHTML);	
	}
}

function collapse_list()
{
		
}


/*
** Enable and disable form elements
*/

function enableElement(element)
{
	//check th element type
	
	
	//check if the attribute exists 
	if(!checkAttributeExists(element, 'style'))
	{
		//add the attribute
		if(!addAttribute(element, 'style', null))
		{
			result = false;	
		}
	}
}

function disableElement(element)
{
	//check the element type
	
	
	//check if the attribute exists
	if(!checkAttributeExists(element, 'style'))
	{
		//add the attribute
		if(!addAttribute(element, 'style', null))
		{
			result = false;	
		}
	}
}


/*
** Set form elements to read only
*/

function setReadOnlyTrue(element)
{
	//check the element type
	
	//check if the attribute exists
}

function setReadOnlyFalse(element)
{
	//check the element type
	
	//check if the attribute exists
}


/*
** Attribute related functions
*/

//get the style of an object
function getStyle(elementId)
{
	result = false;
	
	if (document.getElementById)
	{
		result = document.getElementById(elementId).style;
	}
	
	return result;
}


//returns the value of an attribute
function getAttributeValue(element, attribute_name)
{
	result = false;

	for(var x = 0; x < element.attributes.length; x++)
	{
		if(element.attributes[x].nodeName.toLowerCase() == attribute_name)
		{
			result = element.attributes[x].nodeValue;
		}
	}
	
	return result;
}

//set the value of an attribute if it exists
function setAttributeValue(element, attribute_name, attribute_value)
{
	var result = false;
	
	for(var x = 0; x < element.attributes.length; x++)
	{
		if(element.attributes[x].nodeName.toLowerCase() == attribute_name)
		{
			if(element.attributes[x].nodeValue = attribute_value)
			{
				result = true;
				break;
			}
		}
	}

	return result;
}

//adds an attribute to an element //setAttribute has no return
function addAttribute(element, attribute_name, attribute_value)
{
	var result = false;

	if(element.setAttribute(attribute_name,attribute_value))
	{
		result = true;	
	}

	return result;
}

//checks an attribute exists
function checkAttributeExists(element, attribute_name)
{
	var result = false;
	
	for( var x = 0; x < getAtrributeCount(element); x++ )
	{
		if(element.attributes[x].nodeName.toLowerCase() == attribute_name)
		{
			result = true;
			break;
		}
	}
	
	return result;
}

//count the number of attributes, solves IE problem
function getAtrributeCount(element)
{
	var totalattributes=0
	
	for (i=0;i<element.attributes.length;i++)
	{
		//if attribute is user defined
		if (element.attributes[i].specified)
		{
			totalattributes++
		}
	}
	
	return totalattributes;
}


/*
** Style related functions allows user to set a style
*/

function _setStyle(element, declaration)
{
	if (declaration.charAt(declaration.length-1)==';')
	declaration = declaration.slice(0, -1);
	var k, v;
	var splitted = declaration.split(';');
	for (var i=0, len=splitted.length; i<len; i++)
	{
		k = rzCC(splitted[i].split(':')[0]);
		v = splitted[i].split(':')[1];
		eval("element.style."+k+"='"+v+"'");
	}
}

function rzCC(s)
{
	// thanks http://www.ruzee.com/blog/2006/07/\
	// retrieving-css-styles-via-javascript/
	for(var exp=/-([a-z])/; 
	exp.test(s); 
	s=s.replace(exp,RegExp.$1.toUpperCase()));
	return s;
}



/*
** Http request and response functions
*/


//get server response and invoke function
function handleHttpResponse(url, function_name, param_1)
{
	var http = getHTTPObject();
	
	http.open("GET", url, true);
	
	http.onreadystatechange = function()
	{
		if (http.readyState == 4)
		{
			if(http.status == 200)
			{
				var _function = new Object();
				_function.construct = function_name;
				if(param_1)
				{
					_function.construct(http.responseText, param_1);
				}
				else
				{
					_function.construct(http.responseText);
				}
			}
			else
			{
				alert("Error code " + http.status);
			}
		}
	}
	
	http.send(null);
}


//get server response from post invoke
function handleHTTPResponse_POST(url, parameters, function_name, param_1)
{
	var http = getHTTPObject();
	
	//http_request.onreadystatechange = function_name;
	http.open('POST', url, true);
	http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	http.setRequestHeader("Content-length", parameters.length);
	http.setRequestHeader("Connection", "close");
	
	http.send(parameters);
	
	http.onreadystatechange = function()
	{
		if (http.readyState == 4)
		{
			if(http.status == 200)
			{
				var _function = new Object();
				_function.construct = function_name;
				if(param_1)
				{
					_function.construct(http.responseText, param_1);
				}
				else
				{
					_function.construct(http.responseText);
				}
			}
			else
			{
				alert("Error code " + http.status);
			}
		}
	}
}


//get the http object borwser compatiblility
function getHTTPObject()
{
	if (typeof XMLHttpRequest != 'undefined')
	{
		return new XMLHttpRequest();
	}
	
	try
	{
		return new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e)
	{
		try
		{
			return new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(e)
		{
			alert('Exception caught during postback');
		}
	}
	
	return false;
}


/*
** DOM related functions
*/

if(!window.Node)
{
	var Node = {ELEMENT_NODE : 1, TEXT_NODE : 3};
}


function checkNode(node, filter)
{
  return (filter == null || node.nodeName.toUpperCase() == filter.toUpperCase());
}


function getChildren(node, filter)
{
	var result = new Array();
	var children = node.childNodes;
	for(var i = 0; i < children.length; i++)
	{
		if(checkNode(children[i], filter))
		{
			result[result.length] = children[i];
		}
	}
	return result;
}


function getChildrenByElement(node)
{
  return getChildren(node, "ELEMENT_NODE");
}


function getFirstChild(node, filter)
{
	var child;
	var children = node.childNodes;
	for(var i = 0; i < children.length; i++)
	{
		child = children[i];
		if(checkNode(child, filter))
		{
			return child;
		}
	}
	return null;
}


function getFirstChildByText(node)
{
	return getFirstChild(node, "TEXT_NODE");
}


function getNextSibling(node, filter)
{
	for(var sibling = node.nextSibling; sibling != null; sibling = sibling.nextSibling)
	{
		if(checkNode(sibling, filter)) return sibling;
	}
	return null;
}


function getNextSiblingByElement(node)
{
	return getNextSibling(node, "ELEMENT_NODE");
}



