(function($){
  /**
   * The global namespace for the cookie based navigation plugin
   */

  $.cookienav = $.cookienav || {};
	
  $.cookienav.Defaults = {
  	// the name to use for the cookie
  	cookiename : "TIS_DESTNAV",
  	cookiepath : "/",
  	createWindowName : function() { return Math.round(Math.random()*10000000); },
  	createHTML : function(entries, link) {
  	  if (entries) {
  	    var html = "";
  	    for (var i = 0; i < entries.length; i++) {
  	      var modlink = link.replace(/,objectId,(.)*?,/, ",objectId," + entries[i].id + ",");
  	      modlink = link.replace(/\/objectId,(.)*?,/, "/objectId," + entries[i].id + ",");
            html += "<span><a href=\"" + modlink + "\">" + entries[i].name + "</a></span><br />";
          }
  	    return html;
  	  }
  	  return "";
  	}
  };
  
  $.cookienav.variables = { };
  
  $.fn.cookienav = function(method, options, callback) {
  	return this.each(function() {
  	  if (method == "init") {
  	    new $.cookienav.init(this, options, callback);
  	  } else if (typeof method == 'object' || method == null) {
  	    new $.cookienav.init(this, method, options);
  	  } else if (typeof options == 'function'){
  	    new $.cookienav[method](options);
  	  } else {
  	    try {
  	      new $.cookienav[method](options, callback);
  	    } catch(err) {
  	      throw new Error("Function " + method + " does not exist!");
  	    }
  	  }
  	});
  };
  
  $.cookienav.init = function(el, options, callback) {
    // First we create out options object by checking passed options
    // and that no defaults have been overidden
    var options = $.cookienav.Options = $.extend({}, $.cookienav.Defaults, options);

    // Initialise the Navigation object
    //$.cookienav.NavData = $.cookienav._loadFromCookie(options);
    
	
    // Name the current window if it has not been named before
    //$.cookienav._setWindowName(options);
    $.cookienav._initWindow();
	
    if (typeof callback == 'function') return callback(el, options);
  };
  
  $.cookienav.shouldReadBreadCrumbFromBar = function(details, callback) {
    //var breadcrumbs = $.cookienav._getBreadcrumbs($.cookienav.Options);
    var breadcrumbs = $.cookienav.currentBreadcrumb;
    if (breadcrumbs["2"] && breadcrumbs["2"].readFromPage) {
      $.cookienav.variables.readFromBreadcrumbbar = true;
    } else {
      $.cookienav.variables.readFromBreadcrumbbar = false;
    }
    if (typeof callback == 'function') return callback(el, options);
  };
  
  $.cookienav.getBreadcrumb = function(details, callback) {
    //var breadcrumbs = $.cookienav._getBreadcrumbs($.cookienav.Options);
    var breadcrumbs = $.cookienav.currentBreadcrumb;
    if (breadcrumbs) {
      $.cookienav.variables.breadcrumb = breadcrumbs[details.number.toString()];	
    } else {
      delete ($.cookienav.variables.breadcrumb);
    }
  };
  
  $.cookienav.addBreadcrumb = function(details, callback) {
    //var breadcrumbs = $.cookienav._getBreadcrumbs($.cookienav.Options);
    var breadcrumbs = $.cookienav.currentBreadcrumb;
    
    var number = details.number;
    var navEntries = details.entries;
    var automaticallyAdded = details.auto;
    
    if (number == 2) {
      $.cookienav._createBreadcrumb(breadcrumbs, 2, navEntries, false, automaticallyAdded );
      $.cookienav._createBreadcrumb(breadcrumbs, 3, undefined, false, automaticallyAdded);
    } else if (number == 3) {
      $.cookienav._createBreadcrumb(breadcrumbs, 3, navEntries);	
      if (!breadcrumbs["2"]) {
        $.cookienav._createBreadcrumb(breadcrumbs, 2, navEntries, true);
      } else {
      	var breadcrumb = breadcrumbs["2"];
      	if (breadcrumb.auto) {
      	  $.cookienav._createBreadcrumb(breadcrumbs, 2, navEntries, true);
      	}
      }
    } else {
      // do nothing	
    }
    $.cookienav._storeBreadcrumbs();
    // store to window.name instead
    
	  if (typeof callback == 'function') return callback(el, options);
  };
  
  $.cookienav.eraseBreadcrumbs = function(details, callback) {
  	if (window.name) {
  	  delete $.cookienav.currentBreadcrumb;
  	  $.cookienav._storeBreadcrumbs();
  	}
  	
  	if (typeof callback == 'function') return callback(el, options);
  };
  
  $.cookienav.applyFedstateChanges = function(details, callback) {
  	$.cookienav.getBreadcrumb({ number: 2}, null);
  	var breadcrumb = $.cookienav.variables.breadcrumb;
  	if (breadcrumb) {
  	  var link = jQuery("#destBcBox2 .listLike a").attr("href");
  	  jQuery("#destBcBox2 .listLike").html($.cookienav.Options.createHTML(breadcrumb.entries, link));
  	  $.cookienav._modifyChangeLink($("#destBcBox3 .link a"), breadcrumb.entries);
  	  jQuery("#destBcBox2 .space1px").addClass("space10px").removeClass("space1px");
  	}
  };
  
  $.cookienav.applyRegionChanges = function(details, callback) { 
  	$.cookienav.getBreadcrumb ({ number: 3 }, null);
  	var regions = $.cookienav.variables.breadcrumb;
  	if (regions) {
        var link = jQuery("#destBcBox3 .listLike a").attr("href");
  	  jQuery("#destBcBox3 .listLike").html($.cookienav.Options.createHTML(regions.entries, link));
  	  	  
  	  var link = jQuery("#destBcBox4 .listLike a").attr("href");
  	  
  	  $.cookienav.getBreadcrumb ({ number: 2 }, null);
  	  var fedstates = $.cookienav.variables.breadcrumb;
  	  
  	  $.cookienav._modifyChangeLink($("#destBcBox4 .link a"), fedstates.entries, regions.entries);
  	}
  };
   
  $.cookienav._modifyChangeLink = function(link, entries1, entries2) {
  	if (entries1 && link && link.attr("href")) {
  	  if (entries2) {
    		// entries 1 == fedstate entries
    		// entries 2 == region entries
    		var url = link.attr("href");
    		var replacementUrlFragment = ""; 
  		
    		if (entries2.length == 1) {
    		  replacementUrlFragment += "objectId," + entries2[0].id + ",";
    		  if (entries1.length == 1) {
      			// 1 fedstate => lsbo needs to be added in case this is a region
      			// located in two or more fedstates.  
      			replacementUrlFragment += "lsbo," + entries1[0].id + ",";	
    		  } 
       	}
  		
    		var newurl = url.replace(/,objectId,(.)*?,/, "," + replacementUrlFragment);
    		newurl = newurl.replace(/\/objectId,(.)*?,/, "/" + replacementUrlFragment);
    		link.attr("href", newurl);
  	  } else {
    		var url = link.attr("href");
    		var newid = entries1[0].id;
    		var addids = "";
    		for (var i = 1; i < entries1.length; i++) {
    		  addids += "addObjId," + entries1[i].id + ",";	
    		}
    		var newurl = url.replace(/,objectId,(.)*?,/, ",objectId," + newid + "," + addids);
    		newurl = newurl.replace(/\/objectId,(.)*?,/, "/objectId," + newid + "," + addids);
    		link.attr("href", newurl); 
  	  }
  	}
  };
  
  $.cookienav._createBreadcrumb = function(breadcrumbs, number, entries, readFromPage, automaticallyAdded) {
  	var breadcrumb = {};
  	breadcrumbs[number.toString()] = breadcrumb;
  	if (readFromPage) {
  	  breadcrumb.readFromPage = true;	
  	} else if (entries) {
  	  breadcrumb.entries = entries;  
  	  if (automaticallyAdded) {
  	    breadcrumb.auto = true;  
  	  }
  	} else {
  	  delete breadcrumbs[number.toString()];	
  	}	
  };
  
  $.cookienav._initWindow = function(options) {
    var validbreadcrumb = false;
    if (window.name && window.name.length > 10) {
      try {
        breadcrumbdata = jQuery.secureEvalJSON(window.name);
        $.cookienav.currentBreadcrumb = breadcrumbdata;
        validbreadcrumb = true;
      } catch (e) {
        // parsing failed for unknown reason
        validbreadcrumb = false;
      }
    }
    
    if (!validbreadcrumb) {
      try {
        if (window.opener && window.opener.name) {
          breadcrumbdata = jQuery.secureEvalJSON(window.opener.name);
        } else {
          breadcrumbdata = {};
        }
      } catch (e) {
        // parsing of parent document failed for unknown reason - create empty object
        breadcrumbdata = {};
      }  finally {
        $.cookienav.currentBreadcrumb = breadcrumbdata;
        $.cookienav._storeBreadcrumbs();
      }
    }
  };
  
  $.cookienav._clearBreadcrumb = function(name, number) {
    NavData[name][number.toString()] = null;  
  };
  
  $.cookienav._storeBreadcrumbs = function(data, options) {
    if ($.cookienav.currentBreadcrumb) {
      try {
        window.name = $.compactJSON($.cookienav.currentBreadcrumb);
      } catch (e) {
        // invalid data passed to compactJSON (maybe a function or undefined) 
      }
    } else {
      window.name = undefined;  
    }
  }

})(jQuery);