

var MySearch = Class.create({

    doInit: function( logged ) {
				$('subsavebutton').observe('click', this.subSave.bind(this));
				$('subsaveform').observe('submit', this.subSave.bind(this));
				this.pane = $('searchp');
        this.form = $('searchf');
        this.input = $('searchq');
        this.submit = $('searchs');
        this.form.observe('submit', this.doSearch.bind(this, 1));
        this.submit.observe('click', this.doSearch.bind(this, 1));
        this.uniqueSearch = 0;
				this.locked = ( $('golock').style.display == 'none' );
				this.subload = false;
				this.logged = logged;
				
				this.gohead = $('gohead');
				this.invalidateSelection( true );
				this.bindCheckboxes();
				this.checkUrl();
				this.setUri();
				this.lockInvalidate();

				this.uri = location.href;
        this.currentPage = 1;
        this.executer = new PeriodicalExecuter(this.checkUrl.bind(this), 1);
    },

		lockInvalidate: function() {
				if ( this.locked ) { $('gounlock').show(); $('golock').hide(); }
				else { $('golock').show(); $('gounlock').hide(); }
		},

		lock: function() {
				this.locked = true;
				this.lockInvalidate();
		},

		unlock: function() {
				this.locked = false;
				this.subload = false;
				this.lockInvalidate();
		},

		subExec: function(uri) {
				var search = this;
				var subs = $('subsaveform');
				subs.setStyle({backgroundColor: '#d5e1af'});
				new Ajax.Request(uri, {
          	onSuccess: function(transport) {
							if ( transport.responseText.length ) {
								$('subsbox').innerHTML=transport.responseText;
								$('subsavebutton').observe('click', search.subSave.bind(search));
								$('subsaveform').observe('submit', search.subSave.bind(search));
							}
            }
	        });
		},
	
		subSave: function(event) {
				var name = $('subsave').value;
				var uri = 'ajax/subsave.php?name='+name;
				this.subExec(uri);
				if (event) event.stop();
		},

		subRemove: function(name) {
				var uri = 'ajax/subsave.php?name='+name+'&remove=1';
				this.subExec(uri);
		},

		subInvalidate: function() {
				var uri = 'ajax/subsave.php';
				this.subExec(uri);
		},

		subSelect: function(name) {
				$('loading').show();
				this.currentPage = 1;
				this.lock();
				this.subload = name;
				var uri = this.mkQueryUri();
				var search = this;
//				$('sdebug').innerHTML='Loading '+uri;
				new Ajax.Request(uri, {
         	onSuccess: function(transport) {
						search.feed(transport.responseText);
						search.setUri();
           }
        });
		},

		bindCheckboxes: function() {
				var is = $$('#gohead input'); // this.gohead.childElements();
				for ( var i = 0 ; i < is.length ; i++ ) {
					is[i].observe('click', this.toggleItem.bind(this, is[i]));
				}
		},

		mkQueryUri: function( aPage ) {
			uri = 'ajax/search.php?unique='+(++this.uniqueSearch)+'&q='+this.input.getValue()+'&lock='+(this.locked?'1':'0');
      if (aPage > 1) uri += '&pn=' + aPage; 
			if ( this.subload ) uri += '&subload='+this.subload;
			return uri;
		},

		invalidateSelection: function( syncToServer ) {
				var is = $$('#gohead input'); // this.gohead.childElements();
				this.sites_on = new Array();
				this.sites_off = new Array();
				var serial_on = '';
				for ( var i = 0 ; i < is.length ; i++ ) {
					if ( is[i].checked ) {
						this.sites_on.push( is[i].id );
						serial_on += is[i].id+':';
					}	else {
						this.sites_off.push( is[i].id );
					}
				}
				if ( this.sites_off.length && this.sites_on.length ) this.lock();
				if ( !this.sites_on.length ) this.unlock();
				if ( syncToServer ) {
					$('loading').show();
					if ( serial_on.length ) serial_on = serial_on.substr(0,serial_on.length-1);
					else serial_on='clear';
					this.currentPage = 1;
					var uri = this.mkQueryUri()+'&on='+serial_on;
					var search = this;
//					$('sdebug').innerHTML='Loading '+uri;
					new Ajax.Request(uri, {
          	onSuccess: function(transport) {
							search.feed(transport.responseText);
            }
	        });
				}
		},

		feed: function( response ) {
				var preg = /<!-- ([0-9]+) -->/.exec(response);
				if ( preg &&( preg[1] == this.uniqueSearch )) {
					$('loading').hide();
					var preg2 = /<!--CATS= (.*?) -->/.exec(response);
					if ( preg2 ) {
						$('gohead').innerHTML=preg2[1];
						this.bindCheckboxes();
						this.invalidateSelection( false );
					}
          this.pane.innerHTML = response;
				}
		},

    doSearch: function(aPage, event) {
        var q = this.input.getValue();
        if ( q != '' ) $('loading').show();
        var search = this;
        var uri = this.mkQueryUri( aPage );
 
        this.currentPage = aPage;

//				$('sdebug').innerHTML='Loading '+uri;
        new Ajax.Request(uri, {
            onSuccess: function(transport) {
                var olduri = location.href;
                search.setUri();
								search.feed( transport.responseText );
            }
        });
        if (event) event.stop();
    },

    setUri: function() {
        var olduri = location.href;
        var pos = olduri.indexOf('#');
        var newuri = (pos == -1) ? olduri : olduri.substr(0, pos);
				newuri += '#';
				if ( this.subload ) newuri += this.subload+':';
				if ( this.currentPage > 1 ) newuri += this.currentPage+'@';
        location.href = newuri + this.input.getValue();
        this.uri = location.href;
    },

    checkUrl: function() {
	      if (location.href != this.uri) {
          this.uri = location.href;
          var pos = this.uri.indexOf('#');
          var query;
          if ( pos != -1 ) {
            var aparam = decodeURIComponent(this.uri.substr(pos + 1));
            pos = aparam.indexOf(':');
            query = (pos ==-1) ? aparam : aparam.substr(pos+1);
						if ( pos != -1 ) this.subload = aparam.substr(0,pos);
            apos = query.indexOf('@');
            if ( apos != -1 ) {
              this.currentPage = query.substr(0,apos);
              query = query.substr(apos+1);
            } else this.currentPage = 1;
          } else {
            query = this.input.getValue();
          }
          this.input.setValue(query);
          this.doSearch(this.currentPage);
        }
    },

		toggleItem: function(elt) {
			if ( this.subload ) { this.subload = false; this.setUri(); }
			if ( ! this.sites_off.length ) {
				this.sites_on.each(function(e) {
					if ( $(e).id != elt.id ) $(e).checked=false;
				});
				elt.checked=true;
				this.invalidateSelection( true );
				return false;
			} else {
				if ( ! this.sites_on.length ) this.lock();
				this.invalidateSelection( true );
			}
		},

		clearAll: function() {
			this.sites_on.each(function(e) { $(e).checked=false; });
			this.invalidateSelection( true );
		},

		loginCall: function(base,uri) {
			var search = this;
			$(base+'_form').disable();
			new Ajax.Request(uri, {
        onSuccess: function(transport) {
					$(base+'_form').enable();
					if ( transport.responseText.startsWith( 'login:' ) ) {
						search.logged = true;
						$('login_message').innerHTML = transport.responseText.substr(6);
					}
					if ( transport.responseText.startsWith( 'logout:' ) ) {
						search.logged = false;
						$('login_message').innerHTML = transport.responseText.substr(7);
					}

					search.subInvalidate();
					search.toggleBox();
        }
      });
		},

		doLogin: function(base) {
			var login = $(base+'_login').value;
			var pwd = $(base+'_pwd').value;
			if ( !login.length ) { alert('Please enter a login'); return; }
			if ( !pwd.length ) { alert('Please enter a password'); return; }
			var uri = 'ajax/login.php?login='+login+'&pwd='+pwd;
			this.loginCall(base,uri);
		},

		logout: function(base) {
			var uri = 'ajax/login.php?logout=1';
			this.loginCall(base,uri);
		},

		doRegister: function(base) {
			var login = $(base+'_login').value;
			var pwd = $(base+'_pwd').value;
			var pwd2 = $(base+'_pwd2').value;
			var email = $(base+'_email').value;
			if ( pwd != pwd2 ) { alert('Passwords don\'t match. Please enter twice the same password.'); return; }
			if ( pwd.length<6 ) { alert('Please enter a password of length 6 or more.'); return; }
			if ( login.length<4 ) { alert('Please enter a login of length 4 or more.'); return; }
			if ( ! /^[-_a-z0-9.]+$/i.test( login+pwd ) ) { alert('Please use only letters, digits and separators -_.'); return; }
			if ( ! /^[-_a-z0-9.]+@[-_a-z0-9.]+$/i.test( email ) ) { alert('The email adress you entered does not seem a valid adress.'); return; }
			var uri = 'ajax/register.php?login='+login+'&pwd='+pwd+'&email='+email;
			this.loginCall(base,uri);
		},
		
		toggleBox: function() {
			var login = $('login_popup');
			var logout = $('logout_popup');
			var register = $('register_popup');
			var hlogin = login.style.display=='none';
			if ( !hlogin ) new Effect.SlideUp(login, {duration:1});
			var hlogout = logout.style.display=='none';
			if ( !hlogout ) new Effect.SlideUp(logout, {duration:1});
			var hregister = register.style.display=='none';
			if ( !hregister ) new Effect.SlideUp(register, {duration:1});
			if ( hlogin && hlogout && hregister ) {
				if ( this.logged ) new Effect.SlideDown(logout, {duration:1});
				else new Effect.SlideDown(login, {duration:1});
			}
		}
});

var mysearch = new MySearch();

function my_init_search( logged ) {
    mysearch.doInit( logged );
}

