// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

function enable_options_for_demographics()
{
	for(i = 0; i < $$('.demo-check-box').length; i++ )
		{
			$$('.demo-check-box')[i].disabled = false;
		}
	
	for(i=0; i < $$('.demo-text-field').length; i++)
		{
			$$('.demo-text-field')[i].disabled = false;
		}
	return true;
	
}

function disable_options_for_demographics()
{
	for(i = 0; i < $$('.demo-check-box').length; i++ )
		{
			$$('.demo-check-box')[i].disabled = true;
		}
	
	for(i=0; i < $$('.demo-text-field').length; i++)
		{
			$$('.demo-text-field')[i].disabled = true;
		}
	return true;
}


var AssignPollTags = {
	click_tag : function(tag) {
		var tags = $('tag_list').value;
		var reg = new RegExp("\\b"+tag+"\\b","ig");
		if(reg.test(tags)) {
			return false;
		}
		if(tags.length > 0 && tags[tags.length-1] != ' ') {
			tags += ' ';
		}
		tags += tag;
		$('tag_list').value = tags;
		$('tag_'+tag).className = 'light';
		
		return true;
	},
	update_tags : function() {
		var tags = $('tag_list').value.split(' ');
		var suggests = $('suggested_tags').descendants();
		
		// clear all the classes
		suggests.each(function(li){
			//Element.show(li);
			li.className = null;
		});

		// make light any suggestions matching user typed tokens
		tags.each(function(tag){
			li = $('tag_'+tag);
			if(li) {
				//Element.hide(li)
				li.className = 'light';
			}
		});
		return true;
	},
	type_tag : function() {
		setTimeout('AssignPollTags.update_tags()',50);
		return true;
	}
}

var Results = {
	enable_source : function(chk) {
		if(chk.value == 's')
			Element.show('sources');
		else
			Element.hide('sources');
	},
	update_graph : function(html) {
	  $('result_graphs').innerHTML = html;
	  html.evalScripts();
	},
	
	// a little nonoptimal here - but we do the view update and then the ajax request
	add_widget : function(result_id, widget_id) {
		new Insertion.Top('sources_payload', "<input type='hidden' name='widgets[]' value='~id~' id='wp_~id~'>".gsub('~id~',widget_id));
		new Effect.Fade('wa_'+widget_id);
		new Effect.Appear('ws_'+widget_id);
		new Effect.Highlight('ws_'+widget_id,{duration:3});
	  new Ajax.Request('/results/'+result_id+'/add_widget/'+widget_id,{onSuccess:Results.modify_widget_success});
	},
	remove_widget : function(result_id, widget_id) {
		Element.remove('wp_'+widget_id);
		new Effect.Fade('ws_'+widget_id);
		new Effect.Appear('wa_'+widget_id);
		new Effect.Highlight('wa_'+widget_id,{duration:3});
	  new Ajax.Request('/results/'+result_id+'/remove_widget/'+widget_id,{onSuccess:Results.modify_widget_success});
	},
	modify_widget_success : function(t) {
	  Results.update_graph(t.responseText);
	},
	add_filter : function(result_id) {
	  var choice_id = $('choices').value;
	  if(choice_id == "0") {
	    alert('Please select a question choice to filter on.');
	    return false;
	  }
	  new Ajax.Request('/results/'+result_id+'/add_filter/'+choice_id,{onSuccess:Results.add_filter_success})
    return false;
	},
	add_filter_success : function(t) {
	  var result = eval(t.responseText);
	  new Insertion.Bottom('result_filters', result[0]);
	  Results.update_graph(result[1]);
	},
	delete_filter : function(result_id, filter_id) {
	  if(!confirm('Click OK to remove this filter from your exploration.'))
	    return false;
	  new Ajax.Request('/results/'+result_id+'/delete_filter/'+filter_id,{onSuccess:Results.delete_filter_success});
    return false;
	},
	delete_filter_success : function(t) {
	  var result = eval(t.responseText);
	  Element.remove("filter_"+result[0]);
	  Results.update_graph(result[1]);
	},
	update_filter_success : function(t) {
	  var result = eval(t.responseText);
	  
	  new Effect.Highlight("result_filter_form_"+result[0]);
	  
	  Results.update_graph(result[1]);
	},
	update_filter_failed : function(t) {
	  alert(t.responseText);
	},
	update_dates : function(result_id) {
	  var regDate = /\d{1,2}\/\d{1,2}\/\d{4}/;
	  if(($('result_take_date_start').value != '' && !regDate.test($('result_take_date_start').value)) ||
	     ($('result_take_date_end').value != '' && !regDate.test($('result_take_date_end').value))) {
      alert('Date values must be of the form mm/dd/yyyy.');
      return false;
    }
	  new Ajax.Request('/results/'+result_id+'/update_dates',{parameters:Form.serialize('results_dates_form'),onFailure:Results.update_dates_failed,onSuccess:Results.update_dates_success});
	  return false;
	},
	update_dates_failed : function(t) {
	  Element.replace('results_dates_form', t.responseText);
	},
	update_dates_success : function(t) {
	  var result = eval(t.responseText);
	  new Effect.Highlight("results_dates_form");

    Results.update_graph(result[1]);
	},
	update_source_mode : function(result_id, source_mode) {
	  new Ajax.Request('/results/'+result_id+'/update_source_mode',{parameters:'source_mode='+source_mode,onSuccess:Results.update_source_mode_success});
	  return false;
	},
	update_source_mode_success : function(t) {
	  var result = eval(t.responseText);
	  $('sources_link').innerHTML = result[1];
	  result[1].evalScripts();
	  if(result[0] == 'a')
	    new Effect.Fade('sources');
	  else
	    Element.show('sources');
	  Results.update_graph(result[2]);
	},
	save : function(result_id) {
	  var errors = "";
	  if($F('result_name').length < 3)
	    errors += "Please provide a name from 3 to 32 characters in length."
	  if(errors != "") {
	    alert(errors);
	    return false;
	  }
	  new Ajax.Request('/results/'+result_id+'/save',{parameters:Form.serialize('save_results_form'),onSuccess:Results.save_success,onFailure:Results.save_failed})
    return false;
	},
	save_success : function(t) {
	  var result = eval(t.responseText);
	  var redir = "/polls/"+result[0]+"/results/"+result[1];
	  document.location.href = "/polls/"+result[0]+"/results/"+result[1];
	}
}

var PollEdit = {
	poll_id : 0,
	failed: function(t) {
		var errors = eval(t.responseText);
		alert('Please correct the following errors and try again: \n\n'+errors.join('.\n'));
		Control.Modal.close();
	},
	focus_field : function(type, id) {
		// select the field?
		var el = $(type+'_title_'+id);
		if(el) {
			el.focus();
			el.select();
		}
	},
	
	// POLL SUBMIT
	update_poll : function() {
		$('poll_edit').submit();
		return false;
	},

	// QUESTION EDITING
	question_path : function(poll_id,question_id) {
		var p = '/polls/'+poll_id;
		if(question_id)
			p += ('/questions/'+question_id);
		return p;
	},
	question_add : function(poll_id) {
		$('add_question').innerHTML = "<h3>Adding...</h3>"
		new Ajax.Request(PollEdit.question_path(poll_id)+'/questions/new',{onSuccess:PollEdit.question_add_done,onFailure:PollEdit.failed});
		return false;
	},
	question_add_done : function(t) {
		var views = eval(t.responseText);
		$('add_question').innerHTML = views[1];
		new Insertion.Bottom('questions', "<li id='question_"+views[0]+"'>"+views[2]+"</li>");
		// this is hacky - but for some reason the field focus & sortable doesn't like to happen immediatley after
		// the element is inserted. so its called on a time expiration.
		setTimeout("PollEdit.question_add_done_did("+views[0]+")",300);
	},
	question_add_done_did : function(id) {
		PollEdit.sortable_questions(PollEdit.poll_id);
		PollEdit.focus_field('question',id);
	},
	question_delete : function(poll_id, question_id, silent) {
		if(silent==null && confirm("Are you sure you want to delete this question?") == false) {
			return false;
		}
		new Ajax.Request(PollEdit.question_path(poll_id,question_id)+'/destroy',{onSuccess:PollEdit.question_delete_done,onFailure:PollEdit.failed})
	},
	question_delete_done : function(t) {
		Element.remove('question_'+t.responseText);
		new Effect.Highlight('questions');
		PollEdit.sortable_questions(PollEdit.poll_id);
	},
	question_edit : function(poll_id, question_id) {
		new Ajax.Request(PollEdit.question_path(poll_id,question_id)+'/edit',{method:'get',onSuccess:PollEdit.question_success,onFailure:PollEdit.failed});
	},
	question_update : function(poll_id, question_id) {
		params = Form.serialize('question_form_'+question_id);
		new Ajax.Request(PollEdit.question_path(poll_id,question_id)+'/update',{parameters:params,onSuccess:PollEdit.question_success,onFailure:PollEdit.failed});
		return false;
	},
	question_cancel : function(poll_id, question_id) {
		new Ajax.Request(PollEdit.question_path(poll_id,question_id)+'/show',{method:'get',onSuccess:PollEdit.question_success,onFailure:PollEdit.failed});
		return false;
	},
	question_success : function(t) {
		var views = eval(t.responseText);
		var el = $('question_form_'+views[0]);
		if(el) {
			el.innerHTML = views[1];
		}
		// highlight?
		if(views[2]) {
			new Effect.Highlight(el);
		}
		PollEdit.focus_field('question',views[0]);
	},
	sortable_questions : function(encoded_id) {
		Sortable.create('questions',{handle:'q-move',scroll:window,onUpdate:function(){new Ajax.Request('/polls/'+encoded_id+'/sort_questions/',{parameters:Sortable.serialize('questions'),onComplete:function(){new Effect.Highlight('questions')}})}})
	},
		
	// CHOICE EDITING
	choice_path : function(poll_id,choice_id) {
		var p = '/polls/'+poll_id;
		if(choice_id)
			p += ('/choices/'+choice_id);
		return p;
	},
	choice_add : function(poll_id, question_id) {
		$('add_choice_'+question_id).innerHTML = "<h3>Adding...</h3>"
		new Ajax.Request(PollEdit.choice_path(poll_id)+'/choices/'+question_id+'/new',{method:'post',onSuccess:PollEdit.choice_add_done,onFailure:PollEdit.failed});
		return false;
	},
	choice_add_done : function(t) {
		var views = eval(t.responseText);
		// [question_id,choice_id,choice_add_link_html,choice_edit_form_html]
		$('add_choice_'+views[0]).innerHTML = views[2];
		new Insertion.Bottom('choices_'+views[0], "<li id='choice_"+views[1]+"'>"+views[3]+"</li>");
		PollEdit.sortable_choices(PollEdit.poll_id,views[0]);
		PollEdit.focus_field('choice',views[1]);
	},
	choice_delete : function(poll_id, choice_id, silent) {
		if(silent==null && confirm("Are you sure you want to delete this choice?") == false) {
			return false;
		}
		new Ajax.Request(PollEdit.choice_path(poll_id,choice_id)+'/destroy',{onSuccess:PollEdit.choice_delete_done,onFailure:PollEdit.failed})
	},
	choice_delete_done : function(t) {
		var ids = eval(t.responseText);
		Element.remove('choice_'+ids[1]);
		new Effect.Highlight('choices_'+ids[0]);
		PollEdit.sortable_choices(PollEdit.poll_id,views[0]);
	},
	choice_edit : function(poll_id, choice_id) {
		new Ajax.Request(PollEdit.choice_path(poll_id,choice_id)+'/edit',{method:'get',onSuccess:PollEdit.choice_success,onFailure:PollEdit.failed});
	},
	choice_update : function(poll_id, choice_id) {
		params = Form.serialize('choice_form_'+choice_id);
		new Ajax.Request(PollEdit.choice_path(poll_id,choice_id)+'/update',{parameters:params,onSuccess:PollEdit.choice_success,onFailure:PollEdit.failed});
		return false;
	},
	choice_cancel : function(poll_id, choice_id) {
		new Ajax.Request(PollEdit.choice_path(poll_id,choice_id)+'/show',{method:'get',onSuccess:PollEdit.choice_success});
		return false;
	},
	choice_success : function(t) {
		var views = eval(t.responseText);
		var el = $('choice_form_'+views[0]);
		if(el) {
			el.innerHTML = views[1];
		}
		// highlight?
		if(views[2]) {
			new Effect.Highlight(el);
		}
		PollEdit.focus_field('choice',views[0]);
	},
	sortable_choices : function(poll_id, question_id) {
		Sortable.create('choices_'+question_id,{handle:'c-move',scroll:window,onUpdate:function(){new Ajax.Request(PollEdit.question_path(poll_id,question_id)+'/sort_choices',{parameters:Sortable.serialize('choices_'+question_id),onComplete:function(){new Effect.Highlight('choices_'+question_id)}})}})
	}
}

var User = {
	show_reset_password : function(i) {
		Element.hide("login-form-"+i);
		new Effect.Appear("reset-form-"+i)	
	},
	reset_password : function(i) {
		email = Util.trim($F('reset_email_'+i));
		if(!Util.regEmail.test(email)) {
			alert('Please type a valid email address so we can send you a new password.');
			return false;
		}
		new Ajax.Request("/users/reset_password/",{parameters:"email="+email,method:'post',onSuccess:User.reset_password_success,onFailure:User.reset_password_failed})
		return false;
	},
	reset_password_success : function(t){
		Control.Modal.close();
		alert("Please check your email for your reset password.");
	},
	reset_password_failed : function(t) {
		alert(t.responseText);
	},
	init_login_modals : function() {
		$$('a.login-modal').each(function(link){
		  new Control.Modal(link,{opacity: 0.25,position: 'relative',offsetLeft: -65,offsetTop: 18,width: 200,height: 180,afterOpen:function(){User.login_opens(link.id)}})
		});
	},
	login_opens : function(el) {
	  var i;
	  var matches = /login_(\d+)/.exec(el);
	  
	  $("login_field_"+matches[1]).focus();
	  
    return false;
	}
}

var Util = {
	regEmail : /^\w.*@.+\.\w{2,3}$/,
	trim : function(s) {
		s = s.replace(/\n$/g, '');
		return s.replace(/^\s+|\s+$/g, '');
	}
}

var Frame = {
	fade_flash : function(text) {
		if(text) {
			Element.show('flash');
			$('flash').innerHTML = text;
		}
		if($('flash').style.display == '') {
			new Effect.Fade('flash',{duration:2});
		}
	}
	
}


var Widget = {
	remove_poll : function(payload_id) {
		new Ajax.Request('/widgets/remove_poll/'+payload_id, {asynchronous:true, evalScripts:true});
		return false;
	},
	update_weight : function(payload_id, weight) {
		var weight = Math.floor(weight);
		if(weight==0)
			$('indicator_'+payload_id).className = 'indicator';
		else
			$('indicator_'+payload_id).className = 'indicator hidden';
		new Ajax.Request('/widgets/update_weight/'+payload_id,{parameters:'weight='+weight});
	},
	update_preview : function(widget_id) {
	  $('preview_size').enabled = false;
	  new Ajax.Request('/widgets/'+widget_id+'/update_preview?size='+$('preview_size').value,{method:'get',onComplete:function(){$('preview_size').enabled = true;},onSuccess:Widget.update_preview_success});
	  return false;
	},
	update_preview_success : function(t) {
	  $('preview').innerHTML = t.responseText;
	}
}

var Message = {
	send : function(to_user, reply) {
		if(Message.check_form() == false)
			return;
		var params = Form.serialize('message_form');
		if(reply)
			response = Message.reply_success;
		else
			response = Message.send_success;
		new Ajax.Request('/messages/create/'+to_user,{parameters:params,onSuccess:response,onFailure:Message.send_failure});
		return false;
	},
	check_form : function() {
		var errors = [];
		if(Util.trim($('message_subject_string').value)=='')
			errors.push('Please fill in the subject.');
		if(Util.trim($('message_body_string').value)=='')
			errors.push('Please fill in the body.');
		if(errors.length == 0)
			return true;
		else {
			alert(errors.join('\n'));
			return false;
		}
	},
	do_delete : function() {
		if(Message.check_delete())
			$('message-form').submit();
		return false;
	},
	check_delete : function() {
		var count = 0;
		var els = $$('input.message');
		var i, len = els.length;
		for(i = 0; i < els.length; i++) {
			if(els[i].checked)
				count += 1;
		}
		if(count == 0){
			alert('Please select some messages to delete.');
			return false;
		}
		else
			return confirm('Are you sure you want to delete the messages?');
	},
	send_success : function(t) {
		var result = eval(t.responseText);
		Control.Modal.close();
		Frame.fade_flash(result[0]);
	},
	reply_success : function(t) {
		var result = eval(t.responseText);
		document.location.href = '/messages';
	},
	send_failure : function(t) {
		alert(t.responseText);
	}
}

var Help = {
  bind_balloon : function(balloon_id, width, height) {
    new Control.Modal('help_balloon_link_'+balloon_id,{
        position: 'relative',
    		offsetLeft: (width-5)*-1,
    		offsetTop: (height+5)*-1})
   }
}

var Search = {
  clear_query : function() {
    if($('query').value == "Find a poll...")
      $('query').value = '';
    else
      $('query').select();
  }
}