@Override
	protected void parseSelf(Document doc)  
			throws ProblemsReadingDocumentException {
		List<Element> scriptList = queryXPathList(SCRIPT_DESC_XPATH, doc);
		for (Element el: scriptList) {
			String rawData = el.getText();
			// clear JavaScript escaping: "\/" --> "/", etc.
			rawData = rawData.replaceAll("\\\\(.)", "$1");
			
			// try to recover each property by its pattern
			for (Map.Entry<String, Pattern> entry: dataPatterns.entrySet()) {
				Matcher m = entry.getValue().matcher(rawData);
				if (m.matches()) 
					setProperty(entry.getKey(), m.group(1));
			}
			setTitle(getProperty("title"));
		
		}
		// fix url 
		String relativePath = getProperty("mediaLink");
		try {
			setProperty("mediaLink", resolveLink(relativePath).toString());
		} catch (MalformedURLException e) {
			setProperty("mediaLink", null);
			throw new ProblemsReadingDocumentException(e);
		}
		
		try {
			// if album or artist data is missing we can try to salvage it 
			//    from parenting pages
			String album = getProperty("album");
			String artist = getProperty("artist");
			// fix track number
			if (album==null || album.isEmpty())
				setProperty("album",getParent().getTitle());
			if (artist==null || artist.isEmpty())
				setProperty("artist",getParent().getParent().getTitle());
		} catch (NullPointerException e) {
			// skip if not enough parents in a line;
		}
	}