
function successHandler(o){

  var xml = o.responseXML.documentElement;
  var cart_wrapper = document.getElementById('cart_wrapper');

  if(xml.firstChild.text){
    var cart = xml.firstChild.text;
  }
  else if(xml.firstChild.textContent){
    var cart = xml.firstChild.textContent;
  }
  else if(xml.firstChild.innerText){
    var cart = xml.firstChild.innerText;
  }
  else if(xml.firstChild.nodeValue){
    var cart = xml.firstChild.nodeValue;
  }
  else{
    //error - just reload the page
    window.location.reload(true);
  }


  cart_wrapper.innerHTML = cart;
  initUpdate();
  initRemoveAll();

  //update the whats_this links
  initWhatsThis();
  return false;


}

function failureHandler(o){
  window.location.reload(true);
}

function getClassName(){
  if(window.ActiveXObject){
    return 'className';
  }
  else{
    return 'class';
  }
}

function isNull(foo){
  if(foo == null || foo == ''){
    return true;
  }
  else{
    return false;
  }
}

function parseFormDataToPostString(form_data){
  var i = null;
  var post_string = '';
  var field;
  var incl;
  var QTY_REMOVE_OFFSET = 1;
//  for(var key in form_data){   // not working in safari
  var keys = new Array('inputs','selects');
  var key = '';

  for(var j = 0; j < keys.length; j++){
    key = keys[j];
    for(i = 0; i < form_data[key].length; i++){
      field = form_data[key][i];
      incl = false;

      //avoid irrelivent fields
      if(!isNull(field.id)){
	//remove box
	if(field.id.indexOf('remove_') == 0 && field.checked){
	  incl = true;
	}

	//format
	else if(field.id.indexOf('format_') == 0){
	  incl = true;
	}
	
	//qty
	else if(field.id.indexOf('qty_') == 0){
	  if(!isNull(field.value) && field.value > 0){
	    incl = true;
	  }
	  else if(field.value == 0){
	    // qty 0; should be remove, but cart->update() doesn't handle these right, so
	    // make it look like a remove option
	    post_string +=  '&' + form_data[key][i-QTY_REMOVE_OFFSET].name + '=' + form_data[key][i-QTY_REMOVE_OFFSET].value;
	  }
	}
      }

      if(incl){
	post_string += '&' + field.name + '=' + field.value;
      }
    }
  }

  return post_string.substr(1);

}

function getCartFormData(){
  var cart_form = document.getElementById('form_edit_cart');
  var form_data = new Array;
  form_data['inputs'] = cart_form.getElementsByTagName('input');
  form_data['selects'] = cart_form.getElementsByTagName('select');

  return form_data;
}

function getPostFormData(){

  var form_data = getCartFormData();
  var post_string = parseFormDataToPostString(form_data);
  return encodeURI(post_string);
}

function sendRequest(rx_query,call_back){
  var url = '/api/cart_recalculate/';
  var request = YAHOO.util.Connect.asyncRequest('POST',url,call_back, rx_query);
}

function setButtonAction(){
  var button = document.getElementById('update');
  var img = document.createElement('img');
  img.setAttribute('src','/images/icons/loader.gif');
  button.parentNode.replaceChild(img,button);
}

function hookAnchors(form_anchors){
  for(var i = 0; i < form_anchors.length; i++){
    var cur_a = form_anchors[i];

    if(!isNull(cur_a.href) && (cur_a.href.indexOf('?action=change') != -1) || cur_a.href.indexOf('?action=buy_now') != -1){
      cur_a.onclick = function(){
	var call_back = {
	  success: successHandler,
	  failure: failureHandler
	}

	try{
	  //get args and trim leading ?
	  var args = this.href.substr(this.href.indexOf('?')+1);
	  sendRequest(encodeURI(args),call_back);
	}
	catch(e){
//	  alert(e); //debug
	}
	return false;
      }
    }

  }
}

function initFormats(){
  var form = document.getElementById('form_edit_cart');
  var form_anchors = new Array;
  form_anchors = form.getElementsByTagName('a');

  hookAnchors(form_anchors);
}

function recalculateCart(){
	try{
	  if (validateFormatsAndQty('update')){
	    var call_back = {
	      success: successHandler,
	      failure: failureHandler
	    }
	    setButtonAction();
	    var cart_form_data = getPostFormData();
	    sendRequest(cart_form_data,call_back);
	  }
	  return false;
	}
	catch(e){
	  alert(e); //debug
	  return true; //go ahead and submit the form
	}
}

/*
	initUpdate is the funtion that starts the update process. 
*/


function initUpdate(){
  try{
    var recal_button = document.getElementById('update');

    initFormats();

    //have to reset the rollovers after rebuilding the recal button in ajax
    setupRolloverHandlers(recal_button.parentElement);

    //also reset the checkout button
    initCart();

    recal_button.onclick = function(){ return recalculateCart();}

  }
  catch(e){
//    alert(e); //debug
  }
}

initUpdate();

