if (typeof CN === 'undefined' || !CN)  {
    /**
     * CN global namespace object
     * @namespace CN global namespace object
     */
    var CN = {};
}

CN.golfcourses = CN.golfcourses || {};

CN.golfcourses.search= (function(jQ,$CN,$CNG){

var myform=false,
        country,
        city,
        region,
        paginator,
        query = '',
        sort = '',
        limit = '',
        dir=0,
        page=0,
        pages=0,
        doResetPageAndSort = false,
        countryRegionCity=$CNG.countryRegionCity,

    resetPageAndSort = function (e) {
     if(e && e.originalEvent){
        doResetPageAndSort = true;
     }
     return (e.target && e.target.nodeName === 'A' ? false : true);
    },

    doSubmit = function() {
        resetPageAndSort();
        myform.trigger('submit')
        return false;
    },

    onFormSubmit = function () {
        var myForm=myform.get(0);
        if (doResetPageAndSort) {
            myForm.page.value = 1;
            myForm.sort.value = '';
            myForm.sortDirection.value = 1;
        }
        return true;
    }

   function toggleRatingsBubble(e) {
        var bub = jQ('#ratingsBubble'),
            trigEl = jQ(e.currentTarget || e.target);
         bub.toggle().filter(':visible').css({
                top: (trigEl.position().top + trigEl.height())- (bub.height()),
                left: trigEl.position().left - bub.width() || 0
         });
    }

   function changeRegions() {
        var myCountry = country.val() || "",
            regions=countryRegionCity[myCountry] || [],
            labels = {
                "Trinidad and Tobago"   : 'Select Island',
                "Islands"               : 'Select Island',
                "Canada"                : 'Select Province'
            },
            reg=region.get(0),
            r;

        region.attr('disabled',false).children().remove();
        reg.options[reg.options.length] = new Option(labels[myCountry] || "Select State",'');
        for (r in regions){
            reg.options[reg.options.length] = new Option(r, r);
        }
        if (!country.val()){
            reg.disabled=true;
        }
        changeCities();
    }

   function changeCities() {
        var cities = country.val() && region.val() ?
                countryRegionCity[country.val()][region.val()] : [],
            cityEl=city.get(0),
            cv,
            c=0;

      city.empty().attr('disabled',false);
      cityEl.options[cityEl.options.length] = new Option("Nearest Metro Area", '');
      for(; c<cities.length; c++){
        cv=cities[c];
        cityEl.options[cityEl.options.length] = new Option(cv, cv);
      }

      if (!region.val() || cities.length == 0){
        city.attr('disabled',true);
      }
    }


   function preFillForm(qs) {
        var fields= {
                country:qs["country"] || false,
                region: qs["region"] || false,
                nearestCity :qs["nearestCity"] || false
            };
        jQ(".limit :input[value='"+(qs["limit"] || "")+"']",myform).attr('checked','checked');

        if (!country) return;
        for (var field in fields){
            jQ("#"+field,myform).val(decodeURIComponent(fields[field]).replace(/\+/g,' ')).triggerHandler('change');
        }
   }


   function sortResults(sortBy) {
        var myForm=myform.get(0),
            reverse=(sort === sortBy);
        myForm.sortDirection.value=(reverse ? -1 : 1);
        myForm.sort.value = sortBy;
        myForm.page.value = (reverse ? myForm.page.value : 1);
        myform.submit();
        return false;
      }

   function gotoPage(dir) {
        dir = dir || 0;
        var pageNum=CN.utils.trim(paginator.find("input[name='currentPage']").val());
        if(!/^\d+$/.test(pageNum)) return false;

        pageNum= parseInt(pageNum) + (1*dir);
        myform.get(0).page.value = page =
            (pageNum < 1 ? 1 : ( pageNum > pages ?
                pages : pageNum
                )
            );
        myform.submit()
        return false;
    }


    function bindPageEvents(){
        myform.bind('submit',onFormSubmit);
        paginator.bind('submit',function(){return gotoPage()});
        jQ("#bp2pSubmit").bind('click',doSubmit);
        jQ("#closeRatingsBubble,.ratingsAbout").bind('click', toggleRatingsBubble);
        jQ(":input[class^='reset_']",myform).each(function(){
            jQ(this).bind(this.className.replace("reset_",''), resetPageAndSort)
        });
        jQ("a[class^='sortby_']").each(function(){
            var me=this;
            jQ(me).bind('click', function(){
                return sortResults(me.className.replace("sortby_",''));
            });
        });
        jQ(".region :select#country",myform).bind('change', changeRegions);
        jQ(".region :select#region",myform).bind('change', changeCities);
        paginator.find('a.paginationPrevious').bind('click',function(){return gotoPage(-1)})
        paginator.find('a.paginationNext').bind('click',function(){return gotoPage(1)})
    }



   return {
        init : function(data){
            query=data.query || query,
            sort=data.sort || sort,
            limit=data.limit || limit,
            dir=data.dir || dir,
            page=data.page || page,
            pages=data.pages || pages,
            myform=jQ("form#courseSearch"),
            paginator=jQ("form#pageNav"),
            country=jQ(".region #country",myform),
            region=jQ(".region #region",myform),
            city=jQ(".region #nearestCity",myform);
            bindPageEvents();
            preFillForm(CN.url.params());

        }
   }

})(jQuery,CN,CN.golfcourses)

