/*
** 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");
}




