﻿// Requires jquery.
// Requires jquery.json.
// Requires jquery.jcache.

// Namespace shoppingMall
var saltsjobaden = {};
saltsjobaden._construct = function () {

    // A Reference to the current instance of shoppingMall
    var $saltsjobaden = this;

    // A reference to the jQuery instance of shoppingMall,
    // used for triggering events.
    var $jQuerysaltsjobaden = jQuery(this);

    // Cache manager encapsulating bedrock.cache.
    var cache = new function () {
        this.setItem = function (key, val, dependencies) {
            if (jQuery.jCacher) {
                jQuery.jCacher.add(key, val, 60, null, dependencies);
            }
        };
        this.getItem = function (key) {
            if (jQuery.jCacher) {
                var item = jQuery.jCacher.get(key);
                if (item) {
                    return item.value;
                }
                return null;
            }
            return null;
        };
        this.removeItem = function (key) {
            if (jQuery.jCacher) {
                jQuery.jCacher.remove(key);
            }
        };
    };

    // Mirrors the jQuery bind method, to enable chaining
    // when binding events. This is where global application
    // events should be bound.
    $saltsjobaden.bind = function (eventType, eventData, handler) {

        $jQuerysaltsjobaden.bind(eventType, eventData, handler);

        // Returns the non-jQuery object.
        return $saltsjobaden;

    };

    // Contains data access methods
    $saltsjobaden.dataFactory = new function () {

        // A reference to the current instance of data factory.
        var $dataFactory = this;

        // A reference to the jQuery instance of data factory,
        // used to trigger events.
        var $jQueryDataFactory = jQuery(this);

        // Sets the passed variable to a new object instance
        // if undefined.
        var createContext = function (context) {
            context = context ? context : [];
        };

        // Mirrors the jQuery bind method, to enable chaining
        // when binding events.
        $dataFactory.bind = function (eventType, eventData, handler) {

            $jQueryDataFactory.bind(eventType, eventData, handler);

            // Returns the non-jQuery object.
            return $dataFactory;

        };









        $dataFactory.objectsForSale = {
            
            getObjectById: function (objectId, callback, context) {

                createContext(context);

                var cacheKey = "objectId_" + objectId;

                var object = cache.getItem(cacheKey);

                if (object) {
                    if (callback) {
                        callback(object);
                    }
                }
                else {

                    raiseEvent("fetchrequested", { type: "object", id: objectId }, context);

                    saltsjobaden.request("/Framework/Services/SaltsjobadenMobile.asmx/GetObjectDetail", { id: objectId }, function (data) {

                        object = data;
                        cache.setItem(cacheKey, object);

                        if (callback) {
                            callback(object);
                        }

                        raiseEvent("dataupdated", { type: "object", object: object }, context);

                    }, function (error) {

                        alert("Error getting objectDetails.");

                        if (callback) {
                            callback(null, error);
                        }

                        raiseEvent("fetchcanceled", { type: "object", id: objectId }, context);
                    });
                }
            },

            getAll: function (callback, context) {

                createContext(context);

                var cacheKey = "objectList";
                var objectlist = cache.getItem(cacheKey);

                if (objectlist) {
                    if (callback) {
                        callback(objectlist);
                    }
                }
                else {

                    raiseEvent("fetchrequested", { type: "objectList" }, context);

                    saltsjobaden.request("/Framework/Services/SaltsjobadenMobile.asmx/GetHomesForSale", {}, function (success) {

                        var objectlist = success;
                        cache.setItem(cacheKey, objectlist);

                        if (callback) {
                            callback(objectlist);
                        }

                        raiseEvent("dataupdated", { type: "objectList", objectlist: objectList }, context);
                        
                        
                    }, function (error) {

                        // error
                        alert("error getting objectList - datafactory");

                        if (callback) {
                            callback(null, error);
                        }

                        raiseEvent("fetchcanceled", { type: "objectList" }, context);

                    });

                }
            },

            getImageListForObject:function (objectId, callback, context) {

                createContext(context);

                var cacheKey = "imageList";
                var imagelist = cache.getItem(cacheKey);

                if (imagelist) {
                    if (callback) {
                        callback(imagelist);
                    }
                }
                else {

                    raiseEvent("fetchrequested", { type: "imageList", id:objectId }, context);

                    saltsjobaden.request("/Framework/Services/SaltsjobadenMobile.asmx/GetAllImagesForObjectById", {id:objectId}, function (success) {

                        var imagelist = success;
                        cache.setItem(cacheKey, imagelist);

                        if (callback) {
                            callback(imagelist);
                        }

                        raiseEvent("dataupdated", { type: "imageList", imagelist: imageList }, context);
                        
                        
                    }, function (error) {

                        // error
                        alert("error getting imageList - datafactory");

                        if (callback) {
                            callback(null, error);
                        }

                        raiseEvent("fetchcanceled", { type: "imageList", id:objectId }, context);

                    });

                }
            }
        };



//        $dataFactory.estateAgents = {
//            
//                GetAll: function (callback, context) {

//                createContext(context);

//                var cacheKey = "cityList_" + parentId;

//                var cityList = cache.getItem(cacheKey);

//                if (cityList) {
//                    if (callback) {
//                        callback(cityList);
//                    }
//                }
//                else {

//                    raiseEvent("fetchrequested", { type: "cityList", parentId:5 }, context);

//                    shoppingMall.request("/Framework/Services/city.asmx/GetCities", { parentId:5 }, function (success) {

//                        var citylist = success;
//                        cache.setItem(cacheKey, citylist);

//                        if (callback) {
//                            callback(citylist);
//                        }

//                        raiseEvent("dataupdated", { type: "cityList", citylist: cityList }, context);
//                        
//                        
//                    }, function (error) {

//                        // error
//                        //alert("error getting cities - datafactory");

//                        if (callback) {
//                            callback(null, error);
//                        }

//                        raiseEvent("fetchcanceled", { type: "cityList" }, context);

//                    });

//                }
//            }
//                        
//        };


//        $dataFactory.category = {
//            
//                GetCategories: function (parentId, callback, context) {

//                createContext(context);

//                var cacheKey = "categoryList_" + parentId;
//                var categoryList = cache.getItem(cacheKey);

//                if (categoryList) {
//                    if (callback) {
//                        callback(categoryList);
//                    }
//                }
//                else {

//                    raiseEvent("fetchrequested", { type: "categoryList", parentId:parentId }, context);

//                    shoppingMall.request("/Framework/Services/category.asmx/GetCategories", { parentId: parentId }, function (success) {

//                        var categorylist = success;
//                        cache.setItem(cacheKey, categorylist);

//                        if (callback) {
//                            callback(categorylist);
//                        }

//                        raiseEvent("dataupdated", { type: "categoryList", categorylist: categoryList }, context);
//                        
//                        
//                    }, function (error) {

//                        // error
//                        //alert("error getting categories - datafactory");

//                        if (callback) {
//                            callback(null, error);
//                        }

//                        raiseEvent("fetchcanceled", { type: "categoryList" }, context);

//                    });

//                }
//            }
//                        
//        };



//        $dataFactory.store = {
//            
//            getAllStores: function (cityId, categoryId, parentId, callback, context) {

//                createContext(context);

//                var cacheKey = "storeList_" + cityId + "_" + categoryId + "_" + parentId;
//                var storeList = cache.getItem(cacheKey);

//                if (storeList) {
//                    if (callback) {
//                        callback(storeList);
//                    }
//                }
//                else {

//                    raiseEvent("fetchrequested", { type: "storeList", cityId: cityId, categoryId: categoryId, parentId:parentId }, context);

//                    shoppingMall.request("/Framework/Services/Store.asmx/MobileGetStoreList", {cityId:cityId, categoryId:categoryId, parentId:parentId}, function (success) {

//                        var storelist = success;
//                        cache.setItem(cacheKey, storelist);

//                        if (callback) {
//                            callback(storelist);
//                        }

//                        raiseEvent("dataupdated", { type: "storeList", storelist: storeList }, context);
//                        
//                        
//                    }, function (error) {

//                        // error
//                        alert("error getting storeList - datafactory");

//                        if (callback) {
//                            callback(null, error);
//                        }

//                        raiseEvent("fetchcanceled", { type: "storeList" }, context);

//                    });

//                }
//            }
//                        
//        };
        


        // Uses jQuery to raise an event with the specified
        // parameters.
        var raiseEvent = function (name, data, context) {
            $jQueryDataFactory.trigger(name, [data, context]);
        };
    }

    // Makes a script service request with the specified 
    // parameters.
    $saltsjobaden.request = function (url, data, success, error) {
        jQuery.ajax({
            type: 'POST',
            url: url,
            contentType: "application/json; charset=utf-8",
            data: data ? $.toJSON(data) : "{}",
            dataType: "json",
            success: function (d) {
                if (success) {
                    success(d.d);
                }
            },
            error: function (e) {
                if (error) {
                    error(e);
                }
            }
        });
    };

    // Session manager object when working with
    // sessionStorage.
    // OBSOLETE: Use the cache object instead.
    $saltsjobaden.session = function (prefix) {
        this.prefix = prefix + ":";
    };
    $saltsjobaden.session.prototype = {
        add: function (key, val) {
            if (window.sessionStorage) {
                key = this.prefix + key;
                window.sessionStorage[key] = val;
            }
        },
        get: function (key) {
            if (window.sessionStorage) {
                key = this.prefix + key;
                return window.sessionStorage[key];
            }
            return null;
        },
        remove: function (key) {
            if (window.sessionStorage) {
                key = this.prefix + key;
                delete window.sessionStorage[key];
            }
        }
    };
    $saltsjobaden.sessionManager = {
        object: new $saltsjobaden.session("object"),
        //slideGroup: new shoppingMall.session("slideGroup")
    };

    // Authorization manager object.
    $saltsjobaden.authManager = {
        isSignedIn: function () {
            return true;
        }
    };

    // 
    (function (m) {
        // check login status on interval
    })($saltsjobaden.authManager);
};
saltsjobaden._construct();
