var use_ajax = false;


function initImagesIndependly(fSrc, rSrc, iSrc, oSrc) {
    var fImage = $('fImage');
    var rImage = $('rImage');
    var iImage = $('iImage');
    var oImage = $('oImage');

    initImageIndependly(fImage, fSrc);
    initImageIndependly(rImage, rSrc);
    initImageIndependly(iImage, iSrc);
    initImageIndependly(oImage, oSrc);


    ///===========================

    new FormCheck(  'contactForm' );


}
function initImageIndependly(image, src) {
    
        if (image) {
            image.addEvent('click', function () {

                var mainImage = $('mainImage');
                mainImage.set('src', src);
            });
        }
}


function globalInit(){   

   if(use_ajax == true){
       initializer = new Initializer();
       initializer.initAll();
   }
}


var AjaxState = new Class({
    
    _USE_AJAX : false,
    _HASH_CHECK_MILLISECONDS : 50,
    _isInListing :null,
    _isInCar     :null,
    _isInFilter  :null,
    _divToUpdate :null,
    _hash:'',
    _href:null,
    _params: new Hash(),


    initialize: function(){
        if( this._USE_AJAX == true ){
            this._isInListing = true;
            this._isInCar     = false;
            this._isInFilter  = false;

            setInterval( 'state.checkHash()', this._HASH_CHECK_MILLISECONDS );
        }
    },

    //--

    checkHash: function(){

        var new_hash = unescape(document.location.hash);

        if ( new_hash != this._hash) {

            var old_hash = this._hash;
            this._hash = new_hash;
            this._href = document.location.href;

            //-----------------------------------------------
            //         constructing base url
            //-----------------------------------------------
            var uri            = new URI(this._href);
            var host           = uri.get('host');
            var hash_start_pos = document.location.href.indexOf('#');
            var lang ;
            if( hash_start_pos!=-1){
                lang = document.location.href.substring(8+host.length, hash_start_pos);
            }else{
                lang = document.location.href.substring(8+host.length);
            }

            var new_base_url   = "/" + lang + "/";


            this.onHashChanged( '', old_hash, new_base_url, this._hash );
        }
    },

   setParamsWithoutEvent:function(arr_params, arr_clear, divToUpdateName, ajax){

        var params = new Hash(arr_params);
        var clear  = new Hash(arr_clear);

        this._divToUpdate = divToUpdateName;
        this._ajax = ajax;


        //---------------------
        // clearing parameters
        //---------------------
        if(clear.has('clear-all')){
            this.clearParams();
        }else
        if(clear.has('clear-nothing')){

        }else
        if(clear.has('clear-keys')){
            var keysToClear = clear.get('clear-keys');
            for( var i=0; i < keysToClear.length; ++i ){
                this.removeParam( keysToClear[i] );
            }
        }else
        if(clear.has('clear-keys-but')){

            var keysToKeep = $A(clear.get('clear-keys-but'));
            var existingKeys = this._params.getKeys();

            for(  var j=0; j < existingKeys.length; ++j ){
                if( keysToKeep.indexOf(existingKeys[j])==-1)
                    this.removeParam( existingKeys[j] );
            }
        }

        //---------------------
        // setting parameters
        //---------------------
        params.each( function(value, key){
                  state.setParam(key, value);
            }
        );

    },

    setParams: function(arr_params, arr_clear, divToUpdateName, ajax ){

        if( this._USE_AJAX == true ){
            
            this.setParamsWithoutEvent(arr_params, arr_clear, divToUpdateName, ajax );
            this.onParamsChanged();
        }
    },

    onParamsChanged: function(){
        window.location.hash = this.getHash();

    },

    setDivToUpdate: function(divToUpdate){
        this._divToUpdate = divToUpdate;
    },

    getDivToUpdate: function()           {
        return this._divToUpdate;
    },

    setParam:       function(key, value){
       if( this._USE_AJAX == true ){
           this._params.set(key, value)
       }
    },

    removeParam:    function(key){
        this._params.erase(key);
    },

    getParam:       function(key){
        this._params.get(key)
    },

    clearParams:    function(){
        this._params.empty()
    },

    isInListing:    function(){
        return this.isInListing;
    },

    isInCar:        function(){
        return this.isInCar;
    },

    isInFilter:     function(){
        return this.isInFilter;
    },

    onHashChanged: function( old_base_url, old_hash, new_base_url, new_hash  ){


       var params = this.getParamsFromHash(new_hash);
       params.each(function(value,key){
         state.setParam(key,value);
       });


        var the_url = this.constructUrl( new_base_url, new_hash );

        if( !this._ajax || !this._divToUpdate){

            var update_data = this.getUpdateData( old_hash, new_hash );

            this._ajax        = update_data['ajax'];
            this._divToUpdate = update_data['update'];
        }

        ajaxRequestByUrl(the_url, { 'ajax': this._ajax }, $(this._divToUpdate));

        this._ajax        = null;
        this._divToUpdate = null;
    },

    getHash: function(){
        return '#' + this._hashSerialize( this._params);
    },

    _hashSerialize:function ( params ){




        var result = '';
        var separator = '--';
        var key_value_separator = '=';

        if( params.has('car_id')){
            return 'car_id' + key_value_separator + params.get('car_id');
        }


        params.each(
            function(value, key){

            if( key != 'f'){

                    if(result.length <=1){
                        result += key + key_value_separator + value;
                    }else{
                        result += separator + key + key_value_separator + value;
                    }
                }
            });

           if( params.has('f')){
               result+= separator+'f/'+this._hashSerialize( params.get('f'))+'/';
           }

        return result;
    },

    getUpdateData: function(old_hash, new_hash){

        var oldParams = this.getParamsFromHash(old_hash);
        var newParams = this.getParamsFromHash(new_hash);

        var hierarchy =new Hash({

            'car_id'         :{'update':'filter_level',       'ajax':'filter_link'      },
            'auction_type'   :{'update':'auction_type_level', 'ajax':'auction_type_link'},
            'brand'          :{'update': 'brand_level',       'ajax':'brand_link'       },
            'model'          :{'update': 'model_level',       'ajax':'model_link'       },
            'f'              :{'update':'pager_level'/*'filter_level'*/,   'ajax':'pager_link'    /*'ajax':'filter_link'*/      },
            'order'          :{'update': 'order_level',       'ajax':'ordering_link'    },
            'page'           :{'update': 'pager_level',       'ajax':'page_link'        }

        });

        var result = null;

        var found = false;
        hierarchy.each( function(value, key){

            var condition = (oldParams.has(key) && !newParams.has(key)) ||
                            (!oldParams.has(key) && newParams.has(key)) ||
                            (oldParams.get(key)!=newParams.get(key));

            if( condition && !found ){
               result = hierarchy.get(key);
               found = true;
            }
          });

        return result; // no changes

    },
    constructUrl: function( base_url, hash ){

        //  ---------------------------  PART-1  -----------------------------------
        var url = base_url;
        var params = this.getParamsFromHash(hash);

        if(params.has('car_id')){

            url+="car/"+params.get('car_id')+"/-";
            return url;
        }

        //  ---------------------------  PART-2  -----------------------------------
        if(params.has('f')){
            url += "filter/";
        }

        if(params.has('brand')){
            url+=params.get('brand');
            if(params.has('model')){
                url+="/"+params.get('model');
            }
        }



        //  ---------------------------  PART-3  -----------------------------------
        var request_params = params.filter( function(value,key){
            return key!='brand' && key!='model' && key!='f' && key!='car_id';
        });

        if( params.has('f')){

            var filter_params = params.get('f');

            request_params.set('modification',    filter_params.get('modification'));
            request_params.set('production_year', filter_params.get('production_year'));
            request_params.set('mileage',         filter_params.get('mileage'));
            request_params.set('rating',          filter_params.get('rating'));

            this._divToUpdate = 'pager_level';//'filter_level';
            this._ajax        = 'page_link';//'filter_link';
        }

        var query_part_of_url = request_params.toQueryString();

        if(query_part_of_url.length > 0 ){
            url+="?"+query_part_of_url;
        }
        return url;
    },


    getParamsFromHash: function(hash){

        if(hash == ''){
            return new Hash();
        }

        var separator = '--';
        var keyValueSeparator = '=';


        var pos = hash.indexOf('--f/');
        var filter_str='';
        var params = new Hash();

       if(pos!=-1){
            filter_str = hash.substring( pos+4, hash.length-1);
            params.set('f', this.getParamsFromHash(filter_str));
            hash = hash.substring(0, pos );
        }

        if( hash.indexOf('#')==0){
            hash = hash.substring(1);
        }

        var pairs = hash.split(separator);


        for( var i=0; i<pairs.length; ++i ){
            var part =pairs[i];

            var pairSplitted = part.split(keyValueSeparator);
            var key =  pairSplitted[0];
            var value = pairSplitted[1];

            params.set(key, value);
        }

        return params;
    }

});


//if( use_ajax == true ){
   var state = new AjaxState();


function ajaxRequestByUrl( ajax_url, params, update_div ){

    new Request.HTML({

        method: 'get',
        url:ajax_url,
        evalScripts: true,
        data: params,

        onRequest: function(){
            freeze();
            showLoadingBox();
        },

        onSuccess:  function(responseTree, responseElements, responseHTML, responseJavaScript) {

            if( update_div ){
            unfreeze();
            var parent = $(update_div).getParent();
            update_div.dispose();
            parent.innerHTML = parent.innerHTML + responseHTML;
            destroyLoadingBox();}
            initializer.initAll();
        },

        onFailure: function (){
            unfreeze();
            destroyLoadingBox();
        }

    }).send();
}

function getFivToFreeze(){
    return $('listing')!=null?$('listing'):$('car_level');
}

function buttonOver( button, cssClass ){
    button.setAttribute("class", cssClass);
}

function freeze(){
    var div = getFivToFreeze();
    if( div!=null)
        div.addClass('transparent');
}
function unfreeze(){

    var div = getFivToFreeze();
    if( div!=null)
        div.removeClass('transparent');
}
function showLoadingBox(){


   var container = $('container');

    var BOX_WIDTH  = 300;
    var BOX_HEIGHT = 100;

    var box = new Element('div');
    box.addClass('loadingbox');

    var image = new Element('img', {'src':'img/loading_transparent.gif'} );

    box.appendChild(image);
    box.setStyle('width',  BOX_WIDTH);
    box.setStyle('height', BOX_HEIGHT);

    var pos_x =  (screen.availWidth - BOX_WIDTH)/2;
    var pos_y =  (screen.availHeight-BOX_HEIGHT)/2;

    box.setPosition({  x:pos_x, y:pos_y   });
   if(container){
       container.appendChild(box);
   }
}
function destroyLoadingBox(){
    $$('.loadingbox').destroy();
}

function onDisabledLinkClick(e){

    if (e.preventDefault)
        e.preventDefault();

    return false;
}

function disableLinks(){
    var links = $$('a');
    for( var i=0; i<links.length; ++i ){
        links[i].addEvent('click', onDisabledLinkClick, false);
    }
}

function enableLinks(){
    var links = $$('a');
    for( var i=0; i<links.length; ++i ){
        links[i].removeEvent('click',onDisabledLinkClick );
    }
}

var Initializer = new Class({

    initAll: function(){
        this.initAllLinks();
    },

    initImage: function(image, src) {
        if (image) {
            image.addEvent('click', function () {

                var mainImage = $('mainImage');
                mainImage.set('src', src);
            });
        }
    },
initImages: function(fSrc, rSrc, iSrc, oSrc) {
    this.initFromAjax(fSrc, rSrc, iSrc, oSrc);
},

initFromAjax:function(fSrc, rSrc, iSrc, oSrc) {

    var fImage = $('fImage');
    var rImage = $('rImage');
    var iImage = $('iImage');
    var oImage = $('oImage');

    this.initImage(fImage, fSrc);
    this.initImage(rImage, rSrc);
    this.initImage(iImage, iSrc);
    this.initImage(oImage, oSrc);
},

initAllLinks:function(){

    this.setLinks( $(document.body).getElements('[class$=car_link]'         ));
    this.setLinks( $(document.body).getElements('[class$=brand_link]'       ));
    this.setLinks( $(document.body).getElements('[class$=model_link]'       ));
    this.setLinks( $(document.body).getElements('[class$=order_link]'       ));
    this.setLinks( $(document.body).getElements('[class$=auction_type_link]'));
    this.setLinks( $(document.body).getElements('[class$=page_link]'        ));

    this.initFilterForm();
    this.initContactForm();
},
initFilterForm: function(){

    if($('SearchForm') ){
        $('SearchForm').addEvent('submit', function (e){

            var filterParams = new Hash({

                'modification'    : $('modification'   ).options[$('modification')   .selectedIndex].value,
                'mileage'         : $('mileage'        ).options[$('mileage')        .selectedIndex].value,
                'production_year' : $('production_year').options[$('production_year').selectedIndex].value,
                'rating'          : $('rating'         ).options[$('rating')         .selectedIndex].value
            });


            state.setParam('f', filterParams );
            state.removeParam('page');
            state.removeParam('order');
            state.removeParam('car_id');
            document.location.hash = state.getHash();

            e.stop();

            return;

        });
    }
},

initContactForm:function(){

    if( $('contactForm')){

        //alert('Bubu');

        hs.graphicsDir = '/js/highslide/graphics/';

        var myInputs = $$('input', 'textarea');

        /*var myHilighter = new SL_Hilight({
            inputs: myInputs,
            activeClass: 'active_field',
            initialFocus: true
        });*/


        $('contactForm').action = $('contact_form_url').value;

        this.initImages( $('largeFLink').value,
                         $('largeRLink').value,
                         $('largeILink').value,
                         $('largeOLink').value );

        new FormCheck(

            'contactForm',
            {
                submitByAjax:             true,

                onAjaxRequest :function (){

                    this.action = $('contact_form_url').value;
                    freeze();
                    showLoadingBox();

                },

                onAjaxSuccess : function(response){

                    unfreeze();
                    var updateDiv = $('car_level');
                    var parent = updateDiv.getParent();
                    updateDiv.dispose();
                    parent.innerHTML = parent.innerHTML + response;
                    destroyLoadingBox();
                    initializer.initAll();
                },

                onAjaxFailure : function(){
                    unfreeze();
                    destroyLoadingBox();
                }

              }//end formcheck parameters
            );//ed formcheck construction
         }//if contactForm != null
    else{
        // do nothing
    }
},
initLink: function(link){
    link.addEvent('click',
        function (e) {
            e = new Event(e);
            e.stop();
        }, false);
},
setLinks:function( links ){
    for( var i=0; i<links.length; ++i ){
        this.initLink(links[i]);
    }
}});