
/*

    Sergio Álvarez (xergio)
    mail@xergio.net
    http://xergio.net
    
    Licencia Creative Commons BY-SA
    <http://creativecommons.org/licenses/by-sa/2.0/>

*/


// https://gist.github.com/1433987
Element.Events.hashchange = {
    onAdd: function(fn) {
        var hash = location.hash;

        var hashchange = function () {
            if (hash == location.hash) return;
            hash = location.hash;
            
            var hash_real = (hash.indexOf('#') == 0 ? hash.substr(1): hash);
            fn.call(this, hash_real);
        };

        if ("onhashchange" in window)
            window.onhashchange = hashchange;
        else
            hashchange.periodical(50);
    }
};


window.addEvent('domready', function() {

    if (window.location.hash.substr(0, 1) == '#' && window.location.hash.length > 1) {
    	window.location.href = '/s/'+ window.location.hash.substr(1);
    	return;
    }
    
    var pregs = ['preg_match', 'preg_match_all', 'preg_split', 'preg_replace'];
	var update_timeout = undefined;
	var help_panel = new Fx.Slide('helpcontainer');
	var replacement_area = new Fx.Slide('replacement_area');
	var loading = $('loading');
	var shhh;
	var first = true;

	help_panel.hide();
	replacement_area.hide();
	
	
	$('help-link').addEvent('click', function(e) {
		e.stop();
		help_panel.toggle();
	});


    var updateSelection = function(mode, id) {
    	if (id == 'preg_replace') replacement_area.start(mode);
    	if (mode == 'in') {
    		$('preg_selection').set('value', id);
    		document.send_quietly();
    	}
    }
    
    
    var results = function(json, text) {
        loading.setStyle('display', 'none');

    	try {
    		var reason = (json.return? 'match! :D ': 'no match :( &nbsp; &nbsp; ') + json.reason;
	        $('reason').set('html', reason);
	        $('result').set('html', json.content);
	        $('use').set('html', json.use);
	        $('return').removeClass('error').removeClass('ok').addClass(json.status);
	        location.hash = '#'+ (json.permalink? json.permalink: '');
    	} catch (e) {
    		$('reason').set('html', 'Unexpected error');
	        $('result').set('html', '');
	        $('use').set('html', '');
    		$('return').removeClass('error').removeClass('ok').addClass('error');
    		location.hash = '/#';
    	}
    }
    
    
    var send_request = function() {
    	shhh = new Request.JSON({
    		url: $('form').get('action'),
            onComplete: results
    	}).post($('form'));
    }
    

    document.send_quietly = function() {
    	if (first) { first = !first; return; }
    	
        loading.setStyle('display', 'inline');
    	
    	try {
    		if (shhh) shhh.cancel();
    	} catch (e) {}
    	
    	send_request();
    }


    var handleKeyUp = function(event) {
    	try {
    		if (typeOf(event.key.toInt()) != 'number' && event.key in ['up', 'down', 'left', 'right', 'esc', 'tab', 'alt', 'control'])
    			return;
    	} catch (e) {}

        if (update_timeout) clearTimeout(update_timeout);
        update_timeout = setTimeout('document.send_quietly()', 500);
    }
	
	
	$('form').addEvent('submit', function() { return false; });
	
	
    $$('.update').addEvent('keyup', handleKeyUp);
    $$('.bot').addEvent('click', handleKeyUp);
	
	
    var accor = new Fx.Accordion($$('#options #pregs ul li'), $$('#options div.option'), {
    	display: pregs.indexOf($('preg_selection').get('value')),
        onActive: function(toggler, element) {     updateSelection('in', toggler.get('id')); toggler.morph( {'background-color': '#ddd'} ); },
        onBackground: function(toggler, element) { updateSelection('out', toggler.get('id')); toggler.morph( {'background-color': '#fff'} ); }
    });
    
    
    if (first_load) {
    	first = false;
    	send_request();
    }
    
    
    //window.addEvent('hashchange', function(hash) { window.location.href = '/s/'+ hash; });
	
/*
	rp = new Fx.Height('rp', {duration: 200});
    help = new Fx.Height('helpcontainer', {duration: 300});
    share = new Fx.Height('share', {duration: 300});


    if (acc != 3)
        rp.toggle();
    help.toggle();
    share.toggle();

    $$('.bot').each(function(elem) { elem.addEvent('click', function(obj) { sendRequest(); }); });
    
    $E('.showhidehelp').addEvent('click', function(obj) { help.toggle(); });
    $E('.showhideshare').addEvent('click', function(obj) { share.toggle(); });
        
    
    $('formShare').onsubmit = function() { saveSession(); return false; };

    if (location.search)
        sendRequest();
        
    init = false;
*/
});







function saveSession() {
    var tmp = $E('a.permalink').href.match(/\?([0-9\-]+)$/);
    if (tmp[1]) {
        $('sharecache').value = tmp[1];
        $('shareLoad').innerHTML = '<img src="load.gif" alt="..." />';

        var direccion = location.protocol + '//' + location.hostname + location.pathname;
        ayax = new Ajax(direccion, {
            method: 'post',
            postBody: $('formShare'),
            onComplete: function(get) { $('sharecontainer').innerHTML = get; }
        }).request();
    }
    return false;
}

