var cfg = {
    root : '/services/wikitype/',
    loglen : 150
};

var data = new Object();
var submit = null;
var hash = null;
var all_uls = ['ul_zero', 'ul_one', 'ul_two', 'ul_three', 'ul_four', 'ul_five', 'ul_six', 'ul_seven'];
var all_lis = ['li_zero', 'li_one', 'li_two', 'li_three', 'li_four', 'li_five', 'li_six', 'li_seven'];

function get_ready(){
    $('image').className = 'hidden';
    $('progress').className = 'hidden';
    $('mainForm').className = 'visible';
};

function init(){
    $('choose-span').addEvent('click',function(e){if((new Event(e)).target.getTag()!='input') $('choose').click();});

    $('get_pdf').addEvent('click', function(e){
	    $('chapterstree').className = 'hidden';
	    Lib.format(wb_serialize($('chapters'), chapsort),
	                    //         walker(data.chapterstree,
			//      function(item){
                                    //                return $(item.id).checked ? {'required': true} : { 'required': false}}),
		       'process',
		       ['error'],
		       function(obj){
			   if (!obj.error) $('download_button').className = 'download'; return obj.error},
		       get_ready,
		       err);
	    $('chapters').setHTML('');
	});
    try {
	$('urlid').focus(); // IE can't focus on invisible control
    }
    catch(e){
    };
    if ($('examples')){
	var accordion = new Accordion(all_lis, all_uls, {alwaysHide: true, duration: 250}, $('examples'));
        $('examples').addEvent('click', function(evt){
	    e = new Event(evt);
	    if (e.target.getAttribute('value')){
		$('urlid').value = e.target.getAttribute('value');
		$('urlid').focus();
	    }
	    else if (e.target.childNodes[0].value){
		e.target.childNodes[0].checked = true;
		$('urlid').value = e.target.childNodes[0].getAttribute('value');
		$('urlid').focus();
	    }
	});
    };
    
    function onStart(e){
	(new Event(e)).preventDefault();
	$('mainForm').className = 'hidden';
	$('image').className = 'image';
	//$('form').action = cfg.root+($('choose').checked ? 'choose': 'format')+'/html/';
	$('choose').checked ? Lib.ajax.action('choose', {'url':encodeURIComponent($('urlid').value), 'page_size':$('page_size').value}, wait('Reading...', ['chapterstree'], choose)) : Lib.format({'url':encodeURIComponent($('urlid').value), 'page_size':$('page_size').value}, 'process', ['error'], function(obj){if (!obj.error) $('download_button').className = 'download'; return obj.error}, get_ready, err);
    };
    hash = new Hash.Cookie('info', {'path':window.location.pathname, 'duration':365});
    submit = Lib.submit;
    //$('form').action = cfg.root+'format/html/';
    $('form').addEvent('submit', Lib.eventwrapper(onStart));
    if (!hash.get('page_size')){
    	    hash.set('page_size', 1);
    	};
    $('page_size').value = hash.get('page_size');
    $('page_size').addEvent('change', function (e){
    	    hash.set('page_size', $('page_size').value);
    	});
    Lib.feedback.init($('feedback-footer'), $('feedback-send'), $('feedback-cancel'), $('feedback'), $('feedback-div'));
    get_ready();

    $('showlog').addEvent('click', function(evt){
	    var e = new Event(evt);
	    $('log').className == 'hidden' ? ($('log').className = 'log', $('showlog').setHTML('[-]')) : ($('log').className = 'hidden', $('showlog').setHTML('[+]'))
	});


    if (location.search){
	var search = location.search;
	var actionind = search.lastIndexOf('&action=');
	var paperind = search.lastIndexOf('&paper=');
	var urlind = search.indexOf('?url=');
	var action = actionind > 0 ? search.slice(actionind+'&action='.length) : 'format';
	var format = paperind > 0 ? (actionind >0 ? search.slice(paperind+'&paper='.length, actionind) : search.slice(paperind+'&paper='.length)) : 'a4';
	var url = paperind > 0 ? search.slice(urlind+'?url='.length, paperind) : search.slice(urlind+'?url='.length);
	$('urlid').value = url;
	$('page_size').value = (format=='a4' ? 1 : 2);
	if (action == 'format'){
	    $('gen_button').click();
	}
	
    };

};

function err(msg){
    Lib.HumanizedMessage.show(msg);
    get_ready();
};

//function setId(item){
//    item.id = encodeURIComponent(item.url);
//    if(item.children && item.children.length) item.children.map(function(item){setId(item);});
//    return item;
//};

function setId(item){
    item.id = encodeURIComponent(item.url);
    item.url = item.url;
    if(item.children && item.children.length) item.children.map(function(item){setId(item);});
    return item;
};

function walker(item, fn){
    var newnode = fn(item);
    var newnode_children = null;
    if (item.children && item.children.length)
	newnode_children = item.children.map(function(node){return walker(node, fn)}).filter(function(node){return node;});
    if (newnode_children && newnode_children.length){
	if (!newnode) newnode = { 'required': true};
	newnode.children = newnode_children;
    }
    return newnode;
};

var checked = false;

function chapsort(elem){
    if (elem.getTag() == 'li') {
        
        var el_type = 'span';
        var req_el_type = 'input';
        var obj = {};
        obj.url = (elem.getElement(req_el_type)).id;
        obj.required = (elem.getElement(req_el_type)).checked;
        if ( obj.required )
            checked = true 
        obj.name = encodeURIComponent((elem.getElement(el_type)).getText());
        //if ((($$(elem.childNodes)).filter(function(node){if(node.getTag()=='ul') return node;})).length) {
        if (elem.lastChild.getTag() == 'ul') {
            ($$(elem.childNodes)).map(function(node){if (node.getTag()=='ul') {obj.children = chapsort(node);}})
        }
        else {
            obj.children = new Array();
        }
        
        return obj;
    }
    else if (elem.getTag() == 'ul') {
        var children = new Array();
        ($$(elem.childNodes)).map(function(node){if (node.getTag()=='li') {var temp = chapsort(node); children.push(temp);}});
        return children;
    }
}

function wb_serialize(list, fn)
{
    tree = fn(list.firstChild);
    
    if (checked) {
        checked = false;
        return tree;
    }
    //err('There is no checked chapters to format');
    return {};
}

function toHTML(item){
    var li = new Element('li');
    var input = new Element('input', {'id':item.id,
				      'checked': item.required ? true : false,
				      'type':'checkbox',
				      'events':{'click': function(e){
		    if (item.children)
			walker(item, function(node){$(node.id).checked = input.checked; return (new Object());});
		}}});
    var top = new Element('span', {'class':'chapter','events': {'click': function(e){
		    var event = new Event(e);
		    if($(event.target).getTag()!='input')
			input.click();
		}}});
    var container = new Element('div');
    //top.adopt([input]);
    //console.log(item.name);
    top.appendText(item.name);
    container.adopt([input]);
    container.adopt([top]);
    li.adopt([container]);
    //li.adopt([top]);
    if (item.children && item.children.length){
	var ul = new Element('ul');
	ul.adopt(item.children.map(function(item){return toHTML(item);}));
	
	new Sortables(ul);
	
	li.adopt([ul]);
    }
    return li;
};
    

function choose(obj){
    if (obj.chapterstree){
	$('chapters').setHTML('');
	data.chapterstree = setId(obj.chapterstree)
	$('chapters').adopt([toHTML(data.chapterstree)]);
	$('chapterstree').className = 'chapterstree';
    }
    else
	err('no chapters tree');
};

function wait(status, question, fn){
    var flag = 'process';
    var errflag = 'error';

    function logger(log){
	$('log').innerHTML += log.split('\n').map(function(item){return item.split(':').slice(3).join(':')}).join('<br/>');
    }

    function ifok(fun){
	return function(obj){
	    if (obj.msg && (obj.msg == 'ok')){
		return fun(obj);
	    }
	    else {
		err("Can't put action");
	    };
	};
    };
    

    function unprocess(){
	$('image').className = 'hidden';
	$('process').className = 'hidden';
	$('status').setText('');
	$('log').setHTML('');
	$('log').className = 'hidden';
    };

    function checker(obj){
	if (obj[errflag])
	    err(obj[errflag]);
	else {
	    unprocess();
	    fn(obj);
	};
    };

    process('Connecting...');
    return ifok(function(obj){
	process(status);
	function waiter(obj){
	    if (obj[flag]){
		if (obj.log)
		    logger(obj.log);
		Lib.ajax.action('log',[flag], waiter);
	    }
	    else
		Lib.ajax.action('log', question.concat([errflag]), checker);
	};
	Lib.ajax.action('log',[flag], waiter);
	});
};

function process(msg){
    $('mainForm').className = 'hidden';
    $('image').className = 'active';
    $('process').className = 'process';
    $('status').setText(msg);
    $('status').className = 'status';
    $('log').setHTML('');
    $('log').className = 'log';

};
