/**
 * Registers namespaces to put classes and variables in.
 */

var Namespace =
{
    Register : function(_Name)
    {
        var chk = false;
        var cob = "";
        var spc = _Name.split(".");
        for(var i = 0; i<spc.length; i++)
        {
            if(cob!=""){cob+=".";}
            cob+=spc[i];
            chk = this.Exists(cob);
            if(!chk){this.Create(cob);}
        }
        if(chk){ throw "Namespace: " + _Name + " is already defined."; }
    },

    Create : function(_Src)
    {
        eval("window." + _Src + " = new Object();");
    },

    Exists : function(_Src)
    {
        eval("var NE = false; try{if(" + _Src + "){NE = true;}else{NE = false;}}catch(err){NE=false;}");
        return NE;
    }
}



Namespace.Register('GS.Components');
Namespace.Register('GS.Apps');

GS.Apps.api_domain = 'http://api.greenstonehomes.com/api';
GS.Apps.image_domain = 'http://assets.greenstonehomes.com';
GS.Apps.sized_image_path = function(img,size) {
	return GS.Apps.image_domain + '/images/sized/' + size + '/' + img;
}

GS.Components.HorizontalSlider = (
	function(content){
        var $ = jQuery;
        var container = $('<div/>');
        var outerPanel = $('<div/>',{'class':'content-panel viewport'});
        var scrollable = $('<div/>',{'class':'scrollable overview'});
        var scroller = $('<div/>',{'class':'scrollbar'});
		var loading = $("<div/>",{'class':'ajax-loading'}).text('Loading...');

		scroller.append('<div class="track"><div class="thumb"><div class="end"></div></div></div>');

		scrollable.append(loading);
		loading.hide();

		var resizeSlider = function() {
          scroller.slider('option','max',getScrollerSize());
          scroller.slider('option','value',0);
        }
        var getScrollerSize = function() {
          return scrollable.innerWidth() - outerPanel.parent().outerWidth();
        }
        var build = function(ctx){
            container = ctx;
            scrollable.appendTo(outerPanel);
            outerPanel.appendTo(container);
            scroller.appendTo(container);
//            scroller.slider({
//                min: 0,
//                max: getScrollerSize(),
//                slide: function (ev,ui){
//                  scrollable.css({'left':'-' + ui.value + 'px'})
//                }
//            });
			
            if (content != undefined) {
                setContent(content);
            }
			container.tinyscrollbar({axis: 'x'});
        }
        var setContent = function(html){
            scrollable.html(html);
        }
        return {
            render: build,
            setContent: setContent,
            inner: scrollable,
			reset: function(){
//				scrollable.attr('style','left: 0;');
//				resizeSlider();
				container.update();
			},
            insert: function(jqo){
                scrollable.append(jqo);
            },
			startLoading: function(){
				loading.show();
			},
			stopLoading: function(){
				loading.hide();
			}
        }
    }
);

GS.Apps.AllPlansSlider = (
	function(settings) {
        var $ = jQuery;
        var ctx;
        var callOnClick = function(){};

        var plan_list = $('<div/>',{'class':'plan-list'});
		var tabs = $('<ul/>',{'class':'tabs'});
		tabs.append('<li class="active">All Plans</li>');
        

        if (settings.container != undefined) {
            ctx = $(settings.container);
        }

        if (settings.noauto == undefined) {
            $(document).ready(function(){build()});
        }

        if (settings.onPlanClick && typeof settings.onPlanClick == 'function') {
            callOnClick = settings.onPlanClick;
        }

        var setupClick = function (img,pln) {
            img.click(function(){
                callOnClick.call(pln,pln.id);
            });
        }

        var build = function(){
            if (ctx){
                ctx.append(tabs);
                ctx.append(plan_list);
                var widget = new GS.Components.HorizontalSlider();
				widget.render(plan_list);
				widget.startLoading();
                $.getJSON(GS.Apps.api_domain + "/plans.json?callback=?",function(data){
                  ul = $('<ul/>');
                  $.each(data,function(){
                    var li = $('<li/>',{title: this.plan.name}).appendTo(ul);
                    var img = $('<img/>').attr({alt: this.plan.name, src: (this.plan.image ? GS.Apps.sized_image_path(this.plan.image,'113x91') : '')});
                    li.append(img);
                    li.append('<div>' + this.plan.name + '</div>');
                    setupClick(li, this.plan);
                  });
				  widget.stopLoading();
                  widget.insert(ul);
				  widget.reset();
                });

            }
        }
        return {
            setContainer: function(selector){ctx = $(selector)},
            render: build,
            onPlanClick: function(callback){
                if (typeof callback == 'function') {
                    callOnClick = callback;
                }
            }
        }
    }
);


GS.Apps.PlanSeriesSlider = (
	function(settings) {
        var $ = jQuery;
        var plan_list = $('<div/>',{'class':'plan-list'});
		var tabs = $('<ul/>',{'class':'tabs'});
        var ctx;
        var callOnClick = function(){};
        var site_key = 'Site';

        if (settings.container != undefined) {
            ctx = $(settings.container);
        }

        if (settings.noauto == undefined) {
            $(document).ready(function(){build()});
        }

        if (settings.onPlanClick && typeof settings.onPlanClick == 'function') {
            callOnClick = settings.onPlanClick;
        }

        if (settings.site_key) {
            site_key = settings.site_key;
        }

        var setupClick = function(obj,pln) {
            obj.click(function(){
                callOnClick.call(pln,pln.id);
            });
        }

        var build = function() {
            if (ctx){
                ctx.append(tabs);
                ctx.append(plan_list);
                var site = jQuery.url.param(site_key);
                if(site) {
					var widget = new GS.Components.HorizontalSlider();
					widget.render(plan_list);
					widget.startLoading();
					$.getJSON(GS.Apps.api_domain + "/projects/" + site + "/series_and_plans.json?callback=?",function(data){
						series_lists = {};
						widget.stopLoading();
						$.each(data,function(k,v){
							tabs.append('<li><a href="#series-' + this.series.id + '">' + this.series.name + '</a></li>');
							var ul = $('<ul/>',{id: "series-" + this.series.id, 'class': 'series'});
							$.each(this.series.plans, function(){
							  var li = $('<li/>').attr('title', this.plan.name).appendTo(ul);
							  var img = $('<img/>').attr({ alt: this.plan.name, src: (this.plan.image ? GS.Apps.sized_image_path(this.plan.image,'113x91') : '')});
							  li.append(img);
							  li.append('<div>' + this.plan.name + '</div>');
							  setupClick(li, this.plan);
							});
							series_lists[this.series.name] = ul;
							widget.insert(ul);
							ul.hide();
						});

                     tabs.find('a').click(function(){
                       var series = $(this).text();
                       $.each(series_lists, function(k,v){
						   this.hide();
					   });
					   series_lists[series].show();
					   widget.reset();
                       tabs.find('li').removeClass('active');
                       $(this).parent().addClass('active');
                       return false;
                     });
                     tabs.find('li:first a').click();
					});
                }
            }
        }
        return {
            setContainer: function(selector){ctx = $(selector)},
            render: build,
            setSiteKey: function(key){
              site_key = key;
            },
            onPlanClick: function(callback){
                if (typeof callback == 'function') {
                    callOnClick = callback;
                }
            }
        }
    }
);


GS.Apps.InventoryByCitySlider = (
	function(settings){
		var $ = jQuery;
        var item_list = $('<div/>',{'class':'items-list'});
		var tabs = $('<ul/>',{'class':'tabs'});
        var ctx;
        var callOnClick = function(){};

        if (settings.container != undefined) {
            ctx = $(settings.container);
        }

        if (settings.noauto == undefined) {
            $(document).ready(function(){build()});
        }

        if (settings.onPlanClick && typeof settings.onPlanClick == 'function') {
            callOnClick = settings.onPlanClick;
        }

        if (settings.site_key) {
            site_key = settings.site_key;
        }
		var groupByCity = function(data) {
			var grouped = {};
			$.each(data,function(){
				/**
				 * Group by city name
				 */
				grouped[this.job.project.city] = grouped[this.job.project.city] || []
				grouped[this.job.project.city].push(this);
			});
			return grouped
		}
		var makeUl = function(data) {
			var ul = $('<ul/>',{'class':'city'});
			$.each(data,function(){
				var li = $('<li/>').appendTo(ul);
				var img = $('<img/>').attr({alt: this.job.address, src: (this.job.plan.image ? GS.Apps.sized_image_path(this.job.plan.image,'113x91') : '')});
				li.append(img);
				li.append('<div>' + this.job.address + '</div>')
				setupClick(li,this.job);
			});
			return ul;
		}

        var setupClick = function(obj,itm) {
            obj.click(function(){
                callOnClick.call(itm,itm.id);
            });
        }

        var build = function() {
            if (ctx){
                ctx.append(tabs);
                ctx.append(item_list);
				var widget = new GS.Components.HorizontalSlider();
				widget.render(item_list);
				widget.startLoading();
				$.getJSON(GS.Apps.api_domain + "/inventory.json?callback=?",function(data){
				 var items_lists = {};
				 widget.stopLoading();
				 var grouped = groupByCity(data);
				 $.each(grouped,function(k,v) {
					tabs.append('<li><a href="#">' + k + '</a></li>');
					var ul = makeUl(v);
					items_lists[k] = ul;
					widget.insert(ul);
					ul.hide();
				 });

				 tabs.find('a').click(function(){
				   $.each(items_lists, function(k,v){
					   v.hide();
				   });
				   var city = $(this).text();
				   items_lists[city].show();
				   widget.reset();
				   tabs.find('li').removeClass('active');
				   $(this).parent().addClass('active');

				   return false;
				 });
				 tabs.find('li:first a').click();
				});
            }
        }
        return {
            setContainer: function(selector){ctx = $(selector)},
            render: build,
            onItemClick: function(callback){
                if (typeof callback == 'function') {
                    callOnClick = callback;
                }
            }
        }
	}
);


/***
   * Functions to parse Marketing Description as HTML lists
   *
   * Formatting:
        '**' - begins UL and makes rest of line bold_tag
        '*' - list item - will automatically close at end of line
        '<br/>' - newline
        '**' - close UL
   *
***/
GS.Apps.StringListFormatter = (
    function(str) {
    		var returnstr = "";
    		var inlist = false;

    		str = GS.Apps.StringReplace(str,'\r','');
    		str = GS.Apps.StringReplace(str,"**","[ul]");
    		str = GS.Apps.StringReplace(str,"*", "[li]");

    		// Iterate through rest of string lines - add br or /li
    		str_arr = str.split('\n');
    		var start_ul = "<ul class=\"marketingdescription\">";
    		var end_ul = "</ul>";
    		var newline = "";
    		var start_li = "<li>";
    		var end_li = "</li>";
    		var start_b = "<b>";
    		var end_b = "</b>";

    		for (i=0;i<str_arr.length;i++)
    		{
    		  if (str_arr[i].indexOf("[ul]") != -1) //is UL List: Make
    		  {
    		    if (!inlist) { //make text a heading and start list
    		        returnstr += start_b;
    		        str_arr[i] = GS.Apps.StringReplace(str_arr[i], "[ul]", ""); // Remove UL holder
    		        returnstr += str_arr[i];
    		        returnstr += end_b + newline;
    		        returnstr += start_ul;
    		        inlist = true;
    		    }
    		    else { //close list
    		        str_arr[i] = GS.Apps.StringReplace(str_arr[i], "[ul]", end_ul);
    		        returnstr += str_arr[i];
    		        inlist = false;
    		    } //end else - in list
    		  } //end UL tag
    		  else if (str_arr[i].indexOf("[li]") != -1) //li tag holder
    		  {
    		    str_arr[i] = GS.Apps.StringReplace(str_arr[i], "[li]", start_li); //Create tag
    		    returnstr += str_arr[i];
    		    returnstr += end_li;
    		  }
    		  else
    		  {
    		    returnstr += str_arr[i];
    		    returnstr += newline; //add BR tag to all non-special lines
    		  } //end else - done searching for tag
    		} //end for - walk through each line
    		return returnstr;
    }
);
GS.Apps.StringReplace = (
    function(str,replace,replace_with) {
        var strReplaceAll = str;
        if (strReplaceAll != undefined && replace != undefined) {
    		  var intIndexOfMatch = strReplaceAll.indexOf(replace);
    		  while (intIndexOfMatch != -1) {
    		    strReplaceAll = strReplaceAll.replace(replace, replace_with);
    		    intIndexOfMatch = strReplaceAll.indexOf(replace);
          } //end while
        } // end if not undefined
        else { strReplaceAll = ''; } // Return clean on failure
    	return strReplaceAll;
    }
);


GS.Apps.AddCommasToNumber = (
    function(number) {
        var x;
        x = number.split('.');

        x1 = x[0];
        x2 = x.length > 1 ? '.' + x[1] : '';

        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
        }
        return x1 + x2;
    }
);

/** GS Utils **/
Namespace.Register('GS.Utils');
GS.Utils.ModalWindow = (
 	function(content) {
			var $ = jQuery;
			$('body').append("<div class='gs_modal_background'/>");
			var bg = '.gs_modal_background';
			var fg = '.gs_modal_window';
			$(bg).hide().fadeIn(300);
			$(bg).append("<div class='gs_modal_window' />");
			$(fg).html('<div class="gs_modal_content">' + content + '</div>');
			$(bg).live('click', function() {
				$(this).fadeOut(300);
				$(fg).remove();
				$(bg).remove();
			});
		}
);

