var cfg = {
    root : '/services/starscape/',
    loglen : 140,
    timeout : 800};

var hash = null;
var data = new Object();
var submit = null;

function var_dump(obj) { /*{{{*/
	if(typeof obj == "object") {
		prop = '';
		i = 0;
		for (myPropName in obj) {
			prop = prop + "\n" + myPropName + ": " + obj[myPropName];
			if (i++ > 100)
				break;
		}
		return "Type: "+typeof(obj)+ "\nValue: " + prop; 
	} else {
		return "("+typeof(obj)+")"+obj;
	}
}/*}}}*/

function init(e){/*{{{*/
    submit = Lib.submit;
    Lib.feedback.init($('feedback-footer'), $('feedback-send'), $('feedback-cancel'), $('feedback'), $('feedback-div'));

    hash = new Hash.Cookie('info', {'path':window.location.pathname, 'duration':365});
    if (window.webkit)
	$('remember-span').className = 'hidden';

    if (!hash.get('member'))
	hash.set('member',false);
    var member = hash.get('member');
    $('remember').checked = member;
    if (!hash.get('page'))
	hash.set('page','login');
    var page = hash.get('page');

    if (hash.get('login')){
	try {
	    $('login').value = hash.get('login');
	    $('password').focus();
	}
	catch(e){};
    };

    if (!hash.get('page_format'))
	hash.set('page_format','a4');

    $('page_format_'+hash.get('page_format')).checked = true;
    $('span-a4').addEvent('click', Lib.eventwrapper(function(e){$('page_format_a4').fireEvent('click');}));
    $('span-ebook').addEvent('click', Lib.eventwrapper(function(e){$('page_format_ebook').fireEvent('click');}));
    $('page_format_a4').addEvent('click',Lib.eventwrapper(function(e){$('page_format_a4').checked = true; hash.set('page_format','a4');}));
    $('page_format_ebook').addEvent('click',Lib.eventwrapper(function(e){$('page_format_ebook').checked = true; hash.set('page_format','ebook');}));
    $('remember-span').addEvent('click',function(e){if((new Event(e)).target.getTag()!='input') $('remember').click();});
    $('remember').addEvent('click',Lib.eventwrapper(function(e){
		hash.set('member',$('remember').checked);
	    }));

    $('relogin').addEvent('click', function(e){
	    restore('login');
	});

    $('format').addEvent('click', Lib.eventwrapper(function(e){
		$('mainTab').className = 'hidden';
		$('process').className = 'process';
		var feeds = data.feeds.filter(function(item){return $(item.id).checked;}).map(function(item){return item.id});
		if($('log').className !='hidden') $('showlog').click();
		Lib.format({'all': feeds.length ? true : false,
			    'feeds' : feeds,
			    'page_format': hash.get('page_format')},
		    'process', ['error'], function(obj){
			if (!obj.error){
			    $('login-link').className = 'download';
			    $('maintab-link').className = 'download';
			}
			return obj.error},
		    function(e){restore(hash.get('member') ? 'channels' : 'login')},
		    err);
	    }));

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

    Lib.submit.setHandler(Lib.eventwrapper(wait('Getting feeds...',['channels', 'taglist'], listchannels)));
    $('login-form').addEvent('submit',
			     Lib.eventwrapper(function(e){
				     (new Event(e)).preventDefault();
				     Lib.ajax.action('listchannels',
						     {'login': $('login').value,
							     'password': $('password').value,
							     'remember': $('remember').value},
						     Lib.eventwrapper(wait('Getting feeds...',['channels', 'taglist'], listchannels)));
				     $('log').setHTML('');
				     hash.set('login',$('login').value);
				     //$('login-form').action = cfg.root + 'listchannels/html/';
				     process('Connecting...');
				 }));

    restore(page);
};/*}}}*/


function err(msg){
    Lib.HumanizedMessage.show('Error: ' + msg);
    hash.set('page','login');
    restore('login');
};

function process(msg){
    $('mainTab').className = 'hidden';
    $('loginTab').className = 'hidden';
    $('image').className = 'active';
    $('process').className = 'process';
    $('status').setText(msg);
    $('status').className = 'status';
};

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

    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('');
    };

    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])
		Lib.ajax.state([flag], waiter);
	    else
		Lib.ajax.state(question.concat([errflag]), checker);
	};
	Lib.ajax.state([flag], waiter);
	});
};


function get_ready(){
    $('mainTab').className = 'hidden';
    $('loginTab').className = 'hidden';
    $('feedlist').innerHTML = '';
    $('tags').innerHTML = '';
    $('image').className = 'active';
    $('progress').className = 'hidden';
    $('process').className = 'hidden';
    var page = hash.get('page');
    var member = hash.get('member');
    if(member && page && (page=='channels')) {
	restore(page);
    }
    else {
	hash.set('page','login');
	$('loginTab').className = 'active';
	$('login').focus();
	$('password').value = '';
	$('login').value = '';
    };
};

function restore(page){
    hash.set('page', page);
    switch (page){
    case 'channels':
	Lib.ajax.action('listchannels',{}, wait('Getting feeds...', ['channels', 'taglist'], listchannels));
	$('progress').className = 'hidden';
	$('feedlist').className = 'hidden';
	$('feedlist').setHTML('');
	$('tags').setHTML('');
	$('format').className = 'hidden';
	$('page_format').className = 'hidden';
	$('loginTab').className = 'hidden';
	break;
    default:
	$('format').className = 'hidden';
	$('mainTab').className = 'hidden';
	$('loginTab').className = 'hidden';
	$('feedlist').className = 'hidden';
	$('feedlist').setHTML('');
	$('tags').setHTML('');
	$('image').className = 'active';
	$('progress').className = 'hidden';
	$('process').className = 'hidden';
	hash.set('page','login');
	$('loginTab').className = 'active';
	$('login').focus();
	$('password').value = '';
	$('login').value = '';
    };
};

function wrapper(fn){
    return function(obj){
	$('process').className = 'hidden';
	$('image').className = 'hidden';
	return fn(obj);};
};

function listchannels(obj){
    if (obj.channels){
	data.feeds = []
    for(var i=0; i<obj.channels.length; i++){
	data.feeds = data.feeds.concat(obj.channels[i]['msgs']);
    };
	Tree($('feedlist'), feedTree(data.feeds), data.feeds);
    if(obj.taglist){
	Tags($('tags'), obj.taglist);
	data.taglist = obj.taglist;
    };
    $('mainTab').className = 'active';
    $('feedlist').className = 'feedlist';
    $('page_format').className = 'page_format';
    $('format').className = 'format';
	}
};

function feedTree(feeds){
    var tree = channelTree(feeds);
    for(var i=0; i<tree.length; i++){
	if (tree[i].childs){
	    tree[i].childs = channelTree(tree[i].childs, 'source', 'sourceName');
	};
    };
    return channelTree(tree, 'source', 'sourceName', true);
};

function channelTree(channels, _id_attr, _title_attr, _reverse){
    var idattr = _id_attr || 'folder';
    var titleattr = _title_attr || 'folderTitle';
    var reverse = _reverse || false;
    var folders = [];
    var items = [];
    for(var i=0;i<channels.length;i++)
	if(channels[i][idattr]){
	    var folder = folders.filter(function(item){return item.id==channels[i][idattr]});
	    if (folder.length == 0)
		folders.push({id:channels[i][idattr], title: channels[i][titleattr], childs: [channels[i]]});
	    else 
		folder[0].childs.push(channels[i]);
	}
	else
	    items.push(channels[i]);
    folders.map(function(item){item.count = 0; item.childs.map(function(child){item.count+=child.count})});
    folders.map(function(folder){folder.childs.map(function(item){item.click = function(e){if (!$(item.id).checked) $(folder.id).checked = false;}})});
    return reverse ? items.concat(folders) : folders.concat(items);
};

function Tags(root, tags){
    root.adopt(tags.map(Tag));
    root.className = 'tags';
};
 
function Tag(item){
    var li = new Element('li', {'class':'active', id: item.id});
    var a = new Element('a', {'class':'t'+item.font_size, id: item.id});
    a.appendText(item.title);
    li.adopt([a]);
    li.addEvent('click', function(e){
	    var was_active = (li.className=='active') ? true : false;
	    li.className = (was_active) ? '' : 'active'; 
	    item.tagged_msgs.map(function(elt){var el = $(elt); if (el.checked && was_active) el.click(); else if (!el.checked && !was_active) el.click();});
	});
		li.appendText(' ');
    return li;
};


function Tree(root, tree){
    var ul = new Element('ul');
    root = $(root);
    toHTML(ul, tree);
    root.adopt([ul]);
};

function Leaf(item){
    var li = new Element('li');
    var input = new Element('input', {'id':item.id,
				      'checked': true,
				      'type':'checkbox',
				      'events':{'click': function(e){
		    if (item.childs)
			item.childs.map(function(node){
				if($(node.id).checked != input.checked)
				    $(node.id).click();
			    });
		    if(input.checked)
			$('format').disabled = false;
		}}});
    var top = new Element('span', {'class':'feed','events': {'click': function(e){
		    var event = new Event(e);
		    if($(event.target).getTag()!='input')
			input.click();
		}}});
    var span = new Element('span');
    span.setHTML((item.title.replace('<div','<span')).replace('</div>', '</span>'));
    
    top.adopt([input, span]);
    if(item.click){
	input.addEvent('click', item.click);
    };

    if(item.count || (item.count==0)){
	    var span = new Element('span', {'class':'count'});
	    span.appendText('('+item.count+')');
	    top.adopt([span]);
    };

    li.adopt([top]);

    return li;
};

function toHTML(root, tree){
    var ul = new Element('ul');
    var res = [];
    for(var i=0;i<tree.length;i++){
	var elt = Leaf(tree[i]);
	if (tree[i].childs){
	    toHTML(elt, tree[i].childs);
	    };
	res.push(elt);
    };
    ul.adopt(res);
    root.adopt([ul]);
};

