
// Copyright 2008 Sebo Zoltan <iamzoli@yahoo.com>
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject
// to the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.



// A few configuration settings
var CROSSHAIRS_LOCATION = 'images/color_picker/crosshairs.png';
var HUE_SLIDER_LOCATION = 'images/color_picker/h.png';
var HUE_SLIDER_ARROWS_LOCATION = 'images/color_picker/position.png';
var SAT_VAL_SQUARE_LOCATION = 'images/color_picker/sv.png';
var BUTON_CLOSE_LOCATION='images/color_picker/close.jpg';
var HEIGHT_OF_OBJ=25;//manualy move the the color picker top or botom
var WIDTH_OF_OBJ=150; //manualy move the color picker left or right

// Here are some boring utility functions. The real code comes later.
var is_div_init=false;
function hexToRgb(hex_string, default_)
{
    if (default_ == undefined)
    {
        default_ = null;
    }

    if (hex_string.substr(0, 1) == '#')
    {
        hex_string = hex_string.substr(1);
    }

    var r;
    var g;
    var b;
    if (hex_string.length == 3)
    {
        r = hex_string.substr(0, 1);
        r += r;
        g = hex_string.substr(1, 1);
        g += g;
        b = hex_string.substr(2, 1);
        b += b;
    }
    else if (hex_string.length == 6)
    {
        r = hex_string.substr(0, 2);
        g = hex_string.substr(2, 2);
        b = hex_string.substr(4, 2);
    }
    else
    {
        return default_;
    }

    r = parseInt(r, 16);
    g = parseInt(g, 16);
    b = parseInt(b, 16);
    if (isNaN(r) || isNaN(g) || isNaN(b))
    {
        return default_;
    }
    else
    {
        return {
            r: r / 255,
            g: g / 255,
            b: b / 255
            };
    }
}

function rgbToHex(r, g, b, includeHash)
{
    r = Math.round(r * 255);
    g = Math.round(g * 255);
    b = Math.round(b * 255);
    if (includeHash == undefined)
    {
        includeHash = true;
    }

    r = r.toString(16);
    if (r.length == 1)
    {
        r = '0' + r;
    }
    g = g.toString(16);
    if (g.length == 1)
    {
        g = '0' + g;
    }
    b = b.toString(16);
    if (b.length == 1)
    {
        b = '0' + b;
    }
    return ((includeHash ? '#' : '') + r + g + b).toUpperCase();
}

var arVersion = navigator.appVersion.split("MSIE");
var version = parseFloat(arVersion[1]);

function fixPNG(myImage)
{
    if ((version >= 5.5) && (version < 7) && (document.body.filters))
    {
        var node = document.createElement('span');
        node.id = myImage.id;
        node.className = myImage.className;
        node.title = myImage.title;
        node.style.cssText = myImage.style.cssText;
        node.style.setAttribute('filter', "progid:DXImageTransform.Microsoft.AlphaImageLoader"
            + "(src=\'" + myImage.src + "\', sizingMethod='scale')");
        node.style.fontSize = '0';
        node.style.width = myImage.width.toString() + 'px';
        node.style.height = myImage.height.toString() + 'px';
        node.style.display = 'inline-block';
        return node;
    }
    else
    {
        return myImage.cloneNode(false);
    }
}

function trackDrag(node, handler)
{
    function fixCoords(x, y)
    {
        var nodePageCoords = pageCoords(node);
        x = (x - nodePageCoords.x) + document.documentElement.scrollLeft;
        y = (y - nodePageCoords.y) + document.documentElement.scrollTop;
        if (x < 0) x = 0;
        if (y < 0) y = 0;
        if (x > node.offsetWidth - 1) x = node.offsetWidth - 1;
        if (y > node.offsetHeight - 1) y = node.offsetHeight - 1;
        return {
            x: x,
            y: y
        };
    }
    function mouseDown(ev)
    {
        var coords = fixCoords(ev.clientX, ev.clientY);
        var lastX = coords.x;
        var lastY = coords.y;
        handler(coords.x, coords.y);

        function moveHandler(ev)
        {
            var coords = fixCoords(ev.clientX, ev.clientY);
            if (coords.x != lastX || coords.y != lastY)
            {
                lastX = coords.x;
                lastY = coords.y;
                handler(coords.x, coords.y);
            }
        }
        function upHandler(ev)
        {
            myRemoveEventListener(document, 'mouseup', upHandler);
            myRemoveEventListener(document, 'mousemove', moveHandler);
            myAddEventListener(node, 'mousedown', mouseDown);
        }
        myAddEventListener(document, 'mouseup', upHandler);
        myAddEventListener(document, 'mousemove', moveHandler);
        myRemoveEventListener(node, 'mousedown', mouseDown);
        if (ev.preventDefault) ev.preventDefault();
    }
    myAddEventListener(node, 'mousedown', mouseDown);
    node.onmousedown = function(e) { 
        return false;
    };
    node.onselectstart = function(e) { 
        return false;
    };
    node.ondragstart = function(e) { 
        return false;
    };
}

var eventListeners = [];

function findEventListener(node, event, handler)
{
    var i;
    for (i in eventListeners)
    {
        if (eventListeners[i].node == node && eventListeners[i].event == event
            && eventListeners[i].handler == handler)
            {
            return i;
        }
    }
    return null;
}
function myAddEventListener(node, event, handler)
{
    if (findEventListener(node, event, handler) != null)
    {
        return;
    }

    if (!node.addEventListener)
    {
        node.attachEvent('on' + event, handler);
    }
    else
    {
        node.addEventListener(event, handler, false);
    }

    eventListeners.push({
        node: node,
        event: event,
        handler: handler
    });
}

function removeEventListenerIndex(index)
{
    var eventListener = eventListeners[index];
    delete eventListeners[index];

    if (!eventListener.node.removeEventListener)
    {
        eventListener.node.detachEvent('on' + eventListener.event,
            eventListener.handler);
    }
    else
    {
        eventListener.node.removeEventListener(eventListener.event,
            eventListener.handler, false);
    }
}

function myRemoveEventListener(node, event, handler)
{
    removeEventListenerIndex(findEventListener(node, event, handler));
}

function cleanupEventListeners()
{
    var i;
    for (i = eventListeners.length; i > 0; i--)
    {
        if (eventListeners[i] != undefined)
        {
            removeEventListenerIndex(i);
        }
    }
}
myAddEventListener(window, 'unload', cleanupEventListeners);

// This copyright statement applies to the following two functions,
// which are taken from MochiKit.
//
// Copyright 2005 Bob Ippolito <bob@redivi.com>
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject
// to the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
// BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

function hsvToRgb(hue, saturation, value)
{
    var red;
    var green;
    var blue;
    if (value == 0.0)
    {
        red = 0;
        green = 0;
        blue = 0;
    }
    else
    {
        var i = Math.floor(hue * 6);
        var f = (hue * 6) - i;
        var p = value * (1 - saturation);
        var q = value * (1 - (saturation * f));
        var t = value * (1 - (saturation * (1 - f)));
        switch (i)
        {
            case 1:red = q;green = value;blue = p;break;
            case 2:red = p;green = value;blue = t;break;
            case 3:red = p;green = q;blue = value;break;
            case 4:red = t;green = p;blue = value;break;
            case 5:red = value;green = p;blue = q;break;
            case 6: // fall through
            case 0:red = value;green = t;blue = p;break;
        }
    }
    return {
        r: red,
        g: green,
        b: blue
    };
}

function rgbToHsv(red, green, blue)
{
    var max = Math.max(Math.max(red, green), blue);
    var min = Math.min(Math.min(red, green), blue);
    var hue;
    var saturation;
    var value = max;
    if (min == max)
    {
        hue = 0;
        saturation = 0;
    }
    else
    {
        var delta = (max - min);
        saturation = delta / max;
        if (red == max)
        {
            hue = (green - blue) / delta;
        }
        else if (green == max)
        {
            hue = 2 + ((blue - red) / delta);
        }
        else
        {
            hue = 4 + ((red - green) / delta);
        }
        hue /= 6;
        if (hue < 0)
        {
            hue += 1;
        }
        if (hue > 1)
        {
            hue -= 1;
        }
    }
    return {
        h: hue,
        s: saturation,
        v: value
    };
}

function pageCoords(node)
{
    var x = node.offsetLeft;
    var y = node.offsetTop;
    var parent = node.offsetParent;
    while (parent != null)
    {
        x += parent.offsetLeft;
        y += parent.offsetTop;
        parent = parent.offsetParent;
    }
    return {
        x: x,
        y: y
    };
}

// The real code begins here.
var huePositionImg = document.createElement('img');
huePositionImg.galleryImg = false;
huePositionImg.width = 35;
huePositionImg.height = 11;
huePositionImg.src = HUE_SLIDER_ARROWS_LOCATION;
huePositionImg.style.position = 'absolute';

var hueSelectorImg = document.createElement('img');
hueSelectorImg.galleryImg = false;
hueSelectorImg.width = 35;
hueSelectorImg.height = 200;
hueSelectorImg.src = HUE_SLIDER_LOCATION;
hueSelectorImg.style.display = 'block';

var satValImg = document.createElement('img');
satValImg.galleryImg = false;
satValImg.width = 200;
satValImg.height = 200;
satValImg.src = SAT_VAL_SQUARE_LOCATION;
satValImg.style.display = 'block';

var crossHairsImg = document.createElement('img');
crossHairsImg.galleryImg = false;
crossHairsImg.width = 21;
crossHairsImg.height = 21;
crossHairsImg.src = CROSSHAIRS_LOCATION;
crossHairsImg.style.position = 'absolute';
var buttonCloseImg = document.createElement('img');
buttonCloseImg.galleryImg = false;
buttonCloseImg.width = 85;
buttonCloseImg.height = 17;
buttonCloseImg.src = BUTON_CLOSE_LOCATION;
buttonCloseImg.style.position = 'absolute';
buttonCloseImg.style.cursor='pointer';
buttonCloseImg.onclick=hideColorPicker;

var input = null;

function makeColorSelector(inputBox)
{
    var rgb, hsv

    function colorChanged()
    {
        is_div_init=false;
        var hex = rgbToHex(rgb.r, rgb.g, rgb.b);

        var hueRgb = hsvToRgb(hsv.h, 1, 1);
        var hueHex = rgbToHex(hueRgb.r, hueRgb.g, hueRgb.b);
        //alert(hex);
        inputBox.style.background = hex;
        inputBox.value =hex;
        // popox ideea
        if(((rgb.r*100+rgb.g*100+rgb.b*100)/3)<65) //change text color to white if the background color is to dark
            inputBox.style.color="#fff";
        else inputBox.style.color="#000";


        satValDiv.style.background = hueHex;
        crossHairs.style.left = ((hsv.v*199)-10).toString() + 'px';
        crossHairs.style.top = (((1-hsv.s)*199)-10).toString() + 'px';
        huePos.style.top = ((hsv.h*199)-5).toString() + 'px';
        is_div_init=true;
    }
    function rgbChanged()
    {
        hsv = rgbToHsv(rgb.r, rgb.g, rgb.b);
        colorChanged();
    }
    function hsvChanged()
    {
        rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);
        colorChanged();
    }

    var colorSelectorDiv = document.createElement('div');
    colorSelectorDiv.style.paddingLeft = '5px';
    colorSelectorDiv.style.paddingRight = '5px';
    colorSelectorDiv.style.paddingBottom = '5px';
    colorSelectorDiv.style.position = 'relative';
    colorSelectorDiv.style.diplay="inline";
    colorSelectorDiv.style.height = '220px';
    colorSelectorDiv.style.width = '210px';

    var butonclose = document.createElement('div');

    butonclose.style.position = 'relative';
    butonclose.style.diplay="inline";
    butonclose.style.height = '10px';
    butonclose.style.width = '85px';
    butonclose.style.left="160px";
    butonclose.appendChild(buttonCloseImg);

    colorSelectorDiv.appendChild(butonclose);

    var satValDiv = document.createElement('div');
    satValDiv.style.position = 'relative';
    satValDiv.style.diplay="inline";
    satValDiv.style.top = '10px';
    satValDiv.style.width = '200px';
    satValDiv.style.height = '200px';
    var newSatValImg = fixPNG(satValImg);
    satValDiv.appendChild(newSatValImg);
    var crossHairs = crossHairsImg.cloneNode(false);
    satValDiv.appendChild(crossHairs);
    function satValDragged(x, y)
    {
        hsv.s = 1-(y/199);
        hsv.v = (x/199);
        hsvChanged();
    }
    trackDrag(satValDiv, satValDragged)

    colorSelectorDiv.appendChild(satValDiv);

    var hueDiv = document.createElement('div');
    hueDiv.style.position = 'absolute';
    hueDiv.style.diplay="inline";
    hueDiv.style.left = '210px';
    hueDiv.style.top = '19px';
    hueDiv.style.width = '35px';
    hueDiv.style.height = '200px';
    var huePos = fixPNG(huePositionImg);
    hueDiv.appendChild(hueSelectorImg.cloneNode(false));
    hueDiv.appendChild(huePos);
    function hueDragged(x, y)
    {
        is_div_init=false;
        hsv.h = y/199;
        hsvChanged();
    }
    trackDrag(hueDiv, hueDragged);
    colorSelectorDiv.appendChild(hueDiv);

    function inputBoxChanged()
    {
        rgb = hexToRgb(inputBox.value, {
            r: 0,
            g: 0,
            b: 0
        });
        rgbChanged();
    }
    myAddEventListener(inputBox, 'change', inputBoxChanged);

    inputBoxChanged();

    return colorSelectorDiv;
}


function colorPickerGetTopPos(inputObj)
{

    var returnValue = inputObj.offsetTop;
    while((inputObj = inputObj.offsetParent) != null){
        returnValue += inputObj.offsetTop;
    }
    return returnValue-HEIGHT_OF_OBJ;
}

function colorPickerGetLeftPos(inputObj)
{
    var returnValue = inputObj.offsetLeft;
    while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetLeft;
    return returnValue+WIDTH_OF_OBJ;
}
function startColorPicker(inputObj)
{
    hideColorPicker();
    var color_picker_div = document.createElement('DIV');
    color_picker_div.style.left = colorPickerGetLeftPos(inputObj) + 'px';
    color_picker_div.style.width='250px';
    color_picker_div.style.heigth='190px';
    color_picker_div.style.top = colorPickerGetTopPos(inputObj) + inputObj.offsetHeight + 2 + 'px';
    color_picker_div.id = 'The_colorPicker';
    color_picker_div.style.display='block';
    color_picker_div.appendChild(makeColorSelector(inputObj));
    document.body.appendChild(color_picker_div);
    is_div_init=true;
    input = inputObj;
}
function hideColorPicker()
{

    if (is_div_init){
        is_div_init=false;
        try {
            document.body.removeChild(document.getElementById('The_colorPicker'));
            if(input.name.indexOf("video") > -1) {
                video.change();
            } else if(input.name.indexOf("testi") > -1) {
                testi.change();
            } else if(input.name.indexOf("dati") > -1) {
                dati.change();
            } else if(input.name.indexOf("pubb") > -1) {
                pubb.change();
            }
        } catch (e) {
            //alert(input + " " + e);
        }
    }
    
}

function maskedHex(input)
{
    var mask = '#[0-9a-fA-F]{7}';
    input.value=input.value.replace(mask,"");
}


var Channel = function(_id) {
    var id = _id;

    var background = null;
    var font = null;
    var textSize = null;
    var textColor = null;
    var textStyle = null;
    var titleSize = null;
    var titleColor = null;
    var titleStyle = null;
    var image = null;
    var idChannel = null;

    var area = null;
    var areaTitle = null;
    var areaText = null;
    var areaImage = null;

    var err = 0;

    function isNumber(data) {
        if(typeof data != "object") {
            return;
        }
        if (isNaN(parseInt(data.value))) {
            err = 2;
            alert("Attenzione!\nIl valore deve essere un numero");
        }
    }

    this.init = function() {
        if (err > 0) {
            return;
        }
        area = document.getElementById("preview_panel_" + id);
        areaTitle = document.getElementById("preview_panel_" + id + "_title");
        areaText = document.getElementById("preview_panel_" + id + "_text");
        areaImage = document.getElementById("preview_panel_img_" + id);

    }

    this.change = function() {
        if (err > 0) {
            return;
        }
        if (this.getFont() != null) area.style.fontFamily = this.getFont().value;
        if (this.getBackground() != null) area.style.background = this.getBackground().value;

        try {
            if (this.getTitleSize() != null) areaTitle.style.fontSize = this.getTitleSize().value + "px";
            if (this.getTitleColor() != null) areaTitle.style.color = this.getTitleColor().value;
            if (this.getTitleStyle() != null) {
                var val = this.getTitleStyle().value;
                if (val == "underline") {
                    areaTitle.style.fontWeight = "normal";
                    areaTitle.style.textDecoration = "underline";
                    areaTitle.style.fontStyle = "normal";
                } else if (val == "bold") {
                    areaTitle.style.fontWeight = "bold";
                    areaTitle.style.textDecoration = "none";
                    areaTitle.style.fontStyle = "normal";
                } else if (val == "italic") {
                    areaTitle.style.fontWeight = "normal";
                    areaTitle.style.textDecoration = "none";
                    areaTitle.style.fontStyle = "italic";
                } else if (val == "normal") {
                    areaTitle.style.fontWeight = "normal";
                    areaTitle.style.textDecoration = "none";
                    areaTitle.style.fontStyle = "normal";
                }
            }
        } catch (e) { }

        try {
            if (this.getTextSize() != null) areaText.style.fontSize = this.getTextSize().value + "px";
            if (this.getTextColor() != null) areaText.style.color = this.getTextColor().value;
            if (this.getTextStyle() != null) {
                var val1 = this.getTextStyle().value;
                if (val1 == "underline") {
                    areaText.style.fontWeight = "normal";
                    areaText.style.textDecoration = "underline";
                    areaText.style.fontStyle = "normal";
                } else if (val1 == "bold") {
                    areaText.style.fontWeight = "bold";
                    areaText.style.textDecoration = "none";
                    areaText.style.fontStyle = "normal";
                } else if (val1 == "italic") {
                    areaText.style.fontWeight = "normal";
                    areaText.style.textDecoration = "none";
                    areaText.style.fontStyle = "italic";
                } else if (val1 == "normal") {
                    areaText.style.fontWeight = "normal";
                    areaText.style.textDecoration = "none";
                    areaText.style.fontStyle = "normal";
                }
            }
        } catch (e) { }

        try {
            var img = this.getImage().value;
            if ( img.indexOf("common/pixel.gif") == -1 && this.getImage().value.length > 0) {
                areaImage.src = "azienda/videofarmacia/upload/"+this.getIdChannel()+"/logo/" + img;
                areaImage.style.width = "150px;"
                areaImage.style.height = "100px;"
                //alert("1-" + areaImage.src);
            } else {
                areaImage.src = "common/pixel.gif";
                areaImage.style.width = "150px;"
                areaImage.style.height = "100px;"
                //alert("2-" + areaImage.src);
            }
        } catch (e) { }
    }

    this.getTitleColor = function() {
        return this.titleColor;
    }


    this.setTitleColor = function(titleColor) {
        if (typeof titleColor != 'object') { 
            this.err = 1;return;
        }
        this.titleColor = titleColor;
    }


    this.getTitleSize = function() {
        return this.titleSize;
    }


    this.setTitleSize = function(titleSize) {
        if (typeof titleSize != 'object') { 
            this.err = 1;return;
        }
        isNumber(titleSize);
        this.titleSize = titleSize;
    }

    this.setTextColor = function(textColor) {
        if (typeof textColor != 'object') { 
            this.err = 1;return;
        }
        this.textColor = textColor;
    }

    this.setTitleStyle = function(titleStyle) {
        if (typeof titleStyle != 'object') {
            this.err = 1;return;
        }
        this.titleStyle = titleStyle;
    }

    this.getTextColor = function() {
        return this.textColor;
    }


    this.getTextSize = function() {
        return this.textSize;
    }


    this.setTextSize = function(textSize) {
        if (typeof textSize != 'object') { 
            this.err = 1;return;
        }
        this.textSize = textSize;
    }

    this.setTextStyle = function(textStyle) {
        if (typeof textStyle != 'object') {
            this.err = 1;return;
        }
        this.textStyle = textStyle;
    }

    this.getFont = function() {
        return this.font;
    }

    this.setFont = function(font) {
        if (typeof font != 'object') { 
            this.err = 1;return;
        }
        this.font = font;
    }

    this.getBackground = function() {
        return this.background;
    }

    this.setBackground = function(background) {
        if (typeof background != 'object') { 
            this.err = 1;return;
        }
        this.background = background;
    }

    this.getTextStyle = function() {
        return this.textStyle;
    }

    this.getTitleStyle = function() {
        return this.titleStyle;
    }

    this.setImage = function(image) {
        if (typeof image != 'object') {
            this.err = 1;return;
        }
        this.image = image;
    }

    this.getImage = function() {
        return this.image;
    }

    this.setIdChannel = function(idChannel) {
        if (typeof idChannel != 'number') {
            this.err = 1;return;
        }
        this.idChannel = idChannel;
    }

    this.getIdChannel = function() {
        return this.idChannel;
    }

}
