var g_oResources = new Object();
var g_aTimers = new Array();

var g_iTimeStart = 0;
var g_iTimeDiff = 0;
var g_ii = 0;

function Do_InitMePlz()
{

   iServerTime  = Do_GetTime( document.getElementById( "ServerTime" ) );

   g_iTimeStart = iServerTime;
   g_iTimeDiff  = iServerTime - Do_GetLocalTime();

   var spans = document.getElementsByTagName( "span" );

   for( var i = 0; i < spans.length; i++ ) {
      var span = spans[i];

      if( span.className == "Timer" || span.className == "TimerReplace" ) {
         var iStartTime = Do_GetTime( span );
         var iType = Do_GetTimeType( span );

         if( iStartTime != -1 ) {
            Do_AddTimer( span, iServerTime + iStartTime, ( span.className == "Timer" ), iType );
         }
      }
   }
   window.setInterval( "Tick_Handler()", 1000 );
   return;
}

function Do_AddTimer( m_oElement, m_iEndTime, m_bReload, m_iType )
{
   var oTimer = new Object();

   oTimer['Element'] = m_oElement;
   oTimer['EndTime'] = m_iEndTime;
   oTimer['Reload'] = m_bReload;
   oTimer['Type'] = m_iType;

   g_aTimers.push( oTimer );
   return;
}

function Do_GetTimeType( m_oElement )
{
   if( m_oElement.firstChild.nodeValue == null ) {
      return -1;
   }
   var strValue = m_oElement.firstChild.nodeValue;

   if( strValue.match( ':' ) ) {
      return 0
   }
   return 1;
}

function Do_GetTime( m_oElement )
{
   if( m_oElement == null ) {
      return -1;
   }
   if( m_oElement.firstChild.nodeValue == null ) {
      return -1;
   }
   strValue = m_oElement.firstChild.nodeValue;

   if( strValue.match( ':' ) ) {
      return Do_GetTimeByColon( m_oElement );
   }
   else {
      return Do_GetStringTime( m_oElement );
   }
   return -1;
}

Array.prototype.find = function(searchStr)
{
   var returnArray = false;

   for( i = 0; i < this.length; i++ ) {
      if( typeof( searchStr ) == 'function' ) {
         if( searchStr.test( this[i] ) ) {
            if( !returnArray ) {
               returnArray = [];
            }
            returnArray.push( i );
         }
      }
      else {
         if( this[i] === searchStr ) {
            if( !returnArray ) {
               returnArray = [];
            }
            returnArray.push(i);
         }
      }
   }
   return returnArray;
}

function Do_GetStringTime( m_oElement )
{
   if( m_oElement.firstChild.nodeValue == null ) {
      return -1;
   }
   var strValue = StripCommas( m_oElement.firstChild.nodeValue );
   var arValue = strValue.split( ' ' );
   var iDay = 0;
   var iHrs = 0;
   var iMin = 0;
   var iSec = 0;

   if( ( iTemp = arValue.find( "days"    ) ) != false ) iDay = parseInt( arValue[iTemp - 1] );
   if( ( iTemp = arValue.find( "day"     ) ) != false ) iDay = parseInt( arValue[iTemp - 1] );
   if( ( iTemp = arValue.find( "hours"   ) ) != false ) iHrs = parseInt( arValue[iTemp - 1] );
   if( ( iTemp = arValue.find( "hour"    ) ) != false ) iHrs = parseInt( arValue[iTemp - 1] );
   if( ( iTemp = arValue.find( "minutes" ) ) != false ) iMin = parseInt( arValue[iTemp - 1] );
   if( ( iTemp = arValue.find( "minute"  ) ) != false ) iMin = parseInt( arValue[iTemp - 1] );
   if( ( iTemp = arValue.find( "seconds" ) ) != false ) iSec = parseInt( arValue[iTemp - 1] );
   if( ( iTemp = arValue.find( "second"  ) ) != false ) iSec = parseInt( arValue[iTemp - 1] );

   return ( iDay * 86400 + iHrs * 3600 + iMin * 60 + iSec );
}

function Do_GetTimeByColon( m_oElement )
{
   if( m_oElement.firstChild.nodeValue == null ) {
      return -1;
   }
   strValue = m_oElement.firstChild.nodeValue.split( ':' );

   for( iPart = 1; iPart < 3; iPart++ ) {
      if( strValue[iPart].charAt(0) == "0" ) {
         strValue[iPart] = strValue[iPart].substring( 1, strValue[iPart].length );
      }
   }
   iHrs = parseInt( strValue[0] );
   iMin = parseInt( strValue[1] );
   iSec = parseInt( strValue[2] );

   return ( iHrs * 3600 + iMin * 60 + iSec );
}

function Do_GetLocalTime()
{
   var oNow = new Date();

   return Math.floor( oNow.getTime() / 1000 );
}

function Do_CreateResourceTicker( m_ResourceName, m_MaxElementID )
{
   var oElement = document.getElementById( m_ResourceName );

   if( oElement != null ) {
      var oStorageElement = document.getElementById( m_MaxElementID );

      if( oStorageElement != null ) {
         var iMaximum = parseInt( StripCommas( oStorageElement.firstChild.nodeValue ) );
      }
      else {
         var iMaximum = -1;
      }
      var iStart = parseInt( StripCommas( oElement.firstChild.nodeValue ) );
      var iGain = parseInt( oElement.title ) / 3600;
      var oResource = new Object();

      oResource['Name']  = m_ResourceName;
      oResource['Start'] = iStart;
      oResource['Gain']  = iGain;
      oResource['Max']   = iMaximum;

      g_oResources[m_ResourceName] = oResource;
   }
   return;
}

function Do_FormatTime( m_oElement, m_iType, m_iTime, m_bClamp )
{
   if( m_oElement != null ) {
      if( m_iType == 0 ) Do_FormatColonTime( m_oElement, m_iTime, m_bClamp );
      if( m_iType == 1 ) Do_FormatStringTime( m_oElement, m_iTime, m_bClamp );
   }
   return;
}

function Do_FormatStringTime( m_oElement, m_iTime, m_bClamp )
{
   if( m_oElement != null && m_iTime >= 0 ) {
      var iDay = Math.floor( m_iTime / 86400 );
      var iHrs = Math.floor( m_iTime / 3600  % 24 );
      var iMin = Math.floor( m_iTime / 60 % 60 );
      var iSec = Math.floor( m_iTime % 60 );
      var bPrevious = false;
      var strTime = "";

      if( iDay > 0 ) {
         strTime += iDay + " day";
         strTime += iDay > 1 ? "s" : "";
         bPrevious = true;
      }
      if( iHrs > 0 ) {
         strTime += bPrevious == true ? ", " : "";
         strTime += iHrs + " hour";
         strTime += iHrs > 1 ? "s" : "";
         bPrevious = true;
      }
      if( iMin > 0 ) {
         strTime += bPrevious == true ? ", " : "";
         strTime += iMin + " minute";
         strTime += iMin > 1 ? "s" : "";
         bPrevious = true;
      }
      strTime += bPrevious == true ? " and " : "";
      strTime += iSec + " second";
      strTime += iSec != 1 ? "s" : "";

      m_oElement.firstChild.nodeValue = strTime;
   }
   return;
}

function Do_FormatColonTime( m_oElement, m_iTime, m_bClamp )
{
   if( m_oElement != null && m_iTime >= 0 ) {
      var iHrs = Math.floor( m_iTime / 3600 );
      var iMin = Math.floor( m_iTime / 60 ) % 60;
      var iSec = m_iTime % 60;

      if( m_bClamp == true ) {
         iHrs = iHrs % 24;
      }
      strTime = iHrs + ":";

      strTime += iMin < 10 ? "0" : "";
      strTime += iMin + ":";

      strTime += iSec < 10 ? "0" : "";
      strTime += iSec;

      m_oElement.firstChild.nodeValue = strTime;

      if( strTime == '0:00:00' ) {
         Do_IncrementDate();
      }
   }
   return;
}

function Do_IncrementDate()
{
   var oElement = document.getElementById( "ServerDate" );

   if( oElement != null ) {
      strCurrentDate = oElement.firstChild.nodeValue;
      strSplitDate = strCurrentDate.split( '/' );

      iDay   = strSplitDate[0];
      iMonth = strSplitDate[1] - 1;
      iYear  = strSplitDate[2];

      oDateObject = new Date( iYear, iMonth, iDay );

      oDateObject.setDate( oDateObject.getDate() + 1 );

      strDate = '';

      iDay   = oDateObject.getDate();
      iMonth = oDateObject.getMonth() + 1;
      iYear  = oDateObject.getFullYear();

      if( iDay < 10 ) {
         strDate += "0";
      }
      strDate += iDay + "/";

      if( iMonth < 10 ) {
         strDate += "0";
      }
      strDate += iMonth + "/";
      strDate += iYear;

      oElement.firstChild.nodeValue = strDate;
   }
   return;
}

function Tick_Handler()
{
   Tick_ServerTime();
   Tick_Resources();

   Tick_HandleTimers();
   return;
}

function Tick_ServerTime()
{
   var oServerTime = document.getElementById( "ServerTime" );

   if( oServerTime != null ) {
      iTime = Do_GetLocalTime() + g_iTimeDiff;
      Do_FormatTime( oServerTime, 0, iTime, true );
   }
   return;
}

function Tick_Resources()
{
   for( var oResource in g_oResources ) {
      var strResourceName = g_oResources[oResource]['Name'];
      var iMaximum = g_oResources[oResource]['Max'];
      var iStart   = g_oResources[oResource]['Start'];
      var iGain    = g_oResources[oResource]['Gain'];

      var oNow  = new Date();
      var dTime = ( oNow.getTime() / 1000 + g_iTimeDiff ) - g_iTimeStart;

      if( iMaximum > 0 ) {
         iCurrent = Math.min( Math.floor( iStart + iGain * dTime ), iMaximum );
      }
      else {
         iCurrent = Math.floor( iStart + iGain * dTime );
      }
      var oElement = document.getElementById( strResourceName );

      if( oElement != null ) {
         oElement.firstChild.nodeValue = FormatNumber( iCurrent.toString() );

         if( iMaximum > 0 ) {
            if( iCurrent == iMaximum ) {
               oElement.setAttribute( 'class', 'ResourceMax' );
            }
            else if( iCurrent >= (iMaximum * 0.9) ) {
               oElement.setAttribute( 'class', 'ResourceNearMax' );
            }
         }
      }
   }
   return;
}

function Tick_HandleTimers()
{
   for( iTimer = 0; iTimer < g_aTimers.length; iTimer++ ) {
      bRemove = Tick_StandardTimer( g_aTimers[iTimer] );

      if( bRemove == true ) {
         g_aTimers.splice( iTimer, 1 );
      }
   }
   return;
}

function Tick_StandardTimer( m_oTimer )
{
   var iTime = m_oTimer['EndTime'] - ( Do_GetLocalTime() + g_iTimeDiff );

   if( iTime <= 0 ) {
      if( m_oTimer['Reload'] == false ) {
         var oParent = m_oTimer['Element'].parentNode;

         oParent.nextSibling.style.display = 'inline'; 
         oParent.parentNode.removeChild( oParent );
         return true;
      }
      else {
         document.location.href = document.location.href.replace( /action=\w*/, '' );
         Do_FormatTime( m_oTimer['Element'], m_oTimer['Type'], 0, false );
         return true;
      }
   }
   Do_FormatTime( m_oTimer['Element'], m_oTimer['Type'], iTime, false );
   return false;
}

function InsertNumber( m_strInput, m_iValue )
{
   eInput = document.getElementById( m_strInput );

   if( eInput != null ) {
      if( eInput.value != m_iValue ) {
         eInput.value = m_iValue;
      }
      else {
         eInput.value = '0';
      }
   }
   return;
}

function StripCommas( m_strText )
{
   var strStrip = /,/g;

   return m_strText.replace( strStrip, "" );
}

// Credit to Paul Novitski for this function.
function FormatNumber( m_iNumber, m_strSeparator, m_strDecimalPoint )
{
   // Default separator values (should resolve to local standard)
   var strDec  = (m_strDecimalPoint) ? m_strDecimalPoint : ".";
   var strThou = (m_strSeparator) ? m_strSeparator : ",";

   // Split the number into integer & fraction.
   var arParts = m_iNumber.split( strDec );

   // Isolate the integer & add enforced decimal point.
   var strValue = arParts[0] + strDec;

   // Tests for four consecutive digits followed by a thousands- or decimal-separator.
   var objTest = new RegExp( "(\\d)(\\d{3}(\\" + strThou + "|\\" + strDec + "))" );

   while( strValue.match( objTest ) ) {
      // Insert thousands-separator before the three digits.
      strValue = strValue.replace( objTest, "$1" + strThou + "$2" );
   }
   arParts[0] = strValue.replace( strDec, "" );
   return arParts.join( strDec )
}

function EditMember( m_iUserID, m_strID )
{
   $.ajax({ 
      type: "POST", 
      url:  "ajax/members-permission.php", 
      data: "id=" + m_iUserID, 
      success: function( html ) {
         if( html == false ) {
            alert( 'You are unable to change their permissions.' );
            return;
         }
         $( "#" + m_strID ).html( html );
      }
   });
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

// Insert text at position
function insert_text( text )
{
   if( form_name != null && text_name != null ) {
      var textarea;

      textarea = document.forms[form_name].elements[text_name];

      if( !isNaN( textarea.selectionStart ) ) {
         var sel_start = textarea.selectionStart;
         var sel_end = textarea.selectionEnd;

         mozWrap( textarea, text, '' )
         textarea.selectionStart = sel_start + text.length;
         textarea.selectionEnd = sel_end + text.length;
      }	
      else if( textarea.createTextRange && textarea.caretPos ) {
         if( baseHeight != textarea.caretPos.boundingHeight ) {
            textarea.focus();

            storeCaret( textarea );
         }
         var caret_pos = textarea.caretPos;
         caret_pos.text = caret_pos.text.charAt( caret_pos.text.length - 1 ) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
      }
      else {
         textarea.value = textarea.value + text;
      }
      textarea.focus();
   }
   return;
}

// From http://www.massless.org/mozedit/
function mozWrap( txtarea, open, close )
{
   var selLength = txtarea.textLength;
   var selStart = txtarea.selectionStart;
   var selEnd = txtarea.selectionEnd;
   var scrollTop = txtarea.scrollTop;

   if( selEnd == 1 || selEnd == 2 ) {
      selEnd = selLength;
   }
   var s1 = (txtarea.value).substring( 0, selStart );
   var s2 = (txtarea.value).substring( selStart, selEnd )
   var s3 = (txtarea.value).substring( selEnd, selLength );

   txtarea.value = s1 + open + s2 + close + s3;
   txtarea.selectionStart = selEnd + open.length + close.length;
   txtarea.selectionEnd = txtarea.selectionStart;
   txtarea.focus();

   txtarea.scrollTop = scrollTop;
   return;
}

function storeCaret( m_oElement )
{
   if( m_oElement.createTextRange ) {
      m_oElement.caretPos = document.selection.createRange().duplicate();
   }
   return;
}

