var SHOW_PRICING_EDITOR=false;
var InstantPricingList=new Array();
function CreateInstantPricing(reftype,refid,container,form,id,precision,multiplierQuestion){
  var i=InstantPricingList.length;
  InstantPricingList[i]=new InstantPricing(reftype,refid,container,form,precision,multiplierQuestion);
  InstantPricingList[i].id=id;  
}
function GetInstantPricing(id){
  for(var i=0; i<InstantPricingList.length; i++){
    if(InstantPricingList[i].id==id)return InstantPricingList[i];
  }
  return null;
}
function InstantPricingFormEditMode(on){
  for(var i=0; i<InstantPricingList.length; i++){
      if(on){ 
        InstantPricingList[i].closeQuickQuote();
      }else{
        InstantPricingList[i].processQuickQuote();
      }
  }
}
function InstantPricing(reftype,refid,container,form,precision,multiplierQuestion){
  this.quoteForm=form;
  this.pricingInfoAvailable=false;
  this.content=container; 
  this.editMode=false;
  this.refType=reftype;
  this.refID=refid;  
  this.floating=null;
  this.unitPricePrecision=2;
  if(precision&&precision>0) this.unitPricePrecision=precision;
  if(multiplierQuestion&&multiplierQuestion>0) this.multiplierQuestion=multiplierQuestion;
//  this.selectedOptions= new Array();
//  this.selectedCategories= new Array();
//  this.priceFormList= new Array();
  this.data=null;
//  this.openedOptions = new Array();
  this.res=null;
  this.showQuote();
  this.setupForm();  
}


InstantPricing.prototype.processXML=function(xml){  
  var x, y, z, zz;
  var i, j, k, kk;
  var rowIndex;
//  this.res.editor[0].pricingForm[0].refID[0].node.value=this.refID;
//  this.res.editor[0].pricingForm[0].refType[0].node.value=this.refType;        
  this.data=new Object();
  this.data.minQty=getTagValue(xml,'min_qty');
  this.DEBUG=(getTagValue(xml,'debug')=="1"?true:false);
  if(getTagValue(xml,'pricingmethod')=="marginal")  this.data.marginal=true; else this.data.marginal=false;

  this.data.pricing=new Array();
  this.data.categories=new Array();
  x=xml.getElementsByTagName('category');
  for(i=0;i<x.length;i++){
    this.data.categories[i]=new Object();
    this.data.categories[i].id=x[i].getAttribute('id');
    this.data.categories[i].cumulativeTotal=0;
    this.data.categories[i].title=getTagValue(x[i],'title');
    this.data.categories[i].type=getTagValue(x[i],'type'); // "header" or "sub group"
    this.data.categories[i].isShipping=getTagValue(x[i],'shipping');
    this.data.categories[i].question=new Array();    
    
    y=x[i].getElementsByTagName('question');
    for(j=0;j<y.length;j++){
      this.data.categories[i].question[j]=new Object();
      this.data.categories[i].question[j].id1=y[j].getAttribute('qid1');
      this.data.categories[i].question[j].id2=y[j].getAttribute('qid2');
      this.data.categories[i].question[j].id3=y[j].getAttribute('qid3');
      this.data.categories[i].question[j].pricing=new Array();
      z=y[j].getElementsByTagName('pricing');
      if(z.length>0){
        this.pricingInfoAvailable=true;
        this.data.categories[i].pricingInfoAvailable=true;
      }
      for(k=0;k<z.length;k++){        
        this.data.categories[i].question[j].pricing[k]=new Object();
        this.data.categories[i].question[j].pricing[k].id=z[k].getAttribute('id');
        this.data.categories[i].question[j].pricing[k].choice1=getTagValue(z[k],'choice1');
        this.data.categories[i].question[j].pricing[k].choice2=getTagValue(z[k],'choice2');
        this.data.categories[i].question[j].pricing[k].choice3=getTagValue(z[k],'choice3');
        this.data.categories[i].question[j].pricing[k].setupCharge=Number(getTagValue(z[k],'setup_charge'));
        this.data.categories[i].question[j].pricing[k].setupPercent=Number(getTagValue(z[k],'setup_percent'));     
        this.data.categories[i].question[j].pricing[k].piecesMultiplier=Number(getTagValue(z[k],'pieces_multiplier'));
        this.data.categories[i].question[j].pricing[k].piecesQuestion=Number(getTagValue(z[k],'pieces_question'));
        this.data.categories[i].question[j].pricing[k].subPricePerItem=Number(getTagValue(z[k],'sub_price_per_item'));      
        this.data.categories[i].question[j].pricing[k].breaks=new Array();
        zz=z[k].getElementsByTagName('break');
        for(kk=0;kk<zz.length;kk++){
          this.data.categories[i].question[j].pricing[k].breaks[kk]=new Object();
          this.data.categories[i].question[j].pricing[k].breaks[kk].qty=Number(zz[kk].getAttribute('qty'));
          this.data.categories[i].question[j].pricing[k].breaks[kk].value=Number(zz[kk].firstChild.nodeValue);    
        }
      }
    }
  }
  if(this.editMode||SHOW_PRICING_EDITOR){ this.showForm(); SHOW_PRICING_EDITOR=false;}
  else this.processQuote();
}  

InstantPricing.prototype.showQuote=function(){
  var instance=this;
  this.editMode=false;
  var params=new AjaxFormContent();
  params.addNameValue("DEBUG",1);
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("mdl","instantPricing/product.aj");  
  if(PREFS.cXML_ID&&PREFS.cXML_ID>0) params.addNameValue('cXML_ID',PREFS.cXML_ID);
  ajaxPostFunction(params,function(sc,st,rt,rxml){    
//    ajaxCallFunction("ajax.iml?mdl=instantPricing/product.aj&Ref_Type="+this.refType+"&Ref_ID="+this.refID+"&"+Date(),function(sc,st,rt,rxml){
        instance.res=new HTMLParse(getTagValue(rxml,'resource'));      
        instance.processXML(rxml.getElementsByTagName('product')[0]);
      },
   "ajax.iml");
}

InstantPricing.prototype.showQuoteDetail=function(obj){
  window.scrollTo(0,Geometry.upperLeftOffset(this.content).y);
}

InstantPricing.prototype.processQuote=function(){
  var x, y, z;
  var i, j, k;
  var rowIndex;
  var instance=this;
  this.content.setAttribute("id","quote");  
  this.content.innerHTML="";
  if(this.pricingInfoAvailable){
    var ct=new HTMLParse(this.content);
    ct.appendObject(this.res.quote[0],true); 
    this.data.quantity=ct.quote[0].quantity[0].node; Evt.addEventListener(this.data.quantity,"change",function(event){var ev=new Evt(event);instance.setQuantity(ev.source);},false);
    Evt.addEventListener(this.data.quantity,"keyup",function(event){var ev=new Evt(event);instance.setQuantity(ev.source);},false);
    this.data.total=ct.quote[0].total[0].node; Evt.addEventListener(this.data.total,"change",function(){instance.recalculateForm();},false);
    this.data.totalinput=ct.quote[0].total[1].node;
    this.data.shippingtotalinput=ct.quote[0].shipping_total[0].node;
    this.data.totalEach=ct.quote[0].totalEach[0].node; Evt.addEventListener(this.data.totalEach,"change",function(){instance.recalculateForm();},false);

    for(i=0;i<this.data.categories.length; i++){
      if(this.data.categories[i].pricingInfoAvailable){
        ct.quote[0].breakdown[0].appendObject(this.res.quoteline[(this.data.categories[i].type=="Header"?0:1)],true);
        rowIndex=ct.quote[0].breakdown[0].quoteline.length-1;
        if(this.data.categories[i].type=="Header")  ct.quote[0].breakdown[0].quoteline[rowIndex].title[0].node.innerHTML=this.data.categories[i].title;
        else ct.quote[0].breakdown[0].quoteline[rowIndex].title[0].node.innerHTML="+ "+this.data.categories[i].title;
        this.data.categories[i].catTotal=ct.quote[0].breakdown[0].quoteline[rowIndex].value[0].node;
        this.data.categories[i].catTotal.innerHTML="0";
        Evt.addEventListener(this.data.categories[i].catTotal,"change",function(){instance.recalculateForm();},false);
      }else{
        this.data.categories[i].catTotal=new Object();
      }
    }
    this.processQuickQuote();
    if(this.quoteForm) this.recalculateForm();
    this.floating.div.style["display"]="none";  
  }
  if(this.floating) this.floating.scroll();    
}

InstantPricing.prototype.processQuickQuote=function(){
  if(this.pricingInfoAvailable){
    var ct=new HTMLParse(this.content);
    var instance=this;
    ct.appendObject(this.res.quickquote[0],true);
    this.quickQuoteDragger=new DragObject(ct.quickquote[0].node);
    this.data.total2=ct.quickquote[0].total[0].node; Evt.addEventListener(this.data.total2,"change",function(){instance.recalculateForm();},false);
    ct.quickquote[0].bump[0].node.onclick=function(){instance.showQuoteDetail(this);};
    var coord=Geometry.upperLeftOffset(ct.quote[0].node);
    this.floating=new floatingObject(ct.quickquote[0].node, parseInt(coord.x)-300, parseInt(coord.y)-30);
    this.floating.div.style["display"]="none";  
  }
}
InstantPricing.prototype.closeQuickQuote=function(){
  if(this.floating){
    var div=this.floating.div;
    div.parentNode.removeChild(div);
  }
  this.floating=null;
}


InstantPricing.prototype.open=function(evt){
  this.editMode=true;
  this.showForm(); 
}


InstantPricing.prototype.loading=function(htmlobj){
//  for(var i=0; i<this.priceFormList.length; i++){
//    if(this.priceFormList[i].parent){
//      this.priceFormList[i].parent.removeChild(this.priceFormList[i]);      
//    }      
//  }
//  this.priceFormList= new Array();
  htmlobj.node.innerHTML="";
  htmlobj.appendObject(this.res.loading[0],true);
   
//  editor.appendObject(this.res.editor[0].loading[0],true);
}

InstantPricing.prototype.repositionQuickTotal=function(obj){
  if(this.floating){ 
    if(!obj) obj=this.quoteForm;
    var coord=Geometry.upperLeftOffset(obj);
    this.floating.setPos(parseInt(coord.x)-500,parseInt(coord.y)-30); 
    this.floating.div.style["display"]="";
  }
}


InstantPricing.prototype.setupForm=function(form){
  var instance=this;
  if(!form) form=this.quoteForm;
  var i;
  var inputs=form.getElementsByTagName('input');
  for(i=0; i<inputs.length; i++){
    if(inputs[i].getAttribute('Question_ID')>0||inputs[i].getAttribute('isQty')>0){
      if(inputs[i].type=="text")  Evt.addEventListener(inputs[i],"change",function(event){var ev=new Evt(event);instance.recalculateForm(ev.source);},false);
      else  Evt.addEventListener(inputs[i],"click",function(event){var ev=new Evt(event); instance.recalculateForm(ev.source);},false);
    }
    Evt.addEventListener(inputs[i],"focus",function(event){var ev=new Evt(event);instance.repositionQuickTotal(ev.source);},false);
  }    
  inputs=form.getElementsByTagName('select');
  for(i=0; i<inputs.length; i++){
    if(inputs[i].getAttribute('Question_ID')>0||inputs[i].getAttribute('isQty')>0){
      Evt.addEventListener(inputs[i],"change",function(event){var ev=new Evt(event);instance.recalculateForm(ev.source);},false);
    }
    Evt.addEventListener(inputs[i],"focus",function(event){var ev=new Evt(event);instance.repositionQuickTotal(ev.source);},false);
  }    
}



/******************  Pricing Editor  ***********************/

InstantPricing.prototype.showForm=function(){
  this.content.setAttribute("id","instantpricingform");
  this.editMode=true;
  if(!this.data){
    return;
  }  
  var category,row, i,j,k,x;
  var pricingOptions;
  var optionTitle, choiceTitle, oldOptionTitle;
  var instance=this;
  var editor=new HTMLParse(this.content);  
  this.loading(editor);
  var params=new AjaxFormContent();  
  params.addNameValue("DEBUG",1);
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("mdl","instantPricing/listCategories.aj");  
  ajaxPostFunction(params,function(sc,st,rt,rxml){    
    instance.content.innerHTML=rt; editor=new HTMLParse(instance.content);    
    if(editor.instantPricingCategories[0].instantPricingLine){
      for(var i=0;i<editor.instantPricingCategories[0].instantPricingLine.length;i++){
        instance.setupCategory(editor.instantPricingCategories[0].instantPricingLine[i]);
      }
      instance.dragger=new DragDropListObject(editor.instantPricingCategories[0].node,function(){instance.sortCategories();});
    }
    instance.setupHeader(editor.header[0]);    
    cat=editor.newInstantPricingLine[0];
    cat.button[0].node.onclick=function(){instance.addCategory();};
    setMouseOver(cat.button[0].node,"green-sm");
    cat.title[0].node.onkeypress=function(evt){t=new Evt(evt); if(t.key==13)instance.addCategory();};
     
    },
    "ajax.iml" );
     
}

InstantPricing.prototype.setupHeader=function(header){
  var instance=this;
  if(header.testmode[0].node.type=="button"){
      setMouseOver(header.testmode[0].node,"black-sm");
      header.testmode[0].node.onclick=function(){instance.changeTestMode()};
  }
  if(header.precision){
      header.precision[0].node.onchange=function(){instance.changePrecision(this.options[this.selectedIndex].value)};    
  }
  if(header.pieces_multiplier){
      header.pieces_multiplier[0].node.onchange=function(){instance.changeMultiplier(this.options[this.selectedIndex].value)};    
  }
  if(header.pricing_method){
      header.pricing_method[0].node.onchange=function(){instance.changePricingMethod(this.options[this.selectedIndex].value)};    
  }
}

InstantPricing.prototype.changeTestMode=function(){
  var params=new AjaxFormContent();
  params.addNameValue("mdl","instantPricing/changeSettings.aj");
  params.addNameValue("ChangeTestMode",'1');
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("DEBUG",1);
  var instance=this;
  ajaxPostFunction(params,function(sc,st,rt,rxml){
      var editor=new HTMLParse(instance.content);  
      editor.header[0].node.innerHTML=rt;
      editor=new HTMLParse(instance.content);  
      instance.setupHeader(editor.header[0]);
  },"ajax.iml");
}
InstantPricing.prototype.changePrecision=function(set){
  this.unitPricePrecision=set;
  var params=new AjaxFormContent();
  params.addNameValue("mdl","instantPricing/changeSettings.aj");
  params.addNameValue("ChangePrecision",'1');
  params.addNameValue("IP_Unit_Price_Precision",set);
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("DEBUG",1);
  var instance=this;
  ajaxPostFunction(params,function(sc,st,rt,rxml){
      var editor=new HTMLParse(instance.content);  
      editor.header[0].node.innerHTML=rt;
      editor=new HTMLParse(instance.content);  
      instance.setupHeader(editor.header[0]);
  },"ajax.iml");
}
InstantPricing.prototype.changeMultiplier=function(set){
  this.multiplierQuestion=set;
  var params=new AjaxFormContent();
  params.addNameValue("mdl","instantPricing/changeSettings.aj");
  params.addNameValue("ChangeMultiplier",'1');
  params.addNameValue("IP_Pieces_Multiplier",set);
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("DEBUG",1);
  var instance=this;
  ajaxPostFunction(params,function(sc,st,rt,rxml){
      var editor=new HTMLParse(instance.content);  
      editor.header[0].node.innerHTML=rt;
      editor=new HTMLParse(instance.content);  
      instance.setupHeader(editor.header[0]);
  },"ajax.iml");
}
InstantPricing.prototype.changePricingMethod=function(set){
  var params=new AjaxFormContent();
  params.addNameValue("mdl","instantPricing/changeSettings.aj");
  params.addNameValue("ChangeBreakMethod",'1');
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("IP_Simple_Method",set);  
  params.addNameValue("DEBUG",1);
  var instance=this;
  ajaxPostFunction(params,function(sc,st,rt,rxml){
      var editor=new HTMLParse(instance.content);  
      editor.header[0].node.innerHTML=rt;
      editor=new HTMLParse(instance.content);  
      instance.setupHeader(editor.header[0]);
  },"ajax.iml");
}


InstantPricing.prototype.getCategoryBlockByID=function(id){
  var editor=new HTMLParse(this.content);
  if(!editor.instantPricingCategories) return null;
  if(!editor.instantPricingCategories[0].instantPricingLine) return null;
  for(var i=0; i<editor.instantPricingCategories[0].instantPricingLine.length; i++){
    if(editor.instantPricingCategories[0].instantPricingLine[i].node.getAttribute('Cat_ID')==id){ 
         return new HTMLParse(editor.instantPricingCategories[0].instantPricingLine[i].node);
    }
  }
  return null;
}
InstantPricing.prototype.getQuestionBlockByID=function(qid){
  var sp=qid.split(':');
  var cat=this.getCategoryBlockByID(sp[0]);
  if(!cat) return null;
  for(var i=0;i<cat.content[0].questionlist[0].instantPricingQuestion.length;i++){
    if(cat.content[0].questionlist[0].instantPricingQuestion[i].node.getAttribute('Question_ID')==qid){
      return new HTMLParse(cat.content[0].questionlist[0].instantPricingQuestion[i].node);
    }
  }
  return null;
}
InstantPricing.prototype.getOptionBlockByID=function(vid){
  var sp=vid.split(':');
  var question=this.getQuestionBlockByID(sp[0]+":"+sp[1]+":"+sp[2]+":"+sp[3]);
  if(!question) return null;
  for(var j=0;j<question.content[0].instantPricingOption.length;j++){
    if(question.content[0].instantPricingOption[j].node.getAttribute('Value_ID')==vid){
      return new HTMLParse(question.content[0].instantPricingOption[j].node);
    }
  }
  return null;
}

InstantPricing.prototype.setupCategory=function(htmlobj,isopen){
  var instance=this;
  if(isopen){
    htmlobj.bump[0].node.onclick=function(){instance.collapseCategory(this.getAttribute('Cat_ID'));};
    htmlobj.node.className="selectedline";
  }else{
    htmlobj.bump[0].node.onclick=function(){instance.expandCategory(this.getAttribute('Cat_ID'));};
    htmlobj.node.className="unselectedline";
  }
  htmlobj.title[0].node.onclick=function(){instance.editCategoryName(this);};
  htmlobj.button[0].node.onclick=function(){instance.deleteCategory(this.getAttribute('Cat_ID'));};
  setMouseOver(htmlobj.button[0].node,"red-sm");  
  htmlobj.button[1].node.onclick=function(){instance.changeCategoryType(this.getAttribute('Cat_ID'));};
  setMouseOver(htmlobj.button[1].node,"black-sm");  
}
InstantPricing.prototype.editCategoryName=function(obj){
  if(obj.getAttribute('isEditing')!=1){
    var old=obj.innerHTML;
    var input=ce('input');
    input.type="text";
    input.style["width"]="300px";
    input.setAttribute("oldValue",old);
    input.value=old;
    obj.innerHTML=""; obj.appendChild(input);
    obj.setAttribute('isEditing',1);
    input.focus();
    var instance=this;
    input.onblur=function(){instance.saveCategoryName(this);};
  }
}
InstantPricing.prototype.saveCategoryName=function(obj){
  var old=obj.getAttribute("oldValue");
  var newName=obj.value;
  var cat=this.getCategoryBlockByID(obj.parentNode.getAttribute('Cat_ID'));
  obj.parentNode.setAttribute('isEditing',0);
  obj.parentNode.innerHTML=newName;
  cat.title[1].node.innerHTML=newName;
  var instance=this;
  var params=new AjaxFormContent();  
  params.addNameValue("DEBUG",1);  
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("mdl","instantPricing/changeCategory.aj");  
  params.addNameValue('OLD_Category',old);
  params.addNameValue('NEW_Category',newName);
  ajaxPostFunction(params,function(sc,st,rt,rxml){   },"ajax.iml");
}
InstantPricing.prototype.sortCategories=function(){
  var editor=new HTMLParse(this.content);
  var params=new AjaxFormContent();
  params.addNameValue("DEBUG",1);  
  params.addNameValue("mdl","instantPricing/sortCategories.aj");
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);  
  for(var i=0;i<editor.instantPricingCategories[0].instantPricingLine.length;i++){
    params.addNameValue("CAT_LIST",editor.instantPricingCategories[0].instantPricingLine[i].bump[0].node.getAttribute('Cat_ID'));
  }
  ajaxPostFunction(params,function(sc,st,rt,rxml){},"ajax.iml");
}
InstantPricing.prototype.addCategory=function(){
  var instance=this;
  var params=new AjaxFormContent();
  var editor=new HTMLParse(this.content);   
  params.addNameValue("DEBUG",1);  
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);
  params.addNameValue("mdl","instantPricing/addCategory.aj");  
  params.addContent(editor.newInstantPricingLine[0].title[0].node);
  ajaxPostFunction(params,function(sc,st,rt,rxml){  
       var newLine=new HTMLParse(rt);
       instance.setupCategory(newLine.instantPricingLine[0]);
       editor.newInstantPricingLine[0].title[0].node.value="";
       editor.instantPricingCategories[0].appendObject(newLine.instantPricingLine[0]);
       instance.dragger=new DragDropListObject(editor.instantPricingCategories[0].node,function(){instance.sortCategories();});
    }
  ,"ajax.iml");
}
InstantPricing.prototype.expandCategory=function(cid){
  var instance=this;
  var cat=this.getCategoryBlockByID(cid);
  this.loading(cat.content[0]);    
  this.setupCategory(cat,true);
  if(cat){
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);  
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",cid);
    params.addNameValue("mdl","instantPricing/listQuestions.aj");  
    ajaxPostFunction(params,function(sc,st,rt,rxml){  
      cat.content[0].node.innerHTML=rt; var editor=new HTMLParse(cat.content[0].node);    
      if(editor.questionlist[0].instantPricingQuestion){
        for(var i=0;i<editor.questionlist[0].instantPricingQuestion.length;i++){
          instance.setupQuestion(editor.questionlist[0].instantPricingQuestion[i])
        }
      }
      editor.newInstantPricingQuestion[0].button[0].node.onclick=function(){instance.addQuestion(this.getAttribute('Cat_ID'));};
      setMouseOver(editor.newInstantPricingQuestion[0].button[0].node,"green-sm");        
    }
  ,"ajax.iml");
  
  }  
}
InstantPricing.prototype.collapseCategory=function(cid){
  var cat=this.getCategoryBlockByID(cid);
  if(cat) this.setupCategory(cat);
}
InstantPricing.prototype.changeCategoryType=function(cid){
  var cat=this.getCategoryBlockByID(cid);
  var isShipping=cat.button[1].node.getAttribute('shipping');
  if(isShipping==1){
    cat.button[1].node.setAttribute('shipping',0);
    cat.button[1].node.value="shipping charge";
    cat.categorytype[0].node.innerHTML="product pricing";
    isShipping=0;
  }else{
    cat.button[1].node.setAttribute('shipping',1);
    cat.button[1].node.value="product pricing";
    cat.categorytype[0].node.innerHTML="a shipping charge";
    isShipping=1;
  }
  var params=new AjaxFormContent();  
  params.addNameValue("DEBUG",1);  
  params.addNameValue("Cat_ID",cid);  
  params.addNameValue("Ref_Type",this.refType);
  params.addNameValue("Ref_ID",this.refID);  
  params.addNameValue("Cat_isShippingCalculation",isShipping);    
  params.addNameValue("mdl","instantPricing/changeCategoryType.aj");  
  ajaxPostFunction(params,function(sc,st,rt,rxml){  },"ajax.iml");
}

InstantPricing.prototype.deleteCategory=function(cid){
  var instance=this;
  var cat=this.getCategoryBlockByID(cid);
  if(cat&&confirm("You are about to delete a subtotal group. This action cannot be undone.  Do you want to continue?")){
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);  
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",cid);
    params.addNameValue("mdl","instantPricing/deleteCategory.aj");  
    ajaxPostFunction(params,function(sc,st,rt,rxml){ 
         cat.node.parentNode.removeChild(cat.node);
     }
    ,'ajax.iml');  
  }
}

InstantPricing.prototype.setupQuestion=function(htmlobj,isopen){
  var instance=this;
  if(isopen){
    htmlobj.bump[0].node.onclick=function(){instance.collapseQuestion(this.getAttribute('Question_ID'));};
    htmlobj.node.className="selectedline";
  }else{
    htmlobj.bump[0].node.onclick=function(){instance.expandQuestion(this.getAttribute('Question_ID'));};
    htmlobj.node.className="unselectedline";
  }
  htmlobj.button[0].node.onclick=function(){instance.deleteQuestion(this.getAttribute('Question_ID'));};
  setMouseOver(htmlobj.button[0].node,"red-sm");    
}
InstantPricing.prototype.addQuestion=function(cid){
  var instance=this;
  var cat=this.getCategoryBlockByID(cid);
  if(cat){
    var input=cat.content[0].newInstantPricingQuestion[0].title[0].node;
    var val=input.options[input.selectedIndex].value.split(":");
    input.removeChild(input.options[input.selectedIndex]);
    input.selectedIndex=0;
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",cid);    
    params.addNameValue("Q1_ID",val[0]?val[0]:"");    
    params.addNameValue("Q2_ID",val[1]?val[1]:"");    
    params.addNameValue("Q3_ID",val[2]?val[2]:"");            
    params.addNameValue("mdl","instantPricing/addQuestion.aj");  
    ajaxPostFunction(params,function(sc,st,rt,rxml){ 
         var question=new HTMLParse(rt);
         cat.content[0].questionlist[0].appendObject(question.instantPricingQuestion[0]);
         instance.setupQuestion(question.instantPricingQuestion[0],true);
         var quest=question.instantPricingQuestion[0].content[0];
         for(var i=0;i<quest.instantPricingOption.length;i++){
           instance.setupOption(quest.instantPricingOption[i]);
         }
         if(quest.instantPricingOption.length==1) instance.expandOption(quest.instantPricingOption[0].node.getAttribute("Value_ID"));
       }
    ,"ajax.iml");   
  }
}
InstantPricing.prototype.expandQuestion=function(qid){
  var instance=this;
  var val=qid.split(":");
  var quest=this.getQuestionBlockByID(qid);
  this.loading(quest.content[0]);
  this.setupQuestion(quest,true);
  if(quest){
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);  
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",val[0]?val[0]:"");    
    params.addNameValue("Q1_ID",val[1]?val[1]:"");    
    params.addNameValue("Q2_ID",val[2]?val[2]:"");    
    params.addNameValue("Q3_ID",val[3]?val[3]:"");            
    params.addNameValue("mdl","instantPricing/listOptions.aj");  
    ajaxPostFunction(params,function(sc,st,rt,rxml){  
      quest.content[0].node.innerHTML=rt; var editor=new HTMLParse(quest.content[0].node);    
      if(editor.instantPricingOption){
        for(var i=0;i<editor.instantPricingOption.length;i++){
          instance.setupOption(editor.instantPricingOption[i])
        }
        if(editor.instantPricingOption.length==1) instance.expandOption(editor.instantPricingOption[0].node.getAttribute("Value_ID"));
      }
    }
    ,"ajax.iml");  
  }      
}
InstantPricing.prototype.collapseQuestion=function(qid){  
  var quest=this.getQuestionBlockByID(qid);  
  this.setupQuestion(quest);
}
InstantPricing.prototype.deleteQuestion=function(qid){
  var instance=this;
  var val=qid.split(":");
  var quest=this.getQuestionBlockByID(qid);
  if(quest&&confirm("You are about to delete pricing information. This action cannot be undone.  Do you want to continue?")){
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);  
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",val[0]?val[0]:"");    
    params.addNameValue("Q1_ID",val[1]?val[1]:"");    
    params.addNameValue("Q2_ID",val[2]?val[2]:"");    
    params.addNameValue("Q3_ID",val[3]?val[3]:"");            
    params.addNameValue("mdl","instantPricing/deleteQuestion.aj");  
    ajaxPostFunction(params,function(sc,st,rt,rxml){ 
         quest.node.parentNode.removeChild(quest.node);
     }
    ,'ajax.iml');  
  }
}


InstantPricing.prototype.setupOption=function(htmlobj,isopen){
  var instance=this;
  if(isopen){
    htmlobj.bump[0].node.onclick=function(){instance.collapseOption(this.getAttribute('Value_ID'))};
    if(htmlobj.title[0].morelink)  htmlobj.title[0].morelink[0].node.onclick=function(){instance.collapseOption(this.getAttribute('Value_ID'));return false;};    
    htmlobj.node.className="selectedline";
  }else{  
    htmlobj.bump[0].node.onclick=function(){instance.expandOption(this.getAttribute('Value_ID'))};
    if(htmlobj.title[0].morelink)  htmlobj.title[0].morelink[0].node.onclick=function(){instance.expandOption(this.getAttribute('Value_ID'));return false;};
    htmlobj.node.className="unselectedline";
  }
}
InstantPricing.prototype.expandOption=function(vid){
  var instance=this;
  var option=this.getOptionBlockByID(vid);
  if(option){
    this.setupOption(option,true);
    var val=vid.split(":");
    var val_list=option.node.getAttribute('Value_List').split(":|:");
    this.loading(option.content[0]);
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);  
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",val[0]?val[0]:"");    
    params.addNameValue("Q1_ID",val[1]?val[1]:"");    
    params.addNameValue("Q2_ID",val[2]?val[2]:"");    
    params.addNameValue("Q3_ID",val[3]?val[3]:"");            
    params.addNameValue("value1",val_list[0]?val_list[0]:"");            
    params.addNameValue("value2",val_list[1]?val_list[1]:"");            
    params.addNameValue("value3",val_list[2]?val_list[2]:"");          
    params.addNameValue("Value_ID",vid);  
    params.addNameValue("mdl","instantPricing/pricingForm.aj");  
    ajaxPostFunction(params,function(sc,st,rt,rxml){  
      option.content[0].node.innerHTML=rt; var editor=new HTMLParse(option.content[0].node);    
      instance.setupPricing(editor);
     }
     ,"ajax.iml");  
  }      
}
InstantPricing.prototype.collapseOption=function(vid){
  var option=this.getOptionBlockByID(vid);
  this.setupOption(option);
}

InstantPricing.prototype.sortPricing=function(htmlobj){
  var instance=this;
  for(i=htmlobj.pricingGrid[0].pricingRow.length-2;i>=1; i--){
     if(htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.value*1==NaN||htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.value=="") htmlobj.pricingGrid[0].removeObject(htmlobj.pricingGrid[0].pricingRow,i);
  }
  var br=new Array();
  var i=htmlobj.pricingGrid[0].pricingRow.length-1;
  if(htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.value!=""){
    htmlobj.pricingGrid[0].appendObject(htmlobj.pricingGrid[0].pricingRow[i],true);
  }
  br[0]=new Object();
  br[0].qty=htmlobj.pricingGrid[0].pricingRow[0].startqty[0].node.innerHTML*1;
  br[0].price=htmlobj.pricingGrid[0].pricingRow[0].priceperitem[0].node.value*1;
  for(i=1;i<htmlobj.pricingGrid[0].pricingRow.length-1; i++){
    br[i]=new Object();
    br[i].qty=htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.value*1;
    br[i].price=htmlobj.pricingGrid[0].pricingRow[i].priceperitem[0].node.value*1; 
    htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.onchange=function(){instance.updateQtyBreak(this.getAttribute("Value_ID"));};         
  }
  i=htmlobj.pricingGrid[0].pricingRow.length-1;
  htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.onchange=function(){instance.updateQtyBreak(this.getAttribute("Value_ID"));};         
  htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.value="";
  htmlobj.pricingGrid[0].pricingRow[i].endqty[0].node.innerHTML="";  
  br.sort(function(a,b){return a.qty-b.qty;});  
  htmlobj.pricingGrid[0].pricingRow[0].startqty[0].node.innerHTML=br[0].qty;
  htmlobj.pricingGrid[0].pricingRow[0].endqty[0].node.innerHTML="and up";
  htmlobj.pricingGrid[0].pricingRow[0].priceperitem[0].node.value=Number(br[0].price).minPrecision(2);
  for(i=1;i<br.length;i++){
    htmlobj.pricingGrid[0].pricingRow[i].startqty[0].node.value=br[i].qty;
    htmlobj.pricingGrid[0].pricingRow[i].endqty[0].node.innerHTML="and up";
    htmlobj.pricingGrid[0].pricingRow[i-1].endqty[0].node.innerHTML="to "+(br[i].qty-1);
    htmlobj.pricingGrid[0].pricingRow[i].priceperitem[0].node.value=Number(br[i].price).minPrecision(2);    
  }  
}
InstantPricing.prototype.setupPricing=function(htmlobj){
  var instance=this;
  if(htmlobj.prPiecesMultiplier)
    htmlobj.prPiecesMultiplier[0].node.onchange=function(){instance.updateMultiplier(this.getAttribute("Value_ID"),this.options[this.selectedIndex].innerHTML);};
  htmlobj.button[0].node.onclick=function(){instance.updatePricing(this.getAttribute("Value_ID"));};
  htmlobj.button[1].node.onclick=function(){instance.clearPricing(this.getAttribute("Value_ID"));};
  setMouseOver(htmlobj.button[0].node,"ff");    
  setMouseOver(htmlobj.button[1].node,"red-sm");
  this.sortPricing(htmlobj);
}
InstantPricing.prototype.updateQtyBreak=function(vid){
  var option=this.getOptionBlockByID(vid);
  this.sortPricing(option.content[0]);
}
InstantPricing.prototype.updateMultiplier=function(vid,label){
  var option=this.getOptionBlockByID(vid);
  if(option){
    for(var i=0; i<option.content[0].pricingGrid[0].pricingRow.length; i++){
      option.content[0].pricingGrid[0].pricingRow[i].qtylabel[0].node.innerHTML=label;
    }
  }      
}

InstantPricing.prototype.updatePricing=function(vid){
  var option=this.getOptionBlockByID(vid);
  var instance=this;
  if(option){
    var val=vid.split(":");
    var val_list=option.node.getAttribute('Value_List').split(":|:");    
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);  
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",val[0]?val[0]:"");    
    params.addNameValue("Q1_ID",val[1]?val[1]:"");    
    params.addNameValue("Q2_ID",val[2]?val[2]:"");    
    params.addNameValue("Q3_ID",val[3]?val[3]:"");            
    params.addNameValue("value1",val_list[0]?val_list[0]:"");            
    params.addNameValue("value2",val_list[1]?val_list[1]:"");            
    params.addNameValue("value3",val_list[2]?val_list[2]:"");          
    params.addNameValue("Value_ID",vid);  
    params.addContent(option.content[0].prSetupCharge[0].node);
    params.addContent(option.content[0].prSetupPercent[0].node);
    if(option.content[0].prPiecesMultiplier) params.addContent(option.content[0].prPiecesMultiplier[0].node);
    params.addContent(option.content[0].pricingGrid[0].pricingRow[0].priceperitem[0].node); 
    for(var i=1; i<option.content[0].pricingGrid[0].pricingRow.length-1; i++){
      params.addNameValue("QTY_BREAK",option.content[0].pricingGrid[0].pricingRow[i].startqty[0].node.value+":"+option.content[0].pricingGrid[0].pricingRow[i].priceperitem[0].node.value);  
    }
    params.addNameValue("mdl","instantPricing/updatePricing.aj");  
    this.loading(option.content[0]);
    ajaxPostFunction(params,function(sc,st,rt,rxml){  
      option.title[0].morelink[0].status_icon[0].node.src="instantPricing/images/defined.gif";    
      option.content[0].node.innerHTML=rt; var editor=new HTMLParse(option.content[0].node);    
      instance.setupPricing(editor);
     }
     ,"ajax.iml");  
  }      
}
InstantPricing.prototype.clearPricing=function(vid){
  var option=this.getOptionBlockByID(vid);
  var instance=this;
  if(option){
    var val=vid.split(":");
    var val_list=option.node.getAttribute('Value_List').split(":|:");    
    var params=new AjaxFormContent();
    params.addNameValue("DEBUG",1);  
    params.addNameValue("Ref_Type",this.refType);
    params.addNameValue("Ref_ID",this.refID);
    params.addNameValue("Cat_ID",val[0]?val[0]:"");    
    params.addNameValue("Q1_ID",val[1]?val[1]:"");    
    params.addNameValue("Q2_ID",val[2]?val[2]:"");    
    params.addNameValue("Q3_ID",val[3]?val[3]:"");            
    params.addNameValue("value1",val_list[0]?val_list[0]:"");            
    params.addNameValue("value2",val_list[1]?val_list[1]:"");            
    params.addNameValue("value3",val_list[2]?val_list[2]:"");          
    params.addNameValue("Value_ID",vid);  
    params.addNameValue("mdl","instantPricing/updatePricing.aj");  
    this.loading(option.content[0]);
    ajaxPostFunction(params,function(sc,st,rt,rxml){  
      option.content[0].node.innerHTML=rt; var editor=new HTMLParse(option.content[0].node);    
      instance.setupPricing(editor);
     }
     ,"ajax.iml");  
  }      
}


/******************  Calculate Price  ***********************/
InstantPricing.prototype.setQuantity=function(obj){
  var form=this.quoteForm;
  var i,j;
  var qty=Number(this.data.quantity.value);
  if(!(qty>0))qty="";
  var inputs=form.getElementsByTagName('input');
  for(i=0; i<inputs.length; i++){
    if(inputs[i].getAttribute('isQty')>0){
      inputs[i].value=qty;
    }
  }    
  inputs=form.getElementsByTagName('select');
  for(i=0; i<inputs.length; i++){
    if(inputs[i].getAttribute('isQty')>0){
      for(j=0; j<inputs[i].options.length; j++){
        if(inputs[i].options[j].value==qty) inputs[i].selectedIndex=j;
      }
    }
  }    
  this.recalculateForm(obj);
  if(WeightCalcObj)WeightCalcObj.recalculateForm();
}

InstantPricing.prototype.getQuestionValue=function(id,def){
  var val=def;  
  var found=false;
  var inputs=this.quoteForm.getElementsByTagName('input');
  for(i=0; i<inputs.length; i++){
    if(inputs[i].getAttribute('Question_ID')>0&&inputs[i].getAttribute('Question_ID')==id){
      val=Number(inputs[i].value)*1;      
      found=true;
    }    
  }    
  if(!found){
    inputs=this.quoteForm.getElementsByTagName('select');
    for(i=0; i<inputs.length; i++){
      if(inputs[i].getAttribute('Question_ID')>0&&inputs[i].getAttribute('Question_ID')==id){
        val=Number(inputs[i].options[inputs[i].selectedIndex].value)*1;      
        found=true;
      }            
    }
  }    
  return val;
}

InstantPricing.prototype.recalculateForm=function(obj){
  var form=this.quoteForm;
  this.repositionQuickTotal(obj);
  var options=new Array();
  var qty=0;
  var multiplier=1;  
  var index=0;
  var i;
  var inputs=form.getElementsByTagName('input');
  for(i=0; i<inputs.length; i++){
    if(inputs[i].getAttribute('Question_ID')>0&&inputs[i].checked){
      options[index]=new Object();
      options[index].id=inputs[i].getAttribute('Question_ID');
      options[index].choice=inputs[i].value.replace(/\s*$/,'');    
      options[index].type=inputs[i].type.toLowerCase();
      index++;
    } else if(inputs[i].getAttribute('Question_ID')>0&&inputs[i].getAttribute('isNumeric')>0){
      options[index]=new Object();
      options[index].id=inputs[i].getAttribute('Question_ID');
      options[index].choice=inputs[i].value.replace(/\s*$/,'');    
      options[index].type=inputs[i].type.toLowerCase();
      index++;    
    }
    if(inputs[i].getAttribute('isQty')>0){
      qty=Number(inputs[i].value);
    }
    if(inputs[i].getAttribute('Question_ID')>0&&inputs[i].getAttribute('Question_ID')==this.multiplierQuestion){
      multiplier=Number(inputs[i].value)*1;      
    }    
  }    
  inputs=form.getElementsByTagName('select');
  for(i=0; i<inputs.length; i++){
    if(inputs[i].getAttribute('Question_ID')>0){
      options[index]=new Object();
      options[index].id=inputs[i].getAttribute('Question_ID');
      options[index].choice=inputs[i].options[inputs[i].selectedIndex].value.replace(/\s*$/,'');   
      options[index].type='select'; 
      index++;
    }
    if(inputs[i].getAttribute('isQty')>0){
      qty=Number(inputs[i].options[inputs[i].selectedIndex].value);
    }
    if(inputs[i].getAttribute('Question_ID')>0&&inputs[i].getAttribute('Question_ID')==this.multiplierQuestion){
      multiplier=Number(inputs[i].options[inputs[i].selectedIndex].value)*1;      
    }            
  }    
  if(multiplier<1) multiplier=1; 
  this.calculatePricing(qty,options,multiplier);
}

InstantPricing.prototype.calculatePricing=function(qty,options,multiplier){
  if(!multiplier||multiplier<1) multiplier=1;
  var subTotal;
  this.data.quantity.value=qty;
  this.data.total.innerHTML=0;
  this.data.total2.innerHTML=0;
  this.data.totalinput.value=0;
  this.data.shippingtotalinput.value=0;
  this.data.totalEach.innerHTML=0;
  var i, j, k,x,  breaks;
  for(i=0; i<this.data.categories.length; i++){
    if(i>0){
       this.data.categories[i].cumulativeTotal=this.data.categories[i-1].cumulativeTotal;    
       this.data.categories[i].cumulativeShippingTotal=this.data.categories[i-1].cumulativeShippingTotal;    
    } else {
      this.data.categories[i].cumulativeTotal=0;
      this.data.categories[i].cumulativeShippingTotal=0;
    }
    this.data.categories[i].catTotal.innerHTML=0;
    for(j=0; j<this.data.categories[i].question.length; j++){
      this.getPricing(this.data.categories[i].question[j],options,i,qty*multiplier);
    }
    this.data.categories[i].cumulativeTotal+=Number(this.data.categories[i].catTotal.innerHTML);
    if(this.data.categories[i].isShipping==1) this.data.categories[i].cumulativeShippingTotal+=Number(this.data.categories[i].catTotal.innerHTML);
    this.data.total.innerHTML=this.data.categories[i].cumulativeTotal.toFixed(2);
    this.data.totalinput.value=this.data.categories[i].cumulativeTotal.toFixed(2);
    this.data.shippingtotalinput.value=this.data.categories[i].cumulativeShippingTotal.toFixed(2);
    this.data.total2.innerHTML=this.data.categories[i].cumulativeTotal.toFixed(2);
  }  
  if(qty>0) this.data.totalEach.innerHTML=(this.data.total.innerHTML/(qty*multiplier)).toFixed(this.unitPricePrecision);
  else this.data.totalEach.innerHTML=Number(0).toFixed(this.unitPricePrecision);
}

InstantPricing.prototype.marginalPricing=function(qty,pricing,mult){
   var total=0;
   var previousBreak=0;
   var previousPrice=pricing.subPricePerItem;
   total=pricing.subPricePerItem*this.data.minQty*mult;
   previousBreak=this.data.minQty;
   for(x=0;x<pricing.breaks.length&&qty-previousBreak>0;x++){
      if(qty>=pricing.breaks[x].qty){
        total+=previousPrice*(pricing.breaks[x].qty-previousBreak-1)*mult;
        previousBreak=pricing.breaks[x].qty-1
      }else{         
        total+=previousPrice*(qty-previousBreak)*mult;
        previousBreak=qty;
        break;
      }
      previousPrice=pricing.breaks[x].value; 
   }
   total+=previousPrice*(qty-previousBreak)*mult;
   return total;
}

InstantPricing.prototype.simplePricing=function(qty,pricing,mult){
   var unitPrice=pricing.subPricePerItem;
   for(x=0;x<pricing.breaks.length;x++){
      if(qty>=pricing.breaks[x].qty) unitPrice=pricing.breaks[x].value; 
   }
   return qty*unitPrice*mult;
}


InstantPricing.prototype.getPricing=function(question,options,cindex,qty){
  var multiplier, qty1;
  var value1=""; var value2=""; var value3="";
  var i,j,process,match,numericPricingValue;  
  var pricing=null;
  var subTotal=Number(this.data.categories[cindex].catTotal.innerHTML);
  for(i=0; i<question.pricing.length; i++){
     numericPricingValue=1;
     pricing=question.pricing[i];
     process=true;
     if(question.id1>0){
       match=false;
       for(j=0;j<options.length;j++){
         if(options[j].id==question.id1&&pricing.choice1==options[j].choice.replace(/\s*$/,'')){   match=true; break; }       
         if(options[j].id==question.id1&&pricing.choice1==""&&options[j].type=="text"){match=true; numericPricingValue=Number(options[j].choice); break;} 
            // match numeric input fields
       }
       if(!match) process=false;
     }
     if(process&&question.id2>0){
       match=false;
       for(j=0;j<options.length;j++){
         if(options[j].id==question.id2&&pricing.choice2==options[j].choice.replace(/\s*$/,'')){   match=true; break; }         
         if(options[j].id==question.id2&&pricing.choice2==""&&options[j].type=="text"){match=true; numericPricingValue=numericPricingValue*Number(options[j].choice); break;} 
       }
       if(!match) process=false;
     }
     if(process&&question.id3>0){
       match=false;
       for(j=0;j<options.length;j++){
         if(options[j].id==question.id3&&pricing.choice3==options[j].choice.replace(/\s*$/,'')){   match=true; break; }  
         if(options[j].id==question.id3&&pricing.choice3==""&&options[j].type=="text"){match=true; numericPricingValue=numericPricingValue*Number(options[j].choice); break;} 
                
       }
       if(!match) process=false;
     }
     if(process){
          multiplier=1;
          qty1=qty;
          if(pricing.piecesMultiplier>0){ multiplier=this.getQuestionValue(pricing.piecesMultiplier,1); }
          if(pricing.piecesQuestion>0){ qty1=this.getQuestionValue(pricing.piecesQuestion,0); }
          subTotal=subTotal+pricing.setupCharge;
          subTotal=subTotal+pricing.setupPercent*this.data.categories[cindex].cumulativeTotal/100;
          if(this.data.marginal)  subTotal=subTotal+this.marginalPricing(qty1*multiplier,pricing,numericPricingValue);
          else subTotal=subTotal+this.simplePricing(qty1*multiplier,pricing,numericPricingValue);         
     }
  }
  this.data.categories[cindex].catTotal.innerHTML=subTotal.toFixed(2);
}


