var Sort =
{
 field: new Element
 (
 'input',
 {
 'type': 'hidden'
 }
 ),

 sort: function(field)
 {
 var name = 'sort[' + field + ']';

 if (Sort.field.name == name)
 {
 if (Sort.field.value == 'ASC') Sort.field.value = 'DESC';
 else Sort.field.value = 'ASC';
 }
 else
 {
 Sort.field.name = name;
 Sort.field.value = 'ASC';
 }

 try
 {
 if (window.ie) Sort.field.getParent().fireEvent.delay(1, Sort.field.getParent(), 'submit');
 else Sort.field.getParent().fireEvent('submit');
 }
 catch (err) { Sort.field.fireChange(); }
 },

 inject: function(form)
 {
 $(form).adopt(Sort.field);
 }
};

var Limit =
{
 field: new Element
 (
 'input',
 {
 'type': 'hidden',
 'name': 'limitstart'
 }
 ),

 step: 0,

 total: 0,

 next: function(event)
 {
 try { event.preventDefault().stopPropagation(); }
 catch (err) { }

 var value = Limit.field.value.toInt() + Limit.step.toInt();
 if (value > Limit.total) return;

 Limit.fire(value);
 },

 prev: function(event)
 {
 try { event.preventDefault().stopPropagation(); }
 catch (err) { }

 var value = Limit.field.value - Limit.step;
 if (value < 0) return;

 Limit.fire(value);
 },

 fire: function(value)
 {
 Limit.field.value = value;

 try { Limit.field.getParent().fireEvent('submit'); }
 catch (err) { Limit.field.fireChange(); }

 return false;
 },

 set: function(value, step, total)
 {
 Limit.field.value = value;
 Limit.step = step;
 Limit.total = total;
 },

 inject: function(form)
 {
 $(form).adopt(Limit.field);
 }
}

var Search = new Class
({
 options:
 {
 advanced: '/',
 save: '/'
 },

 initialize: function(el, options)
 {
 this.el = $(el);
 this.setOptions(options);

 this.bound =
 {
 'submit': this.submit.bindWithEvent(this),
 'advanced': this.advanced.bindWithEvent(this),
 'save': this.save.bindWithEvent(this),
 'prevent': this.prevent.bindWithEvent(this)
 }

 this.el.addEvent('keypress', this.bound.prevent);

 this.el.getElements('button').each
 (
 function(el, i)
 {
 if (el.title == 'advanced') el.addEvent('click', this.bound.advanced);
 else if (el.title == 'save') el.addEvent('click', this.bound.save);
 else el.addEvent('click', this.bound.submit);

 el.title = '';
 }.bind(this)
 );

 this.ajax = new Ajax
 (
 this.options.advanced,
 {
 autoCancel: true,
 onComplete: this.parse.bind(this),
 method: 'get'
 }
 );
 },

 submit: function(e)
 {
 try
 {
 var ev = new Event(e);

 if (ev.target.getTag() == 'button')
 {
 var val = ev.target.value.toLowerCase();

 if (val == 'reset') this.el.adopt(new Element('input', { 'type': 'hidden', 'name': 'reset', 'value': 1 }));
 }
 }
 catch (err) { }

 this.el.submit();
 },

 prevent: function(event)
 {
 if (event.code == 13) this.submit(event);
 },

 parse: function()
 {
 if ((/(ecma|java)script/).test(this.ajax.getHeader('Content-type'))) eval(this.ajax.response.text);
 },

 reload: function()
 {
 window.location.replace(unescape(this.el.action));
 },

 advanced: function(event)
 {
 try { event.stopPropagation().preventDefault(); }
 catch (err) { }

 this.ajax.send(this.options.advanced);
 },

 save: function(event)
 {
 try { event.stopPropagation().preventDefault(); }
 catch (err) { }

 this.ajax.send(this.options.save);
 }
});

Search.implement(new Events(), new Options());