using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;

namespace MvcSlideShow.Models
{
    public class YsaSSModel
    {
        /// <summary>
        /// div id
        /// </summary>
        private string _wrapperID = YsaSSHelper.GetNextId();
        public string WrapperID
        {
            get
            {
                return "ysaSlideShowDiv" + _wrapperID;
            }
        }

        /// <summary>
        /// slideshow container
        /// </summary>
        public string SSContainer { get; set; }

        /// <summary>
        /// slideshow script
        /// </summary>
        public string SSScript { get; set; }

        /// <summary>
        /// xml path
        /// </summary>
        public string XPath { get; set; }

        /// <summary>
        /// xml source
        /// </summary>
        public string XMLSource { get; set; }

        /// <summary>
        /// div width
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// div height
        /// </summary>
        public int Height { get; set; }

        /// <summary>
        /// autoplay true|false
        /// </summary>
        public bool AutoPlay { get; set; }

        /// <summary>
        /// ShowNavigation true|false
        /// </summary>
        public bool ShowNavigation { get; set; }

        /// <summary>
        /// delay between slide in miliseconds
        /// </summary>
        public int Delay_btw_slide { get; set; }

        /// <summary>
        /// transition duration (milliseconds)
        /// </summary>
        public int FadeDuration { get; set; }

        /// <summary>
        /// cycles befote stopping
        /// </summary>
        public int Cycles_before_stopping { get; set; }

        /// <summary>
        /// previous button
        /// </summary>
        public string BtnPreviousImagePath { get; set; }

        /// <summary>
        /// next button
        /// </summary>
        public string BtnNextImagePath { get; set; }

        /// <summary>
        /// play button
        /// </summary>
        public string BtnPlayImagePath { get; set; }

        /// <summary>
        /// pause button
        /// </summary>
        public string BtnPauseImagePath { get; set; }

        //constructor
        public YsaSSModel(string xpath = "site", string xmlSource = "/YSASS/sites.xml", 
            int width = 728, int height = 95,
            bool autoPlay = true, bool showNavigation = true, 
            int delay_btw_slide = 10000, int fadeDuration = 2000,
            int cycles_before_stopping = 99,
            string btnPreviousImagePath = "/Content/ysaSS-images/previous.gif",
            string btnNextImagePath = "/Content/ysaSS-images/next.gif",
            string btnPlayImagePath = "/Content/ysaSS-images/play.gif",
            string btnPauseImagePath = "/Content/ysaSS-images/pause.gif")
        {
            XPath = xpath;
            XMLSource = xmlSource;
            Width = width;
            Height = height;
            AutoPlay = autoPlay;
            ShowNavigation = showNavigation;
            Delay_btw_slide = delay_btw_slide;
            FadeDuration = fadeDuration;
            Cycles_before_stopping = cycles_before_stopping;
            BtnPreviousImagePath = btnPreviousImagePath;
            BtnNextImagePath = btnNextImagePath;
            BtnPlayImagePath = btnPlayImagePath;
            BtnPauseImagePath = btnPauseImagePath;
            SSContainer = YsaSSHelper.CreateDiv(WrapperID);
            SSScript = YsaSSHelper.CreateScript(WrapperID, xmlSource, xpath, width, height, btnPreviousImagePath,
                btnPlayImagePath, btnNextImagePath, btnPauseImagePath, showNavigation, autoPlay,
                delay_btw_slide, cycles_before_stopping, fadeDuration);
        }
    }

    //helper class
    public static class YsaSSHelper
    {
        public static int ID = 0;


        //id
        public static string GetNextId()
        {
            ID++;
            return ID.ToString();
        }

        //create html div
        public static string CreateDiv(string wrapperID)
        {
            StringBuilder sbDiv = new StringBuilder(string.Empty);
            sbDiv.Append("<div id='" + wrapperID + "' style='");
            sbDiv.Append(" background: none repeat scroll 0% 0% white;");
            sbDiv.Append(" overflow: hidden;");
            sbDiv.Append(" position: relative;");
            sbDiv.Append(" visibility: visible;");
            sbDiv.Append(" -moz-background-clip: border;");
            sbDiv.Append(" -moz-background-origin: padding;");
            sbDiv.Append(" -moz-background-inline-policy: continuous;");
            sbDiv.Append("'></div>");

            return sbDiv.ToString();
        }

        //create script
        public static string CreateScript(string wrapperID, string xmlSource, string xpath, int width,
            int height, string btnPreviousImagePath, string btnPlayImagePath, string btnNextImagePath,
            string btnPauseImagePath, bool showNavigation, bool autoPlay, int delay_btw_slide,
            int cycles_before_stopping, int fadeDuration)
        {
            StringBuilder ssScript = new StringBuilder(string.Empty);
            string arrName = "ysaMyArray" + wrapperID;

            ssScript.Append("<script type='text/javascript'>");
            ssScript.Append("var " + arrName + "= [];");
            ssScript.Append("$(document).ready(function() {");
            ssScript.Append(" $.ajax({");
            ssScript.Append("type: \"GET\",");
            ssScript.Append("url: '" + xmlSource + "',");
            ssScript.Append("cache: true,");
            ssScript.Append("dataType: \"xml\",");
            ssScript.Append("success: function(xml) {");
            ssScript.Append("var count = 0;");
            ssScript.Append("$(xml).find('" + xpath + "').each(function() {");

            ssScript.Append(" var url = $(this).find('url').text();");
            ssScript.Append("var target = $(this).find('target').text();");
            ssScript.Append("var imageURL = $(this).find('imageURL').text();");
            ssScript.Append("var alt = $(this).find('alt').text();");

            ssScript.Append(arrName + "[parseInt(count)] = new Array(imageURL, url, target, alt); ");
            ssScript.Append("count++;");
            ssScript.Append("});");

            ssScript.Append(" var mygallery" + wrapperID + " = new simpleGallery({");
            ssScript.Append(" wrapperid: '" + wrapperID + "',");
            ssScript.Append("dimensions: [" + width.ToString() + "," + height.ToString() + "],"); //width/height of gallery in pixels. Should reflect dimensions of the images exactly
            ssScript.Append("imagearray: " + arrName + ","); //array of images
            ssScript.Append("navimages: ['" + btnPreviousImagePath + "', '" +
                btnPlayImagePath + "', '" +
                btnNextImagePath + "', '" +
                btnPauseImagePath + "'],");
            ssScript.Append("showpanel: '" + showNavigation.ToString().ToLower() + "',");
            ssScript.Append(" autoplay: [" + autoPlay.ToString().ToLower() + "," + delay_btw_slide.ToString() + "," 
                + cycles_before_stopping.ToString() + "],"); //[auto_play_boolean, delay_btw_slide_millisec, cycles_before_stopping_int]
            ssScript.Append(" persist: true,");
            ssScript.Append(" fadeduration:" + fadeDuration.ToString() + ","); //transition duration (milliseconds)
            ssScript.Append(" oninit: function() {"); //event that fires when gallery has initialized/ ready to run
            ssScript.Append("  },");
            ssScript.Append("  onslide: function(curslide, i) {"); //event that fires after each slide is shown
            //curslide: returns DOM reference to current slide's DIV (ie: try alert(curslide.innerHTML)
            //i: integer reflecting current image within collection being shown (0=1st image, 1=2nd etc)
            ssScript.Append("   }");
            ssScript.Append("  })");
            ssScript.Append("  }");
            ssScript.Append("   });");

            ssScript.Append(" });");
            ssScript.Append("</script>");

            return ssScript.ToString();
        }

    }

}