var QRStuff = {
  clientLoggedIn: false,
  qrcodeTypeSet: false,

  init: function(clientLoggedIn)
  {
    this.clientLoggedIn = clientLoggedIn;
    Auth.onLoginSucceeded = this.loginSucceeded.bind(this);
    Auth.onFailedLogin = this.loginFailed.bind(this);
  },
  
  loginSucceeded: function()
  {
    this.clientLoggedIn = true;
    if ($('generate-image-button'))
      $('generate-image-button').show();
    
    if ($('generate-image-button-greyed-out'))
      $('generate-image-button-greyed-out').hide();
    
    if ($('batch-link'))
      $('batch-link').show();
    
    if ($('batch-link-greyed-out'))
      $('batch-link-greyed-out').hide(); 
    
    if ($('batch-subscribe-banner'))
      $('batch-subscribe-banner').hide();
    
    if ($('qrcode-type-code'))
    {
      var qrcodeType = $F('qrcode-type-code');
      if (this.clientLoggedIn && (qrcodeType == 'URL' || qrcodeType == 'MAPS' || qrcodeType == 'FACEBOOK' || qrcodeType == 'MYSPACE'))
        $('qrcode-shorturl-container').show();
    }
    
    this.scheduleRefreshPreview();
  },
  
  loginFailed: function()
  {
  },
  
  onLoad: function(qrcodeType)
  {
    if (!this.qrcodeTypeSet)
      this.setQRCodeType(qrcodeType);
  },
  
  setQRCodeType: function (qrcodeType)
  {
    this.qrcodeTypeSet = true;
    
    $('qrcode-info').hide();

    $('qrcode-data-container-TEXT').hide();
    $('qrcode-data-container-URL').hide();
    $('qrcode-data-container-TEL').hide();
    $('qrcode-data-container-SMSTO').hide();
    $('qrcode-data-container-MAILTO').hide();
    $('qrcode-data-container-MATMSG').hide();
    $('qrcode-data-container-VCARD').hide();
    $('qrcode-data-container-MAPS').hide();
    $('qrcode-data-container-SOCIAL_NETWORK').hide();
  
    $('qrcode-shorturl-container').hide();
    
    $('qrcode-data-container-' + qrcodeType).show();
    $('qrcode-type-' + qrcodeType).checked = true;
    
    $('qrcode-type-code').value = qrcodeType;  
    
    if (this.clientLoggedIn && (qrcodeType == 'URL' || qrcodeType == 'SOCIAL_NETWORK'))
      $('qrcode-shorturl-container').show();
    
    QRStuff.scheduleRefreshPreview();
  },
  
  refreshPreviewTimerEventID: 0,
  scheduleRefreshPreview: function ()
  {
    if (this.refreshPreviewTimerEventID != 0)
      clearTimeout(this.refreshPreviewTimerEventID);
      
    this.refreshPreviewTimerEventID = this.refreshPreview.bind(this).delay(0.5);
  },
  
  refreshPreview: function ()
  {
    var typeCode = $F('qrcode-type-code');
    var query = 'type=' + typeCode;
  
    var showDefault = false;
    var data = {};  
    
    var shorturl  = $RF('qrcode-shorturl-yes');
    
    switch(typeCode)
    {
      case 'TEXT':
        var text = $F('qrcode-data-text');
        if (text == '')
          showDefault = true;
        else
        {
          query += '&text=' + encodeURIComponent(text);
          data = {
            text: text
          };
        }
        break; 
        
      case 'URL':
        var url = $F('qrcode-data-url');
        if (url == '' || url == 'http://')
          showDefault = true;
        else
        {
          query += '&url=' + encodeURIComponent(url);
          query += '&shorturl=' + shorturl;
          data = {
            url: url,
            shorturl: shorturl
          };
        }
        break;
        
      case 'TEL':
        var tel = $F('qrcode-data-tel-number');
        if (tel == '')
          showDefault = true;
        else
        {
          query += '&tel-number=' + encodeURIComponent(tel);
          data = {
            tel_number: tel
          };
        }
        break;
        
      case 'SMSTO':
        var number = $F('qrcode-data-smsto-number');
        var message = $F('qrcode-data-smsto-message');
        if (number == '' || message == '')
          showDefault = true;
        else
        {       
          query += '&smsto-number=' + encodeURIComponent(number);
          query += '&smsto-message=' + encodeURIComponent(message);
          
          data = {
            smsto_number: number,
            smsto_message: message
          };
        }
        break;
        
      case 'MAILTO':
        var emailAddress = $F('qrcode-data-mailto-email-address');
        if (emailAddress == '' || !emailAddress.match(/.+@.+/))
          showDefault = true;
        else
        {
          query += '&mailto-email-address=' + encodeURIComponent(emailAddress);
        
           data = {
             mailto_email_address: emailAddress
           };
        }
        break;
        
      case 'MATMSG':
        var emailAddress = $F('qrcode-data-matmsg-email-address');
        var subject = $F('qrcode-data-matmsg-subject');
        var body = $F('qrcode-data-matmsg-body');
        if (emailAddress == '' || !emailAddress.match(/.+@.+/) || subject == '' || body == '')
          showDefault = true;
        else
        {
          query += '&matmsg-email-address=' + encodeURIComponent(emailAddress);
          query += '&matmsg-subject=' + encodeURIComponent(subject);
          query += '&matmsg-body=' + encodeURIComponent(body);
        
           data = {
               matmsg_email_address: emailAddress,
               matmsg_subject: subject,
               matmsg_body: body
           };
        }
        break;
        
      case 'VCARD':
        var firstName = $F('qrcode-data-vcard-first-name');
        var lastName = $F('qrcode-data-vcard-last-name');
        var type = $RF('qrcode-data-vcard-type-work');
        var telNumber = $F('qrcode-data-vcard-tel-number');
        var email = $F('qrcode-data-vcard-email');
        var org = $F('qrcode-data-vcard-org');
        var url = $F('qrcode-data-vcard-url');
        var linkToDownload = $RF('qrcode-data-vcard-link-to-download-yes');
        if ((firstName == '' && lastName == '') 
            || (telNumber == '' && email == ''))
          showDefault = true;
        else
        {
          query += '&vcard-first-name=' + encodeURIComponent(firstName);
          query += '&vcard-last-name=' + encodeURIComponent(lastName);
          query += '&vcard-type=' + encodeURIComponent(type);
          query += '&vcard-tel-number=' + encodeURIComponent(telNumber);
          query += '&vcard-email=' + encodeURIComponent(email);
          query += '&vcard-org=' + encodeURIComponent(org);
          query += '&vcard-url=' + encodeURIComponent(url);
          query += '&vcard-link-to-download=' + linkToDownload;
          data = {
            vcard_first_name: firstName,
            vcard_last_name: lastName,
            vcard_type: type,
            vcard_tel_number: telNumber,
            vcard_email: email,
            vcard_org: org,
            vcard_url: url,
            vcard_link_to_download: linkToDownload
          };          
        }
        break;
        
      case 'MAPS': 
        var latitude = $F('qrcode-map-latitude');
        var longitude = $F('qrcode-map-longitude');
        var type = $F('qrcode-map-type');
        query += '&map_latitude=' + latitude; 
        query += '&map_longitude=' + longitude;
        query += '&map_type=' + type;
        query += '&shorturl=1';
        data = {
          latitude: latitude,
          longitude: longitude,
          map_type: type,
          shorturl: true
        };
        break;

      case 'SOCIAL_NETWORK':
        var url = $F('qrcode-data-social-network-url');
        if (url == '' || url == 'http://')
          showDefault = true;
        else
        {
          query += '&social_network_url=' + encodeURIComponent(url);
          query += '&shorturl=' + shorturl;         
          data = {
            social_network: $RF('qrcode-data-social-network-facebook'),
            social_network_url: url,
            shorturl: shorturl
          };
        }
        break;
      
    }
    
    
    data.type_code = typeCode;
    
    if (showDefault)
    {
      $('qrcode-preview').src = '/images/default_qrcode.png';
      
      if (this.clientLoggedIn)
        $('qrcode-info').hide();
    }
    else
    {
      //console.info('generate.generate?' + query);
      //console.info(data);
      $('qrcode-preview').src = 'generate.generate?' + query;
      
      if (this.clientLoggedIn)
        this.refreshQRCodeInfo(data);
    }
  },
  
  refreshQRCodeInfo: function(data)
  {
    sendAjaxMessage('generate', 'qrcodeinfo', data, this.refreshQRCodeInfoCallback.bind(this));
  },
  
  refreshQRCodeInfoCallback: function(result)
  {
    if (result['short_url_required'])
    {
      $('qrcode-short-url').innerHTML = result['data'];
      $('qrcode-short-url-message').show();
      $('qrcode-info').hide();
      $('qrcode-shorturl-no').disable();
      $('qrcode-shorturl-yes').checked = true;
      return;
    }
    else
    {
      $('qrcode-short-url-message').hide();
      $('qrcode-shorturl-no').enable();
    }
      
    if (result['version'])
    {
      $('qrcode-version').innerHTML = result['version'];
      $('qrcode-info').show();
    }
    
    if (result['url_contains_ampersand'])
      $('qrcode-url-ampersand-warning').show();
    else
      $('qrcode-url-ampersand-warning').hide();
    
//    if (result['data'])
//      console.info('QR encoded data:', result['data']);
  },
  
  setAveryCode: function(averyCode)
  {
    var averyCodeElement = $('avery-code');
    
    // un-highlight current
    this.highlightAveryCodeSelector(averyCodeElement.value, false);
    
    // highlight selected
    this.highlightAveryCodeSelector(averyCode, true);
    
    // set value to be submitted in form
    averyCodeElement.value = averyCode;
  },

  highlightAveryCodeSelector: function(averyCode, selected)
  {
    if (selected)
      $('avery-code-' + averyCode).addClassName('avery-code-selected');
    else      
      $('avery-code-' + averyCode).removeClassName('avery-code-selected');
  },
  
  validateStep1: function ()
  {
    if ($('qrcode-type-TEXT').checked)
      return this.requireField('qrcode-data-text', 'text content');
    else if ($('qrcode-type-URL').checked)
      return this.requireField('qrcode-data-url', 'URL');
    else if ($('qrcode-type-TEL').checked)
      return this.requireField('qrcode-data-tel-number', 'telephone number');
    else if ($('qrcode-type-SMSTO').checked)
      return this.requireField('qrcode-data-smsto-number', 'telephone number')
             && this.requireField('qrcode-data-smsto-message', 'SMS message');
    else if ($('qrcode-type-MAILTO').checked)
      return this.requireField('qrcode-data-mailto-email-address', 'email address');
    else if ($('qrcode-type-MATMSG').checked)
      return this.requireField('qrcode-data-matmsg-email-address', 'email address')
             && this.requireField('qrcode-data-matmsg-subject', 'email subject') 
             && this.requireField('qrcode-data-matmsg-body', 'email body');
    else if ($('qrcode-type-VCARD').checked)
      return this.requireOneField(['qrcode-data-vcard-first-name', 'qrcode-data-vcard-last-name'], 'name')
             && this.requireOneField(['qrcode-data-vcard-tel-number',
                                      'qrcode-data-vcard-email'], 
                             	       'telephone number or email address');
    else if ($('qrcode-type-MAPS').checked)
      return this.requireMapInput();
    else if ($('qrcode-type-FACEBOOK').checked)
      return this.requireField('qrcode-data-facebook', 'URL');
    else if ($('qrcode-type-MYSPACE').checked)
      return this.requireField('qrcode-data-myspace', 'URL');
  },

  requireField: function(field, displayName)
  {
    var value = $F(field);
     
    if (value.length > 0 && value != 'http://')
      return true;
      
    alert('Please enter the ' + displayName + '.');
    $(field).focus();
    return false;
  },

  requireMapInput: function()
  {
    if ($F('qrcode-map-longitude') != '')
      return true;
      
    alert('Please click a position on the map.');
    return false;
  },

  requireOneField: function(fields, display)
  {
    for(var i=0; i<fields.length; ++i)
    {
      if ($F(fields[i]).length > 0)
        return true;
    }    
    
    alert('Please enter the ' + display + '.');
    $(fields[0]).focus();
    return false;
  },

  setMedia: function (media)
  {
    $('qrcode-media').value = media;
  },
  
  widthChanged: function()
  {
    var width = $F('width_pixels_field');
    if (width > 3000)
    {
      $('qrcode-width-info').hide();
      $('qrcode-width-warning').show();
    }
    else
    {
      $('qrcode-width-warning').hide();
      $('qrcode-width-info').show();
    }
  },
  
  setOutputType: function(outputType)
  {
    $('output_type_field').value = outputType;
    
    if (outputType == 'Email')
      $('qrcode-email-fields').show();
    else
      $('qrcode-email-fields').hide();
  },
  
  refreshEmailBodyOnChanges: true,
  refreshEmailBody: function()
  {
    if (!this.refreshEmailBodyOnChanges)
      return;
      
    var senderName = $F('email_sender_name_field');
    var recipientName = $F('email_recipient_name_field');
    
    var body = 'Dear ' + recipientName + '\n'
             + '\n'  
             + 'Attached is a QR Code representing the following content:\n'  
             + '\n'
             + this.qrcodeFormattedData + '\n'
             + '\n'
             + 'Regards\n'
             + senderName + '\n'
             + '\n'  
             + 'This QR Code was generated by www.qrstuff.com';
             
    $('email_body_field').value = body;      
  },
  
  emailBodyChanged: function()
  {
    this.refreshEmailBodyOnChanges = false;
  },
  
  mark: false,
  
  googleMapsInit: function()
  {
    if (typeof(GBrowserIsCompatible) == 'undefined' || !GBrowserIsCompatible())
      return; 
    this.map = new GMap2($('google-map'), { size: new GSize(240,200) });
    var start = new GLatLng(37.774785412131244,-122.41962432861328);
    var zoomLevel = 14;
    this.map.setCenter(start, zoomLevel);
    this.map.addControl(new GSmallMapControl());
    this.geocoder = new GClientGeocoder();
    GEvent.addListener(this.map, 'click', function(overlay, point){
      if(!this.mark && point)
        this.setGoogleMapPoint(point, true); 
    }.bind(this));
  },
  
  googleMapShowAddress: function()
  {
    var address = $F('qrcode-data-maps-address');
  
    if(address == "" || !this.geocoder) 
      return false;
    this.geocoder.getLatLng(
       address,
       function(point) {
         if (!point) 
           alert(address + " not found");
         else 
            this.setGoogleMapPoint(point, true);
         
       }.bind(this)
     );
  },
  
  setGoogleMapPoint: function(point, updateLatLong)
  {
    this.map.clearOverlays();
    this.map.setCenter(point);
    
    this.mark = new GMarker(point, {draggable: true});
    GEvent.addListener(this.mark, "dragend", function(point) {
      this.setGoogleMapLatLong(point.y, point.x);
      this.scheduleRefreshPreview();
    }.bind(this));
    
    this.map.addOverlay(this.mark);
    
    this.map.getCenter(point);
    
    if (updateLatLong)
      this.setGoogleMapLatLong(point.y, point.x);
    
    this.scheduleRefreshPreview();
  },

  setGoogleMapLatLong: function(lat, long)
  {
    $('qrcode-map-latitude').value = lat;
    $('qrcode-map-longitude').value = long;
  },
  
  setGoogleMapType: function(type)
  {
    $('qrcode-map-type').value = type;
    
    this.scheduleRefreshPreview();
  },
  
  googleMapLongLatChanged: function()
  {
    var long = this.parseLongitude($F('qrcode-map-longitude')); 
    var lat = this.parseLatitude($F('qrcode-map-latitude'));
    if (long !== false && lat !== false)
      this.setGoogleMapPoint(new GLatLng(lat, long), false);
  },
  
  parseLongitude: function(s)
  {
    var long = parseFloat(s);
    return (long != Number.NaN && long >= -180 && long <= 180) ? long : false; 
  },
  
  parseLatitude: function(s)
  {
    var lat = parseFloat(s);
    return (lat != Number.NaN && lat > -85 && lat < 85) ? lat : false; 
  },
  
  setSocialNetwork: function()
  {
    $('qrcode-data-social-network-username-label').innerHTML =
      $RF('qrcode-data-social-network-facebook') == 'FACEBOOK' ?
        'Userid (number)' : 'User name';
    
    QRStuff.setSocialNetworkUrl();
  },
  
  setSocialNetworkUrl: function()
  {
    var userName = $F('qrcode-data-social-network-username');
    var url = '';
    if (userName != '')
    {
      switch($RF('qrcode-data-social-network-facebook'))
      {
        case 'TWITTER': 
          url = 'http://www.twitter.com/' + userName;
          break;
        
        case 'FACEBOOK': 
          url = 'http://www.facebook.com/profile.php?id=' + userName;
          break;

        case 'MYSPACE':
          url = 'http://www.myspace.com/' + userName;
          break;
          
        case 'LINKEDIN':
          url = 'http://www.linkedin.com/' + userName;
          break;
      }
    }
    
    $('qrcode-data-social-network-url').value = url;
    
    this.scheduleRefreshPreview();    
  },
  
  validateEmail: function()
  {
    if (!(QRStuff.requireField('sender_name_field', 'sender name')
      && QRStuff.requireField('sender_email_address_field', 'sender email address')
      && QRStuff.requireField('recipient_name_field', 'recipient name')
      && QRStuff.requireField('recipient_email_address_field', 'recipient email address')
      && QRStuff.requireField('subject_field', 'email subject')
      && QRStuff.requireField('body_field', 'email body')))
     return false;
    
    var emailAddressValidationRegex = /^[^@]+@[^@]+$/;
   
    var senderName = $F('sender_name_field');
    var senderEmailAddress = $F('sender_email_address_field');
    
    if (senderName == senderEmailAddress)
    {
      alert('The sender name and email address should not be the same.');
      return false;
    }
    
    if (!senderEmailAddress.match(emailAddressValidationRegex))
    {
      alert('Please enter a single valid email address of the form user@example.com.');
      return false;
    }
        
        
    var recipientName = $F('recipient_name_field');
    var recipientEmailAddress = $F('recipient_email_address_field');
    
    if (recipientName == recipientEmailAddress)
    {
      alert('The recipient name and email address should not be the same.');
      return false;
    }
    
    if (!recipientEmailAddress.match(emailAddressValidationRegex))
    {
      alert('Please enter a single valid email address of the form user@example.com.');
      return false;
    }
    
    return true;
  }
  
}
