String.prototype.trim = function () {
    return this.replace(/^\s+|\s+$/g, "");
}; 

String.prototype.is_blank = function () {
    return this.trim().length == 0;
}; 

jQuery.fn.fadeIn = function(speed, callback) { 
    return this.animate({opacity: 'show'}, speed, function() { 
        if (jQuery.browser.msie)  
            this.style.removeAttribute('filter');  
        if (jQuery.isFunction(callback)) 
            callback();  
    }); 
}; 
 
jQuery.fn.fadeOut = function(speed, callback) { 
    return this.animate({opacity: 'hide'}, speed, function() { 
        if (jQuery.browser.msie)  
            this.style.removeAttribute('filter');  
        if (jQuery.isFunction(callback)) 
            callback();  
    }); 
}; 

$(function() {
  activate_hovers();
  $('.hoverable').hover(function() { $(this).addClass('hover'); }, function() { $(this).removeClass('hover'); });
  $('#check_button').click(check_me);
  $('#url').click(url_clicked).keypress(wait_for_enter);
  $('#options').change(changed_sku);
  $('.another_one a').click(show_url);
  $('#next_button').click(chose_option);
  $('#email, #nickname').focus(setup_entry);
  $('#snatch_button').click(snatch);
  $('#male').click( function() { 
    $(this).addClass('clicked');
    $('#female').removeClass('clicked');
  });
  $('#female').click( function() { 
    $(this).addClass('clicked');
    $('#male').removeClass('clicked');
  });
});

function snatch() {
  $('#email_error, #nickname_error').hide();  
  $('#email, #nickname').removeClass('error');
  $('.another_one').show();
  if (!validate_customer()) return;
  
  var url = $('#url').val();
  var product_id = $('#product').data('product_id');
  $('#product').html('').addClass('loading');
  var gender = $('#female').hasClass('clicked') ? 'female' : 'male';
  $.get( '/main/snatch',
    to_rails_params( { 
      product: product_id,
      sku: $('#options').val(),
      text: $('#url').val(),
      customer: { nickname: $('#nickname').val(), email: $('#email').val(), 
        gender: gender, signed_up_for_newsletter: $('#newsletter').is(':checked') } 
    } ), 
    snatched, 'json' );
  return false;
}

function validate_customer() {
  var email = $('#email').val();
  var name  = $('#nickname').val();
  var valid = true;
  if (!((email.indexOf(".") > 2) && (email.indexOf("@") > 0))) {
    $('.another_one').hide();
    $('#email_error').show();
    $('#email').addClass('error');
    valid = false;
  }
  if (name.trim().length == 0 || !$('#nickname').hasClass('entry')) {
    $('.another_one').hide();
    $('#nickname_error').show();
    $('#nickname').addClass('error');
    valid = false;    
  }
  
  return valid;
}

function to_rails_params(obj) {
  var result = {};
  for (var x in obj) {
    var subobj = obj[x];
    if (typeof(subobj) == 'object') {
      for (var y in subobj) {
        result[ [ x, '[', y, ']' ].join('') ] = subobj[y]; 
      }
    } else {
      result[x] = subobj;
    }
  }
  return result;
}

function snatched(data) {
  if (data.html) {
    $('#product').removeClass('loading').hide().html( data.html ).fadeIn();  
    show_url();
    if (data.signed_up) {
      $('#newsletter_section').hide();
    }
    track("/ajax/success"); 
  }
}

function setup_entry() {
  if ($(this).hasClass('entry')) {
    this.select();
  } else {
    $(this).val('');
    $(this).addClass('entry');
  }
}

function check_me() {
  $('div.error').hide();
  if ($('#url').val().is_blank()) {
    $('#url_blank').show();
    $('#url').addClass('error');
  } else {
    $('#product').data('html', $('#product').html()).html('').addClass('loading');
    $.get( '/main/fetch', { url: $('#url').val() }, check_loaded, 'json' );
  }
  return false;
}

function check_loaded(data) {
  if ( data.error ) {
    $('#url_blank').show();
    $('#url').addClass('error');    
    $('#product').removeClass('loading').hide().html( $('#product').data('html') ).fadeIn();
    track("/ajax/error"); 
  } else if ( data.job_id ) {
    setTimeout( function() { check_job( data.job_id, 0 ); }, 500 );
  } else {  // success!
    $('#product').removeClass('loading').hide().html( data.product ).fadeIn().data( 'product_id', data.product_id );
    $('#url_stuff').hide();
    if ( data.options ) {
      $('#options').html( data.options ).data( 'skus', data.skus );
      $('#variations').fadeIn();
      track("/ajax/fetched");     
    } else {
      show_snatch();
    }
    activate_hovers();
  }
}

function check_job(job_id, count) {
  $.get( '/main/check_job/' + job_id, { count: count }, checked_job, 'json' );
}

function checked_job(data) {
  if ( data.processing ) {
    setTimeout( function() { check_job( data.processing, data.count ); }, 500 );    
  } else if ( data.timeout ) {
    $('#timeout_error').show();
    $('#url').addClass('error');    
    $('#product').removeClass('loading').hide().html( $('#product').data('html') ).fadeIn();    
    track("/ajax/timeout"); 
  } else if (data.error) {
    $('#fetch_exception').show();
    $('#url').addClass('error');    
    $('#product').removeClass('loading').hide().html( $('#product').data('html') ).fadeIn();        
    track("/ajax/error"); 
  } else {
    $('#product').removeClass('loading').hide().html( data.product ).fadeIn().data( 'product_id', data.product_id );
    $('#url_stuff').hide();
    if ( data.options ) {
      $('#options').html( data.options ).data( 'skus', data.skus );
      $('#variations').fadeIn();
      track("/ajax/fetched"); 
    } else {
      show_snatch();
    }
    activate_hovers();  
  }
}

function chose_option() {
  $('#variations').hide();
  $('#url_stuff').hide();
  show_snatch();
}

function show_snatch() {
  var nick = $('#nickname');
  var email = $('#email');
  if (nick.val() == 'הכנס את השם הפרטי שלך') nick.removeClass('entry');
  else nick.addClass('entry');
  if (email.val() == 'הכנס את כתובת המייל שלך') email.removeClass('entry');
  else email.addClass('entry');
  $('#snatch_section').fadeIn();  
}

function show_url() {
  $('#variations').hide();
  $('#another_one').hide();
  $('#snatch_section').hide();
  $('#url_stuff').fadeIn();
}

function activate_hovers() {
  $('.button').
    hover(function() { $(this).addClass('hover'); }, function() { $(this).removeClass('hover'); }).
    mousedown( function() { $(this).addClass('down'); } ).
    mouseup( function() { $(this).removeClass('down'); } );
}

function wait_for_enter(e) {
  if (e.which == 13) { check_me(); return false; }
}

function url_clicked() {
  this.select();
}

function changed_sku() {
  var skus = $('#options').data('skus');
  var sku  = skus[this.value];
  $('#sku').html(sku.name);
  var image = sku.image;
  if (image) {
    $('#no_image').hide();
    $('#product_image img').attr('src', image);
  } else {
    $('#no_image').show();
  }
  $('#list_price .price').html(sku.list_price);  
  $('#street_price .price').html(sku.street_price);  
  $('#our_price .price').html(sku.our_price);
    
  // TODO indicate photo isn't correct if photo doesn't exist
}

function track(url) {
  if (typeof(pageTracker) != 'undefined') pageTracker._trackPageview(url);
}

String.prototype.toInt = function() {
  if (this.length == 0) return 0;
  else return parseInt(this.replace(/[^\d.\-]/g, ''), 10);
};
Number.prototype.formatMoney = function(c, d, t){
	var n = this, c = isNaN(c = Math.abs(c)) ? 0 : c, d = d == undefined ? "." : d, t = t == undefined ? "," : t, s = n < 0 ? "-" : "", i = parseInt(n = Math.abs(+n || 0).toFixed(c), 10) + "", j = (j = i.length) > 3 ? j % 3 : 0;
	return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
};

