/*General utility functions*/
/*For checking if a property exists*/
function checkPropertySetVal(object, property){
    if (object.hasOwnProperty(property)) {
        return object[property];
    }
    else {
        return null;
    }
}

/*For comparing two objects in array by giving the propertyName*/
function compareByProperty(property, order, isDate){
    if (isDate) {
        return function(obj1, obj2){
            var date1 = (new Date(obj1[property]));
            var date2 = (new Date(obj2[property]));
            var retval;
            if (date1.getTime() > date2.getTime()) {
                retval = 1;
            }
            else 
                if (date1.getTime() == date2.getTime()) {
                    retval = 0;
                }
                else {
                    retval = -1;
                }
            if (order === "desc") {
                retval = -retval;
            }
            return retval;
        }
    }
    else {
        return function(obj1, obj2){
            var retval;
            if (obj1[field] > obj2[field]) 
                retval = 1;
            else 
                if (obj1[field] < obj2[field]) 
                    retval = -1;
                else 
                    retval = 0;
            if (order === "desc") 
                retval = -retval;
            return retval;
        }
    }
    
}

/*End of general utility functions*/

function tourObj(title, venueName, venueCountry, venueState, venueCity, venueLocation, buyLink, appearingWith, showDate, bandName){
    this.title = title;
    this.venueName = venueName;
    this.venueCountry = venueCountry;
    this.venueState = venueState;
    this.venueCity = venueCity;
    this.venueLocation = venueLocation;
    this.buyLink = buyLink;
    this.appearingWith = appearingWith;
    this.showDate = showDate;
    this.bandName = bandName;
}

function createTourStructure(data, containerId){
    var feedItemIsEmpty = false;
    var tourObjArray;
    if (null != data && (data.hasOwnProperty("query")) && data.query.hasOwnProperty('results') && data.query.results.hasOwnProperty('results')) {
        var items = data.query.results.results;
        var title = null;
        var venueName = null;
        var venueCountry = null;
        var venueCity = null;
        var venueLocation = null;
        var venueState = null;
        var buyLink = null;
        var appearingWith = null;
        var individualItem = null;
        var tourDatesUnit;
        var innerindividualItem = null;
        
        tourObjArray = new Array();
        
        if (($('body').attr("id") == "tour_dates") || ($('body').attr("id") == "home")) {
        
            for (var count = 0; count < items.length; count++) {
                if (null != items[count] && null != (items[count]).item) {
                    if (items[count].hasOwnProperty("item")) {
                        individualItem = items[count].item;
                        for (var innercount = 0; innercount < individualItem.length; innercount++) {
                            innerindividualItem = individualItem[innercount];
                            venueName = innerindividualItem["venueName"];
                            title = checkPropertySetVal(innerindividualItem, "title");
                            venueName = checkPropertySetVal(innerindividualItem, "venueName");
                            //writeToConsole("after"+ venueName);
                            venueCountry = checkPropertySetVal(innerindividualItem, "venueCountry");
                            venueCity = checkPropertySetVal(innerindividualItem, "venueCity");
                            venueLocation = checkPropertySetVal(innerindividualItem, "venueLocation");
                            venueState = checkPropertySetVal(innerindividualItem, "venueState");
                            buyLink = checkPropertySetVal(innerindividualItem, "buylink");
                            appearingWith = checkPropertySetVal(innerindividualItem, "appearingWith");
                            showDate = checkPropertySetVal(innerindividualItem, "showDate");
                            bandName = checkPropertySetVal(innerindividualItem, "bandName");
                            writeToConsole("bandName" + bandName);
                            tourObjArray.push(new tourObj(title, venueName, venueCountry, venueState, venueCity, venueLocation, buyLink, appearingWith, showDate, bandName));
                        }
                    }
                }
                
                if (null != items[count] && null != (items[count]).item) {
                    if (items[count].hasOwnProperty("item")) {
                        individualItem = items[count].item;
                        if (individualItem.constructor.toString().indexOf('Array') == -1) {
                            innerindividualItem = individualItem;
                            venueName = innerindividualItem["venueName"];
                            title = checkPropertySetVal(innerindividualItem, "title");
                            venueName = checkPropertySetVal(innerindividualItem, "venueName");
                            venueCountry = checkPropertySetVal(innerindividualItem, "venueCountry");
                            venueCity = checkPropertySetVal(innerindividualItem, "venueCity");
                            venueLocation = checkPropertySetVal(innerindividualItem, "venueLocation");
                            venueState = checkPropertySetVal(innerindividualItem, "venueState");
                            buyLink = checkPropertySetVal(innerindividualItem, "buylink");
                            appearingWith = checkPropertySetVal(innerindividualItem, "appearingWith");
                            showDate = checkPropertySetVal(innerindividualItem, "showDate");
                            bandName = checkPropertySetVal(innerindividualItem, "bandName");
                            writeToConsole("bandName" + bandName);
                            tourObjArray.push(new tourObj(title, venueName, venueCountry, venueState, venueCity, venueLocation, buyLink, appearingWith, showDate, bandName));
                        }
                    }
                }
                
            }
        }
        
        else {
            for (var count = 0; count < items.length; count++) {
                if (null != items[count] && null != (items[count]).item) {
                    if (items[count].hasOwnProperty("item")) {
                        individualItem = items[count].item;
                        title = checkPropertySetVal(individualItem, "title");
                        venueName = checkPropertySetVal(individualItem, "venueName");
                        venueCountry = checkPropertySetVal(individualItem, "venueCountry");
                        venueCity = checkPropertySetVal(individualItem, "venueCity");
                        venueLocation = checkPropertySetVal(individualItem, "venueLocation");
                        venueState = checkPropertySetVal(individualItem, "venueState");
                        buyLink = checkPropertySetVal(individualItem, "buylink");
                        appearingWith = checkPropertySetVal(individualItem, "appearingWith");
                        showDate = checkPropertySetVal(individualItem, "showDate");
                        bandName = checkPropertySetVal(individualItem, "bandName");
                        tourObjArray.push(new tourObj(title, venueName, venueCountry, venueState, venueCity, venueLocation, buyLink, appearingWith, showDate, bandName));
                    }
                }
            }
            
        }
    }
    else {
        feedItemIsEmpty = true;
    }
    var tourDatesWrapper = document.createElement('div');
    $(tourDatesWrapper).attr("class", "tourDatesWrapper");
    if (feedItemIsEmpty) {
        $(tourDatesWrapper).append('<span class="tdErrorText">' + tdNoShowsText + '</span>');
    }
    else {
        for (var i = 0; i < tourObjArray.length; i++) {
            var indItem = tourObjArray[i];
            //writeToConsole("Reading ind Iemt" + indItem);
        }
        tourDatesWrapper = createTourHTML(tourObjArray, tourDatesWrapper);
    }
    
    $(containerId).append(tourDatesWrapper);
    
    $(containerId).append('<div id="tdViewAll"><a href="/shows/">View More</a></div>');
    $(containerId).append('<div class="clear"></div>');
    
    if ($('body').attr("id") == "tour_dates") {
        var indCount;
        var textToModify;
        $.each(artistArray, function(){
            indCount = $(containerId).find("." + this).length;
			
			var tempClassName = $(this).attr('class');
			if((this.toString() == 'panicatthedisco') || (this.toString() == 'panic!atthedisco')) {
				indCount = $(containerId).find(".panicatthedisco").length;
			}
			
			
			
            textToModify = $("#html-3827342.html .module .content .body ul#category-list" + " ." + this + " a").text();
            textToModify = textToModify + "(" + indCount + ")";
            $("#html-3827342.html .module .content .body ul#category-list" + " ." + this + " a").text(textToModify);
        });
        
        var allCount = $(containerId).find(".tourDatesUnit").length;
        var allText = $("#html-3827342.html .module .content .body ul#category-list" + " .all" + " a").text();
        allText = allText + "(" + allCount + ")";
        $("#html-3827342.html .module .content .body ul#category-list" + " .all" + " a").text(allText);
        
        $(".html .body .description #tdViewAll").remove();
    }
}

function createTourHTML(tourObjArray, tourDatesWrapper){
    $.each(tourObjArray, function(){
        currentTourItem = this;
    });
    tourObjArray = tourObjArray.sort(compareByProperty("showDate", "asc", true));
    var bodyId = $("body").attr("id");
    if (bodyId == "home") {
        tourObjArray = tourObjArray.splice(0, 10);
    }
    var tourDatesUnit = null;
    var currentTourItem = null;
    var tourDatesWrapper = document.createElement('div');
    $(tourDatesWrapper).attr("class", "tourDatesWrapper");
    $.each(tourObjArray, function(){
        currentTourItem = this;
        tourDatesUnit = createArtistTourDateUnit(currentTourItem);
        if (null != tourDatesUnit) {
            $(tourDatesWrapper).append(tourDatesUnit);
        }
        
    });
    //TODO:This code should be moved to some other place
    
    
    return tourDatesWrapper;
}

function addLeadingZero(valToCheck){
    if (null == valToCheck) {
        return valToCheck;
    }
    if (valToCheck.length == 1) {
        valToCheck = "0" + valToCheck;
    }
    return valToCheck;
}

function getDateFromTitle(title){
    var dateArr = title.split('/');
    var yearVar = dateArr[2].substr(2, 2);
    var dayVar = addLeadingZero(dateArr[1]);
    var monthVar = addLeadingZero(dateArr[0]);
    return monthVar + '/' + dayVar + '/' + yearVar;
}

function createArtistTourDateUnit(currentTourItem){
    var title = currentTourItem.title;
    var venueName = currentTourItem.venueName;
    var venueCountry = currentTourItem.venueCountry;
    var venueState = currentTourItem.venueState;
    var venueCity = currentTourItem.venueCity;
    var venueLocation = currentTourItem.venueLocation;
    var buyLink = currentTourItem.buyLink;
    var appearingWith = currentTourItem.appearingWith;
    var showDate = currentTourItem.showDate;
    var bandName = currentTourItem.bandName;
    
    var tourDatesUnit = document.createElement('div');
    $(tourDatesUnit).attr("class", "tourDatesUnit");
    
    //Checking for "Sorry" text
    if ((null == title) || title.indexOf("Sorry", 0) != -1) {
        return null;
    }
    
    //Check if bandName is present. If so,display it
    if (null != bandName) {
        var tdBandUnit = document.createElement('div');
        $(tdBandUnit).attr("class", "tdBandField");
        $(tdBandUnit).append(bandName);
    }
    
    //Check if showDate is present.If not, use from title
    showDate = getDateFromTitle(showDate);
    if ($('body').attr("id") == "tour_dates") {
        var tourFullData = document.createElement('div');
        $(tourFullData).attr("class", "tourFullData");
        
        var venueString = "";
        
        var tdDateUnit = document.createElement('div');
        if (null != bandName) {
            bandName = bandName.replace(/ /g, "").toLowerCase();
			bandName = bandName.replace(/!/g, "").toLowerCase();
            $(tourDatesUnit).addClass(bandName);
        }
        $(tdDateUnit).append(showDate);
        $(tdDateUnit).addClass('tdDateField');
        bandName = " " + bandName;
        var venueString1 = " - ";
        if (null != venueName && venueName.trim() != "") {
            venueString = " at " + venueName;
        }
        if (null != venueLocation && venueLocation.trim() != "") {
            venueString = venueString + "," + venueLocation;
        }
        else {
            if (null != venueCity && venueCity.trim() != "") {
                venueString1 = venueString1 + " " + venueCity;
            }
            else {
                venueString1 = " ";
            }
            if (null != venueState && venueState.trim() != "") {
                venueString1 = venueString1 + ", " + venueState;
            }
            if (null != venueCountry && venueCountry.trim() != "") {
                venueString1 = venueString1 + ", " + venueCountry;
            }
        }
        if (buyLink != "" && null != buyLink) {
            tdBuyLinksField = document.createElement('div');
            $(tdBuyLinksField).attr("class", "tdBuyLinksField");
            $(tdBuyLinksField).append('<div class="tdBuyLinks"><a target="_blank" href="' + buyLink + '">Purchase Tickets</a></div>');
        }
        
        var tourVenueDetails = document.createElement('div');
        $(tourVenueDetails).attr("class", "tourVenueDetails");
        $(tourVenueDetails).append(venueString1);
        $(tourVenueDetails).append(venueString);
        
        $(tourFullData).append(tdDateUnit);
        $(tourFullData).append(tdBandUnit);
        $(tourFullData).append(tourVenueDetails);
        if (buyLink != "" && null != buyLink) {
            $(tourFullData).append(tdBuyLinksField);
        }
        $(tourDatesUnit).append(tourFullData);
    }
    
    else {
        //Prepare date field
        var tdDateUnit = document.createElement('div');
        $(tdDateUnit).attr("class", "tdDateField");
        //$(tdDateUnit).append(showDate);
        
        //create tourVenueBuyWrapper	
        var tourVenueBuyWrapper = document.createElement('div');
        $(tourVenueBuyWrapper).attr("class", "tourVenueBuyWrapper");
        
        //create tour venue unit
        var tdVenueField = document.createElement('div');
        $(tdVenueField).attr("class", "tdVenueField");
        var tdCityField = document.createElement('div');
        $(tdCityField).attr("class", "tdCityField");
        var venueString = "";
        var venueString1 = showDate + "";
        
        if (null != venueName && venueName.trim() != "") {
            venueString = " at " + venueName;
        }
        if (null != venueLocation && venueLocation.trim() != "") {
            venueString = venueString + "," + venueLocation;
        }
        else {
            if (null != venueCity && venueCity.trim() != "") {
                venueString1 = venueString1 + " - " + venueCity;
            }
            else {
                venueString1 = " in ";
            }
            if (null != venueState && venueState.trim() != "") {
                venueString1 = venueString1 + ", " + venueState;
            }
            if (null != venueCountry && venueCountry.trim() != "") {
                if (venueCountry != 'United States') {
                    venueString1 = venueString1 + ", " + venueCountry;
                }
                
            }
        }
        
        $(tdVenueField).append(venueString);
        $(tdCityField).append(venueString1);
        //$(tourVenueBuyWrapper).append(tdDateUnit);
        $(tourVenueBuyWrapper).append(tdCityField);
        $(tourVenueBuyWrapper).append(tdVenueField);
        
        //For left part
        tdleftContainer = document.createElement('div');
        $(tdleftContainer).attr("class", "tdleftContainer");
        $(tdleftContainer).append(tdBandUnit);
        $(tdleftContainer).append(tourVenueBuyWrapper);
        
        //For right part
        tdrightContainer = document.createElement('div');
        $(tdrightContainer).attr("class", "tdrightContainer");
        //create purchase tickets unit
        if (buyLink != "" && null != buyLink) {
            tdBuyLinksField = document.createElement('div');
            $(tdBuyLinksField).attr("class", "tdBuyLinksField");
            $(tdBuyLinksField).append('<div class="tdBuyLinks"><a target="_blank" href="' + buyLink + '">Purchase Tickets</a></div>');
            $(tdrightContainer).append(tdBuyLinksField);
        }
        $(tourDatesUnit).append(tdleftContainer);
        $(tourDatesUnit).append(tdrightContainer);
        $(tourDatesUnit).append('<div class="clear"></div>');
    }
    return tourDatesUnit;
}

function showSelectedTour(seletedBand){
    $('.tourDatesUnit').hide();
    $('.tourDatesWrapper').addClass('loading');
    $('.tourEmptyText').hide();
    if (seletedBand != "") {
        $('#html-3965256.html .module .content .head h3').html("Shows - " + getBandName(seletedBand));
        $('.tourDatesUnit').hide();
        if ($('.' + seletedBand).size() == 0) {
            if ($('.tourEmptyText').size() == 0) {
                $('.tourDatesWrapper').append('<div class="tourDatesUnit tourEmptyText">' + tdNoShowsText + '</div>');
            }
            $('.tourEmptyText').show();
        }
        else {
            $('.' + seletedBand).show();
        }
    }
    else {
        $('.tourDatesUnit').hide();
        $('#html-3965256.html .module .content .head h3').html("Shows");
        $('.tourDatesUnit').show();
    }
    $('.tourDatesWrapper').removeClass('loading');
}

