var language = function() {
	return 'bs';
}



var grammar =  {
	
	links: function(items) {
		if ( /(0|5|6|7|8|9|10|11|12|13|14)$/.test(items) )
			return items+' skraćenih linkova';
		else if ( /(2|3|4)$/.test(items) )
			return items+' skraćena linka';
		else if ( /(1)$/.test(items) )
			return items+' skraćeni link';
	},
	clicks: function(items) {
		if ( /(0|5|6|7|8|9|10|11|12|13|14)$/.test(items) )
			return items+' klikova';
		else if ( /(2|3|4)$/.test(items) )
			return items+' klika';
		else if ( /(1)$/.test(items) )
			return items+' klik';
	}
		
}



var anchor = function(data) {
	
	var a = document.createElement('a');
	
	if ( data.text ) {
		var text = document.createTextNode(data.text);
		a.appendChild(text);
	}
	
	if ( data.id )
		a.setAttribute('id', data.id);
	
	if ( data.klasa )
		a.setAttribute('class', data.klasa);
	
	if ( data.href )
		a.setAttribute('href', data.href);
	
	if ( data.title )
		a.setAttribute('title', data.title);
	
	if ( data.target )
		a.setAttribute('target', data.target);
	
	return a;
	
};


var form = {
	
	_items: '',
	_default_url: 'http://',
	_default_custom: 'mojLinkIdeOvdje',
	_default_password: 'Lozinka',
	_default_confirm: 'Traženi link zahtjeva lozinku',
	_custom_min: 5,
	_custom_max: 25,
	_pattern_custom: /^[a-zA-Z0-9]+$/,
	_short_message: '',
	
	load: function() {
		form.initValues();
		
		$('#url, #custom, #protected, #protected_long').click(function() {
			$(this).val('');
		});
		
		$('#short').click(function() {
			form.showLoaderIcon('short');
			form.api();
			return false;
		});
	},
	initValues: function() {
		form.markOK('url');
		form.markOK('custom');
		
		form.fShow('url', form._default_url);
		form.fShow('custom', form._default_custom);
		form.fShow('protected', form._default_password);
		form.fShow('protected_long', form._default_confirm);
		form.hShow('custom_counter', form._custom_max);
		
		form.getSystem('_total_urls');
		form.hShow('screen', form._items);
		
		form.focus('url');
	},
	api: function() {
		var u		= escape($('#url').val());
		var c		= ($('#custom').val() !== form._default_custom) ? '&custom='+escape($('#custom').val()) : '';
		var p		= ($('#protected').val() !== form._default_password) ? '&protected='+escape($('#protected').val()) : '';
		var request	= '/api.php?url='+u+c+p;
		
		if ( !form.testUrl(u) )
		return false;
		
		$.getJSON(request, function(data) {
			if ( data.error) {
				var html = data.error;
				form.markError('custom');
				form.focus('custom');
				form.hShow('screen', html);
				return false;
			}
			else {
				var hash = (data.custom) ? data.custom : data.short;
				var href = 'http://'+window.location.hostname+'/'+hash;
				
				var adata = {id:'a_short', href:href, title:href, target:'_blank', text:href};
				var a = anchor(adata);
				
				var span = document.createElement('span');
				var spant = document.createTextNode('KOPIRAJ');
				span.appendChild(spant);
				span.setAttribute('id', 'copy');
				
				$('#screen').html('');
				$('#screen').append(a);
				$('#screen').append(span);
				
				form.copyShortUrl(href);
				
				return true;
			}
		});
		
	},
	customCounter: function() {
		$('#custom').keyup(function() {
			
			var v = $('#custom').val();
			var l = $('#custom').val().length;
			
			if ( l > 0 ) {
				
				form._short_message = $('#screen').html();
				
				if ( !form.testCustom(v) )
				return false;
			}
			
			if ( l === 0 ) {
				form.hShow('custom_counter', form._custom_max);
			}
			
			else if ( l > 0 && l <= form._custom_max ) {
				var c = form._custom_max - l;
				form.hShow('custom_counter', c);
			}
			
			if ( l === form._custom_max ) {
				$('#custom').attr('maxlength', form._custom_max);
			}
			
			if ( l < form._custom_min ) {
				$('#custom').css('color', '#f00');
				form.hShow('screen', 'Upišite najmanje '+ form._custom_min +' znakova [a-Z0-9]');
			}
			else {
				$('#custom').css('color', '#666');
			}
			
		});
	},
	testCustom: function(v) {
		
		var p = form._pattern_custom;
		
		if ( !p.test(v) ) {
			form.markError('custom');
			form.hShow('screen', 'Dozvoljeni znakovi [a-Z0-9]');
			form.stopTypingCustom();
			return false;
		}
		else {
			form.markOK('custom');
			form.hShow('screen', form._short_message);
			form.continueTypingCustom();
			return true;
		}
		
	},
	testUrl: function(u) {
		if ( !u ) {
			form.markError('url');
			form.hShow('screen', 'Unesite dugi link');
			form.focus('url');
			return false;
		}
		else if ( u === form._default_url ) {
			form.markError('url');
			form.hShow('screen', 'Unesite puni link');
			form.focus('url');
			return false
		}
		else if ( !/(http|https)\%3A\/\/[\w\%\.]+/.test(u) ) {
			form.markError('url');
			form.hShow('screen', 'Neispravan link');
			form.focus('url');
			return false
		}
		else {
			form.markOK('url');
			return true;
		}
	},
	getSystem: function(command) {
		
		var q = '/api.php?system='+command;
		
		$.getJSON(q, function(data) {
			
			$.each(data, function(i) {
				var links = grammar.links(data[i]);
				form.hShow('screen', links);
				form._items = $('#screen').html();
			});
		});
		
	},
	copyShortUrl: function(href) {
			
		$('#copy').fadeIn();
		$('#copy').css('cursor', 'pointer');
		
		var clip = new ZeroClipboard.Client();
		clip.setHandCursor(true);
		clip.setText(href);
		clip.glue('copy');
		
		$('#copy, #click_layer').click(function() {
			$('#copy').fadeOut();
		});
		
	},
	stopTypingCustom: function() {
		var l = $('#custom').val().length;
		$('#custom').attr('maxlength', l);
	},
	continueTypingCustom: function() {
		$('#custom').attr('maxlength', form._custom_max);
	},
	focus: function(element) {
		var id = '#'+element;
		$(id).focus();
	},
	fShow: function(e, v) {
		var element = '#'+e;
		$(element).val(v);
	},
	hShow: function(e, v) {
		var element = '#'+e;
		$(element).html(v);
	},
	showLoaderIcon: function(e) {
		var img = document.createElement('img');
		img.setAttribute('src', '/images/design/loader.gif');
		img.setAttribute('alt', 'Loading...');
		form.hShow(e, img);
	},
	disable: function(e) {
		var element = '#'+e;
		$(element).attr('disabled', 'disabled');
	},
	enable: function(e) {
		var element = '#'+e;
		$(element).removeAttr('disabled');
	},
	readonly: function(e) {
		var element = '#'+e;
		$(element).attr('readonly', 'readonly');
	},
	unreadonly: function(e) {
		var element = '#'+e;
		$(element).removeAttr('readonly');
	},
	markError: function(e) {
		var element = '#'+e;
		$(element).css('color', '#f00');
	},
	markOK: function(e) {
		var element = '#'+e;
		$(element).css('color', '#666');
	}
	
};


var reset = {
	
	load: function() {
	
		$('#reset').click(function() {
			if( $(this).attr('checked') )
				alert('Skinutu lozinku nećete moći ponovo postaviti. Da li ste sigurni?');
		})
	}
		
};

var list = function(element, data) {
	
	var p = document.createElement('p');
	var ul = document.createElement('ul');
	ul.setAttribute('id', 'list');
	
	p.appendChild(ul);
	
	$.each(data, function(i) {
		
		var href = (data[i].short) ? data[i].short : data[i].custom;
		var click = (data[i].clicked) ? grammar.clicks(data[i].clicked) : '';
		
		if ( data[i].target === 'protected' ) {
			var link = 'http://'+window.location.host+'/'+href;
			var title = link;
		}
		else {
			var dots = (data[i].target.length > 53) ? '...' : ''; 
			var title = data[i].target.substr(0, 50)+dots;
			var link = (data[i].short !== null) ? data[i].short : data[i].custom;
		}
		
		var li = document.createElement('li');
		
		var adata = {href:link, title:data[i].target, target:'_blank', text:title};
		var a = anchor(adata);
		var atext = document.createTextNode(link);
		
		var span = document.createElement('span');
		var spantext = document.createTextNode(' '+click+' ');
		var pass = document.createElement('img');
		span.appendChild(spantext);
		span.setAttribute('class', 'url_actions');
		
		ul.appendChild(li);
		li.appendChild(a);
		li.appendChild(span);
		
		if ( data[i].target === 'protected' ) {
			span.appendChild(pass);
			pass.setAttribute('src', '/images/icons/key.png')
			pass.setAttribute('alt', 'protected');
		}
		
	});
	
	var e = '#'+element;
	$(e).append(p);
	
};


var paginate = function(element) {
	var p = 1;
	var pages = 5;
	var e = '#page_'+element;

	var ul = document.createElement('ul');
	ul.setAttribute('id', 'paginator')
	
	for( i=1; i<=pages; i++ ) {
		var li = document.createElement('li');
		ul.appendChild(li);
		
		var adata = {klasa:'apaginator', href:'#'+element, text:i};
		var a = anchor(adata);
		
		li.appendChild(a);
	}
	
	$(e).append(ul);
	
	paginateShow(p, element);
	
	$('#page_'+element+' .apaginator:eq(0)').css('background-color', '#aaa');
	$('#page_'+element+' .apaginator:eq(0)').css('color', '#fff');
	
	$('.apaginator').click(function() {
		$('.apaginator').css('background-color', '#fff');
		$('.apaginator').css('color', '#aaa');
		$(this).css('background-color', '#aaa');
		$(this).css('color', '#fff');
		
		var page = parseInt($(this).html());
		paginateShow(page, element);
		return false;
	});
	
}



var paginateShow = function(page, element) {
	
	var items = 20;
	var first = (page-1) * items;
	var last = (first + items) - 1;
	var e = '#page_'+element+' #list li';
	
	$(e).hide();
	
	$(e).each(function(i) {
		if ( i >= first && i <= last )
		$(this).show();
	});
	
}



var page = {
	
	_hash: window.location.hash,
	_hash_clean: window.location.hash.replace('#', ''),
	
	load: function() {
		page.show();
		page.click();
	},
	click: function() {
		$('[rel="page"]').click(function() {
			page._hash_clean = $(this).attr('href').replace(/^[^\#]+\#/, '');
			page.show();
		});
	},
	show: function() {
		var p = '#page_'+page._hash_clean;
		
		$('[id^=page_]').hide();
		
		if ( !$(p).is(':visible, :hidden') || page._hash_clean === 'home' ) {
			form.initValues();
			form.hShow('screen', form._items);
			$('#page_home').show();
		}
		else {
			$(p).show();
		}
		if ( page._hash_clean === 'new' ) {
			$('#page_new ul').remove();
			page.showNew();
		}
		else if ( page._hash_clean === 'popular' ) {
			$('#page_popular ul').remove();
			page.showPopular();
		}
		
	},
	loaderShow: function(e) {
		
		var element = '#'+e;
		
		var div = document.createElement('div');
		div.setAttribute('id', 'loader');
		
		$(element).append(div);
		
		form.showLoaderIcon('loader');
	},
	loaderHide: function() {
		
		$('#loader').remove();
		
	},
	showNew: function() {
		
		page.loaderShow('page_new');
		
		var u = '/api.php?system=_get_new';
		$.getJSON(u, function(data) {
			list('page_new', data);
			paginate('new');
			page.loaderHide();
		});
		
	},
	showPopular: function() {
		
		page.loaderShow('page_popular');
		
		var u = '/api.php?system=_get_popular';
		$.getJSON(u, function(data) {
			list('page_popular', data);
			paginate('popular');
			page.loaderHide();
		});
	}
	
};


var more = {
	
	_visible: 0,
	_speed: 400,
	
	load: function() {
        
        $('#more_options').delay(1000).hide(more._speed);
        
		$('#more').click(function() {
			more._visible += 1;
			if ( more._visible % 2 ) {
				$('#more').attr('value', '▲');
				$('#more_options').show(more._speed);
			}
			else {
			    $('#more').attr('value', '▼');
				$('#more_options').hide(more._speed);
			}
			return false;
		});
		
	},
		
};


$(document).ready(function() {
	
	form.load();
	
	more.load();
	
	page.load();
	
	reset.load();
	
});

