$.fn.islink=function(c){
	$(this).css({'cursor':'pointer'}).click(function(){
		var r=$(this).attr('rel').split(',');
		var u=(c.url===undefined)?r[1]:c.url;
		var t=(c.target===undefined)?r[2]:c.target;
		if(r[3]!==undefined){
			var p=r[3].split('&');
			$('body').append( $.create('form',{'method':'POST','action':u,'id':'islinkposter'},[]) );
			$.each(p, function(k,v){
				var inp=v.split('=');
				$('#islinkposter').append( $.create('input',{'type':'hidden','name':inp[0],'value':inp[1]},[]) );
			});
			$('#islinkposter').submit();
		}
		var u=(u===undefined)?'#':u;
		if(t=='_blank'||t=='blank') { window.open(u); }
		else { location.href=u; }
	});
};

$.rand = function(c) {
	if (typeof(c)!='object'||c.min===undefined||c.max===undefined) { throw new Error('Warning: rand() expects exactly 2 parameters'); }
    return Math.floor(Math.random() * (c.max - c.min + 1)) + c.min;
};

$.chq = function(c) {
	if (typeof(c)!='string'||c.length==0) { return c; }
    return c.replace('"','&quot;').replace("'",'&#39;').replace("`",'&#96;').replace('<','&lt;').replace('>','&gt;');
};

$.dechq = function(c) {
	if (typeof(c)!='string'||c.length==0) { return c; }
    return c.replace('&quot;','"').replace("&#39;","'").replace("&#96;","`").replace("&acute;","`").replace('&lt;','<').replace('&gt;','>');
};

$.intval = function(v, b) {
    var x, t = typeof(v);
    if (t === 'boolean') {  return (v) ? 1 : 0;  } 
	else if (t === 'string') {  x = parseInt(v, b || 10);  return (isNaN(x) || !isFinite(x)) ? 0 : x;  }
	else if (t === 'number' && isFinite(v) ) {  return Math.floor(v); }
	else { return 0; }
};

$.is_numeric = function(v) {
    return (typeof(v) === 'number' || typeof(v) === 'string') && v !== '' && !isNaN(v);
};

$.in_array = function(needle, haystack) {
    var key = '';
	for (key in haystack) { if (haystack[key] == needle) { return true; } }
    return false;
};
	
$.isoverlap = function(c) {
	var atlx = $.intval(c.obj.x),
	atly = $.intval(c.obj.y),
	atrx = ($.intval(c.obj.x) + $.intval(c.obj.w)),
	atry = $.intval(c.obj.y),
	ablx = $.intval(c.obj.x),
	ably = ($.intval(c.obj.y) + $.intval(c.obj.h)),
	abrx = ($.intval(c.obj.x) + $.intval(c.obj.w)),
	abry = ($.intval(c.obj.y) + $.intval(c.obj.h)),
	btlx = $.intval(c.over.x),
	btly = $.intval(c.over.y),
	btrx = ($.intval(c.over.x) + $.intval(c.over.w)),
	btry = $.intval(c.over.y),
	bblx = $.intval(c.over.x),
	bbly = ($.intval(c.over.y) + $.intval(c.over.h)),
	bbrx = ($.intval(c.over.x) + $.intval(c.over.w)),
	bbry = ($.intval(c.over.y) + $.intval(c.over.h)),
	tl = false,
	tr = false,
	bl = false,
	br = false,
	up = false,
	under = false;
	
	if ( ( atlx >= btlx && atlx <= btrx ) && ( atly >= btly && atly <= bbly ) ) { tl = true; }
	if ( ( atrx >= btlx && atrx <= btrx ) && ( atry >= btry && atry <= bbry ) ) { tr = true; }
	if ( ( ablx >= bblx && ablx <= bbrx ) && ( abry >= btry && abry <= bbry ) ) { bl = true; }
	if ( ( abrx >= bblx && abrx <= bbrx ) && ( abry >= btry && abry <= bbry ) ) { br = true; }
	up = (tl===true||tr===true||bl===true||br===true) ? true : false ;
	
	if ( ( btlx >= atlx && btlx <= atrx ) && ( btly >= atly && btly <= ably ) ) { under = true; }
	if ( ( btrx >= atlx && btrx <= atrx ) && ( btry >= atry && btry <= abry ) ) { under = true; }
	if ( ( bblx >= ablx && bblx <= abrx ) && ( bbry >= atry && bbry <= abry ) ) { under = true; }
	if ( ( bbrx >= ablx && bbrx <= abrx ) && ( bbry >= atry && bbry <= abry ) ) { under = true; }
	
	return {'tl':tl,'tr':tr,'bl':bl,'br':br,'up':up,'under':under};
};


$.define = function(key, value) {
	if (eval( "window." + key.toUpperCase() )!==undefined) throw new Error('Warning: global value ' + key.toUpperCase() + ' already exists');
	var set = (typeof value == 'number' && isFinite(value)) ? "window." + key.toUpperCase() + " = " + value + ";" : "window." + key.toUpperCase() + " = '" + value + "';" ;
	eval( set );
};

$.session = function(name, value, options){
	if (window.COOKIE_PATH===undefined) throw new Error('Warning: please define a COOKIE_PATH as global');
	if (window.COOKIE_DOMAIN===undefined) throw new Error('Warning: please define a COOKIE_DOMAIN as global');
	var name = (name===undefined) ? (document.cookie.split(';').length + 1) : name ;
	
	if (value!==undefined) {
		var options = (options===undefined) ? {} : options ;
		options.expires = (options.expires===undefined) ? 10 : options.expires ;
		options.global = (options.global===undefined) ? false : options.global ;
		options.secure = (options.secure===undefined || typeof(options.secure)!='boolean' || options.secure===false) ? '' : '; secure' ;
		
		var expires = '';
		if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
			var date;
			if (typeof options.expires == 'number') {
				date = new Date();
				date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
			} else {
				date = options.expires;
			}
			expires = '; expires=' + date.toUTCString();
		}
		
		if (options.global===true) { $.define(name, value); }
		
		COOKIE_PATH = COOKIE_PATH ? '; path=' + (COOKIE_PATH) : '';
		COOKIE_DOMAIN = COOKIE_DOMAIN ? '; domain=' + (COOKIE_DOMAIN) : '';
		document.cookie = [name, '=', encodeURIComponent(value), expires, COOKIE_PATH, COOKIE_DOMAIN, options.secure].join('');
	} else {
		var sesval = null;
		if (document.cookie && document.cookie != '') {
			var cookies = document.cookie.split(';');
			for (var i = 0; i < cookies.length; i++) {
				var cookie = jQuery.trim(cookies[i]);
				if (cookie.substring(0, name.length + 1) == (name + '=')) {
					sesval = decodeURIComponent(cookie.substring(name.length + 1));
					break;
				}
			}
		}
		return sesval;
	}
};

$.sessionunset = function(name){
	if (window.COOKIE_PATH===undefined) throw new Error('Warning: please define a COOKIE_PATH as global');
	if (window.COOKIE_DOMAIN===undefined) throw new Error('Warning: please define a COOKIE_DOMAIN as global');
		
	if (name.toUpperCase()!==undefined) { $.define(name, ''); }
	
	var date = new Date();
	COOKIE_PATH = COOKIE_PATH ? '; path=' + (COOKIE_PATH) : '';
	COOKIE_DOMAIN = COOKIE_DOMAIN ? '; domain=' + (COOKIE_DOMAIN) : '';
	document.cookie = [name, '=0', date.toUTCString(), COOKIE_PATH, COOKIE_DOMAIN].join('');
};

$.fn.validate = function(c) {
	c.outputtarget 		= (c.outputtarget===undefined) ? $(this) : c.outputtarget ;
	c.output			= (c.output===undefined) ? 'alert' : c.output ;
	c.onchange			= (c.onchange===undefined) ? false : c.onchange ;
	c.defaultmsg		= (c.defaultmsg===undefined) ? 'Form field value error' : c.defaultmsg ;
	
	var o = $(this);
	$(this).submit( function(){
		var msg_stack = new Array();
		var response;
		var array;
		
		$(this).find('input[type!=submit][type!=radio][rel], input[type=radio][rel]:checked, select[rel], textarea[rel]').each( function(){
			
			response = $(this).validationtype({});
			if (response!==true) {
				if (typeof(response)==='object') { msg_stack = msg_stack.concat( response ); } 
				else { msg_stack.push( response ); }
			}
			
		});
		
		if (msg_stack.length>0) { $.validateoutput({'msg_stack':msg_stack,'output':c.output,'target':c.outputtarget}); }
		
		return (msg_stack.length==0) ? true : false ;
	});
	
	if (c.onchange===true) {
		$(this).find('input[type!=submit][rel], select[rel], textarea[rel]').each( function(){
			$(this).blur( function(){
				var msg_stack = new Array(), response, array;
				response = $(this).validationtype({'defaultmsg':c.defaultmsg});
				if (response!==true) {
					if (typeof(response)==='object') { msg_stack = msg_stack.concat( response ); } 
					else { msg_stack.push( response ); }
				}
				if (msg_stack.length>0) { $.validateoutput({'msg_stack':msg_stack,'output':c.output,'target':c.outputtarget}); }
			});
		});
	}
};

$.validateoutput = function(c) {
	c.msg_stack = (c.msg_stack===undefined || typeof(c.msg_stack)!=='object') ? ('form field error') : c.msg_stack ;
	c.output = (c.output===undefined) ? 'alert' : c.output ;
	c.target = (c.target===undefined) ? $('body').find('div:first') : c.target ;
	var msg = '';
	switch (c.output) {
		case 'alert':
			$.each(c.msg_stack, function(i,x){
				msg += '- ' + x.msg + "\r\n";
			});
			alert(msg);
		; break;
		case 'list':
			if ($('#validateoutput').length!=-1) { $('#validateoutput').remove(); }
			if (c.target.css('display')=='none' || c.target.css('opacity')==0) { c.target.css({'display':'block','opacity':1}) }
			if (c.target.html().length==0) { c.target.append( $.create('div', {'id':'validateoutput'},[]) ) } 
			else { c.target.find('*:first').prepend( $.create('div', {'id':'validateoutput'},[]) ) };
			$.each(c.msg_stack, function(i,x){
				$('#validateoutput').html( $('#validateoutput').html() + x.msg + '<br/>' );
			});
		; break;
		case 'pops':
			$.each(c.msg_stack, function(i,x){
				$('body').append(
					$.create('div', {'id':'validateoutput_' + x.name,'class':'validateoutput_cntr'}, [
						$.create('div', {'class':'validateoutput_content'}, []),
						$.create('div', {'class':'validateoutput_end'}, [])
					])
				);
				$('#validateoutput_' + x.name + ' > .validateoutput_content').html( x.msg );
				$('#validateoutput_' + x.name).css({
					'top': x.pos.top + 'px',
					'left': x.pos.left + 'px'
				});
			});
		; break;
	}
};

$.fn.validationtype = function(c) {
	var checked = ($(this).is(':checked')) ? 'true' : 'false' ;
	var msg_stack = new Array();
	var v;
	var altmsg;
	var curobj;
	
	curobj = $(this);	
	altmsg = ($(this).attr('alt').length<=2 && c.defaultmsg!==undefined) ? c.defaultmsg : $(this).attr('alt') ;
	var obj = {'name':$(this).attr('name'),'value':$.trim($(this).val()),'rel':$(this).attr('rel'),'alt':altmsg}, form;
	obj.rel = (c.forcedrel===undefined) ? obj.rel : c.forcedrel ;
	
	$(this).parents().each( function() { if($(this).attr('tagName')=='FORM') { form = $(this) } } );
	pos = { 'top':$(this).offset().top , 'left':(form.offset().left + form.width()) };
	
	$.each( obj.rel.split(','), function(i,x){
		if (x.indexOf('[')>=0 && x.indexOf(']')>=0) {
			var targetobj = x.split(']'), istrue = false;
			var rest = targetobj[1].split(' then ');
			c.forcedrel = rest[0];
			targetobj = targetobj[0].replace('[','').replace('if ','');
			
			if (x.indexOf('if ')>=0) {
				istrue = true;
				if ($('[name='+targetobj+']').validationtype(c)===true) {
					c.forcedrel = rest[1];
					istrue = curobj.validationtype(c);
				}
			} else {
				istrue = $('[name='+targetobj+']').validationtype(c);
			}
			if (istrue!==true) msg_stack.push( {'msg':obj.alt,'pos':pos,'name':obj.name} );
			
		} else {
			v = x.split(':'), istrue = false;
			
			if (v[0]=='len') { istrue = $.validations().len({ 'check':v[1],'value':obj.value }); }
			else if (v[0]=='val') { istrue = $.validations().val({ 'check':v[1],'value':obj.value }); } 
			else if (v[0]=='type') { istrue = $.validations().type({ 'check':v[1],'value':obj.value,'checked':checked }); }
			
			if (istrue===false) msg_stack.push( {'msg':obj.alt,'pos':pos,'name':obj.name} );
		}
	});
	if( $('#validateoutput_' + obj.name).length!=-1 ) { $('#validateoutput_' + obj.name).remove() }
	
	return (msg_stack.length>0) ? msg_stack: true ;
};

$.validations = function() {
	var v;
	var moderator;
	var typeval;
	var tmp;
	
	return {
		len : function(d){
			if ( d.check.match(/[><!=]/g) ) { moderator = d.check.substr(0,1)+'='; v = d.check.substr(1); }
			else { moderator = '=='; v = d.check; }
			
			var equation = ($.is_numeric(v)) ? 'd.value.length ' + moderator +' ' + v : 'd.value.length ' + moderator +' "' + v + '"';
			return (eval(equation)) ? true : false ;
		},
		val : function(d){
			if ( d.check.match(/[><!=]/g) ) { moderator = d.check.substr(0,1)+'='; v = d.check.substr(1); }
			else { moderator = '=='; v = d.check; }
			
			var equation = ($.is_numeric(v)) ? 'd.value ' + moderator +' ' + v : 'd.value ' + moderator +' "' + v + '"';
			return (eval(equation)) ? true : false ;
		},
		type : function(d){
			if (d.check.indexOf('checkbox')!=-1) { tmp = d.check.split('('); typeval = tmp[1].replace(')',''); d.check = tmp[0]; }
			if (d.check.indexOf('zipp')!=-1) { tmp = d.check.split('('); typeval = tmp[1].replace(')',''); d.check = tmp[0]; }
			if (d.check.indexOf('file')!=-1) { tmp = d.check.split('('); typeval = tmp[1].replace(')',''); d.check = tmp[0]; }
			
			switch (d.check) {
				case 'tel' :
					return (
						$.validations().len({ 'check':'>10','value':d.value })!==false &&
						d.value.match(/[^0-9\s-]/ig)===null
					) ? true : false ;
				; break;
				case 'mail' :
					return (
						$.validations().len({ 'check':'>6','value':d.value })!==false &&
						d.value.match(/[^@.a-z0-9]/ig)===null &&
						d.value.match(/[@]/ig)!==null &&
						d.value.match(/[.]/ig)!==null
					) ? true : false ;
				; break;
				case 'checkbox' :
					return (typeval == d.checked) ? true : false ;
				; break;
				case 'zipp' :
					var charcheck = true;
					d.value = d.value.replace(' ','');
					for (var z=0;z<d.value.length;z++) {
						if (typeval[z].toLowerCase()=='x' && d.value[z].match(/[^a-z]/ig)!==null) {
							charcheck = false;
						} else if (typeval[z].toLowerCase()=='0' && d.value[z].match(/[^0-9]/ig)!==null) {
							charcheck = false;
						}
					}
					return (
						$.validations().len({ 'check':'='+d.value.length,'value':typeval })!==false && 
						charcheck!==false
					) ? true : false ;
				; break;
				case 'file' :
					var typecheck = false;
					var exte = d.value.split('.');
					exte = exte[ exte.length-1 ];
					
					$.each( typeval.split(','), function(key, value){
						if (value==exte.trim().toLowerCase()) {
							typecheck = true;
						}
					});
					
					return (
						$.validations().len({ 'check':'='+d.value.length,'value':typeval })!==false && 
						typecheck===true
					) ? true : false ;
				; break;
			}
		}
	};
};


$.fn.tagcloud = function(c) {
	var parent = $(this).parent(), m=0, mt=0, tags = new Array();
	c.sizes			= (c.sizes===undefined) ? ['xsmall','small','medium','large','xlarge','xxlarge'] : c.sizes ;
	c.aclass		= (c.aclass===undefined) ? 'tagcloudlink' : c.aclass ;
	c.overlap		= (c.overlap===undefined) ? false : c.overlap ;
	c.overload		= (c.overload===undefined) ? false : c.overload ;
	c.pudle			= (c.pudle===undefined) ? false : c.pudle ;
	switch (c.target) {
		case '_blank': c.target='_blank';break;
		case '_parent': c.target='_parent';break;
		case '_top': c.target='_top';break;
		default: c.target='_self';break;
	}
	
	if ($(this).children('li').length==0||$(this).find('a[rel]').length==0) { return false; }
	
	if ( parent.css('position')!='absolute' && parent.css('position')!='relative' && parent.css('position')!='fixed' ) { parent.css({'position':'relative'}); }
	
	$(this).find('a[rel]').each( function(i){ mt = (parseInt($(this).attr('rel'))>mt) ? $(this).attr('rel') : mt ; });
	m = (mt/c.sizes.length);
	
	if ( ( (parent.width()*parent.height()) / $(this).children('li').length ) < 4000 && c.overload!==false && c.overlap===false ) {
		$(this).remove();
		parent.html( c.overload );
		return false;
	}
	
	for (var q=(mt+1);q>=0;q--) {
		if ($(this).find('a[rel='+q+']').length>0) {
			$(this).find('a[rel='+q+']').each( function(i){
				tags.push($(this));
			});
		}
	}
	
	$.each( tags, function(i, tag){
		var rel = ($.intval(tag.attr('rel'))==0) ? 1 : tag.attr('rel') ;
		var url = tag.attr('href');
		var text = tag.html();
		
		var clss = c.sizes[ Math.ceil(rel/m)-1 ];
		parent.append( $.create('a', {'class':c.aclass+' '+clss,'id':c.aclass+i,'href':url,'target':c.target}, []) );
		
		var a = parent.find('a:last');
		a.html(text.replace(' ','_'))
		.css({ 'width': a.width(), 'float': 'left', 'position': 'absolute' });
		
		var pos = $.tagcloudpos({'parent':parent,'obj':a,'find':c.aclass,'overlap':c.overlap});
		
		a.css({ 'top': pos.y + 'px', 'left': pos.x + 'px' })
		.html(text);
		
		if (c.pudle===true) {
			a.mouseover( function(){ 
				$(this).tagcloudpuddle({ 'clss':c.aclass,'dir':true }); 
			}).mouseout( function(){
				$(this).tagcloudpuddle({ 'clss':c.aclass,'dir':false });
			});
		}
	});
	
	$(this).remove();
};

$.tagcloudpos = function(c) {
	var r = false, o = c.parent, a = c.obj, newx = $.rand({'min':0,'max': (o.width()-a.width()) }), newy = $.rand({'min':0,'max': (o.height()-a.height()) });
	c.count = (c.count===undefined) ? 0 : c.count ;
	
	if (c.overlap===true || c.count>=1200) {
		return {'x':newx,'y':newy};
	}
	
	$('.'+c.find).each( function(){	
		var overlapinput = $.isoverlap({ 'obj' : {'x':newx,'y':newy,'w':a.width(),'h':a.height()}, 'over' : {'x': parseInt($(this).css('left').replace('px','') ),'y': parseInt($(this).css('top').replace('px','') ),'w':$(this).width(),'h':$(this).height()} });
		if (overlapinput.up === true || overlapinput.under === true) { r = true; }
	});
	
	c.count++;
	return (r===false) ? {'x':newx,'y':newy} : $.tagcloudpos({'parent':c.parent,'obj':c.obj,'find':c.find,'count':c.count}) ;
};

$.fn.tagcloudpuddle = function(c) {
	c.dir			= (c.dir===undefined) ? false : c.dir ;
	
	var o = $(this);
	if (c.dir===true) {
		$('[class*='+c.clss+']:not(:animated)').each( function(){
			$(this).attr({'name': $(this).css('left').replace('px','')+','+$(this).css('top').replace('px','') });
		});
	}
	$('[class*='+c.clss+'][id!='+o.attr('id')+']').each( function(){
		var speed = 1000;
		if (c.dir===true) {
			var p = $(this).tagcloudpuddle_pos({
						'x':o.css('left').replace('px',''),
						'y':o.css('top').replace('px',''),
						'w':o.width(),
						'h':o.height()
					});
			speed = 4000;
		} else {
			var temp = $(this).attr('name').split(',');
			if (temp.length!=2) { temp = new Array($(this).css('left').replace('px',''),$(this).css('top').replace('px','')); }
			var p = {'x':temp[0],'y':temp[1]};
			speed = 1000;
		}
				
		$(this).stop().animate({
			'top':p.y,
			'left':p.x
		}, speed);
		
	});
	
};

$.fn.tagcloudpuddle_pos = function(c) {
	c.margin		= (c.margin===undefined) ? 20 : c.margin ;
	
	var pos = {'x':$(this).css('left').replace('px',''), 'y':$(this).css('top').replace('px','')}, posx = 0, posy = 0;
	
	var posx = (c.x - pos.x <= 0) ? ($.intval(c.x) + $.intval(c.w) + $.intval(c.margin)) : ($.intval(c.x) - $.intval(c.margin)) ;
	var posy = (c.y - pos.y <= 0) ? ($.intval(c.y) + $.intval(c.h) + $.intval(c.margin)) : ($.intval(c.y) - $.intval(c.margin)) ;

	return {'x':posx,'y':posy};
};

$.urlencode = function(str){
	str = (str+'').toString();
	return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28'). replace(/\)/g, '%29').replace(/\*/g, '%2A');
}

$.urldecode = function(str){
	return decodeURIComponent(str);
}

