banner_places = new Array;
banners = new Object;
to_load = new Object;
banners_enabled = 1;

function weighted_random_index(weights){ 
  var count = weights.length; 
  var i = 0;
  var sum = 0;
  for (i = 0; i < count; i++) {
    sum += parseInt(weights[i]);
  }

  i = 0;
  var n = 0;

  var num = Math.random()*sum;
  while(i < count) {
    n += parseInt(weights[i]);
      if(n >= num) {
        break; 
      }
    i++;
  }
  return i;
}

function array_copy(arr) {
  var arr_cp = new Array;
  for (var t = 0; t < arr.length; t++) arr_cp[t] = arr[t];
  return arr_cp;
}

function fill_distinct(arr, values, weights) {
  if(arr.length > values.length) return null;
  var v = array_copy(values);
  var w = array_copy(weights);
  var chosen = new Array;
  var ind;

  for (var t = 0; t < arr.length; t++) {
    ind = weighted_random_index(w)
    arr[t] = v[ind];
    chosen[t] = ind;
    v[ind] = null;
    w[ind] = 0;
  }
  return chosen;
}

function load_result_handler(responseText, textStatus, XMLHttpRequest){
   switch (XMLHttpRequest.status) {
    case 200: break;
    case 404:
     banners_enabled = 0;
     break;
    default:
     banners_enabled = 0;
     break;
   }
}

function load_banners(){
  var places = banner_places; // Shouldn't be empty at this moment
  for (var t = 0; t < places.length; t++){
    var ids = banners[ places[t] + '_banner_ids' ];
    var ws = banners[ places[t] + '_banner_weights' ];
    var refs = banners[ places[t] + '_banner_referers' ];

    if (places[t] == 'b-block') {
      var banner_line = new Array(3);
      var chosen_nums = new Array(3);
      chosen_nums = fill_distinct(banner_line, ids, ws);
      for (var k = 0; k < banner_line.length; k++) {
        var place_id = places[t] + '-' + (k + 1);
        to_load[ place_id ] =  banner_line[k];
          //Set event handler with place id and a referer string
          set_onclick_handler(place_id, refs[chosen_nums[k]]);
      }
    }
    else {
      var num = weighted_random_index(ws);
      to_load[places[t]] = ids[num];
      //Set event handler with place id and a referer string
      set_onclick_handler(places[t], refs[num]);
    }
  }
  for (var place in to_load) {
    try{
      // Show all or none
      if (banners_enabled)
        $("#"+place).load("/banner/" + to_load[place] + "/", null, load_result_handler);
    }
    catch(err) {
      banners_enabled = 0;
    }
  }
}


function set_onclick_handler(elem, referer_str) {
  if (typeof(elem) == 'object') {
    elem.onclick = function () { set_cookie('banner_referer',referer_str,'','/','','') };
  }
  else if (typeof(elem) == 'string') {
    var elem_obj = document.getElementById(elem);
    if (elem_obj)
      if (referer_str.length)
        elem_obj.onclick = function (event) {
                                        set_cookie('banner_referer',referer_str,'','/','','');
                                        var own_handler;
                                        if ( own_handler=$('#'+this.id+' a').attr('onclick') ) {
                                          return own_handler(event);
                                        }
                                        if ( $('#'+this.id+' a').attr('target') == '_blank' )
                                          window.open( $('#'+this.id+' a').attr('href'), '_blank', "" );
                                        else
                                          window.location.href=$('#'+this.id+' a').attr('href');
                                        return false;
                                      };
      else
        elem_obj.onclick = function (event) {
                                        var own_handler;
                                        if ( own_handler=$('#'+this.id+' a').attr('onclick') )
                                          return own_handler(event);
                                        if ( $('#'+this.id+' a').attr('target') == '_blank' )
                                          window.open( $('#'+this.id+' a').attr('href'), '_blank', "" );
                                        else
                                          window.location.href=$('#'+this.id+' a').attr('href');
                                        return false;
                                      };
  }
  else alert('Need string or object');
}

function set_cookie (name, value, expires, path, domain, secure) {
  document.cookie = name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

function get_cookie(name){
  var c=" "+document.cookie, s=" "+name+"=", r=null, o=0, e=0;
  if (c.length>0){
    o=c.indexOf(s);
    if (o!=-1){
      o+=s.length;e=c.indexOf(";",o)
      if(e==-1){e=c.length}
      r=unescape(c.substring(o,e));
    }
  }
  return(r)
}

function del_cookie(name, path, domain){
  if (get_cookie(name)){
    document.cookie = name + "=" +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}

function fill_referer () {
  var bref;
  if (bref = get_cookie('banner_referer')) {
    $('#banner_referer').attr('value', bref);
    if ( !$('#keep_banner_referer_flag').length ) del_cookie('banner_referer','/','');
  }
}

$(document).ready(load_banners);
if (banners_enabled) $(document).ready(fill_referer);


