var OpenID = {};

OpenID.Selector = {
  current: null,
	endpoint: '',

  loaded: function() {
    this.endpoint = this.getParams().endpoint;
    this.current = jQuery.cookie('openid.selector.provider') || 'betaid';

    for(var name in this.providers) {
      var provider = this.providers[name];
      var item = jQuery('<li><a title="' + provider.title +'"><img/></a></li>');
      
      item.find('a').attr('href', '#');
      item.find('a').click(this.show.bind(this, name, item));
      
      item.find('a img').attr('src', 'img/ico_' + name + '.png');
      
      jQuery('.available ul.list').append(item);
      
      if(this.current == name)
				this.show(name, item);
    }

    jQuery('.oid-selector form').submit(this.submit.bind(this));
    jQuery('.oid-selector a.createid').click(this.submit.bind(this, 'betaid'));
  },
  
  
  submit: function(name) {
    var provider = this.getCurrent();

    if(name != undefined)
      provider = this.providers[name];
    
    var openid = this.getOpenID(provider);
    
    var width  = 1024;
    var height = 600;
    var xpos   = screen.width / 2 - width / 2;
    var ypos   = screen.height / 2 - height / 2 - 50;

		var options = ['menubar=no', 'toolbar=no', 'location=yes', 'width='+width, 'height='+height, 'top='+ypos, 'left='+xpos];

    window.open(this.endpoint + '?openid=' + openid, 'openidpopup', options.join(','));
    return false;
  },
  
  getOpenID: function(provider) {
    switch(provider.type) {
        case 'custom':
          return jQuery.cookie('openid.selector.custom');
          break;
          
        case 'username':
          return provider.schema.replace('*', jQuery.cookie('openid.selector.username'));
          break;
          
        default:
          return provider.schema;
      }
  },
  
  show: function(name, item) {
    jQuery.cookie('openid.selector.provider', name);
    
    var provider = this.getCurrent();
    
    jQuery('fieldset').css('display', 'none');
    jQuery('fieldset img').attr('src', 'img/' + name + '_big.jpg');
    jQuery('fieldset.' + provider.type).css('display', 'block');
    
    jQuery('.available ul.list li').removeClass('selected');
    
    item.addClass('selected');
    
    if(provider.type == 'select')
      jQuery('fieldset.select button').text('Comenta con tu ' + provider.title);
   
    if(provider.type == 'username') {
      var user = jQuery.cookie('openid.selector.username');
    
      if(user != null) {
        jQuery('fieldset.username input[type=text]').val(user);
      }
    
      jQuery('fieldset.username p').html(
        provider.schema.replace('*', '<strong>' + (user || 'usuario') + '</strong>'
      ));
      
      this.observe(provider);
    }
    
    if(provider.type == 'custom') {
      jQuery('fieldset.custom input[type=text]').val( jQuery.cookie('openid.selector.custom') || 'http://');
      this.observe(provider);
    }
    
    return false;
  },
  
  getCurrent: function() {
    var name = jQuery.cookie('openid.selector.provider') || 'betaid';
    return this.providers[name];
  },
  
  observe: function(provider) {
    
    if(provider.type == 'custom') {
      jQuery('fieldset.custom input[type=text]').keyup(function() {
        jQuery.cookie('openid.selector.custom', this.value);
      });
    } 
    
    if(provider.type == 'username') {      
      jQuery('fieldset.username input[type=text]').keyup(function() {
        jQuery.cookie('openid.selector.username', this.value);
        jQuery('fieldset.username p strong').text(this.value);
      });
    }
    
  },
  
	getParams: function() {
    var pairs = document.location.search.substring(1).split("&");
    
    var params = {};
    for(var i=0; i < pairs.length; i++) {
      var pair = pairs[i].split('=');
      params[pair[0]] = decodeURIComponent(pair[1]);
    }
    return params;
  },
  
  providers: {
    'betaid'    : {'type': 'betaid',   'title': 'Beta ID',     'schema': 'https://www.betaid.org/'},
    'google'    : {'type': 'select',   'title': 'Google',      'schema': 'http://www.google.com/accounts/o8/id'},
    'myopenid'  : {'type': 'select',   'title': 'MyOpenID',    'schema': 'http://www.myopenid.com/'},
    'vidoop'    : {'type': 'select',   'title': 'Vidoop',      'schema': 'http://my.vidoop.com/'},
    'wordpress' : {'type': 'username', 'title': 'WordPress',   'schema': 'http://*.wordpress.com'},
    'openid-org': {'type': 'username', 'title': 'OpenID.org',  'schema': 'http://*.openid.org'},
    'weblogssl' : {'type': 'username', 'title': 'Weblogs SL',  'schema': 'http://openid.blogs.es/*'},
    'claimid'   : {'type': 'username', 'title': 'ClaimID',     'schema': 'http://claimid.com/*'},
    'custom'    : {'type': 'custom',   'title': 'Otro OpenID', 'schema': '*'}
  }
  
};


jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

Function.prototype.bind = function() {
  var fn = this, args = jQuery.makeArray(arguments), scope = args.shift();
  return function() {
    return fn.apply(scope, args);
  }
}
