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

// 
// cropper for editing user_icons
// ==============================
// 

function startCropper() {
  new Cropper.ImgWithPreview( 
    'cropping_pic', 
    {
      previewWrap: 'previewWrap', 
      minWidth: 161, 
      minHeight: 161, 
      ratioDim: { x: 161, y: 161 }, 
      onEndCrop: onEndCrop 
      }
   );
}

// setup the callback function
function onEndCrop(coords) {
 $( 'x1' ).value = coords.x1;
 $( 'y1' ).value = coords.y1;
 $( 'x2' ).value = coords.x2;
 $( 'y2' ).value = coords.y2;
}

// Converts serialized params to a hash
function paramsToHash(params) {
  var hash = new Hash()
  if (params.length > 0){
    params.sub(/^\?/,"").split("&").each(function(e){
      results = e.split("=")
      hash.set(results[0],results[1])
    })
  }

  return hash
}

function hashToParams(hash) {
  return hash.map(function(k){return k[0] + "=" + k[1]}).join("&")
}

function paramsExceptPage(form_elements) {
  var hash = paramsToHash(window.location.search)
  
  if (form_elements){
    hash.update(paramsToHash(Form.serializeElements(form_elements)))
    
    // Remove unchecked boxes from the existing params
    unchecked_boxes = form_elements.select(function(e){ return e.type == "checkbox" && !e.checked })
    unchecked_boxes.each(function(e){
      hash.unset(e.name)
    })
  }
  
  hash.unset('page')
  
	return hashToParams(hash)
}

BeanbagAutocompleteBehavior = Behavior.create({
    initialize : function() {
      var matches   = this.element.className.match(/complete-on:([\S]+)/)
      if (matches != null ){
        var target    = matches[1].split(':')
        var model     = target[0]
        var completer = target[1]

        var url = urlBase + "/" + Hobo.pluralise(model) +  "/complete_" + completer
             new Ajax.Autocompleter(this.element, 
                                    this.element.next('.completions-popup'), 
                                    url, 
                                    {paramName:'query', method:'get'});
      }
	}
})  

var autocompleter;


Event.observe(window, 'load', function(){
	perform_actions_if_under_18();
});

Event.addBehavior({
  
  'input#badger:click' : function(event) { this.select() }, 
  
  '#upload-form:submit' : function(e) {
    $('uploading').setStyle({'visibility' : 'visible'});
    $('uploading').show();
    $('spinner16').setStyle({'display' : 'block'});
    $('spinner16').setStyle({'visibility' : 'visible'});
    $('spinner16').addClassName('anime');
  },   
   
  '#cropping_pic': function(event){ startCropper() },
   '.beanbagcompleter' : BeanbagAutocompleteBehavior(),
   'form.main-search:submit, .quick-search form.search:submit' : function(event) {
       var element = $F(this.down('input.search'));
       if (element == "I'm looking for.." || element == "") {
         Event.stop(event);
       }
       else {
         var query = element.gsub(' ', '+');
         params =  paramsExceptPage();
         if (params.length > 0)
           query = query + "?" + params;
         
         window.location.href = this.getAttribute("action") + "/" + query;
         Event.stop(event)
       }
     },
   'input.search' : function(event) {
    this.value = "I'm looking for..";
   },
   'input.search:focus': function(event) {
         if(event.target.value == "I'm looking for..") {event.target.value = '';}
     },
     'input.search:blur': function(event) {
         if(event.target.value == "") {event.target.value = "I'm looking for..";}
     },
   'form.resource-search:submit' : function(event) {
     var search_subject = $('search-subject')
     var elements = $$('form.location-subject').first().getElements().without(search_subject)
    var subject = search_subject.value.gsub(' ', '+');
    
    query = "/resources/search/" + subject
    
       params =  paramsExceptPage(elements);
       if (params.length > 0)
         query = query + "?" + params;
   
       window.location.href = query
       Event.stop(event)
   },    
   'form.wanted-ad-search:submit' : function(event) {
     var search_subject = $('search-subject')
     var search_location = $('search-location')
     var elements = $$('form.location-subject').first().getElements().without(search_subject).without(search_location)
        
    var subject = search_subject.value.gsub(' ', '+');
    var location = search_location.value.gsub(' ', '+');
   
    if(location == '') {location = 'anywhere';}
    
    query = "/wanted_ads/search/" + location + "/" + subject
       
       params =  paramsExceptPage(elements);
       if (params.length > 0)
         query = query + "?" + params;
    
       window.location.href = query
       Event.stop(event)
   },    
   'form.tutor-search:submit' : function(event) {
     var search_subject = $('search-subject')
     var search_location = $('search-location')
     var elements = $$('form.location-subject').first().getElements().without(search_subject).without(search_location)
        
    var subject = search_subject.value.gsub(' ', '+');
    var location = search_location.value.gsub(' ', '+');
   
    if(location == '') {location = 'anywhere';}    
       
       query = "/tutors/search/" + location + "/" + subject
       
       params =  paramsExceptPage(elements);
       if (params.length > 0)
         query = query + "?" + params;
       
       window.location.href = query
       Event.stop(event)
   },    
   'a.report-this-link:click': function(event) { 
           Effect.toggle(event.target.up('form').down('#report_form'), 'appear') 
           Event.stop(event);
   },
       '.recommend-this a:click': function(event) {
    var target = $$('.new-recommendation-fields')[0];
           Effect.BlindDown(target);
           Event.stop(event);
       },
   
       'select.dob_select:change': function(event) {
    perform_actions_if_under_18();
       },
   
   'a#suggest_login_name:click': function(event) {
    suggest_login_name(true);
   },
   
       'ul#wanted-ad-subjects li:last-child select:change': function(event) {
           var li = document.createElement('li');
           li.innerHTML = event.target.parentNode.innerHTML;
   
           $('wanted-ad-subjects').appendChild(li);
           Event.addBehavior.reload();
       },   
   
       'input.add-keywords:focus': function(event) {
           if(event.target.value == "Add a keyword to this subject") {event.target.value = '';}
       },
   
       'select#resource-type:change': function(event) {
           display_resource_form_fields();
       },
   
   // fix for stopping the form from being submitted when hitting enter
   // when the subject field is focused
   '#subject_tagging .subject:keypress': function(event) {
    if (event.keyCode == 13) {
      Event.stop(event);
    }
   },
   
       'form.resource:submit': function(event) {
   if($F('resource-type') != 'external_link') {
       Hobo.hide('submit-or-cancel');
       Hobo.show('please-wait');
   }
       },
   
       'select.wanted-ad-request-for:change': function(event) {
    display_wanted_ad_form_fields();
       },
   
       '.select-many .keywords input.add-keywords:keypress': function(event) {
           if (event.keyCode == 13) { // Enter
               addKeyword(this, this.up('.item'))
               Event.stop(event)
           }
       },
   
       '.select-many .keywords input.remove:click': function(event) {
           this.up('li').remove()
       },
   
       '.browse-subject>a:click': function(event) {
           var ul = this.up(".browse-subject").down("ul")
           if (ul.hasClassName("open")) {
               slideClose(ul)
           } else {
               $$('.browse-subject ul.open').each(slideClose)
               slideOpen(ul)
           }
           Event.stop(event)
       },
       
       'form.filter-menu select[name=subject]:change': function(event) {
           var paramName = this.up('form').down('input[type=hidden]').value.gsub("-", "_")
           var params = {}
           remove = [ 'page', 'secondary_subject' ]
   if (this.value == '') { 
               remove.push(paramName)
           } else {
               params[paramName] = this.value
   }
   location.href = Hobo.addUrlParams(params, {remove: remove})
       },
   
   //     '.signup-page .user-first-name:keyup': function(event) {
   // updateBeanbagEmailAddress();
   //     },
   
   //     '.signup-page .user-surname:keyup': function(event) {
   // updateBeanbagEmailAddress();
   //     },
   
       '.signup-page .user-beanbag-email-address:keypress': function(event) {
   $(event.target).addClassName('user-changed');
       },
       
       'a.shortlist-link:click': function(event) {
   var shortlist = $('shortlist');
   if(!shortlist.hasClassName('open')) {
     slideOpen('shortlist');
   } else {
      slideClose('shortlist');
   }
   return false;
       },
       
       '#close-shortlist:click': function(event) {
   slideClose('shortlist');
   return false;
       },
   
       '.side-profile-section a.recommend-me:click': function(event) {
           target = $$('.new-recommendation-fields')[0];
           Effect.BlindDown(target);
           setTimeout(function () {
               new Effect.ScrollTo(target, {duration: 0.5, transition: Effect.Transitions.sinoidal});
           }, 1000)
           Event.stop(event);        
       },
   '#hint_map a:click, #hint_map:click': function(event) {
      target = $$('#location .editable-section .non-edit-view')[0];
      target.up('.editable-section').down('.non-edit-view').style.display = 'none';
      target.up('.editable-section').down('.edit-form').style.display = 'block';
      Event.stop(event)
   },
   '.non-edit-view:click': function(event) {
    var target = $(event.target);
    
    target.up('.editable-section').down('.non-edit-view').style.display = 'none';
    target.up('.editable-section').down('.edit-form').style.display = 'block';
    Event.stop(event)
    
   },
   '.cancel-edit:click': function(event) {
    var target = $(event.target);
    
    target.up('.editable-section').down('.non-edit-view').style.display = 'block';
    target.up('.editable-section').down('.edit-form').style.display = 'none';
    
    Event.stop(event);
   },
   '.contact-this-user:click': function(event) {
           Effect.toggle($('contact-form'), 'appear');
    
    Event.stop(event);
   },
   'input.user-tutor:click': function(event) {
   
       display_tutor_form_fields();
   
   }
});


function perform_actions_if_under_18(){
	if($('parent-signup')){
		var dob_at_18 = new Date().setFullYear(new Date().getFullYear()-18);
		var dob_at_16 = new Date().setFullYear(new Date().getFullYear()-16);
		var dob = get_dob();

		if(dob > dob_at_18){
			if(dob > dob_at_16){
				$('parent_email_label').innerHTML = "Parent's Email Address";   
			}
			else{
				$('parent_email_label').innerHTML = "Parent's Email Address<br />(optional)";
			}
			$('parent-signup').removeClassName('hidden');
			$('under-18-login-name-warn').removeClassName('hidden');
			suggest_login_name();
		}
		else if(dob < dob_at_18){
			cancel_suggest_login();
			fill_login_name();
			$('under-18-login-name-warn').addClassName('hidden');
			$('parent-signup').addClassName('hidden');
		}
	}
}

var suggesting_name = false;

function fill_login_name(harsh){
	if(	(harsh == true || $('user[login_name]').value == '')
		&& suggesting_name == false
		&& $('user[first_name]').value != ''
		&& $('user[surname]').value != ''){
		updateBeanbagEmailAddress();
	}
}

function should_suggest_login_name(){
	if(
		( $('user[login_name]').value == '' || login_name_and_real_name_equal() )
		&& suggesting_name == false
	){
		return true;
	}
	else{
		return false;
	}
}

function login_name_and_real_name_equal(){
	var login_name = $('user[login_name]').value;
	if(login_name == ''){
		return false
	}
	else if(login_name_from_real_name() == login_name){
		return true;
	}
	else{
		return false;
	}
	
}

function suggest_login_name(harsh){
	if( harsh == true || should_suggest_login_name() ){
		suggesting_name = true;
		$('user[login_name]').disable();
		$('user[login_name]').insert({ 'after': "<img class='spinner' src='/images/spinner16_grey.gif' style='margin-left: -20px; margin-top: 2px; float: left'/>" });

		new Ajax.Request('/users/suggest_login_name.json', {
			method: 'get',
			onSuccess: function(transport) {
				update_login_name(transport.responseText.evalJSON().login_name);
			}
		});
	}
}

function cancel_suggest_login(){
	if(suggesting_name == true){
		suggesting_name = false;
		$('user[login_name]').next().remove();
		$('user[login_name]').enable();
	}
}

function update_login_name(name){
	if(suggesting_name == true){
		suggesting_name = false;
		$('user[login_name]').next().remove();
		$('user[login_name]').enable();
		$('user[login_name]').value = name;
	}
}


function get_dob(){
	var dob = new Array();
	$$('select.dob_select').each(function(s) {
		if(s.value == ''){
			return;
		}
		dob.unshift(s.value);
	});
	return(new Date(dob[0], dob[1], dob[2]));
}

function updateBeanbagEmailAddress() {
    var i = $$('INPUT.user-login-name')[0];
    if (!i.hasClassName('user-changed')) {
        i.value = login_name_from_real_name();
    }
}

function login_name_from_real_name(){
	return (($$('INPUT.user-first-name')[0].value + '.' + $$('INPUT.user-surname')[0].value).replace(/[^a-zA-Z0-9-_+.]/g, "")).toLowerCase()
}

function display_tutor_form_fields() {
    show = $$("input[name='user[tutor]'][type=checkbox]")[0].checked;

    $$('.tutor-only').each(function(e, i) {
        if(show) {Hobo.show(e);} else {Hobo.hide(e);}
    });
}

function updateLocation(e) {
	var complete = function() {
		var lat = $F('map-lat');
		var lng = $F('map-lng');
		if (lat != '') {
			initializeSimpleMap(lat, lng, {style:'tutor'});
		}
	}
	
	Hobo.ajaxRequest(e, ['location', 'map'], {onComplete: complete});
}

function slideOpen(e) {
    e = $(e);
    e.visualEffect("BlindDown", {duration:0.5});
    e.addClassName("open");
}

function slideClose(e) {
    e = $(e);
    e.visualEffect("BlindUp", {duration:0.5});
    e.removeClassName("open");
}

function scroll_and_highlight() {
	if(window.location.hash && window.location.hash.length > 3) {
		var e = $(window.location.hash.slice(3));
		new Effect.ScrollTo(e, {offset: -100});
		new Effect.Highlight(e, {queue: 'end', duration: 2});
	}
}

function display_resource_form_fields() {
    if($F('resource-type') == 'external_link') {
        $$('.resource-file-option').each(function(e,i) {Hobo.hide(e)});
        $$('.resource-url-option').each(function(e,i) {Hobo.show(e)});
    } else {
	$$('.resource-url-option').each(function(e,i) {Hobo.hide(e)});
	$$('.resource-file-option').each(function(e,i) {Hobo.show(e)});
    }   
}

function display_wanted_ad_form_fields() {
	if ($F('request_for') == 'tutor') {
        Hobo.show('wanted-ad-near');
    } else {
        Hobo.hide('wanted-ad-near');
    }
}


function addKeyword(input, item) {
    var x
    if (x = item.down('input[type=hidden][value=' + input.value + ']')) {
        // This keyword is already present
        new Effect.Highlight(x.up('li'))
    } else {
        var ul = item.down('.keywords ul')
        var keyword = input.value
        var subjectHidden = item.down('input[type=hidden]')
        ul.appendChild(
            $li($span(keyword),
                $input({type:'image', value:' ', 'class':'remove'}),
                $input({type:'hidden', name:subjectHidden.name, value:input.value}))
        )
        Event.addBehavior.reload()
    }
    input.value = ""
}

function openAndHighlightShortlist(tutor_id) {
	var e = $('shortlist');
    e.visualEffect("BlindDown", {duration:0.5, afterFinish: function() {
		new Effect.Highlight('shortlisting-for-'+tutor_id);
	}});
    e.addClassName("open");
}


SelectManyInput.prototype.itemAdded = function(item, option) {
    var hidden = this.hiddenField(item)
    if (item.down('.keywords')) {
        hidden.name = hidden.name.sub(/\[.*\]/, "[subjects][" + option.innerHTML + "][]")
        hidden.value = ""
    } else {
        // Normal select-many behavior
        hidden.value = option.innerHTML
    }
}

function yui_init() {
	$$('.html').each(function(e,i) {
		var myEditor = new YAHOO.widget.Editor(e.id, {
	        height: '300px',
			autoHeight: true,
	        width: '99%',
			handleSubmit: true,
			toolbar: {
				draggable: false,
				buttonType: 'advanced',
				buttons: [
				    { group: 'textstyle', 
				        buttons: [
				            { type: 'push', label: 'Bold CTRL + SHIFT + B', value: 'bold' },
				            { type: 'push', label: 'Italic CTRL + SHIFT + I', value: 'italic' },
				            { type: 'push', label: 'Underline CTRL + SHIFT + U', value: 'underline' },
				        ]
				    },
				    { type: 'separator' },
				    { group: 'parastyle', 
				        buttons: [
				        { type: 'select', label: 'Normal', value: 'heading', disabled: true,
				            menu: [
				                { text: 'Normal', value: 'none', checked: true },
				                { text: 'Header 1', value: 'h1' },
				                { text: 'Header 2', value: 'h2' },
				                { text: 'Header 3', value: 'h3' },
				                { text: 'Header 4', value: 'h4' },
				                { text: 'Header 5', value: 'h5' },
				                { text: 'Header 6', value: 'h6' }
				            ]
				        }
				        ]
				    },
				    { type: 'separator' },
				    { group: 'indentlist',
				        buttons: [
				            { type: 'push', label: 'Indent', value: 'indent', disabled: true },
				            { type: 'push', label: 'Outdent', value: 'outdent', disabled: true },
				            { type: 'push', label: 'Create an Unordered List', value: 'insertunorderedlist' },
				            { type: 'push', label: 'Create an Ordered List', value: 'insertorderedlist' }
				        ]
				    },
				    { type: 'separator' },
				    { group: 'insertitem',
				        buttons: [
				            { type: 'push', label: 'HTML Link CTRL + SHIFT + L', value: 'createlink', disabled: true },
				            { type: 'push', label: 'Insert Image', value: 'insertimage' }
				        ]
				    },
				    { type: 'separator' },
				    { group: 'insertitem',
				        buttons: [
		            		{ type: 'push', label: 'Remove Formatting', value: 'removeformat', disabled: true },
		            		{ type: 'push', label: 'Show/Hide Hidden Elements', value: 'hiddenelements' }
						]
					}
				]
		    }
		});
		yuiImgUploader(myEditor, '/blog_post_images','blog_post_image[uploaded_data]');
	    myEditor.render();
 	});
}
