/**
 * jsy 0.1.0
 * Copyright (c) 2008 Alexey Yu. Chuprina <656b61@gmail.com>
 * This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
 */

(function(){

var jsy = window.jsy = {version: '0.1.0'};

// dev help
function trace(){console.log.apply(null, arguments);};

var $ = window.jQuery;
var WINDOW = $(window);
var DOCUMENT = $(document);
var BODY; jQuery(function(){BODY = $(document.body);});

/* float
*******************************************************************************/
jsy.float = function(content, settings) {
	return (this instanceof jsy.float)
		? this.__construct(content, settings)
		: new jsy.float(content, settings);	
};
jsy.float.prototype = {
	_opened: false,	
	__construct: function(content, autoClose, settings) {
		this._autoClose = !!autoClose;		
		this._settings = jsy.merge(jsy.float.settings.window, settings);		
		this._container = $('<div style="position:absolute;display:none;top:0;left:0;">')
			.css(jsy.float.settings.window)
			.appendTo(BODY)
			.append(content);
		
		this._container.hide = function(){this[0].style.display = 'none';};
		this._container.show = function(){this[0].style.display = 'block';};		
	},
	refresh: function() {
		var left, top;
		var contW = this._container.width();
		var contH = this._container.height();		
		if (this._settings.left.toString().indexOf('%') > 0) {
			left = (WINDOW.width() - contW) / (100 / parseInt(this._settings.left));
		} else {
			left =  parseInt(this._settings.left);		
		}
		if (this._settings.top.toString().indexOf('%') > 0) {
			top = (WINDOW.height() - contH) / (100 / parseInt(this._settings.top));
		} else {
			top =  parseInt(this._settings.top);		
		}		
		
		left += document.documentElement.scrollLeft;
		top += document.documentElement.scrollTop;
		
		if (left < 0) left = 0;
		if (top < 0) top = 0;
		
		this._container.css({left: left, top: top});
	},
	autoClose: function(val) {
		this._autoClose = !!val;
	},
	open: function() {
		jsy.float._current = this; 
		this._opened = true;
		this._container.show();
		this.refresh();
		//WINDOW.resize(self._refresh);
		
		jsy.float._screen.show();
	},
	close: function() {
		this._opened = false;
		this._container.hide();
		jsy.float._screen.hide();
	}
};
jsy.float.settings = {
	screen: {
		'z-index': 9998,
		background: '#666',
		opacity: 0.5
		},
	window: {
		'z-index': 9999,
		padding: 10,
		left: '50%', top: '50%'
		}
};
jsy.float._screen = {
	_inited: false,
	_init: function() {
		if (jsy.float._screen._inited) return;
		jsy.float._screen._inited = true;		
		jsy.float._screen._container = $('<div style="position:absolute;top:0;left:0;display:none;">')
			.css(jsy.float.settings.screen)
			.appendTo(BODY);
		jsy.float._screen._container.hide = function(){this[0].style.display = 'none';};
		jsy.float._screen._container.show = function(){this[0].style.display = 'block';};
	},
	_refresh: function() {		
		var screen = jsy.float._screen._container; 
		screen.hide();
		
		var winW = WINDOW.width();
		var docW = ($.browser.msie && $.browser.version < 7) ? BODY.width() : DOCUMENT.width();
		var w = (winW >= docW) ? '100%' : docW;
		
		var winH = WINDOW.height();
		var docH = jQuery.browser.msie ? BODY.height() : DOCUMENT.height();
		var h = (winH >= docH) ? ($.browser.msie ? winH : '100%' ) : docH;
		
		screen.css({width: w, height: h}).show();
	},
	show: function() {
		var self = jsy.float._screen;
		self._init(); 				
		self._refresh();
		WINDOW
			.resize(jsy.float._onWindowResize)
			.keydown(jsy.float._onWindowKeyDown);
		self._container.click(jsy.float._onScreenClick);		
	},
	hide: function() {
		if (!jsy.float._current._opened) {
			WINDOW
				.unbind('resize', jsy.float._onWindowResize)
				.unbind('keydown', jsy.float._onWindowKeyDown);
			jsy.float._screen._container
				.unbind('click', jsy.float._onScreenClick)		
				.hide();
		}
	}
};
jsy.float._onWindowResize = function() {
	jsy.float._current.refresh();
	jsy.float._screen._refresh();
};
jsy.float._onWindowKeyDown = function(e) {
	if (e.which == 27 && jsy.float._current._autoClose) jsy.float._current.close();
};
jsy.float._onScreenClick = function() {
	if (jsy.float._current._autoClose) jsy.float._current.close();
};

/* merge
*******************************************************************************/
jsy.merge = function(obj1, obj2) {
	var result = {};
	for (var i in obj1) result[i] = obj1[i];
	for (var i in obj2) result[i] = obj2[i];
	return result;
};

/* cookie
*******************************************************************************/
jsy.cookie = {
	expire: {
		YEAR: 31536000,
		MONTH: 2592000,
		WEEK: 604800,
		DAY: 86400
	},
	set: function(name, value, expire, path, domain, secure) {
		if (expire) {
			with (new Date()) {				
				setTime(getTime() + (expire * 1000));
				expire = toGMTString();
			}
		}
		document.cookie = name + "=" + escape(value)
			+ ((expire) ? '; expires=' + expire : '')
			+ ((path) ? '; path=' + path : '')
			+ ((domain) ? '; domain=' + domain : '')
			+ ((secure) ? '; secure' : ''); 
	},
	get: function(name) {
		var cookie = document.cookie;
		var search = name + '=';
		var value = null;
		var offset = 0;
		var end = 0;
		if (cookie.length > 0) {
			offset = cookie.indexOf(search);
			if (offset != -1) {
				offset += search.length;
				end = cookie.indexOf(";", offset)
				if (end == -1) end = cookie.length;
				value = unescape(cookie.substring(offset, end));
			}
		}
		return value;
	}
};


})();