/**
 * hAudio microformat.
 *
 * http://microformats.org/wiki/audio-info-proposal
 *
 * Author: David I. Lehn <dlehn@digitalbazaar.com>
 */

function hAudio(node) {
  if (node) {
    Microformats.parser.newMicroformat(this, node, "hAudio");
  }
}
hAudio.prototype.toString = function() {
  return this["audio-title"];
}

var hAudio_definition = {
  mfVersion: 0.8,
  mfObject: hAudio,
  className: "haudio",
  required: ["audio-title"],
  properties: {
    "audio-title" : {
      required: true
    },
    "contributor" : {
      plural: true,
      subproperties : {
        "vcard" : {
          virtual: true,
          datatype: "microformat",
          microformat: "hCard"
        }
      }
    },
    "duration" : {
      datatype: "dateTime"
    },
    "published-date" : {
      datatype: "dateTime"
    },
    "category" : {
      plural: true
    },
    "price" : {
      plural: true,
      subproperties : {
        "money" : {
          virtual: true,
          datatype: "microformat",
          microformat: "money"
        }
      }
    },
    "enclosure" : {
      plural: true,
      rel: true,
      subproperties: {
        "link" : {
          virtual: true,
          datatype: "anyURI"
        },
        "text" : {
          virtual: true
        }
        // FIXME: add "type"
      }
    },
    "sample" : {
      plural: true,
      rel: true,
      subproperties: {
        "link" : {
          virtual: true,
          datatype: "anyURI"
        },
        "text" : {
          virtual: true
        }
        // FIXME: add "type"
      }
    },
    "payment" : {
      plural: true,
      rel: true,
      subproperties: {
        "link" : {
          virtual: true,
          datatype: "anyURI"
        },
        "text" : {
          virtual: true
        }
        // FIXME: add "type"
      }
    },
    "image-summary" : {
      plural: true,
      subproperties: {
        "link" : {
          virtual: true,
          datatype: "anyURI"
        },
        "text" : {
          virtual: true
        }
      }
    }
  }
};

Microformats.add("hAudio", hAudio_definition);

/* Figure out a guess for artist */
function hAudioArtist(node) {
  var fn = null;
  var contributors = node["contributor"];
  if (contributors) {
    // Find first contributor with "artist" role
    for (var c = 0; fn == null && c < contributors.length; c++) {
      var contributor = contributors[c];
      if (contributor.vcard && contributor.vcard.role) {
        for (var r = 0; fn == null && r < contributor.vcard.role.length; r++) {
          if (contributor.vcard.role[r].toLowerCase() == "artist") {
            // vcard is invalid without fn
            if (contributor.vcard.fn) {
              fn = contributor.vcard.fn;
            }
          }
        }
      }
    }
    // Default to first contributor if no artist present
    if (fn == null && contributors.length > 0) {
      fn = contributors[0].vcard.fn;
    }
  }
  return fn;
}

/* Join title and creator, if available, into a encoded string suitable
 * for use in a URI */
function encodedTitleAndArtist(node, quote) {
  if (!quote) {
    quote = "";
  }
  var str = quote + node["audio-title"] + quote;
  var fn = hAudioArtist(node);
  if (fn) {
    str += " " + quote + fn + quote;
  }
  return encodeURIComponent(str);
}

var audio_sample = {
  description: "Listen to audio sample",
  shortDescription: "Sample",
  scope: {
    semantic: {
      "hAudio" : "sample"
    }
  },
  doAction: function(semanticObject, semanticObjectType, propertyIndex) {
    var propertyIndex = (propertyIndex == null) ? 0 : propertyIndex;
    return semanticObject.sample[propertyIndex].link;
  },
  getActionName: function(semanticObject, semanticObjectType, propertyIndex) {
    var propertyIndex = (propertyIndex == null) ? 0 : propertyIndex;
    var text = semanticObject.sample[propertyIndex].text;
    if (!text) {
      text = "Sample #" + (propertyIndex + 1);
    }
    return text;
  }
};

var audio_download = {
  description: "Download audio",
  shortDescription: "Download",
  scope: {
    semantic: {
      "hAudio" : "enclosure"
    }
  },
  doAction: function(semanticObject, semanticObjectType, propertyIndex) {
    var propertyIndex = (propertyIndex == null) ? 0 : propertyIndex;
    return semanticObject.enclosure[propertyIndex].link;
  },
  getActionName: function(semanticObject, semanticObjectType, propertyIndex) {
    var propertyIndex = (propertyIndex == null) ? 0 : propertyIndex;
    var text = semanticObject.enclosure[propertyIndex].text;
    if (!text) {
      text = "Download #" + (propertyIndex + 1);
    }
    return text;
  }
};

var audio_buy = {
  description: "Buy audio",
  shortDescription: "Buy",
  scope: {
    semantic: {
      "hAudio" : "payment"
    }
  },
  doAction: function(semanticObject, semanticObjectType, propertyIndex) {
    var propertyIndex = (propertyIndex == null) ? 0 : propertyIndex;
    return semanticObject.payment[propertyIndex].link;
  },
  getActionName: function(semanticObject, semanticObjectType, propertyIndex) {
    var propertyIndex = (propertyIndex == null) ? 0 : propertyIndex;
    var text = semanticObject.payment[propertyIndex].text;
    if (!text) {
      text = "Location #" + (propertyIndex + 1);
    }
    return text;
  }
};

var audio_search_amazon = {
  description: "Find audio on Amazon",
  shortDescription: "Amazon",
  icon: "http://www.amazon.com/favicon.ico",
  scope: {
    semantic: {
      "hAudio" : "audio-title"
    }
  },
  doAction: function(semanticObject, semanticObjectType) {
    var url = "http://www.amazon.com/gp/search?index=music";
    var title = semanticObject["audio-title"];
    url += "&field-title=" + encodeURIComponent(title);
    var fn = hAudioArtist(semanticObject);
    if (fn) {
      url += "&field-artist=" + encodeURIComponent(fn);
    }
    return url;
  }
};

var audio_search_bitmunk = {
  description: "Find audio on Bitmunk",
  shortDescription: "Bitmunk",
  icon: "http://www.bitmunk.com/themes/bm2/images/favicon.ico",
  scope: {
    semantic: {
      "hAudio" : "audio-title"
    }
  },
  doAction: function(semanticObject, semanticObjectType) {
    var url = "http://www.bitmunk.com/browse/search/all/title/all/";
    var str = encodedTitleAndArtist(semanticObject);
    return url + str;
  }
};

var audio_search_google = {
  description: "Find audio on Google",
  shortDescription: "Google",
  icon: "http://www.google.com/favicon.ico",
  scope: {
    semantic: {
      "hAudio" : "audio-title"
    }
  },
  doAction: function(semanticObject, semanticObjectType) {
    var url = "http://www.google.com/search?q=";
    var str = encodedTitleAndArtist(semanticObject, "\"");
    return url + str;
  }
};

var audio_search_musicbrainz = {
  description: "Find audio on MusicBrainz",
  shortDescription: "MusicBrainz",
  icon: "http://musicbrainz.org/favicon.ico",
  scope: {
    semantic: {
      "hAudio" : "audio-title"
    }
  },
  doAction: function(semanticObject, semanticObjectType) {
    var url = "http://musicbrainz.org/search/textsearch.html?query=";
    var title = semanticObject["audio-title"];
    url += encodeURIComponent("\"" + title + "\"");
    var fn = hAudioArtist(semanticObject);
    if (fn) {
      url += encodeURIComponent(" AND artist:\"" + fn + "\"");
    }
    url += "&type=track&adv=on&handlearguments=1"
    return url;
  }
};

SemanticActions.add("audio_sample", audio_sample);
SemanticActions.add("audio_download", audio_download);
SemanticActions.add("audio_buy", audio_buy);

SemanticActions.add("audio_search_amazon", audio_search_amazon);
SemanticActions.add("audio_search_bitmunk", audio_search_bitmunk);
SemanticActions.add("audio_search_google", audio_search_google);
SemanticActions.add("audio_search_musicbrainz", audio_search_musicbrainz);
