if (typeof(JSON) != 'object') JSON = {};
if (typeof(JSON.parse) != 'function') JSON.parse = function($j) {
	if ($j.charAt(0) == '(')
		return eval($j)
	else
		return eval( '('+ $j + ')' );
};

(function($){
	$.fn.checkmark = function($op) {
		var _opts = $.extend({
			on: '/=i_uncheck.gif', off: '/=i_check2.gif', checked: false}, $op);
    
		return this.each(function() {
			if ($(this).data('installed'))
				return false;
    
			$(this).data('installed',true).css('cursor','pointer');
    
			if (_opts.checked)
				$(this).html('<img src="'+_opts.on+'">').data('checked',true);
			else
				$(this).html('<img src="'+_opts.off+'">');
    
			$(this).click(function(){
				if ($(this).data('checked'))
					$('img', this).attr('src',_opts.off).parent().removeData('checked');
				else
					$('img', this).attr('src',_opts.on).parent().data('checked',true);
			});
		});
	};

	$.nvzTrim = function(str,dim) {
		if (!str) return null;
		if (!dim) dim = ',';
		var re = new RegExp(dim+'+','g');
		var m = new RegExp('^'+dim+'+|'+dim+'+$','g');
		return str.replace(re,',').replace(m,'');
	};
	
	$.nvzCookie = {
		get: function(name) {
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0;i < ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) 
					return c.substring(nameEQ.length,c.length);
			}
			return null;
		},

		set: function(k,v) {
			if (v) {
				var exp = new Date();
				exp.setTime(exp.getTime() + 3153600000);
				document.cookie = k + "=" + v + "; path=/; domain=.netvangelize.org; expires="+ exp.toGMTString() + '";';
			} else
				document.cookie = k + "=; path=/; domain=.netvangelize.org; expires=Thu, 01-Jan-1970 00:00:01 GMT;";
		}
	};

	$.uncountlinks = function($text) {
		var _parts = $text.split(' ');
		var _sum = 0;
		$.each(_parts,function(){
			if (this.substr(0,7) == 'http://')
				_sum += this.length;
		});
		return _sum;
	};

	$.fn.vertigro = function($max,$div) {
		return this.filter('textarea').each(function() {
			var grow = function(e) {
				if ($max && $div) {
					if ($(this).val().length > $max && e.which != 8) {
						var _len = $.uncountlinks($(this).val());
						$max = $(this).data('max')+_len;
						return false;
					}
					$($div).html($max-$(this).val().length);
				} else if (($max && this.clientHeight >= $max) 
					|| this.scrollHeight > $(window).height()-250) {
					$(this).css('overflow','auto').height($(window).height()-250);
					return true;
				}
				var h = parseInt($(this).css('lineHeight').replace(/px$/,''))||20;
				if (this.clientHeight < this.scrollHeight)
					$(this).height(this.scrollHeight + h + 'px');
			};
			$(this).data('max',$max||0).css('overflow','hidden').keydown(grow).keyup(grow).change(grow);
		});
	};

	$.nvzColumns = {
		auto_width: function() {
			if (screen.width == 1024 && $(window).width() == 1024) 
				$.nvzColumns.size = 246;
			return $.nvzColumns.size-26;
		},
		calculate: function($exe) {
			var _w = $(window).width();
			var _col = Math.floor(_w/$.nvzColumns.size);
			if (_col != $.nvzColumns.cols && _col) {
				if (!$.nvzColumns.cols)
					$.nvzColumns.handler();
				$.nvzColumns.cols = _col;
				if ($exe && $.isFunction($.nvzColumns.callback))
					$.nvzColumns.callback();
			}
		},
		handler: function() {
			var _tmr = null
			$(window).resize(function(){
				if (_tmr) clearTimeout(_tmr);
				_tmr = setTimeout("$.nvzColumns.calculate(1);",500);
			});
		},
		create: function($div) {
			if (!$.nvzColumns.cols)
				$.nvzColumns.calculate();
			var _cols = $.nvzColumns.cols;
			$($div).html('<table class="columns"><tr><\/tr><\/table>');
			$.nvzColumns.object = 
				$($div+' table.columns').width(_cols*$.nvzColumns.size)
				.find('tr');
			for (var c=0;c<_cols;c++)
				$('<td><div class="col"><\/div><\/td>')
					.width($.nvzColumns.size)
					.appendTo($.nvzColumns.object);
			
			if ($.isFunction($.nvzColumns.pre))
				$.nvzColumns.pre();
		},
		shortest: function() {
			var _c = 1;
			var _m = 0;
			for (var _i=0;_i<$.nvzColumns.cols;_i++) {
				var _h = $.nvzColumns.object
					.find('td:nth-child('+(_i+1)+') > div').height();
				if (!_h) { _c = _i+1; break; }
				if (_h <= _m) { _c = _i+1; _m = _h } 
				else if (!_m) _m = _h
			};

			$.nvzColumns.ptr = _c-1;
			return $.nvzColumns.object.find('td:nth-child('+_c+') > div');
		},
		pointer: function() {
			return $.nvzColumns.object.find('td:nth-child('
				+($.nvzColumns.ptr%$.nvzColumns.cols+1)+') > div');
		},
		index: function($idx) {
			return $.nvzColumns.object.find('td:nth-child('
				+(($idx||$.nvzColumns.ptr++)%$.nvzColumns.cols+1)+') > div');
		},
		object: null, size: 266, cols: 0, callback: null, ptr: 0
	};

	$.fn.comment = function($op) {
		var _opts = $.extend({
			perm:7, replyto:'', select:'pub', anon:false, 
			destroy:false, padding: 0, limit: 0
		}, $op);
    
		return this.each(function() {
			var _obj = $(this);
			var _uid = new Date(); _uid = 'id'+_uid.getTime();

			var _cancel = function() {
				_obj.removeData('installed').next().remove();
				$.isFunction(_opts.callback) && _opts.callback({status:'cancel'});
			}

			if (_obj.data('installed')) {
				if (_opts.destroy)
					_obj.removeData('installed').next().remove();
				else {
					_obj.next().fadeIn().find('textarea').get(0).focus();
					return false;
				}
			}
			if (!_opts.select.match(/^(pub|fri|pri)$/))
				_opts.select = 'pri';
    
			_obj.data('installed',true);
			var _w = (_opts.width||_obj.outerWidth())-(_opts.padding*2);
			var _elem = $('<div title="reply" class="corners"><form onsubmit="return false;"><\/form><\/div>')
				.hide().css({
					width:_w,padding:_opts.padding+'px',marginLeft:_opts.margin,
					backgroundColor:$.mau.s4,color:$.mau.sD});

			var _style = {width: _w-14, margin: '0px 2px 5px 0px', 
					padding: '5px', backgroundColor: $.mau.sE, 
					border: '2px solid '+$.mau.sA };

			if (_opts.title) {
				$('<div class="hdr">'+$.Trans.Title+'<\/div>'
				+'<input type="text" name="subject">'
				+'<div class="hdr">'+$.Trans.WriteBlog+'<\/div>')
					.appendTo(_elem.find('form'));
				_elem.find('input[name="subject"]').css(_style);
			}

			$('<textarea><\/textarea>')
				.val(_opts.replyto)
				.css(_style)
				.appendTo(_elem.find('form'));

			$('<input type="button" class="btn" value="'+$.Trans.Write+'">')
				.click(function(){ 
					var _note = _elem.find('textarea').val();
					var _title = _elem.find('input[name="subject"]').val();
					if (!_note || _opts.replyto == _note) {
						_elem.find('textarea').get(0).focus();
						return false;
					}
					if (_opts.title && (!_title || _title.match(/^\s*$/))) {
						_elem.find('input[name="subject"]').get(0).focus();
						return false;
					}
						
					if ($.isFunction(_opts.callback))
						_opts.callback({
							title: _title,
							text: _note,
							perm: _elem.data('select'),
							name: _elem.find('input[name="name"]').val()
						});
					_elem.slideUp('fast',function(){ _elem.remove(); _obj.removeData('installed'); });
				})
				.appendTo(_elem.find('form'));

			$('<input type="button" class="btn" value="'+$.Trans.Cancel+'">')
				.click(function(){ 
					_opts.destroy 
						? _cancel()
						: _obj.next().slideUp(); 
				})
				.appendTo(_elem.find('form'));

			if (_opts.perm) {
				$('<div class="perm"><\/div>').insertAfter(_elem.find('textarea'));
				$.each(['pub','fri','pri'],function($i){
					if (1<<$i & _opts.perm)
						$('<img title="'+this+'" src="/=i_'+this+'.gif">')
							.appendTo(_elem.find('div.perm'));
				});
				_elem.find('div.perm img').click(function(){
					if (_elem.data('select'))
						_elem.find('div.perm img[title="'+_elem.data('select')+'"]')
							.css('backgroundColor','transparent');
    
					$(this).css('backgroundColor',$.mau.s0);
					_elem.data('select',$(this).attr('title'));
				});
				_elem.find('div.perm img[title="'+_opts.select+'"]')
					.trigger('click');
			} else if (_opts.anon && !$.defaults.id) {
				_elem.find('textarea')
					.before('<div class="hdr">'+$.Trans.Respond+'<\/div>')
					.after('<div class="hdr">'+$.Trans.Name+'<\/div>')
				$('<input type="text" name="name" value="'+_opts.name+'">')
					.css({width: '85px', height: '18px', margin: '0px 2px 0px 0px', 
						backgroundColor: $.mau.sE, border: '1px solid '+$.mau.sA 
					}).insertAfter(_elem.find('div:last'));
				_elem.insertAfter(this).corners().fadeIn('fast')
					.find('textarea').get(0).focus();
				return false;
			}

			if (_opts.limit > 10)
				_elem.find('textarea').after('<div style="float:right" class="'+_uid+'">'+_opts.limit+'<\/div>')
					.vertigro(_opts.limit,'div.'+_uid);
			else
				_elem.find('textarea').vertigro();

			_elem.insertAfter(this).corners();
			if (_opts.title)
				_elem.fadeIn('fast').find('input[name="subject"]').get(0).focus();
			else
				_elem.slideDown('fast').find('textarea').cursorat(0,-1).get(0).focus();
		});
	};

	$.fn.cursorat = function($s,$e) {
		return this.filter('textarea').each(function() {
			var _s = $s || 0;  if (_s == -1) _s = this.value.length;
			var _e = $e || _s; if (_e == -1) _e = this.value.length;

			if (this.setSelectionRange) { 
				this.focus(); 
				this.setSelectionRange(_s,_e); 
			} else if (this.createTextRange) { 
				var _r = this.createTextRange(); 
				_r.collapse(true); 
				_r.moveEnd('character', (_s,_e)); 
				_r.moveStart('character', _s); 
				_r.select(); 
			} 
		});
	};

	$.fn.securibox = function($op) {
		var _opts = $.extend({list:{
			'pub': $.Trans.Public,
			'fri': $.Trans.Friends,
			'pri': $.Trans.Private,
			'del': $.Trans.Delete}
		}, $op);
    
		return this.each(function() {
			if (!$(document.body).is(":has('div#securibox')"))
				$('<div id="securibox"><\/div>').hide()
					.css({ position: 'absolute', padding: '5px 5px 2px 5px', 
						backgroundColor: $.mau.sE, color: $.mau.s4 })
					.appendTo(document.body);
    
			var _obj = $(this);
			var _box = $('#securibox').empty();
			var _perm = _opts.perm || _obj.attr('title');
			$.each(_opts.list,function($i){
				var _i = $('<img title="'+this+'" src="/=i_'+$i+'.gif">');
				if ($i == 'del')
					_i = $('<img title="'+this+'" src="/=i_delete.png">')
						.css({padding: '2px', border: 0, marginLeft: '10px'});
				else if (_perm == $i)
					_i.css({backgroundColor: $.mau.s4, borderColor: $.mau.s0});
				_i.data('type',$i).appendTo(_box);
			});
			var _l = $(this).position().left-_box.outerWidth();
			_box.css({backgroundColor: $.mau.sF, left: _l, top: $(this).position().top-5}).show()
				.hover(
					function(){ $(this).show() },
					function(){ $(this).fadeOut() })
				.find('img').click(function(){
					var _type = $(this).data('type');
					if (_type == 'del')
						if (!confirm($.Trans.ConfirmDelete)) {
							_box.fadeOut();
							return false;
						}
    
					if (_type != _perm) {
						if ($.isFunction(_opts.cb))
							_opts.cb(_type);
						_obj
							.attr('src',$(this).attr('src'))
							.attr('title',_opts.perm?_opts.list[_type]:_type);
					}
					_box.fadeOut();
				})
				.hover(
					function(){ $(this).css('borderColor',$.mau.s0) },
					function(){ $(this).css('borderColor',$.mau.sA) }
				);
    
			return false;
		});
	};
	$.fn.search = function($op) {
		return this.filter('form').each(function() {
			var _ob = $(this);
			var _fnd = function() {
				var _val = $(this).find('input:first').val();
				document.location.href = 
					(_val.indexOf('@') == 0)
					? '/'+_val.substring(1)
					: _ob.data('target')+encodeURIComponent(encodeURIComponent(_val));
			};

			if (_ob.data('target')) {
				if ($op == 'remove')
					_ob.unbind('submit').data('target',false);
				else if (typeof $op == 'string')
					_ob.unbind('submit').data('target',$op).submit(_fnd);
				return false;
			}

			_ob.data('target','/search:');
			_ob.submit(_fnd);
		});
	};

	$.filesize = function($bytes,$type) {
		var _s = $bytes;
		$type = $type||'k';
		switch($type.toLowerCase()) {
			case 'k': _s = Math.round(($bytes/1024)*100)/100 + 'k'; break;
			case 'm': _s = Math.round(($bytes/1048576)*100)/100 + 'M'; break;
			case 'g': _s = Math.round(($bytes/1073741824)*100)/100 + 'G'; break;
		};
		return _s;
	};

	$.fn.submit13 = function() {
		if (!navigator.userAgent.match(/MSIE/)) 
			return false;

		var _form = this;
		return this.find(':input').not(':submit').each(function() {
			$(this).keydown(function($e){
				if ($e.keyCode == 13) {
					_form.find(':submit').trigger('click');
					return false;
				}
			});
		});
	};
})(jQuery);
