var Apartment = {
    pagination: Object, 	//Json Object 	  - Used to hold the page details from the Json object
    details: Object, 	//Json Object 	  - Used to hold the lot details from the Json object
    tRecords: 0, 		//Integer 		  - This the total records for the lot requests
    offset: 0, 		//Integer   	  - Query Offset, required for the pagination to occur
    getFirst: false, 	//Boolean 		  - Used so we know if the first search query has occured. May need to be reset if the user completes another search.
    mapFX: null, 	//Mootools Object - This is used to control the animation states of the Map Holder.
    type: 'browse', //String 		  - This is stored in a cookie "uLotSearchType" so we know what view type the user was using on their last view.
    myDetail: null,
    moveSteps: 1, 			//Integer		  - Used in the div slider in the Details page.
    pageTotal: 0, 		//Integer		  - 
    onPage: 1, 		//Integer		  - 
    currentItem: 0, 		//Integer		  -
    apptID: -1, 		//Integer		  - Using this to pass ids around for searching.
    aprtDetail: null,
    startStep: 0,

    initialize: function() {
        Apartment.currentItem = 0;
        Site.setType('Apartment');

		Site.browseType = Apartment.type = 'browse';

        var mode = unescape(utils.getQuery('mode'));

        if (mode != '') {
            Site.setBrowse(mode);
            Apartment.type = mode;
            Cookie.set('uHomeSearchType', mode, { duration: 14, path: '/' });
        }

        if (Cookie.get('uHomeSearchType', { path: '/' })) {
            Apartment.type = Cookie.get('uHomeSearchType', { path: '/' });
            Site.browseType = Apartment.type;
        }
        $(Apartment.type + 'Search').addClass('selected');

        $$(['list_holder', 'infoListing']).addClass(Apartment.type);

        Apartment.aprtDetail = new apartmentDetail('infoListing', {
            className: 'homeDetails', id: 'detailHolder', mode: Apartment.type, width: 686, height: 483,
            fixed: true, fixTop: 119, fixLeft: -10
        });

		if(Site.sUser) {
			Site.sUser.callback = Apartment.updateState;
		}


        var apptID = unescape(utils.getQuery('ApptIds'));

        if (apptID != '') {
            Apartment.returnID(apptID.toInt());
            Apartment.getList('ApptIds');
            return;
        }
        var iBrowseSel = false;  //new
        var price = unescape(utils.getQuery('price'));

        (price);

        if (price != '') {
            Search.setMin(utils.stripChar('|', price, 0));
            Search.setMax(utils.stripChar('|', price, 1));
            iBrowseSel = true;
            //Apartment.reset();
            //Apartment.getList();
            //return;
        }

        var complex = unescape(utils.getQuery('CompIds'));
        if (complex != '') {
            Search.setComplex(complex);
            iBrowseSel = true;
        }

        var type = unescape(utils.getQuery('SuiteType'));
        if (type != '') {
            Search.setType(type);
            iBrowseSel = true;
        }

        var location = unescape(utils.getQuery('location'));
        if (location != '') {
            Search.setLevelName(location);
            iBrowseSel = true;
        }

        var bed = unescape(utils.getQuery('bed'));
        if (bed != '') {
            Search.setBed(bed);
            iBrowseSel = true;
        }

        var bath = unescape(utils.getQuery('bath'));
        if (bath != '') {
            Search.setBath(bath);
            iBrowseSel = true;
        }

        if (iBrowseSel == true) {
            Apartment.reset();
            Apartment.getList();
            return;
        }


        Search.setMin(0);
        Search.setMax(0);
        Apartment.reset();
        Apartment.getList();


    },
    returnID: function(id) {
        Apartment.apptID = id;
    },
    setDetails: function(l) {
        Apartment.details = l;
        return true;
    },
    reset: function() {
        Apartment.currentItem = 0;
        Apartment.offset = 0;
        Apartment.getFirst = false;
        $('prevItemLink').addClass('none');
    },
    listURI: function(type) {
        var URI = config['baseURI'] + config['AprtReturn'];
        var string = '';

        switch (type) {
            case 'newPage':
                nextlastID = config['pageSize'] * (Apartment.onPage - 1);
                string = URI + '?pageSize=' + config['pageSize'] + '&lastId=' + nextlastID + '&MinPrice=' + Search.minPrice + '&MaxPrice=' + Search.maxPrice + '&CompIds=' + Search.complex + '&SuiteType=' + encodeURIComponent (Search.type) + '&LocatedLevel=' + Search.levelName + '&numberOfBedrooms=' + Search.bed + '&numberOfBathrooms=' + Search.bath;
                break;
            case 'showAll':
                string = URI + '?ShowInActive=true';
                break;
            case 'ApptIds':
                string = URI + '?ApptIds=' + Apartment.apptID + '&pageSize=' + config['pageSize'];
                break; // MaxPrice
            case 'quick':
                string = URI + '?mode=' + 1 + '&pageSize=' + config['pageSize'] + '&Offset= ' + Apartment.offset + ' &MinPrice=' + Search.minPrice + '&MaxPrice=' + Search.maxPrice;
                break;
            default:
                string = URI + '?mode=' + 1 + '&pageSize=' + config['pageSize'] + '&Offset=' + Apartment.offset + '&MinPrice=' + Search.minPrice + '&MaxPrice=' + Search.maxPrice + '&CompIds=' + Search.complex + '&SuiteType=' + encodeURIComponent (Search.type) + '&LocatedLevel=' + Search.levelName + '&numberOfBedrooms=' + Search.bed + '&numberOfBathrooms=' + Search.bath;
                //string = URI + '?mode='+ 1 + '&pageSize=' + config['pageSize'];				
        }
        string += '&e=' + new Date().getTime();
        if (Site.sUser.uId() != -1) string = string + '&UserId=' + Site.sUser.uId();

        return string;
    },
    getList: function(list) {
        // Land.getFirst = false;		
        URI = Apartment.listURI(list);

        var request = new Json.Remote(URI, {
            method: 'get',
            onComplete: function(jsonObj) {
                if (jsonObj.root.NewDataSet) {
                    Apartment.setDetails(jsonObj.root.NewDataSet.tblAppt);
                    Apartment.pageNav(jsonObj.root.NewDataSet.tblApptNav);
                    Apartment.buildList();
                    // ('Apartment List retreived');
                } else {
					$('apartment').removeClass('loading');
		            if (!$('errormsg')) {
		                var errormsg = new Element('div', { 'id': 'errormsg' }).injectTop('apartment');

					    new Element('h3').setHTML('Sorry No results for your search').injectInside($('errormsg'));
					}

					//Hide the holders so that the screen does not look broken.
					$$('#list_holder', '#infoListing', '#pageNav_top', '#itemNav').addClass('none');
                }
            }
        }).send();
    },
    buildList: function() {
        if ($('apartment').hasClass('loading')) $('apartment').removeClass('loading');
        var list_detail = $('list_detail').empty();

		if ($('errormsg')) $('errormsg').remove();
		$$('#list_holder', '#infoListing', '#pageNav_top').removeClass('none');
		
        $('itemNav').addClass('none');
        if (Apartment.details.length) {
            Apartment.details.each(function(detail, i) {
                switch (Apartment.aprtDetail.options.mode) {
                    case 'browse':
                        try { Apartment.browseListItem(detail, i).injectInside(list_detail); }
                        catch (err) { }
                        break;
                    case 'detail':
                        try { Apartment.detailListItem(detail, i).injectInside(list_detail); }
                        catch (err) { }
                        break;
                }
                if (i == Apartment.currentItem && Site.sUser) {
                    Site.sUser.showAgent(6, detail.APPT_COM_nId);
                    if (Site.sUser.regProcess != 2) {
                        if (detail.iRegistered.toInt() != 1) Site.sUser.updateRegister(1, detail.APPT_nId.toInt(), detail.APPT_strName + ' ' + detail.COM_strComplexName, { estateName: EstateName });
                        else Site.sUser.updateRegister(7, iEstate, EstateName);
                    };
                }
                if (i == Apartment.startStep && Apartment.aprtDetail.options.mode == 'detail') Apartment.aprtDetail.updateDetail(Apartment.details[Apartment.currentItem], Apartment.currentItem);
            });
            if (Apartment.aprtDetail.options.mode != 'browse') $('itemNav').removeClass('none');
        } else {
            switch (Apartment.aprtDetail.options.mode) {
                case 'browse': Apartment.browseListItem(Apartment.details, 0).injectInside(list_detail); break;
                case 'detail': Apartment.detailListItem(Apartment.details, 0).injectInside(list_detail); Apartment.aprtDetail.updateDetail(Apartment.details, 0); break;
            }
            if (Site.sUser) {
                Site.sUser.showAgent(6, Apartment.details.APPT_COM_nId);
                if (Site.sUser.regProcess != 2) {
                    Site.sUser.updateRegister(1, Apartment.details.APPT_nId.toInt(), Apartment.details.APPT_strName + ' ' + Apartment.details.COM_strComplexName, { estateName: EstateName });
                };
            }
        }
        Apartment.getFirst = true;
    },
    browseListItem: function(obj, i) {

        holder = new Element('li', { 'id': 'item_' + obj.APPT_nId }).addClass('holder');

        if (obj.iViewed == "1") { holder.addClass('viewed'); }
        if (obj.iSaved == "1") { holder.addClass('saved'); }
        if (obj.iRegistered == "1") { holder.addClass('registered'); }

        if (i == Apartment.currentItem) holder.addClass('current');

        container = new Element('ul').injectInside(holder);
        lne1 = new Element('li', { 'id': 'lot_' + obj.APPT_nId }).addClass('details').injectInside(container);
        lne1a = new Element('ul').injectInside(lne1);

        lne1b = new Element('li').addClass('name').setHTML(obj.APPT_strName).injectInside(lne1a);
        lne1c = new Element('li').addClass('price').setHTML(obj.APPT_curPrice).injectInside(lne1a);

        lne2 = new Element('li').addClass('image').injectAfter(lne1);
        lne2a = new Element('img').injectInside(lne2);
        if (config.AssetVersion == '1') {
            lne2a.setProperty('src', config['baseURI'] + 'Utilities/GenerateImage.aspx?path=../' + obj.FloorPlanLocation + '&w=178&h=720&mode=resizefit');
        }
        else {
            lne2a.setProperty('src', config['baseURI'] + 'Utilities/GenerateImage.aspx?path=' + obj.FloorPlanLocation + '&w=178&h=720&mode=resizefit');
        } 
        
        lne2.addEvents({
            'click': function() {
                Apartment.openDetails(obj, i);
            },
            mouseenter: function() { $$('#item' + i + ' li.image').addClass('hover'); },
            mouseleave: function() { $$('#item' + i + ' li.image').removeClass('hover'); }
        });

        aprt_status = obj.SLST_strName.toLowerCase();

        lne2_status = new Element('div').addClass('status ' + aprt_status).setHTML(obj.COM_strComplexName).injectInside(lne2);

        lne3 = new Element('li').addClass('controls').injectAfter(lne2);
        lne3a = new Element('ul').injectInside(lne3);
        lne3b = new Element('li').addClass('add').injectInside(lne3a);

        //var query = ['"'+obj.APPT_strName+'"', obj.APPT_nId, facadeID, assetId];
        var query = [obj.APPT_nId.toInt(), '\'' + obj.APPT_strName + '\''];


        if (aprt_status != 'sold') {
            lne3b_1 = new Element('a', { 'href': 'javascript:void(0)', 'id': 'control_' + obj.APPT_nId }).setHTML('Save').injectInside(lne3b);

            if (obj.iSaved == "1") {
                lne3b_1.setHTML('Saved').onclick = function() { mySelection.Delete("AptIds", obj.APPT_nId.toInt(), obj.APPT_strName); };
            } else {
                lne3b_1.onclick = function() { mySelection.save(obj.APPT_nId.toInt(), obj.APPT_strName); };
            }
        } else {
            lne3b.setHTML('&nbsp;');
        }



        lne3c = new Element('li').addClass('stage').injectAfter(lne3b);

        lne3d = new Element('li').addClass('more').injectInside(lne3a);
        lne3d_1 = new Element('a', { 'id': 'detail_' + obj.APPT_nId }).setHTML('Detail').injectInside(lne3d);

        lne3d_1.addEvents({
            'click': function() {
                Apartment.openDetails(obj, i);
            },
            mouseenter: function() { $$('#item' + i + ' li.image').addClass('hover'); },
            mouseleave: function() { $$('#item' + i + ' li.image').removeClass('hover'); }
        });

        return holder;

    },
    openDetails: function(obj, i) {
        $$('li.holder').removeClass('current');
        Apartment.aprtDetail.updateDetail(obj, i);
        $('item_' + obj.APPT_nId).addClass('current');

        if (Site.browseType != 'browse') {
            $$(['itemNav', 'prevItemLink', 'nextItemLink']).removeClass('none');
            if (Apartment.onPage == 1 && Apartment.currentItem == 0) { $('prevItemLink').addClass('none'); }
            else if (Apartment.onPage == Apartment.paging.numPages() && Apartment.currentItem == (Apartment.details.length - 1)) { $('nextItemLink').addClass('none'); }
        };

    },
    detailListItem: function(obj, i) {
        holder = new Element('li', { 'id': 'item_' + obj.APPT_nId }).addClass('holder').addClass(utils.cleanString(' ', obj.SLST_strName.toLowerCase()));
        // if(myList.list != null && myList.list.HomeIds.contains(home.APPT_nId.toInt()) == true) { holder.addClass('saved'); }
        if (i == Apartment.currentItem) holder.addClass('current');
        if (obj.iViewed == "1") { holder.addClass('viewed'); }
        if (obj.iSaved == "1") { holder.addClass('saved'); }
        if (obj.iRegistered == "1") { holder.addClass('registered'); }

        container = new Element('ul').injectInside(holder);
        lne1 = new Element('li', { 'id': 'lot_' + obj.APPT_nId }).addClass('name').setHTML(obj.APPT_strName).injectInside(container);
        container.addEvent('click', function() {
            $$('ul#list_detail li.holder').removeClass('current');
            $('item_' + obj.APPT_nId).addClass('current');
            Apartment.openDetails(obj, i);
        });
        lne2 = new Element('li').addClass('price').setHTML(obj.APPT_curPrice).injectInside(container);

        var gap = 0;
        var wid = 71;
        var leftPos = (wid * i) + (gap * i);

        holder.setStyle('left', leftPos);

        return holder;
    },
    setType: function(t, single) {

        $$('#' + Apartment.type + 'Search a').removeClass('selected');
        $$('#' + t + 'Search a').addClass('selected');

        $$(['list_holder', 'infoListing']).removeClass(Apartment.type).addClass(t);

        Apartment.type = t;
        Site.browseType = t;

        Cookie.set('uHomeSearchType', Apartment.type, { duration: 14, path: '/' });

        Apartment.aprtDetail.changeMode(t);

        Apartment.buildList();
    },
    updateBrowseNav: function(type) {

        switch (type) {

            case 'detail':
                $('browseSearch').addClass('disabled').onclick = '';
                $('itemNav').addClass('none');
                break;
            default:

                break;

        }


    },
    pageNav: function(tObject) {
        if (!tObject) return;
        Apartment.tRecords = tObject.Total.toInt();
        config['pageSize'] = tObject.PageSize.toInt();
        //Apartment.LastId	= config['pageSize'] * (this.onPage-1); // tObject.LastId.toInt();

        //Working out the number of pages.
        if (Apartment.getFirst != true) {
            $$('.pageLinks').empty();
            Apartment.pageTotal = Math.ceil(Apartment.tRecords / config['pageSize']);

            Apartment.paging = new pagination('pageNav_top', tObject.Total.toInt(), {
                num_edge_entries: 2,
                num_display_entries: 3,
                bottom_nav_holder: 'pageNav_bottom',
                bottom_nav: true,
                onChange: Apartment.changePage.bind()
            });

            if (Apartment.pageTotal > 1) {
                Apartment.getFirst = true;
            } else {
                $$('.pageLinks').empty();
                Apartment.paging.maxentries = 1;
            }
        }
        utils.activateToolTip('.toolTip');
    },
    changePage: function(offset, page, pPage) {



        if (page > 1) { $$('ul#itemNav li a').removeClass('none'); }
        else if (page == 1) { $('prevItemLink').addClass('none'); }

        if (!pPage) {
            Apartment.startStep = Apartment.currentItem = 0;
        } else {
            $('prevItemLink').removeClass('none');
        }

        Apartment.onPage = page;
        Apartment.offset = offset;
        //Starts from position 0 when the new list loads
        Apartment.getList('newPage');
        if (Apartment.paging) {
            Apartment.paging.drawLinks();
        }
    },
    prevPage: function() {
        Apartment.paging.current_page = Apartment.paging.current_page - 1;

        Apartment.startStep = Apartment.currentItem = config['pageSize'] - 1;

        Apartment.changePage(
			(this.onPage - 2) * config['pageSize'],
			this.onPage - 1,
			true
		);
    },
    nextPage: function() {
        Apartment.paging.current_page = Apartment.paging.current_page + 1;

        Apartment.changePage(
			this.onPage * config['pageSize'],
			this.onPage + 1
		);
    },
    changeItem: function(index) {
        Apartment.aprtDetail.updateDetail(Apartment.details[index], Apartment.currentItem);
    },
    prevItem: function() {
        if (Apartment.currentItem > 0) {
            Apartment.currentItem = Apartment.currentItem - 1;
            Apartment.openDetails(Apartment.details[Apartment.currentItem], Apartment.currentItem);
        } else if (Apartment.onPage > 1) {
            Apartment.currentItem = config['pageSize'] - 1;
            Apartment.prevPage();
        }
        if (Apartment.currentItem >= 0) {
            $('nextItemLink').removeClass('none');
        }
        if (Apartment.onPage == 1 && Apartment.currentItem == 0) $('prevItemLink').addClass('none');
    },
    nextItem: function() {
        if (Apartment.currentItem + 1 < Apartment.details.length) {
            Apartment.currentItem = Apartment.currentItem + 1;
            Apartment.openDetails(Apartment.details[Apartment.currentItem], Apartment.currentItem);
        } else if (Apartment.onPage != Apartment.paging.numPages()) {
            Apartment.currentItem = 0;
            Apartment.nextPage();
        } else {
            ('End of the Line');
        }
        if (Apartment.currentItem + 1 == Apartment.details.length) {
            if (Apartment.onPage == Apartment.paging.numPages()) $('nextItemLink').addClass('none');
        } else {
            if ($('prevItemLink').hasClass('none')) $('prevItemLink').removeClass('none');
        }
    },
    updateState: function(action, obj) {
        switch (action) {
            case 'saveregistered':
                myList.addToList(obj['primKey'], obj['itemName']);
            case 'registered':
                Apartment.details[Apartment.currentItem]['iRegistered'] = 1;
                $('item_' + obj['primKey']).addClass('registered');
                $$('li.controls a.interest').addClass('registered');
                break;
        }
    }
};
