MQ.quizbuilder = new function() {
  var tabsets = {'qlists':['qs_you_wrote','qs_you_like','q_search'], 'main_tabs':['qwrite','qdb'], 'qimage':['pic_upload','pic_search']};
  function qli(qtext, qid, add_handlers) {
    var li = jq("<li class='quiz_builder_q'></li>").addClass("q_"+qid);
    if (add_handlers) {
      li.mouseover(function() { jq(this).addClass('hover'); });
      li.mouseout(function() { jq(this).removeClass('hover'); });
      li.click(function() { MQ.quizbuilder.question.toggle(!jq(this).hasClass('selected'), qtext, qid); });
      var div = jq('<div></div>').html(qtext);
      li.append(div);
    }
    else {
      var div = jq('<div></div>');
      var span = jq('<span></span>');
      var a = jq("<a href='#' class='quiz_remover'><img src='/images/assets/delete_topic.png' /></a>").addClass("remove_"+qid).click(function(){MQ.quizbuilder.question.remove(qid);return false;});
      span.append(a);
      div.append(span).append(qtext);
      li.append(div);
    }
    return li;
  }
  this.show_writeform = function(elt, options) {
    jq('#xx_answers_container .answers tr').removeClass('selected');
    jq(elt).closest('tr').addClass('selected');
    jq('.the_qwrite_container').slideUp('fast');
    MQ.quizbuilder.setup_writeform(options);
    jq('.the_qwrite_container').slideDown('fast');
  }
  this.answer_option_containers = function() {
    return jq('.write_the_question_container .answers tr.answer_option_container')
  }
  function radio_click(e) {
    MQ.quizbuilder.answer_option_containers().removeClass('selected');
    jq(e.target).closest('tr').addClass('selected');
    MQ.quizbuilder.question.answers.validate();
  }
  this.setup_writeform = function(options) {
    options = options || {};
    options['type'] = (options['type'] || 'trivia'); // or 'poll' or 'personal'
    var qtypes = {'trivia':0, 'personal':1, 'poll':2};
    jq('.write_the_question_container').removeClass('trivia personal poll').addClass(options['type']);
    jq('#question_type_id').val(qtypes[options['type']]);
    //MQ.topics.search_autocomplete('question_tag_list', true); 
    jq('.write_the_question_container td.radio input').die('click', radio_click).live('click', radio_click);
    jq('.write_the_question .validate').removeClass('warn').unbind('blur', MQ.quizbuilder.question.validate).bind('blur', MQ.quizbuilder.question.validate);
    jq('.answer_option_container .validate').removeClass('warn').unbind('blur', MQ.quizbuilder.question.answers.validate).bind('blur', MQ.quizbuilder.question.answers.validate);
    MQ.utils.activate_inputs();
    jq('#image_search').disable_enter_key();
    jq('.write_the_question_container .answers tr:first').addClass('selected');
    (options['type'] == 'poll' ? jq('.write_the_question_container .radio').hide() : jq('.write_the_question_container .radio').show());
  }
  this.question = new function() {
    function validate_qbonus() {
      if (jq('.write_the_question_container .valid').length>=2 && MQ.quizbuilder.question.validate()) {
        jq('.qbonus').removeClass('bonus_off').addClass('bonus_on');
        MQ.audio.play('right');
        jq('#write_submit').removeAttr('disabled');
      } else {
        jq('.qbonus').removeClass('bonus_on').addClass('bonus_off');
        jq('#write_submit').attr('disabled','disabled');
      }
    }
    this.validate = function() {
      jq('.validate').removeClass('warn').removeClass('valid');
      // check the question
      var the_q = jq.trim(jq('#question_qtext').val());
      if (the_q=='Type your question here' || the_q=='') {
        jq('#question_qtext').addClass('warn');
        MQ.notice.show("Don't forget to write a question!", 5000, 'wrong');
        return false;
      }
      else { return true; }
    }
    this.answers = new function() {
      this.validate = function() {
        jq('.validate').removeClass('warn').removeClass('valid');
        var no_correct_answer = true;
        var valid_answer_count = 0;
        MQ.quizbuilder.answer_option_containers().each(function(i,a) {
          a = jq(a);
          var ans = a.find('input.answer_option');
          var val = jq.trim(ans.val()).toLowerCase();
          if (val=='' || val=='option') { ans.addClass('warn'); }
          else { 
            ans.addClass('valid');
            if (a.hasClass('selected')) { no_correct_answer = false; }
            valid_answer_count+=1;
          }
        });
        if (no_correct_answer && (jq('#question_type_id').val()!=2)) {
          validate_qbonus();
          MQ.notice.show("You need to write a correct answer.", 5000, 'wrong');
          return false;
        }
        if (valid_answer_count<2) {
          validate_qbonus();
          MQ.notice.show("Don't forget to write at least two answer options!", 5000, 'wrong');
          return false;
        }
        validate_qbonus();
      }
      function refresh_options() {
        MQ.quizbuilder.answer_option_containers().each(function(i,tr){
          var inputs = tr.getElementsByTagName('input');
          jq.each(inputs, function(j, input) {
            input = jq(input);
            if (input.hasClass('answer_option')) { input.attr('name', 'answers['+i+'][atext]').attr('id', 'answers_'+i+'_atext'); }
            else {input.val(i); }
            
          });
        });
        MQ.utils.activate_inputs();
        (MQ.quizbuilder.answer_option_containers().length>=6 ? jq('.add_another_option').hide() : jq('.add_another_option').show());
        MQ.quizbuilder.question.answers.validate();
        (jq('#question_type_id').val()==2 ? jq('.write_the_question_container .radio').hide() : jq('.write_the_question_container .radio').show());
      }
      this.remove = function(remove_elt) {
        jq(remove_elt).closest('tr.answer_option_container').remove();
        refresh_options();
      }
      this.add = function() {
        var i = MQ.quizbuilder.answer_option_containers().length+1;
        var html = MQ.h('tr', "class='answer_option_container'", [MQ.h('td', "class='radio'", MQ.h('div', "class='roundleft'", MQ.h('input', "type='radio' name='correct_idx' value="+i))),
            MQ.h('td', "style='width:400px;'", MQ.h('div', "class='roundright'", MQ.h('input', "class='answer_option inactive' type='text' value='Option' id='' name='' class='inactive'"))),
            MQ.h('td', '', MQ.h('a', "style='font-size:x-small' href='#' onclick='MQ.quizbuilder.question.answers.remove(this);return false;'", "remove"))
            ]);
        jq('.write_the_question_container table.answers').append(html);
        refresh_options();
      }
    }
    this.write = function() {
      //jq('#bonuses').slideUp();
      jq('#write_loading').show();
      jq('#q_create_form').submit();
    }
    this.write_callback = function() {
      jq('#write_loading').hide();
      var response = jq('#q_upload_iframe').contents().find('body');
      if (response.text()) {
        var data = eval("("+response.text()+")");
        if (data.error) {
          MQ.notice.show(data.error, 10000, 'wrong');
          jq('.bonus_button').show();
        } else {
          //MQ.quizbuilder.question.add(data.qtext, data.qid);
          if (data.exec) { eval(data.exec) }
          jq('#qwrite_container').html(data.writeform);
        }
      }
    }
    this.add = function(qtext, qid) {
      jq('li.q_'+qid).addClass('selected');
      // add name to list
      jq('#quiz_questions_list').append(qli(qtext,qid, false)).yellowFade();; 
      jq('.your_quiz').yellowFade();
      // add id to hidden
      jq('#quiz_qids').val(jq('#quiz_qids').val() + (qid + ','));
      // update msg
      MQ.utils.decrement_html('#quiz_remaining_qs');
      update_z_msg();
      jq.scrollTo('max', 500);
    }
    this.remove = function(qid) {
      jq('li.q_'+qid).removeClass("selected").removeClass('hover');
      jq('.remove_'+qid).parents('li:first').remove();
      var search = new RegExp(qid+',','gi');
      jq('#quiz_qids').val(jq('#quiz_qids').val().replace(search,''));
      MQ.utils.increment_html('#quiz_remaining_qs');
      update_z_msg();
    }
    function update_z_msg() {
      jq('#questions_msg, #get_started_msg, #no_questions_msg, #more_questions_msg, #ready_to_submit_msg').hide();
      var zlen = (jq('#quiz_questions_list li').length);
      if (zlen>=5) {
        jq('#ready_to_submit_msg, .builder_msg').show(); 
      } else if (zlen>0 && zlen<5) {
        jq('#more_questions_msg, .builder_msg').show(); 
      } else if (zlen==0) { 
        jq('#questions_msg, #no_questions_msg, #get_started_msg').show(); 
      }
    }
    this.toggle = function(add, qtext, qid) { // add is boolean
      (add ? this.add(qtext, qid) : this.remove(qid));
    }
  }
  this.show_tab = function(type, id_to_show) {
    jq.each(tabsets[type], function(i, b) { 
      jq('#'+b+'_tab').removeClass('selected');
      jq('#'+b+'_container').hide();
    });
    jq('#'+id_to_show+'_tab').addClass('selected');
    jq('#'+id_to_show+'_container').show();
  }
  this.fetch = function(options) {
    jq('img.loading_qs').show();
    options = options || {};
    options['type'] = (options['type'] || 'qs_you_wrote');
    options['page'] = (options['page'] || '1');
    options['sort'] = (options['sort'] || 'recent');
    var request = MQ.ajax('/quiz/fetch',options, function(data){ MQ.quizbuilder.build_bucket(options['type'], data)},'json');
  }
  this.search = function(query) {
    jq('.qdb_topicsearch').val(query);
    MQ.quizbuilder.fetch({type:'q_search',sort:'ups',page:1,tag:query});
  }
  this.build_bucket = function(elt_id, data) {
    var qs = data['questions'];
    // get rid of existing questions
    jq('#'+elt_id+" li.quiz_builder_q").remove();

    var qlist = jq('#'+elt_id);
    jq.each(qs, function(i,q){
      var row = qli(q.qtext, q.id, true); 
      qlist.append(row);
    });
    jq.each(['_top_','_bottom_'], function(i,p) {
      jq('#'+elt_id+p+'controls').html(data['sort_controls']);
      jq('#'+elt_id+p+'controls').show();
    });
    jq('#'+elt_id+'_qdb_list_container_container').show();
    jq('img.loading_qs').hide();
  }
  this.build_all_buckets = function() {
    buckets.each(function(list_id){ this.build_bucket(list_id); }.bind(this));
  }
  this.validate_bonus = function(elt_stub) {
    var elt_id = '.add_'+elt_stub;
    var input_val = jq(elt_id+' :input:first').val();
    if (elt_stub=='topics') {
      var bonus_num = jq.grep(input_val.split(','), function(x) { return jq.trim(x)!=''}).length;
      jq('.topics_bonuses_total').html(''+(bonus_num>=5 ? 20 : bonus_num*4));
      jq(elt_id+' .bonus').removeClass('bonus_on').addClass('bonus_off');
      if (bonus_num > 0) {
        jq(elt_id+' .bonus:lt('+bonus_num+')').addClass('bonus_on').removeClass('bonus_off');
        jq(elt_id+' .write_ok').show();
      }
    }
    else {
      var valid = function() {
        switch(elt_stub) {
          case 'ex':
            return (input_val!='');
            break;
          case 'lml':
            var v = new RegExp();
            v.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.=]+$"); 
            return v.test(input_val);
            break;
          case 'pic':
            return jq('.add_pic .selected').length>0;
            break;
        }
      }
      if (valid()) {
        jq(elt_id+' .bonus').addClass('bonus_on').removeClass('bonus_off');
        jq(elt_id+' .write_ok').show();
      } else {
        jq(elt_id+' .bonus').addClass('bonus_off').removeClass('bonus_on');
        jq(elt_id+' .write_ok').hide();
      }
    }
  }
  this.validate_publish = function() {
    var valid=true;
    jq.each(['image','description','title'], function(i,f) {
      var input = jq('#quiz_'+f);
      if (jq.trim(input.val())=='') {
        jq('#quiz_publish_error').html("Please add "+(f=='image' ? 'an ' : 'a ')+f+"!").show();
        input.addClass('warn');
        valid=false;
      } else {
        input.removeClass('warn');
      }
    });
    return valid;
  }
}
