package com.adobe.fileformats.vcard
{
import mx.utils.Base64Decoder;
import mx.utils.StringUtil;
public class VCardParser
{
public static function parse(vcardStr:String):Array
{
var vcards:Array = new Array();
var lines:Array = vcardStr.split(/\r\n/);
var vcard:VCard;
var type:String;
var typeTmp:String;
var line:String;
for (var i:uint = 0; i < lines.length; ++i)
{
line = lines[i];
if (line == "BEGIN:VCARD")
{
vcard = new VCard();
}
else if (line == "END:VCARD")
{
if (vcard != null)
{
vcards.push(vcard);
}
}
else if(line.search(/^ORG/i) != -1)
{
var org:String = line.substring(4, line.length);
var orgArray:Array = org.split(";");
for each (var orgToken:String in orgArray)
{
if (StringUtil.trim(orgToken).length > 0)
{
vcard.orgs.push(orgToken);
}
}
}
else if(line.search(/^TITLE/i) != -1)
{
var title:String = line.substring(6, line.length);
vcard.title = title;
}
else if (line.search(/^FN:/i) != -1)
{
var fullName:String = line.substring(3, line.length);
vcard.fullName = fullName;
}
else if (line.search(/^TEL/i) != -1)
{
type = new String();
typeTmp = new String();
var phone:Phone = new Phone();
var number:String;
var phoneTokens:Array = line.split(";");
for each (var phoneToken:String in phoneTokens)
{
if (phoneToken.search(/^TYPE=/i) != -1)
{
if (phoneToken.indexOf(":") != -1)
{
typeTmp = phoneToken.substring(5, phoneToken.indexOf(":"));
number = phoneToken.substring(phoneToken.indexOf(":")+1, phoneToken.length);
}
else
{
typeTmp = phoneToken.substring(5, phoneToken.length);
}
typeTmp = typeTmp.toLocaleLowerCase();
if (typeTmp == "pref")
{
continue;
}
if (type.length != 0)
{
type += (" ");
}
type += typeTmp;
}
}
if (type.length > 0 && number != null)
{
phone.type = type;
phone.number = number;
}
vcard.phones.push(phone);
}
else if (line.search(/^EMAIL/i) != -1)
{
type = new String();
typeTmp = new String();
var email:Email = new Email();
var emailAddress:String;
var emailTokens:Array = line.split(";");
for each (var emailToken:String in emailTokens)
{
if (emailToken.search(/^TYPE=/i) != -1)
{
if (emailToken.indexOf(":") != -1)
{
typeTmp = emailToken.substring(5, emailToken.indexOf(":"));
emailAddress = emailToken.substring(emailToken.indexOf(":")+1, emailToken.length);
}
else
{
typeTmp = emailToken.substring(5, emailToken.length);
}
typeTmp = typeTmp.toLocaleLowerCase();
if (typeTmp == "pref" || typeTmp == "internet")
{
continue;
}
if (type.length != 0)
{
type += (" ");
}
type += typeTmp;
}
}
if (type.length > 0 && emailAddress != null)
{
email.type = type;
email.address = emailAddress;
}
vcard.emails.push(email);
}
else if (line.indexOf("ADR;") != -1)
{
var addressTokens:Array = line.split(";");
var address:Address = new Address();
for (var j:uint = 0; j < addressTokens.length; ++j)
{
var addressToken:String = addressTokens[j];
if (addressToken.search(/^home:+$/i) != -1) {
address.type = "home";
}
else if (addressToken.search(/^work:+$/i) != -1) {
address.type = "work";
}
if (addressToken.search(/^type=/i) != -1) {
addressToken = addressToken.replace(/:/,"");
var addressType:String = addressToken.substring(5, addressToken.length).toLowerCase();
if (addressType == "pref") {
continue;
}
else if (addressType.indexOf("home") != -1) {
addressType = "home";
}
else if (addressType.indexOf("work") != -1) {
addressType = "work";
}
else if (addressType.indexOf(",") != -1) {
var typeTokens:Array = addressType.split(",");
for each (var typeToken:String in typeTokens)
{
if (typeToken != "pref")
{
addressType = typeToken;
break;
}
}
}
address.type = addressType;
}
else if (addressToken.search(/^\d/) != -1 && address.street == null)
{
address.street = addressToken.replace(/\\n/, "");
address.city = addressTokens[j+1];
address.state = addressTokens[j+2];
address.postalCode = addressTokens[j+3];
}
}
if (address.type != null && address.street != null)
{
vcard.addresses.push(address);
}
}
else if (line.search(/^PHOTO;BASE64/i) != -1)
{
var imageStr:String = new String();
for (var k:uint = i+1; k < lines.length; ++k)
{
imageStr += lines[k];
if (lines[k].indexOf('=') != -1)
{
var decoder:Base64Decoder = new Base64Decoder();
decoder.decode(imageStr);
vcard.image = decoder.flush();
break;
}
}
}
}
return vcards;
}
}
}