function init (entity) { entity = entity || {}; }

init($.app); // Data buffering object, see application layout for pre-population

function logout() {
  answer = confirm("Are you sure you wish to logout?");
  if(answer) {
    window.location = "/logout";
  }
}

// By default, a toggling element toggles this.next 
// We use classes to avoid burying style in javascript
function enable_toggles () {
  $.each($(".toggle"),function(index,toggle) {
    $(toggle).click(function() {
      
      // add the correct class to the toggle handle
      $(this).toggleClass("open")
      
      // allow the pseudo-attribute 'target' to specify what toggles
      target = $(this).attr("target");
      
      // toggle the target, or fallback to the next element
      target != undefined ? $('#'+target).toggle() : $(this).next().toggle();
      });
  });
}

// Swiped from MerBlogger
function get_entities (options, callback) {  
  url = '/';
  if(options.owner_class) { 
    url += options.owner_class + '/';
    init($.app, options.owner_class);
    if(options.owner_id) {
      url += options.owner_id + '/';
      init($.app[options.owner_class], options.owner_id);
    }
  }
  
  if(options.entity_class) {
    url += options.entity_class + '/';
    init($.app, options.entity_class);
    if(options.entity_id) {
      url += options.entity_id + '/';
      init($.app[options.entity_class], options.entity_id);
    }
  } else {
    url = options; // If no entity_class is specified options should be a string.
  }
  
  $.getJSON(url, null, function(response) {
    $.app[options.entity_class] = response;
    if(callback) { callback(response); }
  });
}

function sort_by(list, field) {
  var sorted_list = [];
  $.each(list, function(index, item) {
    sorted_list[item[field]] = item;
  });
  return sorted_list;
}

function select_for (entity_class, explicit_name, require_default) {
  // Each object must have id & name attributes.
  var select = $("<select/>").attr("name",(explicit_name || entity_class))
  if(require_default == undefined) select.append($("<option/>").attr("value", "").html("-- none selected --"));

  $.each($.app[entity_class], function(index,entity) {
    select.append(
      $("<option/>").attr("value", entity["id"]).html(entity["name"])
    );
  });

  return select;
}

$.Date = {
  to_s: function(src_date) {
    if(src_date == null || src_date == "") {
      date = new Date;
    } else { 
   // if (src_date.match(/\d{4}:\d{2}:\d{2}T\d{2}:\d{2}:\d{2}.*/)) {
      date = $.Date.parseISO8601(src_date);
   // } else {
   //  date = new Date(Date.parse(src_date));
   // }
    }
    return $.Date.strftime(date,"%Y-%b-%D&nbsp;%I:%M&nbsp;%P")
  },
  locale: function() {
    var D = new Date;
    var DT = 2 * D.getTimezoneOffset() - (new Date(2004, 0)).getTimezoneOffset() - (new Date(2004, 6)).getTimezoneOffset();

    return {
      time:   D.toString(),
      offset: D.getTimezoneOffset(),
      summer: (DT == 0 ? "N/A" : DT > 0 ? "OFF" : "ON")
    }
  },
  parseISO8601: function(src_date_string_in_ISO8601_format) {
    return new Date(src_date_string_in_ISO8601_format.replace(/^(\d*)-(\d*)-(\d*)T/,"$1/$2/$3 "));
  },
  strftime: function(date,format) {
    var utcFlag = arguments[2] ? "UTC" : ""
    var day = date["get"+utcFlag+"Day"](), month = date["get"+utcFlag+"Month"]();
    var hours = date["get"+utcFlag+"Hours"](), minutes = date["get"+utcFlag+"Minutes"]();
    function pad(num) { var pad = num.toString(); while (pad.length < 2) {pad = '0' +pad} return pad}

    var formater = function(part) {
      switch(part[1]) {
        case 'a': return ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][day]; break;
        case 'A': return ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][day]; break;
        case 'b': return ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][month]; break;
        case 'B': return ["January","February","March","April","May","June","July","August","September","October","November","December"][month]; break;
        case 'c': return date["toString"](); break;
        case 'd': return date["get"+utcFlag+"Date"](); break;
        case 'D': return pad(date["get"+utcFlag+"Date"]()); break;
        case 'H': return pad(hours); break;
        case 'i': return (hours === 12 || hours === 0) ? 12 : (hours + 12) % 12; break;
        case 'I': return pad((hours === 12 || hours === 0) ? 12 : (hours + 12) % 12); break;
        case 'm': return pad(month + 1); break;
        case 'M': return pad(minutes); break;
        case 'P': return hours > 11 ? 'PM' : 'AM'; break;
        case 'p': return hours > 11 ? 'pm' : 'am'; break;
        case 'S': return pad(date["get"+utcFlag+"Seconds"]()); break;
        case 'w': return day; break;
        case 'y': return pad(date["get"+utcFlag+"FullYear"]() % 100); break;
        case 'Y': return date["get"+utcFlag+"FullYear"]().toString(); break;
        default : return part;
      }
    }
    return format.replace(/\%([aAbBcdDHiImMpPSwyY])/g, formater);
  }
}

// Debugging console helper.
$(document).ajaxError(function(){
  if (window.console && window.console.error) {
    console.error(arguments);
  }
});

function log(message, type) {
  if(type == null) { type="log" }
  if(typeof console != "undefined") {
    console[type](message);
  } 
}

/* 
replaceWith examples:

$('a#fooid').replaceWith('<span></span>');

before:
<a id="fooid" class="whatever">some text</a>

after:
<span id="fooid" class="whatever">some text</span>

*/
jQuery.fn.replaceWith = function(replacement) 
{
  return this.each (function() 
  {
    element = $(this);
    $(this).after(replacement).next().html(element.html());
    for (var i = 0; i < this.attributes.length; i++) {
      element.next().attr(this.attributes[i].nodeName, this.attributes[i].nodeValue);
    }
    element.remove();
  })
}

$.fn.replace = function(element) { return this.after(element).remove(); }; 

$.fn.toggle_loader = function(center) {
  if (center === true) {
    var offsetleft = this.width()/2 -16;
    if (this.height() < 85) { 
      var offsettop = 85;
    } else {
      var offsettop = this.height()/2 -16;
    }

    $(this).find(".loader").css({top: offsettop, left: offsetleft})

    $("<div class='loader'><img src='/images/theme-loader.gif'/></div>").
      css({position: 'absolute', top: offsettop, left: offsetleft }).
      appendTo(this);
    return this;
  }else {
    $(this).find(".loader").fadeOut();
    return this;
  } 
};

$(document).ready(function() { 
  $("a.lightbox").lightbox({
    fileLoadingImage : '/images/loading.gif',
    fileBottomNavCloseImage : '/images/closelabel.gif'
    }
  );
  $("a.login.button").overlay();
});

