var formSend;
var Questions;
var QueryString = "";
var Forms;
var Texts;
var Exits;
var Step = 1;
var Validator;
var Validator2;
var prevStep;

$(document).ready (function () {
  $("#formSend").toggleClass("send").attr({
    id: "formSend",
    method: "post",
    action: "client.php?act_add_ticket",
    enctype: "multipart/form-data"
  });
  
  $.get("quiz.xml?"+Math.random(),null,createQuiz,"xml");
  
  jQuery.validator.addMethod("phone", function (phone_number, element) {
	return this.optional(element) || phone_number.length >= 11 && phone_number.length <= 16 &&
		phone_number.match(/^[+]\d{11,14}$/);
  }, "Пожалуйста, укажите номер отправителя");

  jQuery.validator.addMethod("datetime", function (date_time, element) {
	return this.optional(element) || date_time.length >= 10 &&
		date_time.match(/^\d{2}\.\d{2}\.\d{4}\s(\d{2}\:\d{2}|[а-яА-Я0-9: - \s.\w]{4,18})$/);
  }, "Пожалуйста, укажите примерное время отправки");
    
  Validator = $("#formQuest").validate ({
    errorPlacement: function (error, element) {
      error.appendTo (element.parent().next());
    },
   success: function (label) {
      label.html("&nbsp;").addClass("checked");
    }
  });
  Validator2 = $("#formSend").validate ({
    errorPlacement: function (error, element) {
        error.appendTo (element.parent().next());
    },
   success: function (label) {
      label.html("&nbsp;").addClass("checked");
    },
    submitHandler: function (form) {
      showProgress ();
      form.submit ();
    }
  });
  $("#formQuest").className = "";
  $("#scr_close").click(function() {$("#scr").hide();return false;});
});

function showSendForm (num) {
  showExit (num);
  
  $("#formSend").css("display","block");
  $("#formQuest").hide();
  
  $("<input type='hidden'/>").attr({
    value: QueryString,
    name: "message_text"
  }).appendTo("#formSend");
  
  $("<input type='hidden'/>").attr({
    value: new Date().toString(),
    name:"local_time"
  }).appendTo("#formSend");
}  

function createQuiz (xmldoc) {
  createQuestions ($("questions",xmldoc));
  Forms = createForms ($("forms",xmldoc));
  createTexts ($("texts",xmldoc));
  Exits = createForms ($("exits",xmldoc));
  prevStep = null;
  showText (3);
}

function Text (text, next) {
  this.text = text;
  this.next = next;
}

function Form (caption,inputs,action,next) {
  this.caption = caption;
  this.inputs = inputs;
  this.action = action;
  this.next = next;
}

function Question (name,caption,quest,def,action,next,values) {
  this.caption = caption;
  this.quest = quest;
  this.def = def;
  this.action = action;
  this.next = next;
  this.name = name;
  this.values = values;
}

function Input (type,name,label,desc,req,onchange,onsubmit,rules) {
  this.type = type;
  this.name = name;
  this.label = label;
  this.desc = desc;
  this.req = req;
  this.onchange = onchange;
  this.submit = onsubmit;
  this.obj = null;
  this.rules = rules;
}

function getRadioValue (radio) {
  for (var i=0; i<radio.length; i++)
    if (radio[i].checked)
      return i;
  return 0;
}

function createQuestions (xmlquest) {
  Questions = new Array ();
  xmlquest = $("question",xmlquest);
  for (var i=0;i<xmlquest.length;i++) {
    var qid = $(xmlquest[i]).attr("id");
    var name = $(xmlquest[i]).attr("name");
    var caption = $("caption",xmlquest[i]).text();
    var action = $("action",xmlquest[i]).text();
    var options = $("options",xmlquest[i]);
    var def = options.attr("default");
    var quest = new Array ();
    var next = new Array ();
    var values = new Array ();
    options = $("option",options);
    for (var j=0;j<options.length;j++) {
      quest[j] = $(options[j]).text();
      next[j] = createNextCall($(options[j]).attr("next"),$(options[j]).attr("next_num"));
      values[j] = $(options[j]).attr("val");
    }
    Questions[qid] = new Question(name,caption,quest,def,action,next,values);
  }
}

function createForms (xmlforms) {
  var fForms = new Array;
  xmlforms = $("form",xmlforms);
  for (var i=0;i<xmlforms.length;i++) {
    var fid = $(xmlforms[i]).attr("id");
    var caption = $("caption",xmlforms[i]).text();
    var action = $("action",xmlforms[i]).text();
    var next = createNextCall($(xmlforms[i]).attr("next"),$(xmlforms[i]).attr("next_num"));
    
    var xmlinputs = $("inputs",xmlforms[i]);
    xmlinputs = $("input",xmlinputs);
    var inputs = new Array ();
    for (var j=0;j<xmlinputs.length;j++) {
      var label = $("label",xmlinputs[j]).text();
      var desc = $("description",xmlinputs[j]).text(); 
      var rules = $("rules",xmlinputs[j]).text();
      inputs[j] = new Input ($(xmlinputs[j]).attr("type"),$(xmlinputs[j]).attr("name"),label,desc,$(xmlinputs[j]).attr("req"),$(xmlinputs[j]).attr("onchange"),$(xmlinputs[j]).attr("submit"),rules);
    }
    fForms[fid] = new Form(caption,inputs,action,next);
  }
  return fForms;
}

function createTexts (xmltexts) {
  Texts = new Array;
  xmltexts = $("text",xmltexts);
  for (var i=0;i<xmltexts.length;i++) {
    var tid = xmltexts[i].getAttribute("id");
    var next = createNextCall(xmltexts[i].getAttribute("next"),xmltexts[i].getAttribute("next_num"));
    Texts[tid] = new Text(xmltexts[i].firstChild.data,next);
  }
}

function createNextCall (type,num) {
  if (type == "form")
    return function () {showForm(num);}
  else if (type == "query")
    return function () {showQuery(num);}
  else if (type == "text")
    return function () {showText(num);}
  else if (type == "exit")
    return function () {showSendForm(num);}
}

function showExit (fnum) {
  $("#formQuest").empty();

  $("<h3></h3>").text(Exits[fnum].caption).appendTo("#formSend");
  var fd = $("<div></div>").attr("class","fdiv").appendTo("#formSend");

  var fh = $("<table></table>").attr({
    cellspacing:"0",
    cellpadding:"0"
  });
  var fs = $("<tbody></tbody>").appendTo(fh);
    
  for (var i=0;i<Exits[fnum].inputs.length;i++) {
    var itr = $("<tr></tr>");
    var ltd = $("<td></td>").attr("class","label").appendTo(itr);
    if (Exits[fnum].inputs[i].req == 1)
      ltd.addClass("required");
    var label = $("<label></label>").text(Exits[fnum].inputs[i].label).attr("for",Exits[fnum].inputs[i].name).appendTo(ltd);  

    var itd = $("<td></td>").attr("class","input").appendTo(itr);
    var input;
    if (Exits[fnum].inputs[i].type == "text" || Exits[fnum].inputs[i].type == "file") {
      input = $("<input type='"+Exits[fnum].inputs[i].type+"'>").attr({
        name: Exits[fnum].inputs[i].name,
        value: "",
        id: Exits[fnum].inputs[i].name});
      if (!i) input.focus (function () {Validator2.resetForm();this.onfocus=null;});
      Exits[fnum].inputs[i].obj = input;
      input.appendTo(itd);
      
      if (Exits[fnum].inputs[i].type == "text") {
        $("<span></span>").html(Exits[fnum].inputs[i].desc).appendTo(itd);
      }
      else if (Exits[fnum].inputs[i].type == "file") {
        var sp = $("<span>").appendTo(itd);
        $("<a href=''>"+Exits[fnum].inputs[i].desc+"</a>").click(function () {showHlpDiv(); return false;}).appendTo(sp);
      }
    }
    else if (Exits[fnum].inputs[i].type == "textarea") {
      input = $("<textarea></textarea>").attr({
        name:Exits[fnum].inputs[i].name,
        id:Exits[fnum].inputs[i].name
      }).appendTo(itd);
      Exits[fnum].inputs[i].obj = input;
      $("<span></span>").html(Exits[fnum].inputs[i].desc).appendTo(itd);
      itd.appendTo (itr);
    }
    else if (Exits[fnum].inputs[i].type == "captcha") {
      itd.attr("class","captcha");
      label.attr("class","captcha_label");
      
      input = $("<input type='text'/>").attr({
        name:Exits[fnum].inputs[i].name,
        value:"",
        id:Exits[fnum].inputs[i].name
      }).appendTo(itd);
      
      Exits[fnum].inputs[i].obj = input;
      
      var img = $("<img />").attr({
        src: "cap.php?"+Math.random(),
        alt: "captcha"
      }).appendTo(itd);  
      itd.appendTo(itr);
      var desc = $("<span></span>").appendTo(itd);
      var ad = $("<a></a>").attr("href","#").text(Exits[fnum].inputs[i].desc).bind("click",function () {
        refreshCaptcha(img);
        input.val("");
        return false;
      }).appendTo(desc);
    }
    itd = $("<td></td>").attr("class","status").appendTo(itr);
    itr.appendTo(fs);
  }
  
  fh.appendTo (fd);
  
  for (var i = 0; i < Exits[fnum].inputs.length; i++) {
    if (Exits[fnum].inputs[i].rules != "") {
        eval("var rules="+Exits[fnum].inputs[i].rules);
        $("#"+Exits[fnum].inputs[i].name).rules("add",rules);
          if (!i) $("#"+Exits[fnum].inputs[i].name).focus ();
    }
  }
  
  $("<input type='submit'/>").attr({
    value: Exits[fnum].action,
    id: "nextStep",
    "class":"buttonEnabled"
  }).appendTo("#formSend");
}

function refreshCaptcha (img) {
  img.attr("src","cap.php?"+Math.random());
}

function phpCallback (success,message) {
  if (success)
    showThx ("Спасибо! Ваша заявка принята к рассмотрению.<br>Ответ по заявке будет отправлен по указанному вами контактному адресу.");
}

function showProgress () {
  $("<img/>").attr({
    src:"images/send.gif",
    alt:""}).appendTo("#formQuest");
  $("#formSend").css("display","none");
  $("#formQuest").css("display","block");
}

function showForm (fnum) {
  $("#formQuest").empty();
  
  var fh = $("<h3/>");
  $("<strong/>").text(("Шаг "+Step+": ")).appendTo(fh);
  fh.html(fh.html() + Forms[fnum].caption).appendTo("#formQuest");

  var fd = $("<div/>").attr("class","fdiv").appendTo("#formQuest");
  
  fh = $("<table/>").attr({
    cellspacing:0,
    cellpadding:0
  }).appendTo(fd);

  var fb = $("<tbody/>");
  fb.appendTo(fh);
  fh = fb;
    
  for (var i=0;i<Forms[fnum].inputs.length;i++) {
    var itr = $("<tr/>");
    
    if (i == 0)
      itr.addClass("first");
    if (i == Forms[fnum].inputs.length-1)
      itr.addClass("last");
    
    var ltd = $("<td/>").attr("class","label");
    if (Forms[fnum].inputs[i].req == 1)
      ltd.addClass("required");

    var label = $("<label/>").attr("for",Forms[fnum].inputs[i].name).text(Forms[fnum].inputs[i].label).appendTo(ltd);
    ltd.appendTo(itr);

    var itd = $("<td>").attr({
      id:"q"+i,
      "class":"input"});

    var input;
    if (Forms[fnum].inputs[i].type == "text" || Forms[fnum].inputs[i].type == "file") {
      input = $("<input type='"+Forms[fnum].inputs[i].type+"'/>").attr({
        name: Forms[fnum].inputs[i].name,
        value: "",
        id: Forms[fnum].inputs[i].name});
      if (!i) input.bind("focus",function () {Validator.resetForm();this.onfocus=null;});
    }
    else if (Forms[fnum].inputs[i].type == "textarea") {
      input = $("<textarea></textarea>").attr({
        name:Forms[fnum].inputs[i].name,
        id:Forms[fnum].inputs[i].name
      }).appendTo(itd);
      if (!i) input.bind("focus",function () {Validator.resetForm();this.onfocus=null;});
    }
    Forms[fnum].inputs[i].obj = input;
    input.appendTo(itd);
    
    if (Forms[fnum].inputs[i].type == "file") {
      var sp = $("<span>");
      $("<a>"+Forms[fnum].inputs[i].desc+"</a>").attr("href","").click(function () {showHlpDiv();return false;}).appendTo(sp);
      sp.appendTo(itd);
    } else {    
      $("<span/>").html(Forms[fnum].inputs[i].desc).appendTo(itd);
    }
    itd.appendTo(itr);
    itd = $("<td/>").attr("class","status").appendTo(itr);
    itr.appendTo (fh);
    
    if (Forms[fnum].inputs[i].rules != "") {
      eval("var rules="+Forms[fnum].inputs[i].rules);
      $("#"+Forms[fnum].inputs[i].name).rules("add",rules);
        if (!i) $("#"+Forms[fnum].inputs[i].name).focus ();
    }
  }

  $("<input type='submit'/>").attr({
    value: Forms[fnum].action,
    id: "nextStep",
    "class":"buttonEnabled"
  }).appendTo("#formQuest");
  
  Validator.resetForm();
  
  document.getElementById("formQuest").onsubmit = function () {
    if ($("#formQuest").valid()) 
      processForm (fnum); 
    return false;
  };
}

function goBack () {
  prevStep ();
}

function processForm (fnum) {
  Step ++;
  var form = document.getElementById("formQuest");
  for (var i=0;i<Forms[fnum].inputs.length;i++) {
  
    if(Forms[fnum].inputs[i].name != "sb_screen")
      QueryString += '@BEGIN@'+Forms[fnum].inputs[i].label+'@EQUALS@'+form[Forms[fnum].inputs[i].name].value+'@END@\r\n'; 
      
    $("#"+Forms[fnum].inputs[i].name).rules("remove");
    $(Forms[fnum].inputs[i].obj).css("display","none").appendTo("#formSend");
  }
  if (Forms[fnum].next)
    Forms[fnum].next ();
  return false;
}

function showQuery (qnum) {
  $("#formQuest").empty();
  
  var fh = $("<h3/>");
  var fs = $("<strong/>").text("Шаг "+Step+": ").appendTo(fh);
  fh.html(fh.html() + Questions[qnum].caption).appendTo("#formQuest");
  
  fh = $("<table/>").attr({
    cellspacing:0,
    cellpadding:0,
    "class":"query_table"
  }).appendTo("#formQuest");
  fs = $("<tbody/>").appendTo(fh);
  
  for (var i=0;i<Questions[qnum].quest.length;i++) {
    var itr = $("<tr/>").appendTo(fs);
    
    var itd = $("<td/>").attr({
      "class":"radio",
      id:"q"+i
    }).appendTo(itr);
    var str = "<input type='radio' name='q' id='q"+i+"' value='"+Questions[qnum].values[i]+"'";
    if (i == Questions[qnum].def) str+= " checked>";
    else str+= ">";
    $(str).appendTo(itd);
    
    itd = $("<td/>").appendTo(itr);
    var label = $("<label>").attr("for","q"+i).text(Questions[qnum].quest[i]).appendTo(itd);
  }

  $("#q"+Questions[qnum].def).attr("checked","checked");
  var sbm = $("<input type='submit' id='nextStep' class='buttonEnabled' value='"+Questions[qnum].action+"'>").appendTo("#formQuest");

  document.getElementById("formQuest").onsubmit = function () {
    return processQuery (this.q,qnum);
  };
}

function processQuery (radio, qnum) {
  $("#inf_head").hide();
  $("#inf_body").hide();
  Step ++; 
  
  QueryString += '@BEGIN@' +  Questions[qnum].caption + '@EQUALS@' + Questions[qnum].quest[[getRadioValue(radio)]]+'@END@\r\n';
  $("<input type='hidden'/>").attr({
    name: Questions[qnum].name,
    value: Questions[qnum].values[getRadioValue(radio)]
  }).css("display","none").appendTo("#formSend");
  
  if (Questions[qnum].next[getRadioValue(radio)])
    Questions[qnum].next[getRadioValue(radio)] ();
  return false;
}

function showText (tnum) {
  $("#formQuest").empty ();
  
  var fd = $("<div/>").attr("class","ftext").appendTo("#formQuest");
  
  fd.html(Texts[tnum].text);
  
  var sbm = $("<input type='submit'/>").attr("value","Мне помогла эта информация");
  if (tnum==3)
      sbm.attr("value","Проблема решилась");
  sbm.attr({
    "id":"infConfirm",
    "class":"buttonEnabled"
  }).appendTo("#formQuest");
  sbm.bind("click",function () {return processText (tnum,1);});

  sbm = $("<input type='submit'/>").attr("value","Эта информация мне не помогла");
  if (tnum==3)
    sbm.attr("value","Проблема не решается");
  sbm.attr({
    "id":"infDecline",
    "class":"buttonEnabled"
  }).appendTo("#formQuest");;
  sbm.bind("click", function () {return processText (tnum,0);});
    
  document.getElementById("formQuest").onsubmit = function () {return processText (tnum,0);}  
}

function processText (tnum,help) {
  $("#inf_head").hide();
  $("#inf_body").hide();
  if (!help)  {
    Texts[tnum].next ();
    if (tnum==3)
      pageTracker._trackPageview("problem_not_solved");
  } else { 
    if (tnum==3)
      pageTracker._trackPageview("problem_solved");
    showThx ();
  }
  return false;
}

function showHlpDiv () {
  $("#scr").show ();
}

function showThx (message) {
  $("#formQuest").empty();
  
  var ft = $("<h3/>").attr("class","thx");
  if (!message)
    ft.text("Мы рады, что смогли Вам помочь. Вы всегда можете обратиться к нам за помощью.");
  else {
    ft.html(message);
  }  
  ft.appendTo("#formQuest");
}
