/**
 * NETBEK
 *
 * @author Hein Bekker
 * @copyright (c) 2010 Hein Bekker
 * @license New BSD License
 */
(function() {
	if (typeof(NETBEK) == "undefined"){
		var NETBEK = function() {
			if (window == this || !this.init){
				return new NETBEK();
			}
			else{
				return this.init();
			}
		};
	}

	NETBEK.prototype = {
		regexp_meta_chars: ['\\', '^', '$', '.', '[', ']', '|', '(', ')', '?', '*', '+', '{', '}', '-'],
		defaults: {
			flash_version: '',
			has_flash_version: false,
			has_flash: false
		},
		config: {},
		listeners: {},
		ajax: {},
		cache: {},
		canvas: null, // Raphael canvas
		objs: [], // Raphael objects
		canvas_elm: null,
		container_elm: null,
		content_elm: null,

		/**
		 *
		 */
		init: function(){
			this.config = this.defaults;

			return this;
		},

		/**
		 *
		 */
		setup: function(){
			this.canvas_elm = $('#canvas');
			this.container_elm = $('#container');
			this.content_elm = $('#content');
			this.canvas = Raphael('canvas', 0, 0);

			this.container_elm.css('margin-top', 0);
		},

		/**
		 *
		 */
		clear: function(){
			this.canvas.clear();
		},

		/**
		 *
		 */
		draw: function(){
			var viewport_height = $(window).height(),
				viewport_width = $(window).width(),
				container_elm_height = this.container_elm.outerHeight(),
				container_elm_width = this.container_elm.outerWidth(),
				scroll_height = Math.max(viewport_height, container_elm_height),
				scroll_width = Math.max(viewport_width, container_elm_width),
				content_elm_height = this.content_elm.outerHeight();

			// Clear canvas
			this.clear();

			// Draw objects
			var circle = this.canvas.circle(0, scroll_height / 2, 155);
			circle.attr({
				'stroke': '#000000',
				'stroke-width': 60
			});

			// Set dimensions
			$(document.body).css({
				'min-height': scroll_height,
				'min-width': scroll_width
			});
			this.canvas_elm.css({
				height: scroll_height,
				width: scroll_width
			});
			this.canvas.setSize(scroll_width, scroll_height);

			// For WebKit
			this.canvas.safari();

			// Position elements
			this.container_elm.css('top', Math.max(0, Math.floor((viewport_height - container_elm_height) / 2)));
			this.content_elm.css('top', Math.floor((container_elm_height - content_elm_height) / 2));
		},

		/**
		 * Get a configuration value.
		 *
		 * @param $key string Key name.
		 * @param $default mixed Default value.
		 * @return mixed
		 */
		get: function($key, $default){
			if ($key === 'session_id'){
				return $.cookie( this.get('session_name') );
			}

			if (this.config[$key] == undefined){
				if ($default != undefined){
					return $default;
				}
				else {
					return null;
				}
			}

			return this.config[$key];
		},

		/**
		 * Set a configuration value.
		 *
		 * @param $key string|object Key name, or array of keys and values.
		 * @param $value mixed Value.
		 * @return void
		 */
		set: function($key, $value){
			// Prevent these variables from being overwritten
			if ($key == 'win' || $key == 'doc' || $key == 'opera_fix' || $key == 'session_name'){
				return;
			}

			if (typeof ($key) == 'object'){
				for (var i in $key){
					this.config[i] = $key[i];
				}
			}
			else {
				this.config[$key] = $value;
			}
		},

		/**
		 * Opens an obfuscated mailto: redirect link as a normal mailto: link.
		 *
		 * @param $url
		 * @param $redirect
		 * @return void
		 */
		redirectMailto: function($url, $redirect){
			var base = this.get('mailto_base_path');
			var pos = $url.indexOf(base);
			var query = '', args = {}, arr = [], k, v;

			if (pos > -1){
				$url = $url.substr(pos + base.length);
			}

			$url = this.trim($url, '/');

			if ($url === ''){
				return false;
			}

			var parts = $url.split('/');

			if (parts.length < 2){
				return false;
			}

			if (parts.length > 2){
				query = parts[2];
			}
			else{
				query = parts[1];
			}

			pos = query.indexOf('?');

			if (pos > -1){
				query = query.substr(pos+1);

				if (parts.length == 2){
					parts[1] = parts[1].substr(0, pos);
				}

				arr = query.split('&');

				for (var i=0; i < arr.length; i++){
					pos = arr[i].indexOf('=');

					if (pos < 0){
						continue;
					}

					k = arr[i].substr(0, pos);
					v = arr[i].substr(pos+1);

					switch (k.toLowerCase()){
						case 's' :
							args.subject = v;
							break;

						case 'b' :
							args.body = v;
							break;
					}
				}

				query = '';

				for (k in args){
					query += (query === '' ? '?' : '&') + k + '=' + args[k];
				}

				parts[2] = query;
			}

			$url = 'mailto:' + parts[0] + '@' + parts[1] + (parts[2] == null ? '' : parts[2]);

			if ($redirect == null || $redirect){
				window.location = $url;
				return false;
			}

			return $url;
		},

		/**
		 *
		 */
		trim: function($str, $char){
			if ($str != undefined){
				return this.ltrim(this.rtrim($str, $char), $char);
			}
			else{
				return '';
			}
		},

		/**
		 *
		 */
		ltrim: function($str, $char){
			if ($str != undefined){
				$str = $str.replace(/^(\s|\f|\n|\r|\t|\v|\u00A0|\u2028|\u2029)+/i, '');

				if ($char != undefined){
					// Escape regular expression meta characters
					if (jQuery.inArray($char, this.regexp_meta_chars) > -1){
						$char = '\\' + $char;
					}

					$str = $str.replace(new RegExp('^(' + $char + ')+', 'i'), '');
				}

				return $str;
			}
			else{
				return '';
			}
		},

		/**
		 *
		 */
		rtrim: function($str, $char){
			if ($str != undefined){
				$str = $str.replace(/(\s|\f|\n|\r|\t|\v|\u00A0|\u2028|\u2029)+$/i, '');

				if ($char != undefined){
					// Escape regular expression meta characters
					if (jQuery.inArray($char, this.regexp_meta_chars) > -1){
						$char = '\\' + $char;
					}

					$str = $str.replace(new RegExp('(' + $char + ')+$', 'i'), '');
				}

				return $str;
			}
			else{
				return '';
			}
		}
	};

	window.$NETBEK = NETBEK();
})();
