function format_date(date)
{
  if (date == 0) { return '-'; }
  D=new Date(date*1000);
  return D.toLocaleDateString();
}

function days_in_month(month, year)
{
  arr=new Array(31, ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 !=0))) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  return arr[month-1];
}

function format_utc_date(date)
{
  if (date == 0) { return '-'; }
  D=new Date(date*1000);
  return (D.getUTCDate() < 10?'0':'')+D.getUTCDate()+'.'+(D.getUTCMonth()+1<10?'0':'')+(D.getUTCMonth()+1)+'.'+D.getUTCFullYear();
}

function format_utc_date_time(date)
{
  if (date == 0) { return '-'; }
  D=new Date(date*1000);
  return (D.getUTCDate() < 10?'0':'')+D.getUTCDate()+'.'+(D.getUTCMonth()+1<10?'0':'')+(D.getUTCMonth()+1)+'.'+D.getUTCFullYear()+' '+
         (D.getUTCHours() < 10?'0':'')+D.getUTCHours()+':'+(D.getUTCMinutes()<10?'0':'')+(D.getUTCMinutes());
}

function format_size(size)
{
  return parseFloat(parseInt(size)/(1024*1024)).toFixed(2)+' Mb';
}

var signupObj={

 errorMessages :
 {
   'emailIncorrect' : '<b>E-mail</b> is incorrect.',
   'emailExists' : '<b>E-mail</b> exists. Try <a href="">password reminder</a>.',
   'icqIncorrect' : '<b>ICQ</b> is incorrect.',
   'payoutIncorrect' : '<b>Payout details</b> is incorrect.',
   'trafficIncorrect' : 'Please provide the URL of your website (in <b>Traffic sources</b> field).',
   'passwordIncorrect' : '<b>Password</b> is incorrect (must be at least 5 chars long).',
   'passwordNotMatch' : '<b>Password</b> do not match.'
 },

 errorReport : function(errors) 
 {
   errormsg='';
   for (i=0;i<errors.length;i++)
   {
     errormsg+=(errormsg == ''?'':"<br />")+eval('this.errorMessages.'+errors[i]);
   }
   $('#frmSignUp div[msg=true]').addClass('msg-error').html(errormsg);
   return;
 },

 processResponse : function(data)
 {
   if (data.code == 500) { signupObj.errorReport(data.errorFields); }
   if (data.code == 200)
     {
       if (data.state == "new")
         {
           $('#beforeSignUp').hide();
           $('#frmSignUp').hide();
           $('#afterSignUp').show();
         }
       else if (data.state == "active") { location='stats.html'; }
     }

   return;
 }

};

var authObj={

 errorMessages :
 {
   'loginIncorrect' : 'Incorrect e-mail or password.',
   'accountStateNew' : 'Account is not activated yet.',
   'accountStateBlocked' : 'Account is <b>blocked</b>!',
   'accountStateDeleted' : 'Your account has been deleted, if you think that\'s a mistake please contact support.'
 },

 errorReport : function(errors) 
 {
   errormsg='';
   for (i=0;i<errors.length;i++)
   {
     errormsg+=(errormsg == ''?'':"<br />")+eval('this.errorMessages.'+errors[i]);
   }
   $('#frmAuth div[msg=true]').addClass('msg-error').html(errormsg);
   return;
 },

 processResponse : function(data)
 {
   if (data.code == 200 && data.state == "active")
     {
       location='stats.html';
       return;
     }

   if (!location.href.match(/\/login.html($|\?)/))
     {
       if (data.code == 500)
         {
           location='login.html?loginIncorrect';
         }
       if (data.code == 200)
         {
           if (data.state == "new") { location='login.html?accountStateNew'; }
           else if (data.state == "blocked") { location='login.html?accountStateBlocked'; }
           else if (data.state == "deleted") { location='login.html?accountStateDeleted'; }

         }

        return;
     }

   if (data.code == 500)
     {
       authObj.errorReport(data.errorFields);
     }
   if (data.code == 200)
     {
       if (data.state == "new") { authObj.errorReport(['accountStateNew']); }
       else if (data.state == "blocked") { authObj.errorReport(['accountStateBlocked']); }
       else if (data.state == "deleted") { authObj.errorReport(['accountStateDeleted']); }
     }


   return;
 }

};

var accountObj={

 errorMessages :
 {
   'emailIncorrect' : '<b>E-mail</b> is incorrect.',
   'emailExists' : '<b>E-mail</b> exists. Try <a href="">password reminder</a>.',
   'icqIncorrect' : '<b>ICQ</b> is incorrect.',
   'payoutIncorrect' : '<b>Payout details</b> is incorrect.',
   'trafficIncorrect' : '<b>Traffic sources</b> are incorrect.',
   'passwordIncorrect' : '<b>Password</b> incorrect (must be at last 5 chars long).',
   'passwordNotMatch' : '<b>Password</b> do not match.',
   'passwordActiveNotMatch' : '<b>Active Password</b> is incorrect.',
   'okData' : 'Account data updated.',
   'okPassword' : 'Password updated.'
 },

 errorReport : function(errors) 
 {
   errormsg='';
   for (i=0;i<errors.length;i++)
   {
     errormsg+=(errormsg == ''?'':"<br />")+eval('accountObj.errorMessages.'+errors[i]);
   }
   $('#frmAccountData div[msg=true]').addClass('msg-error').html(errormsg);
   return;
 },

 processResponse : function(data)
 {
   if (data.code == 500) { accountObj.errorReport(data.errorFields); }
   if (data.code == 200)
     {
       $('#frmAccountData div[msg=true]').addClass('msg-notice').html(eval('accountObj.errorMessages.okData'));
       $('#frmAccountData :input').each(function(){
         if (this.tagName.toLowerCase() == "input" && this.type == "password") { this.value=''; }
       });
     }

   return;
 },

 errorReportPassword : function(errors) 
 {
   errormsg='';
   for (i=0;i<errors.length;i++)
   {
     errormsg+=(errormsg == ''?'':"<br />")+eval('accountObj.errorMessages.'+errors[i]);
   }
   $('#frmAccountPassword div[msg=true]').addClass('msg-error').html(errormsg);
   return;
 },

 processResponsePassword : function(data)
 {
   if (data.code == 500) { accountObj.errorReportPassword(data.errorFields); }
   if (data.code == 200)
     {
       $('#frmAccountPassword div[msg=true]').addClass('msg-notice').html(eval('accountObj.errorMessages.okPassword'));
       $('#frmAccountPassword :input').each(function(){
         if (this.tagName.toLowerCase() == "input" && this.type == "password") { this.value=''; }
       });
     }

   return;
 }

};

var statsObj={

 json : '',

 subIds : [],

 filterBy : 'date',
 filterValue : '',

 processResponse :  function(req)
 {
   json='';
   if (req.status == 200)
     {
       json=eval('('+req.responseText+')');
       for (i=0;i<json.items.length;i++)
       {
         index=-1;
         for (j=0;j<statsObj.subIds.length;j++)
         {
           if (statsObj.subIds[j] == json.items[i].subid)
             {
               index=i;
               break
             }
         }

         if (index < 0) { statsObj.subIds.push(json.items[i].subid); }
       }

       statsObj.subIds.sort(function(a,b){return a - b;});

       $('#statsFilter td:contains("SubID")').closest('tr').hide();
       if (statsObj.subIds.length > 0)
         {
           select=$('#statsFilter td:contains("SubID")').closest('tr').find(':input[name=subid]');
           $(select).find('option').each(function(){ $(this).remove(); });
           html='';
           for (i=0;i<statsObj.subIds.length;i++)
           {
             html+='<option value="'+statsObj.subIds[i]+'">'+(statsObj.subIds[i] == 0?'all':statsObj.subIds[i])+'</option>';
           }
           $(select).html(html);

           $('#statsFilter td:contains("SubID")').closest('tr').show(); 
         }
     }

   if ($('#statsFilter input[name=date_from]').val() == "")
     {
       now = new Date();
       date_from='';
       date_to='';
       if (now.getDate() < 16)
         {
           date_from='01.'+(now.getUTCMonth()+1 > 9?now.getUTCMonth()+1:'0'+(now.getUTCMonth()+1))+'.'+now.getUTCFullYear();
           date_to='15.'+(now.getUTCMonth()+1 > 9?now.getUTCMonth()+1:'0'+(now.getUTCMonth()+1))+'.'+now.getUTCFullYear();
         }
       else
         {
           date_from='16.'+(now.getUTCMonth()+1 > 9?now.getUTCMonth()+1:'0'+(now.getUTCMonth()+1))+'.'+now.getUTCFullYear();
           date_to=days_in_month(now.getUTCMonth()+1, now.getUTCFullYear())+'.'+(now.getUTCMonth()+1 > 9?now.getUTCMonth()+1:'0'+(now.getUTCMonth()+1))+'.'+now.getUTCFullYear();
         }

       $('#statsFilter input[name=date_from]').val(date_from);
       $('#statsFilter input[name=date_to]').val(date_to);

       statsObj.applyFilter();
     }

   statsObj.drawItems(json); 

   return;
 },

 applyFilter : function()
 {
   select=$('#statsFilter td:contains("SubID")').closest('tr').find(':input[name=subid]');
   if (parseInt($(select).val()) != 0)
     {
       statsObj.filterValue=$(select).val();
       statsObj.filterBy='subid';
       $('#statsItems thead th:contains("SubID")').show();
     }
   else
     {
       statsObj.filterValue='';
       statsObj.filterBy='date';
       $('#statsItems thead th:contains("SubID")').hide();
     }

   statsObj.drawItems();
   return false;
 },

 drawItems : function(json)
 {
   if (typeof(json)=="undefined") { json=statsObj.json; }
   if (typeof(json.items) == "undefined") { return; }

   $('#statsItems tbody tr').each(function(){
     $(this).remove();
   });

   date_from=$('#statsFilter input[name=date_from]').val();
   res=date_from.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/);
   date_from=Date.UTC(res[3],res[2]-1,res[1])/1000;

   date_to=$('#statsFilter input[name=date_to]').val();
   res=date_to.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/);
   date_to=Date.UTC(res[3],res[2]-1,res[1])/1000;

   total={money:0, visitors:0, refs:0};
   for (date=date_to;date>=date_from;date-=(60*60*24))
   {
     pItem=undefined;
     for (i=0;i<json.items.length;i++)
     {
       if (json.items[i].date < date || json.items[i].date > date+24*60*60-1) { continue; }
       if (json.items[i].subid != statsObj.filterValue && statsObj.filterBy == 'subid') { continue; }
       if (typeof(pItem) == 'undefined')
         {
           pItem={};
           for (k in json.items[i]) { eval('pItem.'+k+'=json.items['+i+'].'+k); }
         }
       else
         {
           pItem.visitors=parseInt(pItem.visitors)+parseInt(json.items[i].visitors);
           pItem.presales=parseInt(pItem.presales)+parseInt(json.items[i].presales);
           pItem.sales=parseInt(pItem.sales)+parseInt(json.items[i].sales);
           pItem.rebills=parseInt(pItem.rebills)+parseInt(json.items[i].rebills);
           pItem.cbacks=parseInt(pItem.cbacks)+parseInt(json.items[i].cbacks);
           pItem.refunds=parseInt(pItem.refunds)+parseInt(json.items[i].refunds);
           pItem.money=parseFloat(pItem.money)+parseFloat(json.items[i].money);
           pItem.refs=parseFloat(pItem.refs)+parseFloat(json.items[i].refs);
         }
     }
     if (typeof(pItem) != 'undefined')
       {
         var per_sale=parseFloat(pItem.money/(pItem.sales>0?pItem.sales:1));
         pItem.money-=parseInt(pItem.refunds)*per_sale+parseInt(pItem.cbacks)*per_sale;
         html='<td class="tc">'+format_utc_date(pItem.date)+'</td>'+
              (statsObj.filterBy == "subid"?'<td class="tr">'+pItem.subid+'</td>':'')+
              '<td class="tr">'+pItem.visitors+'</td>'+
              '<td class="tr">'+pItem.presales+'</td>'+
              '<td class="tr">'+pItem.sales+'</td>'+
              '<td class="tr">'+parseInt(pItem.refunds)+'</td>'+
              '<td class="tr">'+parseInt(pItem.cbacks)+'</td>'+
              '<td class="tr">'+(pItem.money/(pItem.visitors/1000)).toFixed(2)+'</td>'+
              '<td class="tr">'+(pItem.refs/1).toFixed(2)+'</td>'+
              '<td class="tr">'+(pItem.money/1).toFixed(2)+'</td>';
     
         row=$('<tr />').html(html);
         $('#statsItems tbody').append(row);

         total.money+=parseFloat(pItem.money/1);
//         total.money-=parseFloat(pItem.refunds/1*per_sale);
//         total.money-=parseFloat(pItem.cbacks/1*per_sale);
         total.visitors+=parseInt(pItem.visitors);
         total.refs+=parseInt(pItem.refs);
       }
   }

   $('#statsItems tbody').append($('<tr class="tr bold" style="background-color:#333;" />').html(
     '<td class="tr bold" colspan="'+(statsObj.filterBy == "subid"?7:6)+'">Total:</td>'+
     '<td class="tr bold">'+(total.money/(total.visitors/1000)).toFixed(2)+'</td>'+
     '<td class="tr bold">'+total.refs.toFixed(2)+'</td>'+
     '<td class="tr bold" style="background-color:#FFF;color:#000;">'+total.money.toFixed(2)+'</td>'
   ));

   diff=parseInt((new Date().getTime()-parseInt(json.updated)*1000)/1000);

   $('#statsInfo').html('Stats updated '+parseInt(diff/60)+' min '+(diff%60)+' sec ago, refresh every 15 min.<br />Server time: '+format_utc_date_time(json.date));
 
   statsObj.json=json;
   return;
 }

};

var payoutsObj={

 json : '',

 monthes: ['January','February','March','April','May','June','July','August','September','October','November','December'],

 processResponse :  function(req)
 {
   json='';
   if (req.status == 200)
     {
       json=eval('('+req.responseText+')');
     }

   json.items=json.items.sort(function(a,b){return b.date - a.date;});
   payoutsObj.drawItems(json); 

   return;
 },

 drawItems : function(json)
 {
   if (typeof(json)=="undefined") { json=payoutsObj.json; }
   if (typeof(json.items) == "undefined") { return; }

   $('#payoutsItems tbody tr').each(function(){
     $(this).remove();
   });

   total={amount:0};
   for (i=0;i<json.items.length;i++)
   {
     var d=new Date((json.items[i].date-24*60*60*14)*1000);
     var real=new Date(json.items[i].date*1000);
     var payoutsDate=new Date((parseInt(json.items[i].date)+19*24*60*60)*1000);
     var descr='';

     if (real.getUTCDate() <= 15) { descr='1-15 of '+payoutsObj.monthes[d.getUTCMonth()]+' '+d.getUTCFullYear(); }
     else { descr='16-'+days_in_month(d.getUTCMonth()+1,d.getUTCFullYear())+' of '+payoutsObj.monthes[d.getUTCMonth()]+' '+d.getUTCFullYear(); }

     payoutsDate=(payoutsDate.getUTCDate()<15?'05':'20')+'.'+((payoutsDate.getUTCMonth()+1<10?'0':'')+(payoutsDate.getUTCMonth()+1))+'.'+payoutsDate.getUTCFullYear();

     html='<td class="tc">'+payoutsDate+'</td>'+
          '<td>'+descr+'</td>'+
          '<td class="tr">'+(json.items[i].amount/1).toFixed(2)+'</td>';
     
     row=$('<tr />').html(html);
     $('#payoutsItems tbody').append(row);

     total.amount+=parseFloat(json.items[i].amount/1);
   }
   $('#payoutsItems tbody').append($('<tr class="tr bold" style="background-color:#333;" />').html(
     '<td></td>'+
     '<td class="tr bold">Total:</td>'+
     '<td class="tr bold">'+total.amount.toFixed(2)+'</td>'
   ));

   if (total.amount > 0) { $('#payoutsItems').show(); $('p.noPayouts').hide(); }
 
   payoutsObj.json=json;
   return;
 }

};

var supportObj={

 errorMessages :
 {
   'emailIncorrect' : '<b>E-mail</b> is incorrect.',
   'nameIncorrect' : '<b>Name</b> is incorrect.',
   'messageIncorrect' : '<b>Message</b> is incorrect.',
   'okMsg' : 'Your support request has been sent.'
 },

 errorReport : function(errors) 
 {
   errormsg='';
   for (i=0;i<errors.length;i++)
   {
     errormsg+=(errormsg == ''?'':"<br />")+eval('this.errorMessages.'+errors[i]);
   }
   $('#frmSupport div[msg=true]').addClass('msg-error').html(errormsg);
   return;
 },

 processResponse : function(data)
 {
   if (data.code == 500) { supportObj.errorReport(data.errorFields); }
   if (data.code == 200)
     {
       $('#frmSupport div[msg=true]').addClass('msg-notice').html(eval('supportObj.errorMessages.okMsg'));
       $('#frmSupport :input').each(function(){
         if ((this.tagName.toLowerCase() == "input" || this.tagName.toLowerCase() == "textarea") && (this.type == "text" || this.type == "textarea"))
           { this.value=''; }
       });
     }

   return;
 }

};

