<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: jonas code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Mon, 06 Oct 2008 03:35:11 GMT</pubDate>
    <description>DZone Snippets: jonas code</description>
    <item>
      <title>Find files in previous folders with mod_rewrite</title>
      <link>http://snippets.dzone.com/posts/show/6048</link>
      <description>It recursively goes up in the directories structure until it finds the requested file name or fails with status 404&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;RewriteCond %{REQUEST_FILENAME} !-d&lt;br /&gt;	RewriteRule ^[^/]*/(.*) $1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Assuming the file "/test/x.txt" exists, when requesting the url "/test/blabla/folder/xyz/x.txt", it will go up until finding the requested file:&lt;br /&gt;/test/blabla/folder/x.txt&lt;br /&gt;/test/blabla/x.txt&lt;br /&gt;/test/x.txt (found...)</description>
      <pubDate>Mon, 08 Sep 2008 18:38:43 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/6048</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Thread Process //Pascal class</title>
      <link>http://snippets.dzone.com/posts/show/5729</link>
      <description>A thread class to open processes on windows and retrieve its output (input isn't supported but it's easy to add).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;unit Process;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  SysUtils, Windows, Classes, TLHelp32;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  INITIALIZATION_TIMEOUT = 10000;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TStringArray = array of string;&lt;br /&gt;  TProcessArray = array of Cardinal;&lt;br /&gt;  TExceptionEvent = procedure(Sender: TObject; Exception: Exception) of object;&lt;br /&gt;  EProcessError = class(Exception);&lt;br /&gt;&lt;br /&gt;  TProcessThread = class(TThread)&lt;br /&gt;  private&lt;br /&gt;    FException: Exception;&lt;br /&gt;    FWatching, FStarted, FSuspended: Boolean;&lt;br /&gt;    FDirectory, FPath, FCommandLine, FEnvironment: PChar;&lt;br /&gt;    FData: string;&lt;br /&gt;    FOnProcessTerminated, FOnDataAvailable: TNotifyEvent;&lt;br /&gt;    InputRead, InputWrite, OutputRead, OutputWrite: THandle;&lt;br /&gt;    FMainProcess: PROCESS_INFORMATION;&lt;br /&gt;    FOnException: TExceptionEvent;&lt;br /&gt;    FOnProcessStarted: TNotifyEvent;&lt;br /&gt;    function GetPriority: TThreadPriority;&lt;br /&gt;    procedure SetPriority(const Value: TThreadPriority);&lt;br /&gt;    procedure FreeResources;&lt;br /&gt;  protected&lt;br /&gt;    procedure CallDataAvailable; virtual;&lt;br /&gt;    procedure CallProcessTerminated; virtual;&lt;br /&gt;    procedure CallProcessOpened; virtual;&lt;br /&gt;    procedure CallException; virtual;&lt;br /&gt;    procedure Execute; override;&lt;br /&gt;  public&lt;br /&gt;    constructor Create(Path, CommandLine, Directory: string; Environment: TStrings = nil; Watch: Boolean = True);&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    function IsProcessAlive: Boolean;&lt;br /&gt;    procedure Resume;&lt;br /&gt;    procedure Suspend;&lt;br /&gt;    property OnDataAvailable: TNotifyEvent read FOnDataAvailable write FOnDataAvailable;&lt;br /&gt;    property OnProcessTerminated: TNotifyEvent read FOnProcessTerminated write FOnProcessTerminated;&lt;br /&gt;    property OnProcessStarted: TNotifyEvent read FOnProcessStarted write FOnProcessStarted;&lt;br /&gt;    property OnException: TExceptionEvent read FOnException write FOnException;&lt;br /&gt;    property Data: string read FData;&lt;br /&gt;    property Process: PROCESS_INFORMATION read FMainProcess;&lt;br /&gt;    property Priority: TThreadPriority read GetPriority write SetPriority;&lt;br /&gt;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  TProcessLineThread = class;&lt;br /&gt;  TOnNewLineEvent = procedure(ProcessLine:  TProcessLineThread; const Line: string) of object;&lt;br /&gt;  TProcessLineThread = class(TProcessThread)&lt;br /&gt;  private&lt;br /&gt;    FCurrentLine: string;&lt;br /&gt;    FOnNewLine: TOnNewLineEvent;&lt;br /&gt;    procedure DataAvailable(Sender: TObject);&lt;br /&gt;    procedure Finished(Sender: TObject);&lt;br /&gt;  public&lt;br /&gt;    constructor Create(Path, CommandLine, Directory: string; Environment: TStrings = nil);&lt;br /&gt;    property OnNewLine: TOnNewLineEvent read FOnNewLine write FOnNewLine;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;function KillProcess(const Process: Cardinal): Boolean;&lt;br /&gt;function GetChildrenProcesses(const Process: Cardinal; const IncludeParent: Boolean = True): TProcessArray;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  Priorities: array [TThreadPriority] of Integer =&lt;br /&gt;   (THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL,&lt;br /&gt;    THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL,&lt;br /&gt;    THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL);&lt;br /&gt;&lt;br /&gt;function GetChildrenProcesses(const Process: Cardinal; const IncludeParent: Boolean): TProcessArray;&lt;br /&gt;var&lt;br /&gt;  Snapshot: Cardinal;&lt;br /&gt;  ProcessList: PROCESSENTRY32;&lt;br /&gt;  Current: Integer;&lt;br /&gt;begin&lt;br /&gt;  Current := 0;&lt;br /&gt;  SetLength(Result, 1);&lt;br /&gt;  Result[0] := Process;&lt;br /&gt;  repeat&lt;br /&gt;    ProcessList.dwSize := SizeOf(PROCESSENTRY32);&lt;br /&gt;    Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);&lt;br /&gt;    if (Snapshot = INVALID_HANDLE_VALUE) or not Process32First(Snapshot, ProcessList) then&lt;br /&gt;      Continue;&lt;br /&gt;    repeat&lt;br /&gt;      if ProcessList.th32ParentProcessID = Result[Current] then&lt;br /&gt;      begin&lt;br /&gt;        SetLength(Result, Length(Result) + 1);&lt;br /&gt;        Result[Length(Result) - 1] := ProcessList.th32ProcessID;&lt;br /&gt;      end;&lt;br /&gt;    until Process32Next(Snapshot, ProcessList) = False;&lt;br /&gt;    Inc(Current);&lt;br /&gt;  until Current &gt;= Length(Result);&lt;br /&gt;  if not IncludeParent then&lt;br /&gt;    Result := Copy(Result, 2, Length(Result));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function KillProcess(const Process: Cardinal): Boolean;&lt;br /&gt;var&lt;br /&gt;  Handle: Cardinal;&lt;br /&gt;  List: TProcessArray;&lt;br /&gt;  I: Integer;&lt;br /&gt;begin&lt;br /&gt;  Result := True;&lt;br /&gt;  List := GetChildrenProcesses(Process);&lt;br /&gt;  for I := Length(List) - 1 downto 0 do&lt;br /&gt;    if Result then&lt;br /&gt;    begin&lt;br /&gt;      Handle := OpenProcess(PROCESS_TERMINATE, false, List[I]);&lt;br /&gt;      Result := (Handle &lt;&gt; 0) and TerminateProcess(Handle, 0) and CloseHandle(Handle);&lt;br /&gt;    end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{ TProcessThread }&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallDataAvailable;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnDataAvailable) then&lt;br /&gt;    FOnDataAvailable(Self);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.Resume;&lt;br /&gt;var&lt;br /&gt;  SuspendCount: Integer;&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;  begin&lt;br /&gt;    FStarted := True;&lt;br /&gt;    SuspendCount := ResumeThread(FMainProcess.hThread);&lt;br /&gt;    CheckThreadError(SuspendCount &gt;= 0);&lt;br /&gt;    if SuspendCount = 1 then&lt;br /&gt;      FSuspended := False;&lt;br /&gt;  end;&lt;br /&gt;  inherited Resume;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TProcessThread.GetPriority: TThreadPriority;&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;  begin&lt;br /&gt;    CheckThreadError(GetThreadPriority(FMainProcess.hThread) &lt;&gt; THREAD_PRIORITY_ERROR_RETURN);&lt;br /&gt;  end;&lt;br /&gt;  Result := inherited Priority;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TProcessThread.IsProcessAlive: Boolean;&lt;br /&gt;var&lt;br /&gt;  Status: Cardinal;&lt;br /&gt;begin&lt;br /&gt;  GetExitCodeProcess(FMainProcess.hProcess, Status);&lt;br /&gt;  Result := Status = STILL_ACTIVE;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.SetPriority(const Value: TThreadPriority);&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;    CheckThreadError(SetThreadPriority(FMainProcess.hThread, Priorities[Value]));&lt;br /&gt;  inherited Priority := Value;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.Suspend;&lt;br /&gt;var&lt;br /&gt;  OldSuspend: Boolean;&lt;br /&gt;begin&lt;br /&gt;  if FStarted then&lt;br /&gt;  begin&lt;br /&gt;    OldSuspend := FSuspended;&lt;br /&gt;    try&lt;br /&gt;      FSuspended := True;&lt;br /&gt;      CheckThreadError(Integer(SuspendThread(FMainProcess.hThread)) &gt;= 0);&lt;br /&gt;    except&lt;br /&gt;      FSuspended := OldSuspend;&lt;br /&gt;      raise;&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;  inherited Suspend;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallException;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnException) then&lt;br /&gt;    FOnException(Self, FException);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallProcessOpened;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnProcessStarted) then&lt;br /&gt;    FOnProcessStarted(Self);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.CallProcessTerminated;&lt;br /&gt;begin&lt;br /&gt;  if Assigned(FOnProcessTerminated) then&lt;br /&gt;    FOnProcessTerminated(Self);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;constructor TProcessThread.Create(Path, CommandLine, Directory: string; Environment: TStrings; Watch: Boolean);&lt;br /&gt;var&lt;br /&gt;  Len, I: Integer;&lt;br /&gt;begin&lt;br /&gt;  inherited Create(True);&lt;br /&gt;&lt;br /&gt;  if (Length(CommandLine) &gt; 0) and (Length(Path) &gt; 0) then&lt;br /&gt;    CommandLine := ' ' + CommandLine;&lt;br /&gt;&lt;br /&gt;  if Length(Path) &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FPath, Length(Path) + 1);&lt;br /&gt;    StrCopy(FPath, PChar(Path));&lt;br /&gt;  end;&lt;br /&gt;  if Length(CommandLine) &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FCommandLine, Length(CommandLine) + 1);&lt;br /&gt;    StrCopy(FCommandLine, PChar(CommandLine));&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  if Length(Directory) &gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FDirectory, Length(Directory) + 1);&lt;br /&gt;    StrCopy(FDirectory, PChar(Directory));&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  FWatching := Watch;&lt;br /&gt;&lt;br /&gt;  if Assigned(Environment) then&lt;br /&gt;  begin&lt;br /&gt;    GetMem(FEnvironment, 1);&lt;br /&gt;    Len := 1;&lt;br /&gt;    for I := 0 to Environment.Count - 1 do&lt;br /&gt;    begin&lt;br /&gt;      Inc(Len, Length(Environment[I]) + 1);&lt;br /&gt;      ReallocMem(FEnvironment, Len);&lt;br /&gt;      SetEnvironmentVariable(PChar(Environment.Names[I]), PChar(Environment.ValueFromIndex[I]));&lt;br /&gt;      StrCopy(FEnvironment + Len - Length(Environment[I]) - 2, PChar(Environment[I]));&lt;br /&gt;    end;&lt;br /&gt;    (FEnvironment + Len - 1)^ := #0;&lt;br /&gt;    FreeMem(FEnvironment);&lt;br /&gt;    FEnvironment := nil;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TProcessThread.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FreeMem(FPath);&lt;br /&gt;  FreeMem(FCommandLine);&lt;br /&gt;  FreeMem(FDirectory);&lt;br /&gt;  FreeResources;&lt;br /&gt;  if Assigned(FEnvironment) then&lt;br /&gt;    FreeMem(FEnvironment);&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.Execute;&lt;br /&gt;const&lt;br /&gt;  MAX_BUFFER = 512 * 1024;&lt;br /&gt;var&lt;br /&gt;  MaxBytes, Available, BytesRead: Cardinal;&lt;br /&gt;  Buffer: array[0..MAX_BUFFER] of Char;&lt;br /&gt;&lt;br /&gt;  function Read: Boolean;&lt;br /&gt;  begin&lt;br /&gt;    Result := True;&lt;br /&gt;    FillChar(Buffer, MAX_BUFFER, #0);&lt;br /&gt;    PeekNamedPipe(OutputRead, @Buffer, MAX_BUFFER, @BytesRead, @Available, nil);&lt;br /&gt;&lt;br /&gt;    if BytesRead &lt; MAX_BUFFER then&lt;br /&gt;    begin&lt;br /&gt;      MaxBytes := BytesRead;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      MaxBytes := MAX_BUFFER;&lt;br /&gt;&lt;br /&gt;    if MaxBytes &gt; 0 then&lt;br /&gt;      if ReadFile(OutputRead, Buffer, MaxBytes, BytesRead, nil) then&lt;br /&gt;      begin&lt;br /&gt;        if BytesRead &gt; 0 then&lt;br /&gt;        begin&lt;br /&gt;          FData := StrPas(Buffer);&lt;br /&gt;          Synchronize(CallDataAvailable);&lt;br /&gt;        end;&lt;br /&gt;      end&lt;br /&gt;      else&lt;br /&gt;        Result := False;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  Startup: STARTUPINFO;&lt;br /&gt;  SecurityDescriptor: SECURITY_DESCRIPTOR;&lt;br /&gt;  SecurityAttributes: SECURITY_ATTRIBUTES;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    ZeroMemory(@Startup, SizeOf(STARTUPINFO));&lt;br /&gt;    Startup.cb := SizeOf(STARTUPINFO);&lt;br /&gt;    ZeroMemory(@SecurityDescriptor, SizeOf(SECURITY_DESCRIPTOR));&lt;br /&gt;    ZeroMemory(@SecurityAttributes, SizeOf(SECURITY_ATTRIBUTES));&lt;br /&gt;    InputRead := 0;&lt;br /&gt;    InputWrite := 0;&lt;br /&gt;    OutputRead := 0;&lt;br /&gt;    OutputWrite := 0;&lt;br /&gt;&lt;br /&gt;    if Win32Platform = VER_PLATFORM_WIN32_NT then&lt;br /&gt;    begin&lt;br /&gt;      InitializeSecurityDescriptor(@SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);&lt;br /&gt;      SetSecurityDescriptorDacl(@SecurityDescriptor, True, nil, False);&lt;br /&gt;      SecurityAttributes.lpSecurityDescriptor := @SecurityDescriptor;&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      SecurityAttributes.lpSecurityDescriptor := nil;&lt;br /&gt;    SecurityAttributes.nLength := SizeOf(SECURITY_ATTRIBUTES);&lt;br /&gt;    SecurityAttributes.bInheritHandle := True;&lt;br /&gt;    if not CreatePipe(OutputRead, OutputWrite, @SecurityAttributes, 0)&lt;br /&gt;    or not CreatePipe(InputRead, InputWrite, @SecurityAttributes, 0) then&lt;br /&gt;      raise EProcessError.Create('Error while opening pipes');&lt;br /&gt;&lt;br /&gt;    SetHandleInformation(OutputRead, HANDLE_FLAG_INHERIT, 0);&lt;br /&gt;    SetHandleInformation(InputWrite, HANDLE_FLAG_INHERIT, 0);&lt;br /&gt;&lt;br /&gt;    GetStartupInfo(Startup);&lt;br /&gt;    Startup.dwFlags := STARTF_USESHOWWINDOW OR STARTF_USESTDHANDLES;&lt;br /&gt;&lt;br /&gt;    Startup.hStdOutput := OutputWrite;&lt;br /&gt;    Startup.hStdError := OutputWrite;&lt;br /&gt;    Startup.hStdInput := InputRead;&lt;br /&gt;&lt;br /&gt;    FlushFileBuffers(OutputWrite);&lt;br /&gt;    FlushFileBuffers(OutputRead);&lt;br /&gt;    FlushFileBuffers(InputRead);&lt;br /&gt;    FlushFileBuffers(InputWrite);&lt;br /&gt;&lt;br /&gt;    Startup.wShowWindow := SW_HIDE;&lt;br /&gt;&lt;br /&gt;    if not CreateProcess(FPath, FCommandLine, nil, nil, True, CREATE_NEW_CONSOLE OR NORMAL_PRIORITY_CLASS, FEnvironment, FDirectory, Startup, FMainProcess) then&lt;br /&gt;      raise EProcessError.Create('Error while starting Process: ' + SysErrorMessage(GetLastError) + ':' + FPath + ':' + FCommandLine + ':' + FDirectory);&lt;br /&gt;    WaitForInputIdle(FMainProcess.hProcess, INITIALIZATION_TIMEOUT);&lt;br /&gt;    FStarted := True;&lt;br /&gt;    SetPriority(GetPriority);&lt;br /&gt;    Synchronize(CallProcessOpened);&lt;br /&gt;    &lt;br /&gt;    if not FWatching then&lt;br /&gt;      Exit;&lt;br /&gt;&lt;br /&gt;    repeat&lt;br /&gt;      if not Read then&lt;br /&gt;        Break;&lt;br /&gt;    until not IsProcessAlive or Terminated;&lt;br /&gt;    Read;&lt;br /&gt;&lt;br /&gt;    if not IsProcessAlive then&lt;br /&gt;      Synchronize(CallProcessTerminated);&lt;br /&gt;      &lt;br /&gt;  except&lt;br /&gt;    on E: Exception do&lt;br /&gt;    begin&lt;br /&gt;      FException := E;&lt;br /&gt;      Synchronize(CallException);&lt;br /&gt;    end;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TProcessThread.FreeResources;&lt;br /&gt;begin&lt;br /&gt;  KillProcess(FMainProcess.dwProcessId);&lt;br /&gt;&lt;br /&gt;  if OutputRead &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(OutputRead);&lt;br /&gt;    OutputRead := 0;&lt;br /&gt;  end;&lt;br /&gt;  if OutputWrite &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(OutputWrite);&lt;br /&gt;    OutputWrite := 0;&lt;br /&gt;  end;&lt;br /&gt;  if InputWrite &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(InputWrite);&lt;br /&gt;    InputWrite := 0;&lt;br /&gt;  end;&lt;br /&gt;  if InputRead &lt;&gt; 0 then&lt;br /&gt;  begin&lt;br /&gt;    CloseHandle(InputRead);&lt;br /&gt;    InputRead := 0;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;{  TProcessLineThread }&lt;br /&gt;&lt;br /&gt;constructor  TProcessLineThread.Create(Path, CommandLine, Directory: string; Environment: TStrings);&lt;br /&gt;begin&lt;br /&gt;  inherited Create(Path, CommandLine, Directory, Environment);&lt;br /&gt;  OnDataAvailable := DataAvailable;&lt;br /&gt;  OnTerminate := Finished;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure  TProcessLineThread.DataAvailable(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  I, L: Integer;&lt;br /&gt;begin&lt;br /&gt;  I := 0;&lt;br /&gt;  L := Length(Data);&lt;br /&gt;  while I &lt; L do&lt;br /&gt;  begin&lt;br /&gt;    Inc(I);&lt;br /&gt;    if Data[I] in [#13, #10] then&lt;br /&gt;    begin&lt;br /&gt;      if (I &lt; L) and (Data[I+1] in [#13, #10]) then&lt;br /&gt;        Inc(I);&lt;br /&gt;      if Assigned(FOnNewLine) then&lt;br /&gt;        FOnNewLine(Self, FCurrentLine);&lt;br /&gt;      FCurrentLine := '';&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      FCurrentLine := FCurrentLine + Data[I];&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure  TProcessLineThread.Finished(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  if (FCurrentLine &lt;&gt; '') and Assigned(FOnNewLine) then&lt;br /&gt;    FOnNewLine(Self, FCurrentLine);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 07 Jul 2008 07:25:12 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5729</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Replace working as PHP str_replace //JavaScript Function</title>
      <link>http://snippets.dzone.com/posts/show/5369</link>
      <description>&lt;a href="http://jsfromhell.com"&gt;Useless JavaScript implementation of the php function str_replace.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com&lt;br /&gt;&lt;br /&gt;function replace(f, r, s){&lt;br /&gt;	var ra = r instanceof Array, sa = s instanceof Array, l = (f = [].concat(f)).length, r = [].concat(r), i = (s = [].concat(s)).length;&lt;br /&gt;	while(j = 0, i--)&lt;br /&gt;		while(s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j &lt; l);&lt;br /&gt;	return sa ? s : s[0];&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 17 Apr 2008 05:10:07 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5369</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Output JavaScript variables from PHP</title>
      <link>http://snippets.dzone.com/posts/show/5342</link>
      <description>Class with useful static methods for outputting PHP values into JavaScript format.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com&lt;br /&gt;&lt;br /&gt;class JS{&lt;br /&gt;	//generic and maybe not the desired results xD&lt;br /&gt;	function value($o){&lt;br /&gt;		if($o === null)&lt;br /&gt;			return 'null';&lt;br /&gt;		$t = strtolower(gettype($o));&lt;br /&gt;		if($t == 'string' &amp;&amp; is_numeric($o) &amp;&amp; ($o[0] || strlen($o) == 1) || in_array($t, array('double', 'integer')))&lt;br /&gt;			$t = 'number';&lt;br /&gt;		elseif($t == 'string' &amp;&amp; preg_match('@^\d{4}(?:-\d{1,2}){1,2}(?: (?:\d{1,2}:){2}\d{1,2})?$@', $o)) //strtotime works also with "strange" values strtotime('x')&lt;br /&gt;			$t = 'date';&lt;br /&gt;		elseif($t == 'array' &amp;&amp; ($c = count($k = array_keys($o))) &amp;&amp; $k !== range(0, $c - 1))&lt;br /&gt;			$t = 'object';&lt;br /&gt;		elseif(!in_array($t, array('boolean', 'string', 'array', 'object')))&lt;br /&gt;			$t = 'string';&lt;br /&gt;		$t = 'from' . $t;&lt;br /&gt;		return self::$t($o);&lt;br /&gt;	}&lt;br /&gt;	function fromNumber($o){&lt;br /&gt;		return +$o . '';&lt;br /&gt;	}&lt;br /&gt;	function fromObject($o){&lt;br /&gt;		$r = array();&lt;br /&gt;		foreach($o as $n =&gt; $v)&lt;br /&gt;			$r[] = self::fromString($n) . ':' . self::value($v);&lt;br /&gt;		return '{' . implode(',', $r) . '}';&lt;br /&gt;	}&lt;br /&gt;	function fromBoolean($o){&lt;br /&gt;		return $o ? 'true' : 'false';&lt;br /&gt;	}&lt;br /&gt;	//$q = should quote? &lt;br /&gt;	//$c = char that will be used to quote&lt;br /&gt;	function fromString($o, $q = true, $c = '"'){&lt;br /&gt;		return ($p = $q ? $c : '') . preg_replace('/\r\n|\n\r|\r/', '\n', str_replace($c, '\\' . $c, str_replace('\\', '\\\\', $o))) . $p;&lt;br /&gt;	}&lt;br /&gt;	function fromArray($o){&lt;br /&gt;		$s = '';&lt;br /&gt;		foreach($o as $v)&lt;br /&gt;			$s .= ($s ? ',' : '') . self::value($v);&lt;br /&gt;		return '[' . $s . ']';&lt;br /&gt;	}&lt;br /&gt;	function fromDate($o){&lt;br /&gt;		(is_numeric($o) &amp;&amp; $o = +$o) || ($o = strtotime($o)) &gt; 0 || ($o = mktime());&lt;br /&gt;		$o = explode(',', date('Y,n,j,G,i,s', $o));&lt;br /&gt;		foreach($o as $i =&gt; $v)&lt;br /&gt;			$o[$i] = +$v;&lt;br /&gt;		return 'new Date(' . implode(',', $o)  . ')';&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$o = new stdClass;&lt;br /&gt;$o-&gt;abc = 123;&lt;br /&gt;echo implode("\n&lt;br /&gt;", array(&lt;br /&gt;	JS::value('1984-07-22 11:30:12'),&lt;br /&gt;	JS::value('Test'),&lt;br /&gt;	JS::value(1234),&lt;br /&gt;	JS::value(true),&lt;br /&gt;	JS::value(array(1,2,3)),&lt;br /&gt;	JS::value(array('lala' =&gt; 'x')),&lt;br /&gt;	JS::value($o)&lt;br /&gt;));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Wed, 09 Apr 2008 23:57:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5342</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Point Inside a Polygon //JavaScript Function</title>
      <link>http://snippets.dzone.com/posts/show/5295</link>
      <description>&lt;a href="http://jsfromhell.com/math/is-point-in-poly"&gt;&lt;br /&gt;Checks whether a point is inside a polygon.&lt;br /&gt;Adapted from: [http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html]&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE: Point Inside a Polygon]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/math/is-point-in-poly [v1.0]&lt;br /&gt;&lt;br /&gt;function isPointInPoly(poly, pt){&lt;br /&gt;	for(var c = false, i = -1, l = poly.length, j = l - 1; ++i &lt; l; j = i)&lt;br /&gt;		((poly[i].y &lt;= pt.y &amp;&amp; pt.y &lt; poly[j].y) || (poly[j].y &lt;= pt.y &amp;&amp; pt.y &lt; poly[i].y))&lt;br /&gt;		&amp;&amp; (pt.x &lt; (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)&lt;br /&gt;		&amp;&amp; (c = !c);&lt;br /&gt;	return c;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;//&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;points = [&lt;br /&gt;	{x: 0, y: 0},&lt;br /&gt;	{x: 0, y: 50},&lt;br /&gt;	{x: 50, y: 10},&lt;br /&gt;	{x: -50, y: -10},&lt;br /&gt;	{x: 0, y: -50},&lt;br /&gt;	{x: 0, y: 0}&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;alert(isPointInPoly(points, {x: 10, y: 10}) ? "In" : "Out");&lt;br /&gt;&lt;br /&gt;//]]&gt;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Sun, 30 Mar 2008 16:57:56 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5295</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>UTF-8 Converter //JavaScript Object</title>
      <link>http://snippets.dzone.com/posts/show/5294</link>
      <description>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsfromhell.com/geral/utf-8"&gt;&lt;br /&gt;Converts a sequence of ANSI characters to UTF-8 and vice-versa.&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/geral/utf-8 [v1.0]&lt;br /&gt;&lt;br /&gt;UTF8 = {&lt;br /&gt;	encode: function(s){&lt;br /&gt;		for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i &lt; l;&lt;br /&gt;			s[i] = (c = s[i].charCodeAt(0)) &gt;= 127 ? o(0xc0 | (c &gt;&gt;&gt; 6)) + o(0x80 | (c &amp; 0x3f)) : s[i]&lt;br /&gt;		);&lt;br /&gt;		return s.join("");&lt;br /&gt;	},&lt;br /&gt;	decode: function(s){&lt;br /&gt;		for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i &lt; l;&lt;br /&gt;			((a = s[i][c](0)) &amp; 0x80) &amp;&amp;&lt;br /&gt;			(s[i] = (a &amp; 0xfc) == 0xc0 &amp;&amp; ((b = s[i + 1][c](0)) &amp; 0xc0) == 0x80 ?&lt;br /&gt;			o(((a &amp; 0x03) &lt;&lt; 6) + (b &amp; 0x3f)) : o(128), s[++i] = "")&lt;br /&gt;		);&lt;br /&gt;		return s.join("");&lt;br /&gt;	}&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var s = "a&#225;&#233;&#237;&#243;&#250;e";&lt;br /&gt;document.write(&lt;br /&gt;	('UTF8.encode("' + s + '") = ').bold(), UTF8.encode(s), "&lt;br /&gt;",&lt;br /&gt;	('UTF8.decode(UTF8.encode("' + s + '"))) = ').bold(), UTF8.decode(UTF8.encode(s))&lt;br /&gt;);&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 30 Mar 2008 16:52:18 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5294</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>TimeLine //JavaScript Class</title>
      <link>http://snippets.dzone.com/posts/show/5293</link>
      <description>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsfromhell.com/classes/timeline"&gt;&lt;br /&gt;Simulates the Adobe Flash timeline. You define the amount of frames, the speed in fps (frames per second) and, at each frame passage an event is called, useful for animations.&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/classes/timeline [v1.0]&lt;br /&gt;&lt;br /&gt;TimeLine = function(fps, f){&lt;br /&gt;	this.fps = fps, this.frames = f;&lt;br /&gt;};&lt;br /&gt;with({o: TimeLine, $: TimeLine.prototype}){&lt;br /&gt;	o.timers = [];&lt;br /&gt;	$.running = !!($.current = +(o.timer = $.time = null));&lt;br /&gt;	o.run = function(){&lt;br /&gt;		var o = this;&lt;br /&gt;		o.timer || (o.timer = setInterval(function(){&lt;br /&gt;			for(var h, d = +(new Date), t = o.timers, i = t.length; i--;){&lt;br /&gt;				(!t[i].running || ((d - t[i].time) / (1e3 / t[i].fps) &gt; t[i].current + 1 &amp;&amp;&lt;br /&gt;				t[i].onframe(++t[i].current), t[i].current &gt;= t[i].frames)) &amp;&amp;&lt;br /&gt;				(h = t.splice(i, 1)[0], h.stop(1));&lt;br /&gt;			}&lt;br /&gt;		}, 1));&lt;br /&gt;	};&lt;br /&gt;	$.start = function(c){&lt;br /&gt;		var o = this, t = TimeLine;&lt;br /&gt;		if(o.running) return;&lt;br /&gt;		o.running = true, o.current = c || 0;&lt;br /&gt;		o.time = new Date, o.onstart &amp;&amp; o.onstart();&lt;br /&gt;		if(!o.onframe || o.frames &lt;= 0 || o.fps &lt;= 0)&lt;br /&gt;			return o.stop(1);&lt;br /&gt;		t.timers.push(this), t.run();&lt;br /&gt;	};&lt;br /&gt;	$.stop = function(){&lt;br /&gt;		var o = this;&lt;br /&gt;		o.running = false;&lt;br /&gt;		if(!TimeLine.timers.length)&lt;br /&gt;			TimeLine.timer = clearInterval(TimeLine.timer), null;&lt;br /&gt;		arguments.length &amp;&amp; o.onstop &amp;&amp; o.onstop();&lt;br /&gt;	};&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="box" style="position: absolute; top: 100px; background: #efe; width: 100px; height: 100px"&gt;25 fps&lt;/div&gt;&lt;br /&gt;&lt;div id="box2" style="position: absolute; top: 300px; background: #ff9; width: 100px; height: 100px"&gt;12 fps&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;TimeLine working together with the ease in quad function.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;Math.ease = function (t, b, c, d) {&lt;br /&gt;	if ((t /= d / 2) &lt; 1)&lt;br /&gt;		return c / 2 * t * t + b;&lt;br /&gt;	return -c / 2 * (--t * (t - 2) - 1) + b;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;var o = new TimeLine(25, 50), d = document, b = d.getElementById("box");&lt;br /&gt;o.onframe = function(){&lt;br /&gt;	b.style.left = Math.ease(this.current, 0, 400, 30) + "px";&lt;br /&gt;};&lt;br /&gt;o.onstart = function(){&lt;br /&gt;	d.body.appendChild(d.createTextNode("Started"));&lt;br /&gt;};&lt;br /&gt;o.onstop = function(){&lt;br /&gt;	d.body.appendChild(d.createTextNode(" - Finished (" + (((new Date) - this.time)) + " msec)"))&lt;br /&gt;	d.body.appendChild(d.createElement("br"));&lt;br /&gt;	this.start();&lt;br /&gt;};&lt;br /&gt;o.start();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var o2 = new TimeLine(12, 50), b2 = d.getElementById("box2");&lt;br /&gt;o2.onframe = function(){&lt;br /&gt;	b2.style.left = Math.ease(this.current, 0, 400, 30) + "px";&lt;br /&gt;};&lt;br /&gt;o2.onstop = function(){&lt;br /&gt;	this.start();&lt;br /&gt;};&lt;br /&gt;o2.start();&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 30 Mar 2008 16:49:21 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/5293</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>Selection //JavaScript Class</title>
      <link>http://snippets.dzone.com/posts/show/4620</link>
      <description>&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jsfromhell.com/forms/selection"&gt;&lt;br /&gt;Retrieves and sets the cursor position, as well the selected text of inputs and textareas. After searching, I saw it's the only code which retrieves right information in textareas under Internet Explorer without damaging the "Ctrl+Z"&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/forms/selection [v1.0]&lt;br /&gt;&lt;br /&gt;Selection = function(input){&lt;br /&gt;	this.isTA = (this.input = input).nodeName.toLowerCase() == "textarea";&lt;br /&gt;};&lt;br /&gt;with({o: Selection.prototype}){&lt;br /&gt;	o.setCaret = function(start, end){&lt;br /&gt;		var o = this.input;&lt;br /&gt;		if(Selection.isStandard)&lt;br /&gt;			o.setSelectionRange(start, end);&lt;br /&gt;		else if(Selection.isSupported){&lt;br /&gt;			var t = this.input.createTextRange();&lt;br /&gt;			end -= start + o.value.slice(start + 1, end).split("\n").length - 1;&lt;br /&gt;			start -= o.value.slice(0, start).split("\n").length - 1;&lt;br /&gt;			t.move("character", start), t.moveEnd("character", end), t.select();&lt;br /&gt;		}&lt;br /&gt;	};&lt;br /&gt;	o.getCaret = function(){&lt;br /&gt;		var o = this.input, d = document;&lt;br /&gt;		if(Selection.isStandard)&lt;br /&gt;			return {start: o.selectionStart, end: o.selectionEnd};&lt;br /&gt;		else if(Selection.isSupported){&lt;br /&gt;			var s = (this.input.focus(), d.selection.createRange()), r, start, end, value;&lt;br /&gt;			if(s.parentElement() != o)&lt;br /&gt;				return {start: 0, end: 0};&lt;br /&gt;			if(this.isTA ? (r = s.duplicate()).moveToElementText(o) : r = o.createTextRange(), !this.isTA)&lt;br /&gt;				return r.setEndPoint("EndToStart", s), {start: r.text.length, end: r.text.length + s.text.length};&lt;br /&gt;			for(var $ = "[###]"; (value = o.value).indexOf($) + 1; $ += $);&lt;br /&gt;			r.setEndPoint("StartToEnd", s), r.text = $ + r.text, end = o.value.indexOf($);&lt;br /&gt;			s.text = $, start = o.value.indexOf($);&lt;br /&gt;			if(d.execCommand &amp;&amp; d.queryCommandSupported("Undo"))&lt;br /&gt;				for(r = 3; --r; d.execCommand("Undo"));&lt;br /&gt;			return o.value = value, this.setCaret(start, end), {start: start, end: end};&lt;br /&gt;		}&lt;br /&gt;		return {start: 0, end: 0};&lt;br /&gt;	};&lt;br /&gt;	o.getText = function(){&lt;br /&gt;		var o = this.getCaret();&lt;br /&gt;		return this.input.value.slice(o.start, o.end);&lt;br /&gt;	};&lt;br /&gt;	o.setText = function(text){&lt;br /&gt;		var o = this.getCaret(), i = this.input, s = i.value;&lt;br /&gt;		i.value = s.slice(0, o.start) + text + s.slice(o.end);&lt;br /&gt;		this.setCaret(o.start += text.length, o.start);&lt;br /&gt;	};&lt;br /&gt;	new function(){&lt;br /&gt;		var d = document, o = d.createElement("input"), s = Selection;&lt;br /&gt;		s.isStandard = "selectionStart" in o;&lt;br /&gt;		s.isSupported = s.isStandard || (o = d.selection) &amp;&amp; !!o.createRange();&lt;br /&gt;	};&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;form id="form"&gt;&lt;br /&gt;	&lt;fieldset&gt;&lt;br /&gt;		&lt;legend&gt;Selection Test&lt;/legend&gt;&lt;br /&gt;		&lt;textarea name="text" rows="10" cols="30"&gt;&lt;br /&gt;www.jsfromhell.com&lt;br /&gt;Jonas Carlos Lalala&lt;br /&gt;Bin Laden x Bush&lt;br /&gt;		&lt;/textarea&gt;&lt;br /&gt;&lt;br /&gt;		&lt;input name="getText" type="button" value="[Get selected text]" /&gt;&lt;br /&gt;		&lt;input name="getSel" type="button" value="[Get cursor]" /&gt;&lt;br /&gt;		&lt;br /&gt;&lt;input name="setText" type="button" value="[Set selected text]" /&gt;&lt;br /&gt;		&lt;input name="setSel" type="button" value="[Set cursor]" /&gt;&lt;br /&gt;	&lt;/fieldset&gt;&lt;br /&gt;&lt;/form&gt;&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;&lt;br /&gt;var f = document.forms.form;&lt;br /&gt;var selection = new Selection(f.text);&lt;br /&gt;&lt;br /&gt;f.getText.onclick = function(){&lt;br /&gt;	alert(selection.getText());&lt;br /&gt;	f.text.focus();&lt;br /&gt;};&lt;br /&gt;f.setText.onclick = function(){&lt;br /&gt;	var s = prompt("New text:", selection.getText());&lt;br /&gt;	s !== null &amp;&amp; selection.setText(s);&lt;br /&gt;	f.text.focus();&lt;br /&gt;};&lt;br /&gt;f.getSel.onclick = function(){&lt;br /&gt;	var s = selection.getCaret();&lt;br /&gt;	alert("Start: " + s.start + "\nEnd: " + s.end);&lt;br /&gt;	f.text.focus();&lt;br /&gt;};&lt;br /&gt;f.setSel.onclick = function(){&lt;br /&gt;	var s = selection.getCaret();&lt;br /&gt;	selection.setCaret(+prompt("Start:", s.start) || 0, +prompt("End:", s.end) || 0);&lt;br /&gt;	f.text.focus();&lt;br /&gt;};&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 06 Oct 2007 15:02:21 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4620</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>CSV Parser / Writer for PHP</title>
      <link>http://snippets.dzone.com/posts/show/3128</link>
      <description>CSV Parser / Writer&lt;br /&gt;&lt;br /&gt;Example A:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//cell separator, row separator, value enclosure&lt;br /&gt;$csv = new CSV(';', "\r\n", '"');&lt;br /&gt;&lt;br /&gt;//parse the string content&lt;br /&gt;$csv-&gt;setContent(file_get_contents('data.csv'));&lt;br /&gt;&lt;br /&gt;//returns an array with the CSV data&lt;br /&gt;print_r($csv-&gt;getArray());&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Exemple B:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$csv = new CSV(';', "\r\n", '"');&lt;br /&gt;//sets up the content through an array&lt;br /&gt;$csv-&gt;setArray(&lt;br /&gt;	array(&lt;br /&gt;		array('col"una1', "colu\r\nna2"),&lt;br /&gt;		array('col;una3', 'coluna4')&lt;br /&gt;	)&lt;br /&gt;);&lt;br /&gt;//retorns string with the CSV representation&lt;br /&gt;print $csv-&gt;getContent();&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com&lt;br /&gt;class CSV{&lt;br /&gt;	var $cellDelimiter;&lt;br /&gt;	var $valueEnclosure;&lt;br /&gt;	var $rowDelimiter;&lt;br /&gt;&lt;br /&gt;	function CSV($cellDelimiter, $rowDelimiter, $valueEnclosure){&lt;br /&gt;		$this-&gt;cellDelimiter = $cellDelimiter;&lt;br /&gt;		$this-&gt;valueEnclosure = $valueEnclosure;&lt;br /&gt;		$this-&gt;rowDelimiter = $rowDelimiter;&lt;br /&gt;		$this-&gt;o = array();&lt;br /&gt;	}&lt;br /&gt;	function getArray(){&lt;br /&gt;		return $this-&gt;o;&lt;br /&gt;	}&lt;br /&gt;	function setArray($o){&lt;br /&gt;		$this-&gt;o = $o;&lt;br /&gt;	}&lt;br /&gt;	function getContent(){&lt;br /&gt;		if(!(($bl = strlen($b = $this-&gt;rowDelimiter)) &amp;&amp; ($dl = strlen($d = $this-&gt;cellDelimiter)) &amp;&amp; ($ql = strlen($q = $this-&gt;valueEnclosure))))&lt;br /&gt;			return '';&lt;br /&gt;		for($o = $this-&gt;o, $i = -1; ++$i &lt; count($o);){&lt;br /&gt;			for($e = 0, $j = -1; ++$j &lt; count($o[$i]);)&lt;br /&gt;				(($e = strpos($o[$i][$j], $q) !== false) || strpos($o[$i][$j], $b) !== false || strpos($o[$i][$j], $d) !== false)&lt;br /&gt;				&amp;&amp; $o[$i][$j] = $q . ($e ? str_replace($q, $q . $q, $o[$i][$j]) : $o[$i][$j]) . $q;&lt;br /&gt;			$o[$i] = implode($d, $o[$i]);&lt;br /&gt;		}&lt;br /&gt;		return implode($b, $o);&lt;br /&gt;	}&lt;br /&gt;	function setContent($s){&lt;br /&gt;		$this-&gt;o = array();&lt;br /&gt;		if(!strlen($s))&lt;br /&gt;			return true;&lt;br /&gt;		if(!(($bl = strlen($b = $this-&gt;rowDelimiter)) &amp;&amp; ($dl = strlen($d = $this-&gt;cellDelimiter)) &amp;&amp; ($ql = strlen($q = $this-&gt;valueEnclosure))))&lt;br /&gt;			return false;&lt;br /&gt;		for($o = array(array('')), $this-&gt;o = &amp;$o, $e = $r = $c = 0, $i = -1, $l = strlen($s); ++$i &lt; $l;){&lt;br /&gt;			if(!$e &amp;&amp; substr($s, $i, $bl) == $b){&lt;br /&gt;				$o[++$r][$c = 0] = '';&lt;br /&gt;				$i += $bl - 1;&lt;br /&gt;			}&lt;br /&gt;			elseif(substr($s, $i, $ql) == $q){&lt;br /&gt;				$e ? (substr($s, $i + $ql, $ql) == $q ?&lt;br /&gt;				$o[$r][$c] .= substr($s, $i += $ql, $ql) : $e = 0)&lt;br /&gt;				: (strlen($o[$r][$c]) == 0 ? $e = 1 : $o[$r][$c] .= substr($s, $i, $ql));&lt;br /&gt;				$i += $ql - 1;&lt;br /&gt;			}&lt;br /&gt;			elseif(!$e &amp;&amp; substr($s, $i, $dl) == $d){&lt;br /&gt;				$o[$r][++$c] = '';&lt;br /&gt;				$i += $dl - 1;&lt;br /&gt;			}&lt;br /&gt;			else&lt;br /&gt;				$o[$r][$c] .= $s[$i];&lt;br /&gt;		}&lt;br /&gt;		return true;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 11 Dec 2006 22:36:10 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3128</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
    <item>
      <title>ProbabilityRandom //PHP Class</title>
      <link>http://snippets.dzone.com/posts/show/2451</link>
      <description>&lt;a href="http://www.phpclasses.org/browse/package/1940.html"&gt;&lt;br /&gt;Class to return items based on their probability.&lt;br /&gt;&lt;br /&gt;Updated version can be found here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;usage&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$prExample = new ProbabilityRandom;&lt;br /&gt;&lt;br /&gt;$prExample-&gt;add( 'I have more chances than everybody :]', 30 );&lt;br /&gt;$prExample-&gt;add( 'I have good chances', 10 );&lt;br /&gt;$prExample-&gt;add( 'I\'m difficult to appear...', 1 );&lt;br /&gt;&lt;br /&gt;for( $x=10; $x--; print $prExample-&gt;get() . '&lt;br /&gt;' );&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com&lt;br /&gt;class ProbabilityRandom {&lt;br /&gt;	#private vars&lt;br /&gt;	var&lt;br /&gt;		$data = array(),&lt;br /&gt;		$universe = 0;&lt;br /&gt;&lt;br /&gt;	#add an item to the list and defines its probability of being chosen&lt;br /&gt;	function add( $data, $probability ){&lt;br /&gt;		$this-&gt;data[ $x = sizeof( $this-&gt;data ) ] = new stdClass;&lt;br /&gt;		$this-&gt;data[ $x ]-&gt;value = $data;&lt;br /&gt;		$this-&gt;universe += $this-&gt;data[ $x ]-&gt;probability = abs( $probability );&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	#remove an item from the list&lt;br /&gt;	function remove( $index ){&lt;br /&gt;		if( $index &gt; -1 &amp;&amp; $index &lt; sizeof( $this-&gt;data ) ) {&lt;br /&gt;			$item = array_splice( $this-&gt;data, $index, 1 );&lt;br /&gt;			$this-&gt;universe -= $item-&gt;probability;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	#clears the class&lt;br /&gt;	function clear(){&lt;br /&gt;		$this-&gt;universe = sizeof( $this-&gt;data = array() );&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	#return a randomized item from the list&lt;br /&gt;	function get(){&lt;br /&gt;		if( !$this-&gt;universe )&lt;br /&gt;			return null;&lt;br /&gt;		$x = round( mt_rand( 0, $this-&gt;universe ) );&lt;br /&gt;		$max = $i = 0;&lt;br /&gt;		do&lt;br /&gt;			$max += $this-&gt;data[ $i++ ]-&gt;probability;&lt;br /&gt;		while( $x &gt; $max );&lt;br /&gt;		return $this-&gt;data[ $i-1 ]-&gt;value;&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sun, 20 Aug 2006 21:35:57 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2451</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
