Project

General

Profile

Statistics
| Branch: | Revision:

colonymech / docs / www / colonyscout / internal / includes / uploadify / com / adobe / fileformats / vcard / VCardParser.as @ f59acf11

History | View | Annotate | Download (7.17 KB)

1
/*
2
  Copyright (c) 2008, Adobe Systems Incorporated
3
  All rights reserved.
4

    
5
  Redistribution and use in source and binary forms, with or without 
6
  modification, are permitted provided that the following conditions are
7
  met:
8

    
9
  * Redistributions of source code must retain the above copyright notice, 
10
    this list of conditions and the following disclaimer.
11
  
12
  * Redistributions in binary form must reproduce the above copyright
13
    notice, this list of conditions and the following disclaimer in the 
14
    documentation and/or other materials provided with the distribution.
15
  
16
  * Neither the name of Adobe Systems Incorporated nor the names of its 
17
    contributors may be used to endorse or promote products derived from 
18
    this software without specific prior written permission.
19

    
20
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
21
  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22
  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23
  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
24
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26
  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28
  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29
  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
*/
32
package com.adobe.fileformats.vcard
33
{
34
	import mx.utils.Base64Decoder;
35
	import mx.utils.StringUtil;
36
	
37
	public class VCardParser
38
	{
39
		public static function parse(vcardStr:String):Array
40
		{
41
			var vcards:Array = new Array();
42
			var lines:Array = vcardStr.split(/\r\n/);
43
			var vcard:VCard;
44
			var type:String;
45
			var typeTmp:String;
46
			var line:String;
47

    
48
			for (var i:uint = 0; i < lines.length; ++i)
49
			{
50
				line = lines[i];
51
				if (line == "BEGIN:VCARD")
52
				{
53
					vcard = new VCard();
54
				}
55
				else if (line == "END:VCARD")
56
				{
57
					if (vcard != null)
58
					{
59
						vcards.push(vcard);
60
					}
61
				}
62
				else if(line.search(/^ORG/i) != -1)
63
				{
64
					var org:String = line.substring(4, line.length);
65
					var orgArray:Array = org.split(";");
66
					for each (var orgToken:String in orgArray)
67
					{
68
						if (StringUtil.trim(orgToken).length > 0)
69
						{
70
							vcard.orgs.push(orgToken);
71
						}
72
					}
73
				}
74
				else if(line.search(/^TITLE/i) != -1)
75
				{
76
					var title:String = line.substring(6, line.length);
77
					vcard.title = title;
78
				}
79
				else if (line.search(/^FN:/i) != -1)
80
				{
81
					var fullName:String = line.substring(3, line.length);
82
					vcard.fullName = fullName;
83
				}
84
				else if (line.search(/^TEL/i) != -1)
85
				{
86
					type = new String();
87
					typeTmp = new String();
88
					var phone:Phone = new Phone();
89
					var number:String;
90
					var phoneTokens:Array = line.split(";");
91
					for each (var phoneToken:String in phoneTokens)
92
					{
93
						if (phoneToken.search(/^TYPE=/i) != -1)
94
						{
95
							if (phoneToken.indexOf(":") != -1)
96
							{
97
								typeTmp = phoneToken.substring(5, phoneToken.indexOf(":"));
98
								number = phoneToken.substring(phoneToken.indexOf(":")+1, phoneToken.length);
99
							}
100
							else
101
							{									
102
								typeTmp = phoneToken.substring(5, phoneToken.length);
103
							}
104

    
105
							typeTmp = typeTmp.toLocaleLowerCase();
106

    
107
							if (typeTmp == "pref")
108
							{
109
								continue;
110
							}
111
							if (type.length != 0)
112
							{
113
								type += (" ");
114
							}
115
							type += typeTmp;
116
						}
117
					}
118
					if (type.length > 0 && number != null)
119
					{
120
						phone.type = type;
121
						phone.number = number;
122
					}
123
					vcard.phones.push(phone);
124
				}
125
				else if (line.search(/^EMAIL/i) != -1)
126
				{
127
					type = new String();
128
					typeTmp = new String();
129
					var email:Email = new Email();
130
					var emailAddress:String;
131
					var emailTokens:Array = line.split(";");
132
					for each (var emailToken:String in emailTokens)
133
					{
134
						if (emailToken.search(/^TYPE=/i) != -1)
135
						{
136
							if (emailToken.indexOf(":") != -1)
137
							{
138
								typeTmp = emailToken.substring(5, emailToken.indexOf(":"));
139
								emailAddress = emailToken.substring(emailToken.indexOf(":")+1, emailToken.length);
140
							}
141
							else
142
							{									
143
								typeTmp = emailToken.substring(5, emailToken.length);
144
							}
145

    
146
							typeTmp = typeTmp.toLocaleLowerCase();
147

    
148
							if (typeTmp == "pref" || typeTmp == "internet")
149
							{
150
								continue;
151
							}
152
							if (type.length != 0)
153
							{
154
								type += (" ");
155
							}
156
							type += typeTmp;
157
						}
158
					}
159
					if (type.length > 0 && emailAddress != null)
160
					{
161
						email.type = type;
162
						email.address = emailAddress;
163
					}
164
					vcard.emails.push(email);
165
				}
166
				else if (line.indexOf("ADR;") != -1)
167
				{
168
					var addressTokens:Array = line.split(";");
169
					var address:Address = new Address();
170
					for (var j:uint = 0; j < addressTokens.length; ++j)
171
					{
172
						var addressToken:String = addressTokens[j];
173
						if (addressToken.search(/^home:+$/i) != -1) // For Outlook, which uses non-standard vCards.
174
						{
175
							address.type = "home";
176
						}
177
						else if (addressToken.search(/^work:+$/i) != -1) // For Outlook, which uses non-standard vCards.
178
						{
179
							address.type = "work";
180
						}
181
						if (addressToken.search(/^type=/i) != -1)  // The "type" parameter is the standard way (which Address Book uses)
182
						{
183
							// First, remove the optional ":" character.
184
							addressToken = addressToken.replace(/:/,"");
185
							var addressType:String = addressToken.substring(5, addressToken.length).toLowerCase();
186
							if (addressType == "pref") // Not interested in which one is preferred.
187
							{
188
								continue;
189
							}
190
							else if (addressType.indexOf("home") != -1) // home
191
							{
192
								addressType = "home";
193
							}
194
							else if (addressType.indexOf("work") != -1) // work
195
							{
196
								addressType = "work";
197
							}
198
							else if (addressType.indexOf(",") != -1) // if the comma technique is used, just use the first one
199
							{
200
								var typeTokens:Array = addressType.split(",");
201
								for each (var typeToken:String in typeTokens)
202
								{
203
									if (typeToken != "pref")
204
									{
205
										addressType = typeToken;
206
										break;
207
									}
208
								}
209
							}
210
							address.type = addressType;
211
						}
212
						else if (addressToken.search(/^\d/) != -1 && address.street == null)
213
						{
214
							address.street = addressToken.replace(/\\n/, "");
215
							address.city = addressTokens[j+1];
216
							address.state = addressTokens[j+2];
217
							address.postalCode = addressTokens[j+3];
218
						}
219
					}
220
					if (address.type != null && address.street != null)
221
					{
222
						vcard.addresses.push(address);
223
					}
224

    
225
				}
226
				else if (line.search(/^PHOTO;BASE64/i) != -1)
227
				{
228
					var imageStr:String = new String();
229
					for (var k:uint = i+1; k < lines.length; ++k)
230
					{
231
						imageStr += lines[k];
232
						//if (lines[k].search(/.+\=$/) != -1) // Very slow in Mac due to RegEx bug
233
						if (lines[k].indexOf('=') != -1)
234
						{
235
							var decoder:Base64Decoder = new Base64Decoder();
236
							decoder.decode(imageStr);
237
							vcard.image = decoder.flush();
238
							break;
239
						}
240
					}
241
				}
242
			}
243
			return vcards;
244
		}
245
	}
246
}