<!--
    /* Initialise All Global Variables */
  var Surah_Verse = new Array (   7, 286, 200, 176, 120, 165, 206,  75, 129,
                                109, 123, 111,  43,  52,  99, 128, 111, 110,  98,
                                135, 112,  78, 118,  64,  77, 227,  93,  88,  69,
                                 60,  34,  30,  73,  54,  45,  83, 182,  88,  75,
                                 85,  54,  53,  89,  59,  37,  35,  38,  29,  18,
                                 45,  60,  49,  62,  55,  78,  96,  29,  22,  24,
                                 13,  14,  11,  11,  18,  12,  12,  30,  52,  52,
                                 44,  28,  28,  20,  56,  40,  31,  50,  40,  46,
                                 42,  29,  19,  36,  25,  22,  17,  19,  26,  30,
                                 20,  15,  21,  11,   8,   8,  19,   5,   8,   8,
                                 11,  11,   8,   3,   9,   5,   4,   7,   3,   6,
                                  3,   5,   4,   5,   6);

  var Surah_Names = new Array(  "Al-Fatiha",    "Al-Baqara",   "Al-i-Imran",    "An-Nisa",        "Al-Ma'ida",
                                "Al-An'am",     "Al-A'raf",    "Al-Anfal",      "At-Tawba",       "Yunus",
                                "Hud",          "Yusuf",       "Ar-Ra'd",       "Ibrahim",        "Al-Hijr",
                                "An-Nahl",      "Al-Isra",     "Al-Kahf",       "Maryam",         "Ta-Ha",
                                "Al-Anbiya",    "Al-Hajj",     "Al-Muminun",    "An-Noor",        "Al-Furqan",
                                "Ash-Shu'ara",  "An-Naml",     "Al-Qasas",      "Al-Ankabut",     "Ar-Rum",
                                "Luqman",       "As-Sajda",    "Al-Ahzab",      "Saba",           "Fatir",
                                "Ya-Seen",      "As-Saaffat",  "Sad",           "Az-Zumar",       "Ghafir",
                                "Fussilat",     "Ash-Shura",   "Az-Zukhruf",    "Ad-Dukhan",      "Al-Jathiya",
                                "Al-Ahqaf",     "Muhammad",    "Al-Fath",       "Al-Hujurat",     "Qaf",
                                "Adh-Dhariyat", "At-Tur",      "An-Najm",       "Al-Qamar",       "Ar-Rahman",
                                "Al-Waqia",     "Al-Hadid",    "Al-Mujadila",   "Al-Hashr",       "Al-Mumtahina",
                                "As-Saff",      "Al-Jumua",    "Al-Munafiqoon", "At-Taghabun",    "At-Talaq",
                                "At-Tahrim",    "Al-Mulk",     "Al-Qalam",      "Al-Haaqqa",      "Al-Maarij",
                                "Nooh",         "Al-Jinn",     "Al-Muzzammil",  "Al-Muddaththir", "Al-Qiyama",
                                "Al-Insan",     "Al-Mursalat", "An-Naba",       "An-Naziat",      "Abasa",
                                "At-Takwir",    "Al-Infitar",  "Al-Mutaffifin", "Al-Inshiqaq",    "Al-Burooj",
                                "At-Tariq",     "Al-Ala",      "Al-Ghashiya",   "Al-Fajr",        "Al-Balad",
                                "Ash-Shams",    "Al-Lail",     "Ad-Dhuha",      "Al-Inshirah",    "At-Tin",
                                "Al-Alaq",      "Al-Qadr",     "Al-Bayyina",    "Az-Zalzala",     "Al-Adiyat",
                                "Al-Qaria",     "At-Takathur", "Al-Asr",        "Al-Humaza",      "Al-Fil",        
                                "Quraysh",      "Al-Ma'un",    "Al-Kawthar",    "Al-Kafirun",     "An-Nasr",
                                "Al-Masadd",    "Al-Ikhlas",   "Al-Falaq",      "Al-Nas" );
                                  
  var Verse_Offset_Array = new Array(	   0,    7,  293,  493,  669,  789,  954, 1160, 1235, 1364, 1473, 1596,
                                      1707, 1750, 1802, 1901, 2029, 2140, 2250, 2348, 2483, 2595, 2673, 2791,
                                      2855, 2932, 3159, 3252, 3340, 3409, 3469, 3503, 3533, 3606, 3660, 3705,
                                      3788, 3970, 4058, 4133, 4218, 4272, 4325, 4414, 4473, 4510, 4545, 4583,
                                      4612, 4630, 4675, 4735, 4784, 4846, 4901, 4979, 5075, 5104, 5126, 5150,
                                      5163, 5177, 5188, 5199, 5217, 5229, 5241, 5271, 5323, 5375, 5419, 5447,
                                      5475, 5495, 5551, 5591, 5622, 5672, 5712, 5758, 5800, 5829, 5848, 5884,
                                      5909, 5931, 5948, 5967, 5993, 6023, 6043, 6058, 6079, 6090, 6098, 6106,
                                      6125, 6130, 6138, 6146, 6157, 6168, 6176, 6179, 6188, 6193, 6197, 6204,
                                      6207, 6213, 6216, 6221, 6225, 6230);
                                      
  var Tag_Array = new Array( "Select a Tag",     "Allah",            "Quran",    "Messengers", "Fundamentals", 
                             "Halal",            "Haram",            "Heaven",   "Hell",       "Money",        
                             "Parents",          "Children",         "Marriage", "Divorse",    "Fasting",      
                             "Eating",           "Prayer",           "Hajj",     "Charity",    "Clothing",     
                             "Day of Judgement", "Gambling/Alcohol", "Other" );                                      

  var Current_Surah          = 1;
  var Current_Verse          = 1;
  var Current_Mid_Panel      = 1;
  var Verse_Data_Array       = new Array();
  var Panel_Data_Array       = new Array();
  var Original_Panel         = ' ';
  var Login_Ongoing_Flag     = false;
  var Register_Ongoing_Flag  = false;
  var Debug                  = false;

  var NUMBER_OF_PANELS       = 3;
  var VERSE_WINDOW_SIZE      = 9;
  var VERSE_WINDOW_OFFSET    = (VERSE_WINDOW_SIZE - 1) / 2;
  var VERSE_ARRAY_MAX_OFFSET = 6236;
  var NUM_OF_SURAHS          = 114;
//  var ISLAMICAPPS_PATH       = 'http://islamicapps.com/';
  var ISLAMICAPPS_PATH  = '../';

<!-- // Required to be compliant with XHTML-->
 
// *************************************************************************************************
 
  function Verse_Data(Surah, Verse, TextLoadedFlag, Text)
  {
    this.Surah          = Surah;
    this.Verse          = Verse;
    this.TextLoadedFlag = TextLoadedFlag;
    this.Text           = Text;
  } 

// *************************************************************************************************

  function Panel_Data(Surah, Verse, PanelWaitingFlag, Id)
  {
    this.Surah            = Surah;
    this.Verse            = Verse;
    this.PanelWaitingFlag = PanelWaitingFlag;
    this.Id               = Id;
  } 
  
  var cbFunc = function( name, type ) 
  {
     javascript( "alert('Done: "+name+" faded"+type+"');" );
  };  

// *************************************************************************************************

  function removeNL(s)
  { 
    return s.replace(/\r|\n|\r\n/g, ""); 
  }
  
// *************************************************************************************************

  function Offset_Panel(Panel, Offset)
  {
    if (Offset > 0)
    {
      Panel++ ;
      
      if (Panel > (NUMBER_OF_PANELS - 1)) Panel = 0;
    }
    else
    {
      Panel-- ;
      
      if (Panel < 0) Panel = NUMBER_OF_PANELS - 1;
    }
    return Panel;
  }

// *************************************************************************************************
  
  function Offset_Surah_And_Verse( Surah, Verse, Offset )
  {
    var i;
    
    for (i = 0; i < Math.abs( Offset ); i++ )
    {
      if ( Offset > 0 )
      {
        if ( Verse < Surah_Verse[Surah - 1] )
        {
          Verse++ ;
        }
        else if ( Surah < NUM_OF_SURAHS )
        {
          Surah++ ;
          Verse = 1;
        }
      }
      else
      {
        if ( 1 == Verse )
        {
          if ( Surah > 1 )
          {
            Surah-- ;
            Verse = Surah_Verse[Surah - 1];
          }
        }
        else
        {
          Verse-- ;
        }
      }
    }
    return [ Surah, Verse ];
  }

// *************************************************************************************************
                                      
  function Surah_Verse_To_Offset(Surah, Verse) 
  {
    return (Verse_Offset_Array[Surah - 1] + Verse) - 1;
  }                                      

// *************************************************************************************************
  
  function VerseTextCallBackFunction(http_request, Surah, Verse) 
  {
    if (http_request.readyState == 4) 
    {
      if (http_request.status == 200) 
      {
        var i;
        var Offset                              = Surah_Verse_To_Offset(Surah, Verse)
//        Verse_Data_Array[Offset].Text           = '<img src="http://www.islamicity.com/MOSQUE/ARABICSCRIPT/AYAT/' + Surah + '/' + Surah + '_' + Verse + '.gif" width=320px><br />' + http_request.responseText.substring(8, http_request.responseText.length);
        Verse_Data_Array[Offset].Text           = http_request.responseText.substring(8, http_request.responseText.length);
        Verse_Data_Array[Offset].TextLoadedFlag = true;
        
        for (i = 0; i < NUMBER_OF_PANELS; i++ )
        {
          if ( true  == Panel_Data_Array[i].PanelWaitingFlag && 
               Surah == Panel_Data_Array[i].Surah &&
               Verse == Panel_Data_Array[i].Verse )
          {
            Panel_Data_Array[i].PanelWaitingFlag = false;
            document.getElementById( Panel_Data_Array[i].Id ).innerHTML =  Verse_Data_Array[Offset].Text;
          }
        }
      }
      else 
      {
//        alert('ERROR: AJAX request status = ' + http_request.status + ', Surah = ' + Surah + ', Verse = ' + Verse);
      }
    }
  }

// *************************************************************************************************
 
  function xmlhttpPost( strURL, Surah, Verse ) 
  {
    var xmlHttpReq = false;
    // Mozilla/Safari
    if (window.XMLHttpRequest) 
    {
      xmlHttpReq = new XMLHttpRequest();

      if (xmlHttpReq.overrideMimeType) 
      {
        xmlHttpReq.overrideMimeType('text/xml');
        // See note below about this line
      }
    }
    if (!xmlHttpReq) 
    {
      alert('ERROR AJAX:( Cannot create an XMLHTTP instance');
      return false;
    }   
    xmlHttpReq.open('GET', strURL, true);
    xmlHttpReq.setRequestHeader("Content-Type", "text/plain");
    xmlHttpReq.onreadystatechange = 
      function() 
      { 
        VerseTextCallBackFunction( xmlHttpReq, Surah, Verse ); 
      };
    xmlHttpReq.send("");
  }

// *************************************************************************************************
 
  function Next_Verse( Source_Panel, Destination_Panel, Direction )
  {
    var Verse = Current_Verse;
    var Surah = Current_Surah;

    var a = Offset_Surah_And_Verse( Surah, Verse, 1 );  

    if (Current_Surah != a[0] || Current_Verse != a[1])
    {
      slidePanel( Source_Panel, Destination_Panel, Direction );

      Current_Surah = a[0];
      Current_Verse = a[1];  
      
      Current_Mid_Panel = Offset_Panel( Current_Mid_Panel, 1 );
      
      setTimeout("Check_Slide_Complete( false, false )", 100);
    }
  }

// *************************************************************************************************

  function Previous_Verse( Source_Panel, Destination_Panel, Direction )
  {
    var Verse = Current_Verse;
    var Surah = Current_Surah;
    
    var a = Offset_Surah_And_Verse( Surah, Verse, -1 );  

    if (Current_Surah != a[0] || Current_Verse != a[1])
    {
      slidePanel( Source_Panel, Destination_Panel, Direction );

      Current_Surah = a[0];
      Current_Verse = a[1];  

      Current_Mid_Panel = Offset_Panel( Current_Mid_Panel, -1 );

      setTimeout("Check_Slide_Complete( false, false )", 100);
    }
  }

// *************************************************************************************************

  function Check_Slide_Complete( Panel_Fill_Flag, Verse_Panel_Fill_Flag )
  {
    if (true == slide_ongoing_flag)
    {
      setTimeout("Check_Slide_Complete( " + Panel_Fill_Flag + ", " + Verse_Panel_Fill_Flag + ")", 100);
    }
    else
    {
      if (true == Verse_Panel_Fill_Flag)
      {
        Fill_Verse_Panel( );
      }
      else
      {
        Order_Verse_Text_If_Needed( );
        Fill_In_Panels( Panel_Fill_Flag );
      }
    }
  }

// *************************************************************************************************
  
  function Goto_Surah_And_Verse( Surah, Verse )
  {
    Current_Surah = Surah;
    Current_Verse = Verse;

    Order_Verse_Text_If_Needed();
    Fill_In_Panels( true );
  }

// *************************************************************************************************
  
  function Init()
  {
window.console.log("Init() Start:" + VERSE_ARRAY_MAX_OFFSET);
    var i, Surah, Verse;

    Surah = 1; 
    Verse = 1;

    for (i = 0; i < VERSE_ARRAY_MAX_OFFSET; i++ )
    {
      Verse_Data_Array.push( new Verse_Data(Surah, Verse, false, "") );

      var a  = Offset_Surah_And_Verse(Surah, Verse, 1);  
      Surah  = a[0];
      Verse  = a[1];
    }
window.console.log("Init() 1");

    for (i = 0; i < NUMBER_OF_PANELS; i++ )
    {
      Panel_Data_Array.push(new Panel_Data(1, 1, false, "panel_text_" + i));
    }
window.console.log("Init() 2");
    
    var Temp = readCookie( 'Surah' );
    if (Temp != null)
    {
      Current_Surah = parseInt( Temp );
    }
    Temp = readCookie( 'Verse' );
    if (Temp != null)
    {
      Current_Verse = parseInt( Temp );
    }
window.console.log("Init() 3");
    
//window.console.log("Init() " + Temp);
    Fill_Surah_Menu_Item( );
    Fill_Login_Info( 'account' );
window.console.log("Init() 4");
    
    var myform = document.forms.addbookmarkForm.tagOption;
    for (i = 0; i < Tag_Array.length; i++ )
    {
      myform.options[i] = new Option( Tag_Array[i] );
    }
    
    Bookmark_Init( );
    Goto_Surah_And_Verse( Current_Surah, Current_Verse );
window.console.log("Init() 5");
    hideAddressBar( );
  }

// *************************************************************************************************

  function UnInit( )
  {
    eraseCookie( 'Surah' );
    eraseCookie( 'Verse' );
    
    createCookie( 'Surah', Current_Surah, 100 ); 
    createCookie( 'Verse', Current_Verse, 100 ); 
//window.console.log("UnInit() ");
  }
  
// *************************************************************************************************

  function Order_Verse_Text_If_Needed()
  {
    var Offset     = Surah_Verse_To_Offset(Current_Surah, Current_Verse);
    var Loop_Start = Offset - VERSE_WINDOW_OFFSET ;
    var Loop_End   = Offset + VERSE_WINDOW_OFFSET;
    
    if (Loop_Start < 0)                             Loop_Start = 0;
    if (Loop_End   >= (VERSE_ARRAY_MAX_OFFSET - 1)) Loop_End   = VERSE_ARRAY_MAX_OFFSET - 1;

    var a = Offset_Surah_And_Verse(Current_Surah, Current_Verse, Loop_Start - Offset);  

    var Surah = a[0];
    var Verse = a[1];    
    
    for (i = Loop_Start; i <= Loop_End; i++ )
    {
      if (false == Verse_Data_Array[i].TextLoadedFlag)
      {
        xmlhttpPost(ISLAMICAPPS_PATH + 'yusuf_split/yusuf_'+Surah+'_'+Verse+'.txt', Surah, Verse);
      }
      
      var a = Offset_Surah_And_Verse(Surah, Verse, 1);  
      
      Surah = a[0];
      Verse = a[1];
    }
  }

// *************************************************************************************************

  function Fill_In_Panels( Update_Mid_Panel_Flag )
  {
    var Offset  = 0;
    var a       = Offset_Surah_And_Verse(Current_Surah, Current_Verse, -1);  
    var Surah   = a[0];
    var Verse   = a[1];    
    var i       = 0; 
    var POffset = Current_Mid_Panel;
    var Text    = "";
    var EndLoop = 0;

//window.console.log("Initial Surah: " + Current_Surah + ", Verse: " + Current_Verse);
//window.console.log("Initial Mid Panel: " + POffset);
    if (Current_Surah == 1 && Current_Verse == 1)
    {
      EndLoop = NUMBER_OF_PANELS - 1;
    }
    else
    {
      EndLoop = NUMBER_OF_PANELS;
      POffset = Offset_Panel(POffset, -1);    
    }
    
    for (i = 0; i < EndLoop; i++ )
    {
      if ((POffset == Current_Mid_Panel && Update_Mid_Panel_Flag == true) || (POffset != Current_Mid_Panel))
      {
        Panel_Data_Array[POffset].Surah = Surah;
        Panel_Data_Array[POffset].Verse = Verse;
        
        Offset = Surah_Verse_To_Offset( Surah, Verse );
        
        if (false == Verse_Data_Array[Offset].TextLoadedFlag)
        {
          Text                                       = 'Please Wait: Loading Text... <img src="images/ajax-loader.gif" />';
          Panel_Data_Array[POffset].PanelWaitingFlag = true;
        }
        else
        {
          Text                                       = Verse_Data_Array[Offset].Text;
          Panel_Data_Array[POffset].PanelWaitingFlag = false;
        }
        if ( true == Debug )
        {
          Text = "Mid: " + Current_Mid_Panel + ", POff: " + POffset + ", CSurah: " + Current_Surah + ", CVerse: " + Current_Verse + "<br/>" + Text;
        }
        document.getElementById( Panel_Data_Array[POffset].Id ).innerHTML = Text;
        document.getElementById('verse_info_' + POffset).innerHTML = '<b>' + Surah + "." + Surah_Names[Surah - 1] + " (" + Verse + "/" + Surah_Verse[Surah - 1] + ")</b>";
      }
      
      var a = Offset_Surah_And_Verse(Surah, Verse, 1);  
      
      Surah = a[0];
      Verse = a[1];

      POffset = Offset_Panel( POffset, 1 );    
    }
  }

// *************************************************************************************************

  function Fill_Surah_Menu_Item( )
  {
    var i;
    var element        = 0;
    var itemElement    = 0;
    var subitemElement = 0;
          
    element = document.createElement("ul");
    element.setAttribute("id",       "surahs");
    element.setAttribute("title",    "Surahs");
    element.setAttribute("selected", "false");
    
    for (i = 0; i < NUM_OF_SURAHS; i++ )
    {
      itemElement    = document.createElement("li");   
      subitemElement = document.createElement("a");
      subitemElement.setAttribute("href", "#viewer");
      subitemElement.setAttribute("onclick", "Goto_Surah_And_Verse(" + (i + 1) + ", 1)");
      subitemElement.innerText = (i + 1) +':' + Surah_Names[i];      
      
      itemElement.appendChild(subitemElement);
      element.appendChild(itemElement);
    }

    document.getElementsByTagName("body")[0].appendChild(element);
  }

// *************************************************************************************************

  function Fill_Verse_Menu_Item( )
  {
    var i;
    var element        = 0;
    var itemElement    = 0;
    var subitemElement = 0;
    var mainNode       = document.getElementById( 'verses' );
  
    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    
  
    for (i = 0; i < Surah_Verse[Current_Surah - 1]; i++ )
    {
      itemElement    = document.createElement("li");   
      subitemElement = document.createElement("a");
      subitemElement.setAttribute("href", "#viewer");
      subitemElement.setAttribute("onclick", "Goto_Surah_And_Verse(" + Current_Surah + ", " + (i + 1) + ")");
      subitemElement.innerText =  Current_Surah + ':' + (i + 1) + ' (' + Surah_Names[Current_Surah - 1] + ')';      
      
      itemElement.appendChild( subitemElement );
      mainNode.appendChild( itemElement );
    }

//    document.getElementsByTagName("body")[0].appendChild(element);
  }
  
// *************************************************************************************************
  
  function Do_Search( ElementId, PageId, FormId )
  {
    if (true == tmt_validateForm( document.getElementById( FormId ) ))
    {
      var params = "message=9,*,Null," + document.forms.searchForm.searchtext.value.toLowerCase();

      MsgSendFunction( "bookmarks/external_receive.php", params, ElementId, "" );
      iui.showPageById( PageId );
    }  
  }

// *************************************************************************************************
    
  function Fill_Search_Results( ElementId, Msg )
  {
    var i;
    var element        = 0;
    var itemElement    = 0;
    var subitemElement = 0;
    var mainNode       = document.getElementById( ElementId );
   
    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    
    
    for (i = 2; i < (Msg[1] * 3); i += 3 )
    {
      itemElement    = document.createElement("li");   
      subitemElement = document.createElement("a");
      subitemElement.setAttribute("href", "#viewer");
      subitemElement.setAttribute("onclick", "Goto_Surah_And_Verse(" + Msg[i] + ", " + Msg[i + 1] + ")");
      subitemElement.innerText =  Msg[i] + ':' + Msg[i + 1] + ' (' + Surah_Names[Msg[i] - 1] + ')';      
      
      itemElement.appendChild(subitemElement);
      mainNode.appendChild(itemElement);
    }    
  }

// *************************************************************************************************
  
  function Move_Verse_Panel( Source_Panel, Direction )
  {
    var Destination_Panel;
    
    if ( 'panel_3' != Source_Panel )
    {
      Original_Panel    = Source_Panel;
      Destination_Panel = 'panel_3';
      slidePanel( Source_Panel, Destination_Panel, Direction );
      
      setTimeout("Check_Slide_Complete( true, true )", 500);
    }
    else
    {
      Clear_Verse_Panel( );
      Destination_Panel = Original_Panel;
      slidePanel( Source_Panel, Destination_Panel, Direction );

      setTimeout("Check_Slide_Complete( true, false )", 500);
    }
  }

// *************************************************************************************************
  
  function Clear_Verse_Panel( )
  {
    var mainNode = document.getElementById( 'panel_text_3' );

    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    
  }

// *************************************************************************************************
  
  function Fill_Verse_Panel( )
  {
    var i;
    var element        = 0;
    var itemElement    = 0;
    var subitemElement = 0;
    var mainNode       = document.getElementById( 'panel_text_3' );
    var x_pos          = 0;
    var y_pos          = 0;
    var x_counter      = 1;
  
    for (i = 0; i < Surah_Verse[Current_Surah - 1]; i ++ )
    {
      itemElement    = document.createElement("button");   
//      itemElement.setAttribute("class", "blue button");
      itemElement.setAttribute("style", "position:absolute;top:" + y_pos + "px;right:" + (255 - x_pos) + "px;width:30px;text-align:center;");
      itemElement.setAttribute("onclick", "Current_Verse = "+ (i + 1) + "; Move_Verse_Panel('panel_3', 'down') ");
      itemElement.innerText =  i + 1;
      
      mainNode.appendChild( itemElement );
      
      x_counter++ ;
      x_pos    += 65;
      
      if (x_counter > 5)
      {
        x_counter =  1;
        y_pos    += 35;
        x_pos     =  0;
      }
    }    
  }
  
// *************************************************************************************************
  function Do_Logout( ElementId )
  {
    eraseCookie( USER_ID_COOKIE_NAME );
    eraseCookie( SESSION_ID_COOKIE_NAME );
    
    User_Name  = "";
    User_Id    = "";
    Session_Id = "";
    
    Fill_Bookmark_Info( 'bookmarkInfo' );
  }

// *************************************************************************************************
  
  function Do_Login( ElementId, PageId, FormId )
  {
    if (true == tmt_validateForm( document.getElementById( FormId ) ))
    {
      Login_Ongoing_Flag = true;
      Fill_Login_Info( 'account' );
    
      var params = "";
      
      params += "&submitted=" + encodeURI( document.forms.loginForm.submitted.value );
      params += "&email="     + encodeURI( document.forms.loginForm.emailaddress.value );       
      params += "&pass="      + encodeURI( document.forms.loginForm.password.value );       
      
      MsgSendFunction( "login/login_minimal.php", params, ElementId, "" );
      iui.showPageById( PageId );
    }
  }
  
// *************************************************************************************************
  
  function Handle_Login_Result( ElementId, Msg )
  {
    Login_Ongoing_Flag = false;
    
    Number_Of_User_Bookmarks = 0;

    if ( Msg[1] == "Success" )
    {
      User_Name  = Msg[2];
      User_Id    = Msg[3];
      Session_Id = Msg[4];
  
      iui.showPageById( ElementId );
      eraseCookie( USER_ID_COOKIE_NAME );
      eraseCookie( SESSION_ID_COOKIE_NAME );
      
      createCookie( USER_ID_COOKIE_NAME,    User_Id,    100 ); 
      createCookie( SESSION_ID_COOKIE_NAME, Session_Id, 100 ); 
      
      Get_Bookmark_Details( 'userbookmarktags', 'userbookmarkspertag', true );
    }
    else
    {
      alert( Msg[2] );
    }

    Fill_Login_Info( 'account' );
    Fill_Bookmark_Info( 'bookmarkInfo' );
  }

// *************************************************************************************************
  
  function Handle_Authentication_Result ( ElementId, Msg )
  {
    Login_Ongoing_Flag = false;
    
    Number_Of_User_Bookmarks = 0;

    if ( Msg[1] == "Success" )
    {
      User_Name  = Msg[2];
      alert( 'Welcome ' + User_Name );
      Get_Bookmark_Details( 'userbookmarktags', 'userbookmarkspertag', true );
    }
    else
    {
      eraseCookie( USER_ID_COOKIE_NAME );
      eraseCookie( SESSION_ID_COOKIE_NAME );
      
      User_Name  = "";
      User_Id    = "";
      Session_Id = "";
    }
    
    Fill_Login_Info( 'account' );
    Fill_Bookmark_Info( 'bookmarkInfo' );
  }

// *************************************************************************************************
  
  function Do_Register( ElementId, PageId, FormId )
  {
    if (true == tmt_validateForm( document.getElementById( FormId ) ))
    {
      Register_Ongoing_Flag = true;
      Fill_Login_Info( 'account' );
      
      var params = "";
        
      params += "&submitted="  + encodeURI( document.forms.registerForm.submitted.value );
      params += "&first_name=" + encodeURI( document.forms.registerForm.first_name.value );       
      params += "&last_name="  + encodeURI( document.forms.registerForm.last_name.value );       
      params += "&email="      + encodeURI( document.forms.registerForm.email.value );       
      params += "&password1="  + encodeURI( document.forms.registerForm.password1.value );       
      params += "&password2="  + encodeURI( document.forms.registerForm.password2.value );       
      
      MsgSendFunction( "login/register_minimal.php", params, ElementId, "" );
      iui.showPageById( PageId );
    }
  }
  
// *************************************************************************************************
  
  function Handle_Register_Result( ElementId, Msg )
  {
    Register_Ongoing_Flag = false;
    
    if ( Msg[1] == "Success" )
    {
      alert( Msg[2] );
    }
    else
    {
      alert( Msg[2] );
    }
    Fill_Login_Info( 'account' );
    Fill_Bookmark_Info( ElementId );
  }

// *************************************************************************************************
  
  function Fill_Login_Info( ElementId )
  {
    var element           = 0;
    var itemElement       = 0;
    var subitemElement    = 0;
    var subsubitemElement = 0;
    var mainNode          = document.getElementById( ElementId );
    
    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    

    itemElement    = document.createElement( "li" );   
    subitemElement = document.createElement( "a" );

    if ( true == Login_Ongoing_Flag)
    {
      subitemElement.innerText =  'Login... ';      
      subsubitemElement = document.createElement( "img" );
      subsubitemElement.setAttribute( "src", "images/ajax-loader.gif" );
      subitemElement.appendChild( subsubitemElement );
    }
    else
    {
      subitemElement.setAttribute("href", "#loginForm");
      subitemElement.innerText =  'Login';      
    }

    itemElement.appendChild( subitemElement );
    mainNode.appendChild( itemElement );

    itemElement    = document.createElement( "li" );   
    subitemElement = document.createElement( "a" );
    
    if ( true == Register_Ongoing_Flag)
    {
      subitemElement.innerText =  'Register... ';      
      subsubitemElement = document.createElement( "img" );
      subsubitemElement.setAttribute( "src", "images/ajax-loader.gif" );
      subitemElement.appendChild( subsubitemElement );
    }    
    else
    {
      subitemElement.setAttribute("href", "#registerForm");
      subitemElement.innerText =  'Register';      
    }
    
    itemElement.appendChild( subitemElement );
    mainNode.appendChild( itemElement );

    itemElement    = document.createElement( "li" );   
    subitemElement = document.createElement( "a" );
    
    subitemElement.setAttribute( "href", "#retrievePassword" );
    subitemElement.innerText =  'Retrieve Password';      
    
    itemElement.appendChild( subitemElement );
    mainNode.appendChild( itemElement );
  }
  
  function addEvent(obj, type, fn){
  	if(obj.addEventListener){
  		obj.addEventListener(type, fn, false);
  	}
  	else if(obj.attachEvent){
  		obj["e" + type + fn] = fn;
  		obj[type + fn] = function(){
  				obj["e" + type + fn](window.event);
  			}
  		obj.attachEvent("on" +type, obj[type+fn]);
  	}
  }  

// *************************************************************************************************

  function createCookie( name, value, days ) 
  {
    if (days) 
    {
      var date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
  }

// *************************************************************************************************

  function readCookie( name ) 
  {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) 
    {
      var c = ca[i];
      while (c.charAt(0)==' ') c = c.substring(1,c.length);
      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
  }

// *************************************************************************************************

  function eraseCookie( name ) 
  {
    createCookie(name,"",-1);
  }  

// *************************************************************************************************

  var Shared_Bookmark_Info_Loaded = false;
  var Number_Of_Shared_Bookmarks  = 0;
  var User_Name                   = "";
  var User_Id                     = "";
  var Session_Id                  = "";
  var User_Bookmark_Info_Loaded   = false;
  var Number_Of_User_Bookmarks    = 0;
  var USER_ID_COOKIE_NAME         = 'userid';
  var SESSION_ID_COOKIE_NAME      = 'sessionid';

// *************************************************************************************************
/* BOOKMARK CODE */

  function Bookmark_Init( )
  {
    var Temp2 = readCookie( USER_ID_COOKIE_NAME );
    if (Temp2 != null)
    {
      User_Id = Temp2;
    }

    var Temp3 = readCookie( SESSION_ID_COOKIE_NAME );
    if (Temp3 != null)
    {
      Session_Id = Temp3;
    }
    
    if ((Temp2 != null) && (Temp3 != null))
    {
      Login_Ongoing_Flag = true;
    
      var params = "";
      
      params += "&submitted=TRUE"
      params += "&user_id="    + User_Id;
      params += "&session_id=" + Session_Id;
      
      MsgSendFunction( "login/authenticate_minimal.php", params, 'bookmarkInfo', "" );
    }
    Fill_Bookmark_Info( 'bookmarkInfo' );
    Get_Bookmark_Details( 'allbookmarktags', 'allbookmarkspertag', false );    
  }
  
// *************************************************************************************************
  
  function MsgReceiveCallBackFunction( http_request, ElementId, DestElementId ) 
  {
    if (http_request.readyState == 4) 
    {
      if (http_request.status == 200) 
      {
        var i;
        var msg = removeNL(http_request.responseText);
        msg     = msg.split(",");
//     alert(msg);        
        /* BOOKMARK_INFO_RES */
        if (8 == msg[0])
        {
          if (msg[1] < msg.length)
          {
            Fill_Bookmark_Details( ElementId, DestElementId, msg );
          }
        }
        /* BOOKMARK_DOWNLOAD_RES */
        else if (4 == msg[0])
        {
          Fill_Bookmarks_For_Tag( ElementId, msg );
        }
        /* SEARCH_QURAN_TEXT_RES */
        else if (10 == msg[0])
        {
          Fill_Search_Results( ElementId, msg );
        }
        /* LOGIN_INFO_RES */
        else if (11 == msg[0])
        {
          Handle_Login_Result( ElementId, msg );
        }
        /* REGISTER_INFO_RES */
        else if (12 == msg[0])
        {
          Handle_Register_Result( ElementId, msg );
        }
        /* AUTHENTICATE_INFO_RES */
        else if (13 == msg[0])
        {
          Handle_Authentication_Result( ElementId, msg );
        }
        /* BOOKMARK_ADD_RES */
        else if (15 == msg[0])
        {
          Handle_Bookmark_Add_Result( ElementId, msg );
        }
        /* BOOKMARK_DELETE_RES */
        else if (17 == msg[0])
        {
          Handle_Bookmark_Delete_Result( ElementId, msg );
        }
      }
      else 
      {
        alert('ERROR: AJAX request status = ' + http_request.status);
      }
    }
  }
  
// *************************************************************************************************

  function MsgSendFunction( dest, params, ElementId, DestElementId )
  {
    var xmlHttp = false;
  
    var URL = ISLAMICAPPS_PATH + dest;

    // Firefox, Opera 8.0+, Safari, IE7+
    xmlHttp = new XMLHttpRequest(); // xmlHttp is now a XMLHttpRequest.
    // Try to get the right object for different browser
/*    try 
    {
      // Firefox, Opera 8.0+, Safari, IE7+
      xmlHttp = new XMLHttpRequest(); // xmlHttp is now a XMLHttpRequest.
    } 
    catch (e) 
    {
      // Internet Explorer
      try 
      {
        xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      } 
      catch (e) 
      {
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    }
     */
    xmlHttp.open("POST", URL, true);

    //Send the proper header information along with the request
    xmlHttp.setRequestHeader("Content-type",   "application/x-www-form-urlencoded");
//NOT IN SAFARI    xmlHttp.setRequestHeader("Content-length", params.length);
    xmlHttp.setRequestHeader("Connection",     "close");

    xmlHttp.onreadystatechange = 
      function() 
      { 
        MsgReceiveCallBackFunction( xmlHttp, ElementId, DestElementId ); 
      };
    
    xmlHttp.send( params ); // Since there is no supplied form, null takes its place 
                          // as a new form.
  }
  
// *************************************************************************************************
  
  function Get_Bookmark_Details( ElementId, DestElementId, UserBookmarkFlag )
  {
    var params = "";
    
    Reset_Element( ElementId, "Retrieving... " );

    if (false == UserBookmarkFlag)
    {
      params = "message=7,*";
    }
    else    
    {
      if ("" != User_Name)
      {
        params = "message=7," + User_Id + "," + Session_Id;
      }
    }
    
    if ("" != params)
    {
      MsgSendFunction( "bookmarks/external_receive.php", params, ElementId, DestElementId );
    }
  }
  
// *************************************************************************************************

  function Get_Bookmarks_For_Tag( ElementId, Tag, UserBookmarkFlag )
  {
    var params = "";

    Reset_Element( ElementId, "Retrieving... " );

    if (false == UserBookmarkFlag)
    {
      params = "message=3,*,Null," + Tag;
    }
    else    
    {
      if ("" != User_Name)
      {
        params = "message=3," + User_Id + "," + Session_Id + "," + Tag;
      }
    }
    
    if ("" != params)
    {
      MsgSendFunction( "bookmarks/external_receive.php", params, ElementId, "" );
    }
  }
  
// *************************************************************************************************
  
  function Fill_Bookmark_Details( ElementId, DestElementId, Msg )
  {
    var i;
    var element          = 0;
    var itemElement      = 0;
    var subitemElement   = 0;     
    var mainNode         = document.getElementById( ElementId );
    var numbookmarks     = 0;
    var UserBookmarkFlag = true;

    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    

    if ( 'allbookmarktags' == ElementId )
    {
      UserBookmarkFlag = false;
    }
    for ( i = 2; i <= (Msg[1] * 2); i += 2 )
    {
      itemElement    = document.createElement( "li" );   
      subitemElement = document.createElement( "a" );
      subitemElement.setAttribute( "href", "#" + DestElementId );
      subitemElement.setAttribute( "onclick", "Get_Bookmarks_For_Tag('" + DestElementId + "', '" + Msg[i] + "', " + UserBookmarkFlag + ")" );
      subitemElement.innerText = 'Tag: ' + Msg[i] + ' (' + Msg[i + 1] + ')';      
      
      itemElement.appendChild( subitemElement );
      mainNode.appendChild( itemElement );
      
      numbookmarks += parseInt( Msg[i + 1] );
    }
    if ( 'allbookmarktags' == ElementId )
    {
      Shared_Bookmark_Info_Loaded = true;
      Number_Of_Shared_Bookmarks  = numbookmarks;
    }
    else
    {
      User_Bookmark_Info_Loaded = true;
      Number_Of_User_Bookmarks  = numbookmarks;
    }
    
    Fill_Bookmark_Info( 'bookmarkInfo' );
  }

// *************************************************************************************************

  function Fill_Bookmark_Info( ElementId )
  {
    var element           = 0;
    var itemElement       = 0;
    var subitemElement    = 0;
    var subsubitemElement = 0;
    var mainNode          = document.getElementById( ElementId );
    
    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    

    itemElement    = document.createElement( "li" );   
    subitemElement = document.createElement( "a" );

    if ( "" == User_Name )
    {
      subitemElement.setAttribute("href", "#account");
      subitemElement.innerText =  'Your Bookmarks... (Login)';      
    }    
    else
    {
      if ( false == User_Bookmark_Info_Loaded )
      {
        subitemElement.setAttribute( "href", "#bookmarkInfo" );
        subitemElement.innerText =  User_Name + '\'s Bookmarks... ';      
        subsubitemElement        = document.createElement( "img" );
        subsubitemElement.setAttribute( "src", "images/ajax-loader.gif" );
        subitemElement.appendChild( subsubitemElement );
      }
      else
      {
        subitemElement.setAttribute( "href", "#userbookmarktags" );
        subitemElement.innerText = User_Name + '\'s Bookmarks (' + Number_Of_User_Bookmarks + ')';      
      }
    }
    
    itemElement.appendChild(subitemElement);
    mainNode.appendChild(itemElement);
    
    itemElement    = document.createElement("li");   
    subitemElement = document.createElement("a");
    
    if ( false == Shared_Bookmark_Info_Loaded )
    {
      subitemElement.setAttribute( "href", "#bookmarkInfo" );
      subitemElement.innerText =  'Shared Bookmarks... ';      
      subsubitemElement        = document.createElement( "img" );
      subsubitemElement.setAttribute( "src", "images/ajax-loader.gif" );
      subitemElement.appendChild( subsubitemElement );
    }      
    else
    {
      subitemElement.setAttribute( "href", "#allbookmarktags" );
      subitemElement.innerText =  'Shared Bookmarks (' + Number_Of_Shared_Bookmarks + ')';      
    }
    
    itemElement.appendChild(subitemElement);
    mainNode.appendChild(itemElement);

    if ( "" != User_Name )
    {
      itemElement    = document.createElement("li");   
      subitemElement = document.createElement("a");
      subitemElement.setAttribute( "href",    "#bookmarkInfo" );
      subitemElement.setAttribute( "onclick", "Do_Logout( 'bookmarkInfo' )" );
      subitemElement.innerText = 'Logout ' + User_Name;      
      itemElement.appendChild(subitemElement);
      mainNode.appendChild(itemElement);
    }
  }
  
// *************************************************************************************************
  
  function Fill_Bookmarks_For_Tag( ElementId, Msg )
  {
    var i;
    var element        = 0;
    var itemElement    = 0;
    var subitemElement = 0;
    var mainNode       = document.getElementById( ElementId );
   
    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    
    
    for (i = 2; i < (Msg[1] * 4); i += 4 )
    {
      itemElement    = document.createElement( "li" );   
      itemElement.setAttribute( "id", "bookmark_number_" + Msg[i + 3] );   
      subitemElement = document.createElement( "a" );
      
      subitemElement.setAttribute( "href",    "#viewer" );
      subitemElement.setAttribute( "onclick", "Goto_Surah_And_Verse(" + Msg[i] + ", " + Msg[i + 1] + ")" );
      
      if ( 'userbookmarkspertag' == ElementId )
      {
        subitemElement.setAttribute( "style", "margin-left:35px" );
      }
      
      subitemElement.innerHTML = Msg[i] + ':' + Msg[i + 1] + ' (' + Surah_Names[Msg[i] - 1] + ')';      

      if ( 'userbookmarkspertag' == ElementId )
      {
        itemElement.innerHTML = '<img style="float:left;margin-left:5px;margin-right:15px" src="images/delete.jpg" onclick="Remove_Bookmark( ' + Msg[i] + ', ' + Msg[i + 1] + ', ' + Msg[i + 3] + ' )">';
      }

      itemElement.appendChild( subitemElement );
      mainNode.appendChild( itemElement );
    }    
  }
  
// *************************************************************************************************
  
  function Reset_Element( ElementId, NewText )
  {
    var element        = 0;
    var itemElement    = 0;
    var subitemElement = 0;
    var mainNode       = document.getElementById( ElementId );
   
    while ( mainNode.firstChild ) 
    {
      mainNode.removeChild( mainNode.firstChild );
      mainNode.firstChild = null;
    }    
    
    if ( NewText.length > 0 )
    {
      itemElement    = document.createElement("li");   
      subitemElement = document.createElement("img");
      subitemElement.setAttribute("src", "images/ajax-loader.gif");
      itemElement.innerText = NewText;
      itemElement.appendChild( subitemElement );
      mainNode.appendChild(itemElement);
    }
  }
  
// *************************************************************************************************
  function Add_Bookmark_Clicked( PageId, accountPageId )
  {
    if ( "" == User_Name )
    {
      var answer = confirm( "To add and share bookmarks you need a free account with IslamicApps.com. Login to your account or Register a new one?" );
      
      if (answer)
      {
        iui.showPageById( accountPageId );
      }
    }
    else
    {
      iui.showPageById( PageId );
    }
  }
  
// *************************************************************************************************

  function Add_Bookmark( PageId, FormId )
  {
    if (true == tmt_validateForm( document.getElementById( FormId ) ))
    {
      var myform = document.forms.addbookmarkForm.tagOption;
      for (i = 0; i < myform.length; i++ )
      {
        if ((myform.options[i] != null) && (myform.options[i].selected == true)) 
        {
          var Tag = myform.options[i].value;
        }
      }
      var params = "message=14," + User_Id + "," + Session_Id + "," + Current_Surah + "," + Current_Verse + "," + Tag;
    
      MsgSendFunction( "bookmarks/external_receive.php", params, "", "" );
      
      iui.showPageById( PageId );
    }
  }
  
// *************************************************************************************************

  function Handle_Bookmark_Add_Result( ElementId, msg )
  {
    Get_Bookmark_Details( 'userbookmarktags', 'userbookmarkspertag', true );
    Get_Bookmark_Details( 'allbookmarktags', 'allbookmarkspertag', false );    
  }
  
// *************************************************************************************************

  function Remove_Bookmark( Surah, Verse, Bookmark_Id )
  {
    var answer = confirm( "Are you sure you want to delete bookmark (" + Surah + ":" + Verse + ")?" );
      
    if ( answer )
    {
      var params = "message=16," + User_Id + "," + Session_Id + "," + Bookmark_Id;
    
      MsgSendFunction( "bookmarks/external_receive.php", params, "", "" );
      
      removeNode = document.getElementById( 'bookmark_number_' + Bookmark_Id );
    
      removeNode.parentNode.removeChild( removeNode );
      removeNode = null;
    }
  }

// *************************************************************************************************
  function Handle_Bookmark_Delete_Result( ElementId, msg )
  {
    Get_Bookmark_Details( 'userbookmarktags', 'userbookmarkspertag', true );
    Get_Bookmark_Details( 'allbookmarktags', 'allbookmarkspertag', false );    
  }

// *************************************************************************************************
  
  function Open_Mail_App ( type )
  {
    var Mail_String = 'mailto:feedback@islamicapps.co.uk?';
    
    if ( 'feedback' == type )
    {
      Mail_String += '&subject=FeedBack for iMobiQB';
    }
    else if ( 'bugreport' == type )
    {
      Mail_String += '&subject=Error Report for iMobiQB';
    }
    else if ( 'tellfriends' == type )
    {
      Mail_String  = 'mailto:?&subject=English Quran Translation for your iPhone or iPod Touch';
      Mail_String += '&body=<p>Your friend has recommended iMobiQB the English Quran Translation webapp.</p>' + 
                           '<p><div align="center"><a href="http://islamicapps.com/imobiqb">Visit iMobiQB Now</a></div></p>' +
                           '<p><div align="center"><a href="http://islamicapps.com/imobiqb"><img src="http://islamicapps.com/imobiqb/images/imobiqb.png" /></a></div></p>';
    }
    window.location.href = Mail_String;
  }

  
  addEvent( window, "load",   Init );
  addEvent( window, "unload", UnInit );
  //-->