function IsValidURL($url, $allowrelative = FALSE, $allowmailto = FALSE)
{
    // by pv@gnw.de - 08-Aug-2000
    // modified by getid3@silisoftware.com - 06-Mar-2002
    if ($allowrelative) {
        // pretty much anything goes - how do you validate this?
    } else {
        if ($parts = parse_url(strtolower($url))) {
            // $validschemes = array('http', 'https', 'ftp', 'gopher');
            $validschemes = array('http', 'https', 'ftp');
            if ($allowmailto && $parts['scheme'] == 'mailto' && IsValidEmail($parts['path'])) {
                return TRUE;
            } else {
                if (!in_array($parts['scheme'], $validschemes)) {
                    return FALSE;
                } else {
                    if (!eregi("^[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,3}\$", $parts['host'], $regs)) {
                        return FALSE;
                    } else {
                        if (!eregi("^([0-9a-z-]|[\\_])*\$", $parts['user'], $regs)) {
                            return FALSE;
                        } else {
                            if (!eregi("^([0-9a-z-]|[\\_])*\$", $parts['pass'], $regs)) {
                                return FALSE;
                            } else {
                                if (!eregi("^[0-9a-z/_\\.@~]*\$", $parts['path'], $regs)) {
                                    return FALSE;
                                } else {
                                    if (!eregi("^[0-9a-z?&=#\\,]*\$", $parts['query'], $regs)) {
                                        return FALSE;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } else {
            return FALSE;
        }
    }
    return TRUE;
}
Ejemplo n.º 2
0
 if ($data['admin_password'] != $data['admin_passagain']) {
     $page->InfoBox('Passwords do not match, try again');
     $validData = false;
 }
 // If the password must be more secure (since this is the root account)
 if (!IsValidPassword($data['admin_password'])) {
     $page->InfoBox('Password is not secure enough, it must be 6 characters or longer and ' . 'contain upper case character, digit or symbol as well.');
     $validData = false;
 }
 // If phone number set - it must be valid format
 if (strlen($data['admin_realname']) == 0) {
     $page->InfoBox('You must specify the display name');
     $validData = false;
 }
 // If the password must be more secure (since this is the root account)
 if (!IsValidEmail($data['admin_email'])) {
     $page->InfoBox('Email address <b>' . $data['admin_email'] . '</b> is not valid email');
     $validData = false;
 }
 /////////// Root account data evaluation is done ///////////
 if ($validData) {
     // Create an hashes for this valid data
     $keywords['admin']['admin_password'] = md5($data['admin_password']);
     $keywords['admin']['admin_hashkey'] = md5($data['admin_username'] . $keywords['admin']['admin_password'] . $data['admin_email']);
     // Update mask class with the changed keywords
     $mask->SetKeywords();
     // Get the installation queries and split them by the "next query" separator,
     // and then run each query and get an array of results. If there is no split
     // then the query will be an array with only one cell - still an array :)
     $results = $dbase->RunQuery($mask->GetSqlRootAccessQueries(TRUE));
     // Go through all the results, and every one of them must be 'true'
Ejemplo n.º 3
0
            DataExchange("w", $z_db_name, $sql);
            # Now we should recurse through all the current distlistusers and delete them too!!!
            # Now we do the rest, which is to go and delete the cron entry from the file...
        }
    } while ($rowdistlists = mysql_fetch_assoc($listdistlists));
    header("location: " . GetNormalModuleURL($returnurl) . "&r=ok");
    exit;
}
if ($_POST['inAction'] == 'edit_distlists') {
    $sql = "SELECT * FROM z_distlists WHERE dl_acc_fk=" . $useraccount['ac_id_pk'] . " AND dl_id_pk=" . $_POST['inDLID'] . " AND dl_deleted_ts IS NULL";
    $listdistlists = DataExchange("r", $z_db_name, $sql);
    $rowdistlists = mysql_fetch_assoc($listdistlists);
    $totaldistlists = DataExchange("t", $z_db_name, $sql);
    if (isset($_POST['inSubmit'])) {
        # Lets check that the user specified an valid email...
        if (!IsValidEmail(Cleaner('i', $_POST['inDistListAddress']))) {
            header("location: " . GetNormalModuleURL($returnurl) . "&r=notvalid");
            exit;
        }
        # User wants to create a new dist list address, so lets add the list list user...
        $list_id = $rowdistlists['dl_id_pk'];
        # Lets just quickly grab the ZPanel dist list foreign key
        $sql = "SELECT * FROM z_distlists WHERE dl_acc_fk=" . $useraccount['ac_id_pk'] . " AND dl_id_pk=" . $rowdistlists['dl_id_pk'] . " AND dl_deleted_ts IS NULL";
        $listzpfkdu = DataExchange("r", $z_db_name, $sql);
        $rowzpfkdu = mysql_fetch_assoc($listzpfkdu);
        # Create the distlist user in hMailServer...
        if (GetSystemOption('hmailserver_db') != "") {
            # Lets just quickly grab the hMailServer dist list foreign key
            $hmaildatabase = GetSystemOption('hmailserver_db');
            if (ShowServerPlatform() == "Windows") {
                ###################################### WINDOWS
Ejemplo n.º 4
0
 function GenerateID3v2FrameData($frame_name, $source_data_array)
 {
     if (!getid3_id3v2::IsValidID3v2FrameName($frame_name, $this->majorversion)) {
         return false;
     }
     $framedata = '';
     if ($this->majorversion < 3 || $this->majorversion > 4) {
         $this->errors[] = 'Only ID3v2.3 and ID3v2.4 are supported in GenerateID3v2FrameData()';
     } else {
         // $this->majorversion 3 or 4
         switch ($frame_name) {
             case 'UFID':
                 // 4.1   UFID Unique file identifier
                 // Owner identifier        <text string> $00
                 // Identifier              <up to 64 bytes binary data>
                 if (strlen($source_data_array['data']) > 64) {
                     $this->errors[] = 'Identifier not allowed to be longer than 64 bytes in ' . $frame_name . ' (supplied data was ' . strlen($source_data_array['data']) . ' bytes long)';
                 } else {
                     $framedata .= str_replace("", '', $source_data_array['ownerid']) . "";
                     $framedata .= substr($source_data_array['data'], 0, 64);
                     // max 64 bytes - truncate anything longer
                 }
                 break;
             case 'TXXX':
                 // 4.2.2 TXXX User defined text information frame
                 // Text encoding     $xx
                 // Description       <text string according to encoding> $00 (00)
                 // Value             <text string according to encoding>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'], $this->majorversion)) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= $source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'WXXX':
                 // 4.3.2 WXXX User defined URL link frame
                 // Text encoding     $xx
                 // Description       <text string according to encoding> $00 (00)
                 // URL               <text string>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'], $this->majorversion)) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } elseif (!isset($source_data_array['data']) || !$this->IsValidURL($source_data_array['data'], false, false)) {
                     //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
                     // probably should be an error, need to rewrite IsValidURL() to handle other encodings
                     $this->warnings[] = 'Invalid URL in ' . $frame_name . ' (' . $source_data_array['data'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= $source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'IPLS':
                 // 4.4  IPLS Involved people list (ID3v2.3 only)
                 // Text encoding     $xx
                 // People list strings    <textstrings>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'], $this->majorversion)) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'MCDI':
                 // 4.4   MCDI Music CD identifier
                 // CD TOC                <binary data>
                 $framedata .= $source_data_array['data'];
                 break;
             case 'ETCO':
                 // 4.5   ETCO Event timing codes
                 // Time stamp format    $xx
                 //   Where time stamp format is:
                 // $01  (32-bit value) MPEG frames from beginning of file
                 // $02  (32-bit value) milliseconds from beginning of file
                 //   Followed by a list of key events in the following format:
                 // Type of event   $xx
                 // Time stamp      $xx (xx ...)
                 //   The 'Time stamp' is set to zero if directly at the beginning of the sound
                 //   or after the previous event. All events MUST be sorted in chronological order.
                 if ($source_data_array['timestampformat'] > 2 || $source_data_array['timestampformat'] < 1) {
                     $this->errors[] = 'Invalid Time Stamp Format byte in ' . $frame_name . ' (' . $source_data_array['timestampformat'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['timestampformat']);
                     foreach ($source_data_array as $key => $val) {
                         if (!$this->ID3v2IsValidETCOevent($val['typeid'])) {
                             $this->errors[] = 'Invalid Event Type byte in ' . $frame_name . ' (' . $val['typeid'] . ')';
                         } elseif ($key != 'timestampformat' && $key != 'flags') {
                             if ($val['timestamp'] > 0 && $previousETCOtimestamp >= $val['timestamp']) {
                                 //   The 'Time stamp' is set to zero if directly at the beginning of the sound
                                 //   or after the previous event. All events MUST be sorted in chronological order.
                                 $this->errors[] = 'Out-of-order timestamp in ' . $frame_name . ' (' . $val['timestamp'] . ') for Event Type (' . $val['typeid'] . ')';
                             } else {
                                 $framedata .= chr($val['typeid']);
                                 $framedata .= getid3_lib::BigEndian2String($val['timestamp'], 4, false);
                             }
                         }
                     }
                 }
                 break;
             case 'MLLT':
                 // 4.6   MLLT MPEG location lookup table
                 // MPEG frames between reference  $xx xx
                 // Bytes between reference        $xx xx xx
                 // Milliseconds between reference $xx xx xx
                 // Bits for bytes deviation       $xx
                 // Bits for milliseconds dev.     $xx
                 //   Then for every reference the following data is included;
                 // Deviation in bytes         %xxx....
                 // Deviation in milliseconds  %xxx....
                 if ($source_data_array['framesbetweenreferences'] > 0 && $source_data_array['framesbetweenreferences'] <= 65535) {
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['framesbetweenreferences'], 2, false);
                 } else {
                     $this->errors[] = 'Invalid MPEG Frames Between References in ' . $frame_name . ' (' . $source_data_array['framesbetweenreferences'] . ')';
                 }
                 if ($source_data_array['bytesbetweenreferences'] > 0 && $source_data_array['bytesbetweenreferences'] <= 16777215) {
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['bytesbetweenreferences'], 3, false);
                 } else {
                     $this->errors[] = 'Invalid bytes Between References in ' . $frame_name . ' (' . $source_data_array['bytesbetweenreferences'] . ')';
                 }
                 if ($source_data_array['msbetweenreferences'] > 0 && $source_data_array['msbetweenreferences'] <= 16777215) {
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['msbetweenreferences'], 3, false);
                 } else {
                     $this->errors[] = 'Invalid Milliseconds Between References in ' . $frame_name . ' (' . $source_data_array['msbetweenreferences'] . ')';
                 }
                 if (!$this->IsWithinBitRange($source_data_array['bitsforbytesdeviation'], 8, false)) {
                     if ($source_data_array['bitsforbytesdeviation'] % 4 == 0) {
                         $framedata .= chr($source_data_array['bitsforbytesdeviation']);
                     } else {
                         $this->errors[] = 'Bits For Bytes Deviation in ' . $frame_name . ' (' . $source_data_array['bitsforbytesdeviation'] . ') must be a multiple of 4.';
                     }
                 } else {
                     $this->errors[] = 'Invalid Bits For Bytes Deviation in ' . $frame_name . ' (' . $source_data_array['bitsforbytesdeviation'] . ')';
                 }
                 if (!$this->IsWithinBitRange($source_data_array['bitsformsdeviation'], 8, false)) {
                     if ($source_data_array['bitsformsdeviation'] % 4 == 0) {
                         $framedata .= chr($source_data_array['bitsformsdeviation']);
                     } else {
                         $this->errors[] = 'Bits For Milliseconds Deviation in ' . $frame_name . ' (' . $source_data_array['bitsforbytesdeviation'] . ') must be a multiple of 4.';
                     }
                 } else {
                     $this->errors[] = 'Invalid Bits For Milliseconds Deviation in ' . $frame_name . ' (' . $source_data_array['bitsformsdeviation'] . ')';
                 }
                 foreach ($source_data_array as $key => $val) {
                     if ($key != 'framesbetweenreferences' && $key != 'bytesbetweenreferences' && $key != 'msbetweenreferences' && $key != 'bitsforbytesdeviation' && $key != 'bitsformsdeviation' && $key != 'flags') {
                         $unwrittenbitstream .= str_pad(getid3_lib::Dec2Bin($val['bytedeviation']), $source_data_array['bitsforbytesdeviation'], '0', STR_PAD_LEFT);
                         $unwrittenbitstream .= str_pad(getid3_lib::Dec2Bin($val['msdeviation']), $source_data_array['bitsformsdeviation'], '0', STR_PAD_LEFT);
                     }
                 }
                 for ($i = 0; $i < strlen($unwrittenbitstream); $i += 8) {
                     $highnibble = bindec(substr($unwrittenbitstream, $i, 4)) << 4;
                     $lownibble = bindec(substr($unwrittenbitstream, $i + 4, 4));
                     $framedata .= chr($highnibble & $lownibble);
                 }
                 break;
             case 'SYTC':
                 // 4.7   SYTC Synchronised tempo codes
                 // Time stamp format   $xx
                 // Tempo data          <binary data>
                 //   Where time stamp format is:
                 // $01  (32-bit value) MPEG frames from beginning of file
                 // $02  (32-bit value) milliseconds from beginning of file
                 if ($source_data_array['timestampformat'] > 2 || $source_data_array['timestampformat'] < 1) {
                     $this->errors[] = 'Invalid Time Stamp Format byte in ' . $frame_name . ' (' . $source_data_array['timestampformat'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['timestampformat']);
                     foreach ($source_data_array as $key => $val) {
                         if (!$this->ID3v2IsValidETCOevent($val['typeid'])) {
                             $this->errors[] = 'Invalid Event Type byte in ' . $frame_name . ' (' . $val['typeid'] . ')';
                         } elseif ($key != 'timestampformat' && $key != 'flags') {
                             if ($val['tempo'] < 0 || $val['tempo'] > 510) {
                                 $this->errors[] = 'Invalid Tempo (max = 510) in ' . $frame_name . ' (' . $val['tempo'] . ') at timestamp (' . $val['timestamp'] . ')';
                             } else {
                                 if ($val['tempo'] > 255) {
                                     $framedata .= chr(255);
                                     $val['tempo'] -= 255;
                                 }
                                 $framedata .= chr($val['tempo']);
                                 $framedata .= getid3_lib::BigEndian2String($val['timestamp'], 4, false);
                             }
                         }
                     }
                 }
                 break;
             case 'USLT':
                 // 4.8   USLT Unsynchronised lyric/text transcription
                 // Text encoding        $xx
                 // Language             $xx xx xx
                 // Content descriptor   <text string according to encoding> $00 (00)
                 // Lyrics/text          <full text string according to encoding>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') {
                     $this->errors[] = 'Invalid Language in ' . $frame_name . ' (' . $source_data_array['language'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= strtolower($source_data_array['language']);
                     $framedata .= $source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'SYLT':
                 // 4.9   SYLT Synchronised lyric/text
                 // Text encoding        $xx
                 // Language             $xx xx xx
                 // Time stamp format    $xx
                 //   $01  (32-bit value) MPEG frames from beginning of file
                 //   $02  (32-bit value) milliseconds from beginning of file
                 // Content type         $xx
                 // Content descriptor   <text string according to encoding> $00 (00)
                 //   Terminated text to be synced (typically a syllable)
                 //   Sync identifier (terminator to above string)   $00 (00)
                 //   Time stamp                                     $xx (xx ...)
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') {
                     $this->errors[] = 'Invalid Language in ' . $frame_name . ' (' . $source_data_array['language'] . ')';
                 } elseif ($source_data_array['timestampformat'] > 2 || $source_data_array['timestampformat'] < 1) {
                     $this->errors[] = 'Invalid Time Stamp Format byte in ' . $frame_name . ' (' . $source_data_array['timestampformat'] . ')';
                 } elseif (!$this->ID3v2IsValidSYLTtype($source_data_array['contenttypeid'])) {
                     $this->errors[] = 'Invalid Content Type byte in ' . $frame_name . ' (' . $source_data_array['contenttypeid'] . ')';
                 } elseif (!is_array($source_data_array['data'])) {
                     $this->errors[] = 'Invalid Lyric/Timestamp data in ' . $frame_name . ' (must be an array)';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= strtolower($source_data_array['language']);
                     $framedata .= chr($source_data_array['timestampformat']);
                     $framedata .= chr($source_data_array['contenttypeid']);
                     $framedata .= $source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     ksort($source_data_array['data']);
                     foreach ($source_data_array['data'] as $key => $val) {
                         $framedata .= $val['data'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                         $framedata .= getid3_lib::BigEndian2String($val['timestamp'], 4, false);
                     }
                 }
                 break;
             case 'COMM':
                 // 4.10  COMM Comments
                 // Text encoding          $xx
                 // Language               $xx xx xx
                 // Short content descrip. <text string according to encoding> $00 (00)
                 // The actual text        <full text string according to encoding>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') {
                     $this->errors[] = 'Invalid Language in ' . $frame_name . ' (' . $source_data_array['language'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= strtolower($source_data_array['language']);
                     $framedata .= $source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'RVA2':
                 // 4.11  RVA2 Relative volume adjustment (2) (ID3v2.4+ only)
                 // Identification          <text string> $00
                 //   The 'identification' string is used to identify the situation and/or
                 //   device where this adjustment should apply. The following is then
                 //   repeated for every channel:
                 // Type of channel         $xx
                 // Volume adjustment       $xx xx
                 // Bits representing peak  $xx
                 // Peak volume             $xx (xx ...)
                 $framedata .= str_replace("", '', $source_data_array['description']) . "";
                 foreach ($source_data_array as $key => $val) {
                     if ($key != 'description') {
                         $framedata .= chr($val['channeltypeid']);
                         $framedata .= getid3_lib::BigEndian2String($val['volumeadjust'], 2, false, true);
                         // signed 16-bit
                         if (!$this->IsWithinBitRange($source_data_array['bitspeakvolume'], 8, false)) {
                             $framedata .= chr($val['bitspeakvolume']);
                             if ($val['bitspeakvolume'] > 0) {
                                 $framedata .= getid3_lib::BigEndian2String($val['peakvolume'], ceil($val['bitspeakvolume'] / 8), false, false);
                             }
                         } else {
                             $this->errors[] = 'Invalid Bits Representing Peak Volume in ' . $frame_name . ' (' . $val['bitspeakvolume'] . ') (range = 0 to 255)';
                         }
                     }
                 }
                 break;
             case 'RVAD':
                 // 4.12  RVAD Relative volume adjustment (ID3v2.3 only)
                 // Increment/decrement     %00fedcba
                 // Bits used for volume descr.        $xx
                 // Relative volume change, right      $xx xx (xx ...) // a
                 // Relative volume change, left       $xx xx (xx ...) // b
                 // Peak volume right                  $xx xx (xx ...)
                 // Peak volume left                   $xx xx (xx ...)
                 // Relative volume change, right back $xx xx (xx ...) // c
                 // Relative volume change, left back  $xx xx (xx ...) // d
                 // Peak volume right back             $xx xx (xx ...)
                 // Peak volume left back              $xx xx (xx ...)
                 // Relative volume change, center     $xx xx (xx ...) // e
                 // Peak volume center                 $xx xx (xx ...)
                 // Relative volume change, bass       $xx xx (xx ...) // f
                 // Peak volume bass                   $xx xx (xx ...)
                 if (!$this->IsWithinBitRange($source_data_array['bitsvolume'], 8, false)) {
                     $this->errors[] = 'Invalid Bits For Volume Description byte in ' . $frame_name . ' (' . $source_data_array['bitsvolume'] . ') (range = 1 to 255)';
                 } else {
                     $incdecflag .= '00';
                     $incdecflag .= $source_data_array['incdec']['right'] ? '1' : '0';
                     // a - Relative volume change, right
                     $incdecflag .= $source_data_array['incdec']['left'] ? '1' : '0';
                     // b - Relative volume change, left
                     $incdecflag .= $source_data_array['incdec']['rightrear'] ? '1' : '0';
                     // c - Relative volume change, right back
                     $incdecflag .= $source_data_array['incdec']['leftrear'] ? '1' : '0';
                     // d - Relative volume change, left back
                     $incdecflag .= $source_data_array['incdec']['center'] ? '1' : '0';
                     // e - Relative volume change, center
                     $incdecflag .= $source_data_array['incdec']['bass'] ? '1' : '0';
                     // f - Relative volume change, bass
                     $framedata .= chr(bindec($incdecflag));
                     $framedata .= chr($source_data_array['bitsvolume']);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['right'], ceil($source_data_array['bitsvolume'] / 8), false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['left'], ceil($source_data_array['bitsvolume'] / 8), false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['right'], ceil($source_data_array['bitsvolume'] / 8), false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['left'], ceil($source_data_array['bitsvolume'] / 8), false);
                     if ($source_data_array['volumechange']['rightrear'] || $source_data_array['volumechange']['leftrear'] || $source_data_array['peakvolume']['rightrear'] || $source_data_array['peakvolume']['leftrear'] || $source_data_array['volumechange']['center'] || $source_data_array['peakvolume']['center'] || $source_data_array['volumechange']['bass'] || $source_data_array['peakvolume']['bass']) {
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['rightrear'], ceil($source_data_array['bitsvolume'] / 8), false);
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['leftrear'], ceil($source_data_array['bitsvolume'] / 8), false);
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['rightrear'], ceil($source_data_array['bitsvolume'] / 8), false);
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['leftrear'], ceil($source_data_array['bitsvolume'] / 8), false);
                     }
                     if ($source_data_array['volumechange']['center'] || $source_data_array['peakvolume']['center'] || $source_data_array['volumechange']['bass'] || $source_data_array['peakvolume']['bass']) {
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['center'], ceil($source_data_array['bitsvolume'] / 8), false);
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['center'], ceil($source_data_array['bitsvolume'] / 8), false);
                     }
                     if ($source_data_array['volumechange']['bass'] || $source_data_array['peakvolume']['bass']) {
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['volumechange']['bass'], ceil($source_data_array['bitsvolume'] / 8), false);
                         $framedata .= getid3_lib::BigEndian2String($source_data_array['peakvolume']['bass'], ceil($source_data_array['bitsvolume'] / 8), false);
                     }
                 }
                 break;
             case 'EQU2':
                 // 4.12  EQU2 Equalisation (2) (ID3v2.4+ only)
                 // Interpolation method  $xx
                 //   $00  Band
                 //   $01  Linear
                 // Identification        <text string> $00
                 //   The following is then repeated for every adjustment point
                 // Frequency          $xx xx
                 // Volume adjustment  $xx xx
                 if ($source_data_array['interpolationmethod'] < 0 || $source_data_array['interpolationmethod'] > 1) {
                     $this->errors[] = 'Invalid Interpolation Method byte in ' . $frame_name . ' (' . $source_data_array['interpolationmethod'] . ') (valid = 0 or 1)';
                 } else {
                     $framedata .= chr($source_data_array['interpolationmethod']);
                     $framedata .= str_replace("", '', $source_data_array['description']) . "";
                     foreach ($source_data_array['data'] as $key => $val) {
                         $framedata .= getid3_lib::BigEndian2String(intval(round($key * 2)), 2, false);
                         $framedata .= getid3_lib::BigEndian2String($val, 2, false, true);
                         // signed 16-bit
                     }
                 }
                 break;
             case 'EQUA':
                 // 4.12  EQUA Equalisation (ID3v2.3 only)
                 // Adjustment bits    $xx
                 //   This is followed by 2 bytes + ('adjustment bits' rounded up to the
                 //   nearest byte) for every equalisation band in the following format,
                 //   giving a frequency range of 0 - 32767Hz:
                 // Increment/decrement   %x (MSB of the Frequency)
                 // Frequency             (lower 15 bits)
                 // Adjustment            $xx (xx ...)
                 if (!$this->IsWithinBitRange($source_data_array['bitsvolume'], 8, false)) {
                     $this->errors[] = 'Invalid Adjustment Bits byte in ' . $frame_name . ' (' . $source_data_array['bitsvolume'] . ') (range = 1 to 255)';
                 } else {
                     $framedata .= chr($source_data_array['adjustmentbits']);
                     foreach ($source_data_array as $key => $val) {
                         if ($key != 'bitsvolume') {
                             if ($key > 32767 || $key < 0) {
                                 $this->errors[] = 'Invalid Frequency in ' . $frame_name . ' (' . $key . ') (range = 0 to 32767)';
                             } else {
                                 if ($val >= 0) {
                                     // put MSB of frequency to 1 if increment, 0 if decrement
                                     $key |= 0x8000;
                                 }
                                 $framedata .= getid3_lib::BigEndian2String($key, 2, false);
                                 $framedata .= getid3_lib::BigEndian2String($val, ceil($source_data_array['adjustmentbits'] / 8), false);
                             }
                         }
                     }
                 }
                 break;
             case 'RVRB':
                 // 4.13  RVRB Reverb
                 // Reverb left (ms)                 $xx xx
                 // Reverb right (ms)                $xx xx
                 // Reverb bounces, left             $xx
                 // Reverb bounces, right            $xx
                 // Reverb feedback, left to left    $xx
                 // Reverb feedback, left to right   $xx
                 // Reverb feedback, right to right  $xx
                 // Reverb feedback, right to left   $xx
                 // Premix left to right             $xx
                 // Premix right to left             $xx
                 if (!$this->IsWithinBitRange($source_data_array['left'], 16, false)) {
                     $this->errors[] = 'Invalid Reverb Left in ' . $frame_name . ' (' . $source_data_array['left'] . ') (range = 0 to 65535)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['right'], 16, false)) {
                     $this->errors[] = 'Invalid Reverb Left in ' . $frame_name . ' (' . $source_data_array['right'] . ') (range = 0 to 65535)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['bouncesL'], 8, false)) {
                     $this->errors[] = 'Invalid Reverb Bounces, Left in ' . $frame_name . ' (' . $source_data_array['bouncesL'] . ') (range = 0 to 255)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['bouncesR'], 8, false)) {
                     $this->errors[] = 'Invalid Reverb Bounces, Right in ' . $frame_name . ' (' . $source_data_array['bouncesR'] . ') (range = 0 to 255)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['feedbackLL'], 8, false)) {
                     $this->errors[] = 'Invalid Reverb Feedback, Left-To-Left in ' . $frame_name . ' (' . $source_data_array['feedbackLL'] . ') (range = 0 to 255)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['feedbackLR'], 8, false)) {
                     $this->errors[] = 'Invalid Reverb Feedback, Left-To-Right in ' . $frame_name . ' (' . $source_data_array['feedbackLR'] . ') (range = 0 to 255)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['feedbackRR'], 8, false)) {
                     $this->errors[] = 'Invalid Reverb Feedback, Right-To-Right in ' . $frame_name . ' (' . $source_data_array['feedbackRR'] . ') (range = 0 to 255)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['feedbackRL'], 8, false)) {
                     $this->errors[] = 'Invalid Reverb Feedback, Right-To-Left in ' . $frame_name . ' (' . $source_data_array['feedbackRL'] . ') (range = 0 to 255)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['premixLR'], 8, false)) {
                     $this->errors[] = 'Invalid Premix, Left-To-Right in ' . $frame_name . ' (' . $source_data_array['premixLR'] . ') (range = 0 to 255)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['premixRL'], 8, false)) {
                     $this->errors[] = 'Invalid Premix, Right-To-Left in ' . $frame_name . ' (' . $source_data_array['premixRL'] . ') (range = 0 to 255)';
                 } else {
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['left'], 2, false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['right'], 2, false);
                     $framedata .= chr($source_data_array['bouncesL']);
                     $framedata .= chr($source_data_array['bouncesR']);
                     $framedata .= chr($source_data_array['feedbackLL']);
                     $framedata .= chr($source_data_array['feedbackLR']);
                     $framedata .= chr($source_data_array['feedbackRR']);
                     $framedata .= chr($source_data_array['feedbackRL']);
                     $framedata .= chr($source_data_array['premixLR']);
                     $framedata .= chr($source_data_array['premixRL']);
                 }
                 break;
             case 'APIC':
                 // 4.14  APIC Attached picture
                 // Text encoding      $xx
                 // MIME type          <text string> $00
                 // Picture type       $xx
                 // Description        <text string according to encoding> $00 (00)
                 // Picture data       <binary data>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } elseif (!$this->ID3v2IsValidAPICpicturetype($source_data_array['picturetypeid'])) {
                     $this->errors[] = 'Invalid Picture Type byte in ' . $frame_name . ' (' . $source_data_array['picturetypeid'] . ') for ID3v2.' . $this->majorversion;
                 } elseif ($this->majorversion >= 3 && !$this->ID3v2IsValidAPICimageformat($source_data_array['mime'])) {
                     $this->errors[] = 'Invalid MIME Type in ' . $frame_name . ' (' . $source_data_array['mime'] . ') for ID3v2.' . $this->majorversion;
                 } elseif ($source_data_array['mime'] == '-->' && !$this->IsValidURL($source_data_array['data'], false, false)) {
                     //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
                     // probably should be an error, need to rewrite IsValidURL() to handle other encodings
                     $this->warnings[] = 'Invalid URL in ' . $frame_name . ' (' . $source_data_array['data'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= str_replace("", '', $source_data_array['mime']) . "";
                     $framedata .= chr($source_data_array['picturetypeid']);
                     $framedata .= @$source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'GEOB':
                 // 4.15  GEOB General encapsulated object
                 // Text encoding          $xx
                 // MIME type              <text string> $00
                 // Filename               <text string according to encoding> $00 (00)
                 // Content description    <text string according to encoding> $00 (00)
                 // Encapsulated object    <binary data>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                 } elseif (!$this->IsValidMIMEstring($source_data_array['mime'])) {
                     $this->errors[] = 'Invalid MIME Type in ' . $frame_name . ' (' . $source_data_array['mime'] . ')';
                 } elseif (!$source_data_array['description']) {
                     $this->errors[] = 'Missing Description in ' . $frame_name;
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= str_replace("", '', $source_data_array['mime']) . "";
                     $framedata .= $source_data_array['filename'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'PCNT':
                 // 4.16  PCNT Play counter
                 //   When the counter reaches all one's, one byte is inserted in
                 //   front of the counter thus making the counter eight bits bigger
                 // Counter        $xx xx xx xx (xx ...)
                 $framedata .= getid3_lib::BigEndian2String($source_data_array['data'], 4, false);
                 break;
             case 'POPM':
                 // 4.17  POPM Popularimeter
                 //   When the counter reaches all one's, one byte is inserted in
                 //   front of the counter thus making the counter eight bits bigger
                 // Email to user   <text string> $00
                 // Rating          $xx
                 // Counter         $xx xx xx xx (xx ...)
                 if (!$this->IsWithinBitRange($source_data_array['rating'], 8, false)) {
                     $this->errors[] = 'Invalid Rating byte in ' . $frame_name . ' (' . $source_data_array['rating'] . ') (range = 0 to 255)';
                 } elseif (!IsValidEmail($source_data_array['email'])) {
                     $this->errors[] = 'Invalid Email in ' . $frame_name . ' (' . $source_data_array['email'] . ')';
                 } else {
                     $framedata .= str_replace("", '', $source_data_array['email']) . "";
                     $framedata .= chr($source_data_array['rating']);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['data'], 4, false);
                 }
                 break;
             case 'RBUF':
                 // 4.18  RBUF Recommended buffer size
                 // Buffer size               $xx xx xx
                 // Embedded info flag        %0000000x
                 // Offset to next tag        $xx xx xx xx
                 if (!$this->IsWithinBitRange($source_data_array['buffersize'], 24, false)) {
                     $this->errors[] = 'Invalid Buffer Size in ' . $frame_name;
                 } elseif (!$this->IsWithinBitRange($source_data_array['nexttagoffset'], 32, false)) {
                     $this->errors[] = 'Invalid Offset To Next Tag in ' . $frame_name;
                 } else {
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['buffersize'], 3, false);
                     $flag .= '0000000';
                     $flag .= $source_data_array['flags']['embededinfo'] ? '1' : '0';
                     $framedata .= chr(bindec($flag));
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['nexttagoffset'], 4, false);
                 }
                 break;
             case 'AENC':
                 // 4.19  AENC Audio encryption
                 // Owner identifier   <text string> $00
                 // Preview start      $xx xx
                 // Preview length     $xx xx
                 // Encryption info    <binary data>
                 if (!$this->IsWithinBitRange($source_data_array['previewstart'], 16, false)) {
                     $this->errors[] = 'Invalid Preview Start in ' . $frame_name . ' (' . $source_data_array['previewstart'] . ')';
                 } elseif (!$this->IsWithinBitRange($source_data_array['previewlength'], 16, false)) {
                     $this->errors[] = 'Invalid Preview Length in ' . $frame_name . ' (' . $source_data_array['previewlength'] . ')';
                 } else {
                     $framedata .= str_replace("", '', $source_data_array['ownerid']) . "";
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['previewstart'], 2, false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['previewlength'], 2, false);
                     $framedata .= $source_data_array['encryptioninfo'];
                 }
                 break;
             case 'LINK':
                 // 4.20  LINK Linked information
                 // Frame identifier               $xx xx xx xx
                 // URL                            <text string> $00
                 // ID and additional data         <text string(s)>
                 if (!getid3_id3v2::IsValidID3v2FrameName($source_data_array['frameid'], $this->majorversion)) {
                     $this->errors[] = 'Invalid Frame Identifier in ' . $frame_name . ' (' . $source_data_array['frameid'] . ')';
                 } elseif (!$this->IsValidURL($source_data_array['data'], true, false)) {
                     //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
                     // probably should be an error, need to rewrite IsValidURL() to handle other encodings
                     $this->warnings[] = 'Invalid URL in ' . $frame_name . ' (' . $source_data_array['data'] . ')';
                 } elseif (($source_data_array['frameid'] == 'AENC' || $source_data_array['frameid'] == 'APIC' || $source_data_array['frameid'] == 'GEOB' || $source_data_array['frameid'] == 'TXXX') && $source_data_array['additionaldata'] == '') {
                     $this->errors[] = 'Content Descriptor must be specified as additional data for Frame Identifier of ' . $source_data_array['frameid'] . ' in ' . $frame_name;
                 } elseif ($source_data_array['frameid'] == 'USER' && getid3_id3v2::LanguageLookup($source_data_array['additionaldata'], true) == '') {
                     $this->errors[] = 'Language must be specified as additional data for Frame Identifier of ' . $source_data_array['frameid'] . ' in ' . $frame_name;
                 } elseif ($source_data_array['frameid'] == 'PRIV' && $source_data_array['additionaldata'] == '') {
                     $this->errors[] = 'Owner Identifier must be specified as additional data for Frame Identifier of ' . $source_data_array['frameid'] . ' in ' . $frame_name;
                 } elseif (($source_data_array['frameid'] == 'COMM' || $source_data_array['frameid'] == 'SYLT' || $source_data_array['frameid'] == 'USLT') && (getid3_id3v2::LanguageLookup(substr($source_data_array['additionaldata'], 0, 3), true) == '' || substr($source_data_array['additionaldata'], 3) == '')) {
                     $this->errors[] = 'Language followed by Content Descriptor must be specified as additional data for Frame Identifier of ' . $source_data_array['frameid'] . ' in ' . $frame_name;
                 } else {
                     $framedata .= $source_data_array['frameid'];
                     $framedata .= str_replace("", '', $source_data_array['data']) . "";
                     switch ($source_data_array['frameid']) {
                         case 'COMM':
                         case 'SYLT':
                         case 'USLT':
                         case 'PRIV':
                         case 'USER':
                         case 'AENC':
                         case 'APIC':
                         case 'GEOB':
                         case 'TXXX':
                             $framedata .= $source_data_array['additionaldata'];
                             break;
                         case 'ASPI':
                         case 'ETCO':
                         case 'EQU2':
                         case 'MCID':
                         case 'MLLT':
                         case 'OWNE':
                         case 'RVA2':
                         case 'RVRB':
                         case 'SYTC':
                         case 'IPLS':
                         case 'RVAD':
                         case 'EQUA':
                             // no additional data required
                             break;
                         case 'RBUF':
                             if ($this->majorversion == 3) {
                                 // no additional data required
                             } else {
                                 $this->errors[] = $source_data_array['frameid'] . ' is not a valid Frame Identifier in ' . $frame_name . ' (in ID3v2.' . $this->majorversion . ')';
                             }
                         default:
                             if (substr($source_data_array['frameid'], 0, 1) == 'T' || substr($source_data_array['frameid'], 0, 1) == 'W') {
                                 // no additional data required
                             } else {
                                 $this->errors[] = $source_data_array['frameid'] . ' is not a valid Frame Identifier in ' . $frame_name . ' (in ID3v2.' . $this->majorversion . ')';
                             }
                             break;
                     }
                 }
                 break;
             case 'POSS':
                 // 4.21  POSS Position synchronisation frame (ID3v2.3+ only)
                 // Time stamp format         $xx
                 // Position                  $xx (xx ...)
                 if ($source_data_array['timestampformat'] < 1 || $source_data_array['timestampformat'] > 2) {
                     $this->errors[] = 'Invalid Time Stamp Format in ' . $frame_name . ' (' . $source_data_array['timestampformat'] . ') (valid = 1 or 2)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['position'], 32, false)) {
                     $this->errors[] = 'Invalid Position in ' . $frame_name . ' (' . $source_data_array['position'] . ') (range = 0 to 4294967295)';
                 } else {
                     $framedata .= chr($source_data_array['timestampformat']);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['position'], 4, false);
                 }
                 break;
             case 'USER':
                 // 4.22  USER Terms of use (ID3v2.3+ only)
                 // Text encoding        $xx
                 // Language             $xx xx xx
                 // The actual text      <text string according to encoding>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ')';
                 } elseif (getid3_id3v2::LanguageLookup($source_data_array['language'], true) == '') {
                     $this->errors[] = 'Invalid Language in ' . $frame_name . ' (' . $source_data_array['language'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= strtolower($source_data_array['language']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'OWNE':
                 // 4.23  OWNE Ownership frame (ID3v2.3+ only)
                 // Text encoding     $xx
                 // Price paid        <text string> $00
                 // Date of purch.    <text string>
                 // Seller            <text string according to encoding>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ')';
                 } elseif (!$this->IsANumber($source_data_array['pricepaid']['value'], false)) {
                     $this->errors[] = 'Invalid Price Paid in ' . $frame_name . ' (' . $source_data_array['pricepaid']['value'] . ')';
                 } elseif (!$this->IsValidDateStampString($source_data_array['purchasedate'])) {
                     $this->errors[] = 'Invalid Date Of Purchase in ' . $frame_name . ' (' . $source_data_array['purchasedate'] . ') (format = YYYYMMDD)';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     $framedata .= str_replace("", '', $source_data_array['pricepaid']['value']) . "";
                     $framedata .= $source_data_array['purchasedate'];
                     $framedata .= $source_data_array['seller'];
                 }
                 break;
             case 'COMR':
                 // 4.24  COMR Commercial frame (ID3v2.3+ only)
                 // Text encoding      $xx
                 // Price string       <text string> $00
                 // Valid until        <text string>
                 // Contact URL        <text string> $00
                 // Received as        $xx
                 // Name of seller     <text string according to encoding> $00 (00)
                 // Description        <text string according to encoding> $00 (00)
                 // Picture MIME type  <string> $00
                 // Seller logo        <binary data>
                 $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                 if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                     $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ')';
                 } elseif (!$this->IsValidDateStampString($source_data_array['pricevaliduntil'])) {
                     $this->errors[] = 'Invalid Valid Until date in ' . $frame_name . ' (' . $source_data_array['pricevaliduntil'] . ') (format = YYYYMMDD)';
                 } elseif (!$this->IsValidURL($source_data_array['contacturl'], false, true)) {
                     $this->errors[] = 'Invalid Contact URL in ' . $frame_name . ' (' . $source_data_array['contacturl'] . ') (allowed schemes: http, https, ftp, mailto)';
                 } elseif (!$this->ID3v2IsValidCOMRreceivedAs($source_data_array['receivedasid'])) {
                     $this->errors[] = 'Invalid Received As byte in ' . $frame_name . ' (' . $source_data_array['contacturl'] . ') (range = 0 to 8)';
                 } elseif (!$this->IsValidMIMEstring($source_data_array['mime'])) {
                     $this->errors[] = 'Invalid MIME Type in ' . $frame_name . ' (' . $source_data_array['mime'] . ')';
                 } else {
                     $framedata .= chr($source_data_array['encodingid']);
                     unset($pricestring);
                     foreach ($source_data_array['price'] as $key => $val) {
                         if ($this->ID3v2IsValidPriceString($key . $val['value'])) {
                             $pricestrings[] = $key . $val['value'];
                         } else {
                             $this->errors[] = 'Invalid Price String in ' . $frame_name . ' (' . $key . $val['value'] . ')';
                         }
                     }
                     $framedata .= implode('/', $pricestrings);
                     $framedata .= $source_data_array['pricevaliduntil'];
                     $framedata .= str_replace("", '', $source_data_array['contacturl']) . "";
                     $framedata .= chr($source_data_array['receivedasid']);
                     $framedata .= $source_data_array['sellername'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['description'] . getid3_id3v2::TextEncodingTerminatorLookup($source_data_array['encodingid']);
                     $framedata .= $source_data_array['mime'] . "";
                     $framedata .= $source_data_array['logo'];
                 }
                 break;
             case 'ENCR':
                 // 4.25  ENCR Encryption method registration (ID3v2.3+ only)
                 // Owner identifier    <text string> $00
                 // Method symbol       $xx
                 // Encryption data     <binary data>
                 if (!$this->IsWithinBitRange($source_data_array['methodsymbol'], 8, false)) {
                     $this->errors[] = 'Invalid Group Symbol in ' . $frame_name . ' (' . $source_data_array['methodsymbol'] . ') (range = 0 to 255)';
                 } else {
                     $framedata .= str_replace("", '', $source_data_array['ownerid']) . "";
                     $framedata .= ord($source_data_array['methodsymbol']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'GRID':
                 // 4.26  GRID Group identification registration (ID3v2.3+ only)
                 // Owner identifier      <text string> $00
                 // Group symbol          $xx
                 // Group dependent data  <binary data>
                 if (!$this->IsWithinBitRange($source_data_array['groupsymbol'], 8, false)) {
                     $this->errors[] = 'Invalid Group Symbol in ' . $frame_name . ' (' . $source_data_array['groupsymbol'] . ') (range = 0 to 255)';
                 } else {
                     $framedata .= str_replace("", '', $source_data_array['ownerid']) . "";
                     $framedata .= ord($source_data_array['groupsymbol']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'PRIV':
                 // 4.27  PRIV Private frame (ID3v2.3+ only)
                 // Owner identifier      <text string> $00
                 // The private data      <binary data>
                 $framedata .= str_replace("", '', $source_data_array['ownerid']) . "";
                 $framedata .= $source_data_array['data'];
                 break;
             case 'SIGN':
                 // 4.28  SIGN Signature frame (ID3v2.4+ only)
                 // Group symbol      $xx
                 // Signature         <binary data>
                 if (!$this->IsWithinBitRange($source_data_array['groupsymbol'], 8, false)) {
                     $this->errors[] = 'Invalid Group Symbol in ' . $frame_name . ' (' . $source_data_array['groupsymbol'] . ') (range = 0 to 255)';
                 } else {
                     $framedata .= ord($source_data_array['groupsymbol']);
                     $framedata .= $source_data_array['data'];
                 }
                 break;
             case 'SEEK':
                 // 4.29  SEEK Seek frame (ID3v2.4+ only)
                 // Minimum offset to next tag       $xx xx xx xx
                 if (!$this->IsWithinBitRange($source_data_array['data'], 32, false)) {
                     $this->errors[] = 'Invalid Minimum Offset in ' . $frame_name . ' (' . $source_data_array['data'] . ') (range = 0 to 4294967295)';
                 } else {
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['data'], 4, false);
                 }
                 break;
             case 'ASPI':
                 // 4.30  ASPI Audio seek point index (ID3v2.4+ only)
                 // Indexed data start (S)         $xx xx xx xx
                 // Indexed data length (L)        $xx xx xx xx
                 // Number of index points (N)     $xx xx
                 // Bits per index point (b)       $xx
                 //   Then for every index point the following data is included:
                 // Fraction at index (Fi)          $xx (xx)
                 if (!$this->IsWithinBitRange($source_data_array['datastart'], 32, false)) {
                     $this->errors[] = 'Invalid Indexed Data Start in ' . $frame_name . ' (' . $source_data_array['datastart'] . ') (range = 0 to 4294967295)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['datalength'], 32, false)) {
                     $this->errors[] = 'Invalid Indexed Data Length in ' . $frame_name . ' (' . $source_data_array['datalength'] . ') (range = 0 to 4294967295)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['indexpoints'], 16, false)) {
                     $this->errors[] = 'Invalid Number Of Index Points in ' . $frame_name . ' (' . $source_data_array['indexpoints'] . ') (range = 0 to 65535)';
                 } elseif (!$this->IsWithinBitRange($source_data_array['bitsperpoint'], 8, false)) {
                     $this->errors[] = 'Invalid Bits Per Index Point in ' . $frame_name . ' (' . $source_data_array['bitsperpoint'] . ') (range = 0 to 255)';
                 } elseif ($source_data_array['indexpoints'] != count($source_data_array['indexes'])) {
                     $this->errors[] = 'Number Of Index Points does not match actual supplied data in ' . $frame_name;
                 } else {
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['datastart'], 4, false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['datalength'], 4, false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['indexpoints'], 2, false);
                     $framedata .= getid3_lib::BigEndian2String($source_data_array['bitsperpoint'], 1, false);
                     foreach ($source_data_array['indexes'] as $key => $val) {
                         $framedata .= getid3_lib::BigEndian2String($val, ceil($source_data_array['bitsperpoint'] / 8), false);
                     }
                 }
                 break;
             case 'RGAD':
                 //   RGAD Replay Gain Adjustment
                 //   http://privatewww.essex.ac.uk/~djmrob/replaygain/
                 // Peak Amplitude                     $xx $xx $xx $xx
                 // Radio Replay Gain Adjustment        %aaabbbcd %dddddddd
                 // Audiophile Replay Gain Adjustment   %aaabbbcd %dddddddd
                 //   a - name code
                 //   b - originator code
                 //   c - sign bit
                 //   d - replay gain adjustment
                 if ($source_data_array['track_adjustment'] > 51 || $source_data_array['track_adjustment'] < -51) {
                     $this->errors[] = 'Invalid Track Adjustment in ' . $frame_name . ' (' . $source_data_array['track_adjustment'] . ') (range = -51.0 to +51.0)';
                 } elseif ($source_data_array['album_adjustment'] > 51 || $source_data_array['album_adjustment'] < -51) {
                     $this->errors[] = 'Invalid Album Adjustment in ' . $frame_name . ' (' . $source_data_array['album_adjustment'] . ') (range = -51.0 to +51.0)';
                 } elseif (!$this->ID3v2IsValidRGADname($source_data_array['raw']['track_name'])) {
                     $this->errors[] = 'Invalid Track Name Code in ' . $frame_name . ' (' . $source_data_array['raw']['track_name'] . ') (range = 0 to 2)';
                 } elseif (!$this->ID3v2IsValidRGADname($source_data_array['raw']['album_name'])) {
                     $this->errors[] = 'Invalid Album Name Code in ' . $frame_name . ' (' . $source_data_array['raw']['album_name'] . ') (range = 0 to 2)';
                 } elseif (!$this->ID3v2IsValidRGADoriginator($source_data_array['raw']['track_originator'])) {
                     $this->errors[] = 'Invalid Track Originator Code in ' . $frame_name . ' (' . $source_data_array['raw']['track_originator'] . ') (range = 0 to 3)';
                 } elseif (!$this->ID3v2IsValidRGADoriginator($source_data_array['raw']['album_originator'])) {
                     $this->errors[] = 'Invalid Album Originator Code in ' . $frame_name . ' (' . $source_data_array['raw']['album_originator'] . ') (range = 0 to 3)';
                 } else {
                     $framedata .= getid3_lib::Float2String($source_data_array['peakamplitude'], 32);
                     $framedata .= getid3_lib::RGADgainString($source_data_array['raw']['track_name'], $source_data_array['raw']['track_originator'], $source_data_array['track_adjustment']);
                     $framedata .= getid3_lib::RGADgainString($source_data_array['raw']['album_name'], $source_data_array['raw']['album_originator'], $source_data_array['album_adjustment']);
                 }
                 break;
             default:
                 if ($frame_name[0] == 'T') {
                     // 4.2. T???  Text information frames
                     // Text encoding                $xx
                     // Information                  <text string(s) according to encoding>
                     $source_data_array['encodingid'] = isset($source_data_array['encodingid']) ? $source_data_array['encodingid'] : $this->id3v2_default_encodingid;
                     if (!$this->ID3v2IsValidTextEncoding($source_data_array['encodingid'])) {
                         $this->errors[] = 'Invalid Text Encoding in ' . $frame_name . ' (' . $source_data_array['encodingid'] . ') for ID3v2.' . $this->majorversion;
                     } else {
                         $framedata .= chr($source_data_array['encodingid']);
                         $framedata .= $source_data_array['data'];
                     }
                 } elseif ($frame_name[0] == 'W') {
                     // 4.3. W???  URL link frames
                     // URL              <text string>
                     if (!$this->IsValidURL($source_data_array['data'], false, false)) {
                         //$this->errors[] = 'Invalid URL in '.$frame_name.' ('.$source_data_array['data'].')';
                         // probably should be an error, need to rewrite IsValidURL() to handle other encodings
                         $this->warnings[] = 'Invalid URL in ' . $frame_name . ' (' . $source_data_array['data'] . ')';
                     } else {
                         $framedata .= $source_data_array['data'];
                     }
                 } else {
                     $this->errors[] = $frame_name . ' not yet supported in $this->GenerateID3v2FrameData()';
                 }
                 break;
         }
     }
     if (!empty($this->errors)) {
         return false;
     }
     return $framedata;
 }
    $body .= sprintf("Name : %s\n\r", $values['name']);
    $body .= sprintf("-----------------\n\r");
    $body .= sprintf("His comment:\n\r%s", $values['comments']);
    $mailer->Body = $body;
    $mailer->AddAddress($values['emailto']);
    $mailer->AddReplyTo("*****@*****.**", "*****@*****.**");
    $mailer->Send();
}
if (isset($parameter)) {
    $post = $parameter;
    $_P = $_POST;
    $message = "";
    if ($_P["sendto"] == "1" && !IsValidEmail($_POST['emailto'])) {
        $message = "E-mail address is not valid";
    }
    if ($_P["sendto"] == "1" && IsValidEmail($_POST['emailto'])) {
        $message = "Your message was sent successfully.";
        SendForm();
    }
    if ($message != "") {
        $run_result .= <<<END
\t\t<div align="center"><font color="#FF0000">{$message}</font></div>
END;
    }
    $run_result .= <<<END

<script>
function ShowUrlForm(archor)
{
\tvar div = document.getElementById("newsFormUrl");
\tif( div != null)