﻿

/**
  * MSML.Bookmark 
  * 
  * @description
  * Handles browser bookmarking
  * 
  * @copyright       Neue Digitale / Razorfish 
  * @author          martin.krause@neue-digitale.de
  * @version         1.0
  *
  * @revision        $Revision$
  * @lastmodified    $Date$
  *
  * @jslint          2009-01-28
  *
  */
  
MSLM.bookmark = {
	
	__version: 1.0, // class version 
	__class: 'MSLM.bookmark', // class name
	 
	// set default options
	_oDefaults: {
		sSelector: '.bookmark'
	},
	 
	/**
	 * Setup
	 * @param {Object} [oOptions]
	 * @return {Void}
	 */
	_setUp: function (oOptions) {
		var _scope = MSLM.bookmark;
		// merge options and defaults
		_scope._oOpt = jQuery.extend({},_scope._oDefaults, oOptions);
		_scope._oDefaults = null;
		
		// add event on bookmark element
		jQuery(_scope._oOpt.sSelector)
			.bind('click.MSLMBookmark',MSLM.bookmark.getInstance().trigger);
			
	},
	
	/**
	 * Adds this page to the browsers favorites
	 * @param {Event}
	 * @see _doTrigger
	 * @return {Void}
	 */
	trigger: function (event) {
		// set up
		var sTitle = MSLM.config.sBookmarkDefaultTitle || document.title;
		var sUri = MSLM.config.sBookmarkDefaultUri || location.href;
		var $element = jQuery(event.target) || jQuery(event);
		// trigger action
		return MSLM.bookmark._doTrigger(sTitle,sUri,$element);

	},
	
	 /**
	 * Actually adds the specified page to the browsers favorites
	 * @param {String} [sTitle], title
	 * @param {String} [sUri], uri
	 * @return {Void}
	 * @private
	 */
	_doTrigger: function (sTitle,sUri,$element) {
 		if (jQuery.browser.safari) {
			window.alert((MSLM.config.sBookmarkSafariAdvice));
			return false;
		}
		// ie: http://msdn.microsoft.com/en-us/library/ms535926(VS.85).aspx
		// ie breaks on check for window.external.AddFavorite
 		if (window.external && jQuery.browser.msie) {
			window.external.AddFavorite(sUri, sTitle);
			return false;
		} 
		// moz: https://developer.mozilla.org/en/DOM/window.sidebar
		if (window.sidebar && window.sidebar.addPanel) {
			// adding to sidebar is the only possibility
			window.sidebar.addPanel(sTitle, sUri, "");
			return false;
		}
		// op:http://help.opera.com/Windows/9.00/en/panels.html
		// would work for ff2+, but as long as they provide window.sidebar.addPanel we'll stick to this one 
		else {
			$element
				.attr({
					'rel':'sidebar',
					'title':sTitle,
					'href':sUri
					});
			// since we're using the browser default behaviour, we can't cancel the original event
			return true;
		}
	},
	
	 /**
	 * Get singleton instance
	 * @param {Object} [oOptions]
	 * @return {Instance}
	 */
	getInstance: function (oOptions) {
		return MSLM.bookmark.initialize(oOptions);
	},
	
	 /**
	 * Constructor
	 * @param {Object} [oOptions]
	 * @constructor
	 */
	initialize: function (oOptions) {
		// fake singleton
		if (this._oOpt) {
			return this;
		}
		// setup 
		this._setUp(oOptions);
		// fake singleton
		return this;
	}
	
};
