/*Navigator Class*
requirement:
- form contain hidden input step, page, order ...
- default value hash - dOption
*/
var Nav = Class.create({
	initialize: 
function(form, dOption, refresh, bookmark) {
	//option form, default option hash, refresh callback
	form = $(form);
	dOption = $H(dOption);
	if(dOption.get('tag') !== undefined) {
		var tagBar = $('tagBar');
		if(!tagBar.innerHTML.empty()) {
			var tags = tagBar.innerHTML.split(',');
			tagBar.update('<span class="head">tag:</span> ');
			tags.each(function(tag) {
				var tagLink = $(Builder.node('span',{className: 'tag', title: tag},tag));
				tagBar.insert(tagLink);
				tagBar.insert(' ');
				tagLink.observe('click',function() { 
					if(tagLink.hasClassName('selected')) {
						tagLink.removeClassName('selected');
						removeTag(tag);
					} else {
						tagLink.addClassName('selected');
						addTag(tag);
					}
				});
			});
			var cl = $(Builder.node('img',{src: 'img/tag_delete.gif', className: 'tag', title: 'ล้าง', alt: 'ล้าง', style: 'vertical-align: bottom'}));
			tagBar.insert(cl);
			cl.observe('click',function() {
				form['tag'].clear();
				location.hash = getQueryString(false,'#');
			});
		}
	}
	if(location.hash.empty())
		location.hash = getQueryString(false,'#');
	new PeriodicalUpdater(setOption, 0.3, function() {
		var h = $H(location.hash.substring(1).toQueryParams());
		h.unset('x');
		return h.toQueryString();
	});
	this.setOption = setOption;
	this.getOption = getOption;
	this.getQueryString = getQueryString;
	this.getSEOString = getSEOString;

	function getQueryString(params,prefix) {
		var h = $H(form.serialize().toQueryParams()); //get qstr hash from viewOption form
		var qStr='';
		if(params) {
			h.update(params);
		}
		//remove default values
		dOption.each(function (pair) {
			if(h.get(pair.key)==pair.value)
				h.unset(pair.key);
		});
		//no id in hash mode
		if(prefix=='#') {
			h.unset('id');
			h.set('x');
		}
		//convert to query string
		if((qStr=h.toQueryString()) == '')
			return ''
		return (prefix?prefix:'?')+qStr;
	}
	function getSEOString(params) {
		var h = $H(form.serialize().toQueryParams()); //get qstr hash from viewOption form
		var qStr='';
		if(params) {
			h.update(params);
		}
		//remove default values
		dOption.each(function (pair) {
			if(h.get(pair.key)==pair.value)
				h.unset(pair.key);
		});
		//no id in hash mode
		h.unset('id');
		//convert to query string
		if((qStr=h.toQueryString()) == '')
			return getOption('id')+'.htm';
		return getOption('id')+'.htm?'+qStr;
	}
	function setOption(params) {
		var h = $H(location.hash.substring(1).toQueryParams());
		if(bookmark) {
			if(h.get(bookmark)) {
				h.set('page',getPage(h.get(bookmark)));
			}
		}
		if(params)
			h.update(params);
		h = dOption.merge(h); //non-destructive for dOption
		h.each(function(pair) {
			if(pair.key!='id'&&form[pair.key])
				form[pair.key].value = pair.value;
		});
		refresh();
	}
	function getOption(o) {//get one option at a time
		return $F(form[o]).toLowerCase();
	}
	function getPage(x) {
		if(x == 'last' || x == 0)
			return form['page'].value;
		x = parseInt(x);
		var curStep = parseInt(form['step'].value);
		if(x == NaN || curStep == 0)
			return dOption.get('page');
		return Math.floor( (x + curStep- 1) / curStep );
	}
	function addTag(tag) {
		form['tag'].value += (form['tag'].value.empty()?'':',')+tag;
		location.hash = getQueryString(false,'#');
	}
	function removeTag(tag) {
		form['tag'].value = form['tag'].value.split(',').without(tag).join(',');
		location.hash = getQueryString(false,'#');
	}
	this.sortPage = function (order, by) {
		if(form['order'].value==order && form['by'].value==by) {
			refresh();
		} else {
			form['order'].value=order;
			form['by'].value=by;
			location.hash = getQueryString(false,'#');
		}
		return false;
	};
	this.cStep = function(x) {
		if(form['step'].value==x&&form['page'].value==1) {
			refresh();
		} else {
			form['step'].value=x;
			form['page'].value=1;
			location.hash = getQueryString(false,'#');
		}
		return false;
	};
	this.cPage = function(x) {
		if(form['page'].value==x) {
			refresh();
		} else {
			form['page'].value=x;
			location.hash = getQueryString(false,'#');
		}
		return false;
	};
	this.goTo = function(x) {
		if(bookmark) {
			if($H(location.hash.substring(1).toQueryParams()).get(bookmark) == x)
				refresh();
			else {
				var h = $H();
				h.set(bookmark,x);
				location.hash = getQueryString(h,'#');
			}
		}
		//return false;
	};
}

});



