window.desktop = null;
window.serverDomain = 'http://' + window.document.location.host;
window.gearsUploadUrl = window.serverDomain + '/attachmentupload';
window.browserPlusUploadUrl = window.serverDomain + '/formdataupload';
window.gearsReady = false;
window.browserPlusReady = false;
window.currentUser = null;
window.currentStorage = 0;

window.onload = function() {
  addConsoleDebug();
  init();
};

function init() {   
  checkLoggedIn(function(data) {
    var authenticated = data.authenticated;
    var login = data.loginUrl;
    var logout = data.logoutUrl;
    var email = data.email;

    window.currentUser = email;

    if (!authenticated) {
      var html = '<a href="' + login + '">you must login first</a>';
      jQuery('#authentication').html(html);
      
      jQuery('#main input').each(function(i) {
        jQuery(this).attr('disabled', 'disabled');
      });      
    } else {
      var html = '<a href="' + logout + '">logout</a>&nbsp;&nbsp;[ ' + email + ' ]';
      jQuery('#authentication').html(html);

      jQuery('#main input').each(function(i) {
        jQuery(this).attr('disabled', false);
      });

      // only detect and init upload features when a user is logged in
      detectGears(gearsInit);
      detectBrowserPlus(browserPlusInit);    

      fetchFileList(true);
    }
  });
}

function showHtmlFormUpload() {

  var iframeName = 'hiddenIframe';
  var iframeId = iframeName;

  var hiddenIframe = document.createElement('iframe');
  hiddenIframe.src = window.serverDomain + '/blank.html';
  hiddenIframe.style.display = 'none';
  hiddenIframe.id = iframeId;
  hiddenIframe.name = iframeName;

  var callback = function() {
    var raw = top.window.frames[0].document.body.innerHTML;
    raw = raw.replace('<pre>', '');
    raw = raw.replace('</pre>', '');
    try {
      var file = JSON.parse(raw);
      var link = createFileEntry(file);
      jQuery('#target').prepend(link);
      link.fadeIn('slow');      
    } catch(e) {

    }
    
    jQuery('#uploadStatus').empty();
  };

  // most browsers
  hiddenIframe.onload = callback;  
  
  // IE 6 & 7
  hiddenIframe.onreadystatechange = function() {
    if (hiddenIframe.readyState == 'loaded' || hiddenIframe.readyState == 'complete') {
  
      if(self.frames[iframeId].name != iframeId) { 
        /* *** IMPORTANT: This is a BUG FIX for Internet Explorer *** */ 
        self.frames[iframeId].name = iframeId; 
      }
      callback();
    }
  };

  var html = '<form id="formUpload" target="' + iframeName + 
      '" action="' + window.browserPlusUploadUrl + '?email=' +
      window.currentUser + '" method="post" enctype="multipart/form-data">' + 
      '<label>Upload file: </label>&nbsp;&nbsp;' + 
      '<input id="fileInput" name="file" type="file" value="upload file">' + 
      '&nbsp;&nbsp;<span class="smallRed" id="uploadStatus"></span></form>';

  jQuery('#fileControl').append(html);  

  jQuery('#fileInput').change(function() {
    jQuery('#uploadStatus').html('uploading..');
    jQuery('#formUpload').get(0).submit();
  });

  jQuery('#formUpload').submit(function(e) {
    // do nothing, this is handled by hiddenIframe load event
  });

  document.body.appendChild(hiddenIframe);
}

function detectGears(callback) {
  var installMsg = 'The application you wish to use is trying to use Google Gears multi-file upload.';
  var permissionMsg = 'This application is using Gears multi-file upload feature.';

  if (!gearsutil.isGearsInstalled()) {      
    // do not have Gears installed

    var installUrl = "http://gears.google.com/?action=install&message=" + 
      installMsg + '&return=' + document.location.href;   

    var link = jQuery('<input type="button" value="Install Gears"/>');
    link.click(function() {
      top.document.location = installUrl;
    });
    
    var install = jQuery('<div/>');
    install.addClass('installDiv');

    install.append('<img src="gears_logo.gif"/><br>Enable multi-files upload ');
    install.append(link);

    jQuery('#install').append(install);    

    showHtmlFormUpload();

    return;
  }

  var success = gearsutil.requestGearsForLocalStorage(permissionMsg);

  if (!success) {
    // has Gears, but no permission
    showHtmlFormUpload();
    return;
  } else {
    window.gearsReady = true;
    callback();
  }
}

function detectBrowserPlus(callback) {

  if (!BrowserPlus) {
    console.log('BrowserPlus is null');
    return;
  }

  BrowserPlus.init(function(r) {

    if (r.success) {
      window.browserPlusReady = true;
      callback();
    } else {  

      BrowserPlus.initWhenAvailable({}, function() {
        window.browserPlusReady = true;
        callback()
      });
      
      var installUrl = 'http://browserplus.yahoo.com/install';
      var link = jQuery('<input type="button" value="Install BrowserPlus"/>');
      link.click(function() {
        top.document.location = installUrl;
      });

      var install = jQuery('<div/>');
      install.addClass('installDiv');

      install.append('<img src="bp_logo.png"/><br>Enable Drag-and-Drop upload ');
      install.append(link);

      jQuery('#install').append(install);
    } 
  });
}

function gearsInit() {
  //init Gear's file upload
  window.desktop = google.gears.factory.create('beta.desktop');   

  var uploadButton = jQuery('<input type="button" id="upload" value="upload file(s)"/>');

  uploadButton.click(function() {
    desktop.openFiles(function(files) {

      console.log('User selected ' + files.length + ' files.');

      for (var i = 0; i < files.length; i++) {
        var file = files[i];
        var filename = file.name;
        var fileblob = file.blob;
        if (isFileTooBig(file.size)) {
          alert('"' + fileName + '" is larger than 1 MB.  You can only upload file 1 MB or smaller.');
          continue;
        }
        gearsUploadFile(filename, fileblob);
      }      
    });    
  });
  
  jQuery('#fileControl').append(uploadButton);
}

function browserPlusInit() {
  var ttsService = {  
    service: "TextToSpeech",    
    version: "1",    
    minversion: "1.0.2"    
  };  

  var uploaderService = {  
    service: "Uploader",    
    version: "3",
    minversion: "3.1.4"
  };  

  var dropped = function(arg) {

    for (var i = 0; i < arg.length; i++) {   
      var file = arg[i];
      var fileName = file.BrowserPlusHandleName;
      if (isFileTooBig(file.size)) {
        alert('"' + fileName + '" is larger than 1 MB.  You can only upload file 1 MB or smaller.');
        continue;
      }
      browserPlusUpload(fileName, {'file': file});
    } 
  };

  var hovering = function(arg) {
    var target =  jQuery('#target');

    if (arg) {
      target.css('backgroundColor', 'gray');
    } else {
      target.css('backgroundColor', 'black');
    }
  };

  var loadServices = function(r) {
    if (r.success) {  
      window.ttsReady = true;

      var dnd = BrowserPlus.DragAndDrop;
      dnd.AddDropTarget({id: "target"}, function(res) {
        dnd.AttachCallbacks({  
          id: "target",  
          hover: hovering,  
          drop: dropped  
        }, function() {});        
      });
    } else {
      console.log(r);
      console.log('error initServices()');
    }
  };

  var serviceConfig = {};
  serviceConfig.services = [];
  serviceConfig.services.push({service: 'DragAndDrop'});
  serviceConfig.services.push(ttsService);
  serviceConfig.services.push(uploaderService);

  BrowserPlus.require(serviceConfig, loadServices); 
}

function fetchFileList(fancy) {
  var target = jQuery('#target');
  
  target.empty();
  target.append(jQuery('<div class="largeRed"> Loading ... </div>'));

  var url = '/getallfiles';
  
  var ajaxCall = {};
  ajaxCall.cache = false;
  ajaxCall.type = 'GET';
  ajaxCall.url = url;
  ajaxCall.success = function(data) {
    target.empty();
    var json = JSON.parse(data);
    var files = json.files;
    var total_size = json.total_size;
    window.currentStorage = total_size;

    for (var i = 0; i < files.length; i++) {
      var file = files[i];
      var id = file.id;
      var url = file.url;
      var date = file.date;
      var name = file.name;
      var link = createFileEntry(file);
      target.prepend(link);

      if (fancy) {
        link.fadeIn('slow');
      } else {
        link.show();
      }
    }
  };

  jQuery.ajax(ajaxCall);
}

function checkLoggedIn(callback) {
  var ajaxCall = {};
  ajaxCall.cache = false;
  ajaxCall.type = 'GET';
  ajaxCall.url = 'auth?next=' + document.location.href;
  ajaxCall.success = function(data) {
    var obj = JSON.parse(data);
    console.log('current user: ' + obj.email);
    callback(obj);
  };
  jQuery.ajax(ajaxCall);
}

function createProgressBar() {
  var bar = jQuery('<div>0</div>');
  bar.progressBar(0,
      {barImage: 'jquery.progressbar/images/progressbg_green.gif',
      boxImage: 'jquery.progressbar/images/progressbar.gif'});

  return bar;
}

function updateProgressBar(percent, bar) {
  bar.progressBar(percent,
      {barImage: 'jquery.progressbar/images/progressbg_green.gif',
      boxImage: 'jquery.progressbar/images/progressbar.gif'});
}

function gearsUploadFile(fileName, fileBlob) {
  var req = google.gears.factory.create('beta.httprequest');

  req.open('POST', gearsUploadUrl  + '?email=' + window.currentUser);
  
  req.setRequestHeader('Content-Disposition',
                        'attachment; filename="' + fileName + '"');

  var progressBar = createProgressBar(fileName);

  req.upload.onprogress = function(e) {
    var percent = Math.ceil((e.loaded / e.total) * 100).toString();  
    updateProgressBar(percent, progressBar);
  };
  
  req.onreadystatechange = function() {
    if (req.readyState == 4) {
      updateFileList(progressBar, fileName, req.responseText);
    }
  };

  jQuery('#target').prepend(progressBar);
  
  req.send(fileBlob);
}

function browserPlusUpload(fileName, fileObj) {

  var progressBar = createProgressBar(fileName);

  var uploadObj = {
      url: window.browserPlusUploadUrl + '?email=' + window.currentUser,
      progressCallback: function(data) {
        var percent = data.filePercent;
        updateProgressBar(percent, progressBar);
      },
      files: fileObj,
      cookies: document.cookie      
  };

  BrowserPlus.Uploader.upload(uploadObj, 
    function(response) {
      console.log(response);
      updateFileList(progressBar, fileName, response.value.body);
    }
  );

  jQuery('#target').prepend(progressBar);
}

function isFileTooBig(size) {
  var maxSize = 1000000; // in bits
  var ret = false;
  if (size > maxSize) {
    ret = true;
  }
  return ret;
}

function updateFileList(progressBar, fileName, json) {
  
  console.log(json);
  
  var uploadCleanup = function() {
    progressBar.empty();
    progressBar.remove();   
  };

  try {    
    var response = JSON.parse(json);         
  } catch (e) {
    console.log('Response json parsed exception for ' + fileName);
    uploadCleanup();
  }
  
  if (typeof (response.error) != 'undefined') {
    console.log(response.error);
    uploadCleanup();
  } else {
    var fileLink = createFileEntry(response);
    progressBar.empty();
    progressBar.html(fileLink);
    fileLink.fadeIn('slow'); 
  }
}

function imageResize(image) {
  var max = 450;
  var w_ = image.width;
  var h_ = image.height;

  if (w_ > max || h_ > max) {
    var wRatio = w_ / max;

    var hRatio = h_ / max;

    var ratio = Math.max(wRatio, hRatio);

    var w = Math.round(w_ / ratio);
    var h = Math.round(h_ / ratio);
    
    image.width = w;
    image.height = h;
    image.style.width = w;
    image.style.height = h;
    
    image.style.pixelHeight = h;
    //image.offsetHeight = h;
    
    image.style.pixelWidth = w;
    //image.offsetWidth = w;
  
  }
}

function showFileInfo(file) {
  
  file.type.match(/([a-z]+)\/+[a-z]/i);
  var type = RegExp.$1;

  var name = jQuery('<div/>');
  name.html('<label class="infoLabel">File name</label>: ' + file.name);
  
  var date = jQuery('<div/>');
  date.html('<label class="infoLabel">Uploaded on</label>: ' 
      + new Date(file.date));
  
  var url = jQuery('<div/>');
  url.append('<label class="infoLabel">Link:&nbsp;</label>');
  var urlInput = 
      jQuery('<input type="text" style="width: 400px;" value="' 
      + file.url  + '"/>');
  urlInput.click(function() {
    urlInput.get(0).select();
  });
  
  var mimeType = jQuery('<div/>');
  mimeType.html('<label class="infoLabel">MIME type</label>: ' + file.type);

  var urlLink = jQuery('<a/>');
  urlLink.attr('href', file.url);
  urlLink.attr('target', '_blank');
  urlLink.html('GO TO');
  url.append(urlInput);
  url.append('&nbsp;');
  url.append(urlLink);
  
  urlInput.get(0).select();
  
  var size = jQuery('<div/>');
  var size_ = 
      (file.size / 1000) > 1000 ? 
      (file.size / (1000 * 1000)).toFixed(2) + 
      'MB':(file.size / 1000).toFixed(2) + ' KB'; 
  size.html('<label class="infoLabel">File size</label>: ' + size_);

  var infoText = jQuery('#infoText');
  
  infoText.append(name);
  infoText.append('<br/>');
  infoText.append(size);
  infoText.append('<br/>');
  infoText.append(mimeType);
  infoText.append('<br/>');
  infoText.append(date);
  infoText.append('<br/>');
  infoText.append(url);
  infoText.append('<br/>');
  infoText.append('<br/>');
  
  if (type == 'image') {
    var img = jQuery('<img/>');
    img.attr('src', file.url);
    img.css('display', 'none');
 
    var imgId = 'preivewImage';
    var img = [];
    img.push('<div align="center">');
    img.push('<img id="')
    img.push(imgId);
    img.push('" src="');
    img.push(file.url);
    img.push('" style="display: none;" ');
    img.push('/>');
    img.push('</div>');
    img = img.join('');

    jQuery('#imageHolder').html(img);

    jQuery('#' + imgId).bind('load', function() {
      window.imageResize(jQuery(this).get(0));
      jQuery(this).css('display', 'block');
    });
  }

}

function createFileEntry(file) {
  
  var link = jQuery('<a/>');
  link.addClass('fileEntryLink');
  link.attr({'href': file.url, 'target': '_blank'});
  link.html(file.name);

  link.click(function(e) {
    e.preventDefault();
    jQuery('#infoText').empty();
    jQuery('#imageHolder').empty();
    showFileInfo(file);
  });

  var div = jQuery('<div/>');
  var deleteButton = jQuery('<img class="deleteButton"/>');
  deleteButton.attr('src', 'remove.png');

  deleteButton.click(function() {
    var answer = confirm('Delete ' + file.name + '?');
    if (answer) {

      var ajaxCall = {};
      ajaxCall.cache = false;
      ajaxCall.type = 'GET';
      ajaxCall.url = file.delete_url;
      ajaxCall.success = function(data) {
        if (data == 'success') {
          div.fadeOut('slow');
          div.empty();
          div.remove();
          jQuery('#imageHolder').empty();
          jQuery('#infoText').empty();
        }
      };
      jQuery.ajax(ajaxCall);
    }
  });
  div.append(deleteButton);
  div.append(link);
  div.hide();  
  

  var textHandler = function() {
    if (!window.ttsReady) {
      console.log('tts is not ready');
      return;
    }

    var link = jQuery('<a/>');
    link.attr('href', 'javascript: return false;');
    link.html(' listen ');
    link.addClass('previewLink'); 

    div.append(link);
    link.click(function(e) {
      jQuery.get(file.url, function(text) {
        BrowserPlus.TextToSpeech.Say({utterance: text}, function(){});
      });   
      e.preventDefault();
    });
  };
  
  return div;
}

